feat(task-management): enhance status management with drag-and-drop functionality

- Updated ManageStatusModal to support drag-and-drop for reordering statuses and moving them between categories.
- Introduced CategorySection component for better organization of statuses by category.
- Added validation to prevent moving the last status out of a category, ensuring each category retains at least one status.
- Enhanced localization for task management, updating translation keys across multiple languages for improved clarity and consistency.
This commit is contained in:
chamikaJ
2025-07-11 13:50:35 +05:30
parent 7def564950
commit 6b58709848
8 changed files with 829 additions and 310 deletions

View File

@@ -7,79 +7,81 @@
"statusText": "Statusi",
"phaseText": "Faza",
"memberText": "Anëtarët",
"assigneesText": "Përgjegjësit",
"assigneesText": "Të caktuarit",
"priorityText": "Prioriteti",
"labelsText": "Etiketa",
"labelsText": "Etiketat",
"membersText": "Anëtarët",
"groupByText": "Grupo sipas",
"showArchivedText": "Shfaq të arkivuara",
"showArchivedText": "Shfaq të arkivuarat",
"showFieldsText": "Shfaq fushat",
"keyText": "Çelësi",
"taskText": "Detyra",
"descriptionText": "Përshkrimi",
"phasesText": "Fazat",
"listText": "Listë",
"listText": "Lista",
"progressText": "Progresi",
"timeTrackingText": "Gjurmimi i Kohës",
"timetrackingText": "Gjurmimi i Kohës",
"timeTrackingText": "Ndjekja e kohës",
"timetrackingText": "Ndjekja e kohës",
"estimationText": "Vlerësimi",
"startDateText": "Data e Fillimit",
"startdateText": "Data e Fillimit",
"endDateText": "Data e Përfundimit",
"dueDateText": "Afati",
"duedateText": "Afati",
"completedDateText": "Data e Përfundimit",
"completeddateText": "Data e Përfundimit",
"createdDateText": "Data e Krijimit",
"createddateText": "Data e Krijimit",
"lastUpdatedText": "Përditësuar Së Fundi",
"lastupdatedText": "Përditësuar Së Fundi",
"startDateText": "Data e fillimit",
"startdateText": "Data e fillimit",
"endDateText": "Data e mbarimit",
"dueDateText": "Data e afatit",
"duedateText": "Data e afatit",
"completedDateText": "Data e përfundimit",
"completeddateText": "Data e përfundimit",
"createdDateText": "Data e krijimit",
"createddateText": "Data e krijimit",
"lastUpdatedText": "Përditësimi i fundit",
"lastupdatedText": "Përditësimi i fundit",
"reporterText": "Raportuesi",
"dueTimeText": "Koha e Afatit",
"duetimeText": "Koha e Afatit",
"dueTimeText": "Koha e afatit",
"duetimeText": "Koha e afatit",
"lowText": "I ulët",
"mediumText": "I mesëm",
"highText": "I lartë",
"lowText": "E ulët",
"mediumText": "E mesme",
"highText": "E lartë",
"createStatusButtonTooltip": "Cilësimet e statusit",
"configPhaseButtonTooltip": "Cilësimet e fazës",
"noLabelsFound": "Nuk u gjetën etiketa",
"addStatusButton": "Shto Status",
"addPhaseButton": "Shto Fazë",
"addStatusButton": "Shto status",
"addPhaseButton": "Shto fazë",
"createStatus": "Krijo Status",
"createStatus": "Krijo status",
"name": "Emri",
"category": "Kategoria",
"selectCategory": "Zgjidh një kategori",
"pleaseEnterAName": "Ju lutemi vendosni një emër",
"pleaseEnterAName": "Ju lutemi shkruani një emër",
"pleaseSelectACategory": "Ju lutemi zgjidhni një kategori",
"create": "Krijo",
"searchTasks": "Kërko detyrat...",
"searchTasks": "Kërko detyra...",
"searchPlaceholder": "Kërko...",
"fieldsText": "Fushat",
"loadingFilters": "Duke ngarkuar filtrat...",
"noOptionsFound": "Nuk u gjetën opsione",
"loadingFilters": "Po ngarkohen filtrat...",
"noOptionsFound": "Nuk u gjetën opcione",
"filtersActive": "filtra aktiv",
"filterActive": "filtër aktiv",
"clearAll": "Pastro të gjitha",
"clearing": "Duke pastruar...",
"clearing": "Po pastron...",
"cancel": "Anulo",
"search": "Kërko",
"groupedBy": "Grupuar sipas",
"manageStatuses": "Menaxho Statuset",
"managePhases": "Menaxho Fazat",
"dragToReorderStatuses": "Zvarrit statuset për t'i rirenditur. Çdo status mund të ketë një kategori të ndryshme.",
"groupedBy": "I grupuar sipas",
"manageStatuses": "Menaxho statuset",
"managePhases": "Menaxho fazat",
"dragToReorderStatuses": "Statuset janë të organizuara sipas kategorive. Tërhiq për të rirenditur brenda kategorive. Kliko 'Shto status' për të krijuar statuse të reja në çdo kategori.",
"enterNewStatusName": "Shkruani emrin e statusit të ri...",
"addStatus": "Shto Status",
"noStatusesFound": "Nuk u gjetën statuse. Krijoni statusin tuaj të parë më sipër.",
"deleteStatus": "Fshi Statusin",
"addStatus": "Shto status",
"noStatusesFound": "Nuk ka statuse në këtë kategori",
"deleteStatus": "Fshi statusin",
"deleteStatusConfirm": "Jeni të sigurt që doni të fshini këtë status? Ky veprim nuk mund të zhbëhet.",
"rename": "Riemëro",
"rename": "Riemërto",
"delete": "Fshi",
"enterStatusName": "Shkruani emrin e statusit",
"selectCategory": "Zgjidh kategorinë",
"close": "Mbyll"
"close": "Mbyll",
"cannotMoveStatus": "Nuk mund të lëvizet statusi",
"cannotMoveStatusMessage": "Nuk mund të lëvizet ky status sepse do të linte kategorinë '{{categoryName}}' bosh. Çdo kategori duhet të ketë të paktën një status.",
"ok": "OK"
}

View File

@@ -28,15 +28,15 @@
"endDateText": "Enddatum",
"dueDateText": "Fälligkeitsdatum",
"duedateText": "Fälligkeitsdatum",
"completedDateText": "Abschlussdatum",
"completeddateText": "Abschlussdatum",
"createdDateText": "Erstellungsdatum",
"createddateText": "Erstellungsdatum",
"completedDateText": "Abgeschlossen am",
"completeddateText": "Abgeschlossen am",
"createdDateText": "Erstellt am",
"createddateText": "Erstellt am",
"lastUpdatedText": "Zuletzt aktualisiert",
"lastupdatedText": "Zuletzt aktualisiert",
"reporterText": "Melder",
"dueTimeText": "Fällige Zeit",
"duetimeText": "Fällige Zeit",
"reporterText": "Berichterstatter",
"dueTimeText": "Fälligkeitszeit",
"duetimeText": "Fälligkeitszeit",
"lowText": "Niedrig",
"mediumText": "Mittel",
@@ -54,7 +54,7 @@
"category": "Kategorie",
"selectCategory": "Kategorie auswählen",
"pleaseEnterAName": "Bitte geben Sie einen Namen ein",
"pleaseSelectACategory": "Bitte wählen Sie eine Kategorie aus",
"pleaseSelectACategory": "Bitte wählen Sie eine Kategorie",
"create": "Erstellen",
"searchTasks": "Aufgaben suchen...",
@@ -66,20 +66,22 @@
"filterActive": "Filter aktiv",
"clearAll": "Alle löschen",
"clearing": "Wird gelöscht...",
"cancel": "Stornieren",
"cancel": "Abbrechen",
"search": "Suchen",
"groupedBy": "Gruppiert nach",
"manageStatuses": "Status verwalten",
"managePhases": "Phasen verwalten",
"dragToReorderStatuses": "Ziehen Sie Status, um sie neu zu ordnen. Jeder Status kann eine andere Kategorie haben.",
"enterNewStatusName": "Neuen Statusnamen eingeben...",
"dragToReorderStatuses": "Status sind nach Kategorien organisiert. Ziehen Sie, um innerhalb von Kategorien neu zu ordnen. Klicken Sie auf 'Status hinzufügen', um neue Status in jeder Kategorie zu erstellen.",
"enterNewStatusName": "Neuen Status-Namen eingeben...",
"addStatus": "Status hinzufügen",
"noStatusesFound": "Keine Status gefunden. Erstellen Sie Ihren ersten Status oben.",
"noStatusesFound": "Keine Status in dieser Kategorie",
"deleteStatus": "Status löschen",
"deleteStatusConfirm": "Sind Sie sicher, dass Sie diesen Status löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"rename": "Umbenennen",
"delete": "Löschen",
"enterStatusName": "Statusnamen eingeben",
"selectCategory": "Kategorie auswählen",
"close": "Schließen"
"enterStatusName": "Status-Namen eingeben",
"close": "Schließen",
"cannotMoveStatus": "Status kann nicht verschoben werden",
"cannotMoveStatusMessage": "Dieser Status kann nicht verschoben werden, da die Kategorie '{{categoryName}}' leer bleiben würde. Jede Kategorie muss mindestens einen Status haben.",
"ok": "OK"
}

View File

@@ -71,15 +71,17 @@
"groupedBy": "Grouped by",
"manageStatuses": "Manage Statuses",
"managePhases": "Manage Phases",
"dragToReorderStatuses": "Drag statuses to reorder them. Each status can have a different category.",
"dragToReorderStatuses": "Statuses are organized by categories. Drag to reorder within categories. Click 'Add Status' to create new statuses in each category.",
"enterNewStatusName": "Enter new status name...",
"addStatus": "Add Status",
"noStatusesFound": "No statuses found. Create your first status above.",
"noStatusesFound": "No statuses in this category",
"deleteStatus": "Delete Status",
"deleteStatusConfirm": "Are you sure you want to delete this status? This action cannot be undone.",
"rename": "Rename",
"delete": "Delete",
"enterStatusName": "Enter status name",
"selectCategory": "Select category",
"close": "Close"
"close": "Close",
"cannotMoveStatus": "Cannot Move Status",
"cannotMoveStatusMessage": "Cannot move this status because it would leave the '{{categoryName}}' category empty. Each category must have at least one status.",
"ok": "OK"
}

View File

@@ -6,6 +6,8 @@
"sortText": "Ordenar",
"statusText": "Estado",
"phaseText": "Fase",
"memberText": "Miembros",
"assigneesText": "Asignados",
"priorityText": "Prioridad",
"labelsText": "Etiquetas",
"membersText": "Miembros",
@@ -16,30 +18,32 @@
"taskText": "Tarea",
"descriptionText": "Descripción",
"phasesText": "Fases",
"listText": "Lista",
"progressText": "Progreso",
"timeTrackingText": "Seguimiento de tiempo",
"timetrackingText": "Seguimiento de tiempo",
"estimationText": "Estimación",
"startDateText": "Fecha de inicio",
"startdateText": "Fecha de inicio",
"endDateText": "Fecha de fin",
"dueDateText": "Fecha de vencimiento",
"duedateText": "Fecha de vencimiento",
"completedDateText": "Fecha de finalización",
"completeddateText": "Fecha de finalización",
"createdDateText": "Fecha de creación",
"createddateText": "Fecha de creación",
"lastUpdatedText": "Última actualización",
"lastupdatedText": "Última actualización",
"reporterText": "Reportero",
"dueTimeText": "Hora de vencimiento",
"lowText": "Baja",
"mediumText": "Media",
"highText": "Alta",
"assigneesText": "Asignados",
"timetrackingText": "Seguimiento de tiempo",
"startdateText": "Fecha de inicio",
"duedateText": "Fecha de vencimiento",
"completeddateText": "Fecha de finalización",
"createddateText": "Fecha de creación",
"lastupdatedText": "Última actualización",
"duetimeText": "Hora de vencimiento",
"createStatusButtonTooltip": "Configuración de estados",
"configPhaseButtonTooltip": "Configuración de fases",
"lowText": "Bajo",
"mediumText": "Medio",
"highText": "Alto",
"createStatusButtonTooltip": "Configuración de estado",
"configPhaseButtonTooltip": "Configuración de fase",
"noLabelsFound": "No se encontraron etiquetas",
"addStatusButton": "Agregar estado",
@@ -49,8 +53,8 @@
"name": "Nombre",
"category": "Categoría",
"selectCategory": "Seleccionar una categoría",
"pleaseEnterAName": "Por favor, ingrese un nombre",
"pleaseSelectACategory": "Por favor, seleccione una categoría",
"pleaseEnterAName": "Por favor ingrese un nombre",
"pleaseSelectACategory": "Por favor seleccione una categoría",
"create": "Crear",
"searchTasks": "Buscar tareas...",
@@ -65,17 +69,19 @@
"cancel": "Cancelar",
"search": "Buscar",
"groupedBy": "Agrupado por",
"manageStatuses": "Gestionar Estados",
"managePhases": "Gestionar Fases",
"dragToReorderStatuses": "Arrastra los estados para reordenarlos. Cada estado puede tener una categoría diferente.",
"enterNewStatusName": "Introducir nuevo nombre de estado...",
"addStatus": "Añadir Estado",
"noStatusesFound": "No se encontraron estados. Crea tu primer estado arriba.",
"deleteStatus": "Eliminar Estado",
"deleteStatusConfirm": "¿Estás seguro de que quieres eliminar este estado? Esta acción no se puede deshacer.",
"manageStatuses": "Gestionar estados",
"managePhases": "Gestionar fases",
"dragToReorderStatuses": "Los estados están organizados por categorías. Arrastra para reordenar dentro de las categorías. Haz clic en 'Agregar estado' para crear nuevos estados en cada categoría.",
"enterNewStatusName": "Ingrese el nombre del nuevo estado...",
"addStatus": "Agregar estado",
"noStatusesFound": "No hay estados en esta categoría",
"deleteStatus": "Eliminar estado",
"deleteStatusConfirm": "¿Está seguro de que desea eliminar este estado? Esta acción no se puede deshacer.",
"rename": "Renombrar",
"delete": "Eliminar",
"enterStatusName": "Introducir nombre del estado",
"selectCategory": "Seleccionar categoría",
"close": "Cerrar"
"enterStatusName": "Ingrese el nombre del estado",
"close": "Cerrar",
"cannotMoveStatus": "No se puede mover el estado",
"cannotMoveStatusMessage": "No se puede mover este estado porque dejaría vacía la categoría '{{categoryName}}'. Cada categoría debe tener al menos un estado.",
"ok": "OK"
}

View File

@@ -6,8 +6,10 @@
"sortText": "Ordenar",
"statusText": "Status",
"phaseText": "Fase",
"memberText": "Membros",
"assigneesText": "Atribuídos",
"priorityText": "Prioridade",
"labelsText": "Rótulos",
"labelsText": "Etiquetas",
"membersText": "Membros",
"groupByText": "Agrupar por",
"showArchivedText": "Mostrar arquivados",
@@ -16,41 +18,42 @@
"taskText": "Tarefa",
"descriptionText": "Descrição",
"phasesText": "Fases",
"listText": "Lista",
"progressText": "Progresso",
"timeTrackingText": "Rastreamento de Tempo",
"timeTrackingText": "Rastreamento de tempo",
"timetrackingText": "Rastreamento de tempo",
"estimationText": "Estimativa",
"startDateText": "Data de Início",
"endDateText": "Data de Fim",
"dueDateText": "Data de Vencimento",
"completedDateText": "Data de Conclusão",
"createdDateText": "Data de Criação",
"lastUpdatedText": "Última Atualização",
"startDateText": "Data de início",
"startdateText": "Data de início",
"endDateText": "Data de fim",
"dueDateText": "Data de vencimento",
"duedateText": "Data de vencimento",
"completedDateText": "Data de conclusão",
"completeddateText": "Data de conclusão",
"createdDateText": "Data de criação",
"createddateText": "Data de criação",
"lastUpdatedText": "Última atualização",
"lastupdatedText": "Última atualização",
"reporterText": "Relator",
"dueTimeText": "Hora de Vencimento",
"assigneesText": "Atribuições",
"timetrackingText": "Rastreamento de Tempo",
"startdateText": "Data de Início",
"duedateText": "Data de Vencimento",
"completeddateText": "Data de Conclusão",
"createddateText": "Data de Criação",
"lastupdatedText": "Última Atualização",
"dueTimeText": "Hora de vencimento",
"duetimeText": "Hora de vencimento",
"lowText": "Baixa",
"mediumText": "Média",
"highText": "Alta",
"createStatusButtonTooltip": "Configurações de Status",
"configPhaseButtonTooltip": "Configurações de Fase",
"noLabelsFound": "Nenhum rótulo encontrado",
"createStatusButtonTooltip": "Configurações de status",
"configPhaseButtonTooltip": "Configurações de fase",
"noLabelsFound": "Nenhuma etiqueta encontrada",
"addStatusButton": "Adicionar Status",
"addPhaseButton": "Adicionar Fase",
"addStatusButton": "Adicionar status",
"addPhaseButton": "Adicionar fase",
"createStatus": "Criar Status",
"createStatus": "Criar status",
"name": "Nome",
"category": "Categoria",
"selectCategory": "Selecionar uma categoria",
"pleaseEnterAName": "Por favor, insira um nome",
"pleaseEnterAName": "Por favor, digite um nome",
"pleaseSelectACategory": "Por favor, selecione uma categoria",
"create": "Criar",
@@ -66,17 +69,19 @@
"cancel": "Cancelar",
"search": "Pesquisar",
"groupedBy": "Agrupado por",
"manageStatuses": "Gerenciar Status",
"managePhases": "Gerenciar Fases",
"dragToReorderStatuses": "Arraste os status para reordená-los. Cada status pode ter uma categoria diferente.",
"enterNewStatusName": "Digite o novo nome do status...",
"addStatus": "Adicionar Status",
"noStatusesFound": "Nenhum status encontrado. Crie seu primeiro status acima.",
"deleteStatus": "Excluir Status",
"manageStatuses": "Gerenciar status",
"managePhases": "Gerenciar fases",
"dragToReorderStatuses": "Os status estão organizados por categorias. Arraste para reordenar dentro das categorias. Clique em 'Adicionar status' para criar novos status em cada categoria.",
"enterNewStatusName": "Digite o nome do novo status...",
"addStatus": "Adicionar status",
"noStatusesFound": "Nenhum status nesta categoria",
"deleteStatus": "Excluir status",
"deleteStatusConfirm": "Tem certeza de que deseja excluir este status? Esta ação não pode ser desfeita.",
"rename": "Renomear",
"delete": "Excluir",
"enterStatusName": "Digite o nome do status",
"selectCategory": "Selecionar categoria",
"close": "Fechar"
"close": "Fechar",
"cannotMoveStatus": "Não é possível mover o status",
"cannotMoveStatusMessage": "Não é possível mover este status porque deixaria a categoria '{{categoryName}}' vazia. Cada categoria deve ter pelo menos um status.",
"ok": "OK"
}

View File

@@ -75,5 +75,8 @@
"delete": "删除",
"enterStatusName": "输入状态名称",
"selectCategory": "选择类别",
"close": "关闭"
"close": "关闭",
"cannotMoveStatus": "无法移动状态",
"cannotMoveStatusMessage": "无法移动此状态,因为这会使\"{{categoryName}}\"类别为空。每个类别必须至少有一个状态。",
"ok": "确定"
}