Compare commits

...

3 Commits

11 changed files with 49 additions and 40 deletions

View File

@@ -18,7 +18,7 @@ import { DESKTOP_DISPLAY_ITEM_COUNT } from '@/lib/constants'
import { Habit, WishlistItemType } from '@/lib/types' import { Habit, WishlistItemType } from '@/lib/types'
import { cn, d2t, getNow, getTodayInTimezone, isHabitDue, isSameDate, isTaskOverdue, t2d } from '@/lib/utils' import { cn, d2t, getNow, getTodayInTimezone, isHabitDue, isSameDate, isTaskOverdue, t2d } from '@/lib/utils'
import { useAtom } from 'jotai' import { useAtom } from 'jotai'
import { AlertTriangle, ArrowRight, ChevronDown, ChevronUp, Circle, CircleCheck, Coins, Pin, Plus } from 'lucide-react'; import { AlertTriangle, ArrowRight, ChevronDown, ChevronUp, Circle, CircleCheck, Coins, Pin, Plus } from 'lucide-react'
import { useTranslations } from 'next-intl' import { useTranslations } from 'next-intl'
import Link from 'next/link' import Link from 'next/link'
import { useState } from 'react' import { useState } from 'react'
@@ -409,7 +409,7 @@ export default function DailyOverview({
<CardContent> <CardContent>
<div className="space-y-6"> <div className="space-y-6">
{/* Tasks Section */} {/* Tasks Section */}
{habits.some(habit => habit.isTask === true) && ( {dailyTasks.length > 0 && (
<ItemSection <ItemSection
title={t('dailyTasksTitle')} title={t('dailyTasksTitle')}
items={dailyTasks} items={dailyTasks}
@@ -421,16 +421,16 @@ export default function DailyOverview({
)} )}
{/* Habits Section */} {/* Habits Section */}
<ItemSection {dailyHabits.length > 0 && <ItemSection
title={t('dailyHabitsTitle')} title={t('dailyHabitsTitle')}
items={dailyHabits} items={dailyHabits}
emptyMessage={t('noHabitsDueTodayMessage')} emptyMessage={t('noHabitsDueTodayMessage')}
isTask={false} isTask={false}
viewLink="/habits" viewLink="/habits"
addNewItem={() => setModalConfig({ isOpen: true, isTask: false })} addNewItem={() => setModalConfig({ isOpen: true, isTask: false })}
/> />}
<div className="space-y-2"> {sortedWishlistItems.length > 0 && <div className="space-y-2">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<h3 className="font-semibold">{t('wishlistGoalsTitle')}</h3> <h3 className="font-semibold">{t('wishlistGoalsTitle')}</h3>
<Badge variant="secondary"> <Badge variant="secondary">
@@ -538,6 +538,10 @@ export default function DailyOverview({
</div> </div>
</div> </div>
</div> </div>
}
{dailyHabits.length === 0 && dailyTasks.length === 0 && sortedWishlistItems.length === 0 && <>
{t("emptyAll")}
</>}
</div> </div>
</CardContent> </CardContent>
</Card> </Card>

View File

@@ -7,7 +7,7 @@ import {
import { useHabits } from '@/hooks/useHabits' import { useHabits } from '@/hooks/useHabits'
import { currentUserAtom, settingsAtom, usersAtom } from '@/lib/atoms' import { currentUserAtom, settingsAtom, usersAtom } from '@/lib/atoms'
import { Habit, User } from '@/lib/types' import { Habit, User } from '@/lib/types'
import { convertMachineReadableFrequencyToHumanReadable, getCompletionsForToday, hasPermission, isTaskOverdue } from '@/lib/utils' import { convertMachineReadableFrequencyToHumanReadable, getCompletionsForToday, hasPermission, isHabitDueToday, isTaskOverdue } from '@/lib/utils'
import { useAtom } from 'jotai' import { useAtom } from 'jotai'
import { Check, Coins, Edit, MoreVertical, Pin, Undo2 } from 'lucide-react' import { Check, Coins, Edit, MoreVertical, Pin, Undo2 } from 'lucide-react'
import { useTranslations } from 'next-intl' import { useTranslations } from 'next-intl'
@@ -135,11 +135,12 @@ export default function HabitItem({ habit, onEdit, onDelete }: HabitItemProps) {
<span className={`text-sm font-medium ${habit.archived ? 'text-gray-400 dark:text-gray-500' : ''}`}>{t('coinsPerCompletion', { count: habit.coinReward })}</span> <span className={`text-sm font-medium ${habit.archived ? 'text-gray-400 dark:text-gray-500' : ''}`}>{t('coinsPerCompletion', { count: habit.coinReward })}</span>
</div> </div>
</div> </div>
<div className='mt-2 text-sm font-medium'>{t("completionCount", { completions: habit.completions.length })}</div>
</CardContent> </CardContent>
<CardFooter className="flex-shrink-0 flex justify-between gap-2"> <CardFooter className="flex-shrink-0 flex justify-between gap-2">
<div className="flex gap-2"> <div className="flex gap-2">
<div className="relative"> <div className="relative">
<Button {(habit.isTask || isHabitDueToday({ habit, timezone: settings.system.timezone })) && <Button
variant={isCompletedToday ? "secondary" : "default"} variant={isCompletedToday ? "secondary" : "default"}
size="sm" size="sm"
onClick={async () => await completeHabit(habit)} onClick={async () => await completeHabit(habit)}
@@ -174,7 +175,7 @@ export default function HabitItem({ habit, onEdit, onDelete }: HabitItemProps) {
}} }}
/> />
)} )}
</Button> </Button>}
</div> </div>
{completionsToday > 0 && !habit.archived && ( {completionsToday > 0 && !habit.archived && (
<Button <Button

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "Elimina hàbit", "deleteHabitDialogTitle": "Elimina hàbit",
"confirmDeleteDialogMessage": "Estàs segur que vols eliminar \"{name}\"? Aquesta acció no es pot desfer.", "confirmDeleteDialogMessage": "Estàs segur que vols eliminar \"{name}\"? Aquesta acció no es pot desfer.",
"deleteButton": "Elimina", "deleteButton": "Elimina",
"overdueTooltip": "Vençut" "overdueTooltip": "Vençut",
"emptyAll": "Res a fer."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "Inicia Pomodoro", "startPomodoro": "Inicia Pomodoro",
@@ -322,7 +323,8 @@
"completeButtonCount": "Completa ({completed}/{target})", "completeButtonCount": "Completa ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "Desfés", "undoButton": "Desfés",
"editButton": "Edita" "editButton": "Edita",
"completionCount": "completat {completions} vegades"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "Nota massa llarga", "noteTooLongTitle": "Nota massa llarga",

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "Gewohnheit löschen", "deleteHabitDialogTitle": "Gewohnheit löschen",
"confirmDeleteDialogMessage": "Sind Sie sicher, dass Sie \"{name}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", "confirmDeleteDialogMessage": "Sind Sie sicher, dass Sie \"{name}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"deleteButton": "Löschen", "deleteButton": "Löschen",
"overdueTooltip": "Überfällig" "overdueTooltip": "Überfällig",
"emptyAll": "Nichts zu tun."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "Pomodoro starten", "startPomodoro": "Pomodoro starten",
@@ -322,7 +323,8 @@
"completeButtonCount": "Abschließen ({completed}/{target})", "completeButtonCount": "Abschließen ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "Rückgängig", "undoButton": "Rückgängig",
"editButton": "Bearbeiten" "editButton": "Bearbeiten",
"completionCount": "{completions} mal abgeschlossen"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "Notiz zu lang", "noteTooLongTitle": "Notiz zu lang",
@@ -434,8 +436,6 @@
"invalidAmountDescription": "Bitte geben Sie eine gültige positive Zahl ein", "invalidAmountDescription": "Bitte geben Sie eine gültige positive Zahl ein",
"successTitle": "Erfolg", "successTitle": "Erfolg",
"transactionNotFoundDescription": "Transaktion nicht gefunden", "transactionNotFoundDescription": "Transaktion nicht gefunden",
"maxAmountExceededDescription": "Der Betrag darf {max} nicht überschreiten.",
"transactionNotFoundDescription": "Transaktion nicht gefunden",
"maxAmountExceededDescription": "Der Betrag darf {max} nicht überschreiten." "maxAmountExceededDescription": "Der Betrag darf {max} nicht überschreiten."
}, },
"DrawingModal": { "DrawingModal": {

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "Delete Habit", "deleteHabitDialogTitle": "Delete Habit",
"confirmDeleteDialogMessage": "Are you sure you want to delete \"{name}\"? This action cannot be undone.", "confirmDeleteDialogMessage": "Are you sure you want to delete \"{name}\"? This action cannot be undone.",
"deleteButton": "Delete", "deleteButton": "Delete",
"overdueTooltip": "Overdue" "overdueTooltip": "Overdue",
"emptyAll": "Nothing to do."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "Start Pomodoro", "startPomodoro": "Start Pomodoro",
@@ -322,7 +323,8 @@
"completeButtonCount": "Complete ({completed}/{target})", "completeButtonCount": "Complete ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "Undo", "undoButton": "Undo",
"editButton": "Edit" "editButton": "Edit",
"completionCount": "Completed {completions} times"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "Note too long", "noteTooLongTitle": "Note too long",

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "Eliminar hábito", "deleteHabitDialogTitle": "Eliminar hábito",
"confirmDeleteDialogMessage": "¿Estás seguro de que quieres eliminar \"{name}\"? Esta acción no se puede deshacer.", "confirmDeleteDialogMessage": "¿Estás seguro de que quieres eliminar \"{name}\"? Esta acción no se puede deshacer.",
"deleteButton": "Eliminar", "deleteButton": "Eliminar",
"overdueTooltip": "Vencido" "overdueTooltip": "Vencido",
"emptyAll": "Nada que hacer."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "Iniciar Pomodoro", "startPomodoro": "Iniciar Pomodoro",
@@ -322,7 +323,8 @@
"completeButtonCount": "Completar ({completed}/{target})", "completeButtonCount": "Completar ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "Deshacer", "undoButton": "Deshacer",
"editButton": "Editar" "editButton": "Editar",
"completionCount": "{completions} veces completadas"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "Nota demasiado larga", "noteTooLongTitle": "Nota demasiado larga",
@@ -442,8 +444,6 @@
"invalidAmountDescription": "Por favor ingresa un número positivo válido", "invalidAmountDescription": "Por favor ingresa un número positivo válido",
"successTitle": "Éxito", "successTitle": "Éxito",
"transactionNotFoundDescription": "Transacción no encontrada", "transactionNotFoundDescription": "Transacción no encontrada",
"maxAmountExceededDescription": "La cantidad no puede exceder {max}.",
"transactionNotFoundDescription": "Transacción no encontrada",
"maxAmountExceededDescription": "La cantidad no puede exceder {max}." "maxAmountExceededDescription": "La cantidad no puede exceder {max}."
} }
} }

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "Supprimer l'habitude", "deleteHabitDialogTitle": "Supprimer l'habitude",
"confirmDeleteDialogMessage": "Êtes-vous sûr de vouloir supprimer \"{name}\" ? Cette action est irréversible.", "confirmDeleteDialogMessage": "Êtes-vous sûr de vouloir supprimer \"{name}\" ? Cette action est irréversible.",
"deleteButton": "Supprimer", "deleteButton": "Supprimer",
"overdueTooltip": "En retard" "overdueTooltip": "En retard",
"emptyAll": "Rien à faire."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "Démarrer Pomodoro", "startPomodoro": "Démarrer Pomodoro",
@@ -322,7 +323,8 @@
"completeButtonCount": "Compléter ({completed}/{target})", "completeButtonCount": "Compléter ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "Annuler", "undoButton": "Annuler",
"editButton": "Modifier" "editButton": "Modifier",
"completionCount": "complété {completions} fois"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "Note trop longue", "noteTooLongTitle": "Note trop longue",
@@ -434,8 +436,6 @@
"invalidAmountDescription": "Veuillez entrer un nombre positif valide", "invalidAmountDescription": "Veuillez entrer un nombre positif valide",
"successTitle": "Succès", "successTitle": "Succès",
"transactionNotFoundDescription": "Transaction non trouvée", "transactionNotFoundDescription": "Transaction non trouvée",
"maxAmountExceededDescription": "Le montant ne peut pas dépasser {max}.",
"transactionNotFoundDescription": "Transaction non trouvée",
"maxAmountExceededDescription": "Le montant ne peut pas dépasser {max}." "maxAmountExceededDescription": "Le montant ne peut pas dépasser {max}."
}, },
"DrawingModal": { "DrawingModal": {

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "習慣を削除", "deleteHabitDialogTitle": "習慣を削除",
"confirmDeleteDialogMessage": "\"{name}\"を削除してもよろしいですか?この操作は元に戻せません。", "confirmDeleteDialogMessage": "\"{name}\"を削除してもよろしいですか?この操作は元に戻せません。",
"deleteButton": "削除", "deleteButton": "削除",
"overdueTooltip": "期限超過" "overdueTooltip": "期限超過",
"emptyAll": "何もする事はありません。"
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "ポモドーロを開始", "startPomodoro": "ポモドーロを開始",
@@ -322,7 +323,8 @@
"completeButtonCount": "完了({completed}/{target}", "completeButtonCount": "完了({completed}/{target}",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "取り消し", "undoButton": "取り消し",
"editButton": "編集" "editButton": "編集",
"completionCount": "{completions} 回完了しました"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "メモが長すぎます", "noteTooLongTitle": "メモが長すぎます",
@@ -434,8 +436,6 @@
"invalidAmountDescription": "有効な正の数を入力してください", "invalidAmountDescription": "有効な正の数を入力してください",
"successTitle": "成功しました", "successTitle": "成功しました",
"transactionNotFoundDescription": "取引が見つかりません", "transactionNotFoundDescription": "取引が見つかりません",
"maxAmountExceededDescription": "金額は{max}を超えることはできません。",
"transactionNotFoundDescription": "取引が見つかりません",
"maxAmountExceededDescription": "金額は{max}を超えることはできません。" "maxAmountExceededDescription": "金額は{max}を超えることはできません。"
}, },
"DrawingModal": { "DrawingModal": {

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "습관 삭제", "deleteHabitDialogTitle": "습관 삭제",
"confirmDeleteDialogMessage": "정말로 \"{name}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "confirmDeleteDialogMessage": "정말로 \"{name}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"deleteButton": "삭제", "deleteButton": "삭제",
"overdueTooltip": "기한이 지남" "overdueTooltip": "기한이 지남",
"emptyAll": "할 일이 없어요."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "뽀모도로 시작", "startPomodoro": "뽀모도로 시작",
@@ -322,7 +323,8 @@
"completeButtonCount": "완료 ({completed}/{target})", "completeButtonCount": "완료 ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "실행 취소", "undoButton": "실행 취소",
"editButton": "수정" "editButton": "수정",
"completionCount": "{completions}번 완료됨"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "메모가 너무 깁니다", "noteTooLongTitle": "메모가 너무 깁니다",
@@ -430,8 +432,6 @@
"invalidAmountDescription": "유효한 양의 숫자를 입력하세요", "invalidAmountDescription": "유효한 양의 숫자를 입력하세요",
"successTitle": "성공", "successTitle": "성공",
"transactionNotFoundDescription": "거래를 찾을 수 없습니다", "transactionNotFoundDescription": "거래를 찾을 수 없습니다",
"maxAmountExceededDescription": "금액은 {max}을(를) 초과할 수 없습니다.",
"transactionNotFoundDescription": "거래를 찾을 수 없습니다",
"maxAmountExceededDescription": "금액은 {max}을(를) 초과할 수 없습니다." "maxAmountExceededDescription": "금액은 {max}을(를) 초과할 수 없습니다."
}, },
"Warning": { "Warning": {

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "Удалить привычку", "deleteHabitDialogTitle": "Удалить привычку",
"confirmDeleteDialogMessage": "Вы уверены, что хотите удалить \"{name}\"? Это действие нельзя отменить.", "confirmDeleteDialogMessage": "Вы уверены, что хотите удалить \"{name}\"? Это действие нельзя отменить.",
"deleteButton": "Удалить", "deleteButton": "Удалить",
"overdueTooltip": "Просрочено" "overdueTooltip": "Просрочено",
"emptyAll": "Делать нечего."
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "Начать помидорку", "startPomodoro": "Начать помидорку",
@@ -322,7 +323,8 @@
"completeButtonCount": "Выполнить ({completed}/{target})", "completeButtonCount": "Выполнить ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "Отменить", "undoButton": "Отменить",
"editButton": "Редактировать" "editButton": "Редактировать",
"completionCount": "завершено {completions} раз"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "Слишком длинная заметка", "noteTooLongTitle": "Слишком длинная заметка",
@@ -434,8 +436,6 @@
"invalidAmountDescription": "Пожалуйста, введите положительное число", "invalidAmountDescription": "Пожалуйста, введите положительное число",
"successTitle": "Успех", "successTitle": "Успех",
"transactionNotFoundDescription": "Транзакция не найдена", "transactionNotFoundDescription": "Транзакция не найдена",
"maxAmountExceededDescription": "Сумма не может превышать {max}.",
"transactionNotFoundDescription": "Транзакция не найдена",
"maxAmountExceededDescription": "Сумма не может превышать {max}." "maxAmountExceededDescription": "Сумма не может превышать {max}."
}, },
"DrawingModal": { "DrawingModal": {

View File

@@ -48,7 +48,8 @@
"deleteHabitDialogTitle": "删除习惯", "deleteHabitDialogTitle": "删除习惯",
"confirmDeleteDialogMessage": "确定要删除\"{name}\"吗?此操作无法撤消。", "confirmDeleteDialogMessage": "确定要删除\"{name}\"吗?此操作无法撤消。",
"deleteButton": "删除", "deleteButton": "删除",
"overdueTooltip": "逾期" "overdueTooltip": "逾期",
"emptyAll": "无事可做。"
}, },
"HabitContextMenuItems": { "HabitContextMenuItems": {
"startPomodoro": "开始番茄钟", "startPomodoro": "开始番茄钟",
@@ -322,7 +323,8 @@
"completeButtonCount": "完成 ({completed}/{target})", "completeButtonCount": "完成 ({completed}/{target})",
"completeButtonCountMobile": "{completed}/{target}", "completeButtonCountMobile": "{completed}/{target}",
"undoButton": "撤销", "undoButton": "撤销",
"editButton": "编辑" "editButton": "编辑",
"completionCount": "完成 {completions} 次"
}, },
"TransactionNoteEditor": { "TransactionNoteEditor": {
"noteTooLongTitle": "备注太长", "noteTooLongTitle": "备注太长",
@@ -434,8 +436,6 @@
"invalidAmountDescription": "请输入有效的正数", "invalidAmountDescription": "请输入有效的正数",
"successTitle": "成功", "successTitle": "成功",
"transactionNotFoundDescription": "未找到交易记录", "transactionNotFoundDescription": "未找到交易记录",
"maxAmountExceededDescription": "金额不能超过 {max}。",
"transactionNotFoundDescription": "未找到交易记录",
"maxAmountExceededDescription": "金额不能超过 {max}。" "maxAmountExceededDescription": "金额不能超过 {max}。"
}, },
"DrawingModal": { "DrawingModal": {