From 3212b52b020b28cb6849c55905248dac02e9e194 Mon Sep 17 00:00:00 2001 From: Karli Date: Tue, 23 Sep 2025 19:22:40 +0300 Subject: [PATCH 1/6] feat(MED-97): fix /home/[account] and /admin* routes layout consistencies --- .../_components/admin-menu-navigation.tsx | 27 ++++++++ app/admin/_components/admin-sidebar.tsx | 69 +++---------------- app/admin/layout.tsx | 28 +++++--- app/admin/page.tsx | 2 +- ...team-account-layout-sidebar-navigation.tsx | 12 ---- .../team-account-layout-sidebar.tsx | 48 +++---------- app/home/[account]/layout.tsx | 19 +---- .../src/config/admin-navigation.config.tsx | 33 +++++++++ packages/shared/src/config/index.ts | 2 + .../config/team-account-navigation.config.tsx | 7 -- public/locales/en/common.json | 1 - public/locales/et/common.json | 1 - public/locales/ru/common.json | 1 - 13 files changed, 102 insertions(+), 148 deletions(-) create mode 100644 app/admin/_components/admin-menu-navigation.tsx delete mode 100644 app/home/[account]/_components/team-account-layout-sidebar-navigation.tsx create mode 100644 packages/shared/src/config/admin-navigation.config.tsx diff --git a/app/admin/_components/admin-menu-navigation.tsx b/app/admin/_components/admin-menu-navigation.tsx new file mode 100644 index 0000000..7a6185d --- /dev/null +++ b/app/admin/_components/admin-menu-navigation.tsx @@ -0,0 +1,27 @@ +import { AppLogo } from '@kit/shared/components/app-logo'; +import { ProfileAccountDropdownContainer } from '@kit/shared/components/personal-account-dropdown-container'; +import { SIDEBAR_WIDTH_PROPERTY } from '@/packages/ui/src/shadcn/constants'; + +import type { UserWorkspace } from '../../home/(user)/_lib/server/load-user-workspace'; + +export function AdminMenuNavigation(props: { + workspace: UserWorkspace; +}) { + const { accounts } = props.workspace; + + return ( +
+
+ +
+ +
+
+ +
+
+
+ ); +} diff --git a/app/admin/_components/admin-sidebar.tsx b/app/admin/_components/admin-sidebar.tsx index 2e777e7..20e6082 100644 --- a/app/admin/_components/admin-sidebar.tsx +++ b/app/admin/_components/admin-sidebar.tsx @@ -1,72 +1,25 @@ -'use client'; - -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; - -import { UserWorkspace } from '@/app/home/(user)/_lib/server/load-user-workspace'; -import { LayoutDashboard, Users } from 'lucide-react'; - -import { AppLogo } from '@kit/shared/components/app-logo'; -import { ProfileAccountDropdownContainer } from '@kit/shared/components/personal-account-dropdown-container'; +import { adminNavigationConfig } from '@kit/shared/config'; import { Sidebar, SidebarContent, - SidebarFooter, - SidebarGroup, - SidebarGroupContent, - SidebarGroupLabel, SidebarHeader, - SidebarMenu, - SidebarMenuButton, - useSidebar, + SidebarNavigation, } from '@kit/ui/shadcn-sidebar'; -export function AdminSidebar({ - accounts, -}: { - accounts: UserWorkspace['accounts']; -}) { - const path = usePathname(); - const { open } = useSidebar(); +export function AdminSidebar() { + const collapsible = adminNavigationConfig.sidebarCollapsedStyle; + return ( - - - + + +
+
Superadmin
+
- - Super Admin - - - - - - - Dashboard - - - - - - - Accounts - - - - - + - - - -
); } diff --git a/app/admin/layout.tsx b/app/admin/layout.tsx index 8317da4..43bd5e1 100644 --- a/app/admin/layout.tsx +++ b/app/admin/layout.tsx @@ -6,6 +6,7 @@ import { Page, PageMobileNavigation, PageNavigation } from '@kit/ui/page'; import { SidebarProvider } from '@kit/ui/shadcn-sidebar'; import { AdminSidebar } from '~/admin/_components/admin-sidebar'; +import { AdminMenuNavigation } from '~/admin/_components/admin-menu-navigation'; import { AdminMobileNavigation } from '~/admin/_components/mobile-navigation'; import { loadUserWorkspace } from '../home/(user)/_lib/server/load-user-workspace'; @@ -21,19 +22,24 @@ export default function AdminLayout(props: React.PropsWithChildren) { const workspace = use(loadUserWorkspace()); return ( - - - - - + + + + - - - + + + - {props.children} - - + + + + + + {props.children} + + + ); } diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 8be8bd8..60e8862 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -5,7 +5,7 @@ import { PageBody, PageHeader } from '@kit/ui/page'; function AdminPage() { return ( <> - + diff --git a/app/home/[account]/_components/team-account-layout-sidebar-navigation.tsx b/app/home/[account]/_components/team-account-layout-sidebar-navigation.tsx deleted file mode 100644 index 9e1eeb4..0000000 --- a/app/home/[account]/_components/team-account-layout-sidebar-navigation.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from 'zod'; - -import { NavigationConfigSchema } from '@kit/ui/navigation-schema'; -import { SidebarNavigation } from '@kit/ui/shadcn-sidebar'; - -export function TeamAccountLayoutSidebarNavigation({ - config, -}: React.PropsWithChildren<{ - config: z.infer; -}>) { - return ; -} diff --git a/app/home/[account]/_components/team-account-layout-sidebar.tsx b/app/home/[account]/_components/team-account-layout-sidebar.tsx index 76dd94f..f2c9626 100644 --- a/app/home/[account]/_components/team-account-layout-sidebar.tsx +++ b/app/home/[account]/_components/team-account-layout-sidebar.tsx @@ -1,20 +1,12 @@ -import type { User } from '@supabase/supabase-js'; - import { ApplicationRole } from '@kit/accounts/types/accounts'; -import { ProfileAccountDropdownContainer } from '@kit/shared/components/personal-account-dropdown-container'; import { getTeamAccountSidebarConfig } from '@kit/shared/config'; import { Sidebar, SidebarContent, - SidebarFooter, SidebarHeader, + SidebarNavigation, } from '@kit/ui/shadcn-sidebar'; -import { TeamAccountNotifications } from '~/home/[account]/_components/team-account-notifications'; - -import { TeamAccountAccountsSelector } from '../_components/team-account-accounts-selector'; -import { TeamAccountLayoutSidebarNavigation } from './team-account-layout-sidebar-navigation'; - type AccountModel = { label: string | null; value: string | null; @@ -26,14 +18,12 @@ export function TeamAccountLayoutSidebar(props: { account: string; accountId: string; accounts: AccountModel[]; - user: User; }) { return ( ); } @@ -42,45 +32,27 @@ function SidebarContainer(props: { account: string; accountId: string; accounts: AccountModel[]; - user: User; }) { - const { account, accounts, user } = props; - const userId = user.id; + const { account, accounts } = props; const config = getTeamAccountSidebarConfig(account); const collapsible = config.sidebarCollapsedStyle; + const selectedAccount = accounts.find(({ value }) => value === account); + const accountName = selectedAccount?.label || account; + return ( - -
- - -
- -
+ +
+
{accountName}
- - + + - - - - - ); } diff --git a/app/home/[account]/layout.tsx b/app/home/[account]/layout.tsx index 104eb72..a98a8b7 100644 --- a/app/home/[account]/layout.tsx +++ b/app/home/[account]/layout.tsx @@ -15,7 +15,6 @@ import { SidebarProvider } from '@kit/ui/shadcn-sidebar'; import { withI18n } from '~/lib/i18n/with-i18n'; -// local imports import { TeamAccountLayoutMobileNavigation } from './_components/team-account-layout-mobile-navigation'; import { TeamAccountLayoutSidebar } from './_components/team-account-layout-sidebar'; import { TeamAccountNavigationMenu } from './_components/team-account-navigation-menu'; @@ -57,13 +56,12 @@ function SidebarLayout({ return ( - + @@ -129,23 +127,8 @@ function HeaderLayout({ account={account} accountId={data.account.id} accounts={accounts} - user={data.user} /> - - - -
- -
-
- {children}
diff --git a/packages/shared/src/config/admin-navigation.config.tsx b/packages/shared/src/config/admin-navigation.config.tsx new file mode 100644 index 0000000..405fe91 --- /dev/null +++ b/packages/shared/src/config/admin-navigation.config.tsx @@ -0,0 +1,33 @@ +import { LayoutDashboard, Users } from 'lucide-react'; +import { z } from 'zod'; + +import { pathsConfig } from '@kit/shared/config'; +import { NavigationConfigSchema } from '@kit/ui/navigation-schema'; + +const iconClasses = 'w-4 stroke-[1.5px]'; + +const routes = [ + { + children: [ + { + label: 'Dashboard', + path: pathsConfig.app.admin, + Icon: , + end: true, + }, + { + label: 'Accounts', + path: `${pathsConfig.app.admin}/accounts`, + Icon: , + end: true, + }, + ], + }, +] satisfies z.infer['routes']; + +export const adminNavigationConfig = NavigationConfigSchema.parse({ + routes, + style: 'custom', + sidebarCollapsed: false, + sidebarCollapsedStyle: 'icon', +}); diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 84be8c1..224b890 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -1,6 +1,7 @@ import appConfig from './app.config'; import authConfig from './auth.config'; import billingConfig from './billing.config'; +import { adminNavigationConfig } from './admin-navigation.config'; import { DynamicAuthConfig, getCachedAuthConfig, @@ -15,6 +16,7 @@ import { } from './team-account-navigation.config'; export { + adminNavigationConfig, appConfig, authConfig, billingConfig, diff --git a/packages/shared/src/config/team-account-navigation.config.tsx b/packages/shared/src/config/team-account-navigation.config.tsx index b6f5e89..6f2c924 100644 --- a/packages/shared/src/config/team-account-navigation.config.tsx +++ b/packages/shared/src/config/team-account-navigation.config.tsx @@ -7,7 +7,6 @@ const iconClasses = 'w-4'; const getRoutes = (account: string) => [ { - label: 'common:routes.application', children: [ { label: 'common:routes.dashboard', @@ -15,12 +14,6 @@ const getRoutes = (account: string) => [ Icon: , end: true, }, - ], - }, - { - label: 'common:routes.settings', - collapsible: false, - children: [ { label: 'common:routes.settings', path: createPath(pathsConfig.app.accountSettings, account), diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 155d52b..5275611 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -80,7 +80,6 @@ "dashboard": "Dashboard", "settings": "Settings", "profile": "Profile", - "application": "Application", "pickTime": "Pick time", "preferences": "Preferences", "security": "Security" diff --git a/public/locales/et/common.json b/public/locales/et/common.json index 5da5993..32a8e6d 100644 --- a/public/locales/et/common.json +++ b/public/locales/et/common.json @@ -80,7 +80,6 @@ "dashboard": "Ülevaade", "settings": "Seaded", "profile": "Profiil", - "application": "Rakendus", "pickTime": "Vali aeg", "preferences": "Eelistused", "security": "Turvalisus" diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index a23f8a5..f6ccf65 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -80,7 +80,6 @@ "dashboard": "Обзор", "settings": "Настройки", "profile": "Профиль", - "application": "Приложение", "pickTime": "Выбрать время", "preferences": "Предпочтения", "security": "Безопасность" From 8af2c8710fc9985cb368f6c0ffa6bc2241c72b7d Mon Sep 17 00:00:00 2001 From: Karli Date: Tue, 23 Sep 2025 19:52:49 +0300 Subject: [PATCH 2/6] feat(MED-97): fix display account name instead of slug --- .../[account]/billing/_components/health-benefit-form.tsx | 2 +- app/home/[account]/members/page.tsx | 4 +--- app/home/[account]/settings/page.tsx | 4 +--- public/locales/en/teams.json | 8 ++++---- public/locales/et/teams.json | 8 ++++---- public/locales/ru/teams.json | 8 ++++---- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/app/home/[account]/billing/_components/health-benefit-form.tsx b/app/home/[account]/billing/_components/health-benefit-form.tsx index ba654ea..4e9dcda 100644 --- a/app/home/[account]/billing/_components/health-benefit-form.tsx +++ b/app/home/[account]/billing/_components/health-benefit-form.tsx @@ -78,7 +78,7 @@ const HealthBenefitForm = ({

diff --git a/app/home/[account]/members/page.tsx b/app/home/[account]/members/page.tsx index bb471bf..324e6b0 100644 --- a/app/home/[account]/members/page.tsx +++ b/app/home/[account]/members/page.tsx @@ -22,7 +22,6 @@ import { Trans } from '@kit/ui/trans'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; import { withI18n } from '~/lib/i18n/with-i18n'; -// local imports import { TeamAccountLayoutPageHeader } from '../_components/team-account-layout-page-header'; import { loadMembersPageData } from './_lib/server/members-page.loader'; @@ -56,8 +55,7 @@ async function TeamAccountMembersPage({ params }: TeamAccountMembersPageProps) { <> } - description={} - account={account.slug} + description={} /> diff --git a/app/home/[account]/settings/page.tsx b/app/home/[account]/settings/page.tsx index 3d0e9a6..d152b85 100644 --- a/app/home/[account]/settings/page.tsx +++ b/app/home/[account]/settings/page.tsx @@ -8,7 +8,6 @@ import { Trans } from '@kit/ui/trans'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; -// local imports import { TeamAccountLayoutPageHeader } from '../_components/team-account-layout-page-header'; export const generateMetadata = async () => { @@ -48,9 +47,8 @@ async function TeamAccountSettingsPage(props: TeamAccountSettingsPageProps) { return ( <> } - description={} + description={} /> diff --git a/public/locales/en/teams.json b/public/locales/en/teams.json index 2c26931..b015945 100644 --- a/public/locales/en/teams.json +++ b/public/locales/en/teams.json @@ -1,9 +1,9 @@ { "home": { - "pageTitle": "Dashboard" + "pageTitle": "Company Dashboard" }, "settings": { - "pageTitle": "Settings", + "pageTitle": "Company Settings", "pageDescription": "Manage your Company details", "teamLogo": "Company Logo", "teamLogoDescription": "Update your company's logo to make it easier to identify", @@ -13,10 +13,10 @@ "dangerZoneDescription": "This section contains actions that are irreversible" }, "members": { - "pageTitle": "Members" + "pageTitle": "Company Members" }, "billing": { - "pageTitle": "Billing" + "pageTitle": "Company Billing" }, "yourTeams": "Your Companies ({{teamsCount}})", "createTeam": "Create a Company", diff --git a/public/locales/et/teams.json b/public/locales/et/teams.json index ff2b370..6b85800 100644 --- a/public/locales/et/teams.json +++ b/public/locales/et/teams.json @@ -1,6 +1,6 @@ { "home": { - "pageTitle": "Ülevaade", + "pageTitle": "Ettevõtte ülevaade", "headerTitle": "{{companyName}} Tervisekassa kokkuvõte", "healthDetails": "Ettevõtte terviseandmed", "membersSettingsButtonTitle": "Halda töötajaid", @@ -9,7 +9,7 @@ "membersBillingButtonDescription": "Vali kuidas soovid eelarvet töötajate vahel jagada." }, "settings": { - "pageTitle": "Seaded", + "pageTitle": "Ettevõtte seaded", "pageDescription": "Halda oma ettevõtte andmeid", "teamLogo": "Ettevõtte logo", "teamLogoDescription": "Uuenda oma ettevõtte logo, et seda oleks lihtsam tuvastada", @@ -19,10 +19,10 @@ "dangerZoneDescription": "See osa sisaldab pöördumatuid toiminguid" }, "members": { - "pageTitle": "Töötajad" + "pageTitle": "Ettevõtte töötajad" }, "billing": { - "pageTitle": "Arveldamine" + "pageTitle": "Ettevõtte arveldamine" }, "benefitStatistics": { "budget": { diff --git a/public/locales/ru/teams.json b/public/locales/ru/teams.json index 5b32b3a..9eaa712 100644 --- a/public/locales/ru/teams.json +++ b/public/locales/ru/teams.json @@ -1,6 +1,6 @@ { "home": { - "pageTitle": "Обзор", + "pageTitle": "Обзор компании", "headerTitle": "Обзор Tervisekassa {{companyName}}", "healthDetails": "Данные о здоровье компании", "membersSettingsButtonTitle": "Управление сотрудниками", @@ -9,7 +9,7 @@ "membersBillingButtonDescription": "Выберите, как распределять бюджет между сотрудниками." }, "settings": { - "pageTitle": "Настройки", + "pageTitle": "Настройки компании", "pageDescription": "Управление данными вашей компании", "teamLogo": "Логотип компании", "teamLogoDescription": "Обновите логотип вашей компании для упрощения идентификации", @@ -19,10 +19,10 @@ "dangerZoneDescription": "Этот раздел содержит действия, которые невозможно отменить" }, "members": { - "pageTitle": "Сотрудники" + "pageTitle": "Сотрудники компании" }, "billing": { - "pageTitle": "Биллинг" + "pageTitle": "Биллинг компании" }, "benefitStatistics": { "budget": { From fb03d548affbe931541a17aaf5c84ba05b72fa41 Mon Sep 17 00:00:00 2001 From: Karli Date: Tue, 23 Sep 2025 19:59:51 +0300 Subject: [PATCH 3/6] feat(MED-97): fix occurance->occurrence in components, add missing translations --- .../_components/health-benefit-fields.tsx | 10 +++++----- .../_components/health-benefit-form.tsx | 6 +++--- .../schema/update-health-benefit.schema.ts | 4 ++-- .../features/team-accounts/src/server/api.ts | 2 +- .../team-accounts/src/server/types.ts | 2 +- public/locales/en/billing.json | 20 +++++++++++++++++++ public/locales/en/common.json | 2 +- public/locales/et/billing.json | 6 +++--- public/locales/et/common.json | 2 +- public/locales/ru/billing.json | 4 ++-- public/locales/ru/common.json | 2 +- 11 files changed, 40 insertions(+), 20 deletions(-) diff --git a/app/home/[account]/billing/_components/health-benefit-fields.tsx b/app/home/[account]/billing/_components/health-benefit-fields.tsx index 7428f82..55c533c 100644 --- a/app/home/[account]/billing/_components/health-benefit-fields.tsx +++ b/app/home/[account]/billing/_components/health-benefit-fields.tsx @@ -20,7 +20,7 @@ const HealthBenefitFields = () => { return (

( @@ -30,20 +30,20 @@ const HealthBenefitFields = () => {