diff --git a/worklenz-frontend/public/locales/alb/kanban-board.json b/worklenz-frontend/public/locales/alb/kanban-board.json
index 48987f10..50835235 100644
--- a/worklenz-frontend/public/locales/alb/kanban-board.json
+++ b/worklenz-frontend/public/locales/alb/kanban-board.json
@@ -37,5 +37,17 @@
"noDueDate": "Pa datë përfundimi",
"save": "Ruaj",
"clear": "Pastro",
- "nextWeek": "Javën e ardhshme"
+ "nextWeek": "Javën e ardhshme",
+ "noSubtasks": "Pa nëndetyra",
+ "showSubtasks": "Shfaq nëndetyrat",
+ "hideSubtasks": "Fshih nëndetyrat",
+
+ "errorLoadingTasks": "Gabim gjatë ngarkimit të detyrave",
+ "noTasksFound": "Nuk u gjetën detyra",
+ "loadingFilters": "Duke ngarkuar filtra...",
+ "failedToUpdateColumnOrder": "Dështoi përditësimi i rendit të kolonave",
+ "failedToUpdatePhaseOrder": "Dështoi përditësimi i rendit të fazave",
+ "pleaseTryAgain": "Ju lutemi provoni përsëri",
+ "taskNotCompleted": "Detyra nuk është përfunduar",
+ "completeTaskDependencies": "Ju lutemi përfundoni varësitë e detyrës para se të vazhdoni"
}
diff --git a/worklenz-frontend/public/locales/de/kanban-board.json b/worklenz-frontend/public/locales/de/kanban-board.json
index 9d748e30..10b58b95 100644
--- a/worklenz-frontend/public/locales/de/kanban-board.json
+++ b/worklenz-frontend/public/locales/de/kanban-board.json
@@ -37,5 +37,17 @@
"noDueDate": "Kein Fälligkeitsdatum",
"save": "Speichern",
"clear": "Löschen",
- "nextWeek": "Nächste Woche"
+ "nextWeek": "Nächste Woche",
+ "noSubtasks": "Keine Unteraufgaben",
+ "showSubtasks": "Unteraufgaben anzeigen",
+ "hideSubtasks": "Unteraufgaben ausblenden",
+
+ "errorLoadingTasks": "Fehler beim Laden der Aufgaben",
+ "noTasksFound": "Keine Aufgaben gefunden",
+ "loadingFilters": "Filter werden geladen...",
+ "failedToUpdateColumnOrder": "Fehler beim Aktualisieren der Spaltenreihenfolge",
+ "failedToUpdatePhaseOrder": "Fehler beim Aktualisieren der Phasenreihenfolge",
+ "pleaseTryAgain": "Bitte versuchen Sie es erneut",
+ "taskNotCompleted": "Aufgabe ist nicht abgeschlossen",
+ "completeTaskDependencies": "Bitte schließen Sie die Aufgabenabhängigkeiten ab, bevor Sie fortfahren"
}
diff --git a/worklenz-frontend/public/locales/en/kanban-board.json b/worklenz-frontend/public/locales/en/kanban-board.json
index 018d52a9..77659152 100644
--- a/worklenz-frontend/public/locales/en/kanban-board.json
+++ b/worklenz-frontend/public/locales/en/kanban-board.json
@@ -40,5 +40,14 @@
"nextWeek": "Next week",
"noSubtasks": "No subtasks",
"showSubtasks": "Show subtasks",
- "hideSubtasks": "Hide subtasks"
+ "hideSubtasks": "Hide subtasks",
+
+ "errorLoadingTasks": "Error loading tasks",
+ "noTasksFound": "No tasks found",
+ "loadingFilters": "Loading filters...",
+ "failedToUpdateColumnOrder": "Failed to update column order",
+ "failedToUpdatePhaseOrder": "Failed to update phase order",
+ "pleaseTryAgain": "Please try again",
+ "taskNotCompleted": "Task is not completed",
+ "completeTaskDependencies": "Please complete the task dependencies before proceeding"
}
diff --git a/worklenz-frontend/public/locales/es/kanban-board.json b/worklenz-frontend/public/locales/es/kanban-board.json
index c49a02ca..df4f2b1e 100644
--- a/worklenz-frontend/public/locales/es/kanban-board.json
+++ b/worklenz-frontend/public/locales/es/kanban-board.json
@@ -37,5 +37,17 @@
"noDueDate": "Sin fecha de vencimiento",
"save": "Guardar",
"clear": "Limpiar",
- "nextWeek": "Próxima semana"
+ "nextWeek": "Próxima semana",
+ "noSubtasks": "Sin subtareas",
+ "showSubtasks": "Mostrar subtareas",
+ "hideSubtasks": "Ocultar subtareas",
+
+ "errorLoadingTasks": "Error al cargar tareas",
+ "noTasksFound": "No se encontraron tareas",
+ "loadingFilters": "Cargando filtros...",
+ "failedToUpdateColumnOrder": "Error al actualizar el orden de las columnas",
+ "failedToUpdatePhaseOrder": "Error al actualizar el orden de las fases",
+ "pleaseTryAgain": "Por favor, inténtalo de nuevo",
+ "taskNotCompleted": "La tarea no está completada",
+ "completeTaskDependencies": "Por favor, completa las dependencias de la tarea antes de continuar"
}
diff --git a/worklenz-frontend/public/locales/pt/kanban-board.json b/worklenz-frontend/public/locales/pt/kanban-board.json
index f290258e..5bac3adb 100644
--- a/worklenz-frontend/public/locales/pt/kanban-board.json
+++ b/worklenz-frontend/public/locales/pt/kanban-board.json
@@ -37,5 +37,17 @@
"noDueDate": "Sem data de vencimento",
"save": "Salvar",
"clear": "Limpar",
- "nextWeek": "Próxima semana"
+ "nextWeek": "Próxima semana",
+ "noSubtasks": "Sem subtarefas",
+ "showSubtasks": "Mostrar subtarefas",
+ "hideSubtasks": "Ocultar subtarefas",
+
+ "errorLoadingTasks": "Erro ao carregar tarefas",
+ "noTasksFound": "Nenhuma tarefa encontrada",
+ "loadingFilters": "Carregando filtros...",
+ "failedToUpdateColumnOrder": "Falha ao atualizar a ordem das colunas",
+ "failedToUpdatePhaseOrder": "Falha ao atualizar a ordem das fases",
+ "pleaseTryAgain": "Por favor, tente novamente",
+ "taskNotCompleted": "Tarefa não está concluída",
+ "completeTaskDependencies": "Por favor, complete as dependências da tarefa antes de prosseguir"
}
diff --git a/worklenz-frontend/public/locales/zh/kanban-board.json b/worklenz-frontend/public/locales/zh/kanban-board.json
index 4c51dfa8..20c7cb08 100644
--- a/worklenz-frontend/public/locales/zh/kanban-board.json
+++ b/worklenz-frontend/public/locales/zh/kanban-board.json
@@ -23,5 +23,24 @@
"deleteStatusTitle": "删除状态",
"deleteStatusContent": "您确定要删除此状态吗?此操作无法撤销。",
"deletePhaseTitle": "删除阶段",
- "deletePhaseContent": "您确定要删除此阶段吗?此操作无法撤销。"
+ "deletePhaseContent": "您确定要删除此阶段吗?此操作无法撤销。",
+ "untitledSection": "未命名部分",
+ "unmapped": "未映射",
+ "clickToChangeDate": "点击更改日期",
+ "noDueDate": "无截止日期",
+ "save": "保存",
+ "clear": "清除",
+ "nextWeek": "下周",
+ "noSubtasks": "无子任务",
+ "showSubtasks": "显示子任务",
+ "hideSubtasks": "隐藏子任务",
+
+ "errorLoadingTasks": "加载任务时出错",
+ "noTasksFound": "未找到任务",
+ "loadingFilters": "正在加载过滤器...",
+ "failedToUpdateColumnOrder": "更新列顺序失败",
+ "failedToUpdatePhaseOrder": "更新阶段顺序失败",
+ "pleaseTryAgain": "请重试",
+ "taskNotCompleted": "任务未完成",
+ "completeTaskDependencies": "请先完成任务依赖项,然后再继续"
}
\ No newline at end of file
diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx
index 48219464..2b542eeb 100644
--- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx
+++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoardNativeDnD/EnhancedKanbanBoardNativeDnD.tsx
@@ -24,8 +24,10 @@ import { useTaskSocketHandlers } from '@/hooks/useTaskSocketHandlers';
import { phasesApiService } from '@/api/taskAttributes/phases/phases.api.service';
import { ITaskListGroup } from '@/types/tasks/taskList.types';
import { fetchPhasesByProjectId, updatePhaseListOrder } from '@/features/projects/singleProject/phase/phases.slice';
+import { useTranslation } from 'react-i18next';
const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ projectId }) => {
+ const { t } = useTranslation('kanban-board');
const dispatch = useDispatch();
const authService = useAuthService();
const { socket } = useSocket();
@@ -103,14 +105,14 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
const columnOrder = reorderedGroups.map(group => group.id);
const requestBody = { status_order: columnOrder };
const response = await statusApiService.updateStatusOrder(requestBody, projectId);
- if (!response.done) {
- // Revert the change if API call fails
- const revertedGroups = [...reorderedGroups];
- const [movedBackGroup] = revertedGroups.splice(toIdx, 1);
- revertedGroups.splice(fromIdx, 0, movedBackGroup);
- dispatch(reorderGroups({ fromIndex: toIdx, toIndex: fromIdx, reorderedGroups: revertedGroups }));
- alertService.error('Failed to update column order', 'Please try again');
- }
+ if (!response.done) {
+ // Revert the change if API call fails
+ const revertedGroups = [...reorderedGroups];
+ const [movedBackGroup] = revertedGroups.splice(toIdx, 1);
+ revertedGroups.splice(fromIdx, 0, movedBackGroup);
+ dispatch(reorderGroups({ fromIndex: toIdx, toIndex: fromIdx, reorderedGroups: revertedGroups }));
+ alertService.error(t('failedToUpdateColumnOrder'), t('pleaseTryAgain'));
+ }
} else if (groupBy === 'phase') {
const newPhaseList = [...phaseList];
const [movedItem] = newPhaseList.splice(fromIdx, 1);
@@ -124,7 +126,7 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
};
const response = await phasesApiService.updatePhaseOrder(projectId, requestBody);
if (!response.done) {
- alertService.error('Failed to update phase order', 'Please try again');
+ alertService.error(t('failedToUpdatePhaseOrder'), t('pleaseTryAgain'));
}
}
} catch (error) {
@@ -133,7 +135,7 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
const [movedBackGroup] = revertedGroups.splice(toIdx, 1);
revertedGroups.splice(fromIdx, 0, movedBackGroup);
dispatch(reorderGroups({ fromIndex: toIdx, toIndex: fromIdx, reorderedGroups: revertedGroups }));
- alertService.error('Failed to update column order', 'Please try again');
+ alertService.error(t('failedToUpdateColumnOrder'), t('pleaseTryAgain'));
logger.error('Failed to update column order', error);
}
@@ -143,11 +145,23 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
// Utility to recalculate all task orders for all groups
function getAllTaskUpdates(allGroups: ITaskListGroup[], groupBy: string) {
- const taskUpdates = [];
+ const taskUpdates: Array<{
+ task_id: string | undefined;
+ sort_order: number;
+ status_id?: string;
+ priority_id?: string;
+ phase_id?: string;
+ }> = [];
let currentSortOrder = 0;
for (const group of allGroups) {
for (const task of group.tasks) {
- const update = {
+ const update: {
+ task_id: string | undefined;
+ sort_order: number;
+ status_id?: string;
+ priority_id?: string;
+ phase_id?: string;
+ } = {
task_id: task.id,
sort_order: currentSortOrder,
};
@@ -200,8 +214,8 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
const canContinue = await checkTaskDependencyStatus(movedTask.id, targetGroupId);
if (!canContinue) {
alertService.error(
- 'Task is not completed',
- 'Please complete the task dependencies before proceeding'
+ t('taskNotCompleted'),
+ t('completeTaskDependencies')
);
return;
}
@@ -295,7 +309,7 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
team_id: teamId,
from_index: taskIdx,
to_index: insertIdx,
- to_last_index: insertIdx === (targetGroup.id === sourceGroup.id ? newTaskGroups.find(g => g.id === targetGroup.id)?.tasks.length - 1 : targetGroup.tasks.length),
+ to_last_index: insertIdx === (targetGroup.id === sourceGroup.id ? (newTaskGroups.find(g => g.id === targetGroup.id)?.tasks.length || 0) - 1 : targetGroup.tasks.length),
task: {
id: movedTask.id,
project_id: movedTask.project_id || projectId,
@@ -336,7 +350,7 @@ const EnhancedKanbanBoardNativeDnD: React.FC<{ projectId: string }> = ({ project
if (error) {
return (