From 5fb2633bc577620e3f9428a6004b476f56ad6ae9 Mon Sep 17 00:00:00 2001 From: chamiakJ Date: Wed, 9 Jul 2025 22:51:20 +0530 Subject: [PATCH] refactor(task-drawer): update localization keys for created and updated timestamps - Modified localization JSON files for multiple languages to use double curly braces for variable interpolation in the createdBy and updatedTime fields. - Ensured consistency across English, German, Spanish, Portuguese, Albanian, and Chinese translations for better formatting of dynamic content. --- .../locales/alb/task-drawer/task-drawer.json | 4 +- .../locales/de/task-drawer/task-drawer.json | 4 +- .../locales/en/task-drawer/task-drawer.json | 4 +- .../locales/es/task-drawer/task-drawer.json | 4 +- .../locales/pt/task-drawer/task-drawer.json | 4 +- .../locales/zh/task-drawer/task-drawer.json | 4 +- .../shared/info-tab/info-tab-footer.tsx | 44 +++++++++++++++---- .../src/types/tasks/task.types.ts | 2 + 8 files changed, 49 insertions(+), 21 deletions(-) diff --git a/worklenz-frontend/public/locales/alb/task-drawer/task-drawer.json b/worklenz-frontend/public/locales/alb/task-drawer/task-drawer.json index df525752..9d6c022f 100644 --- a/worklenz-frontend/public/locales/alb/task-drawer/task-drawer.json +++ b/worklenz-frontend/public/locales/alb/task-drawer/task-drawer.json @@ -79,8 +79,8 @@ "maxFilesError": "Mund të ngarkoni maksimum {count} skedarë", "processFilesError": "Dështoi përpunimi i skedarëve", "addCommentError": "Ju lutemi shtoni një koment ose bashkëngjitni skedarë", - "createdBy": "Krijuar {time} nga {user}", - "updatedTime": "Përditësuar {time}" + "createdBy": "Krijuar {{time}} nga {{user}}", + "updatedTime": "Përditësuar {{time}}" }, "searchInputPlaceholder": "Kërko sipas emrit", "pendingInvitation": "Ftesë në Pritje" diff --git a/worklenz-frontend/public/locales/de/task-drawer/task-drawer.json b/worklenz-frontend/public/locales/de/task-drawer/task-drawer.json index 5d4b4275..62e3f881 100644 --- a/worklenz-frontend/public/locales/de/task-drawer/task-drawer.json +++ b/worklenz-frontend/public/locales/de/task-drawer/task-drawer.json @@ -79,8 +79,8 @@ "maxFilesError": "Sie können maximal {count} Dateien hochladen", "processFilesError": "Fehler beim Verarbeiten der Dateien", "addCommentError": "Bitte fügen Sie einen Kommentar hinzu oder hängen Sie Dateien an", - "createdBy": "Erstellt {time} von {user}", - "updatedTime": "Aktualisiert {time}" + "createdBy": "Erstellt {{time}} von {{user}}", + "updatedTime": "Aktualisiert {{time}}" }, "searchInputPlaceholder": "Nach Name suchen", "pendingInvitation": "Ausstehende Einladung" diff --git a/worklenz-frontend/public/locales/en/task-drawer/task-drawer.json b/worklenz-frontend/public/locales/en/task-drawer/task-drawer.json index 83955de7..b5147324 100644 --- a/worklenz-frontend/public/locales/en/task-drawer/task-drawer.json +++ b/worklenz-frontend/public/locales/en/task-drawer/task-drawer.json @@ -79,8 +79,8 @@ "maxFilesError": "You can only upload a maximum of {count} files", "processFilesError": "Failed to process files", "addCommentError": "Please add a comment or attach files", - "createdBy": "Created {time} by {user}", - "updatedTime": "Updated {time}" + "createdBy": "Created {{time}} by {{user}}", + "updatedTime": "Updated {{time}}" }, "searchInputPlaceholder": "Search by name", "pendingInvitation": "Pending Invitation" diff --git a/worklenz-frontend/public/locales/es/task-drawer/task-drawer.json b/worklenz-frontend/public/locales/es/task-drawer/task-drawer.json index 0e92e24f..8e438716 100644 --- a/worklenz-frontend/public/locales/es/task-drawer/task-drawer.json +++ b/worklenz-frontend/public/locales/es/task-drawer/task-drawer.json @@ -79,8 +79,8 @@ "maxFilesError": "Solo puede subir un máximo de {count} archivos", "processFilesError": "Error al procesar archivos", "addCommentError": "Por favor agregue un comentario o adjunte archivos", - "createdBy": "Creado {time} por {user}", - "updatedTime": "Actualizado {time}" + "createdBy": "Creado {{time}} por {{user}}", + "updatedTime": "Actualizado {{time}}" }, "searchInputPlaceholder": "Buscar por nombre", "pendingInvitation": "Invitación Pendiente" diff --git a/worklenz-frontend/public/locales/pt/task-drawer/task-drawer.json b/worklenz-frontend/public/locales/pt/task-drawer/task-drawer.json index 1b06e543..c24e943e 100644 --- a/worklenz-frontend/public/locales/pt/task-drawer/task-drawer.json +++ b/worklenz-frontend/public/locales/pt/task-drawer/task-drawer.json @@ -79,8 +79,8 @@ "maxFilesError": "Você pode fazer upload de no máximo {count} arquivos", "processFilesError": "Falha ao processar arquivos", "addCommentError": "Por favor adicione um comentário ou anexe arquivos", - "createdBy": "Criado {time} por {user}", - "updatedTime": "Atualizado {time}" + "createdBy": "Criado {{time}} por {{user}}", + "updatedTime": "Atualizado {{time}}" }, "searchInputPlaceholder": "Pesquisar por nome", "pendingInvitation": "Convite Pendente" diff --git a/worklenz-frontend/public/locales/zh/task-drawer/task-drawer.json b/worklenz-frontend/public/locales/zh/task-drawer/task-drawer.json index 66240131..dfe304fe 100644 --- a/worklenz-frontend/public/locales/zh/task-drawer/task-drawer.json +++ b/worklenz-frontend/public/locales/zh/task-drawer/task-drawer.json @@ -79,8 +79,8 @@ "maxFilesError": "您最多只能上传{count}个文件", "processFilesError": "处理文件失败", "addCommentError": "请添加评论或附加文件", - "createdBy": "{time}由{user}创建", - "updatedTime": "更新于{time}" + "createdBy": "{{time}}由{{user}}创建", + "updatedTime": "更新于{{time}}" }, "searchInputPlaceholder": "按名称搜索", "pendingInvitation": "待处理邀请" diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx index 3ab435d8..0bfabd28 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx @@ -1,5 +1,5 @@ import { Button, Flex, Form, Mentions, Space, Tooltip, Typography, message } from 'antd'; -import { useCallback, useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useRef, useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { PaperClipOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { useAppSelector } from '@/hooks/useAppSelector'; @@ -15,6 +15,7 @@ import logger from '@/utils/errorLogger'; import taskCommentsApiService from '@/api/tasks/task-comments.api.service'; import { teamMembersApiService } from '@/api/team-members/teamMembers.api.service'; import { ITeamMember } from '@/types/teamMembers/teamMember.types'; +import { fromNow } from '@/utils/dateUtils'; // Utility function to convert file to base64 const getBase64 = (file: File): Promise => { @@ -66,6 +67,31 @@ const InfoTabFooter = () => { // get member list from project members slice const projectMembersList = useAppSelector(state => state.projectMemberReducer.membersList); + // Calculate relative time values + const createdFromNow = useMemo(() => { + const createdAt = taskFormViewModel?.task?.created_at; + if (!createdAt) return 'N/A'; + + try { + return fromNow(createdAt); + } catch (error) { + console.error('Error formatting created_at:', error, createdAt); + return 'N/A'; + } + }, [taskFormViewModel?.task?.created_at]); + + const updatedFromNow = useMemo(() => { + const updatedAt = taskFormViewModel?.task?.updated_at; + if (!updatedAt) return 'N/A'; + + try { + return fromNow(updatedAt); + } catch (error) { + console.error('Error formatting updated_at:', error, updatedAt); + return 'N/A'; + } + }, [taskFormViewModel?.task?.updated_at]); + // function to handle cancel const handleCancel = () => { form.resetFields(['comment']); @@ -454,28 +480,28 @@ const InfoTabFooter = () => { -{t('taskInfoTab.comments.createdBy', { - time: taskFormViewModel?.task?.created_from_now || 'N/A', + {t('taskInfoTab.comments.createdBy', { + time: createdFromNow, user: taskFormViewModel?.task?.reporter || '' })} -{t('taskInfoTab.comments.updatedTime', { - time: taskFormViewModel?.task?.updated_from_now || 'N/A' + {t('taskInfoTab.comments.updatedTime', { + time: updatedFromNow })} diff --git a/worklenz-frontend/src/types/tasks/task.types.ts b/worklenz-frontend/src/types/tasks/task.types.ts index d155490c..204d1418 100644 --- a/worklenz-frontend/src/types/tasks/task.types.ts +++ b/worklenz-frontend/src/types/tasks/task.types.ts @@ -39,6 +39,8 @@ export interface ITask { manual_progress: boolean; progress_value: number | null; weight: number | null; + created_at?: string; + updated_at?: string; } export interface IProjectMemberViewModel extends IProjectMember {