From 16c097b3f0df6bb9e0b54540b5b879ed4452016e Mon Sep 17 00:00:00 2001 From: paul-nothaft <40865108-paul-nothaft@users.noreply.replit.com> Date: Fri, 24 Oct 2025 10:21:30 +0000 Subject: [PATCH] Add ability to manage task labels and create project templates Refactors the settings page to include CRUD operations for task labels, integrates template creation navigation, and removes the appearance section. Replit-Commit-Author: Agent Replit-Commit-Session-Id: ceced2fc-aa46-458d-ba87-ddd4b7bb1518 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/659922a9-0087-461c-90dd-6d9a58b81d4d/ceced2fc-aa46-458d-ba87-ddd4b7bb1518/LNMKOrA --- .replit | 4 - client/src/App.tsx | 2 +- client/src/i18n/locales/de.json | 26 ++- client/src/i18n/locales/en.json | 26 ++- client/src/pages/settings.tsx | 269 ++++++++++++++++++++++++++++++-- 5 files changed, 296 insertions(+), 31 deletions(-) diff --git a/.replit b/.replit index 2202770..a572720 100644 --- a/.replit +++ b/.replit @@ -18,10 +18,6 @@ externalPort = 80 localPort = 35345 externalPort = 3002 -[[ports]] -localPort = 36697 -externalPort = 4200 - [[ports]] localPort = 39063 externalPort = 3001 diff --git a/client/src/App.tsx b/client/src/App.tsx index 58da0f1..4fa2e61 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -348,7 +348,7 @@ function App() { ); case 'settings': - return ; + return setCurrentTab('templates')} />; default: return ( diff --git a/client/src/i18n/locales/de.json b/client/src/i18n/locales/de.json index ac5e256..98aecb4 100644 --- a/client/src/i18n/locales/de.json +++ b/client/src/i18n/locales/de.json @@ -172,15 +172,31 @@ "english": "Englisch (English)", "german": "Deutsch" }, - "appearance": { - "title": "Erscheinungsbild", - "description": "Passe das Aussehen an", - "themeToggle": "Thema-Umschalter ist in der Kopfzeile verfügbar" + "labels": { + "title": "Aufgabenlabels", + "description": "Erstellen und verwalten Sie Labels, um Ihre Aufgaben zu organisieren", + "createLabel": "Label erstellen", + "createNewLabel": "Neues Label erstellen", + "editLabel": "Label bearbeiten", + "labelNamePlaceholder": "Label-Name", + "cancel": "Abbrechen", + "create": "Erstellen", + "update": "Aktualisieren", + "loading": "Labels werden geladen...", + "noLabels": "Noch keine Labels", + "noLabelsDescription": "Erstellen Sie Ihr erstes Label, um Ihre Aufgaben nach Farbe und Kategorie zu organisieren.", + "deleteConfirm": "Sind Sie sicher, dass Sie dieses Label löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "created": "Label erstellt", + "createdDescription": "Ihr Label wurde erfolgreich erstellt.", + "updated": "Label aktualisiert", + "updatedDescription": "Ihr Label wurde erfolgreich aktualisiert.", + "deleted": "Label gelöscht", + "deletedDescription": "Ihr Label wurde erfolgreich gelöscht." }, "templates": { "title": "Projektvorlagen", "description": "Verwende Vorlagen zum schnellen Erstellen von Projekten", - "accessInfo": "Zugriff auf Vorlagen über das Navigationsmenü" + "manageTemplates": "Vorlagen verwalten" } }, "projectTemplate": { diff --git a/client/src/i18n/locales/en.json b/client/src/i18n/locales/en.json index 7d9ecbe..2efb574 100644 --- a/client/src/i18n/locales/en.json +++ b/client/src/i18n/locales/en.json @@ -172,15 +172,31 @@ "english": "English", "german": "German (Deutsch)" }, - "appearance": { - "title": "Appearance", - "description": "Customize the look and feel", - "themeToggle": "Theme toggle available in the header" + "labels": { + "title": "Task Labels", + "description": "Create and manage labels to organize your tasks", + "createLabel": "Create Label", + "createNewLabel": "Create New Label", + "editLabel": "Edit Label", + "labelNamePlaceholder": "Label name", + "cancel": "Cancel", + "create": "Create", + "update": "Update", + "loading": "Loading labels...", + "noLabels": "No labels yet", + "noLabelsDescription": "Create your first label to organize your tasks by color and category.", + "deleteConfirm": "Are you sure you want to delete this label? This action cannot be undone.", + "created": "Label created", + "createdDescription": "Your label has been created successfully.", + "updated": "Label updated", + "updatedDescription": "Your label has been updated successfully.", + "deleted": "Label deleted", + "deletedDescription": "Your label has been deleted successfully." }, "templates": { "title": "Project Templates", "description": "Use templates to quickly create projects", - "accessInfo": "Access templates from the navigation menu" + "manageTemplates": "Manage Templates" } }, "projectTemplate": { diff --git a/client/src/pages/settings.tsx b/client/src/pages/settings.tsx index f50526c..4a723c1 100644 --- a/client/src/pages/settings.tsx +++ b/client/src/pages/settings.tsx @@ -1,10 +1,28 @@ +import { useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { useQuery, useMutation } from '@tanstack/react-query'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Globe } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; +import { Globe, Tag, Plus, Edit, Trash2, Layers } from 'lucide-react'; +import { Label } from '@shared/schema'; +import { queryClient, apiRequest } from '@/lib/queryClient'; +import { useToast } from '@/hooks/use-toast'; -export default function Settings() { +interface SettingsProps { + onNavigateToTemplates: () => void; +} + +export default function Settings({ onNavigateToTemplates }: SettingsProps) { const { t, i18n } = useTranslation(); + const { toast } = useToast(); + + const [isLabelDialogOpen, setIsLabelDialogOpen] = useState(false); + const [editingLabel, setEditingLabel] = useState