@carlonicora/nextjs-jsonapi 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +675 -0
- package/dist/{AbstractService-BKlpJA61.d.mts → AbstractService-B2n_JdiC.d.mts} +1 -1
- package/dist/{AbstractService-D9eSVKNa.d.ts → AbstractService-DtQTYovo.d.ts} +1 -1
- package/dist/{content.interface-Dg2lt_An.d.mts → AuthComponent-CPLvEerw.d.mts} +11 -15
- package/dist/{content.interface-BhyAiOFq.d.ts → AuthComponent-m6Qp4Hz6.d.ts} +11 -15
- package/dist/{BlockNoteEditor-UVO3VZZE.mjs → BlockNoteEditor-BLVXQPXV.mjs} +14 -18
- package/dist/{BlockNoteEditor-UVO3VZZE.mjs.map → BlockNoteEditor-BLVXQPXV.mjs.map} +1 -1
- package/dist/{BlockNoteEditor-VFWG6LXI.js → BlockNoteEditor-ZTDHULFT.js} +15 -19
- package/dist/BlockNoteEditor-ZTDHULFT.js.map +1 -0
- package/dist/JsonApiRequest-O7BGUMFO.mjs +23 -0
- package/dist/JsonApiRequest-VARLNKAF.js +23 -0
- package/dist/JsonApiRequest-VARLNKAF.js.map +1 -0
- package/dist/chunk-2LM6LCJW.mjs +1 -0
- package/dist/chunk-3APORDYP.mjs +7783 -0
- package/dist/chunk-3APORDYP.mjs.map +1 -0
- package/dist/{chunk-TMVHSY3Y.js → chunk-5ZEADNNP.js} +36 -17
- package/dist/chunk-5ZEADNNP.js.map +1 -0
- package/dist/{chunk-ECDTZBYO.mjs → chunk-74F6BBHH.mjs} +21 -2
- package/dist/chunk-74F6BBHH.mjs.map +1 -0
- package/dist/{chunk-GYWPEPOH.mjs → chunk-7C5RAEBO.mjs} +72 -68
- package/dist/chunk-7C5RAEBO.mjs.map +1 -0
- package/dist/chunk-A5DDIABK.js +1 -0
- package/dist/{chunk-TEGF6ZWG.js → chunk-AGAJMJ4T.js} +47 -9
- package/dist/chunk-AGAJMJ4T.js.map +1 -0
- package/dist/{chunk-CXQOWQSY.js → chunk-AYHKQWHH.js} +15 -2
- package/dist/chunk-AYHKQWHH.js.map +1 -0
- package/dist/{chunk-I2REI7OA.js → chunk-HMHGLXWC.js} +33 -15
- package/dist/chunk-HMHGLXWC.js.map +1 -0
- package/dist/chunk-IWFGEPAA.mjs +1 -0
- package/dist/chunk-JC3WJK65.js +1 -0
- package/dist/{chunk-L6EQEAXU.mjs → chunk-PYF2U6WG.mjs} +25 -7
- package/dist/chunk-PYF2U6WG.mjs.map +1 -0
- package/dist/{chunk-YDVTFM7X.mjs → chunk-RBIVEH2K.mjs} +42 -4
- package/dist/chunk-RBIVEH2K.mjs.map +1 -0
- package/dist/{chunk-V2JJPI7N.js → chunk-RZO2LOW4.js} +237 -233
- package/dist/chunk-RZO2LOW4.js.map +1 -0
- package/dist/{chunk-X4BIHJ2B.mjs → chunk-SM63SZCP.mjs} +15 -2
- package/dist/chunk-SM63SZCP.mjs.map +1 -0
- package/dist/chunk-WEC4YMOS.js +7783 -0
- package/dist/chunk-WEC4YMOS.js.map +1 -0
- package/dist/client/index.d.mts +21 -2
- package/dist/client/index.d.ts +21 -2
- package/dist/client/index.js +18 -245
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +28 -255
- package/dist/client/index.mjs.map +1 -1
- package/dist/components/index.d.mts +293 -8
- package/dist/components/index.d.ts +293 -8
- package/dist/components/index.js +78 -2323
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +172 -2417
- package/dist/components/index.mjs.map +1 -1
- package/dist/{config-hXufftVS.d.ts → config-BmnK65TD.d.mts} +1 -0
- package/dist/{config-hXufftVS.d.mts → config-BmnK65TD.d.ts} +1 -0
- package/dist/config-DQeAo9Kf.d.mts +49 -0
- package/dist/config-DQeAo9Kf.d.ts +49 -0
- package/dist/contexts/index.d.mts +109 -21
- package/dist/contexts/index.d.ts +109 -21
- package/dist/contexts/index.js +39 -7
- package/dist/contexts/index.js.map +1 -1
- package/dist/contexts/index.mjs +40 -8
- package/dist/core/index.d.mts +3 -4
- package/dist/core/index.d.ts +3 -4
- package/dist/core/index.js +3 -7
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +4 -8
- package/dist/{d3.link.interface-QMdB22bC.d.mts → d3.link.interface-ClC4Irqp.d.mts} +2 -1
- package/dist/{d3.link.interface-QMdB22bC.d.ts → d3.link.interface-ClC4Irqp.d.ts} +2 -1
- package/dist/features/index.d.mts +17 -86
- package/dist/features/index.d.ts +17 -86
- package/dist/features/index.js +7 -16
- package/dist/features/index.js.map +1 -1
- package/dist/features/index.mjs +10 -19
- package/dist/hooks/index.d.mts +18 -43
- package/dist/hooks/index.d.ts +18 -43
- package/dist/hooks/index.js +20 -7
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +19 -6
- package/dist/index.d.mts +10 -6
- package/dist/index.d.ts +10 -6
- package/dist/index.js +13 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -19
- package/dist/interfaces/index.d.mts +2 -1
- package/dist/interfaces/index.d.ts +2 -1
- package/dist/notification.interface-BBgMUdLR.d.mts +14 -0
- package/dist/notification.interface-gyvT-Z2F.d.ts +14 -0
- package/dist/permissions/index.d.mts +2 -3
- package/dist/permissions/index.d.ts +2 -3
- package/dist/server/index.d.mts +38 -18
- package/dist/server/index.d.ts +38 -18
- package/dist/server/index.js +70 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +68 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/types-BUAlgqqh.d.ts +39 -0
- package/dist/{types-DluCaP1I.d.ts → types-Bl61ob-7.d.mts} +19 -2
- package/dist/{types-lQVA8d_P.d.mts → types-Bl61ob-7.d.ts} +19 -2
- package/dist/types-iVdVY7ba.d.mts +39 -0
- package/dist/useSocket-Cn7fB_B1.d.mts +25 -0
- package/dist/useSocket-DzMKRKCA.d.ts +25 -0
- package/dist/user.fields-CbdObSmS.d.mts +18 -0
- package/dist/user.fields-CbdObSmS.d.ts +18 -0
- package/dist/utils/index.d.mts +1 -2
- package/dist/utils/index.d.ts +1 -2
- package/package.json +5 -3
- package/src/client/index.ts +13 -0
- package/src/components/forms/index.ts +1 -0
- package/src/components/index.ts +5 -0
- package/src/components/tables/ContentListTable.tsx +1 -0
- package/src/contexts/CommonContext.tsx +52 -0
- package/src/contexts/SharedContext.tsx +2 -0
- package/src/contexts/SocketContext.tsx +65 -0
- package/src/contexts/index.ts +6 -1
- package/src/features/auth/components/containers/AuthContainer.tsx +32 -0
- package/src/features/auth/components/containers/index.ts +1 -0
- package/src/features/auth/components/details/LandingComponent.tsx +39 -0
- package/src/features/auth/components/details/index.ts +1 -0
- package/src/features/auth/components/forms/AcceptInvitation.tsx +136 -0
- package/src/features/auth/components/forms/ActivateAccount.tsx +75 -0
- package/src/features/auth/components/forms/Cookies.tsx +32 -0
- package/src/features/auth/components/forms/ForgotPassword.tsx +108 -0
- package/src/features/auth/components/forms/Login.tsx +118 -0
- package/src/features/auth/components/forms/Logout.tsx +19 -0
- package/src/features/auth/components/forms/RefreshUser.tsx +39 -0
- package/src/features/auth/components/forms/Register.tsx +150 -0
- package/src/features/auth/components/forms/ResetPassword.tsx +126 -0
- package/src/features/auth/components/forms/index.ts +9 -0
- package/src/features/auth/components/index.ts +3 -0
- package/src/features/auth/contexts/AuthContext.tsx +77 -0
- package/src/features/auth/contexts/index.ts +1 -0
- package/src/features/auth/enums/AuthComponent.ts +9 -0
- package/src/features/auth/enums/index.ts +1 -0
- package/src/features/auth/index.ts +2 -1
- package/src/features/auth/utils/AuthCookies.ts +134 -0
- package/src/features/auth/utils/index.ts +1 -0
- package/src/features/company/components/containers/AdminCompanyContainer.tsx +26 -0
- package/src/features/company/components/containers/CompanyContainer.tsx +17 -0
- package/src/features/company/components/containers/index.ts +2 -0
- package/src/features/company/components/details/CompanyDetails.tsx +26 -0
- package/src/features/company/components/details/index.ts +1 -0
- package/src/features/company/components/forms/CompanyConfigurationEditor.tsx +151 -0
- package/src/features/company/components/forms/CompanyConfigurationSecurityForm.tsx +97 -0
- package/src/features/company/components/forms/CompanyDeleter.tsx +121 -0
- package/src/features/company/components/forms/CompanyEditor.tsx +245 -0
- package/src/features/company/components/forms/CompanyLicense.tsx +213 -0
- package/src/features/company/components/forms/index.ts +5 -0
- package/src/features/company/components/index.ts +4 -0
- package/src/features/company/components/lists/CompaniesList.tsx +31 -0
- package/src/features/company/components/lists/index.ts +1 -0
- package/src/features/company/contexts/CompanyContext.tsx +99 -0
- package/src/features/company/contexts/index.ts +0 -0
- package/src/features/company/hooks/index.ts +1 -0
- package/src/features/company/hooks/useCompanyTableStructure.tsx +82 -0
- package/src/features/feature/components/forms/FormFeatures.tsx +141 -140
- package/src/features/feature/components/forms/index.ts +1 -0
- package/src/features/feature/components/index.ts +1 -1
- package/src/features/feature/index.ts +1 -2
- package/src/features/module/index.ts +1 -1
- package/src/features/notification/components/common/NotificationErrorBoundary.tsx +51 -0
- package/src/features/notification/components/common/index.ts +1 -0
- package/src/features/notification/components/containers/NotificationsListContainer.tsx +44 -0
- package/src/features/notification/components/containers/index.ts +1 -0
- package/src/features/notification/components/index.ts +5 -0
- package/src/features/notification/components/lists/NotificationsList.tsx +129 -0
- package/src/features/notification/components/lists/index.ts +1 -0
- package/src/features/notification/components/modals/NotificationModal.tsx +220 -0
- package/src/features/notification/components/modals/index.ts +1 -0
- package/src/features/notification/components/notifications/Notification.tsx +120 -0
- package/src/features/notification/components/notifications/PushNotificationProvider.tsx +9 -0
- package/src/features/notification/components/notifications/index.ts +2 -0
- package/src/features/notification/contexts/NotificationContext.tsx +187 -0
- package/src/features/notification/contexts/index.ts +1 -0
- package/src/features/notification/index.ts +1 -1
- package/src/features/push/index.ts +1 -1
- package/src/features/role/components/containers/RoleContainer.tsx +18 -0
- package/src/features/role/components/containers/index.ts +1 -0
- package/src/features/role/components/details/RoleDetails.tsx +21 -0
- package/src/features/role/components/details/index.ts +1 -0
- package/src/features/role/components/forms/FormRoles.tsx +82 -0
- package/src/features/role/components/forms/RemoveUserFromRole.tsx +108 -0
- package/src/features/role/components/forms/UserRoleAdd.tsx +128 -0
- package/src/features/role/components/forms/index.ts +3 -0
- package/src/features/role/components/index.ts +4 -0
- package/src/features/role/components/lists/RolesList.tsx +27 -0
- package/src/features/role/components/lists/UserRolesList.tsx +31 -0
- package/src/features/role/components/lists/index.ts +2 -0
- package/src/features/role/contexts/RoleContext.tsx +84 -0
- package/src/features/role/contexts/index.ts +1 -0
- package/src/features/role/hooks/index.ts +1 -0
- package/src/features/role/hooks/useRoleTableStructure.tsx +72 -0
- package/src/features/s3/index.ts +1 -1
- package/src/features/user/components/containers/UserContainer.tsx +23 -0
- package/src/features/user/components/containers/UserIndexContainer.tsx +12 -0
- package/src/features/user/components/containers/UsersListContainer.tsx +36 -0
- package/src/features/user/components/containers/index.ts +3 -0
- package/src/features/user/components/details/UserDetails.tsx +74 -0
- package/src/features/user/components/details/UserIndexDetails.tsx +28 -0
- package/src/features/user/components/details/index.ts +2 -0
- package/src/features/user/components/forms/RoleUserAdd.tsx +93 -0
- package/src/features/user/components/forms/UserAvatarEditor.tsx +78 -0
- package/src/features/user/components/forms/UserDeleter.tsx +49 -0
- package/src/features/user/components/forms/UserEditor.tsx +319 -0
- package/src/features/user/components/forms/UserMultiSelect.tsx +218 -0
- package/src/features/user/components/forms/UserReactivator.tsx +79 -0
- package/src/features/user/components/forms/UserResentInvitationEmail.tsx +88 -0
- package/src/features/user/components/forms/UserSelector.tsx +185 -0
- package/src/features/user/components/forms/index.ts +8 -0
- package/src/features/user/components/index.ts +3 -0
- package/src/features/user/components/lists/AdminUsersList.tsx +41 -0
- package/src/features/user/components/lists/CompanyUsersList.tsx +44 -0
- package/src/features/user/components/lists/RelevantUsersList.tsx +30 -0
- package/src/features/user/components/lists/RoleUsersList.tsx +31 -0
- package/src/features/user/components/lists/UserListInAdd.tsx +53 -0
- package/src/features/user/components/lists/UsersList.tsx +30 -0
- package/src/features/user/components/lists/UsersListByContentIds.tsx +30 -0
- package/src/features/user/components/lists/index.ts +7 -0
- package/src/features/user/components/widgets/UserAvatarList.tsx +31 -0
- package/src/features/user/components/widgets/UserSearchPopover.tsx +89 -0
- package/src/features/user/contexts/UserContext.tsx +106 -0
- package/src/features/user/contexts/index.ts +1 -0
- package/src/features/user/hooks/index.ts +2 -0
- package/src/features/user/hooks/useUserSearch.ts +53 -0
- package/src/features/user/hooks/useUserTableStructure.tsx +115 -0
- package/src/features/user/index.ts +0 -1
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useCustomD3Graph.tsx +2 -0
- package/src/hooks/useNotificationSync.ts +20 -0
- package/src/hooks/usePageTracker.ts +69 -0
- package/src/hooks/usePushNotifications.ts +82 -0
- package/src/hooks/useSocket.ts +201 -0
- package/src/hooks/useTableGenerator.ts +6 -2
- package/src/i18n/config.ts +1 -0
- package/src/index.ts +4 -0
- package/src/interfaces/d3.link.interface.ts +2 -1
- package/src/server/ServerSession.ts +103 -0
- package/src/server/index.ts +2 -1
- package/src/unified/JsonApiRequest.ts +23 -0
- package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.mts +0 -20
- package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.ts +0 -20
- package/dist/BlockNoteEditor-VFWG6LXI.js.map +0 -1
- package/dist/JsonApiRequest-S3ICLM7B.mjs +0 -20
- package/dist/JsonApiRequest-ZZLSP26T.js +0 -20
- package/dist/JsonApiRequest-ZZLSP26T.js.map +0 -1
- package/dist/chunk-366S2JCC.mjs +0 -31
- package/dist/chunk-366S2JCC.mjs.map +0 -1
- package/dist/chunk-5W6AKZE6.mjs +0 -131
- package/dist/chunk-5W6AKZE6.mjs.map +0 -1
- package/dist/chunk-A3J3AAYM.mjs +0 -97
- package/dist/chunk-A3J3AAYM.mjs.map +0 -1
- package/dist/chunk-AWONBQQP.js +0 -97
- package/dist/chunk-AWONBQQP.js.map +0 -1
- package/dist/chunk-CXQOWQSY.js.map +0 -1
- package/dist/chunk-DKKMWBP4.mjs +0 -1
- package/dist/chunk-DKKMWBP4.mjs.map +0 -1
- package/dist/chunk-DO2HLAZO.js +0 -48
- package/dist/chunk-DO2HLAZO.js.map +0 -1
- package/dist/chunk-DZXDB3K2.mjs +0 -17
- package/dist/chunk-DZXDB3K2.mjs.map +0 -1
- package/dist/chunk-ECDTZBYO.mjs.map +0 -1
- package/dist/chunk-FY4SXJGU.js +0 -806
- package/dist/chunk-FY4SXJGU.js.map +0 -1
- package/dist/chunk-GYWPEPOH.mjs.map +0 -1
- package/dist/chunk-H6FMOA6B.js +0 -1
- package/dist/chunk-H6FMOA6B.js.map +0 -1
- package/dist/chunk-I2REI7OA.js.map +0 -1
- package/dist/chunk-J4Q36PMP.js +0 -31
- package/dist/chunk-J4Q36PMP.js.map +0 -1
- package/dist/chunk-L6EQEAXU.mjs.map +0 -1
- package/dist/chunk-MFO27OHB.mjs +0 -48
- package/dist/chunk-MFO27OHB.mjs.map +0 -1
- package/dist/chunk-RAF7PNLG.js +0 -131
- package/dist/chunk-RAF7PNLG.js.map +0 -1
- package/dist/chunk-RUR22SVM.js +0 -17
- package/dist/chunk-RUR22SVM.js.map +0 -1
- package/dist/chunk-TEGF6ZWG.js.map +0 -1
- package/dist/chunk-TMVHSY3Y.js.map +0 -1
- package/dist/chunk-V2JJPI7N.js.map +0 -1
- package/dist/chunk-WWWMJZEF.mjs +0 -806
- package/dist/chunk-WWWMJZEF.mjs.map +0 -1
- package/dist/chunk-X4BIHJ2B.mjs.map +0 -1
- package/dist/chunk-YDVTFM7X.mjs.map +0 -1
- /package/dist/{JsonApiRequest-S3ICLM7B.mjs.map → JsonApiRequest-O7BGUMFO.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/navigations/Breadcrumb.tsx","../../src/components/navigations/ContentTitle.tsx","../../src/components/navigations/Header.tsx","../../src/components/navigations/ModeToggleSwitch.tsx","../../src/components/navigations/PageSection.tsx","../../src/components/navigations/RecentPagesNavigator.tsx","../../src/components/containers/PageContainer.tsx","../../src/components/containers/ReactMarkdownContainer.tsx","../../src/components/containers/TabsContainer.tsx","../../src/components/contents/AttributeElement.tsx","../../src/components/details/AllowedUsersDetails.tsx","../../src/components/editors/BlockNoteEditorContainer.tsx","../../src/components/errors/ErrorDetails.tsx","../../src/components/forms/CommonAssociationForm.tsx","../../src/components/forms/CommonDeleter.tsx","../../src/components/forms/CommonEditorButtons.tsx","../../src/components/forms/CommonEditorHeader.tsx","../../src/components/forms/CommonEditorTrigger.tsx","../../src/components/forms/DatePickerPopover.tsx","../../src/components/forms/DateRangeSelector.tsx","../../src/components/forms/FileUploader.tsx","../../src/components/forms/FormCheckbox.tsx","../../src/components/forms/FormContainerGeneric.tsx","../../src/components/forms/FormDate.tsx","../../src/components/forms/FormDateTime.tsx","../../src/components/forms/FormInput.tsx","../../src/components/forms/PasswordInput.tsx","../../src/components/forms/FormPassword.tsx","../../src/components/forms/FormPlaceAutocomplete.tsx","../../src/components/forms/FormSelect.tsx","../../src/components/forms/FormSlider.tsx","../../src/components/forms/FormSwitch.tsx","../../src/components/forms/FormTextarea.tsx","../../src/components/pages/PageContainerContentDetails.tsx","../../src/components/pages/PageContentContainer.tsx","../../src/components/tables/cells/cell.component.tsx","../../src/components/tables/cells/cell.date.tsx","../../src/components/tables/cells/cell.id.tsx","../../src/components/tables/cells/cell.link.tsx","../../src/components/tables/cells/cell.url.tsx","../../src/components/tables/ContentListTable.tsx","../../src/components/tables/ContentTableSearch.tsx"],"sourcesContent":["\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { Fragment, useState } from \"react\";\nimport { usePageUrlGenerator } from \"../../hooks\";\nimport { BreadcrumbItemData } from \"../../interfaces\";\nimport {\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbSeparator,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Link,\n Breadcrumb as UIBreadcrumb,\n} from \"../../shadcnui\";\n\ntype BreadcrumbProps = { items: BreadcrumbItemData[] };\n\nconst ITEMS_TO_DISPLAY = 3;\n\nexport function Breadcrumb({ items }: BreadcrumbProps) {\n const generateUrl = usePageUrlGenerator();\n const t = useTranslations();\n\n const [open, setOpen] = useState<boolean>(false);\n\n return (\n <UIBreadcrumb>\n <BreadcrumbList>\n <BreadcrumbItem>\n <Link href={generateUrl({ page: `/` })}>{t(`generic.home`)}</Link>\n </BreadcrumbItem>\n {items.length > 0 && <BreadcrumbSeparator />}\n\n {items.length > ITEMS_TO_DISPLAY ? (\n <>\n <BreadcrumbItem>\n {items[0].href ? <Link href={items[0].href}>{items[0].name}</Link> : <>{items[0].name}</>}\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger className=\"flex items-center gap-1\" aria-label=\"Toggle menu\">\n <BreadcrumbEllipsis className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {items.slice(1, -ITEMS_TO_DISPLAY + 1).map((item, index) => (\n <DropdownMenuItem key={index}>\n <Link href={item.href ? item.href : \"#\"}>{item.name}</Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n {items.slice(-ITEMS_TO_DISPLAY + 1).map((item, index) => (\n <Fragment key={index}>\n <BreadcrumbItem>\n {item.href ? <Link href={item.href}>{item.name}</Link> : <>{item.name}</>}\n </BreadcrumbItem>\n {index < items.slice(-ITEMS_TO_DISPLAY + 1).length - 1 && <BreadcrumbSeparator />}\n </Fragment>\n ))}\n </>\n ) : (\n <>\n {items.map((item, index) => (\n <Fragment key={index}>\n <BreadcrumbItem>\n {item.href ? <Link href={item.href}>{item.name}</Link> : <>{item.name}</>}\n </BreadcrumbItem>\n {index < items.length - 1 && <BreadcrumbSeparator />}\n </Fragment>\n ))}\n </>\n )}\n </BreadcrumbList>\n </UIBreadcrumb>\n );\n}\n","\"use client\";\n\nimport { ReactNode, useEffect, useState } from \"react\";\nimport { cn } from \"../../utils\";\n\ntype TitleProps = {\n type?: string | string[];\n element?: string;\n functions?: ReactNode;\n className?: string;\n};\n\nexport function ContentTitle({ type, element, functions, className }: TitleProps) {\n const [clientFunctions, setClientFunctions] = useState<ReactNode>(null);\n const [isClient, setIsClient] = useState(false);\n\n // Defer function rendering to client-side only to prevent hydration mismatches\n // caused by Radix UI's dynamic ID generation in Dialog/AlertDialog components\n useEffect(() => {\n setIsClient(true);\n setClientFunctions(functions);\n }, [functions]);\n\n if (!element) return null;\n\n return (\n <div className={cn(`mb-4 flex w-full flex-col`, className)}>\n {(type || isClient) && (\n <div className=\"flex flex-row items-center justify-between gap-x-4\">\n {type && <div className={`text-muted-foreground text-xl font-light`}>{type}</div>}\n {isClient && clientFunctions && (\n <div className=\"flex flex-row items-center justify-start\">{clientFunctions}</div>\n )}\n </div>\n )}\n <div className={`text-primary w-full text-3xl font-semibold`}>{element}</div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useSharedContext } from \"../../contexts/SharedContext\";\nimport { SidebarTrigger } from \"../../shadcnui\";\nimport { Breadcrumb } from \"./Breadcrumb\";\n\ntype HeaderProps = {\n children?: React.ReactNode;\n};\n\nexport function Header({ children }: HeaderProps) {\n const { breadcrumbs } = useSharedContext();\n\n return (\n <header className={`sticky top-0 z-10 flex h-12 flex-col items-center justify-start gap-x-4 border-b`}>\n <div className=\"bg-sidebar flex h-12 w-full flex-row items-center justify-between pl-2 pr-4\">\n <SidebarTrigger aria-label=\"Toggle sidebar\" />\n <div className=\"flex w-full flex-row items-center justify-start\">\n <Breadcrumb items={breadcrumbs} />\n </div>\n <div className=\"flex w-64 flex-row items-center justify-end gap-x-4 whitespace-nowrap\">\n {children ? children : null}\n </div>\n </div>\n </header>\n );\n}\n","\"use client\";\n\nimport { MoonIcon, SunIcon } from \"lucide-react\";\nimport { useTheme } from \"next-themes\";\nimport { Switch } from \"../../shadcnui\";\n\nexport function ModeToggleSwitch() {\n const { theme, setTheme } = useTheme();\n\n const handleToggle = () => {\n setTheme(theme === \"light\" ? \"dark\" : \"light\");\n };\n\n return (\n <div className=\"flex items-center\">\n <Switch checked={theme === \"dark\"} onCheckedChange={handleToggle} className=\"relative\">\n {theme === \"dark\" ? (\n <MoonIcon className=\"text-primary-foreground h-4 w-4\" />\n ) : (\n <SunIcon className=\"text-primary h-4 w-4\" />\n )}\n </Switch>\n </div>\n );\n}\n","\"use client\";\n\nimport { ChevronDownIcon, ChevronRightIcon } from \"lucide-react\";\nimport { ReactNode, useEffect, useState } from \"react\";\nimport { v4 } from \"uuid\";\n\ntype PageSectionProps = {\n children: ReactNode;\n title?: string;\n options?: ReactNode[];\n open?: boolean;\n small?: boolean;\n onToggle?: (isOpen: boolean) => void;\n};\n\nexport function PageSection({ children, title, options, open, small, onToggle }: PageSectionProps) {\n const [isOpen, setIsOpen] = useState<boolean>(open ?? true);\n const [shouldRender, setShouldRender] = useState<boolean>(open ?? true);\n\n useEffect(() => {\n if (onToggle) {\n onToggle(isOpen);\n }\n }, [isOpen]);\n\n const toggleOpen = () => setIsOpen(!isOpen);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n } else {\n const timer = setTimeout(() => setShouldRender(false), 300);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n return (\n <section\n id={title ? title.toLowerCase().replaceAll(\" \", \"\") : v4()}\n className={`${isOpen ? \"mb-4\" : \"my-0\"} flex w-full scroll-mt-40 flex-col`}\n >\n {title && (\n <div\n className={`${isOpen ? \"mb-4\" : \"mb-0\"} flex w-full justify-between border-b ${small ? `border-muted` : `border-primary`} pb-1`}\n >\n <div className=\"flex w-full cursor-pointer items-center justify-start gap-x-2\" onClick={toggleOpen}>\n {isOpen ? (\n <ChevronDownIcon className={`text-primary h-4 w-4`} />\n ) : (\n <ChevronRightIcon className=\"text-primary h-4 w-4\" />\n )}\n <h2 className={`flex w-full ${small === true ? `text-sm` : `text-lg`} text-primary font-semibold`}>\n {title}\n </h2>\n </div>\n {options && <div className=\"flex gap-2\">{options}</div>}\n </div>\n )}\n <div className={`overflow-hidden transition-all duration-300 ${isOpen ? \"\" : \"max-h-0\"}`}>\n {shouldRender && children}\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { useAtomValue } from \"jotai\";\nimport { HistoryIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { recentPagesAtom } from \"../../atoms\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Link,\n useSidebar,\n} from \"../../shadcnui\";\n\nexport function RecentPagesNavigator() {\n const recentPages = useAtomValue(recentPagesAtom);\n const t = useTranslations();\n const { state } = useSidebar();\n\n if (recentPages.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div className=\"flex w-full cursor-pointer items-center gap-2\">\n {state === \"collapsed\" ? <HistoryIcon className=\"h-4 w-4\" /> : <span>{t(`generic.recent_pages`)}</span>}\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-96\">\n <DropdownMenuLabel>{t(`generic.recent_pages`)}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {recentPages.map((page, index) => (\n <DropdownMenuItem key={`${page.url}-${index}`} asChild>\n <Link href={page.url} className=\"flex items-center gap-2\">\n <div className=\"flex flex-col\">\n <div className=\"truncate text-sm\">{page.title}</div>\n <div className=\"text-muted-foreground text-xs font-normal\">\n {t(`types.${page.moduleType}`, { count: 1 })}\n </div>\n </div>\n </Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../utils\";\nimport { Header } from \"../navigations\";\n\ntype PageContainerProps = { children: React.ReactNode; testId?: string; className?: string };\n\nexport function PageContainer({ children, testId, className }: PageContainerProps) {\n return (\n <div className={`flex h-full w-full flex-col`} data-testid={testId}>\n <Header />\n <main className={cn(`flex w-full flex-1 flex-col gap-y-4 pt-4 pl-4 pr-4`, className)}>{children}</main>\n </div>\n );\n}\n","\"use client\";\n\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { useEffect, useRef, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\ntype ReactMarkdownContainerProps = {\n content: string;\n collapsible?: boolean;\n initialLines?: number;\n size?: \"small\" | \"normal\";\n};\n\nexport function ReactMarkdownContainer({\n content,\n collapsible = false,\n initialLines = 4,\n size = \"normal\",\n}: ReactMarkdownContainerProps) {\n const t = useTranslations(\"generic.buttons\");\n const [isExpanded, setIsExpanded] = useState(false);\n const [showExpandButton, setShowExpandButton] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (collapsible && contentRef.current && !isExpanded) {\n // Check if content exceeds the clamped height\n const isOverflowing = contentRef.current.scrollHeight > contentRef.current.clientHeight;\n setShowExpandButton(isOverflowing);\n }\n }, [collapsible, content, isExpanded]);\n\n const handleToggle = () => {\n setIsExpanded(!isExpanded);\n };\n\n const clampStyle =\n collapsible && !isExpanded\n ? {\n display: \"-webkit-box\",\n WebkitLineClamp: initialLines,\n WebkitBoxOrient: \"vertical\" as const,\n overflow: \"hidden\",\n }\n : {};\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"relative\">\n <div ref={contentRef} style={clampStyle} className=\"transition-all duration-300 ease-in-out\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n p: ({ children }) => <p className={size === \"small\" ? \"text-xs\" : \"\"}>{children}</p>,\n li: ({ children }) => <li className={size === \"small\" ? \"text-xs\" : \"\"}>{children}</li>,\n table: ({ children }) => <table className=\"w-full table-auto border-collapse border\">{children}</table>,\n th: ({ children }) => (\n <th className={`border px-4 py-2 text-left ${size === \"small\" ? \"px-2 py-1 text-xs\" : \"\"}`}>\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className={`border px-4 py-2 ${size === \"small\" ? \"px-2 py-1 text-xs\" : \"\"}`}>{children}</td>\n ),\n tr: ({ children }) => <tr className=\"even:bg-gray-50\">{children}</tr>,\n ul: ({ children }) => <ul className={`list-disc ${size === \"small\" ? \"pl-3\" : \"pl-4\"}`}>{children}</ul>,\n ol: ({ children }) => (\n <ol className={`list-decimal ${size === \"small\" ? \"pl-3\" : \"pl-4\"}`}>{children}</ol>\n ),\n h1: ({ children }) => (\n <h1 className={size === \"small\" ? \"my-1 mt-2 text-sm font-bold\" : \"my-2 mt-4 text-3xl font-medium\"}>\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2\n className={size === \"small\" ? \"my-1 mt-2 text-sm font-semibold\" : \"my-2 mt-4 text-2xl font-semibold\"}\n >\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className={size === \"small\" ? \"my-1 mt-2 text-sm font-medium\" : \"my-2 mt-4 text-xl font-semibold\"}>\n {children}\n </h3>\n ),\n h4: ({ children }) => (\n <h4 className={size === \"small\" ? \"my-1 mt-2 text-sm font-medium\" : \"my-2 mt-4 text-lg font-semibold\"}>\n {children}\n </h4>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n\n {collapsible && !isExpanded && showExpandButton && (\n <div className=\"pointer-events-none absolute right-0 bottom-0 left-0 h-12 bg-gradient-to-t from-white to-transparent\" />\n )}\n </div>\n\n {collapsible && showExpandButton && (\n <div className=\"mt-2 flex justify-end\">\n <button\n onClick={handleToggle}\n className=\"flex items-center gap-1 rounded-md px-3 py-1.5 text-sm text-gray-600 transition-colors hover:bg-gray-100 hover:text-gray-900\"\n aria-label={isExpanded ? t(\"show_less\") : t(\"show_more\")}\n >\n <span>{isExpanded ? t(\"show_less\") : t(\"show_more\")}</span>\n {isExpanded ? <ChevronUp className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCurrentUserContext } from \"../../contexts\";\nimport { UserInterface } from \"../../features\";\nimport { Action, ModuleWithPermissions } from \"../../permissions\";\nimport { ScrollArea, Tabs, TabsContent, TabsList, TabsTrigger } from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\nexport type Tab = {\n label: string;\n contentLabel?: React.ReactNode;\n content: React.ReactNode;\n modules?: ModuleWithPermissions[];\n action?: Action;\n};\n\ntype TabsContainerProps = {\n tabs: Tab[];\n defaultTab?: string;\n tabsListClassName?: string;\n tabsTriggerClassName?: string;\n scrollAreaClassName?: string;\n style?: \"navigation\";\n additionalComponent?: React.ReactNode;\n};\n\nexport function TabsContainer({\n tabs,\n defaultTab,\n tabsListClassName,\n tabsTriggerClassName,\n scrollAreaClassName,\n style,\n additionalComponent,\n}: TabsContainerProps) {\n const { hasPermissionToModules } = useCurrentUserContext<UserInterface>();\n\n const validTabs = tabs.filter((tab) =>\n tab.modules && tab.action ? hasPermissionToModules({ modules: tab.modules, action: tab.action }) : true,\n );\n\n if (validTabs.length === 0) return null;\n\n const defaultValue = defaultTab ?? tabs[0].label;\n\n if (validTabs.length === 1) {\n return validTabs[0].content;\n }\n\n return (\n <Tabs defaultValue={defaultValue} className=\"w-full\">\n <div className=\"flex w-full items-center justify-between\">\n <TabsList\n className={cn(\n `${style ? `my-4 flex w-full justify-start rounded-none border-b bg-transparent pb-0` : ``}`,\n tabsListClassName,\n )}\n >\n {validTabs.map((tab) => (\n <TabsTrigger\n key={tab.label}\n value={tab.label}\n className={cn(\n `${style ? `text-muted-foreground border-accent data-[state=active]:text-foreground hover:text-foreground cursor-pointer rounded-none bg-transparent pb-2 text-sm font-light hover:border-0 data-[state=active]:border-b data-[state=active]:font-medium data-[state=active]:shadow-none` : `text-primary text-xs`}`,\n tabsTriggerClassName,\n )}\n >\n {tab.contentLabel ?? tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {additionalComponent && additionalComponent}\n </div>\n {scrollAreaClassName ? (\n <ScrollArea className={scrollAreaClassName}>\n {validTabs.map((tab) => (\n <TabsContent key={tab.label} value={tab.label}>\n {tab.content}\n </TabsContent>\n ))}\n </ScrollArea>\n ) : (\n <>\n {validTabs.map((tab) => (\n <TabsContent key={tab.label} value={tab.label}>\n {tab.content}\n </TabsContent>\n ))}\n </>\n )}\n </Tabs>\n );\n}\n","\"use client\";\n\nimport { ReactElement } from \"react\";\nimport { cn } from \"../../utils\";\n\ntype AttributeElementProps = {\n inline?: boolean;\n title?: string | ReactElement<any>;\n value?: string | ReactElement<any>;\n className?: string;\n};\n\nexport function AttributeElement({ inline, title, value, className }: AttributeElementProps) {\n return (\n <div className={cn(`flex ${inline === true ? \"flex-row\" : \"flex-col\"} my-1 justify-start`, className)}>\n {title && <div className={`${inline === true ? \"min-w-48 pr-4\" : \"w-full\"} text-sm font-semibold`}>{title}</div>}\n {value && <div className=\"flex w-full flex-col text-sm\">{value}</div>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { ContentInterface } from \"../../features/content/data\";\nimport { ContributorsList } from \"../../features/user/components\";\n\ntype AllowedUsersDetailsProps = {\n showTitle?: boolean;\n content: ContentInterface;\n};\n\nexport function AllowedUsersDetails({ showTitle, content }: AllowedUsersDetailsProps) {\n const t = useTranslations();\n\n return (\n <div className=\"mb-2 flex w-full flex-col gap-y-2\">\n {showTitle && <h3 className=\"text-xs font-semibold\">{t(\"generic.permissions\")}</h3>}\n <div className=\"flex w-full items-center justify-start gap-x-4\">\n <ContributorsList content={content} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport dynamic from \"next/dynamic\";\nimport React from \"react\";\nimport { BlockNoteEditorProps } from \"./BlockNoteEditor\";\n\nconst BlockNoteEditor = dynamic(() => import(\"./BlockNoteEditor\"), {\n ssr: false,\n});\n\nexport const BlockNoteEditorContainer = React.memo(function EditorContainer(props: BlockNoteEditorProps) {\n return <BlockNoteEditor {...props} />;\n});\n","\"use client\";\n\nimport Image from \"next/image\";\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../shadcnui\";\n\nexport function ErrorDetails({ title, message, code }: { title?: string; message: string; code: number }) {\n if (code === 403)\n return (\n <div className=\"w-xl max-w-xl\">\n <Card className=\"w-full\">\n <CardHeader>\n <CardTitle className=\"text-foreground flex flex-col items-center gap-y-4 pb-10 text-4xl\">\n <Image src=\"/phlow-logo.webp\" alt=\"Phlow\" width={100} height={100} priority />\n {/* <div>{code}</div> */}\n <div>Unauthorised</div>\n </CardTitle>\n <CardDescription className=\"text-center text-lg\">\n We are sorry, but you are not allowed to access this content.\n </CardDescription>\n </CardHeader>\n <CardContent></CardContent>\n </Card>\n </div>\n );\n\n return (\n <div className=\"w-xl max-w-xl\">\n <Card className=\"w-full\">\n <CardHeader>\n <CardTitle className=\"text-foreground flex flex-col items-center gap-y-4 pb-10 text-center text-4xl\">\n <Image src=\"/phlow-logo.webp\" alt=\"Phlow\" width={100} height={100} priority />\n <div>{code}</div>\n <div>{title}</div>\n </CardTitle>\n <CardDescription className=\"text-center text-lg\">{message}</CardDescription>\n </CardHeader>\n <CardContent></CardContent>\n </Card>\n </div>\n );\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { DataListRetriever, useDebounce } from \"../../hooks\";\nimport {\n Button,\n Command,\n CommandDialog,\n CommandEmpty,\n CommandInput,\n CommandList,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../shadcnui\";\n\ntype CommonAssociationTriggerProps = {\n sourceType: string;\n destinationType: string;\n hasDestination?: boolean;\n onTrigger: () => void;\n};\n\nexport function CommonAssociationTrigger({\n sourceType,\n destinationType,\n hasDestination,\n onTrigger,\n}: CommonAssociationTriggerProps) {\n const t = useTranslations();\n\n if (hasDestination)\n return (\n <div className=\"hover:text-accent cursor-pointer\" onClick={onTrigger}>\n Join\n </div>\n );\n\n return (\n <Button variant={`outline`} size={`sm`} onClick={onTrigger}>\n {t(`generic.association.label`, {\n source: sourceType,\n destination: destinationType,\n })}\n </Button>\n );\n}\n\ntype CommonAssociationCommandDialogProps = {\n show: boolean;\n setShow: (show: boolean) => void;\n data: DataListRetriever<any>;\n source: string;\n destination: string;\n destinationName: string;\n children: ReactNode;\n};\n\nexport function CommonAssociationCommandDialog({\n show,\n setShow,\n data,\n source,\n destination,\n destinationName,\n children,\n}: CommonAssociationCommandDialogProps) {\n const t = useTranslations();\n\n const searchTermRef = useRef<string>(\"\");\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\n\n const refreshList = useCallback(\n async (searchedTerm: string) => {\n if (searchedTerm === searchTermRef.current) return;\n searchTermRef.current = searchedTerm;\n await data.search(searchedTerm);\n },\n [searchTerm, data],\n );\n\n const updateSearchTerm = useDebounce(refreshList, 500);\n\n useEffect(() => {\n if (show) updateSearchTerm(searchTerm);\n }, [show, searchTerm]);\n\n return (\n <CommandDialog open={show} onOpenChange={setShow}>\n <DialogHeader className=\"flex flex-col items-start p-4 pb-0\">\n <DialogTitle>\n {t(`generic.association.label`, {\n source: source,\n destination: destination,\n })}\n </DialogTitle>\n <DialogDescription>\n {t(`generic.association.description`, {\n source: source,\n destination: destination,\n destination_name: destinationName,\n })}\n </DialogDescription>\n </DialogHeader>\n <Command shouldFilter={false} className=\"p-4\">\n <CommandInput\n placeholder={t(`generic.search.placeholder`, { type: source })}\n value={searchTerm}\n onValueChange={setSearchTerm}\n />\n <CommandList className=\"mt-3 h-auto max-h-96 min-h-96 max-w-full overflow-y-auto overflow-x-hidden\">\n <CommandEmpty>{t(`generic.search.no_results`, { type: source })}</CommandEmpty>\n {children}\n </CommandList>\n </Command>\n </CommandDialog>\n );\n}\n\nexport const triggerAssociationToast = (params: {\n t: any;\n source: string;\n destination: string;\n source_name: string;\n destination_name: string;\n level?: string;\n}) => {\n if (params.level) {\n toast.message(\n params.t(`generic.association.label`, {\n source: params.source,\n destination: params.destination,\n }),\n {\n description: params.t(`generic.association.success_level`, {\n source: params.source,\n destination: params.destination,\n source_name: params.source_name,\n destination_name: params.destination_name,\n level: params.level,\n }),\n },\n );\n } else {\n toast.message(\n params.t(`generic.association.label`, {\n source: params.source,\n destination: params.destination,\n }),\n {\n description: params.t(`generic.association.success`, {\n source: params.source,\n destination: params.destination,\n source_name: params.source_name,\n destination_name: params.destination_name,\n }),\n },\n );\n }\n};\n","\"use client\";\n\nimport { LoaderCircleIcon, Trash2Icon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useI18nRouter, useI18nTranslations } from \"../../i18n\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n} from \"../../shadcnui\";\nimport { errorToast } from \"../errors\";\n\ntype CommonDeleterProps = {\n type: string;\n deleteFunction: () => Promise<void>;\n redirectTo?: string;\n forceShow?: boolean;\n};\n\nexport function CommonDeleter({ deleteFunction, redirectTo, type, forceShow }: CommonDeleterProps) {\n const t = useI18nTranslations();\n const router = useI18nRouter();\n const [open, setOpen] = useState<boolean>(forceShow || false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n\n const handleDelete = async () => {\n setIsDeleting(true);\n try {\n await deleteFunction();\n\n setOpen(false);\n if (redirectTo) router.push(redirectTo);\n } catch (error) {\n errorToast({ title: t(`generic.errors.delete`), error: error });\n }\n setIsDeleting(false);\n };\n\n return (\n <AlertDialog open={open} onOpenChange={setOpen}>\n {forceShow ? null : (\n <AlertDialogTrigger asChild>\n <Button size=\"sm\" variant={\"ghost\"} className=\"text-muted-foreground hover:text-destructive\">\n <Trash2Icon />\n </Button>\n </AlertDialogTrigger>\n )}\n <AlertDialogContent className={`flex max-h-[70vh] max-w-3xl flex-col overflow-y-auto`}>\n <AlertDialogHeader>\n <AlertDialogTitle>{t(`generic.delete.title`, { type: t(`types.${type}`, { count: 1 }) })}</AlertDialogTitle>\n <AlertDialogDescription>\n {t(`generic.delete.subtitle`, { type: t(`types.${type}`, { count: 1 }) })}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <div className=\"text-destructive p-4 text-sm\">\n {t(`generic.delete.description`, { type: t(`types.${type}`, { count: 1 }) })}\n </div>\n <div className=\"flex justify-end\">\n <Button\n className=\"mr-2\"\n variant={\"outline\"}\n type={`button`}\n onClick={() => setOpen(false)}\n disabled={isDeleting}\n >\n {t(`generic.buttons.cancel`)}\n </Button>\n <Button\n type=\"submit\"\n onClick={(e) => {\n e.preventDefault();\n handleDelete();\n }}\n variant={\"destructive\"}\n disabled={isDeleting}\n >\n {isDeleting ? (\n <>\n {t(`generic.buttons.is_deleting`)}\n <LoaderCircleIcon className=\"animate-spin-slow h-5 w-5\" />\n </>\n ) : (\n t(`generic.buttons.delete`)\n )}\n </Button>\n </div>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useTranslations } from \"next-intl\";\nimport { Button } from \"../../shadcnui\";\n\ntype CommonEditorButtonsProps = {\n isEdit: boolean;\n form: any;\n disabled?: boolean;\n setOpen: (open: boolean) => void;\n};\nexport function CommonEditorButtons({ isEdit, form, disabled, setOpen }: CommonEditorButtonsProps) {\n const t = useTranslations();\n\n return (\n <div className=\"flex justify-end\">\n <Button\n className=\"mr-2\"\n variant={\"outline\"}\n type={`button`}\n onClick={() => setOpen(false)}\n data-testid={`modal-button-cancel`}\n >\n {t(`generic.buttons.cancel`)}\n </Button>\n\n <Button type=\"submit\" disabled={form.formState.isSubmitting || disabled} data-testid={`modal-button-create`}>\n {isEdit ? t(`generic.buttons.confirm_update`) : t(`generic.buttons.confirm_create`)}\n </Button>\n </div>\n );\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { DialogDescription, DialogHeader, DialogTitle } from \"../../shadcnui\";\n\ntype CommonEditorHeaderProps = {\n type: string;\n name?: string;\n};\n\nexport function CommonEditorHeader({ type, name }: CommonEditorHeaderProps) {\n const t = useTranslations();\n\n return (\n <DialogHeader>\n <DialogTitle>\n {name\n ? t(`generic.edit.update.title`, {\n type: type,\n })\n : t(`generic.edit.create.title`, { type: type })}\n </DialogTitle>\n <DialogDescription>\n {name\n ? t(`generic.edit.update.description`, {\n type: type,\n name: name,\n })\n : t(`generic.edit.create.description`, {\n type: type,\n })}\n </DialogDescription>\n </DialogHeader>\n );\n}\n","\"use client\";\n\nimport { PencilIcon } from \"lucide-react\";\n\nimport { useTranslations } from \"next-intl\";\nimport { Button, DialogTrigger } from \"../../shadcnui\";\n\ntype CommonEditorTriggerProps = { isEdit: boolean; edit?: string; create?: string };\n\nexport function CommonEditorTrigger({ isEdit, edit, create }: CommonEditorTriggerProps) {\n const t = useTranslations();\n\n return (\n <DialogTrigger asChild>\n {isEdit ? (\n <Button size=\"sm\" variant={`ghost`} className=\"text-muted-foreground\">\n <PencilIcon />\n </Button>\n ) : (\n <Button size=\"sm\" variant={`outline`}>\n {create ? create : t(`generic.buttons.create`)}\n </Button>\n )}\n </DialogTrigger>\n );\n}\n","\"use client\";\n\nimport { isValid, parse } from \"date-fns\";\nimport { Calendar as CalendarIcon, CircleXIcon } from \"lucide-react\";\nimport { ReactNode, useMemo, useState } from \"react\";\nimport { useI18nDateFnsLocale, useI18nLocale } from \"../../i18n\";\nimport {\n Calendar,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\ntype DatePickerPopoverProps = {\n children: ReactNode;\n value?: Date;\n onSelect: (date?: Date) => void;\n minDate?: Date;\n align?: \"start\" | \"center\" | \"end\";\n className?: string;\n};\n\nexport const DatePickerPopover = ({\n children,\n value,\n onSelect,\n minDate,\n align = \"start\",\n className,\n}: DatePickerPopoverProps) => {\n const locale = useI18nLocale();\n const dateFnsLocale = useI18nDateFnsLocale();\n const [isOpen, setIsOpen] = useState(false);\n const [displayMonth, setDisplayMonth] = useState<Date>(() => value || new Date());\n\n // Locale-aware date formatter\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(locale, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }),\n [locale],\n );\n\n // Format date for display\n const formatDate = (date: Date): string => dateFormatter.format(date);\n\n // Get placeholder based on locale format\n const datePlaceholder = useMemo(() => {\n const parts = dateFormatter.formatToParts(new Date(2000, 0, 1));\n return parts\n .map((part) => {\n if (part.type === \"day\") return \"dd\";\n if (part.type === \"month\") return \"mm\";\n if (part.type === \"year\") return \"yyyy\";\n return part.value;\n })\n .join(\"\");\n }, [dateFormatter]);\n\n // Get date-fns format string from locale\n const dateFormatPattern = useMemo(() => {\n const parts = dateFormatter.formatToParts(new Date(2000, 0, 1));\n return parts\n .map((part) => {\n if (part.type === \"day\") return \"dd\";\n if (part.type === \"month\") return \"MM\";\n if (part.type === \"year\") return \"yyyy\";\n return part.value;\n })\n .join(\"\");\n }, [dateFormatter]);\n\n const [inputValue, setInputValue] = useState<string>(() => (value ? formatDate(value) : \"\"));\n\n // Generate year options (1900 to current year + 10)\n const currentYear = new Date().getFullYear();\n const yearOptions = Array.from({ length: currentYear - 1900 + 11 }, (_, i) => 1900 + i);\n\n // Generate month names dynamically based on current locale\n const monthNames = useMemo(() => {\n const formatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n return Array.from({ length: 12 }, (_, i) => {\n const monthName = formatter.format(new Date(2000, i, 1));\n return monthName.charAt(0).toUpperCase() + monthName.slice(1);\n });\n }, [locale]);\n\n // Handle text input change\n const handleInputChange = (inputValue: string) => {\n setInputValue(inputValue);\n\n // Try to parse the date using locale format\n const parsedDate = parse(inputValue, dateFormatPattern, new Date());\n\n if (isValid(parsedDate)) {\n onSelect(parsedDate);\n setDisplayMonth(parsedDate);\n } else if (inputValue === \"\") {\n onSelect(undefined);\n }\n };\n\n // Handle calendar selection\n const handleCalendarSelect = (selectedDate: Date | undefined) => {\n onSelect(selectedDate);\n if (selectedDate) {\n setInputValue(formatDate(selectedDate));\n setDisplayMonth(selectedDate);\n } else {\n setInputValue(\"\");\n }\n setIsOpen(false);\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onSelect(undefined);\n setInputValue(\"\");\n };\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent className={cn(\"w-auto p-0\", className)} align={align} onClick={(e) => e.stopPropagation()}>\n <div className=\"p-3\">\n {/* Manual Input */}\n <div className=\"relative mb-3\">\n <Input\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value)}\n placeholder={datePlaceholder}\n className=\"pr-16\"\n onClick={(e) => e.stopPropagation()}\n />\n <div className=\"absolute right-1 top-1/2 flex -translate-y-1/2 items-center space-x-1\">\n <button\n type=\"button\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md hover:bg-muted\"\n onClick={(e) => e.stopPropagation()}\n >\n <CalendarIcon className=\"h-4 w-4 opacity-50\" />\n </button>\n {value && (\n <button\n type=\"button\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md hover:bg-muted\"\n onClick={handleClear}\n >\n <CircleXIcon className=\"h-4 w-4 opacity-50 hover:opacity-100\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Year and Month Selectors */}\n <div className=\"mb-3 flex gap-2\">\n <Select\n value={displayMonth.getMonth().toString()}\n onValueChange={(value) => {\n const newMonth = parseInt(value);\n const newDate = new Date(displayMonth.getFullYear(), newMonth, 1);\n setDisplayMonth(newDate);\n }}\n >\n <SelectTrigger className=\"w-[130px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {monthNames.map((month, index) => (\n <SelectItem key={index} value={index.toString()}>\n {month}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Select\n value={displayMonth.getFullYear().toString()}\n onValueChange={(value) => {\n const newYear = parseInt(value);\n const newDate = new Date(newYear, displayMonth.getMonth(), 1);\n setDisplayMonth(newDate);\n }}\n >\n <SelectTrigger className=\"w-[80px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {yearOptions.reverse().map((year) => (\n <SelectItem key={year} value={year.toString()}>\n {year}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Calendar */}\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={handleCalendarSelect}\n disabled={(date) => (minDate && date < minDate ? true : false)}\n locale={dateFnsLocale}\n weekStartsOn={1}\n month={displayMonth}\n onMonthChange={setDisplayMonth}\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n};\n","\"use client\";\n\nimport { format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { DateRange } from \"react-day-picker\";\nimport { Button, Calendar, Popover, PopoverContent, PopoverTrigger } from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\ntype DateRangeSelectorProps = {\n onDateChange: (date?: DateRange) => void;\n avoidSettingDates?: boolean;\n showPreviousMonth?: boolean;\n};\n\nexport function DateRangeSelector({ onDateChange, avoidSettingDates, showPreviousMonth }: DateRangeSelectorProps) {\n const [date, setDate] = useState<DateRange | undefined>(\n avoidSettingDates\n ? undefined\n : {\n from: new Date(new Date().getFullYear(), new Date().getMonth(), 1),\n to: new Date(new Date().getFullYear(), new Date().getMonth() + 1, 0),\n },\n );\n\n const [open, setOpen] = useState(false);\n\n const [prevRange, setPrevRange] = useState<DateRange | undefined>(date);\n useEffect(() => {\n if (\n date?.from &&\n date?.to &&\n date.to > date.from &&\n (prevRange?.from?.getTime() !== date.from.getTime() || prevRange?.to?.getTime() !== date.to.getTime())\n ) {\n onDateChange(date);\n setPrevRange(date);\n setOpen(false);\n }\n }, [date, prevRange, onDateChange]);\n\n // Custom handler to reset end date if a new start date is picked\n const handleSelect = (range: DateRange | undefined) => {\n if (!range) {\n setDate(undefined);\n return;\n }\n // If a new start date is picked, reset end date\n if (range.from && (!date?.from || range.from.getTime() !== date.from.getTime())) {\n setDate({ from: range.from, to: undefined });\n } else {\n setDate(range);\n }\n };\n\n return (\n <div className={cn(\"grid gap-2\")}>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n id=\"date\"\n variant={\"outline\"}\n className={cn(\"w-[300px] justify-start text-left font-normal\", !date && \"text-muted-foreground\")}\n >\n <CalendarIcon />\n {date?.from ? (\n date.to ? (\n <>\n {format(date.from, \"LLL dd, y\")} - {format(date.to, \"LLL dd, y\")}\n </>\n ) : (\n format(date.from, \"LLL dd, y\")\n )\n ) : (\n <span>Pick a date</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"flex flex-col gap-2 p-2\">\n <Calendar\n mode=\"range\"\n defaultMonth={\n date?.from ??\n (showPreviousMonth ? new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1) : undefined)\n }\n selected={date}\n onSelect={handleSelect}\n numberOfMonths={2}\n />\n <Button\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n setDate(undefined);\n setPrevRange(undefined);\n onDateChange(undefined);\n setOpen(false);\n }}\n className=\"cursor-pointer\"\n disabled={!date}\n >\n Clear\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n","\"use client\";\n\nimport { Trash2 as RemoveIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport {\n createContext,\n Dispatch,\n forwardRef,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { DropzoneOptions, DropzoneState, FileRejection, useDropzone } from \"react-dropzone\";\nimport { toast } from \"sonner\";\nimport { buttonVariants, Input } from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\ntype DirectionOptions = \"rtl\" | \"ltr\" | undefined;\n\ntype FileUploaderContextType = {\n dropzoneState: DropzoneState;\n isLOF: boolean;\n isFileTooBig: boolean;\n removeFileFromSet: (index: number) => void;\n activeIndex: number;\n setActiveIndex: Dispatch<SetStateAction<number>>;\n orientation: \"horizontal\" | \"vertical\";\n direction: DirectionOptions;\n};\n\nconst FileUploaderContext = createContext<FileUploaderContextType | null>(null);\n\nexport const useFileUpload = () => {\n const context = useContext(FileUploaderContext);\n if (!context) {\n throw new Error(\"useFileUpload must be used within a FileUploaderProvider\");\n }\n return context;\n};\n\ntype FileUploaderProps = {\n value: File[] | null;\n reSelect?: boolean;\n onValueChange: (value: File[] | null) => void;\n dropzoneOptions: DropzoneOptions;\n orientation?: \"horizontal\" | \"vertical\";\n};\n\nexport const FileUploader = forwardRef<HTMLDivElement, FileUploaderProps & React.HTMLAttributes<HTMLDivElement>>(\n (\n { className, dropzoneOptions, value, onValueChange, reSelect, orientation = \"vertical\", children, dir, ...props },\n ref,\n ) => {\n const [isFileTooBig, setIsFileTooBig] = useState(false);\n const [isLOF, setIsLOF] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const { maxFiles = 1, maxSize = 4 * 1024 * 1024, multiple = true } = dropzoneOptions;\n const t = useTranslations();\n\n const reSelectAll = maxFiles === 1 ? true : reSelect;\n const direction: DirectionOptions = dir === \"rtl\" ? \"rtl\" : \"ltr\";\n\n const removeFileFromSet = useCallback(\n (i: number) => {\n if (!value) return;\n const newFiles = value.filter((_, index) => index !== i);\n onValueChange(newFiles);\n },\n [value, onValueChange],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!value) return;\n\n const moveNext = () => {\n const nextIndex = activeIndex + 1;\n setActiveIndex(nextIndex > value.length - 1 ? 0 : nextIndex);\n };\n\n const movePrev = () => {\n const nextIndex = activeIndex - 1;\n setActiveIndex(nextIndex < 0 ? value.length - 1 : nextIndex);\n };\n\n const prevKey = orientation === \"horizontal\" ? (direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\") : \"ArrowUp\";\n\n const nextKey = orientation === \"horizontal\" ? (direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\") : \"ArrowDown\";\n\n if (e.key === nextKey) {\n moveNext();\n } else if (e.key === prevKey) {\n movePrev();\n } else if (e.key === \"Enter\" || e.key === \"Space\") {\n if (activeIndex === -1) {\n dropzoneState.inputRef.current?.click();\n }\n } else if (e.key === \"Delete\" || e.key === \"Backspace\") {\n if (activeIndex !== -1) {\n removeFileFromSet(activeIndex);\n if (value.length - 1 === 0) {\n setActiveIndex(-1);\n return;\n }\n movePrev();\n }\n } else if (e.key === \"Escape\") {\n setActiveIndex(-1);\n }\n },\n [value, activeIndex, removeFileFromSet],\n );\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {\n const files = acceptedFiles;\n\n if (!files) {\n toast.error(t(\"generic.errors.file\"), {\n description: t(\"generic.errors.file_large\"),\n });\n return;\n }\n\n const newValues: File[] = value ? [...value] : [];\n\n if (reSelectAll) {\n newValues.splice(0, newValues.length);\n }\n\n files.forEach((file) => {\n if (newValues.length < maxFiles) {\n newValues.push(file);\n }\n });\n\n onValueChange(newValues);\n\n if (rejectedFiles.length > 0) {\n for (let i = 0; i < rejectedFiles.length; i++) {\n if (rejectedFiles[i].errors[0]?.code === \"file-too-large\") {\n toast.error(t(\"generic.errors.file\"), {\n description: t(`generic.errors.file_max`, { size: maxSize / 1024 / 1024 }),\n });\n break;\n }\n if (rejectedFiles[i].errors[0]?.message) {\n toast.error(t(`generic.errors.file`), {\n description: rejectedFiles[i].errors[0].message,\n });\n break;\n }\n }\n }\n },\n [reSelectAll, value],\n );\n\n useEffect(() => {\n if (!value) return;\n if (value.length === maxFiles) {\n // setIsLOF(true);\n return;\n }\n setIsLOF(false);\n }, [value, maxFiles]);\n\n const opts = dropzoneOptions ? dropzoneOptions : { maxFiles, maxSize, multiple };\n\n const dropzoneState = useDropzone({\n ...opts,\n onDrop,\n onDropRejected: () => setIsFileTooBig(true),\n onDropAccepted: () => setIsFileTooBig(false),\n });\n\n const { isDragActive } = dropzoneState; // Correctly get isDragActive\n\n return (\n <FileUploaderContext.Provider\n value={{\n dropzoneState,\n isLOF,\n isFileTooBig,\n removeFileFromSet,\n activeIndex,\n setActiveIndex,\n orientation,\n direction,\n }}\n >\n <div\n ref={ref}\n tabIndex={0}\n onKeyDownCapture={handleKeyDown}\n className={cn(\n \"grid w-full overflow-hidden focus:outline-none\",\n className, // Original className from props\n {\n \"gap-2\": value && value.length > 0,\n \"bg-muted border-primary border-dashed\": isDragActive, // Apply drag-active styles to the main FileUploader div\n },\n )}\n dir={dir}\n {...props}\n >\n {children}\n </div>\n </FileUploaderContext.Provider>\n );\n },\n);\n\nFileUploader.displayName = \"FileUploader\";\n\nexport const FileUploaderContent = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ children, className, ...props }, ref) => {\n const { orientation } = useFileUpload();\n const containerRef = useRef<HTMLDivElement>(null);\n\n return (\n <div className={cn(\"w-full px-1\")} ref={containerRef} aria-description=\"content file holder\">\n <div\n {...props}\n ref={ref}\n className={cn(\n \"flex gap-1 rounded-xl\",\n orientation === \"horizontal\" ? \"flex-raw flex-wrap\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n\nFileUploaderContent.displayName = \"FileUploaderContent\";\n\nexport const FileUploaderItem = forwardRef<HTMLDivElement, { index: number } & React.HTMLAttributes<HTMLDivElement>>(\n ({ className, index, children, ...props }, ref) => {\n const { removeFileFromSet, activeIndex, direction } = useFileUpload();\n const isSelected = index === activeIndex;\n const t = useTranslations();\n\n return (\n <div\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"ghost\" }),\n \"relative h-6 cursor-pointer justify-between p-1\",\n className,\n isSelected ? \"bg-muted\" : \"\",\n )}\n {...props}\n >\n <div className=\"flex h-full w-full items-center gap-1.5 leading-none font-medium tracking-tight\">\n {children}\n </div>\n <button\n type=\"button\"\n className={cn(\"absolute\", direction === \"rtl\" ? \"top-1 left-1\" : \"top-1 right-1\")}\n onClick={() => removeFileFromSet(index)}\n >\n <span className=\"sr-only\">{t(`generic.remove_item`, { index: index })}</span>\n <RemoveIcon className=\"hover:stroke-destructive h-4 w-4 duration-200 ease-in-out\" />\n </button>\n </div>\n );\n },\n);\n\nFileUploaderItem.displayName = \"FileUploaderItem\";\n\nexport const FileInput = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const { dropzoneState, isFileTooBig, isLOF } = useFileUpload();\n const rootProps = isLOF ? {} : dropzoneState.getRootProps();\n // Get isDragActive from the context for FileInput as well, to ensure it can react if needed, or to simplify its own styling.\n const { isDragActive: parentIsDragActive } = dropzoneState;\n\n return (\n <div\n ref={ref}\n {...props}\n className={cn(`relative w-full ${isLOF ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"}`, className)}\n >\n <div\n className={cn(\n \"w-full rounded-lg duration-300 ease-in-out\",\n // Simpler border logic: if parent is drag-active, it controls the border.\n // Otherwise, FileInput can show its own accept/reject/default border.\n {\n \"border-green-500\": dropzoneState.isDragAccept && !parentIsDragActive,\n \"border-red-500\": (dropzoneState.isDragReject || isFileTooBig) && !parentIsDragActive,\n \"border-gray-300\":\n !dropzoneState.isDragAccept && !dropzoneState.isDragReject && !isFileTooBig && !parentIsDragActive,\n },\n // className from props should be last to allow overrides if necessary\n className,\n )}\n {...rootProps}\n >\n {children}\n </div>\n <Input\n ref={dropzoneState.inputRef}\n disabled={isLOF}\n {...dropzoneState.getInputProps()}\n className={`${isLOF ? \"cursor-not-allowed\" : \"\"}`}\n />\n </div>\n );\n },\n);\n\nFileInput.displayName = \"FileInput\";\n","\"use client\";\n\nimport {\n Checkbox,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../../shadcnui\";\n\ntype FormCheckboxProps = {\n form: any;\n id: string;\n name: string;\n labelBefore?: boolean;\n description?: string;\n isRequired?: boolean;\n};\n\nexport function FormCheckbox({ form, id, name, labelBefore, description, isRequired }: FormCheckboxProps) {\n const simpleLabel = () => {\n return (\n <FormLabel htmlFor={id} className={`font-normal ${labelBefore ? \"\" : \"ml-3\"}`}>\n {name}\n </FormLabel>\n );\n };\n\n const label = () => {\n if (description) return simpleLabel();\n else\n return (\n <Tooltip>\n <TooltipTrigger asChild>{simpleLabel()}</TooltipTrigger>\n <TooltipContent>{description}</TooltipContent>\n </Tooltip>\n );\n };\n\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n <FormControl>\n <div className=\"flex gap-x-4\">\n {labelBefore && label()}\n {labelBefore && isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n <Checkbox id={id} defaultChecked={field.value} onCheckedChange={field.onChange} />\n {!labelBefore && label()}\n {!labelBefore && isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { ReactElement } from \"react\";\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage } from \"../../shadcnui\";\n\nexport function FormContainerGeneric({\n form,\n id,\n name,\n children,\n isRequired = false,\n}: {\n form: any;\n id: string;\n name?: string;\n children: ReactElement<any>;\n isRequired?: boolean;\n}) {\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n {name && (\n <FormLabel className=\"flex items-center\">\n <span>{name}</span>\n {isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </FormLabel>\n )}\n <FormControl>{children}</FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { isValid, parse } from \"date-fns\";\nimport { Calendar as CalendarIcon, CircleXIcon } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport { useI18nDateFnsLocale, useI18nLocale } from \"../../i18n\";\nimport {\n Calendar,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../shadcnui\";\n\nexport function FormDate({\n form,\n id,\n name,\n minDate,\n onChange,\n isRequired = false,\n}: {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n minDate?: Date;\n onChange?: (date?: Date) => Promise<void>;\n isRequired?: boolean;\n}) {\n const locale = useI18nLocale();\n const dateFnsLocale = useI18nDateFnsLocale();\n const [open, setOpen] = useState<boolean>(false);\n const [displayMonth, setDisplayMonth] = useState<Date>(() => {\n const currentValue = form.getValues(id);\n return currentValue || new Date();\n });\n\n // Locale-aware date formatter\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(locale, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }),\n [locale],\n );\n\n // Format date for display\n const formatDate = (date: Date): string => dateFormatter.format(date);\n\n // Get placeholder based on locale format\n const datePlaceholder = useMemo(() => {\n const parts = dateFormatter.formatToParts(new Date(2000, 0, 1));\n return parts\n .map((part) => {\n if (part.type === \"day\") return \"dd\";\n if (part.type === \"month\") return \"mm\";\n if (part.type === \"year\") return \"yyyy\";\n return part.value;\n })\n .join(\"\");\n }, [dateFormatter]);\n\n // Get date-fns format string from locale\n const dateFormatPattern = useMemo(() => {\n const parts = dateFormatter.formatToParts(new Date(2000, 0, 1));\n return parts\n .map((part) => {\n if (part.type === \"day\") return \"dd\";\n if (part.type === \"month\") return \"MM\";\n if (part.type === \"year\") return \"yyyy\";\n return part.value;\n })\n .join(\"\");\n }, [dateFormatter]);\n\n const [inputValue, setInputValue] = useState<string>(() => {\n const currentValue = form.getValues(id);\n return currentValue ? formatDate(currentValue) : \"\";\n });\n\n // Generate year options (1900 to current year)\n const currentYear = new Date().getFullYear();\n const yearOptions = Array.from({ length: currentYear - 1900 + 1 }, (_, i) => 1900 + i);\n\n // Generate month names dynamically based on current locale\n const monthNames = useMemo(() => {\n const formatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n return Array.from({ length: 12 }, (_, i) => {\n const monthName = formatter.format(new Date(2000, i, 1));\n return monthName.charAt(0).toUpperCase() + monthName.slice(1);\n });\n }, [locale]);\n\n // Handle text input change\n const handleInputChange = (value: string, field: any) => {\n setInputValue(value);\n\n // Try to parse the date using locale format\n const parsedDate = parse(value, dateFormatPattern, new Date());\n\n if (isValid(parsedDate)) {\n field.onChange(parsedDate);\n setDisplayMonth(parsedDate);\n if (onChange) onChange(parsedDate);\n } else if (value === \"\") {\n field.onChange(undefined);\n if (onChange) onChange(undefined);\n }\n };\n\n // Handle calendar selection\n const handleCalendarSelect = (selectedDate: Date | undefined, field: any) => {\n field.onChange(selectedDate);\n if (selectedDate) {\n setInputValue(formatDate(selectedDate));\n setDisplayMonth(selectedDate);\n } else {\n setInputValue(\"\");\n }\n if (onChange) onChange(selectedDate);\n };\n\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"} w-full`}>\n {name && (\n <FormLabel className=\"dlex items-center\">\n {name} {isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </FormLabel>\n )}\n <FormControl>\n <div className=\"relative\">\n <Popover open={open} onOpenChange={setOpen} modal={true}>\n <div className=\"relative\">\n <Input\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value, field)}\n placeholder={datePlaceholder}\n className=\"pr-16\"\n />\n <div className=\"absolute right-1 top-1/2 flex -translate-y-1/2 items-center space-x-1\">\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md\"\n >\n <CalendarIcon className=\"h-4 w-4 opacity-50\" />\n </button>\n </PopoverTrigger>\n {field.value && (\n <button\n type=\"button\"\n className=\"hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md\"\n onClick={() => {\n field.onChange(undefined);\n setInputValue(\"\");\n if (onChange) onChange(undefined);\n }}\n >\n <CircleXIcon className=\"h-4 w-4 opacity-50 hover:opacity-100\" />\n </button>\n )}\n </div>\n </div>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <div className=\"p-3\">\n {/* Year and Month Selectors */}\n <div className=\"mb-3 flex gap-2\">\n <Select\n value={displayMonth.getMonth().toString()}\n onValueChange={(value) => {\n const newMonth = parseInt(value);\n const newDate = new Date(displayMonth.getFullYear(), newMonth, 1);\n setDisplayMonth(newDate);\n }}\n >\n <SelectTrigger className=\"w-[130px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {monthNames.map((month, index) => (\n <SelectItem key={index} value={index.toString()}>\n {month}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Select\n value={displayMonth.getFullYear().toString()}\n onValueChange={(value) => {\n const newYear = parseInt(value);\n const newDate = new Date(newYear, displayMonth.getMonth(), 1);\n setDisplayMonth(newDate);\n }}\n >\n <SelectTrigger className=\"w-[80px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {yearOptions.reverse().map((year) => (\n <SelectItem key={year} value={year.toString()}>\n {year}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Calendar */}\n <Calendar\n mode=\"single\"\n selected={field.value}\n onSelect={(e) => {\n handleCalendarSelect(e, field);\n setOpen(false);\n }}\n disabled={(date) => (minDate && date < minDate ? true : false)}\n locale={dateFnsLocale}\n weekStartsOn={1}\n month={displayMonth}\n onMonthChange={setDisplayMonth}\n />\n </div>\n </PopoverContent>\n </Popover>\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Calendar as CalendarIcon, CircleXIcon } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport { useI18nDateFnsLocale, useI18nLocale, useI18nTranslations } from \"../../i18n\";\nimport {\n Button,\n Calendar,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\nexport function FormDateTime({\n form,\n id,\n name,\n minDate,\n onChange,\n allowEmpty,\n}: {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n minDate?: Date;\n onChange?: (date?: Date) => Promise<void>;\n allowEmpty?: boolean;\n}) {\n const [open, setOpen] = useState<boolean>(false);\n const t = useI18nTranslations();\n const locale = useI18nLocale();\n const dateFnsLocale = useI18nDateFnsLocale();\n\n // Locale-aware date-time formatter\n const dateTimeFormatter = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n [locale],\n );\n\n // Format date-time for display\n const formatDateTime = (date: Date): string => dateTimeFormatter.format(date);\n\n const [selectedHours, setSelectedHours] = useState<number>(new Date().getHours());\n const [selectedMinutes, setSelectedMinutes] = useState<number>(roundToNearestFiveMinutes(new Date().getMinutes()));\n\n const hoursOptions = Array.from({ length: 24 }, (_, i) => {\n const hour = i;\n return {\n value: hour,\n label: hour.toString().padStart(2, \"0\"),\n };\n });\n\n const minutesOptions = Array.from({ length: 12 }, (_, i) => {\n const minute = i * 5;\n return {\n value: minute,\n label: minute.toString().padStart(2, \"0\"),\n };\n });\n\n function roundToNearestFiveMinutes(minutes: number): number {\n return (Math.round(minutes / 5) * 5) % 60;\n }\n\n const handleTimeChange = (hours: number, minutes: number) => {\n const currentDate = form.getValues(id);\n if (currentDate) {\n const updatedDate = new Date(currentDate);\n updatedDate.setHours(hours);\n updatedDate.setMinutes(minutes);\n form.setValue(id, updatedDate);\n if (onChange) onChange(updatedDate);\n }\n };\n\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"} w-full`}>\n {name && <FormLabel>{name}</FormLabel>}\n <FormControl>\n <div className=\"relative flex flex-row\">\n <Popover open={open} onOpenChange={setOpen} modal={true}>\n <div className=\"flex w-full flex-row items-center justify-between\">\n <PopoverTrigger asChild>\n <FormControl>\n <Button\n variant={\"outline\"}\n className={cn(\"w-full pl-3 text-left font-normal\", !field.value && \"text-muted-foreground\")}\n >\n {field.value ? formatDateTime(field.value) : <span>{t(`generic.pick_date_time`)}</span>}\n <CalendarIcon className=\"ml-auto h-4 w-4 opacity-50\" />\n </Button>\n </FormControl>\n </PopoverTrigger>\n {field.value && allowEmpty !== false && (\n <CircleXIcon\n className=\"text-muted hover:text-destructive ml-2 h-6 w-6 cursor-pointer\"\n onClick={() => {\n if (onChange) onChange(undefined);\n form.setValue(id, \"\");\n }}\n />\n )}\n </div>\n <PopoverContent className=\"w-auto p-4\" align=\"start\">\n <div className=\"flex flex-col space-y-4\">\n <Calendar\n mode=\"single\"\n selected={field.value}\n onSelect={(date) => {\n if (date) {\n // Preserve the current time when selecting a new date\n const newDate = new Date(date);\n if (field.value) {\n const currentDate = new Date(field.value);\n newDate.setHours(currentDate.getHours(), currentDate.getMinutes());\n } else {\n newDate.setHours(selectedHours, selectedMinutes);\n }\n form.setValue(id, newDate);\n if (onChange) onChange(newDate);\n\n // Update time state values\n setSelectedHours(newDate.getHours());\n setSelectedMinutes(roundToNearestFiveMinutes(newDate.getMinutes()));\n }\n }}\n disabled={(date) => (minDate && date < minDate ? true : false)}\n locale={dateFnsLocale}\n />\n <div className=\"flex flex-row items-end justify-center space-x-4\">\n <div className=\"flex flex-col space-y-2\">\n <Label htmlFor=\"hours-select\">{t(`generic.hours`)}</Label>\n <Select\n value={String(field.value ? new Date(field.value).getHours() : selectedHours)}\n onValueChange={(value) => {\n const hours = parseInt(value);\n setSelectedHours(hours);\n handleTimeChange(\n hours,\n field.value\n ? roundToNearestFiveMinutes(new Date(field.value).getMinutes())\n : selectedMinutes,\n );\n }}\n >\n <SelectTrigger id=\"hours-select\" className=\"w-[70px]\">\n <SelectValue placeholder=\"Hour\" />\n </SelectTrigger>\n <SelectContent>\n {hoursOptions.map((option) => (\n <SelectItem key={option.value} value={String(option.value)}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"mb-[9px] text-xl\">:</div>\n <div className=\"flex flex-col space-y-2\">\n <Label htmlFor=\"minutes-select\">{t(`generic.minutes`)}</Label>\n <Select\n value={String(\n field.value\n ? roundToNearestFiveMinutes(new Date(field.value).getMinutes())\n : selectedMinutes,\n )}\n onValueChange={(value) => {\n const minutes = parseInt(value);\n setSelectedMinutes(minutes);\n handleTimeChange(field.value ? new Date(field.value).getHours() : selectedHours, minutes);\n }}\n >\n <SelectTrigger id=\"minutes-select\" className=\"w-[70px]\">\n <SelectValue placeholder=\"Min\" />\n </SelectTrigger>\n <SelectContent>\n {minutesOptions.map((option) => (\n <SelectItem key={option.value} value={String(option.value)}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <Button\n className=\"mt-2\"\n onClick={() => {\n setOpen(false);\n }}\n >\n {t(`generic.buttons.select_date`)}\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport React from \"react\";\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from \"../../shadcnui\";\n\nexport function FormInput({\n form,\n id,\n name,\n placeholder,\n type,\n onBlur,\n disabled,\n onKeyDown,\n autoFocus,\n onChange,\n testId,\n isRequired = false,\n}: {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n type?: \"text\" | \"number\" | \"currency\" | \"password\" | \"link\";\n onBlur?: () => Promise<void>;\n disabled?: boolean;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n autoFocus?: boolean;\n onChange?: (value: string | number) => Promise<void>;\n testId?: string;\n isRequired?: boolean;\n}) {\n const t = useTranslations();\n\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => {\n const handleBlur = async (e: React.FocusEvent<HTMLInputElement>) => {\n let value = e.target.value;\n\n if (type === \"link\" && value) {\n if (!/^https?:\\/\\//i.test(value)) {\n value = \"https://\" + value;\n field.onChange(value);\n }\n try {\n new URL(value);\n form.clearErrors(id);\n } catch (error) {\n form.setError(id, {\n type: \"validate\",\n message: t(`generic.errors.valid_url`),\n });\n }\n }\n\n if (onBlur) await onBlur();\n field.onBlur();\n };\n\n return (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n {name && (\n <FormLabel className=\"flex items-center\">\n {name}\n {isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </FormLabel>\n )}\n <FormControl>\n <div className=\"relative\">\n {type === \"currency\" && (\n <span className=\"text-muted-foreground absolute top-0 left-0 pt-2 pl-3\">€</span>\n )}\n <Input\n data-testid={testId}\n {...field}\n autoFocus={autoFocus === true}\n type={\n type === \"number\" || type === \"currency\" ? \"number\" : type === \"password\" ? \"password\" : \"text\"\n }\n className={`w-full ${type === \"number\" || type === \"currency\" ? \"text-end\" : \"\"}`}\n disabled={disabled === true || form.formState.isSubmitting}\n placeholder={placeholder || \"\"}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n onChange={(e) => {\n if (type === \"number\" || type === \"currency\") {\n const value = e.target.value.replace(/[^0-9]/g, \"\");\n field.onChange(+value);\n if (onChange) onChange(+value);\n } else {\n field.onChange(e.target.value);\n if (onChange) onChange(e.target.value);\n }\n }}\n />\n </div>\n </FormControl>\n <FormMessage data-testid={testId ? `${testId}-error` : undefined} />\n </FormItem>\n );\n }}\n />\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { EyeIcon, EyeOffIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { Button, Input } from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\nexport interface PasswordInputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(({ className, type, ...props }, ref) => {\n const [showPassword, setShowPassword] = React.useState(false);\n const disabled = props.value === \"\" || props.value === undefined || props.disabled;\n const t = useTranslations();\n\n return (\n <div className=\"relative\">\n <Input type={showPassword ? \"text\" : \"password\"} className={cn(\"\", className)} ref={ref} {...props} />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute right-0 top-0 h-full px-3 py-2 hover:bg-transparent\"\n onClick={() => setShowPassword((prev) => !prev)}\n disabled={disabled}\n >\n {showPassword && !disabled ? (\n <EyeIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <EyeOffIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n <span className=\"sr-only\">{showPassword ? t(`generic.hide_password`) : t(`generic.show_password`)}</span>\n </Button>\n\n <style>{`\n\t\t\t\t\t.hide-password-toggle::-ms-reveal,\n\t\t\t\t\t.hide-password-toggle::-ms-clear {\n\t\t\t\t\t\tvisibility: hidden;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t}\n\t\t\t\t`}</style>\n </div>\n );\n});\nPasswordInput.displayName = \"PasswordInput\";\n\nexport { PasswordInput };\n","\"use client\";\n\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage } from \"../../shadcnui\";\nimport { PasswordInput } from \"./PasswordInput\";\n\nexport function FormPassword({\n form,\n id,\n name,\n placeholder,\n onBlur,\n disabled,\n testId,\n isRequired,\n}: {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n onBlur?: () => Promise<void>;\n disabled?: boolean;\n testId?: string;\n isRequired?: boolean;\n}) {\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n {name && (\n <FormLabel>\n {name}\n {isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </FormLabel>\n )}\n <FormControl>\n <PasswordInput\n {...field}\n className={`w-full`}\n disabled={disabled === true || form.formState.isSubmitting}\n placeholder={placeholder ? placeholder : \"\"}\n onBlur={onBlur}\n data-testid={testId}\n />\n </FormControl>\n <FormMessage data-testid={testId ? `${testId}-error` : undefined} />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Input } from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\n/**\n * FormPlaceAutocomplete component integrates Google Places API (New)\n * to provide address suggestions as the user types.\n *\n * Prerequisites:\n * 1. Set NEXT_PUBLIC_GOOGLE_MAPS_API_KEY environment variable\n * 2. Enable Places API (New) in Google Cloud Console\n * 3. Configure API key restrictions as needed\n *\n * Note: This uses the new Places API via REST calls, not the legacy JavaScript API\n */\n\ninterface PlaceSuggestion {\n place_id: string;\n description: string;\n structured_formatting: {\n main_text: string;\n secondary_text: string;\n };\n}\n\ninterface PlaceAutocompleteProps {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n disabled?: boolean;\n testId?: string;\n isRequired?: boolean;\n onPlaceSelect?: (place: PlaceSuggestion) => void;\n className?: string;\n /**\n * Optional array of place types to include in search results.\n * When not specified, defaults to address types: [\"street_address\", \"premise\", \"subpremise\"]\n * For cities, use: [\"locality\", \"administrative_area_level_3\"]\n * For regions, use: [\"administrative_area_level_1\", \"administrative_area_level_2\"]\n */\n includeTypes?: string[];\n}\n\nexport function FormPlaceAutocomplete({\n form,\n id,\n name,\n placeholder,\n disabled,\n testId,\n isRequired = false,\n onPlaceSelect,\n className,\n includeTypes,\n}: PlaceAutocompleteProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState<PlaceSuggestion[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [loadError, setLoadError] = useState(false);\n const [apiKey, setApiKey] = useState<string | null>(null);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Initialize API key\n useEffect(() => {\n const key = process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY;\n\n if (!key) {\n console.error(\"Google Maps API key not found. Please set NEXT_PUBLIC_GOOGLE_MAPS_API_KEY environment variable.\");\n setLoadError(true);\n return;\n }\n\n setApiKey(key);\n }, []);\n\n // Update input value when form value changes\n useEffect(() => {\n const formValue = form.getValues(id);\n if (formValue !== inputValue) {\n setInputValue(formValue || \"\");\n }\n }, [form.watch(id), id, inputValue]);\n\n // Fetch place suggestions from Google Places API (New)\n const fetchSuggestions = async (input: string) => {\n if (!apiKey) return;\n\n try {\n setIsLoading(true);\n\n // Using the new Places API autocomplete endpoint\n const response = await fetch(`https://places.googleapis.com/v1/places:autocomplete`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Goog-Api-Key\": apiKey,\n },\n body: JSON.stringify({\n input: input,\n includedPrimaryTypes: includeTypes || [\"street_address\", \"premise\", \"subpremise\"],\n languageCode: \"en\",\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Places API error: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data.suggestions) {\n const formattedSuggestions: PlaceSuggestion[] = data.suggestions.map((suggestion: any) => ({\n place_id: suggestion.placePrediction?.placeId || \"\",\n description: suggestion.placePrediction?.text?.text || \"\",\n structured_formatting: {\n main_text: suggestion.placePrediction?.structuredFormat?.mainText?.text || \"\",\n secondary_text: suggestion.placePrediction?.structuredFormat?.secondaryText?.text || \"\",\n },\n }));\n\n setSuggestions(formattedSuggestions);\n setShowSuggestions(true);\n } else {\n setSuggestions([]);\n }\n } catch (error) {\n console.error(\"Error fetching place suggestions:\", error);\n setSuggestions([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Handle input changes with debouncing\n const handleInputChange = (value: string) => {\n setInputValue(value);\n form.setValue(id, value);\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n if (value.length > 2 && apiKey) {\n debounceRef.current = setTimeout(() => {\n fetchSuggestions(value);\n }, 300);\n } else {\n setSuggestions([]);\n setShowSuggestions(false);\n setIsLoading(false);\n }\n };\n\n // Handle suggestion selection\n const handleSuggestionSelect = (suggestion: PlaceSuggestion) => {\n setInputValue(suggestion.description);\n form.setValue(id, suggestion.description);\n setShowSuggestions(false);\n setSuggestions([]);\n\n if (onPlaceSelect) {\n onPlaceSelect(suggestion);\n }\n };\n\n // Close suggestions when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setShowSuggestions(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n // Cleanup debounce on unmount\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, []);\n\n // Fallback to regular input if API key is not available\n if (loadError) {\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n {name && (\n <FormLabel className=\"flex items-center\">\n {name}\n {isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </FormLabel>\n )}\n <FormControl>\n <Input\n {...field}\n placeholder={placeholder}\n disabled={disabled}\n data-testid={testId}\n className={cn(\"w-full\", className)}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col\" ref={containerRef}>\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n {name && (\n <FormLabel className=\"flex items-center\">\n {name}\n {isRequired && <span className=\"text-destructive ml-2 font-semibold\">*</span>}\n </FormLabel>\n )}\n <FormControl>\n <div className=\"relative\">\n <Input\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value)}\n onBlur={field.onBlur}\n onFocus={() => {\n if (suggestions.length > 0) {\n setShowSuggestions(true);\n }\n }}\n placeholder={placeholder}\n disabled={disabled || !apiKey}\n data-testid={testId}\n className={cn(\"w-full\", className)}\n />\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <div className=\"border-primary h-4 w-4 animate-spin rounded-full border-2 border-t-transparent\"></div>\n </div>\n )}\n\n {/* Suggestions dropdown */}\n {showSuggestions && suggestions.length > 0 && (\n <div className=\"bg-background absolute left-0 right-0 top-full z-50 mt-1 max-h-60 overflow-auto rounded-md border shadow-lg\">\n {suggestions.map((suggestion, index) => (\n <div\n key={suggestion.place_id || index}\n className=\"hover:bg-muted cursor-pointer px-3 py-2 text-sm\"\n onClick={() => handleSuggestionSelect(suggestion)}\n >\n <div className=\"font-medium\">{suggestion.structured_formatting?.main_text}</div>\n <div className=\"text-muted-foreground\">{suggestion.structured_formatting?.secondary_text}</div>\n </div>\n ))}\n </div>\n )}\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport {\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../shadcnui\";\n\nexport function FormSelect({\n form,\n id,\n name,\n placeholder,\n disabled,\n values,\n onChange,\n useRows,\n testId,\n}: {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n disabled?: boolean;\n values: { id: string; text: string }[];\n onChange?: (value: string) => void;\n useRows?: boolean;\n testId?: string;\n}) {\n return (\n <div className={`flex w-full flex-col`}>\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`flex w-full ${useRows ? `flex-row items-center justify-between gap-x-4` : `flex-col`}`}>\n {name && <FormLabel className={`${useRows ? `min-w-28` : ``}`}>{name}</FormLabel>}\n <Select\n onValueChange={(e) => {\n field.onChange(e);\n if (onChange) onChange(e);\n }}\n defaultValue={field.value}\n data-testid={testId}\n >\n <FormControl className=\"w-full\">\n <SelectTrigger>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n {values.map((type: { id: string; text: string }) => (\n <SelectItem key={type.id} value={type.id}>\n {type.text}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useWatch } from \"react-hook-form\";\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Slider } from \"../../shadcnui\";\n\nexport function FormSlider({\n form,\n id,\n name,\n disabled,\n showPercentage,\n}: {\n form: any;\n id: string;\n name?: string;\n placeholder?: string;\n disabled?: boolean;\n showPercentage?: boolean;\n}) {\n const value = useWatch({ control: form.control, name: id });\n\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n {name && <FormLabel>{name}</FormLabel>}\n <FormControl>\n <div>\n {showPercentage && (\n <div className=\"text-muted-foreground mb-2 flex w-full justify-center text-xs\">{`${value}%`}</div>\n )}\n <Slider\n onValueChange={(value: number[]) => form.setValue(id, value[0])}\n value={[value]}\n max={100}\n step={5}\n disabled={disabled === true || form.formState.isSubmitting}\n />\n {/* </div> */}\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Switch } from \"../../shadcnui\";\n\nexport function FormSwitch({ form, id, name, disabled }: { form: any; id: string; name?: string; disabled?: boolean }) {\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className={`${name ? \"mb-5\" : \"mb-1\"}`}>\n <FormControl>\n <div className=\"flex flex-row gap-x-4\">\n <Switch checked={field.value} onCheckedChange={field.onChange} />\n {name && <FormLabel>{name}</FormLabel>}\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, Textarea } from \"../../shadcnui\";\nimport { cn } from \"../../utils\";\n\nexport function FormTextarea({\n form,\n id,\n name,\n className,\n placeholder,\n testId,\n}: {\n form: any;\n id: string;\n name: string;\n placeholder?: string;\n className?: string;\n testId?: string;\n}) {\n return (\n <div className=\"flex w-full flex-col\">\n <FormField\n control={form.control}\n name={id}\n render={({ field }) => (\n <FormItem className=\"mb-5\">\n <FormLabel>{name}</FormLabel>\n <FormControl>\n <Textarea\n {...field}\n className={cn(\"min-h-96 w-full\", className)}\n disabled={form.formState.isSubmitting}\n placeholder={placeholder}\n data-testid={testId}\n />\n </FormControl>\n <FormMessage data-testid={testId ? `${testId}-error` : undefined} />\n </FormItem>\n )}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { ReactNode, useEffect, useRef, useState } from \"react\";\nimport { useUrlRewriter } from \"../../hooks/url.rewriter\";\nimport { ModuleWithPermissions } from \"../../permissions\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../shadcnui\";\n\nexport type PageContainerItems = {\n title: string;\n content: ReactNode;\n};\n\ntype PageContainerContentDetailsProps = {\n items: PageContainerItems[];\n section?: string;\n module: ModuleWithPermissions;\n id: string;\n};\n\nexport function PageContainerContentDetails({ items, section, module, id }: PageContainerContentDetailsProps) {\n const rewriteUrl = useUrlRewriter();\n const [isScrolled, setIsScrolled] = useState<boolean>(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n // Use IntersectionObserver to detect when content scrolls past the TabsList\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n // When sentinel is not visible (scrolled past), show border\n setIsScrolled(!entry.isIntersecting);\n },\n {\n threshold: 0,\n rootMargin: \"0px\",\n },\n );\n\n observer.observe(sentinel);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return (\n <Tabs\n defaultValue={section || items[0].title}\n onValueChange={(a) => rewriteUrl({ page: module, id: id, childPage: a })}\n >\n {/* Sentinel element - invisible, used to detect scroll position */}\n <div ref={sentinelRef} className=\"h-0\" />\n\n {/* Sticky TabsList with conditional border */}\n <div className={`bg-background sticky top-0 z-10 mb-2 pb-2 transition-shadow ${isScrolled ? \"border-b\" : \"\"}`}>\n <TabsList>\n {items.map((item) => (\n <TabsTrigger key={item.title} value={item.title}>\n {item.title}\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n\n <div className=\"pr-4\">\n {items.map((item) => (\n <TabsContent key={item.title} value={item.title}>\n {item.content}\n </TabsContent>\n ))}\n </div>\n </Tabs>\n );\n}\n","\"use client\";\n\nimport { ReactNode } from \"react\";\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from \"../../shadcnui\";\n\ntype PageContentContainerProps = {\n details: ReactNode;\n footer?: ReactNode;\n content?: ReactNode;\n};\n\nexport function PageContentContainer({ details, footer, content }: PageContentContainerProps) {\n return (\n <div className=\"flex h-[calc(100vh-(--spacing(16)))] w-full\">\n <ResizablePanelGroup direction=\"horizontal\" className=\"items-stretch\" autoSaveId=\"page-content-layout\">\n <ResizablePanel id=\"left-panel\" defaultSize={32} minSize={20} maxSize={40}>\n <div className=\"@container flex h-full flex-col pr-4\">\n <div className=\"flex-1 overflow-y-auto\">{details}</div>\n\n {/* Sticky footer - always visible at bottom */}\n {footer && <div className=\"flex flex-col gap-y-2 pt-2 pb-2\">{footer}</div>}\n </div>\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel id=\"right-panel\" className=\"pl-4\">\n <div className=\"h-full overflow-y-auto\">{content}</div>\n </ResizablePanel>\n </ResizablePanelGroup>\n </div>\n );\n}\n","import { ColumnDef } from \"@tanstack/react-table\";\nimport React from \"react\";\n\nexport const cellComponent = (params: {\n id: string;\n name: string;\n title: string;\n component: React.ReactNode;\n}): ColumnDef<any> => {\n return {\n id: params.name,\n accessorKey: params.name,\n header: params.title,\n cell: ({ row }) => params.component,\n enableSorting: false,\n enableHiding: false,\n };\n};\n","import { ColumnDef } from \"@tanstack/react-table\";\n\nexport const cellDate = (params: { name: string; title: string }): ColumnDef<any> => {\n return {\n id: params.name,\n accessorKey: params.name,\n header: params.title,\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-xs\">\n {row.getValue<Date>(params.name).toLocaleDateString(\"en\", { dateStyle: \"medium\" })}\n </span>\n ),\n enableSorting: false,\n enableHiding: false,\n };\n};\n","import { ColumnDef } from \"@tanstack/react-table\";\nimport { Checkbox } from \"../../../shadcnui\";\n\nexport const cellId = (params: {\n name: string;\n checkedIds?: string[];\n toggleId?: (id: string) => void;\n}): ColumnDef<any> => {\n return {\n id: params.name,\n accessorKey: params.name,\n header: \"\",\n cell: ({ row }) =>\n params.toggleId ? (\n <Checkbox\n checked={params.checkedIds?.includes(row.getValue(params.name)) || false}\n onCheckedChange={(value) => {\n row.toggleSelected(!!value);\n params.toggleId?.(row.getValue(params.name));\n }}\n aria-label=\"Select row\"\n />\n ) : null,\n enableSorting: false,\n enableHiding: true,\n };\n};\n","import { ColumnDef } from \"@tanstack/react-table\";\nimport { Link } from \"../../../shadcnui\";\n\nexport const cellLink = <T,>(params: {\n id: string;\n name: string;\n title: string;\n generateUrl: (id: string) => string;\n}): ColumnDef<T> => {\n return {\n id: params.name,\n accessorKey: params.name,\n header: params.title,\n cell: ({ row }) => <Link href={params.generateUrl(row.getValue(params.id))}>{row.getValue(params.name)}</Link>,\n enableSorting: false,\n enableHiding: false,\n };\n};\n","import { ColumnDef } from \"@tanstack/react-table\";\nimport { Link } from \"../../../shadcnui\";\n\nexport const cellUrl = (params: { name: string; title: string }): ColumnDef<any> => {\n return {\n id: params.name,\n accessorKey: params.name,\n header: params.title,\n cell: ({ row }) => <Link href={row.getValue(params.name)}>{row.getValue(params.name)}</Link>,\n enableSorting: false,\n enableHiding: false,\n };\n};\n","\"use client\";\n\nimport { flexRender, getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\n\nimport { CaretLeftIcon, CaretRightIcon } from \"@radix-ui/react-icons\";\nimport { ReactNode, memo, useMemo } from \"react\";\nimport { DataListRetriever, useTableGenerator } from \"../../hooks\";\nimport { ModuleWithPermissions } from \"../../permissions\";\nimport { Button, Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow } from \"../../shadcnui\";\nimport { ContentTableSearch } from \"./ContentTableSearch\";\n\nconst EMPTY_ARRAY: any[] = [];\n\nexport type GenerateTableStructureParams = {\n data: any[];\n toggleValueToFormIdsId: (id: string, name: string) => void;\n isSelected: (id: string) => boolean;\n};\n\ntype ContentListTableProps = {\n title?: string;\n data: DataListRetriever<any>;\n tableGenerator?: never;\n tableGeneratorType: ModuleWithPermissions;\n fields: any[];\n checkedIds?: string[];\n toggleId?: (id: string) => void;\n functions?: ReactNode;\n filters?: ReactNode;\n allowSearch?: boolean;\n context?: Record<string, any>;\n};\n\nexport const ContentListTable = memo(function ContentListTable(props: ContentListTableProps) {\n const { data, fields, checkedIds, toggleId, allowSearch, filters } = props;\n\n const { data: tableData, columns: tableColumns } = useTableGenerator(props.tableGeneratorType, {\n data: data?.data ?? EMPTY_ARRAY,\n fields: fields,\n checkedIds: checkedIds,\n toggleId: toggleId,\n dataRetriever: data,\n context: props.context,\n });\n\n const columnVisibility = useMemo(\n () =>\n fields.reduce(\n (acc, columnId) => {\n acc[columnId] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n ),\n [fields],\n );\n\n const table = useReactTable({\n data: tableData,\n columns: tableColumns,\n getCoreRowModel: getCoreRowModel(),\n initialState: {\n columnVisibility,\n },\n });\n\n // if (!data.isLoaded || !data.data) {\n // return <ContentListTableLoader />;\n // }\n\n const rowModel = tableData ? table.getRowModel() : null;\n const showFooter = !!(props.functions || data.next || data.previous);\n\n return (\n <div className=\"flex w-full flex-col\">\n <div className=\"overflow-hidden rounded-md border\">\n <Table>\n <TableHeader className=\"bg-muted font-semibold\">\n {props.title && (\n <TableRow>\n <TableHead className=\"bg-card text-primary p-4 text-left font-bold\" colSpan={tableColumns.length}>\n <div className=\"flex w-full items-center justify-between gap-x-2\">\n <div className=\"w-full\">{props.title}</div>\n {(props.functions || props.filters || allowSearch) && (\n <>\n {props.functions}\n {props.filters}\n <ContentTableSearch data={data} />\n </>\n )}\n </div>\n </TableHead>\n </TableRow>\n )}\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n return (\n <TableHead key={header.id}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n );\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {rowModel && rowModel.rows?.length ? (\n rowModel.rows.map((row) => (\n <TableRow key={row.id}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={tableColumns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n {showFooter && (\n <TableFooter>\n <TableRow>\n <TableCell colSpan={tableColumns.length} className=\"bg-card py-4 text-right\">\n <div className=\"flex items-center justify-end space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={(e) => {\n e.preventDefault();\n data.previous?.(true);\n }}\n disabled={!data.previous}\n >\n <CaretLeftIcon className=\"h-4 w-4\" />\n </Button>\n {data.pageInfo && (\n <span className=\"text-muted-foreground text-xs\">\n {data.pageInfo.startItem}-{data.pageInfo.endItem}\n </span>\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={(e) => {\n e.preventDefault();\n data.next?.(true);\n }}\n disabled={!data.next}\n >\n <CaretRightIcon className=\"h-4 w-4\" />\n </Button>\n </div>\n </TableCell>\n </TableRow>\n </TableFooter>\n )}\n </Table>\n </div>\n </div>\n );\n});\n","\"use client\";\n\nimport { RefreshCw, Search, X } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { DataListRetriever, useDebounce } from \"../../hooks\";\nimport { Input } from \"../../shadcnui\";\n\ntype ContentTableSearchProps = {\n data: DataListRetriever<any>;\n};\n\nexport function ContentTableSearch({ data }: ContentTableSearchProps) {\n const t = useTranslations();\n const searchTermRef = useRef<string>(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const [isSearching, setIsSearching] = useState<boolean>(false);\n\n const isExpanded = isFocused || searchTerm.length > 0;\n\n const search = useCallback(\n async (searchedTerm: string) => {\n try {\n if (searchedTerm === searchTermRef.current) return;\n searchTermRef.current = searchedTerm;\n\n await data.search(searchedTerm);\n } finally {\n setIsSearching(false);\n }\n },\n [searchTermRef, data],\n );\n\n const updateSearchTerm = useDebounce(search, 500);\n\n useEffect(() => {\n setIsSearching(true);\n updateSearchTerm(searchTerm);\n }, [updateSearchTerm, searchTerm]);\n\n const handleSearchIconClick = () => {\n if (!isExpanded) {\n setIsFocused(true);\n // Small delay to ensure the input is rendered before focusing\n setTimeout(() => inputRef.current?.focus(), 50);\n }\n };\n\n const handleBlur = () => {\n // Auto-collapse only if search is empty\n if (searchTerm.length === 0) {\n setIsFocused(false);\n }\n };\n\n const handleClear = () => {\n setSearchTerm(\"\");\n search(\"\");\n setIsFocused(false);\n };\n\n return (\n <div\n className={`relative flex h-6 items-center text-xs font-normal transition-all duration-300 ease-in-out ${\n isExpanded ? \"w-64\" : \"w-6\"\n }`}\n >\n <Search\n className={`absolute top-1 left-1 h-4 w-4 transition-colors ${\n isExpanded ? \"text-muted-foreground\" : \"text-muted-foreground hover:text-foreground cursor-pointer\"\n }`}\n onClick={handleSearchIconClick}\n />\n {isExpanded && (\n <Input\n ref={inputRef}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n handleClear();\n }\n }}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n placeholder={t(`generic.search.placeholder_global`)}\n type=\"text\"\n className=\"border-border/50 focus-visible:border-border h-10 w-full pr-8 pl-8 text-xs shadow-none focus-visible:ring-0\"\n onChange={(e) => setSearchTerm(e.target.value)}\n value={searchTerm}\n />\n )}\n {isExpanded && isSearching && (\n <RefreshCw className=\"text-muted-foreground absolute top-1 right-1 h-4 w-4 animate-spin\" />\n )}\n {isExpanded && !isSearching && searchTermRef.current && (\n <X\n className=\"text-muted-foreground hover:text-foreground absolute top-1 right-1 h-4 w-4 cursor-pointer\"\n onClick={handleClear}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Fragment","Breadcrumb","useState","jsx","jsxs","useState","jsx","jsxs","Breadcrumb","jsx","useEffect","useState","jsx","jsxs","useState","useEffect","useTranslations","jsx","jsxs","useTranslations","jsx","jsxs","useTranslations","useEffect","useState","jsx","jsxs","useTranslations","useState","useEffect","Fragment","jsx","jsxs","jsx","jsxs","useTranslations","jsx","jsxs","useTranslations","jsx","jsx","jsxs","useTranslations","useEffect","useRef","useState","jsx","jsxs","useTranslations","useRef","useState","useEffect","useState","Fragment","jsx","jsxs","useState","useTranslations","jsx","jsxs","useTranslations","useTranslations","jsx","jsxs","useTranslations","useTranslations","jsx","useTranslations","useState","jsx","jsxs","useState","inputValue","value","CalendarIcon","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","CalendarIcon","useTranslations","useCallback","useEffect","useRef","useState","toast","jsx","jsxs","useState","useTranslations","useCallback","toast","useEffect","useRef","jsx","jsxs","jsx","jsxs","isValid","parse","CalendarIcon","CircleXIcon","useMemo","useState","jsx","jsxs","useState","useMemo","parse","isValid","CalendarIcon","CircleXIcon","CalendarIcon","CircleXIcon","useMemo","useState","jsx","jsxs","useState","useMemo","CalendarIcon","CircleXIcon","useTranslations","jsx","jsxs","useTranslations","React","useTranslations","jsx","jsxs","useTranslations","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","value","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","jsx","jsx","jsx","jsx","useMemo","useTranslations","useCallback","useEffect","useRef","useState","jsx","jsxs","useTranslations","useRef","useState","useCallback","useEffect","Fragment","jsx","jsxs","ContentListTable","useMemo"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -23,6 +23,7 @@ interface I18nConfig {
|
|
|
23
23
|
useLocale?: UseLocaleHook;
|
|
24
24
|
useDateFnsLocale?: UseDateFnsLocaleHook;
|
|
25
25
|
Link: LinkComponent;
|
|
26
|
+
usePathname: () => string;
|
|
26
27
|
}
|
|
27
28
|
declare function configureI18n(config: I18nConfig): void;
|
|
28
29
|
declare function useI18nRouter(): I18nRouter;
|
|
@@ -23,6 +23,7 @@ interface I18nConfig {
|
|
|
23
23
|
useLocale?: UseLocaleHook;
|
|
24
24
|
useDateFnsLocale?: UseDateFnsLocaleHook;
|
|
25
25
|
Link: LinkComponent;
|
|
26
|
+
usePathname: () => string;
|
|
26
27
|
}
|
|
27
28
|
declare function configureI18n(config: I18nConfig): void;
|
|
28
29
|
declare function useI18nRouter(): I18nRouter;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token parameters for authentication cookie management
|
|
3
|
+
*/
|
|
4
|
+
interface TokenParams {
|
|
5
|
+
token?: string;
|
|
6
|
+
refreshToken?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
companyId?: string;
|
|
9
|
+
licenseExpirationDate?: Date;
|
|
10
|
+
roles?: string[];
|
|
11
|
+
features?: string[];
|
|
12
|
+
modules?: {
|
|
13
|
+
id: string;
|
|
14
|
+
permissions: {
|
|
15
|
+
create: boolean | string;
|
|
16
|
+
read: boolean | string;
|
|
17
|
+
update: boolean | string;
|
|
18
|
+
delete: boolean | string;
|
|
19
|
+
};
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Token handler interface for dependency injection
|
|
24
|
+
* Apps must provide implementations of these functions via configureAuth()
|
|
25
|
+
*/
|
|
26
|
+
interface TokenHandler {
|
|
27
|
+
updateToken: (params: TokenParams) => Promise<void>;
|
|
28
|
+
removeToken: () => Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configure authentication token handling
|
|
32
|
+
* Call this at app startup to provide Server Actions for cookie management
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { configureAuth } from "@carlonicora/nextjs-jsonapi/features";
|
|
37
|
+
* import { updateToken, removeToken } from "@/features/auth/utils/AuthCookies";
|
|
38
|
+
*
|
|
39
|
+
* configureAuth({ updateToken, removeToken });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
declare function configureAuth(handler: TokenHandler): void;
|
|
43
|
+
/**
|
|
44
|
+
* Internal getter for AuthService to access the token handler
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
declare function getTokenHandler(): TokenHandler | null;
|
|
48
|
+
|
|
49
|
+
export { type TokenHandler as T, type TokenParams as a, configureAuth as c, getTokenHandler as g };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token parameters for authentication cookie management
|
|
3
|
+
*/
|
|
4
|
+
interface TokenParams {
|
|
5
|
+
token?: string;
|
|
6
|
+
refreshToken?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
companyId?: string;
|
|
9
|
+
licenseExpirationDate?: Date;
|
|
10
|
+
roles?: string[];
|
|
11
|
+
features?: string[];
|
|
12
|
+
modules?: {
|
|
13
|
+
id: string;
|
|
14
|
+
permissions: {
|
|
15
|
+
create: boolean | string;
|
|
16
|
+
read: boolean | string;
|
|
17
|
+
update: boolean | string;
|
|
18
|
+
delete: boolean | string;
|
|
19
|
+
};
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Token handler interface for dependency injection
|
|
24
|
+
* Apps must provide implementations of these functions via configureAuth()
|
|
25
|
+
*/
|
|
26
|
+
interface TokenHandler {
|
|
27
|
+
updateToken: (params: TokenParams) => Promise<void>;
|
|
28
|
+
removeToken: () => Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configure authentication token handling
|
|
32
|
+
* Call this at app startup to provide Server Actions for cookie management
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { configureAuth } from "@carlonicora/nextjs-jsonapi/features";
|
|
37
|
+
* import { updateToken, removeToken } from "@/features/auth/utils/AuthCookies";
|
|
38
|
+
*
|
|
39
|
+
* configureAuth({ updateToken, removeToken });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
declare function configureAuth(handler: TokenHandler): void;
|
|
43
|
+
/**
|
|
44
|
+
* Internal getter for AuthService to access the token handler
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
declare function getTokenHandler(): TokenHandler | null;
|
|
48
|
+
|
|
49
|
+
export { type TokenHandler as T, type TokenParams as a, configureAuth as c, getTokenHandler as g };
|