@solidxai/core-ui 0.1.16 → 0.1.17-beta.0
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/dist/components/auth/AuthLayout.d.ts.map +1 -1
- package/dist/components/auth/AuthLayout.js +15 -14
- package/dist/components/auth/AuthLayout.js.map +1 -1
- package/dist/components/auth/AuthLayout.tsx +35 -34
- package/dist/components/common/SettingsComponent.module.css +89 -0
- package/dist/components/common/SolidAdmin.js +2 -2
- package/dist/components/common/SolidAdmin.js.map +1 -1
- package/dist/components/common/SolidAdmin.tsx +2 -2
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +2 -2
- package/dist/components/core/card/CardItem.d.ts.map +1 -1
- package/dist/components/core/card/CardItem.js +1 -1
- package/dist/components/core/card/CardItem.js.map +1 -1
- package/dist/components/core/card/CardItem.tsx +4 -1
- package/dist/components/core/card/SolidCardView.js +1 -1
- package/dist/components/core/card/SolidCardView.js.map +1 -1
- package/dist/components/core/card/SolidCardView.tsx +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.js +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.tsx +1 -1
- package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanCard.js +2 -2
- package/dist/components/core/kanban/KanbanCard.js.map +1 -1
- package/dist/components/core/kanban/KanbanCard.tsx +5 -2
- package/dist/components/core/kanban/SolidKanbanView.js +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.js +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +1 -1
- package/dist/components/core/list/SolidListView.js +6 -6
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +4 -4
- package/dist/components/core/list/SolidListViewConfigure.js +1 -1
- package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.tsx +1 -1
- package/dist/components/core/locales/SolidLocale.d.ts.map +1 -1
- package/dist/components/core/locales/SolidLocale.js +1 -1
- package/dist/components/core/locales/SolidLocale.js.map +1 -1
- package/dist/components/core/locales/SolidLocale.tsx +1 -0
- package/dist/components/core/locales/solid-locale.css +9 -0
- package/dist/components/core/model/FieldMetaData.js +1 -1
- package/dist/components/core/model/FieldMetaData.js.map +1 -1
- package/dist/components/core/model/FieldMetaData.tsx +1 -1
- package/dist/components/core/model/FieldMetaDataForm.css +60 -0
- package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.js +47 -36
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.tsx +59 -40
- package/dist/components/core/model/ModelMetaData.js +1 -1
- package/dist/components/core/model/ModelMetaData.js.map +1 -1
- package/dist/components/core/model/ModelMetaData.tsx +1 -1
- package/dist/components/core/module/CreateModule.d.ts.map +1 -1
- package/dist/components/core/module/CreateModule.js +34 -21
- package/dist/components/core/module/CreateModule.js.map +1 -1
- package/dist/components/core/module/CreateModule.tsx +59 -21
- package/dist/components/core/module/ModuleMetadataExplorer.css +72 -2
- package/dist/components/core/tree/SolidTreeView.js +2 -2
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +2 -2
- package/dist/components/core/users/CreateUserRole.js +1 -1
- package/dist/components/core/users/CreateUserRole.js.map +1 -1
- package/dist/components/core/users/CreateUserRole.tsx +1 -1
- package/dist/components/layout/AdminTopHeader.d.ts.map +1 -1
- package/dist/components/layout/AdminTopHeader.js +2 -1
- package/dist/components/layout/AdminTopHeader.js.map +1 -1
- package/dist/components/layout/AdminTopHeader.tsx +2 -1
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +16 -1
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +37 -9
- package/dist/resources/images/solidx-logo/solidx-logo-dark.png +0 -0
- package/dist/resources/images/solidx-logo/solidx-logo-light.png +0 -0
- package/dist/resources/solid-custom.css +67 -40
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/resources/themes/solid-dark-enterprise/theme.css +2 -2
- package/dist/resources/themes/solid-dark-modern/theme.css +2 -2
- package/dist/resources/themes/solid-light-enterprise/theme.css +2 -2
- package/dist/resources/themes/solid-light-modern/theme.css +2 -2
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.css +289 -0
- package/package.json +1 -1
|
@@ -1727,7 +1727,7 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
|
|
|
1727
1727
|
<div className="flex items-center justify-end gap-1 cursor-pointer" onClick={(event) => event.stopPropagation()}>
|
|
1728
1728
|
<button
|
|
1729
1729
|
type="button"
|
|
1730
|
-
className="solid-
|
|
1730
|
+
className="retrieve-button solid-row-menu-trigger"
|
|
1731
1731
|
aria-label="Recover row"
|
|
1732
1732
|
data-no-row-click="true"
|
|
1733
1733
|
onClick={() => {
|
|
@@ -1943,7 +1943,7 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
|
|
|
1943
1943
|
</div>
|
|
1944
1944
|
)}
|
|
1945
1945
|
|
|
1946
|
-
<div className="solid-header-buttons-wrapper hidden items-center lg:flex">
|
|
1946
|
+
<div className="solid-header-buttons-wrapper max-lg:hidden items-center lg:flex">
|
|
1947
1947
|
{visibleHeaderButtons
|
|
1948
1948
|
?.filter((button: any) => button?.attrs?.actionInContextMenu !== true)
|
|
1949
1949
|
?.map((button: any, index: number) => (
|
|
@@ -110,7 +110,7 @@ var CreateUserRole = function (_a) {
|
|
|
110
110
|
if (errorMessages.length > 0) {
|
|
111
111
|
dispatch(showToast({
|
|
112
112
|
severity: "error",
|
|
113
|
-
summary: ERROR_MESSAGES.
|
|
113
|
+
summary: ERROR_MESSAGES.ERROR_OCCURED,
|
|
114
114
|
detail: errorMessages.map(String).join(", "),
|
|
115
115
|
}));
|
|
116
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateUserRole.js","sourceRoot":"","sources":["../../../../src/components/core/users/CreateUserRole.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,IAAM,cAAc,GAAG,UAAC,EAAa;;QAAX,IAAI,UAAA;IAC5B,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAEzB,IAAA,KAA8F,oBAAoB,EAAE,EAAnH,eAAe,QAAA,EAAE,UAAwE,EAAhE,QAAQ,UAAA,EAAc,kBAAkB,gBAAA,EAAS,aAAa,WAA4B,CAAC;IAC3H,IAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAErB,IAAA,KAGF,yBAAyB,EAAE,EAF7B,cAAc,QAAA,EACd,UAA0D,EAAxD,SAAS,eAAA,EAAE,SAAS,eAAA,EAAE,OAAO,aAAA,EAAE,KAAK,WAAA,EAAQ,UAAU,UAC3B,CAAC;IAEhC,IAAM,aAAa,GAAG;QACpB,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACnC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;KACpC,CAAC;IACF,IAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC;QAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC3E,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,UAAC,KAAK;YACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxE,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;aAC1E;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;aAC1E;iBAAM;gBACL,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;aACzE;QACH,CAAC,CAAC;KACH,CAAC,CAAC;IAEH,IAAM,gBAAgB,GAAG,UAAC,MAAW,EAAE,SAAiB;QACtD,OAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;IAArD,CAAqD,CAAC;IAExD,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAM,MAAM,GAAG,SAAS,CAAC;QACvB,aAAa,eAAA;QACb,gBAAgB,kBAAA;QAChB,kBAAkB,EAAE,IAAI;QACxB,QAAQ,EAAE,UAAO,MAAM;;;gBACrB,IAAI;oBACE,GAAG,GAAG;wBACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;qBAChC,CAAA;oBACD,cAAc,CAAC,GAAG,CAAC,CAAC;iBACrB;gBAAC,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;iBAC1D;;;aACF;KACF,CAAC,CAAC;IAEH,IAAM,SAAS,GAAG;;;;wBACD,qBAAM,MAAM,CAAC,YAAY,EAAE,EAAA;;oBAApC,MAAM,GAAG,SAA2B;oBACpC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAE5C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC5B,QAAQ,CAAC,SAAS,CAAC;4BACjB,QAAQ,EAAE,OAAO;4BACjB,OAAO,EAAE,cAAc,CAAC,WAAW;4BACnC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;yBAC7C,CAAC,CAAC,CAAC;qBACL;;;;SACF,CAAC;IAEF,IAAM,UAAU,GAAG,UAAO,KAAU;;;;;oBAC5B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;oBACtB,SAAS,GAAG,EAAE,CAAC;oBACnB,IAAI,KAAK,EAAE;wBACT,SAAS,GAAG;4BACV,QAAQ,EAAE,KAAK;yBAChB,CAAC;qBACH;oBAEK,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE;wBAC1C,gBAAgB,EAAE,IAAI;qBACvB,CAAC,CAAC;oBAGY,qBAAM,eAAe,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAA;;oBAApD,MAAM,GAAG,SAA2C;oBAE1D,8CAA8C;oBAC9C,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;wBACnB,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAhC,CAAgC,CAAC,CAAC;wBAEnF,kCAAkC;wBAClC,sBAAO,YAAY,EAAA;qBACpB;yBAAM;wBACL,4CAA4C;wBAC5C,sBAAO,EAAE,EAAA;qBACV;;;;SACF,CAAC;IAEF,SAAS,CAAC;QACR,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;SACrC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,cAAK,SAAS,EAAC,4CAA4C,YACzD,wBAGE,gBAAM,QAAQ,EAAE,MAAM,CAAC,YAAY,aAChC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAK,SAAS,EAAC,iCAAiC,aAC7E,cAAK,SAAS,EAAC,oBAAoB,kCAAwB,EAC3D,eAAK,SAAS,EAAC,YAAY,aACzB,wBACE,KAAC,WAAW,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,cAAM,OAAA,SAAS,EAAE,EAAX,CAAW,EAAE,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,GAAG,GACrG,EACN,KAAC,YAAY,KAAG,IACZ,IACF,CAAC,CAAC;4BACN,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,KAAK,2BAAgB,EACnC,eAAK,SAAS,EAAC,YAAY,aACzB,wBACE,KAAC,WAAW,IAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAE,cAAM,OAAA,SAAS,EAAE,EAAX,CAAW,EAAE,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,cAAc,GAAG,GACrG,EACN,eAEM,EACN,KAAC,YAAY,KAAG,IACZ,IACF,EAER,cAAK,SAAS,EAAC,cAAc,YAC3B,eAAK,SAAS,EAAC,4BAA4B,aACzC,cAAK,SAAS,EAAC,2BAA2B,YACxC,eAAK,SAAS,EAAC,OAAO,aACpB,gBAAO,OAAO,EAAC,UAAU,EAAC,SAAS,EAAC,6BAA6B,0BAEzD,EACR,KAAC,UAAU,IACT,IAAI,EAAC,MAAM,EACX,EAAE,EAAC,UAAU,EACb,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,MAAM,CAAC,YAAY,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAC7B,SAAS,EAAC,oBAAoB,kBAChB,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,GACpD,EACD,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CACvC,KAAC,YAAY,IAAC,QAAQ,EAAC,OAAO,EAAC,IAAI,EAAE,MAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,0CAAE,QAAQ,EAAE,GAAI,CAC5E,IACG,GACF,EACN,cAAK,SAAS,EAAC,2BAA2B,YACxC,eAAK,SAAS,EAAC,OAAO,aACpB,gBAAO,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,6BAA6B,0BAErD,EACR,0BACE,KAAC,iBAAiB,IAChB,QAAQ,EAAE,KAAK,EACf,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,SAAS,EAAC,UAAU,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,EAAE,KAAK,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,0CAAE,KAAK,EAAE,KAAK,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,0CAAE,EAAE,EAAE,EACrF,iBAAiB,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,0CAAE,KAAK,EAC9C,cAAc,EAAE,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,0CAAE,EAAE,EACxC,SAAS,EAAC,6BAA6B,GACpB,EACpB,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CACvC,KAAC,YAAY,IAAC,QAAQ,EAAC,OAAO,EAAC,IAAI,EAAE,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,QAAQ,0CAAE,QAAQ,EAAE,GAAI,CAC9E,IACG,IACF,GACF,IACF,GACF,IACD,GACH,GACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["\nimport { AutoCompleteField } from \"../../../components/common/AutoCompleteField\";\nimport { CancelButton } from \"../../../components/common/CancelButton\";\nimport { ERROR_MESSAGES } from \"../../../constants/error-messages\";\nimport { useLazyGetrolesQuery } from \"../../../redux/api/roleApi\";\nimport { useCreateuserroleMutation } from \"../../../redux/api/userApi\";\nimport { useFormik } from \"formik\";\nimport { usePathname } from \"../../../hooks/usePathname\";\nimport { useRouter } from \"../../../hooks/useRouter\";\nimport { SolidButton, SolidInput, SolidMessage } from \"../../shad-cn-ui\";\nimport qs from \"qs\";\nimport { useEffect } from \"react\";\nimport * as Yup from \"yup\";\nimport { useDispatch } from \"react-redux\";\nimport { showToast } from \"../../../redux/features/toastSlice\";\n\nconst CreateUserRole = ({ data }: any) => {\n const dispatch = useDispatch();\n\n const [triggerGetRoles, { data: roleLazy, isFetching: isRoleLazyFetching, error: roleLazyError }] = useLazyGetrolesQuery();\n const router = useRouter();\n\n const [\n createMenuItem,\n { isLoading, isSuccess, isError, error, data: newInvoice },\n ] = useCreateuserroleMutation();\n\n const initialValues = {\n username: data ? data.username : \"\",\n roleName: data ? data.roleName : \"\"\n };\n const validationSchema = Yup.object({\n username: Yup.string().required(ERROR_MESSAGES.FIELD_REUQIRED('User Name')),\n roleName: Yup.lazy((value) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return Yup.object().required(ERROR_MESSAGES.FIELD_REUQIRED('Role Name'));\n } else if (typeof value === 'string') {\n return Yup.string().required(ERROR_MESSAGES.FIELD_REUQIRED('Role Name'));\n } else {\n return Yup.mixed().required(ERROR_MESSAGES.FIELD_REUQIRED('Role Name'));\n }\n })\n });\n\n const isFormFieldValid = (formik: any, fieldName: string) =>\n formik.touched[fieldName] && formik.errors[fieldName];\n\n const pathname = usePathname();\n\n const formik = useFormik({\n initialValues,\n validationSchema,\n enableReinitialize: true,\n onSubmit: async (values) => {\n try {\n let obj = {\n username: values.username,\n roleName: values.roleName.label\n }\n createMenuItem(obj);\n } catch (err) {\n console.error(ERROR_MESSAGES.FAILED_CREATE_INVOICE, err);\n }\n },\n });\n\n const showError = async () => {\n const errors = await formik.validateForm();\n const errorMessages = Object.values(errors);\n\n if (errorMessages.length > 0) {\n dispatch(showToast({\n severity: \"error\",\n summary: ERROR_MESSAGES.SEND_REPORT,\n detail: errorMessages.map(String).join(\", \"),\n }));\n }\n };\n\n const searchRole = async (event: any) => {\n const query = event.query;\n let queryData = {};\n if (query) {\n queryData = {\n roleName: query\n };\n }\n\n const queryString = qs.stringify(queryData, {\n encodeValuesOnly: true\n });\n\n // Trigger the API call manually\n const result = await triggerGetRoles(queryString).unwrap();\n\n // Map the API response to AutoComplete format\n if (result && result.data) {\n const filteredMenu = result.data.map((m: any) => ({ label: m.name, value: m.id }));\n\n // Update the suggestions in state\n return filteredMenu\n } else {\n // Handle the case where no data is returned\n return []\n }\n };\n\n useEffect(() => {\n if (isSuccess == true) {\n router.push(`/admin/iam/users/all`);\n }\n }, [isSuccess])\n\n return (\n <div className=\"flex flex-wrap -mx-2 -mt-2\">\n <div className=\"mx-auto w-full px-2 pt-2 xl:w-[83.333333%]\">\n <div>\n {/* <Toast ref={toast} /> */}\n\n <form onSubmit={formik.handleSubmit}>\n {pathname.includes('create') ? <div className=\"mb-6 flex justify-between gap-4\">\n <div className=\"form-wrapper-title\"> Create User Role</div>\n <div className=\"flex gap-4\">\n <div>\n <SolidButton label=\"Save\" size=\"sm\" onClick={() => showError()} type=\"submit\" className='small-button' />\n </div>\n <CancelButton />\n </div>\n </div> :\n <div className=\"mb-6 flex justify-between gap-4\">\n <h1 className=\"m-0\"> Edit User</h1>\n <div className=\"flex gap-4\">\n <div>\n <SolidButton label=\"Save\" onClick={() => showError()} type=\"submit\" size=\"sm\" className='small-button' />\n </div>\n <div>\n {/* <Button label=\"Delete\" severity=\"danger\" type=\"button\" /> */}\n </div>\n <CancelButton />\n </div>\n </div>\n }\n <div className=\"form-wrapper\">\n <div className=\"flex flex-wrap -mx-2 -mt-2\">\n <div className=\"w-full px-2 pt-2 md:w-1/2\">\n <div className=\"field\">\n <label htmlFor=\"username\" className=\"form-label form-field-label\">\n User Name\n </label>\n <SolidInput\n type=\"text\"\n id=\"username\"\n name=\"username\"\n onChange={formik.handleChange}\n value={formik.values.username}\n className=\"w-full small-input\"\n aria-invalid={!!isFormFieldValid(formik, \"username\")}\n />\n {isFormFieldValid(formik, \"username\") && (\n <SolidMessage severity=\"error\" text={formik.errors.username?.toString()} />\n )}\n </div>\n </div>\n <div className=\"w-full px-2 pt-2 md:w-1/2\">\n <div className=\"field\">\n <label htmlFor=\"type\" className=\"form-label form-field-label\">\n Role Name\n </label>\n <div>\n <AutoCompleteField\n multiple={false}\n isFormFieldValid={isFormFieldValid}\n formik={formik}\n fieldName=\"roleName\"\n searchData={searchRole}\n existingData={{ label: data?.parentCategory?.title, value: data?.parentCategory?.id }}\n existingDataTitle={data?.parentCategory?.title}\n existingDataId={data?.parentCategory?.id}\n className=\"solid-standard-autocomplete\"\n ></AutoCompleteField>\n {isFormFieldValid(formik, \"roleName\") && (\n <SolidMessage severity=\"error\" text={formik?.errors?.roleName?.toString()} />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CreateUserRole;\n"]}
|
|
1
|
+
{"version":3,"file":"CreateUserRole.js","sourceRoot":"","sources":["../../../../src/components/core/users/CreateUserRole.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport { AutoCompleteField } from \"../../../components/common/AutoCompleteField\";\nimport { CancelButton } from \"../../../components/common/CancelButton\";\nimport { ERROR_MESSAGES } from \"../../../constants/error-messages\";\nimport { useLazyGetrolesQuery } from \"../../../redux/api/roleApi\";\nimport { useCreateuserroleMutation } from \"../../../redux/api/userApi\";\nimport { useFormik } from \"formik\";\nimport { usePathname } from \"../../../hooks/usePathname\";\nimport { useRouter } from \"../../../hooks/useRouter\";\nimport { SolidButton, SolidInput, SolidMessage } from \"../../shad-cn-ui\";\nimport qs from \"qs\";\nimport { useEffect } from \"react\";\nimport * as Yup from \"yup\";\nimport { useDispatch } from \"react-redux\";\nimport { showToast } from \"../../../redux/features/toastSlice\";\n\nconst CreateUserRole = ({ data }: any) => {\n const dispatch = useDispatch();\n\n const [triggerGetRoles, { data: roleLazy, isFetching: isRoleLazyFetching, error: roleLazyError }] = useLazyGetrolesQuery();\n const router = useRouter();\n\n const [\n createMenuItem,\n { isLoading, isSuccess, isError, error, data: newInvoice },\n ] = useCreateuserroleMutation();\n\n const initialValues = {\n username: data ? data.username : \"\",\n roleName: data ? data.roleName : \"\"\n };\n const validationSchema = Yup.object({\n username: Yup.string().required(ERROR_MESSAGES.FIELD_REUQIRED('User Name')),\n roleName: Yup.lazy((value) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return Yup.object().required(ERROR_MESSAGES.FIELD_REUQIRED('Role Name'));\n } else if (typeof value === 'string') {\n return Yup.string().required(ERROR_MESSAGES.FIELD_REUQIRED('Role Name'));\n } else {\n return Yup.mixed().required(ERROR_MESSAGES.FIELD_REUQIRED('Role Name'));\n }\n })\n });\n\n const isFormFieldValid = (formik: any, fieldName: string) =>\n formik.touched[fieldName] && formik.errors[fieldName];\n\n const pathname = usePathname();\n\n const formik = useFormik({\n initialValues,\n validationSchema,\n enableReinitialize: true,\n onSubmit: async (values) => {\n try {\n let obj = {\n username: values.username,\n roleName: values.roleName.label\n }\n createMenuItem(obj);\n } catch (err) {\n console.error(ERROR_MESSAGES.FAILED_CREATE_INVOICE, err);\n }\n },\n });\n\n const showError = async () => {\n const errors = await formik.validateForm();\n const errorMessages = Object.values(errors);\n\n if (errorMessages.length > 0) {\n dispatch(showToast({\n severity: \"error\",\n summary: ERROR_MESSAGES.ERROR_OCCURED,\n detail: errorMessages.map(String).join(\", \"),\n }));\n }\n };\n\n const searchRole = async (event: any) => {\n const query = event.query;\n let queryData = {};\n if (query) {\n queryData = {\n roleName: query\n };\n }\n\n const queryString = qs.stringify(queryData, {\n encodeValuesOnly: true\n });\n\n // Trigger the API call manually\n const result = await triggerGetRoles(queryString).unwrap();\n\n // Map the API response to AutoComplete format\n if (result && result.data) {\n const filteredMenu = result.data.map((m: any) => ({ label: m.name, value: m.id }));\n\n // Update the suggestions in state\n return filteredMenu\n } else {\n // Handle the case where no data is returned\n return []\n }\n };\n\n useEffect(() => {\n if (isSuccess == true) {\n router.push(`/admin/iam/users/all`);\n }\n }, [isSuccess])\n\n return (\n <div className=\"flex flex-wrap -mx-2 -mt-2\">\n <div className=\"mx-auto w-full px-2 pt-2 xl:w-[83.333333%]\">\n <div>\n {/* <Toast ref={toast} /> */}\n\n <form onSubmit={formik.handleSubmit}>\n {pathname.includes('create') ? <div className=\"mb-6 flex justify-between gap-4\">\n <div className=\"form-wrapper-title\"> Create User Role</div>\n <div className=\"flex gap-4\">\n <div>\n <SolidButton label=\"Save\" size=\"sm\" onClick={() => showError()} type=\"submit\" className='small-button' />\n </div>\n <CancelButton />\n </div>\n </div> :\n <div className=\"mb-6 flex justify-between gap-4\">\n <h1 className=\"m-0\"> Edit User</h1>\n <div className=\"flex gap-4\">\n <div>\n <SolidButton label=\"Save\" onClick={() => showError()} type=\"submit\" size=\"sm\" className='small-button' />\n </div>\n <div>\n {/* <Button label=\"Delete\" severity=\"danger\" type=\"button\" /> */}\n </div>\n <CancelButton />\n </div>\n </div>\n }\n <div className=\"form-wrapper\">\n <div className=\"flex flex-wrap -mx-2 -mt-2\">\n <div className=\"w-full px-2 pt-2 md:w-1/2\">\n <div className=\"field\">\n <label htmlFor=\"username\" className=\"form-label form-field-label\">\n User Name\n </label>\n <SolidInput\n type=\"text\"\n id=\"username\"\n name=\"username\"\n onChange={formik.handleChange}\n value={formik.values.username}\n className=\"w-full small-input\"\n aria-invalid={!!isFormFieldValid(formik, \"username\")}\n />\n {isFormFieldValid(formik, \"username\") && (\n <SolidMessage severity=\"error\" text={formik.errors.username?.toString()} />\n )}\n </div>\n </div>\n <div className=\"w-full px-2 pt-2 md:w-1/2\">\n <div className=\"field\">\n <label htmlFor=\"type\" className=\"form-label form-field-label\">\n Role Name\n </label>\n <div>\n <AutoCompleteField\n multiple={false}\n isFormFieldValid={isFormFieldValid}\n formik={formik}\n fieldName=\"roleName\"\n searchData={searchRole}\n existingData={{ label: data?.parentCategory?.title, value: data?.parentCategory?.id }}\n existingDataTitle={data?.parentCategory?.title}\n existingDataId={data?.parentCategory?.id}\n className=\"solid-standard-autocomplete\"\n ></AutoCompleteField>\n {isFormFieldValid(formik, \"roleName\") && (\n <SolidMessage severity=\"error\" text={formik?.errors?.roleName?.toString()} />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CreateUserRole;\n"]}
|
|
@@ -71,7 +71,7 @@ const CreateUserRole = ({ data }: any) => {
|
|
|
71
71
|
if (errorMessages.length > 0) {
|
|
72
72
|
dispatch(showToast({
|
|
73
73
|
severity: "error",
|
|
74
|
-
summary: ERROR_MESSAGES.
|
|
74
|
+
summary: ERROR_MESSAGES.ERROR_OCCURED,
|
|
75
75
|
detail: errorMessages.map(String).join(", "),
|
|
76
76
|
}));
|
|
77
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,+
|
|
1
|
+
{"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,+CAgL1B,CAAC"}
|
|
@@ -49,7 +49,8 @@ export var AdminTopHeader = function () {
|
|
|
49
49
|
var viewName = segments[4];
|
|
50
50
|
var next = [
|
|
51
51
|
moduleName ? toLabel(moduleName) : null,
|
|
52
|
-
|
|
52
|
+
// After browser Back, the previous action response may still be cached; use it only when it belongs to this URL.
|
|
53
|
+
hasMatchingActionData && modelFromApi ? decodeURIComponent(modelFromApi) : modelName ? toLabel(modelName) : null,
|
|
53
54
|
viewName ? toLabel(viewName) : null,
|
|
54
55
|
].filter(Boolean);
|
|
55
56
|
return next.length ? next : ["Admin"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminTopHeader.js","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from \"react\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useGetSolidActionByIdQuery } from \"../../redux/api/solidActionApi\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\n\n\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\n\nconst toLabel = (value: string) =>\n decodeURIComponent(value)\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n\nexport const AdminTopHeader = () => {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const router = useRouter();\n // We treat actionId as the source of truth for breadcrumb labels.\n // If present, we resolve module/model/action via action-metadata API\n // so breadcrumbs are consistent across list/form/tree/kanban pages.\n const actionId = searchParams.get(\"actionId\");\n const { data: actionResponse } = useGetSolidActionByIdQuery(actionId as string, {\n skip: !actionId,\n });\n\n const crumbs = useMemo(() => {\n // API response shapes vary by adapter layer, so normalize defensively.\n const actionData = actionResponse?.data?.data ?? actionResponse?.data ?? actionResponse;\n const moduleFromApi = actionData?.module?.displayName || actionData?.module?.name;\n const modelFromApi = actionData?.model?.displayName || actionData?.model?.name;\n const actionFromApi = actionData?.displayName || actionData?.name;\n const actionDataId = actionData?.id != null ? String(actionData.id) : null;\n const hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;\n\n // Priority 1: exact business breadcrumb contract requested:\n // <module> > <model> > <action>.\n // We only trust API crumbs when they belong to the current URL's actionId.\n // This avoids stale list breadcrumbs bleeding into form routes that do not\n // carry actionId in their query string.\n if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {\n return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);\n }\n\n const segments = pathname.split(\"/\").filter(Boolean);\n // Priority 2: derive from route segments when API data is unavailable.\n // This is intentionally ahead of query fallback so form pages don't\n // inherit stale list query labels after list -> form navigation.\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const viewName = segments[4];\n const next = [\n moduleName ? toLabel(moduleName) : null,\n modelFromApi ? decodeURIComponent(modelFromApi) : modelName ? toLabel(modelName) : null,\n viewName ? toLabel(viewName) : null,\n ].filter(Boolean) as string[];\n return next.length ? next : [\"Admin\"];\n }\n\n const menuItemName = searchParams.get(\"menuItemName\");\n const actionName = searchParams.get(\"actionName\");\n\n // Priority 3: legacy URL-query fallback for older links/pages.\n if (menuItemName || actionName) {\n return [menuItemName, actionName].filter(Boolean).map((item) => toLabel(item!));\n }\n\n return [\"Admin\"];\n }, [actionId, actionResponse, pathname, searchParams]);\n\n const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const triggerSidebar = () => {\n window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));\n };\n\n const handleBreadcrumbClick = (crumbIndex: number) => {\n // When on a form view, clicking the model name (second crumb) should navigate back to list\n // Index 1 is the model name in a breadcrumb like: Module > Model > Action\n if (crumbIndex === 1 && showBack) {\n if (typeof window !== \"undefined\") {\n // First, try to use the full stored URL (preserves all query params)\n const storedFullUrl = sessionStorage.getItem(\"fromViewUrl\");\n if (storedFullUrl) {\n router.push(storedFullUrl);\n return;\n }\n }\n \n // Fallback: construct URL from current path and stored view\n const segments = pathname.split(\"/\").filter(Boolean);\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const fromView = typeof window !== \"undefined\" \n ? sessionStorage.getItem(\"fromView\") || \"list\" \n : \"list\";\n router.push(`/admin/core/${moduleName}/${modelName}/${fromView}`);\n }\n }\n };\n\n return (\n <header className=\"solid-admin-header\">\n <div className=\"solid-admin-header-inner\">\n <button\n type=\"button\"\n className=\"solid-admin-sidebar-trigger\"\n onClick={triggerSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2\" stroke=\"currentColor\" />\n <path d=\"M5.5 2V14\" stroke=\"currentColor\" />\n <rect x=\"8\" y=\"5.25\" width=\"4.5\" height=\"5.5\" rx=\"0.9\" stroke=\"currentColor\" />\n </svg>\n </button>\n\n <div className=\"solid-admin-header-sep\" />\n\n <nav className=\"solid-admin-breadcrumbs\" aria-label=\"Breadcrumb\">\n {crumbs.map((crumb, index) => (\n <span key={`${crumb}-${index}`} className=\"solid-admin-crumb\">\n {index > 0 && <span className=\"solid-admin-crumb-sep\">›</span>}\n {index === 1 && showBack ? (\n <button\n type=\"button\"\n className=\"px-0 solid-admin-crumb-link\"\n onClick={() => handleBreadcrumbClick(index)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"inherit\", textDecoration: \"underline\", fontFamily: 'inherit' }}\n >\n {crumb}\n </button>\n ) : (\n <span className=\"solid-bread-crum-text-wrapper\">{crumb}</span>\n )}\n </span>\n ))}\n </nav>\n\n {/* <div className=\"solid-admin-header-actions\">\n {isAdmin && isDev && !isStudioMode && (\n <button\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={() => { dispatch(enterStudioMode()); router.push(\"/studio\"); }}\n title=\"Enter SolidX Studio\"\n aria-label=\"Enter SolidX Studio\"\n >\n <StudioSparkleIcon />\n <span className=\"solid-studio-trigger-label\">Studio</span>\n </button>\n )}\n\n {isDarkModeEnabled && (\n <button\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={toggleThemeMode}\n aria-label=\"Toggle theme\"\n title=\"Toggle theme\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"solid-sr-only\">Toggle theme</span>\n </button>\n )}\n\n {showBack && (\n <button\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={() => router.back()}\n aria-label=\"Go back\"\n >\n Back\n </button>\n )}\n </div> */}\n <AdminHeaderActions variant=\"header\" />\n </div>\n </header>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"AdminTopHeader.js","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from \"react\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useGetSolidActionByIdQuery } from \"../../redux/api/solidActionApi\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\n\n\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\n\nconst toLabel = (value: string) =>\n decodeURIComponent(value)\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n\nexport const AdminTopHeader = () => {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const router = useRouter();\n // We treat actionId as the source of truth for breadcrumb labels.\n // If present, we resolve module/model/action via action-metadata API\n // so breadcrumbs are consistent across list/form/tree/kanban pages.\n const actionId = searchParams.get(\"actionId\");\n const { data: actionResponse } = useGetSolidActionByIdQuery(actionId as string, {\n skip: !actionId,\n });\n\n const crumbs = useMemo(() => {\n // API response shapes vary by adapter layer, so normalize defensively.\n const actionData = actionResponse?.data?.data ?? actionResponse?.data ?? actionResponse;\n const moduleFromApi = actionData?.module?.displayName || actionData?.module?.name;\n const modelFromApi = actionData?.model?.displayName || actionData?.model?.name;\n const actionFromApi = actionData?.displayName || actionData?.name;\n const actionDataId = actionData?.id != null ? String(actionData.id) : null;\n const hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;\n\n // Priority 1: exact business breadcrumb contract requested:\n // <module> > <model> > <action>.\n // We only trust API crumbs when they belong to the current URL's actionId.\n // This avoids stale list breadcrumbs bleeding into form routes that do not\n // carry actionId in their query string.\n if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {\n return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);\n }\n\n const segments = pathname.split(\"/\").filter(Boolean);\n // Priority 2: derive from route segments when API data is unavailable.\n // This is intentionally ahead of query fallback so form pages don't\n // inherit stale list query labels after list -> form navigation.\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const viewName = segments[4];\n const next = [\n moduleName ? toLabel(moduleName) : null,\n // After browser Back, the previous action response may still be cached; use it only when it belongs to this URL.\n hasMatchingActionData && modelFromApi ? decodeURIComponent(modelFromApi) : modelName ? toLabel(modelName) : null,\n viewName ? toLabel(viewName) : null,\n ].filter(Boolean) as string[];\n return next.length ? next : [\"Admin\"];\n }\n\n const menuItemName = searchParams.get(\"menuItemName\");\n const actionName = searchParams.get(\"actionName\");\n\n // Priority 3: legacy URL-query fallback for older links/pages.\n if (menuItemName || actionName) {\n return [menuItemName, actionName].filter(Boolean).map((item) => toLabel(item!));\n }\n\n return [\"Admin\"];\n }, [actionId, actionResponse, pathname, searchParams]);\n\n const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const triggerSidebar = () => {\n window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));\n };\n\n const handleBreadcrumbClick = (crumbIndex: number) => {\n // When on a form view, clicking the model name (second crumb) should navigate back to list\n // Index 1 is the model name in a breadcrumb like: Module > Model > Action\n if (crumbIndex === 1 && showBack) {\n if (typeof window !== \"undefined\") {\n // First, try to use the full stored URL (preserves all query params)\n const storedFullUrl = sessionStorage.getItem(\"fromViewUrl\");\n if (storedFullUrl) {\n router.push(storedFullUrl);\n return;\n }\n }\n \n // Fallback: construct URL from current path and stored view\n const segments = pathname.split(\"/\").filter(Boolean);\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const fromView = typeof window !== \"undefined\" \n ? sessionStorage.getItem(\"fromView\") || \"list\" \n : \"list\";\n router.push(`/admin/core/${moduleName}/${modelName}/${fromView}`);\n }\n }\n };\n\n return (\n <header className=\"solid-admin-header\">\n <div className=\"solid-admin-header-inner\">\n <button\n type=\"button\"\n className=\"solid-admin-sidebar-trigger\"\n onClick={triggerSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2\" stroke=\"currentColor\" />\n <path d=\"M5.5 2V14\" stroke=\"currentColor\" />\n <rect x=\"8\" y=\"5.25\" width=\"4.5\" height=\"5.5\" rx=\"0.9\" stroke=\"currentColor\" />\n </svg>\n </button>\n\n <div className=\"solid-admin-header-sep\" />\n\n <nav className=\"solid-admin-breadcrumbs\" aria-label=\"Breadcrumb\">\n {crumbs.map((crumb, index) => (\n <span key={`${crumb}-${index}`} className=\"solid-admin-crumb\">\n {index > 0 && <span className=\"solid-admin-crumb-sep\">›</span>}\n {index === 1 && showBack ? (\n <button\n type=\"button\"\n className=\"px-0 solid-admin-crumb-link\"\n onClick={() => handleBreadcrumbClick(index)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"inherit\", textDecoration: \"underline\", fontFamily: 'inherit' }}\n >\n {crumb}\n </button>\n ) : (\n <span className=\"solid-bread-crum-text-wrapper\">{crumb}</span>\n )}\n </span>\n ))}\n </nav>\n\n {/* <div className=\"solid-admin-header-actions\">\n {isAdmin && isDev && !isStudioMode && (\n <button\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={() => { dispatch(enterStudioMode()); router.push(\"/studio\"); }}\n title=\"Enter SolidX Studio\"\n aria-label=\"Enter SolidX Studio\"\n >\n <StudioSparkleIcon />\n <span className=\"solid-studio-trigger-label\">Studio</span>\n </button>\n )}\n\n {isDarkModeEnabled && (\n <button\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={toggleThemeMode}\n aria-label=\"Toggle theme\"\n title=\"Toggle theme\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"solid-sr-only\">Toggle theme</span>\n </button>\n )}\n\n {showBack && (\n <button\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={() => router.back()}\n aria-label=\"Go back\"\n >\n Back\n </button>\n )}\n </div> */}\n <AdminHeaderActions variant=\"header\" />\n </div>\n </header>\n );\n};\n"]}
|
|
@@ -53,7 +53,8 @@ export const AdminTopHeader = () => {
|
|
|
53
53
|
const viewName = segments[4];
|
|
54
54
|
const next = [
|
|
55
55
|
moduleName ? toLabel(moduleName) : null,
|
|
56
|
-
|
|
56
|
+
// After browser Back, the previous action response may still be cached; use it only when it belongs to this URL.
|
|
57
|
+
hasMatchingActionData && modelFromApi ? decodeURIComponent(modelFromApi) : modelName ? toLabel(modelName) : null,
|
|
57
58
|
viewName ? toLabel(viewName) : null,
|
|
58
59
|
].filter(Boolean) as string[];
|
|
59
60
|
return next.length ? next : ["Admin"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AppSidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AppSidebar.tsx"],"names":[],"mappings":"AAkPA,QAAA,MAAM,UAAU,+CA4Of,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -22,6 +22,7 @@ import SolidLink from "../common/Link";
|
|
|
22
22
|
import { usePathname } from "../../hooks/usePathname";
|
|
23
23
|
import { useSearchParams } from "../../hooks/useSearchParams";
|
|
24
24
|
import { env } from "../../adapters/env";
|
|
25
|
+
import { normalizeAssetUrl } from "../../helpers/assetUrl";
|
|
25
26
|
import { resolveRetainedModelViewRoute } from "../../helpers/modelViewPersistence";
|
|
26
27
|
import { SolidMenuItemIcon } from "./SolidMenuItemIcon";
|
|
27
28
|
var defaultMenuKey = env("NEXT_PUBLIC_DEFAULT_MENU_KEY");
|
|
@@ -101,6 +102,16 @@ function resolveDefaultWorkspace(items) {
|
|
|
101
102
|
items.find(function (item) { return item.key === defaultMenuKey; }) ||
|
|
102
103
|
items[0]);
|
|
103
104
|
}
|
|
105
|
+
var WorkspaceIcon = function (_a) {
|
|
106
|
+
var workspace = _a.workspace, className = _a.className;
|
|
107
|
+
var iconUrl = normalizeAssetUrl(workspace === null || workspace === void 0 ? void 0 : workspace.icon) || null;
|
|
108
|
+
var _b = useState(null), failedUrl = _b[0], setFailedUrl = _b[1];
|
|
109
|
+
var showImage = !!iconUrl && failedUrl !== iconUrl;
|
|
110
|
+
useEffect(function () {
|
|
111
|
+
setFailedUrl(null);
|
|
112
|
+
}, [iconUrl]);
|
|
113
|
+
return (_jsx("span", { className: "".concat(className).concat(showImage ? " has-image" : ""), children: showImage ? (_jsx("img", { src: iconUrl, alt: "", "aria-hidden": "true", onError: function () { return setFailedUrl(iconUrl); } })) : (((workspace === null || workspace === void 0 ? void 0 : workspace.title) || "W").slice(0, 1).toUpperCase()) }));
|
|
114
|
+
};
|
|
104
115
|
var SidebarMenuTree = function (_a) {
|
|
105
116
|
var items = _a.items, pathname = _a.pathname, searchParams = _a.searchParams, forceExpand = _a.forceExpand;
|
|
106
117
|
var _b = useState({}), expandedKeys = _b[0], setExpandedKeys = _b[1];
|
|
@@ -261,12 +272,16 @@ var AppSidebar = function () {
|
|
|
261
272
|
]
|
|
262
273
|
.filter(Boolean)
|
|
263
274
|
.join(" ");
|
|
275
|
+
// The collapsed preference belongs to the desktop sidebar. Mobile uses
|
|
276
|
+
// the navbar visibility state for its drawer, so it must always render
|
|
277
|
+
// the full menu when opened.
|
|
278
|
+
var isSidebarContentCollapsed = isDesktop && isCollapsed;
|
|
264
279
|
var selectWorkspace = function (workspace) {
|
|
265
280
|
setSelectedWorkspaceKey(workspace.key || "");
|
|
266
281
|
setSearchTerm("");
|
|
267
282
|
setWorkspaceOpen(false);
|
|
268
283
|
};
|
|
269
|
-
return (_jsxs(_Fragment, { children: [!isDesktop && visibleNavbar && _jsx("div", { className: "solid-sidebar-backdrop", onClick: function () { return dispatch(toggleNavbar()); } }), _jsxs("aside", { className: shellClasses, children: [_jsx("div", { className: "solid-sidebar-header", children: _jsxs("div", { className: "solid-workspace-switcher", ref: workspaceSwitcherRef, children: [_jsxs("button", { type: "button", className: "solid-workspace-trigger", onClick: function () { return setWorkspaceOpen(function (prev) { return !prev; }); }, "aria-label": "Select workspace", children: [_jsx(
|
|
284
|
+
return (_jsxs(_Fragment, { children: [!isDesktop && visibleNavbar && _jsx("div", { className: "solid-sidebar-backdrop", onClick: function () { return dispatch(toggleNavbar()); } }), _jsxs("aside", { className: shellClasses, children: [_jsx("div", { className: "solid-sidebar-header", children: _jsxs("div", { className: "solid-workspace-switcher", ref: workspaceSwitcherRef, children: [_jsxs("button", { type: "button", className: "solid-workspace-trigger", onClick: function () { return setWorkspaceOpen(function (prev) { return !prev; }); }, "aria-label": "Select workspace", children: [_jsx(WorkspaceIcon, { workspace: selectedWorkspace, className: "solid-workspace-avatar" }), !isSidebarContentCollapsed && (_jsxs(_Fragment, { children: [_jsxs("span", { className: "solid-workspace-label-wrap", children: [_jsx("span", { className: "solid-workspace-label-top", children: "Workspace" }), _jsx("span", { className: "solid-workspace-label", children: (selectedWorkspace === null || selectedWorkspace === void 0 ? void 0 : selectedWorkspace.title) || "Workspace" })] }), _jsx("span", { className: "solid-workspace-chevron-dual ".concat(workspaceOpen ? "is-open" : ""), "aria-hidden": "true", children: _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", children: [_jsx("path", { d: "M4 6L7 3L10 6", stroke: "currentColor", strokeWidth: "1.25", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M4 8L7 11L10 8", stroke: "currentColor", strokeWidth: "1.25", strokeLinecap: "round", strokeLinejoin: "round" })] }) })] }))] }), workspaceOpen && !isSidebarContentCollapsed && (_jsx("div", { className: "solid-workspace-menu", children: workspaces.map(function (workspace) { return (_jsxs("button", { type: "button", className: "solid-workspace-item ".concat(workspace.key === (selectedWorkspace === null || selectedWorkspace === void 0 ? void 0 : selectedWorkspace.key) ? "is-active" : ""), onClick: function () { return selectWorkspace(workspace); }, children: [_jsx(WorkspaceIcon, { workspace: workspace, className: "solid-workspace-item-avatar" }), _jsx("span", { className: "solid-workspace-item-label", children: workspace.title })] }, workspace.key || workspace.title)); }) }))] }) }), !isSidebarContentCollapsed ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "solid-sidebar-search-wrap", children: _jsx("input", { type: "text", value: searchTerm, onChange: function (e) { return setSearchTerm(e.target.value); }, placeholder: "Search in menu...", className: "solid-sidebar-search" }) }), _jsx("div", { className: "solid-sidebar-tree-wrap", children: _jsx(SidebarMenuTree, { items: filteredMenu, pathname: pathname, searchParams: searchParams, forceExpand: !!searchTerm.trim() }) })] })) : (_jsx("div", { className: "solid-sidebar-collapsed-nav", children: filteredMenu.slice(0, 10).map(function (item) { return (_jsx(SolidLink, { href: item.path || "#", className: "solid-collapsed-item ".concat(isMenuPathActive(item.path, pathname, searchParams) ? "is-active" : ""), title: item.title, children: item.title.slice(0, 1).toUpperCase() }, item.key || item.title)); }) })), _jsxs("div", { className: "solid-sidebar-footer", children: [_jsx(AdminHeaderActions, { variant: "sidebar" }), _jsx(UserProfileMenu, {})] })] }), isDesktop && isCollapsed && (_jsx("button", { type: "button", className: "solid-sidebar-hotspot", onClick: function () { return setIsCollapsed(false); }, "aria-label": "Expand sidebar", title: "Expand sidebar" }))] }));
|
|
270
285
|
};
|
|
271
286
|
export default AppSidebar;
|
|
272
287
|
//# sourceMappingURL=AppSidebar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSidebar.js","sourceRoot":"","sources":["../../../src/components/layout/AppSidebar.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAUxD,IAAM,cAAc,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC3D,IAAM,mBAAmB,GAAG,0BAA0B,CAAC;AACvD,IAAM,8BAA8B,GAAG,mCAAmC,CAAC;AAC3E,IAAM,oBAAoB,GAAG,uBAAuB,CAAC;AACrD,IAAM,qBAAqB,GAAG,OAAO,CAAC;AACtC,IAAM,uBAAuB,GAAG,YAAY,CAAC;AAC7C,IAAM,qBAAqB,GAAG,YAAY,CAAC;AAE3C,SAAS,aAAa,CAAC,IAAY;IAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IACxC,IAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IACvD,OAAO;QACH,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC,YAAY,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;KACnD,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAAC,cAA+B,EAAE,aAA8B;IAChG,IAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,aAAa,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,GAAG;QAC7B,IAAM,KAAK,GAAG,UAAG,GAAG,cAAI,KAAK,CAAE,CAAC;QAChC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,cAAc,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,GAAG;QAC9B,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAM,KAAK,GAAG,UAAG,GAAG,cAAI,KAAK,CAAE,CAAC;QAChC,IAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO;SACV;QACD,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA4B,EAAE,eAAuB,EAAE,mBAAoC;IACnH,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,IAAM,gBAAgB,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAA,KAA6D,gBAAgB,CAAC,gBAAgB,CAAC,EAAnF,YAAY,cAAA,EAAgB,gBAAgB,kBAAuC,CAAC;IACtG,IAAI,YAAY,KAAK,aAAa,CAAC,eAAe,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhE,OAAO,2BAA2B,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,KAA2B;IAA3B,sBAAA,EAAA,UAA2B;IAC/C,OAAO,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,uBACpB,IAAI,KACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAC9D,EAHyB,CAGzB,CAAC,CAAC;AACR,CAAC;AAED,SAAS,eAAe,CAAC,KAAsB,EAAE,KAAa;IAC1D,IAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAEnC,IAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI;QACf,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACvE,IAAM,qBAAqB,GAAG,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAErG,IAAI,qBAAqB,EAAE;YACvB,IAAI,CAAC,IAAI,uBAAM,IAAI,KAAE,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAG,CAAC;YAChE,OAAO;SACV;QAED,IAAI,WAAW,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACpC,IAAI,CAAC,IAAI,uBAAM,IAAI,KAAE,QAAQ,UAAA,IAAG,CAAC;SACpC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAsB;IACnD,OAAO,CACH,KAAK,CAAC,IAAI,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,GAAG,KAAK,qBAAqB,EAAlC,CAAkC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,uBAAuB,CAAC,WAAW,EAAE,EAAzE,CAAyE,CAAC;QAC/F,KAAK,CAAC,IAAI,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,GAAG,KAAK,cAAc,EAA3B,CAA2B,CAAC;QACjD,KAAK,CAAC,CAAC,CAAC,CACX,CAAC;AACN,CAAC;AAED,IAAM,eAAe,GAAG,UAAC,EAUxB;QATG,KAAK,WAAA,EACL,QAAQ,cAAA,EACR,YAAY,kBAAA,EACZ,WAAW,iBAAA;IAOL,IAAA,KAAkC,QAAQ,CAA0B,EAAE,CAAC,EAAtE,YAAY,QAAA,EAAE,eAAe,QAAyC,CAAC;IAE9E,IAAM,WAAW,GAAG,UAAC,IAAmB,EAAE,QAAgB,EAAE,KAAa;QACrE,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,eAAQ,KAAK,CAAE,CAAC;QACpE,OAAO,UAAG,QAAQ,cAAI,IAAI,CAAE,CAAC;IACjC,CAAC,CAAC;IAEF,SAAS,CAAC;QACN,IAAM,eAAe,GAA4B,EAAE,CAAC;QACpD,IAAI,WAAW,EAAE;YACb,IAAM,MAAI,GAAG,UAAC,KAAsB,EAAE,QAAiB;gBAAjB,yBAAA,EAAA,iBAAiB;gBACnD,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,KAAK;oBACtB,IAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAClD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;wBACvD,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;wBAC/B,MAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;qBAC/B;yBAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBAClD,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;wBAC/B,MAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;qBAC/B;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;YACF,MAAI,CAAC,KAAK,CAAC,CAAC;SACf;QACD,eAAe,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzB,IAAM,cAAc,GAAG,UAAC,MAAc;QAClC,eAAe,CAAC,UAAC,IAAI;;YAAK,OAAA,uBAAM,IAAI,gBAAG,MAAM,IAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAG;QAAtC,CAAsC,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG,UAAC,IAAmB,EAAE,KAAS,EAAE,QAAiB,EAAE,KAAS;QAAvC,sBAAA,EAAA,SAAS;QAAE,yBAAA,EAAA,iBAAiB;QAAE,sBAAA,EAAA,SAAS;QAC5E,IAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClD,IAAM,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClE,IAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;QACjD,IAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrE,IAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,IAAM,WAAW,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;QAEpC,OAAO,CACH,cAAiB,SAAS,EAAC,yBAAyB,aAChD,eACI,SAAS,EAAE,iCAA0B,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAE,EAClE,KAAK,EAAE,EAAE,WAAW,aAAA,EAAE,aAErB,WAAW,CAAC,CAAC,CAAC,CACX,kBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mDAAmD,EAC7D,OAAO,EAAE,cAAM,OAAA,cAAc,CAAC,MAAM,CAAC,EAAtB,CAAsB,mBACtB,UAAU,gBACb,iBAAU,IAAI,CAAC,KAAK,CAAE,aAElC,KAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,GAAI,EACjC,eAAM,SAAS,EAAC,0BAA0B,YAAE,IAAI,CAAC,KAAK,GAAQ,IACzD,CACZ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACZ,MAAC,SAAS,IAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAC,iDAAiD,aACtF,KAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,GAAI,EACjC,eAAM,SAAS,EAAC,0BAA0B,YAAE,IAAI,CAAC,KAAK,GAAQ,IACtD,CACf,CAAC,CAAC,CAAC,CACA,gBAAM,SAAS,EAAC,iDAAiD,aAC7D,KAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,GAAI,EACjC,eAAM,SAAS,EAAC,0BAA0B,YAAE,IAAI,CAAC,KAAK,GAAQ,IAC3D,CACV,EACA,WAAW,IAAI,CACZ,iBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,2BAA2B,EACrC,OAAO,EAAE,cAAM,OAAA,cAAc,CAAC,MAAM,CAAC,EAAtB,CAAsB,gBACzB,iBAAU,IAAI,CAAC,KAAK,CAAE,YAElC,eAAM,SAAS,EAAC,sBAAsB,YAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,GACjE,CACZ,IACC,EACL,WAAW,IAAI,UAAU,IAAI,CAC1B,aAAI,SAAS,EAAC,qDAAqD,YAC9D,IAAI,CAAC,QAAS,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,UAAU,IAAK,OAAA,UAAU,CAAC,KAAsB,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAjE,CAAiE,CAAC,GAC5G,CACR,KA1CI,MAAM,CA2CV,CACR,CAAC;IACN,CAAC,CAAC;IAEF,OAAO,aAAI,SAAS,EAAC,yBAAyB,YAAE,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK,IAAK,OAAA,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAlC,CAAkC,CAAC,GAAM,CAAC;AACzH,CAAC,CAAC;AAEF,IAAM,UAAU,GAAG;IACf,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAM,aAAa,GAAG,WAAW,CAAC,UAAC,KAAU,IAAK,OAAA,KAAK,CAAC,WAAW,CAAC,aAAa,EAA/B,CAA+B,CAAC,CAAC;IAC3E,IAAM,IAAI,GAAK,+BAA+B,CAAC,EAAE,CAAC,KAAxC,CAAyC;IAC3D,IAAM,oBAAoB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAE3D,IAAA,KAA8B,QAAQ,CAAC,EAAE,CAAC,EAAzC,UAAU,QAAA,EAAE,aAAa,QAAgB,CAAC;IAC3C,IAAA,KAAoC,QAAQ,CAAC,KAAK,CAAC,EAAlD,aAAa,QAAA,EAAE,gBAAgB,QAAmB,CAAC;IACpD,IAAA,KAAkD,QAAQ,CAAS;QACrE,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,8BAA8B,CAAC,IAAI,EAAE,CAAC;IAC7E,CAAC,CAAC,EAHK,oBAAoB,QAAA,EAAE,uBAAuB,QAGlD,CAAC;IACG,IAAA,KAA4B,QAAQ,CAAU,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,EAA7G,SAAS,QAAA,EAAE,YAAY,QAAsF,CAAC;IAC/G,IAAA,KAAgC,QAAQ,CAAU;QACpD,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAChD,IAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAChE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,MAAM,KAAK,MAAM,CAAC;IAC7B,CAAC,CAAC,EALK,WAAW,QAAA,EAAE,cAAc,QAKhC,CAAC;IAEK,IAAA,IAAI,GAAK,UAAU,EAAE,KAAjB,CAAkB;IAE9B,SAAS,CAAC;QACN,IAAI,IAAI,EAAE;YACN,QAAQ,CAAC,OAAO,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,CAAC,CAAC;YAC9B,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;SACtC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,SAAS,CAAC;QACN,IAAM,QAAQ,GAAG;YACb,IAAM,OAAO,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;YACzC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,OAAO,EAAE;gBACT,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;aAC1B;QACL,CAAC,CAAC;QAEF,QAAQ,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,cAAM,OAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAA9C,CAA8C,CAAC;IAChE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC;QACN,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,SAAS,CAAC;QACN,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,CAAC,oBAAoB,EAAE;YACvB,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;YAC/D,OAAO;SACV;QACD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;IACtF,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,SAAS,CAAC;QACN,IAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChF,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAE7B,SAAS,CAAC;;QACN,IAAI,CAAC,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,MAAM,CAAA;YAAE,OAAO;QAChC,IAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAC,SAAwB,IAAK,OAAA,SAAS,CAAC,GAAG,KAAK,oBAAoB,EAAtC,CAAsC,CAAC,CAAC;QAClH,IAAM,gBAAgB,GAAG,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,KAAI,EAAE,CAAC;QAEnG,IAAI,gBAAgB,KAAK,oBAAoB,EAAE;YAC3C,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;SAC7C;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEjC,SAAS,CAAC;QACN,IAAI,CAAC,SAAS,EAAE;YACZ,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;SAC1B;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC;QACN,IAAM,eAAe,GAAG;YACpB,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,EAAE;gBAC1B,cAAc,CAAC,UAAC,IAAI,IAAK,OAAA,CAAC,IAAI,EAAL,CAAK,CAAC,CAAC;gBAChC,OAAO;aACV;YACD,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;QAC/D,OAAO,cAAM,OAAA,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,eAAe,CAAC,EAAjE,CAAiE,CAAC;IACnF,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,SAAS,CAAC;QACN,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,IAAM,iBAAiB,GAAG,UAAC,KAAiB;YACxC,IAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC;YAC9C,IAAM,MAAM,GAAG,KAAK,CAAC,MAAc,CAAC;YAEpC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBACxC,OAAO;aACV;YAED,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC5D,OAAO,cAAM,OAAA,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAA9D,CAA8D,CAAC;IAChF,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,IAAM,UAAU,GAAoB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,KAAI,EAAE,CAAC;IACrD,IAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,KAAK,oBAAoB,EAA9B,CAA8B,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAClG,IAAM,yBAAyB,GAAG,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,QAAQ,KAAI,EAAE,CAAC;IAEpE,IAAM,YAAY,GAAG,OAAO,CACxB,cAAM,OAAA,eAAe,CAAC,yBAAyB,EAAE,UAAU,CAAC,EAAtD,CAAsD,EAC5D,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAC1C,CAAC;IAEF,IAAM,YAAY,GAAG;QACjB,eAAe;QACf,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QAC9C,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;KAC/C;SACI,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEf,IAAM,eAAe,GAAG,UAAC,SAAwB;QAC7C,uBAAuB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7C,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO,CACH,8BACK,CAAC,SAAS,IAAI,aAAa,IAAI,cAAK,SAAS,EAAC,wBAAwB,EAAC,OAAO,EAAE,cAAM,OAAA,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAxB,CAAwB,GAAI,EAEnH,iBAAO,SAAS,EAAE,YAAY,aAC1B,cAAK,SAAS,EAAC,sBAAsB,YACjC,eAAK,SAAS,EAAC,0BAA0B,EAAC,GAAG,EAAE,oBAAoB,aAC/D,kBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,cAAM,OAAA,gBAAgB,CAAC,UAAC,IAAI,IAAK,OAAA,CAAC,IAAI,EAAL,CAAK,CAAC,EAAjC,CAAiC,gBACrC,kBAAkB,aAE7B,eAAM,SAAS,EAAC,wBAAwB,YACnC,CAAC,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,KAAK,KAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GACzD,EACN,CAAC,WAAW,IAAI,CACb,8BACI,gBAAM,SAAS,EAAC,4BAA4B,aACxC,eAAM,SAAS,EAAC,2BAA2B,0BAAiB,EAC5D,eAAM,SAAS,EAAC,uBAAuB,YAAE,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,KAAK,KAAI,WAAW,GAAQ,IACrF,EACP,eAAM,SAAS,EAAE,uCAAgC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,iBAAc,MAAM,YACjG,eAAK,KAAK,EAAC,4BAA4B,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,aAC1F,eAAM,CAAC,EAAC,eAAe,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,MAAM,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EAChH,eAAM,CAAC,EAAC,gBAAgB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,MAAM,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,IAC/G,GACH,IACR,CACN,IACI,EAER,aAAa,IAAI,CAAC,WAAW,IAAI,CAC9B,cAAK,SAAS,EAAC,sBAAsB,YAChC,UAAU,CAAC,GAAG,CAAC,UAAC,SAAS,IAAK,OAAA,CAC3B,kBACI,IAAI,EAAC,QAAQ,EAEb,SAAS,EAAE,+BAAwB,SAAS,CAAC,GAAG,MAAK,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,GAAG,CAAA,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAE,EAChG,OAAO,EAAE,cAAM,OAAA,eAAe,CAAC,SAAS,CAAC,EAA1B,CAA0B,aAEzC,eAAM,SAAS,EAAC,6BAA6B,YAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAQ,EAChG,eAAM,SAAS,EAAC,4BAA4B,YAAE,SAAS,CAAC,KAAK,GAAQ,KALhE,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,KAAK,CAMhC,CACZ,EAV8B,CAU9B,CAAC,GACA,CACT,IACC,GAEJ,EAEL,CAAC,WAAW,CAAC,CAAC,CAAC,CACZ,8BACI,cAAK,SAAS,EAAC,2BAA2B,YACtC,gBACI,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,UAAC,CAAC,IAAK,OAAA,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAA7B,CAA6B,EAC9C,WAAW,EAAC,mBAAmB,EAC/B,SAAS,EAAC,sBAAsB,GAClC,GACA,EAEN,cAAK,SAAS,EAAC,yBAAyB,YACpC,KAAC,eAAe,IAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAI,GACxH,IACP,CACN,CAAC,CAAC,CAAC,CACA,cAAK,SAAS,EAAC,6BAA6B,YACvC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,CACrC,KAAC,SAAS,IAEN,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,EACtB,SAAS,EAAE,+BAAwB,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAE,EAC3G,KAAK,EAAE,IAAI,CAAC,KAAK,YAEhB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IALhC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAMnB,CACf,EATwC,CASxC,CAAC,GACA,CACT,EAED,eAAK,SAAS,EAAC,sBAAsB,aACjC,KAAC,kBAAkB,IAAC,OAAO,EAAC,SAAS,GAAG,EACxC,KAAC,eAAe,KAAG,IACjB,IACF,EAEP,SAAS,IAAI,WAAW,IAAI,CACzB,iBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,cAAM,OAAA,cAAc,CAAC,KAAK,CAAC,EAArB,CAAqB,gBACzB,gBAAgB,EAC3B,KAAK,EAAC,gBAAgB,GACxB,CACL,IACF,CACN,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import { useGetSolidMenuBasedOnRoleQuery } from \"../../redux/api/solidMenuApi\";\nimport { hideNavbar, toggleNavbar } from \"../../redux/features/navbarSlice\";\nimport { setIsAuthenticated, setUser } from \"../../redux/features/userSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\nimport UserProfileMenu from \"./user-profile-menu\";\nimport SolidLink from \"../common/Link\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { env } from \"../../adapters/env\";\nimport { resolveRetainedModelViewRoute } from \"../../helpers/modelViewPersistence\";\nimport type { MenuItemIconSource } from \"../../helpers/menuItemIcons\";\nimport { SolidMenuItemIcon } from \"./SolidMenuItemIcon\";\n\ntype SolidMenuItem = MenuItemIconSource & {\n key?: string;\n title: string;\n path?: string;\n icon?: string | { src?: string };\n children?: SolidMenuItem[];\n};\n\nconst defaultMenuKey = env(\"NEXT_PUBLIC_DEFAULT_MENU_KEY\");\nconst SIDEBAR_STORAGE_KEY = \"solidx.sidebar.collapsed\";\nconst SELECTED_WORKSPACE_STORAGE_KEY = \"solidx.sidebar.selected-workspace\";\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\nconst DESKTOP_SIDEBAR_WIDTH = \"272px\";\nconst DEFAULT_WORKSPACE_TITLE = \"Solid Core\";\nconst DEFAULT_WORKSPACE_KEY = \"solid-core\";\n\nfunction normalizePath(path: string): string {\n if (!path || path === \"/\") return \"/\";\n return path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction getPathAndParams(targetPath: string): { pathname: string; searchParams: URLSearchParams } {\n const parsed = new URL(targetPath, \"http://localhost\");\n return {\n pathname: normalizePath(parsed.pathname),\n searchParams: new URLSearchParams(parsed.search),\n };\n}\n\nfunction doesSearchParamsMatchSubset(requiredParams: URLSearchParams, currentParams: URLSearchParams): boolean {\n const currentValueCounts = new Map<string, number>();\n currentParams.forEach((value, key) => {\n const token = `${key}=${value}`;\n currentValueCounts.set(token, (currentValueCounts.get(token) || 0) + 1);\n });\n\n let isSubset = true;\n requiredParams.forEach((value, key) => {\n if (!isSubset) return;\n const token = `${key}=${value}`;\n const count = currentValueCounts.get(token) || 0;\n if (count <= 0) {\n isSubset = false;\n return;\n }\n currentValueCounts.set(token, count - 1);\n });\n\n return isSubset;\n}\n\nfunction isMenuPathActive(itemPath: string | undefined, currentPathname: string, currentSearchParams: URLSearchParams): boolean {\n if (!itemPath) return false;\n\n const resolvedItemPath = resolveRetainedModelViewRoute(itemPath);\n const { pathname: itemPathname, searchParams: itemSearchParams } = getPathAndParams(resolvedItemPath);\n if (itemPathname !== normalizePath(currentPathname)) return false;\n\n return doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);\n}\n\nfunction cloneMenuItems(items: SolidMenuItem[] = []): SolidMenuItem[] {\n return items.map((item) => ({\n ...item,\n children: item.children ? cloneMenuItems(item.children) : [],\n }));\n}\n\nfunction filterMenuItems(items: SolidMenuItem[], query: string): SolidMenuItem[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return items;\n\n const next: SolidMenuItem[] = [];\n items.forEach((item) => {\n const children = item.children ? filterMenuItems(item.children, normalizedQuery) : [];\n const matchesSelf = item.title.toLowerCase().includes(normalizedQuery);\n const isPathlessParentMatch = matchesSelf && !item.path && item.children && item.children.length > 0;\n\n if (isPathlessParentMatch) {\n next.push({ ...item, children: cloneMenuItems(item.children) });\n return;\n }\n\n if (matchesSelf || children.length > 0) {\n next.push({ ...item, children });\n }\n });\n return next;\n}\n\nfunction resolveDefaultWorkspace(items: SolidMenuItem[]) {\n return (\n items.find((item) => item.key === DEFAULT_WORKSPACE_KEY) ||\n items.find((item) => item.title.trim().toLowerCase() === DEFAULT_WORKSPACE_TITLE.toLowerCase()) ||\n items.find((item) => item.key === defaultMenuKey) ||\n items[0]\n );\n}\n\nconst SidebarMenuTree = ({\n items,\n pathname,\n searchParams,\n forceExpand,\n}: {\n items: SolidMenuItem[];\n pathname: string;\n searchParams: URLSearchParams;\n forceExpand?: boolean;\n}) => {\n const [expandedKeys, setExpandedKeys] = useState<Record<string, boolean>>({});\n\n const buildNodeId = (node: SolidMenuItem, parentId: string, index: number) => {\n const base = node.key || node.path || node.title || `node-${index}`;\n return `${parentId}/${base}`;\n };\n\n useEffect(() => {\n const initialExpanded: Record<string, boolean> = {};\n if (forceExpand) {\n const walk = (nodes: SolidMenuItem[], parentId = \"root\") => {\n nodes.forEach((node, index) => {\n const nodeId = buildNodeId(node, parentId, index);\n if (node.children && node.children.length > 0 && node.key) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n } else if (node.children && node.children.length > 0) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n }\n });\n };\n walk(items);\n }\n setExpandedKeys(initialExpanded);\n }, [items, forceExpand]);\n\n const toggleExpanded = (nodeId: string) => {\n setExpandedKeys((prev) => ({ ...prev, [nodeId]: !prev[nodeId] }));\n };\n\n const renderNode = (node: SolidMenuItem, depth = 0, parentId = \"root\", index = 0) => {\n const nodeId = buildNodeId(node, parentId, index);\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = expandedKeys[nodeId] === true;\n const isActive = isMenuPathActive(node.path, pathname, searchParams);\n const resolvedPath = node.path ? resolveRetainedModelViewRoute(node.path) : undefined;\n const paddingLeft = 12 + depth * 14;\n\n return (\n <li key={nodeId} className=\"solid-sidebar-tree-item\">\n <div\n className={`solid-sidebar-tree-row ${isActive ? \"is-active\" : \"\"}`}\n style={{ paddingLeft }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-parent flex items-center gap-2\"\n onClick={() => toggleExpanded(nodeId)}\n aria-expanded={isExpanded}\n aria-label={`Toggle ${node.title}`}\n >\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </button>\n ) : node.path ? (\n <SolidLink href={resolvedPath} className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </SolidLink>\n ) : (\n <span className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </span>\n )}\n {hasChildren && (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-toggle\"\n onClick={() => toggleExpanded(nodeId)}\n aria-label={`Toggle ${node.title}`}\n >\n <span className=\"solid-tree-plusminus\">{isExpanded ? \"−\" : \"+\"}</span>\n </button>\n )}\n </div>\n {hasChildren && isExpanded && (\n <ul className=\"solid-sidebar-tree-list solid-sidebar-tree-children\">\n {node.children!.map((child, childIndex) => renderNode(child as SolidMenuItem, depth + 1, nodeId, childIndex))}\n </ul>\n )}\n </li>\n );\n };\n\n return <ul className=\"solid-sidebar-tree-list\">{items.map((item, index) => renderNode(item, 0, \"root\", index))}</ul>;\n};\n\nconst AppSidebar = () => {\n const dispatch = useDispatch();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const visibleNavbar = useSelector((state: any) => state.navbarState.visibleNavbar);\n const { data: menu } = useGetSolidMenuBasedOnRoleQuery(\"\");\n const workspaceSwitcherRef = useRef<HTMLDivElement | null>(null);\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [workspaceOpen, setWorkspaceOpen] = useState(false);\n const [selectedWorkspaceKey, setSelectedWorkspaceKey] = useState<string>(() => {\n if (typeof window === \"undefined\") return \"\";\n return window.localStorage.getItem(SELECTED_WORKSPACE_STORAGE_KEY) || \"\";\n });\n const [isDesktop, setIsDesktop] = useState<boolean>(typeof window === \"undefined\" ? true : window.innerWidth > 1199);\n const [isCollapsed, setIsCollapsed] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n const stored = window.localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (stored === null) return true;\n return stored === \"true\";\n });\n\n const { data } = useSession();\n\n useEffect(() => {\n if (data) {\n dispatch(setUser(data?.user));\n dispatch(setIsAuthenticated(true));\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n const onResize = () => {\n const desktop = window.innerWidth > 1199;\n setIsDesktop(desktop);\n if (desktop) {\n dispatch(hideNavbar());\n }\n };\n\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [dispatch]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(SIDEBAR_STORAGE_KEY, String(isCollapsed));\n }, [isCollapsed]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!selectedWorkspaceKey) {\n window.localStorage.removeItem(SELECTED_WORKSPACE_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(SELECTED_WORKSPACE_STORAGE_KEY, selectedWorkspaceKey);\n }, [selectedWorkspaceKey]);\n\n useEffect(() => {\n const width = isDesktop ? (isCollapsed ? \"0px\" : DESKTOP_SIDEBAR_WIDTH) : \"0px\";\n document.documentElement.style.setProperty(\"--solid-sidebar-width\", width);\n }, [isDesktop, isCollapsed]);\n\n useEffect(() => {\n if (!menu?.data?.length) return;\n const defaultWorkspace = resolveDefaultWorkspace(menu.data);\n const hasSelectedWorkspace = menu.data.some((workspace: SolidMenuItem) => workspace.key === selectedWorkspaceKey);\n const nextWorkspaceKey = hasSelectedWorkspace ? selectedWorkspaceKey : defaultWorkspace?.key || \"\";\n\n if (nextWorkspaceKey !== selectedWorkspaceKey) {\n setSelectedWorkspaceKey(nextWorkspaceKey);\n }\n }, [menu, selectedWorkspaceKey]);\n\n useEffect(() => {\n if (!isDesktop) {\n dispatch(hideNavbar());\n }\n }, [pathname, dispatch, isDesktop]);\n\n useEffect(() => {\n const onToggleRequest = () => {\n if (window.innerWidth > 1199) {\n setIsCollapsed((prev) => !prev);\n return;\n }\n dispatch(toggleNavbar());\n };\n\n window.addEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n return () => window.removeEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n }, [dispatch]);\n\n useEffect(() => {\n if (!workspaceOpen) return;\n\n const handlePointerDown = (event: MouseEvent) => {\n const switcher = workspaceSwitcherRef.current;\n const target = event.target as Node;\n\n if (!switcher || switcher.contains(target)) {\n return;\n }\n\n setWorkspaceOpen(false);\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [workspaceOpen]);\n\n const workspaces: SolidMenuItem[] = menu?.data || [];\n const selectedWorkspace = workspaces.find((m) => m.key === selectedWorkspaceKey) || workspaces[0];\n const selectedWorkspaceChildren = selectedWorkspace?.children || [];\n\n const filteredMenu = useMemo(\n () => filterMenuItems(selectedWorkspaceChildren, searchTerm),\n [selectedWorkspaceChildren, searchTerm]\n );\n\n const shellClasses = [\n \"solid-sidebar\",\n isDesktop && isCollapsed ? \"is-collapsed\" : \"\",\n !isDesktop && visibleNavbar ? \"is-open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const selectWorkspace = (workspace: SolidMenuItem) => {\n setSelectedWorkspaceKey(workspace.key || \"\");\n setSearchTerm(\"\");\n setWorkspaceOpen(false);\n };\n\n return (\n <>\n {!isDesktop && visibleNavbar && <div className=\"solid-sidebar-backdrop\" onClick={() => dispatch(toggleNavbar())} />}\n\n <aside className={shellClasses}>\n <div className=\"solid-sidebar-header\">\n <div className=\"solid-workspace-switcher\" ref={workspaceSwitcherRef}>\n <button\n type=\"button\"\n className=\"solid-workspace-trigger\"\n onClick={() => setWorkspaceOpen((prev) => !prev)}\n aria-label=\"Select workspace\"\n >\n <span className=\"solid-workspace-avatar\">\n {(selectedWorkspace?.title || \"W\").slice(0, 1).toUpperCase()}\n </span>\n {!isCollapsed && (\n <>\n <span className=\"solid-workspace-label-wrap\">\n <span className=\"solid-workspace-label-top\">Workspace</span>\n <span className=\"solid-workspace-label\">{selectedWorkspace?.title || \"Workspace\"}</span>\n </span>\n <span className={`solid-workspace-chevron-dual ${workspaceOpen ? \"is-open\" : \"\"}`} aria-hidden=\"true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 6L7 3L10 6\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M4 8L7 11L10 8\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </>\n )}\n </button>\n\n {workspaceOpen && !isCollapsed && (\n <div className=\"solid-workspace-menu\">\n {workspaces.map((workspace) => (\n <button\n type=\"button\"\n key={workspace.key || workspace.title}\n className={`solid-workspace-item ${workspace.key === selectedWorkspace?.key ? \"is-active\" : \"\"}`}\n onClick={() => selectWorkspace(workspace)}\n >\n <span className=\"solid-workspace-item-avatar\">{workspace.title.slice(0, 1).toUpperCase()}</span>\n <span className=\"solid-workspace-item-label\">{workspace.title}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n </div>\n\n {!isCollapsed ? (\n <>\n <div className=\"solid-sidebar-search-wrap\">\n <input\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"Search in menu...\"\n className=\"solid-sidebar-search\"\n />\n </div>\n\n <div className=\"solid-sidebar-tree-wrap\">\n <SidebarMenuTree items={filteredMenu} pathname={pathname} searchParams={searchParams} forceExpand={!!searchTerm.trim()} />\n </div>\n </>\n ) : (\n <div className=\"solid-sidebar-collapsed-nav\">\n {filteredMenu.slice(0, 10).map((item) => (\n <SolidLink\n key={item.key || item.title}\n href={item.path || \"#\"}\n className={`solid-collapsed-item ${isMenuPathActive(item.path, pathname, searchParams) ? \"is-active\" : \"\"}`}\n title={item.title}\n >\n {item.title.slice(0, 1).toUpperCase()}\n </SolidLink>\n ))}\n </div>\n )}\n\n <div className=\"solid-sidebar-footer\">\n <AdminHeaderActions variant=\"sidebar\" />\n <UserProfileMenu />\n </div>\n </aside>\n\n {isDesktop && isCollapsed && (\n <button\n type=\"button\"\n className=\"solid-sidebar-hotspot\"\n onClick={() => setIsCollapsed(false)}\n aria-label=\"Expand sidebar\"\n title=\"Expand sidebar\"\n />\n )}\n </>\n );\n};\n\nexport default AppSidebar;\n"]}
|
|
1
|
+
{"version":3,"file":"AppSidebar.js","sourceRoot":"","sources":["../../../src/components/layout/AppSidebar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useGetSolidMenuBasedOnRoleQuery } from \"../../redux/api/solidMenuApi\";\nimport { hideNavbar, toggleNavbar } from \"../../redux/features/navbarSlice\";\nimport { setIsAuthenticated, setUser } from \"../../redux/features/userSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\nimport UserProfileMenu from \"./user-profile-menu\";\nimport SolidLink from \"../common/Link\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { env } from \"../../adapters/env\";\nimport { normalizeAssetUrl } from \"../../helpers/assetUrl\";\nimport { resolveRetainedModelViewRoute } from \"../../helpers/modelViewPersistence\";\nimport type { MenuItemIconSource } from \"../../helpers/menuItemIcons\";\nimport { SolidMenuItemIcon } from \"./SolidMenuItemIcon\";\n\ntype SolidMenuItem = Omit<MenuItemIconSource, \"children\" | \"icon\"> & {\n key?: string;\n title: string;\n path?: string;\n icon?: string | null;\n children?: SolidMenuItem[];\n};\n\nconst defaultMenuKey = env(\"NEXT_PUBLIC_DEFAULT_MENU_KEY\");\nconst SIDEBAR_STORAGE_KEY = \"solidx.sidebar.collapsed\";\nconst SELECTED_WORKSPACE_STORAGE_KEY = \"solidx.sidebar.selected-workspace\";\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\nconst DESKTOP_SIDEBAR_WIDTH = \"272px\";\nconst DEFAULT_WORKSPACE_TITLE = \"Solid Core\";\nconst DEFAULT_WORKSPACE_KEY = \"solid-core\";\n\nfunction normalizePath(path: string): string {\n if (!path || path === \"/\") return \"/\";\n return path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction getPathAndParams(targetPath: string): { pathname: string; searchParams: URLSearchParams } {\n const parsed = new URL(targetPath, \"http://localhost\");\n return {\n pathname: normalizePath(parsed.pathname),\n searchParams: new URLSearchParams(parsed.search),\n };\n}\n\nfunction doesSearchParamsMatchSubset(requiredParams: URLSearchParams, currentParams: URLSearchParams): boolean {\n const currentValueCounts = new Map<string, number>();\n currentParams.forEach((value, key) => {\n const token = `${key}=${value}`;\n currentValueCounts.set(token, (currentValueCounts.get(token) || 0) + 1);\n });\n\n let isSubset = true;\n requiredParams.forEach((value, key) => {\n if (!isSubset) return;\n const token = `${key}=${value}`;\n const count = currentValueCounts.get(token) || 0;\n if (count <= 0) {\n isSubset = false;\n return;\n }\n currentValueCounts.set(token, count - 1);\n });\n\n return isSubset;\n}\n\nfunction isMenuPathActive(itemPath: string | undefined, currentPathname: string, currentSearchParams: URLSearchParams): boolean {\n if (!itemPath) return false;\n\n const resolvedItemPath = resolveRetainedModelViewRoute(itemPath);\n const { pathname: itemPathname, searchParams: itemSearchParams } = getPathAndParams(resolvedItemPath);\n if (itemPathname !== normalizePath(currentPathname)) return false;\n\n return doesSearchParamsMatchSubset(itemSearchParams, currentSearchParams);\n}\n\nfunction cloneMenuItems(items: SolidMenuItem[] = []): SolidMenuItem[] {\n return items.map((item) => ({\n ...item,\n children: item.children ? cloneMenuItems(item.children) : [],\n }));\n}\n\nfunction filterMenuItems(items: SolidMenuItem[], query: string): SolidMenuItem[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return items;\n\n const next: SolidMenuItem[] = [];\n items.forEach((item) => {\n const children = item.children ? filterMenuItems(item.children, normalizedQuery) : [];\n const matchesSelf = item.title.toLowerCase().includes(normalizedQuery);\n const isPathlessParentMatch = matchesSelf && !item.path && item.children && item.children.length > 0;\n\n if (isPathlessParentMatch) {\n next.push({ ...item, children: cloneMenuItems(item.children) });\n return;\n }\n\n if (matchesSelf || children.length > 0) {\n next.push({ ...item, children });\n }\n });\n return next;\n}\n\nfunction resolveDefaultWorkspace(items: SolidMenuItem[]) {\n return (\n items.find((item) => item.key === DEFAULT_WORKSPACE_KEY) ||\n items.find((item) => item.title.trim().toLowerCase() === DEFAULT_WORKSPACE_TITLE.toLowerCase()) ||\n items.find((item) => item.key === defaultMenuKey) ||\n items[0]\n );\n}\n\nconst WorkspaceIcon = ({ workspace, className }: { workspace?: SolidMenuItem; className: string }) => {\n const iconUrl = normalizeAssetUrl(workspace?.icon) || null;\n const [failedUrl, setFailedUrl] = useState<string | null>(null);\n const showImage = !!iconUrl && failedUrl !== iconUrl;\n\n useEffect(() => {\n setFailedUrl(null);\n }, [iconUrl]);\n\n return (\n <span className={`${className}${showImage ? \" has-image\" : \"\"}`}>\n {showImage ? (\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n onError={() => setFailedUrl(iconUrl)}\n />\n ) : (\n (workspace?.title || \"W\").slice(0, 1).toUpperCase()\n )}\n </span>\n );\n};\n\nconst SidebarMenuTree = ({\n items,\n pathname,\n searchParams,\n forceExpand,\n}: {\n items: SolidMenuItem[];\n pathname: string;\n searchParams: URLSearchParams;\n forceExpand?: boolean;\n}) => {\n const [expandedKeys, setExpandedKeys] = useState<Record<string, boolean>>({});\n\n const buildNodeId = (node: SolidMenuItem, parentId: string, index: number) => {\n const base = node.key || node.path || node.title || `node-${index}`;\n return `${parentId}/${base}`;\n };\n\n useEffect(() => {\n const initialExpanded: Record<string, boolean> = {};\n if (forceExpand) {\n const walk = (nodes: SolidMenuItem[], parentId = \"root\") => {\n nodes.forEach((node, index) => {\n const nodeId = buildNodeId(node, parentId, index);\n if (node.children && node.children.length > 0 && node.key) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n } else if (node.children && node.children.length > 0) {\n initialExpanded[nodeId] = true;\n walk(node.children, nodeId);\n }\n });\n };\n walk(items);\n }\n setExpandedKeys(initialExpanded);\n }, [items, forceExpand]);\n\n const toggleExpanded = (nodeId: string) => {\n setExpandedKeys((prev) => ({ ...prev, [nodeId]: !prev[nodeId] }));\n };\n\n const renderNode = (node: SolidMenuItem, depth = 0, parentId = \"root\", index = 0) => {\n const nodeId = buildNodeId(node, parentId, index);\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = expandedKeys[nodeId] === true;\n const isActive = isMenuPathActive(node.path, pathname, searchParams);\n const resolvedPath = node.path ? resolveRetainedModelViewRoute(node.path) : undefined;\n const paddingLeft = 12 + depth * 14;\n\n return (\n <li key={nodeId} className=\"solid-sidebar-tree-item\">\n <div\n className={`solid-sidebar-tree-row ${isActive ? \"is-active\" : \"\"}`}\n style={{ paddingLeft }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-parent flex items-center gap-2\"\n onClick={() => toggleExpanded(nodeId)}\n aria-expanded={isExpanded}\n aria-label={`Toggle ${node.title}`}\n >\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </button>\n ) : node.path ? (\n <SolidLink href={resolvedPath} className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </SolidLink>\n ) : (\n <span className=\"solid-sidebar-tree-link flex items-center gap-2\">\n <SolidMenuItemIcon item={node} />\n <span className=\"solid-sidebar-tree-label\">{node.title}</span>\n </span>\n )}\n {hasChildren && (\n <button\n type=\"button\"\n className=\"solid-sidebar-tree-toggle\"\n onClick={() => toggleExpanded(nodeId)}\n aria-label={`Toggle ${node.title}`}\n >\n <span className=\"solid-tree-plusminus\">{isExpanded ? \"−\" : \"+\"}</span>\n </button>\n )}\n </div>\n {hasChildren && isExpanded && (\n <ul className=\"solid-sidebar-tree-list solid-sidebar-tree-children\">\n {node.children!.map((child, childIndex) => renderNode(child as SolidMenuItem, depth + 1, nodeId, childIndex))}\n </ul>\n )}\n </li>\n );\n };\n\n return <ul className=\"solid-sidebar-tree-list\">{items.map((item, index) => renderNode(item, 0, \"root\", index))}</ul>;\n};\n\nconst AppSidebar = () => {\n const dispatch = useDispatch();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const visibleNavbar = useSelector((state: any) => state.navbarState.visibleNavbar);\n const { data: menu } = useGetSolidMenuBasedOnRoleQuery(\"\");\n const workspaceSwitcherRef = useRef<HTMLDivElement | null>(null);\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [workspaceOpen, setWorkspaceOpen] = useState(false);\n const [selectedWorkspaceKey, setSelectedWorkspaceKey] = useState<string>(() => {\n if (typeof window === \"undefined\") return \"\";\n return window.localStorage.getItem(SELECTED_WORKSPACE_STORAGE_KEY) || \"\";\n });\n const [isDesktop, setIsDesktop] = useState<boolean>(typeof window === \"undefined\" ? true : window.innerWidth > 1199);\n const [isCollapsed, setIsCollapsed] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n const stored = window.localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (stored === null) return true;\n return stored === \"true\";\n });\n\n const { data } = useSession();\n\n useEffect(() => {\n if (data) {\n dispatch(setUser(data?.user));\n dispatch(setIsAuthenticated(true));\n }\n }, [data, dispatch]);\n\n useEffect(() => {\n const onResize = () => {\n const desktop = window.innerWidth > 1199;\n setIsDesktop(desktop);\n if (desktop) {\n dispatch(hideNavbar());\n }\n };\n\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [dispatch]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(SIDEBAR_STORAGE_KEY, String(isCollapsed));\n }, [isCollapsed]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!selectedWorkspaceKey) {\n window.localStorage.removeItem(SELECTED_WORKSPACE_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(SELECTED_WORKSPACE_STORAGE_KEY, selectedWorkspaceKey);\n }, [selectedWorkspaceKey]);\n\n useEffect(() => {\n const width = isDesktop ? (isCollapsed ? \"0px\" : DESKTOP_SIDEBAR_WIDTH) : \"0px\";\n document.documentElement.style.setProperty(\"--solid-sidebar-width\", width);\n }, [isDesktop, isCollapsed]);\n\n useEffect(() => {\n if (!menu?.data?.length) return;\n const defaultWorkspace = resolveDefaultWorkspace(menu.data);\n const hasSelectedWorkspace = menu.data.some((workspace: SolidMenuItem) => workspace.key === selectedWorkspaceKey);\n const nextWorkspaceKey = hasSelectedWorkspace ? selectedWorkspaceKey : defaultWorkspace?.key || \"\";\n\n if (nextWorkspaceKey !== selectedWorkspaceKey) {\n setSelectedWorkspaceKey(nextWorkspaceKey);\n }\n }, [menu, selectedWorkspaceKey]);\n\n useEffect(() => {\n if (!isDesktop) {\n dispatch(hideNavbar());\n }\n }, [pathname, dispatch, isDesktop]);\n\n useEffect(() => {\n const onToggleRequest = () => {\n if (window.innerWidth > 1199) {\n setIsCollapsed((prev) => !prev);\n return;\n }\n dispatch(toggleNavbar());\n };\n\n window.addEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n return () => window.removeEventListener(SIDEBAR_TOGGLE_EVENT, onToggleRequest);\n }, [dispatch]);\n\n useEffect(() => {\n if (!workspaceOpen) return;\n\n const handlePointerDown = (event: MouseEvent) => {\n const switcher = workspaceSwitcherRef.current;\n const target = event.target as Node;\n\n if (!switcher || switcher.contains(target)) {\n return;\n }\n\n setWorkspaceOpen(false);\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [workspaceOpen]);\n\n const workspaces: SolidMenuItem[] = menu?.data || [];\n const selectedWorkspace = workspaces.find((m) => m.key === selectedWorkspaceKey) || workspaces[0];\n const selectedWorkspaceChildren = selectedWorkspace?.children || [];\n\n const filteredMenu = useMemo(\n () => filterMenuItems(selectedWorkspaceChildren, searchTerm),\n [selectedWorkspaceChildren, searchTerm]\n );\n\n const shellClasses = [\n \"solid-sidebar\",\n isDesktop && isCollapsed ? \"is-collapsed\" : \"\",\n !isDesktop && visibleNavbar ? \"is-open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n // The collapsed preference belongs to the desktop sidebar. Mobile uses\n // the navbar visibility state for its drawer, so it must always render\n // the full menu when opened.\n const isSidebarContentCollapsed = isDesktop && isCollapsed;\n\n const selectWorkspace = (workspace: SolidMenuItem) => {\n setSelectedWorkspaceKey(workspace.key || \"\");\n setSearchTerm(\"\");\n setWorkspaceOpen(false);\n };\n\n return (\n <>\n {!isDesktop && visibleNavbar && <div className=\"solid-sidebar-backdrop\" onClick={() => dispatch(toggleNavbar())} />}\n\n <aside className={shellClasses}>\n <div className=\"solid-sidebar-header\">\n <div className=\"solid-workspace-switcher\" ref={workspaceSwitcherRef}>\n <button\n type=\"button\"\n className=\"solid-workspace-trigger\"\n onClick={() => setWorkspaceOpen((prev) => !prev)}\n aria-label=\"Select workspace\"\n >\n <WorkspaceIcon workspace={selectedWorkspace} className=\"solid-workspace-avatar\" />\n {!isSidebarContentCollapsed && (\n <>\n <span className=\"solid-workspace-label-wrap\">\n <span className=\"solid-workspace-label-top\">Workspace</span>\n <span className=\"solid-workspace-label\">{selectedWorkspace?.title || \"Workspace\"}</span>\n </span>\n <span className={`solid-workspace-chevron-dual ${workspaceOpen ? \"is-open\" : \"\"}`} aria-hidden=\"true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 6L7 3L10 6\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M4 8L7 11L10 8\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </>\n )}\n </button>\n\n {workspaceOpen && !isSidebarContentCollapsed && (\n <div className=\"solid-workspace-menu\">\n {workspaces.map((workspace) => (\n <button\n type=\"button\"\n key={workspace.key || workspace.title}\n className={`solid-workspace-item ${workspace.key === selectedWorkspace?.key ? \"is-active\" : \"\"}`}\n onClick={() => selectWorkspace(workspace)}\n >\n <WorkspaceIcon workspace={workspace} className=\"solid-workspace-item-avatar\" />\n <span className=\"solid-workspace-item-label\">{workspace.title}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n </div>\n\n {!isSidebarContentCollapsed ? (\n <>\n <div className=\"solid-sidebar-search-wrap\">\n <input\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"Search in menu...\"\n className=\"solid-sidebar-search\"\n />\n </div>\n\n <div className=\"solid-sidebar-tree-wrap\">\n <SidebarMenuTree items={filteredMenu} pathname={pathname} searchParams={searchParams} forceExpand={!!searchTerm.trim()} />\n </div>\n </>\n ) : (\n <div className=\"solid-sidebar-collapsed-nav\">\n {filteredMenu.slice(0, 10).map((item) => (\n <SolidLink\n key={item.key || item.title}\n href={item.path || \"#\"}\n className={`solid-collapsed-item ${isMenuPathActive(item.path, pathname, searchParams) ? \"is-active\" : \"\"}`}\n title={item.title}\n >\n {item.title.slice(0, 1).toUpperCase()}\n </SolidLink>\n ))}\n </div>\n )}\n\n <div className=\"solid-sidebar-footer\">\n <AdminHeaderActions variant=\"sidebar\" />\n <UserProfileMenu />\n </div>\n </aside>\n\n {isDesktop && isCollapsed && (\n <button\n type=\"button\"\n className=\"solid-sidebar-hotspot\"\n onClick={() => setIsCollapsed(false)}\n aria-label=\"Expand sidebar\"\n title=\"Expand sidebar\"\n />\n )}\n </>\n );\n};\n\nexport default AppSidebar;\n"]}
|
|
@@ -10,15 +10,16 @@ import SolidLink from "../common/Link";
|
|
|
10
10
|
import { usePathname } from "../../hooks/usePathname";
|
|
11
11
|
import { useSearchParams } from "../../hooks/useSearchParams";
|
|
12
12
|
import { env } from "../../adapters/env";
|
|
13
|
+
import { normalizeAssetUrl } from "../../helpers/assetUrl";
|
|
13
14
|
import { resolveRetainedModelViewRoute } from "../../helpers/modelViewPersistence";
|
|
14
15
|
import type { MenuItemIconSource } from "../../helpers/menuItemIcons";
|
|
15
16
|
import { SolidMenuItemIcon } from "./SolidMenuItemIcon";
|
|
16
17
|
|
|
17
|
-
type SolidMenuItem = MenuItemIconSource & {
|
|
18
|
+
type SolidMenuItem = Omit<MenuItemIconSource, "children" | "icon"> & {
|
|
18
19
|
key?: string;
|
|
19
20
|
title: string;
|
|
20
21
|
path?: string;
|
|
21
|
-
icon?: string |
|
|
22
|
+
icon?: string | null;
|
|
22
23
|
children?: SolidMenuItem[];
|
|
23
24
|
};
|
|
24
25
|
|
|
@@ -113,6 +114,31 @@ function resolveDefaultWorkspace(items: SolidMenuItem[]) {
|
|
|
113
114
|
);
|
|
114
115
|
}
|
|
115
116
|
|
|
117
|
+
const WorkspaceIcon = ({ workspace, className }: { workspace?: SolidMenuItem; className: string }) => {
|
|
118
|
+
const iconUrl = normalizeAssetUrl(workspace?.icon) || null;
|
|
119
|
+
const [failedUrl, setFailedUrl] = useState<string | null>(null);
|
|
120
|
+
const showImage = !!iconUrl && failedUrl !== iconUrl;
|
|
121
|
+
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
setFailedUrl(null);
|
|
124
|
+
}, [iconUrl]);
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<span className={`${className}${showImage ? " has-image" : ""}`}>
|
|
128
|
+
{showImage ? (
|
|
129
|
+
<img
|
|
130
|
+
src={iconUrl}
|
|
131
|
+
alt=""
|
|
132
|
+
aria-hidden="true"
|
|
133
|
+
onError={() => setFailedUrl(iconUrl)}
|
|
134
|
+
/>
|
|
135
|
+
) : (
|
|
136
|
+
(workspace?.title || "W").slice(0, 1).toUpperCase()
|
|
137
|
+
)}
|
|
138
|
+
</span>
|
|
139
|
+
);
|
|
140
|
+
};
|
|
141
|
+
|
|
116
142
|
const SidebarMenuTree = ({
|
|
117
143
|
items,
|
|
118
144
|
pathname,
|
|
@@ -342,6 +368,10 @@ const AppSidebar = () => {
|
|
|
342
368
|
]
|
|
343
369
|
.filter(Boolean)
|
|
344
370
|
.join(" ");
|
|
371
|
+
// The collapsed preference belongs to the desktop sidebar. Mobile uses
|
|
372
|
+
// the navbar visibility state for its drawer, so it must always render
|
|
373
|
+
// the full menu when opened.
|
|
374
|
+
const isSidebarContentCollapsed = isDesktop && isCollapsed;
|
|
345
375
|
|
|
346
376
|
const selectWorkspace = (workspace: SolidMenuItem) => {
|
|
347
377
|
setSelectedWorkspaceKey(workspace.key || "");
|
|
@@ -362,10 +392,8 @@ const AppSidebar = () => {
|
|
|
362
392
|
onClick={() => setWorkspaceOpen((prev) => !prev)}
|
|
363
393
|
aria-label="Select workspace"
|
|
364
394
|
>
|
|
365
|
-
<
|
|
366
|
-
|
|
367
|
-
</span>
|
|
368
|
-
{!isCollapsed && (
|
|
395
|
+
<WorkspaceIcon workspace={selectedWorkspace} className="solid-workspace-avatar" />
|
|
396
|
+
{!isSidebarContentCollapsed && (
|
|
369
397
|
<>
|
|
370
398
|
<span className="solid-workspace-label-wrap">
|
|
371
399
|
<span className="solid-workspace-label-top">Workspace</span>
|
|
@@ -381,7 +409,7 @@ const AppSidebar = () => {
|
|
|
381
409
|
)}
|
|
382
410
|
</button>
|
|
383
411
|
|
|
384
|
-
{workspaceOpen && !
|
|
412
|
+
{workspaceOpen && !isSidebarContentCollapsed && (
|
|
385
413
|
<div className="solid-workspace-menu">
|
|
386
414
|
{workspaces.map((workspace) => (
|
|
387
415
|
<button
|
|
@@ -390,7 +418,7 @@ const AppSidebar = () => {
|
|
|
390
418
|
className={`solid-workspace-item ${workspace.key === selectedWorkspace?.key ? "is-active" : ""}`}
|
|
391
419
|
onClick={() => selectWorkspace(workspace)}
|
|
392
420
|
>
|
|
393
|
-
<
|
|
421
|
+
<WorkspaceIcon workspace={workspace} className="solid-workspace-item-avatar" />
|
|
394
422
|
<span className="solid-workspace-item-label">{workspace.title}</span>
|
|
395
423
|
</button>
|
|
396
424
|
))}
|
|
@@ -400,7 +428,7 @@ const AppSidebar = () => {
|
|
|
400
428
|
|
|
401
429
|
</div>
|
|
402
430
|
|
|
403
|
-
{!
|
|
431
|
+
{!isSidebarContentCollapsed ? (
|
|
404
432
|
<>
|
|
405
433
|
<div className="solid-sidebar-search-wrap">
|
|
406
434
|
<input
|
|
Binary file
|
|
Binary file
|