From 5b8b6a0686fad105701f94b976a2d38212be3d49 Mon Sep 17 00:00:00 2001 From: Anish Date: Fri, 2 Feb 2024 22:32:39 +0500 Subject: [PATCH] feat/#1662-kanban-board (#2138) * fix(Kanban): ui fixes and kanban drag and drop smoothness * fix(Kanban): ui fixes and kanban drag and drop smoothness * fix(DeepScan): fix the condition that is used for testing purpose * fix: translations added + console remove + static data removed * fix the consoles and static code * fix the consoles and static code * Update team-members-kanban-view.tsx * Update page.tsx * fix the scro unused word in class * fix the overlapper unused word in class * fix the overlapper unused word in class --------- Co-authored-by: Ruslan K --- .cspell.json | 1 + apps/web/app/[locale]/kanban/page.tsx | 213 ++++++++++-------- apps/web/app/hooks/features/useKanban.ts | 16 +- apps/web/app/interfaces/IKanban.ts | 6 +- apps/web/app/stores/kanban.ts | 6 +- apps/web/lib/components/Kanban.tsx | 67 +++--- apps/web/lib/components/image-overlapper.tsx | 124 +++++----- apps/web/lib/components/kanban-card.tsx | 19 +- .../lib/features/team-members-kanban-view.tsx | 70 +++--- apps/web/lib/i18n/en.ts | 4 +- apps/web/messages/ar.json | 7 +- apps/web/messages/bg.json | 6 +- apps/web/messages/de.json | 7 +- apps/web/messages/en.json | 5 + apps/web/messages/es.json | 5 + apps/web/messages/fr.json | 5 + apps/web/messages/he.json | 6 +- apps/web/messages/it.json | 6 +- apps/web/messages/nl.json | 6 +- apps/web/messages/pl.json | 6 +- apps/web/messages/pt.json | 6 +- apps/web/messages/ru.json | 6 +- apps/web/messages/zh.json | 6 +- apps/web/public/locales/en/common.json | 4 +- 24 files changed, 344 insertions(+), 263 deletions(-) diff --git a/.cspell.json b/.cspell.json index 140cce74b..c0f95884a 100644 --- a/.cspell.json +++ b/.cspell.json @@ -46,6 +46,7 @@ "gtag", "headlessui", "heroicons", + "overlapper", "Huhn", "icnsutils", "incididunt", diff --git a/apps/web/app/[locale]/kanban/page.tsx b/apps/web/app/[locale]/kanban/page.tsx index 624732bd9..63812a41b 100644 --- a/apps/web/app/[locale]/kanban/page.tsx +++ b/apps/web/app/[locale]/kanban/page.tsx @@ -4,148 +4,167 @@ import { KanbanTabs } from '@app/constants'; import { useOrganizationTeams } from '@app/hooks'; import { useKanban } from '@app/hooks/features/useKanban'; import KanbanBoardSkeleton from '@components/shared/skeleton/KanbanBoardSkeleton'; -import VerticalLine from '@components/ui/svgs/vertificalline'; import { withAuthentication } from 'lib/app/authenticator'; -import { Breadcrumb } from 'lib/components'; -import { AddIcon } from 'lib/components/svgs'; +import { Breadcrumb, Button, Dropdown, InputField } from 'lib/components'; +import { AddIcon, SearchNormalIcon, Settings4Icon } from 'lib/components/svgs'; import { KanbanView } from 'lib/features/team-members-kanban-view'; import { MainLayout } from 'lib/layout'; import { useState } from 'react'; import { useTranslations } from 'next-intl'; import { useParams } from 'next/navigation'; -import Skeleton from 'react-loading-skeleton'; -import ImageOverlapper, { IImageOverlapper } from 'lib/components/image-overlapper'; +import ImageComponent, { ImageOverlapperProps } from 'lib/components/image-overlapper'; +import Separator from '@components/ui/separator'; +import { clsxm } from '@app/utils'; const Kanban = () => { const { data } = useKanban(); const { activeTeam } = useOrganizationTeams(); const t = useTranslations(); const params = useParams<{ locale: string }>(); - const currentLocale = params ? params.locale : null; - const [activeTab, setActiveTab] = useState(KanbanTabs.TODAY); - const breadcrumbPath = [ { title: JSON.parse(t('pages.home.BREADCRUMB')), href: '/' }, { title: activeTeam?.name || '', href: '/' }, - { title: 'Kanban Board', href: `/${currentLocale}/kanban` } + { title: t('pages.kanban.KANBAN_BOARD'), href: `/${currentLocale}/kanban` } ]; const activeTeamMembers = activeTeam?.members ? activeTeam.members : []; - const teamMembers: IImageOverlapper[] = []; + const teamMembers: ImageOverlapperProps[] = []; - activeTeamMembers.map((member: any)=> { + activeTeamMembers.map((member: any) => { teamMembers.push({ id: member.employee.user.id, url: member.employee.user.imageUrl, alt: member.employee.user.firstName - }) + }); }); + const tabs = [ + { name: t('common.TODAY'), value: KanbanTabs.TODAY }, + { name: t('common.YESTERDAY'), value: KanbanTabs.YESTERDAY }, + { name: t('common.TOMORROW'), value: KanbanTabs.TOMORROW } + ]; + // eslint-disable-next-line react/no-unstable-nested-components + const Label = ({ active, selected }: { active: string; selected: string }) => ( +
+ {active} +
+ ); + const sampleDropdownItem = (key: string) => { + const data = { + key: '1', + Label: Label, + selectedLabel: {key}, + itemTitle: key + // other properties can be added as needed + }; + return data; + }; return ( <> - -
+ +
-
- {activeTeamMembers.length > 0 ? -

08:00 ( UTC +04:30 )

- : - - } - - - +
+
+

{t('pages.kanban.KANBAN_BOARD')}

+
+ 08:00 ( UTC +04:30 ) +
+ +
+ +
+ +
-
+
-
{ - setActiveTab(KanbanTabs.TODAY); - }} - className={`cursor-pointer pt-2.5 px-5 pb-[30px] text-base font-semibold ${ - activeTab === KanbanTabs.TODAY - ? 'border-b-[#3826A6] text-[#3826A6] dark:text-white dark:border-b-white' - : 'border-b-white dark:border-b-[#191A20] dark:text-white text-[#282048]' - }`} - style={{ - borderBottomWidth: '3px', - borderBottomStyle: 'solid' - }} - > - Today -
-
{ - setActiveTab(KanbanTabs.YESTERDAY); - }} - className={`cursor-pointer pt-2.5 px-5 pb-[30px] text-base font-semibold ${ - activeTab === KanbanTabs.YESTERDAY - ? 'border-b-[#3826A6] text-[#3826A6] dark:text-white dark:border-b-white' - : 'border-b-white dark:border-b-[#191A20] dark:text-white text-[#282048]' - }`} - style={{ - borderBottomWidth: '3px', - borderBottomStyle: 'solid' - }} + {tabs.map((tab) => ( +
setActiveTab(tab.value)} + className={`cursor-pointer pt-2.5 px-5 pb-[30px] text-base font-semibold ${ + activeTab === tab.value + ? 'border-b-[#3826A6] text-[#3826A6] dark:text-white dark:border-b-white' + : 'border-b-white dark:border-b-[#191A20] dark:text-white text-[#282048]' + }`} + style={{ + borderBottomWidth: '3px', + borderBottomStyle: 'solid' + }} + > + {tab.name} +
+ ))} +
+
+ + + +
+
-
{ - setActiveTab(KanbanTabs.TOMORROW); - }} - className={`cursor-pointer pt-2.5 px-5 pb-[30px] text-base font-semibold ${ - activeTab === KanbanTabs.TOMORROW - ? 'border-b-[#3826A6] text-[#3826A6] dark:text-white dark:border-b-white' - : 'border-b-white dark:border-b-[#191A20] dark:text-white text-[#282048]' - }`} - style={{ - borderBottomWidth: '3px', - borderBottomStyle: 'solid' - }} - > - Tomorrow +
+ + + + } + />
-
-
+
{/** TODO:fetch teamtask based on days */} - {/** Kanbanboard for today tasks */} - {activeTab === KanbanTabs.TODAY && ( - <> - {Object.keys(data).length > 0 ? ( - - ) : ( - - )} - - )} - - {/** Kanbanboard for yesterday tasks */} - {activeTab === KanbanTabs.YESTERDAY && ( - <> - {Object.keys(data).length > 0 ? ( - - ) : ( - - )} - - )} - - {/** Kanbanboard for tomorrow tasks */} - {activeTab === KanbanTabs.TOMORROW && ( + {activeTab && ( // add filter for today, yesterday and tomorrow <> {Object.keys(data).length > 0 ? ( diff --git a/apps/web/app/hooks/features/useKanban.ts b/apps/web/app/hooks/features/useKanban.ts index c9ea813f1..66fb8e285 100644 --- a/apps/web/app/hooks/features/useKanban.ts +++ b/apps/web/app/hooks/features/useKanban.ts @@ -4,14 +4,12 @@ import { useRecoilState } from 'recoil'; import { useEffect, useState } from 'react'; import { ITaskStatusItemList, ITeamTask } from '@app/interfaces'; import { useTeamTasks } from './useTeamTasks'; +import { IKanban } from '@app/interfaces/IKanban'; export function useKanban() { const [loading, setLoading] = useState(true); - const [kanbanBoard, setKanbanBoard] = useRecoilState(kanbanBoardState); - const taskStatusHook = useTaskStatus(); - const { tasks, tasksFetching, updateTask } = useTeamTasks(); /** @@ -73,14 +71,22 @@ export function useKanban() { }); }; + const addNewTask = (task: ITeamTask, status: string) => { + const updatedBoard = { + ...kanbanBoard, + [status]: [...kanbanBoard[status], task] + }; + setKanbanBoard(() => updatedBoard); + }; return { - data: kanbanBoard, + data: kanbanBoard as IKanban, isLoading: loading, columns: taskStatusHook.taskStatus, updateKanbanBoard: setKanbanBoard, updateTaskStatus: updateTask, toggleColumn, isColumnCollapse, - reorderStatus + reorderStatus, + addNewTask }; } diff --git a/apps/web/app/interfaces/IKanban.ts b/apps/web/app/interfaces/IKanban.ts index 2d17b3da5..509d3dcc1 100644 --- a/apps/web/app/interfaces/IKanban.ts +++ b/apps/web/app/interfaces/IKanban.ts @@ -1,5 +1,5 @@ -import { ITeamTask } from "./ITask"; +import { ITeamTask } from './ITask'; export interface IKanban { - [key: string]: ITeamTask[] -} \ No newline at end of file + [key: string]: ITeamTask[]; +} diff --git a/apps/web/app/stores/kanban.ts b/apps/web/app/stores/kanban.ts index 0badd4c91..9940f0465 100644 --- a/apps/web/app/stores/kanban.ts +++ b/apps/web/app/stores/kanban.ts @@ -3,5 +3,7 @@ import { atom } from "recoil"; export const kanbanBoardState = atom({ key: 'kanbanBoardState', - default: {} -}) \ No newline at end of file + default: { + + } +}) diff --git a/apps/web/lib/components/Kanban.tsx b/apps/web/lib/components/Kanban.tsx index e4c597a58..b29a93197 100644 --- a/apps/web/lib/components/Kanban.tsx +++ b/apps/web/lib/components/Kanban.tsx @@ -10,11 +10,15 @@ import { DroppableProvided, DroppableStateSnapshot } from 'react-beautiful-dnd'; + import Item from './kanban-card'; import { ITeamTask } from '@app/interfaces'; import { TaskStatus } from '@app/constants'; import { useKanban } from '@app/hooks/features/useKanban'; import { AddIcon } from './svgs'; +import { Popover, PopoverContent, PopoverTrigger } from '@components/ui/popover'; +import { Button } from '@components/ui/button'; +import { useTranslations } from 'next-intl'; const grid = 8; @@ -55,23 +59,11 @@ function headerStyleChanger(snapshot: DraggableStateSnapshot, bgColor: any) { * @param param0 * @returns */ -function InnerItemList({ - items, - title, - dropSnapshot -}: { - title: string; - items: ITeamTask[]; - dropSnapshot: DroppableStateSnapshot; -}) { +function InnerItemList({ items, title }: { title: string; items: ITeamTask[]; dropSnapshot: DroppableStateSnapshot }) { return ( <>
0 ? '20px' : '0px' - }} - className="flex flex-col gap-2.5 overflow-x-hidden" + className="flex flex-col pb-2 overflow-x-hidden" > {items.map((item: ITeamTask, index: number) => ( @@ -137,19 +129,6 @@ export const KanbanDroppable = ({ type: string; content: ITeamTask[]; }) => { - const [enabled, setEnabled] = useState(false); - - useEffect(() => { - const animation = requestAnimationFrame(() => setEnabled(true)); - - return () => { - cancelAnimationFrame(animation); - setEnabled(false); - }; - }, []); - - if (!enabled) return null; - return ( <> @@ -216,7 +195,7 @@ export const EmptyKanbanDroppable = ({ {...provided.draggableProps} {...provided.dragHandleProps} style={getItemStyle(snapshot.isDragging, provided.draggableProps.style)} - className="flex flex-row w-fit h-full" + className="flex flex-row px-2 w-fit h-full" > {title.length > 0 ? ( <> @@ -279,7 +258,6 @@ const KanbanDraggableHeader = ({ provided: DraggableProvided; }) => { const { toggleColumn } = useKanban(); - return ( <> {title && ( @@ -306,7 +284,23 @@ const KanbanDraggableHeader = ({
- + + + + + + {['Delete', 'Archive', 'Copy'].map((v) => ( +

+ {v} +

+ ))} +
+
@@ -332,7 +326,10 @@ const KanbanDraggable = ({ title: string; backgroundColor: any; items: ITeamTask[]; + addNewTask: (value: ITeamTask, status: string) => void; }) => { + const t = useTranslations(); + return ( <> {title && ( @@ -343,7 +340,7 @@ const KanbanDraggable = ({ {...provided.draggableProps} {...provided.dragHandleProps} style={getItemStyle(snapshot.isDragging, provided.draggableProps.style)} - className="relative flex flex-col w-[325px]" + className="relative flex flex-col px-2 w-[355px]" > {title ? ( <> @@ -356,17 +353,17 @@ const KanbanDraggable = ({ backgroundColor={backgroundColor} />
-
+
-
+
+

{t('common.CREATE_TASK')}

+
) : null} diff --git a/apps/web/lib/components/image-overlapper.tsx b/apps/web/lib/components/image-overlapper.tsx index 33e1d49f7..f30f66874 100644 --- a/apps/web/lib/components/image-overlapper.tsx +++ b/apps/web/lib/components/image-overlapper.tsx @@ -1,74 +1,74 @@ -import Link from "next/link"; -import Image from "next/image"; +import Link from 'next/link'; +import Image from 'next/image'; import { Tooltip } from 'lib/components'; -import Skeleton from "react-loading-skeleton"; +import Skeleton from 'react-loading-skeleton'; -export interface IImageOverlapper { - id: string; - url: string; - alt: string; +export interface ImageOverlapperProps { + id: string; + url: string; + alt: string; } export default function ImageOverlapper({ - images, - radius=20, - displayImageCount=4 + images, + radius = 20, + displayImageCount = 4 }: { - images: IImageOverlapper[], - radius?: number, - displayImageCount?: number + images: ImageOverlapperProps[]; + radius?: number; + displayImageCount?: number; }) { - - const imageRadius = radius; - const imageLength = images.length; + const imageRadius = radius; + const imageLength = images.length; const numberOfImagesDisplayed = displayImageCount; const totalLength = (imageLength + 1) * imageRadius; - const stackImages = (index: number, length: number) => { - const total_length = (length + 1) * imageRadius; - return { - zIndex: (index + 1).toString(), - right: `calc(${total_length - imageRadius * (index + 2)}px)` - }; - }; + const stackImages = (index: number, length: number) => { + const total_length = (length + 1) * imageRadius; + return { + zIndex: (index + 1).toString(), + right: `calc(${total_length - imageRadius * (index + 2)}px)` + }; + }; - return ( -
- {imageLength > 0 ? -
- {images.map((image: IImageOverlapper, index: number) => { - if (index < numberOfImagesDisplayed) { - return ( - - - {`${image.alt} - - - ); - } - })} - {images.length > numberOfImagesDisplayed && ( -
- {(imageLength - numberOfImagesDisplayed) < 100 ? (imageLength - numberOfImagesDisplayed) : 99}+ -
- )} -
- : - - } + return ( +
+ {imageLength > 0 ? ( +
+ {images.map((image: ImageOverlapperProps, index: number) => { + if (index < numberOfImagesDisplayed) { + return ( + + + {`${image.alt} + + + ); + } + })} + {images.length > numberOfImagesDisplayed && ( +
+ {imageLength - numberOfImagesDisplayed < 100 ? imageLength - numberOfImagesDisplayed : 99}+ +
+ )} +
+ ) : ( + + )}
- ) -} \ No newline at end of file + ); +} diff --git a/apps/web/lib/components/kanban-card.tsx b/apps/web/lib/components/kanban-card.tsx index c9a8fc9f5..f97d6cc83 100644 --- a/apps/web/lib/components/kanban-card.tsx +++ b/apps/web/lib/components/kanban-card.tsx @@ -8,7 +8,7 @@ import { pad } from '@app/helpers'; import { TaskStatus } from '@app/constants'; import { TaskIssueStatus } from 'lib/features'; import Link from 'next/link'; -import ImageOverlapper, { IImageOverlapper } from './image-overlapper'; +import ImageComponent, { ImageOverlapperProps } from './image-overlapper'; function getStyle(provided: DraggableProvided, style: any) { if (!style) { @@ -73,7 +73,6 @@ function TagList({ tags }: { tags: Tag[] }) { ); } - function Priority({ level }: { level: number }) { const numberArray = Array.from({ length: level }, (_, index) => index + 1); @@ -98,14 +97,14 @@ export default function Item(props: any) { const { hours, minutes, seconds } = useTimerView(); - const taskAssignee: IImageOverlapper[] = []; + const taskAssignee: ImageOverlapperProps[] = []; - item.members.map((member: any)=> { + item.members.map((member: any) => { taskAssignee.push({ id: member.user.id, url: member.user.imageUrl, alt: member.user.firstName - }) + }); }); // const handleTime = () => { @@ -130,7 +129,7 @@ export default function Item(props: any) { {...provided.draggableProps} {...provided.dragHandleProps} style={getStyle(provided, style)} - className="flex flex-col rounded-2xl bg-white dark:bg-dark--theme-light p-4 relative" + className="flex flex-col my-2.5 rounded-2xl bg-white dark:bg-dark--theme-light p-4 relative" data-is-dragging={isDragging} data-testid={item.id} data-index={index} @@ -152,7 +151,10 @@ export default function Item(props: any) { /> #{item.number} - + {item.title} @@ -180,8 +182,7 @@ export default function Item(props: any) {

)} - - +
{item.hasComment && (
diff --git a/apps/web/lib/features/team-members-kanban-view.tsx b/apps/web/lib/features/team-members-kanban-view.tsx index 2d08ffdb9..52c8c829f 100644 --- a/apps/web/lib/features/team-members-kanban-view.tsx +++ b/apps/web/lib/features/team-members-kanban-view.tsx @@ -16,31 +16,21 @@ import { export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) => { const { + data: items, columns: kanbanColumns, updateKanbanBoard, updateTaskStatus, isColumnCollapse, - reorderStatus + reorderStatus, + addNewTask } = useKanban(); - - const [items, setItems] = useState(kanbanBoardTasks); - const [columns, setColumn] = useState(Object.keys(kanbanBoardTasks)); - const reorderTask = (list: ITeamTask[], startIndex: number, endIndex: number) => { const tasks = Array.from(list); const [removedTask] = tasks.splice(startIndex, 1); tasks.splice(endIndex, 0, removedTask); return tasks; }; - - const reorderColumn = (list: IKanban, startIndex: number, endIndex: number) => { - const columns = Object.keys(list); - const [removedColumn] = columns.splice(startIndex, 1); - columns.splice(endIndex, 0, removedColumn); - return columns; - }; - const reorderKanbanTasks = ({ kanbanTasks, source, @@ -102,9 +92,17 @@ export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) return selectState[0].color; }; + const reorderColumn = (column: any[], sourceIndex: number, destinationIndex: number) => { + const result = Array.from(column); + const [removed] = result.splice(sourceIndex, 1); + result.splice(destinationIndex, 0, removed); + + return result; + }; + /** - * This function handles all drag and drop logic - * on the kanban board. + * This function handles all drag & drop logic + * on the Kanban board. * @param result * @returns */ @@ -126,7 +124,7 @@ export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) ...items, [result.source.droppableId]: withItemRemoved }; - setItems(orderedItems); + updateKanbanBoard(orderedItems); return; } @@ -145,8 +143,7 @@ export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) } if (result.type === 'COLUMN') { - const reorderedItem = reorderColumn(items, source.index, destination.index); - + const reorderedItem = reorderColumn(columns, source.index, destination.index); //update column order in server side reorderedItem.map((item: string, index: number) => { return reorderStatus(item, index); @@ -163,7 +160,6 @@ export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) destination }); - setItems(data.kanbanBoard); updateKanbanBoard(() => data.kanbanBoard); }; @@ -179,7 +175,6 @@ export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) }, []); if (!enabled) return null; - return ( <> @@ -188,7 +183,7 @@ export const KanbanView = ({ kanbanBoardTasks }: { kanbanBoardTasks: IKanban }) {(provided: DroppableProvided, snapshot: DroppableStateSnapshot) => (
{ return ( -
- {isColumnCollapse(column) ? ( +
+ {isColumnCollapse(column) ? ( - ) : ( - <> - - - )} + ) : ( + <> + + + )}
); diff --git a/apps/web/lib/i18n/en.ts b/apps/web/lib/i18n/en.ts index 9add5ed10..a7b8ed578 100644 --- a/apps/web/lib/i18n/en.ts +++ b/apps/web/lib/i18n/en.ts @@ -120,7 +120,9 @@ export const en = { CONFIRM_ACCEPT_INVITATION: 'Are you sure you want to accept the invitation?', CONFIRM_REJECT_INVITATION: 'Are you sure you want to reject the invitation?' }, - + kanban: { + KANBAN_BOARD: 'Kanban Board' + }, profile: { BREADCRUMB: ['Member Tasks'] }, diff --git a/apps/web/messages/ar.json b/apps/web/messages/ar.json index 73adf78a1..9f1a622de 100644 --- a/apps/web/messages/ar.json +++ b/apps/web/messages/ar.json @@ -6,7 +6,8 @@ "REJECT": "رفض", "REJECTED": "مرفوض", "VERIFY": "تحقق", - + "TOMORROW" : "غدا", + "YESTERDAY" : "أمس", "INVITE": "دعوة", "INVITED": "مدعو", "EXPIRE": "انتهاء الصلاحية", @@ -191,7 +192,9 @@ "CONFIRM_ACCEPT_INVITATION": "هل أنت متأكد من رغبتك في قبول الدعوة؟", "CONFIRM_REJECT_INVITATION": "هل أنت متأكد من رغبتك في رفض الدعوة؟" }, - + "kanban":{ + "KANBAN_BOARD":"لوحة كانبان" + }, "profile": { "BREADCRUMB": "[\"مهام العضو\"]" }, diff --git a/apps/web/messages/bg.json b/apps/web/messages/bg.json index 45f9162bb..58728c2af 100644 --- a/apps/web/messages/bg.json +++ b/apps/web/messages/bg.json @@ -4,6 +4,8 @@ "ACCEPT": "Приемам", "ACCEPTED": "Приет", "REJECT": "Отхвърлям", + "TOMORROW" : "Утре", + "YESTERDAY" : "Вчера", "REJECTED": "Отхвърлен", "VERIFY": "провери", "INVITE": "Покани", @@ -189,7 +191,9 @@ "CONFIRM_ACCEPT_INVITATION": "Сигурни ли сте, че искате да приемете поканата?", "CONFIRM_REJECT_INVITATION": "Сигурни ли сте, че искате да отхвърлите поканата?" }, - + "kanban":{ + "KANBAN_BOARD":"Канбан дъска" + }, "profile": { "BREADCRUMB": "[\"Задачи за член\"]" }, diff --git a/apps/web/messages/de.json b/apps/web/messages/de.json index 57ce15e08..ad091edca 100644 --- a/apps/web/messages/de.json +++ b/apps/web/messages/de.json @@ -4,6 +4,8 @@ "ACCEPT": "Akzeptieren", "ACCEPTED": "Akzeptiert", "REJECT": "Ablehnen", + "TOMORROW" : "Morgen", + "YESTERDAY" : "Gestern", "REJECTED": "Abgelehnt", "VERIFY": "Verifizieren", "INVITE": "Einladen", @@ -191,11 +193,14 @@ "CONFIRM_ACCEPT_INVITATION": "Möchten Sie die Einladung wirklich annehmen?", "CONFIRM_REJECT_INVITATION": "Möchten Sie die Einladung wirklich ablehnen?" }, - + "kanban":{ + "KANBAN_BOARD":"Kanban-Board" + }, "profile": { "BREADCRUMB": "[\"Aufgaben des Mitglieds\"]" }, + "taskDetails": { "BREADCRUMB": "[\"Aufgabendetails\"]", "DESCRIPTION": "Beschreibungen", diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 399ed42a2..5b4a794b7 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "TOMORROW": "Tomorrow", + "YESTERDAY": "Yesterday", "REJECTED": "Rejected", "VERIFY": "verify", "INVITE": "Invite", @@ -199,6 +201,9 @@ "profile": { "BREADCRUMB": "[\"Member Tasks\"]" }, + "kanban":{ + "KANBAN_BOARD":"Kanban Board" + }, "taskDetails": { "BREADCRUMB": "[\"Task Details\"]", diff --git a/apps/web/messages/es.json b/apps/web/messages/es.json index c5948e717..643405ac8 100644 --- a/apps/web/messages/es.json +++ b/apps/web/messages/es.json @@ -4,6 +4,8 @@ "ACCEPT": "Aceptar", "ACCEPTED": "Aceptado", "REJECT": "Rechazar", + "TOMORROW" : "Mañana", + "YESTERDAY" : "Ayer", "REJECTED": "Rechazado", "VERIFY": "verificar", "INVITE": "Invitar", @@ -187,6 +189,9 @@ "CONFIRM_ACCEPT_INVITATION": "¿Estás seguro de que deseas aceptar la invitación?", "CONFIRM_REJECT_INVITATION": "¿Estás seguro de que deseas rechazar la invitación?" }, + "kanban":{ + "KANBAN_BOARD":"tablero kanban" + }, "profile": { "BREADCRUMB": "[\"Tareas de miembro\"]" }, diff --git a/apps/web/messages/fr.json b/apps/web/messages/fr.json index 72e08f8e4..500c32fd6 100644 --- a/apps/web/messages/fr.json +++ b/apps/web/messages/fr.json @@ -4,6 +4,8 @@ "ACCEPT": "Accepter", "ACCEPTED": "Accepté", "REJECT": "Rejeter", + "TOMORROW" : "Demain", + "YESTERDAY" : "Hier", "REJECTED": "Rejeté", "VERIFY": "Vérifier", "INVITE": "Inviter", @@ -189,6 +191,9 @@ "CONFIRM_ACCEPT_INVITATION": "Êtes-vous sûr de vouloir accepter l'invitation ?", "CONFIRM_REJECT_INVITATION": "Êtes-vous sûr de vouloir refuser l'invitation ?" }, + "kanban":{ + "KANBAN_BOARD":"Tableau Kanban" + }, "profile": { "BREADCRUMB": "[\"Tâches du membre\"]" }, diff --git a/apps/web/messages/he.json b/apps/web/messages/he.json index 35497a8cf..d377fba80 100644 --- a/apps/web/messages/he.json +++ b/apps/web/messages/he.json @@ -4,6 +4,8 @@ "ACCEPT": "קבל", "ACCEPTED": "התקבל", "REJECT": "דחה", + "TOMORROW" : "מחר", + "YESTERDAY" : "אתמול", "REJECTED": "נדחה", "VERIFY": "אמת", "INVITE": "הזמן", @@ -191,7 +193,9 @@ "CONFIRM_ACCEPT_INVITATION": "האם אתה בטוח שברצונך לקבל את ההזמנה?", "CONFIRM_REJECT_INVITATION": "האם אתה בטוח שברצונך לדחות את ההזמנה?" }, - + "kanban":{ + "KANBAN_BOARD":"לוח Kanban" + }, "profile": { "BREADCRUMB": "[\"משימות חבר\"]" }, diff --git a/apps/web/messages/it.json b/apps/web/messages/it.json index e8c0a64cb..c8ab43cee 100644 --- a/apps/web/messages/it.json +++ b/apps/web/messages/it.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "TOMORROW" :"Domani", + "YESTERDAY" :"Ieri", "REJECTED": "Rejected", "VERIFY": "verify", "INVITE": "Invite", @@ -193,7 +195,9 @@ "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" }, - + "kanban":{ + "KANBAN_BOARD":"Tabellone Kanban" + }, "profile": { "BREADCRUMB": "[\"Member Tasks\"]" }, diff --git a/apps/web/messages/nl.json b/apps/web/messages/nl.json index 04684b954..dbf0c920b 100644 --- a/apps/web/messages/nl.json +++ b/apps/web/messages/nl.json @@ -4,6 +4,8 @@ "ACCEPT": "Accepteren", "ACCEPTED": "Geaccepteerd", "REJECT": "Afwijzen", + "TOMORROW" : "Morgen", + "YESTERDAY" : "Gisteren", "REJECTED": "Afgewezen", "VERIFY": "verifiëren", "INVITE": "Uitnodigen", @@ -191,7 +193,9 @@ "CONFIRM_ACCEPT_INVITATION": "Weet u zeker dat u de uitnodiging wilt accepteren?", "CONFIRM_REJECT_INVITATION": "Weet u zeker dat u de uitnodiging wilt afwijzen?" }, - + "kanban":{ + "KANBAN_BOARD":"Kanban-bord" + }, "profile": { "BREADCRUMB": "[\"Taken teamlid\"]" }, diff --git a/apps/web/messages/pl.json b/apps/web/messages/pl.json index 30d961ea4..212d104d7 100644 --- a/apps/web/messages/pl.json +++ b/apps/web/messages/pl.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "TOMORROW": "Jutro", + "YESTERDAY": "Wczoraj", "REJECTED": "Rejected", "VERIFY": "verify", "INVITE": "Invite", @@ -193,7 +195,9 @@ "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" }, - + "kanban":{ + "KANBAN_BOARD":"Tablica Kanbana" + }, "profile": { "BREADCRUMB": "[\"Member Tasks\"]" }, diff --git a/apps/web/messages/pt.json b/apps/web/messages/pt.json index 5e2a5ddd8..893f14a54 100644 --- a/apps/web/messages/pt.json +++ b/apps/web/messages/pt.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "YESTERDAY": "Ontem", + "TOMORROW": "Amanhã", "REJECTED": "Rejected", "VERIFY": "verify", "INVITE": "Invite", @@ -193,7 +195,9 @@ "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" }, - + "kanban":{ + "KANBAN_BOARD":"Quadro Kanban" + }, "profile": { "BREADCRUMB": "[\"Member Tasks\"]" }, diff --git a/apps/web/messages/ru.json b/apps/web/messages/ru.json index ea18ec5d1..0f987f70b 100644 --- a/apps/web/messages/ru.json +++ b/apps/web/messages/ru.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "TOMORROW": "Завтра", + "YESTERDAY": "Вчера", "REJECTED": "Rejected", "VERIFY": "verify", "INVITE": "Invite", @@ -193,7 +195,9 @@ "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" }, - + "kanban":{ + "KANBAN_BOARD":"Канбан-доска" + }, "profile": { "BREADCRUMB": "[\"Member Tasks\"]" }, diff --git a/apps/web/messages/zh.json b/apps/web/messages/zh.json index e123c980d..3b5ef2542 100644 --- a/apps/web/messages/zh.json +++ b/apps/web/messages/zh.json @@ -4,6 +4,8 @@ "ACCEPT": "接受", "ACCEPTED": "已接受", "REJECT": "拒绝", + "TOMORROW": "明天", + "YESTERDAY": "昨天", "REJECTED": "已拒绝", "VERIFY": "验证", "INVITE": "邀请", @@ -191,7 +193,9 @@ "CONFIRM_ACCEPT_INVITATION": "您确定要接受邀请吗?", "CONFIRM_REJECT_INVITATION": "您确定要拒绝邀请吗?" }, - + "kanban":{ + "KANBAN_BOARD":"看板" + }, "profile": { "BREADCRUMB": "[\"成员任务\"]" }, diff --git a/apps/web/public/locales/en/common.json b/apps/web/public/locales/en/common.json index 7ae8476eb..08d88365f 100644 --- a/apps/web/public/locales/en/common.json +++ b/apps/web/public/locales/en/common.json @@ -195,7 +195,9 @@ "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" }, - + "kanban": { + "KANBAN_BOARD": ["Kanban Board"] + }, "profile": { "BREADCRUMB": ["Member Tasks"] },