diff --git a/.cspell.json b/.cspell.json index 48b44a18c..3377a8504 100644 --- a/.cspell.json +++ b/.cspell.json @@ -143,6 +143,7 @@ "apistage", "flaticon", "VERSONS", + "vertificalline", "Tongatapu", "Moresby", "Pago", @@ -300,19 +301,24 @@ "Chami", "Mazen", "Heinze", + "Kanbanboard", + "Kolkata", "Holmgren", "Jamon", "Rickert", "Metral", "subsquently", "Syle", + "teamtask", "imagebutton", "hwba", "plasmohq", "Proguard", "horcrux", "dimesions", - "Ordereds" + "Ordereds", + "uidotdev", + "usehooks" ], "useGitignore": true, "ignorePaths": [ diff --git a/apps/web/app/[locale]/kanban/page.tsx b/apps/web/app/[locale]/kanban/page.tsx index 0618a0f33..7d42474fb 100644 --- a/apps/web/app/[locale]/kanban/page.tsx +++ b/apps/web/app/[locale]/kanban/page.tsx @@ -15,6 +15,7 @@ import Image from 'next/image'; import { useState } from 'react'; import { useTranslations } from 'next-intl'; import { useParams } from 'next/navigation'; +import { OT_Member } from '@app/interfaces'; const Kanban = () => { const { data } = useKanban(); @@ -33,7 +34,8 @@ const Kanban = () => { ]; const imageRadius = 20; - const numberOfImagesDisplayed = 4; + const numberOfImagesDisplayed = 3; + const activeTeamMembers = activeTeam?.members ? activeTeam.members : []; const totalLength = (activeTeamMembers.length + 1) * imageRadius; @@ -47,32 +49,37 @@ const Kanban = () => {

08:00 ( UTC +04:30 )

-
+
- {activeTeamMembers.map((image: any, index: number) => { - if (index < numberOfImagesDisplayed) { + {activeTeamMembers.filter((_:any, index: number) => { + return index < numberOfImagesDisplayed + }).map((image: OT_Member, index: number) => { return ( -
- {image.title} +
+
+ {""} +
); - } })} - {activeTeamMembers.length > 4 && ( + {activeTeamMembers.length > numberOfImagesDisplayed && (
{activeTeamMembers.length - numberOfImagesDisplayed}+
diff --git a/apps/web/app/[locale]/page.tsx b/apps/web/app/[locale]/page.tsx index fa8e42978..ef6a39b83 100644 --- a/apps/web/app/[locale]/page.tsx +++ b/apps/web/app/[locale]/page.tsx @@ -23,7 +23,7 @@ import { useState } from 'react'; import { IssuesView } from '@app/constants'; import { TableCellsIcon, QueueListIcon, Squares2X2Icon } from '@heroicons/react/24/solid'; import { useNetworkState } from '@uidotdev/usehooks'; -import KanbanIcon from '@components/ui/svgs/kanaban'; +import KanbanIcon from '@components/ui/svgs/kanban'; import Offline from '@components/pages/offline'; import UserTeamTableHeader from 'lib/features/team/user-team-table/user-team-table-header'; import { useTranslations } from 'next-intl'; @@ -51,7 +51,10 @@ function MainPage({ pageProps }: AppProps) { const { isTeamMember, isTrackingEnabled, activeTeam } = useOrganizationTeams(); - const breadcrumb = [{title: JSON.parse(t('pages.home.BREADCRUMB')), href: '/'}, { title: activeTeam?.name || '', href:'/'}]; + const breadcrumb = [ + { title: JSON.parse(t('pages.home.BREADCRUMB')), href: '/' }, + { title: activeTeam?.name || '', href: '/' } + ]; const [view, setView] = useState(IssuesView.CARDS); const { online } = useNetworkState(); @@ -137,7 +140,7 @@ function MainPage({ pageProps }: AppProps) { { setActiveLanguageId(getActiveLanguageIdCookie()); if (user) { - return queryCall(user.role.isSystem).then((res) => { + return queryCall(user.role.isSystem).then((res) => { setLanguages( - res?.data?.data?.items.filter((item: any) => APPLICATION_LANGUAGES_CODE.includes(item.code)) || [] + res?.data?.items.filter((item: any) => APPLICATION_LANGUAGES_CODE.includes(item.code)) || [] ); return res; }); diff --git a/apps/web/app/hooks/useLanguage.ts b/apps/web/app/hooks/useLanguage.ts index ebbd89d44..78277befd 100644 --- a/apps/web/app/hooks/useLanguage.ts +++ b/apps/web/app/hooks/useLanguage.ts @@ -28,6 +28,7 @@ export function useLanguage() { // Navigation to force rerender // router.push({ pathname: router.pathname, query: router.query }, undefined, { locale: newLanguage }); } + // router.refresh(); }, [router, i18n] ); diff --git a/apps/web/components/ui/svgs/kanaban.tsx b/apps/web/components/ui/svgs/kanban.tsx similarity index 100% rename from apps/web/components/ui/svgs/kanaban.tsx rename to apps/web/components/ui/svgs/kanban.tsx diff --git a/apps/web/lib/settings/personal-setting-form.tsx b/apps/web/lib/settings/personal-setting-form.tsx index b3f236da3..5c9deb968 100644 --- a/apps/web/lib/settings/personal-setting-form.tsx +++ b/apps/web/lib/settings/personal-setting-form.tsx @@ -19,6 +19,7 @@ import validator from 'validator'; import { EmailResetModal } from './email-reset-modal'; import { LanguageDropDown } from './language-dropdown'; import { TimezoneDropDown } from './timezone-dropdown'; +import { useRouter } from 'next/navigation'; interface IValidation { email: boolean; @@ -41,6 +42,7 @@ export const PersonalSettingForm = () => { phone: true }); const t = useTranslations(); + const router = useRouter(); const handleFullnameChange = useCallback(() => { const values = getValues(); @@ -137,8 +139,10 @@ export const PersonalSettingForm = () => { id: user.id }); } + + router.replace(`/${newLanguage}/settings/personal`); }, - [user, setValue, updateAvatar, changeLanguage] + [user, setValue, updateAvatar, changeLanguage, router] ); return ( diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index adc4b8899..0e876aa0a 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -16,13 +16,14 @@ export const config = { matcher: [ '/', '/(en|de|ar|bg|zh|nl|de|he|it|pl|pt|ru|es|fr)/:path*', - // '/((?!_next|_vercel|.*\\..*).*)', + '/((?!api|_next|_vercel|.*\\..*).*)', '/auth/(.*)', '/profile/:path*', '/settings/(.*)', '/task(.*)', '/meet(.*)', - '/board(.*)' + '/board(.*)', + '/kanban(.*)' ] }; @@ -31,7 +32,7 @@ export async function middleware(request: NextRequest) { defaultLocale: 'en', locales: ['en', 'de', 'ar', 'bg', 'zh', 'nl', 'de', 'he', 'it', 'pl', 'pt', 'ru', 'es', 'fr'], // pathnames, - localePrefix: 'never' + localePrefix: 'as-needed' }); // Setting cookies on the response