@framework-m/desk 0.12.0 → 0.14.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/auth.d.ts +18 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/components/CommandPalette.d.ts +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/audit/AuditTimeline.d.ts +1 -1
- package/dist/components/audit/AuditTimeline.d.ts.map +1 -1
- package/dist/components/audit/DiffViewer.d.ts +1 -1
- package/dist/components/audit/DiffViewer.d.ts.map +1 -1
- package/dist/components/breadcrumb/index.d.ts +1 -1
- package/dist/components/breadcrumb/index.d.ts.map +1 -1
- package/dist/components/correction/CorrectButton.d.ts +1 -1
- package/dist/components/correction/CorrectButton.d.ts.map +1 -1
- package/dist/components/correction/CorrectionWizard.d.ts +1 -1
- package/dist/components/correction/CorrectionWizard.d.ts.map +1 -1
- package/dist/components/feedback/AlertBanner.d.ts +1 -1
- package/dist/components/feedback/AlertBanner.d.ts.map +1 -1
- package/dist/components/feedback/ConfirmDialog.d.ts +1 -1
- package/dist/components/feedback/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/feedback/QuickEditModal.d.ts +2 -1
- package/dist/components/feedback/QuickEditModal.d.ts.map +1 -1
- package/dist/components/feedback/SubmittedBanner.d.ts +1 -1
- package/dist/components/feedback/SubmittedBanner.d.ts.map +1 -1
- package/dist/components/form/AutoForm.d.ts +1 -1
- package/dist/components/form/AutoForm.d.ts.map +1 -1
- package/dist/components/form/FormBodyLayout.d.ts +1 -1
- package/dist/components/form/FormBodyLayout.d.ts.map +1 -1
- package/dist/components/form/FormToolbar.d.ts +1 -1
- package/dist/components/form/FormToolbar.d.ts.map +1 -1
- package/dist/components/form/LinkWidget.d.ts +1 -1
- package/dist/components/form/LinkWidget.d.ts.map +1 -1
- package/dist/components/form/QuickEntryForm.d.ts +1 -1
- package/dist/components/form/QuickEntryForm.d.ts.map +1 -1
- package/dist/components/form/fields/AutoField.d.ts.map +1 -1
- package/dist/components/form/fields/BooleanField.d.ts +1 -1
- package/dist/components/form/fields/BooleanField.d.ts.map +1 -1
- package/dist/components/form/fields/ErrorsField.d.ts +1 -1
- package/dist/components/form/fields/ErrorsField.d.ts.map +1 -1
- package/dist/components/form/fields/ListField.d.ts +1 -1
- package/dist/components/form/fields/ListField.d.ts.map +1 -1
- package/dist/components/form/fields/MultiSelectField.d.ts +1 -1
- package/dist/components/form/fields/MultiSelectField.d.ts.map +1 -1
- package/dist/components/form/fields/SelectField.d.ts +1 -1
- package/dist/components/form/fields/SelectField.d.ts.map +1 -1
- package/dist/components/form/fields/SubmitField.d.ts +1 -1
- package/dist/components/form/fields/SubmitField.d.ts.map +1 -1
- package/dist/components/form/fields/TextField.d.ts +1 -1
- package/dist/components/form/fields/TextField.d.ts.map +1 -1
- package/dist/components/layout/ColumnGrid.d.ts +1 -1
- package/dist/components/layout/ColumnGrid.d.ts.map +1 -1
- package/dist/components/layout/DefaultLandingPage.d.ts +16 -0
- package/dist/components/layout/DefaultLandingPage.d.ts.map +1 -0
- package/dist/components/layout/FrameworkMShell.d.ts +1 -1
- package/dist/components/layout/FrameworkMShell.d.ts.map +1 -1
- package/dist/components/layout/GuestPlaceholder.d.ts +1 -1
- package/dist/components/layout/GuestPlaceholder.d.ts.map +1 -1
- package/dist/components/layout/Navigation/ContextualDrawer.d.ts +1 -1
- package/dist/components/layout/Navigation/ContextualDrawer.d.ts.map +1 -1
- package/dist/components/layout/Navigation/NavigationShell.d.ts +3 -1
- package/dist/components/layout/Navigation/NavigationShell.d.ts.map +1 -1
- package/dist/components/layout/Navigation/PrimaryRail.d.ts +1 -1
- package/dist/components/layout/Navigation/PrimaryRail.d.ts.map +1 -1
- package/dist/components/layout/PageHeader.d.ts +1 -1
- package/dist/components/layout/PageHeader.d.ts.map +1 -1
- package/dist/components/layout/PermissionDenied.d.ts +1 -1
- package/dist/components/layout/PermissionDenied.d.ts.map +1 -1
- package/dist/components/layout/SectionField.d.ts +1 -1
- package/dist/components/layout/SectionField.d.ts.map +1 -1
- package/dist/components/layout/SystemInfo.d.ts.map +1 -1
- package/dist/components/layout/TabContainer.d.ts +1 -1
- package/dist/components/layout/TabContainer.d.ts.map +1 -1
- package/dist/components/list/AsOfDatePicker.d.ts +1 -1
- package/dist/components/list/AsOfDatePicker.d.ts.map +1 -1
- package/dist/components/list/ListBodyLayout.d.ts +7 -4
- package/dist/components/list/ListBodyLayout.d.ts.map +1 -1
- package/dist/components/menu/index.d.ts +1 -1
- package/dist/components/menu/index.d.ts.map +1 -1
- package/dist/components/sibling/SiblingPanel.d.ts +1 -1
- package/dist/components/sibling/SiblingPanel.d.ts.map +1 -1
- package/dist/components/table/AutoTable.d.ts +1 -1
- package/dist/components/table/AutoTable.d.ts.map +1 -1
- package/dist/components/table/BulkActionsBar.d.ts +1 -1
- package/dist/components/table/BulkActionsBar.d.ts.map +1 -1
- package/dist/components/table/EditableCell.d.ts +1 -1
- package/dist/components/table/EditableCell.d.ts.map +1 -1
- package/dist/components/workflow/StateBadge.d.ts +1 -1
- package/dist/components/workflow/StateBadge.d.ts.map +1 -1
- package/dist/components/workflow/WorkflowActions.d.ts +1 -1
- package/dist/components/workflow/WorkflowActions.d.ts.map +1 -1
- package/dist/config/i18n.d.ts.map +1 -1
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/desk.css +2 -1
- package/dist/hooks/useListActions.d.ts +6 -6
- package/dist/hooks/useListActions.d.ts.map +1 -1
- package/dist/hooks/useUIMeta.d.ts +9 -0
- package/dist/hooks/useUIMeta.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10131 -9587
- package/dist/index.js.map +1 -1
- package/dist/locales/en/desk.json +126 -0
- package/dist/locales/es/desk.json +126 -0
- package/dist/locales/fr/desk.json +126 -0
- package/dist/locales/hi/desk.json +126 -0
- package/dist/locales/mr/desk.json +126 -0
- package/dist/locales/ta/desk.json +126 -0
- package/dist/locales/ur/desk.json +126 -0
- package/dist/pages/FormView.d.ts +1 -1
- package/dist/pages/FormView.d.ts.map +1 -1
- package/dist/pages/ListView.d.ts +2 -2
- package/dist/pages/ListView.d.ts.map +1 -1
- package/dist/pages/LoginLogo.d.ts +1 -1
- package/dist/pages/LoginLogo.d.ts.map +1 -1
- package/dist/pages/LoginPage.d.ts +1 -1
- package/dist/pages/LoginPage.d.ts.map +1 -1
- package/dist/plugins/Slot.d.ts +1 -1
- package/dist/plugins/Slot.d.ts.map +1 -1
- package/dist/providers/SystemConfigProvider.d.ts +26 -0
- package/dist/providers/SystemConfigProvider.d.ts.map +1 -0
- package/dist/shell/ShellProvider.d.ts +1 -1
- package/dist/shell/ShellProvider.d.ts.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/views/CalendarView.d.ts +1 -1
- package/dist/views/CalendarView.d.ts.map +1 -1
- package/dist/views/GanttView.d.ts +1 -1
- package/dist/views/GanttView.d.ts.map +1 -1
- package/dist/views/KanbanView.d.ts +1 -1
- package/dist/views/KanbanView.d.ts.map +1 -1
- package/dist/views/TreeView.d.ts +1 -1
- package/dist/views/TreeView.d.ts.map +1 -1
- package/dist/workspace/WorkspaceSection.d.ts +1 -1
- package/dist/workspace/WorkspaceSection.d.ts.map +1 -1
- package/locales/en/desk.json +126 -0
- package/locales/es/desk.json +126 -0
- package/locales/fr/desk.json +126 -0
- package/locales/hi/desk.json +126 -0
- package/locales/mr/desk.json +126 -0
- package/locales/ta/desk.json +126 -0
- package/locales/ur/desk.json +126 -0
- package/package.json +35 -29
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api.ts","../src/data.ts","../src/authConfig.ts","../src/auth.ts","../src/live.ts","../src/hooks/useMFetch.ts","../src/components/form/LinkWidgetHelpers.ts","../src/hooks/useDocTypeMeta.ts","../src/components/layout/SystemInfo.tsx","../src/components/form/QuickEntryForm.tsx","../src/components/form/LinkWidget.tsx","../src/components/form/fields/TextField.tsx","../src/components/form/fields/BooleanField.tsx","../src/components/form/fields/SelectField.tsx","../src/components/form/fields/ListField.tsx","../src/components/form/fields/registry.ts","../src/components/form/fields/AutoField.tsx","../src/components/form/fields/ErrorsField.tsx","../src/components/form/fields/SubmitField.tsx","../src/components/form/AutoForm.tsx","../src/hooks/useTranslation.ts","../src/components/table/tableUtils.ts","../src/components/table/AutoTable.tsx","../src/components/table/EditableCell.tsx","../src/components/feedback/ConfirmDialog.tsx","../src/components/feedback/AlertBanner.tsx","../src/components/feedback/SubmittedBanner.tsx","../src/components/table/BulkActionsBar.tsx","../src/components/workflow/StateBadge.tsx","../src/hooks/useWorkflowActions.ts","../src/components/workflow/WorkflowActions.tsx","../src/plugins/registry.ts","../src/plugins/Slot.tsx","../src/hooks/useAuditTimeline.ts","../src/components/audit/DiffViewer.tsx","../src/components/audit/AuditTimeline.tsx","../src/hooks/useDocTypes.ts","../src/hooks/useRouteTraversal.ts","../src/hooks/useFormController.ts","../src/hooks/useInlineEdit.ts","../src/hooks/useBulkActions.ts","../src/hooks/useCommandPalette.ts","../src/hooks/useComponentOverride.ts","../src/hooks/usePageOverride.ts","../src/hooks/uiMetaUtils.ts","../src/hooks/useUIMeta.ts","../src/hooks/useCorrectionAction.ts","../src/hooks/useSiblingDocTypes.ts","../src/hooks/useFormKeyboard.ts","../src/hooks/useListFilters.ts","../src/hooks/useFormActions.ts","../src/hooks/useListActions.ts","../src/components/list/AsOfDatePicker.tsx","../src/components/layout/ShellSkeleton.tsx","../src/views/registry.ts","../src/components/feedback/QuickEditModal.tsx","../src/views/utils.ts","../src/views/KanbanView.tsx","../src/views/CalendarView.tsx","../src/views/GanttView.tsx","../src/views/treeUtils.ts","../src/views/TreeView.tsx","../src/components/list/ListBodyLayout.tsx","../src/components/correction/CorrectionWizard.tsx","../src/components/correction/CorrectButton.tsx","../src/components/sibling/SiblingPanel.tsx","../src/components/CommandPalette.tsx","../src/components/menu/index.tsx","../src/components/breadcrumb/index.tsx","../src/components/layout/TabContainer.tsx","../src/components/layout/SectionField.tsx","../src/components/layout/ColumnGrid.tsx","../src/components/layout/PageHeader.tsx","../src/components/layout/index.tsx","../src/workspace/WorkspaceSection.tsx","../src/pages/ListView.tsx","../src/components/form/FormToolbar.tsx","../src/shell/context.ts","../src/hooks/useShell.ts","../src/components/form/FormBodyLayout.tsx","../src/components/form/FormViewHeader.tsx","../src/pages/FormView.tsx","../src/pages/loginUtils.ts","../src/pages/LoginLogo.tsx","../src/pages/LoginPage.tsx","../src/shell/adapters/localRealtimeAdapter.ts","../src/shell/hooks/useRealtime.ts","../src/shell/hooks/useOmniSearch.ts","../src/shell/hooks/useSidebarSections.ts","../src/shell/ShellProvider.tsx","../src/shell/realtime.ts","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.js","../__vite-browser-external","../../../node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/index.js","../../../node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/index.js","../../../node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/index.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/abs.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/floor.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/max.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/min.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/pow.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/round.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNaN.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/sign.js","../../../node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/gOPD.js","../../../node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/index.js","../../../node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/index.js","../../../node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/shams.js","../../../node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/index.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Reflect.getPrototypeOf.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Object.getPrototypeOf.js","../../../node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js","../../../node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionCall.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/reflectApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/actualApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/index.js","../../../node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/get.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/index.js","../../../node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/index.js","../../../node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/index.js","../../../node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/index.js","../../../node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/index.js","../../../node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/index.js","../../../node_modules/.pnpm/side-channel@1.1.0/node_modules/side-channel/index.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/formats.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/utils.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/stringify.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/parse.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/index.js","../../../node_modules/.pnpm/@refinedev+react-router@2.0.4_@refinedev+core@5.0.12_@tanstack+react-query@5.100.14_rea_5b6397574919afff0e1ce07fa1231494/node_modules/@refinedev/react-router/dist/index.mjs","../src/components/layout/Navigation/PrimaryRail.tsx","../src/components/layout/Navigation/ContextualDrawer.tsx","../src/components/layout/Navigation/NavigationShell.tsx","../src/config/i18n.ts","../src/components/layout/FrameworkMShell.tsx"],"sourcesContent":["/**\n * Framework M Frontend Configuration\n *\n * Configuration is loaded from window.__FRAMEWORK_CONFIG__ if available,\n * otherwise uses same-origin defaults.\n */\n\n// Type definition for global config\ndeclare global {\n interface Window {\n __FRAMEWORK_CONFIG__?: {\n apiBaseUrl?: string;\n apiVersion?: string;\n metaBaseUrl?: string;\n openapiUrl?: string;\n wsBaseUrl?: string;\n frameworkMode?: \"MONOLITH\" | \"MACROSERVICE\";\n /** Auth configuration */\n auth?: {\n authStrategy?: \"cookie\" | \"oidc\";\n loginUrl?: string;\n oidcConfig?: {\n authority: string;\n clientId: string;\n redirectUri: string;\n };\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n }\n}\n\n/**\n * API version - defaults to v1, configurable via window config.\n */\nexport const API_VERSION = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n return config.apiVersion || \"v1\";\n})();\n\n/**\n * Execution mode - defaults to MONOLITH, configurable via window config or env.\n */\nexport const FRAMEWORK_MODE = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n if (config.frameworkMode) return config.frameworkMode;\n\n const envMode = typeof process !== \"undefined\" ? process.env.FRAMEWORK_MODE : undefined;\n return (envMode?.toUpperCase() || \"MONOLITH\") as \"MONOLITH\" | \"MACROSERVICE\";\n})();\n\n/**\n * API endpoints - uses same-origin by default, configurable via window config.\n * Supports dynamic service-prefixed paths (e.g., /api/finance/v1).\n */\nexport const API_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}`\n : `/api/${API_VERSION}`;\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base;\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}`\n : `/api/${API_VERSION}`;\n})();\n\nexport const META_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.metaBaseUrl) return config.metaBaseUrl;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\" ? `/api/${serviceName}/meta` : \"/api/meta\";\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base.replace(`/${API_VERSION}`, \"/meta\");\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\" ? `/api/${serviceName}/meta` : \"/api/meta\";\n})();\n\nexport const SCHEMA_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.openapiUrl) return config.openapiUrl;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\" ? `/api/${serviceName}/schema` : \"/api/schema\";\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base.replace(`/${API_VERSION}`, \"/schema\");\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/schema`\n : \"/api/schema\";\n})();\n\nexport const WS_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.wsBaseUrl) return config.wsBaseUrl;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}/stream`\n : `/api/${API_VERSION}/stream`;\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}/stream` : `${base}/stream`;\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}/stream`\n : `/api/${API_VERSION}/stream`;\n})();\n","/**\n * Core API Client Utilities.\n *\n * Centralizes fetch logic and standardizes request headers,\n * including automatic Idempotency-Key injection for mutations.\n */\n\nimport { parseApiPath, PluginRegistry } from \"@framework-m/plugin-sdk\";\n\n/**\n * Wrapper around standard `fetch` that ensures credentials are included\n * and automatically injects an `Idempotency-Key` for mutating requests.\n *\n * @param url The URL to fetch.\n * @param options Standard RequestInit options.\n * @returns Promise<Response>\n */\nexport async function fetchWithCredentials(\n url: string | URL | Request,\n options: RequestInit = {}\n): Promise<Response> {\n const fetchOptions: RequestInit = {\n ...options,\n credentials: options.credentials ?? \"include\",\n };\n\n const headers = (fetchOptions.headers || {}) as Record<string, string>;\n\n // 1. Inject JWT if present\n const token = typeof window !== \"undefined\" ? localStorage.getItem(\"token\") : null;\n if (token && !headers[\"Authorization\"]) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // 2. Auto-inject Idempotency-Key for mutations\n const method = (fetchOptions.method || \"GET\").toUpperCase();\n const mutatingMethods = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\n if (mutatingMethods.includes(method)) {\n if (!headers[\"Idempotency-Key\"]) {\n headers[\"Idempotency-Key\"] = crypto.randomUUID();\n }\n }\n\n const registry = PluginRegistry.getInstance();\n const finalUrl = typeof url === \"string\" ? registry.resolveApiUrl(url) : url;\n\n // 3. Inject service hint if owner is known\n if (typeof url === \"string\" && url.includes(\"/api/\")) {\n const { resource } = parseApiPath(url);\n if (resource) {\n const owner = registry.getOwner(resource);\n if (owner && !headers[\"X-Framework-M-Service\"]) {\n headers[\"X-Framework-M-Service\"] = owner;\n }\n }\n }\n\n if (Object.keys(headers).length > 0) {\n fetchOptions.headers = headers;\n }\n\n return fetch(finalUrl, fetchOptions);\n}\n","/**\n * Framework M Data Provider for Refine\n *\n * Custom DataProvider implementation that connects to Framework M REST API.\n * Handles CRUD operations, pagination, sorting, and filtering.\n */\n\nimport type {\n BaseRecord,\n CreateParams,\n CreateResponse,\n CustomParams,\n CustomResponse,\n DataProvider,\n DeleteOneParams,\n DeleteOneResponse,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n UpdateParams,\n UpdateResponse,\n} from \"@refinedev/core\";\nimport { API_URL, API_VERSION, FRAMEWORK_MODE } from \"./constants\";\nimport { fetchWithCredentials as coreFetch } from \"./api\";\nimport { PluginRegistry } from \"@framework-m/plugin-sdk\";\nimport type { ListResponse } from \"./types\";\n\ninterface ErrorPayload {\n detail?: string;\n message?: string;\n error?: string;\n errors?: unknown;\n}\n\nclass FrameworkApiError extends Error {\n status: number;\n code?: string;\n details?: unknown;\n\n constructor(message: string, status: number, code?: string, details?: unknown) {\n super(message);\n this.name = \"FrameworkApiError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nfunction buildActionPermissionMessage(\n status: number,\n action: string | undefined,\n resource: string | undefined,\n backendMessage: string | undefined\n): string {\n const normalizedResource = resource ? resource.replaceAll(\"_\", \" \") : \"resource\";\n\n if (status === 401) {\n return backendMessage || \"Authentication required. Please log in.\";\n }\n\n if (status === 403) {\n const actionText = action ?? \"perform this action on\";\n const base = `Insufficient permission to ${actionText} ${normalizedResource}.`;\n if (backendMessage && !backendMessage.toLowerCase().includes(\"insufficient permission\")) {\n return `${base} ${backendMessage}`;\n }\n return base;\n }\n\n return (\n backendMessage ||\n `Request failed (${status}) while trying to ${action ?? \"access\"} ${normalizedResource}.`\n );\n}\n\n/**\n * Build pagination params\n */\nfunction buildPaginationParams(\n pagination: { current?: number; currentPage?: number; pageSize?: number } | undefined\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!pagination) return params;\n\n const current = pagination.currentPage ?? pagination.current ?? 1;\n const pageSize = pagination.pageSize ?? 20;\n params.set(\"limit\", String(pageSize));\n params.set(\"offset\", String((current - 1) * pageSize));\n return params;\n}\n\n/**\n * Build sorting params\n */\nfunction buildSortingParams(\n sorters: Array<{ field: string; order: string }> | undefined\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!sorters || sorters.length === 0) return params;\n\n const sorter = sorters[0]; // Framework M supports single sort\n const order = sorter.order === \"desc\" ? \"-\" : \"\";\n params.set(\"order_by\", `${order}${sorter.field}`);\n return params;\n}\n\n/**\n * Convert filter value to string\n */\nfunction filterValueToString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n return value.map((item) => filterValueToString(item)).join(\",\");\n }\n return JSON.stringify(value);\n}\n\n/**\n * Build filter params\n */\nfunction buildFilterParams(\n filters: Array<{ field?: string; operator?: string; value?: unknown }> | undefined\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!filters || filters.length === 0) return params;\n\n for (const filter of filters) {\n if (!(\"field\" in filter) || !filter.field || filter.value === undefined) {\n continue;\n }\n\n const op = filter.operator || \"eq\";\n const valueStr = filterValueToString(filter.value);\n\n if (op === \"eq\") {\n params.set(filter.field, valueStr);\n } else {\n // Framework M uses field[op]=value format\n params.set(`${filter.field}[${op}]`, valueStr);\n }\n }\n return params;\n}\n\n/**\n * Build query string from Refine params\n */\nfunction buildQueryString(params: GetListParams): string {\n const searchParams = new URLSearchParams();\n\n // Pagination\n const paginationParams = buildPaginationParams(\n params.pagination as { current?: number; pageSize?: number } | undefined\n );\n paginationParams.forEach((value, key) => searchParams.set(key, value));\n\n // Sorting\n const sortingParams = buildSortingParams(params.sorters);\n sortingParams.forEach((value, key) => searchParams.set(key, value));\n\n // Filters\n const filterParams = buildFilterParams(params.filters);\n filterParams.forEach((value, key) => searchParams.set(key, value));\n\n return searchParams.toString();\n}\n\n/**\n * Make a fetch request with credentials (cookies)\n */\nasync function fetchWithCredentials<T>(\n url: string,\n options: RequestInit = {},\n context?: { action?: string; resource?: string }\n): Promise<T> {\n const response = await coreFetch(url, {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as ErrorPayload;\n\n const backendMessage =\n (typeof payload.message === \"string\" && payload.message) ||\n (typeof payload.detail === \"string\" && payload.detail) ||\n response.statusText;\n\n const message = buildActionPermissionMessage(\n response.status,\n context?.action,\n context?.resource,\n backendMessage\n );\n\n throw new FrameworkApiError(\n message,\n response.status,\n typeof payload.error === \"string\" ? payload.error : undefined,\n payload.errors\n );\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return {} as T;\n }\n\n return response.json();\n}\n\n/**\n * Build resource URL handling namespaced resources (service/doctype).\n * Automatically resolves owner from registry for flat resource names.\n */\nfunction buildResourceUrl(resource: string, id?: string | number, query?: string): string {\n let url: string;\n const registry = PluginRegistry.getInstance();\n\n let service: string | undefined;\n let doctype = resource;\n\n if (resource.includes(\"/\")) {\n const [s, ...rest] = resource.split(\"/\");\n service = s;\n doctype = rest.join(\"/\");\n } else {\n // Check registry for owner\n service = registry.getOwner(resource) || undefined;\n }\n\n if (service && FRAMEWORK_MODE !== \"MONOLITH\") {\n url = `/api/${service}/${API_VERSION}/${doctype}`;\n } else {\n url = `${API_URL}/${doctype}`;\n }\n\n if (id !== undefined) {\n url += `/${id}`;\n }\n\n if (query) {\n url += `?${query}`;\n }\n\n return registry.resolveApiUrl(url);\n}\n\n/**\n * Framework M Data Provider\n */\nexport const frameworkMDataProvider: DataProvider = {\n /**\n * Get a list of resources with pagination, sorting, and filtering\n */\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource } = params;\n const query = buildQueryString(params);\n const url = buildResourceUrl(resource, undefined, query);\n\n const response = await fetchWithCredentials<ListResponse<TData>>(\n url,\n {},\n {\n action: \"read\",\n resource,\n }\n );\n\n return {\n data: response.items,\n total: response.total,\n };\n },\n\n /**\n * Get a single resource by ID\n */\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n const url = buildResourceUrl(resource, id);\n\n const data = await fetchWithCredentials<TData>(\n url,\n {},\n {\n action: \"read\",\n resource,\n }\n );\n\n return { data };\n },\n\n /**\n * Create a new resource\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n const url = buildResourceUrl(resource);\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"POST\",\n body: JSON.stringify(variables),\n },\n {\n action: \"create\",\n resource,\n }\n );\n\n return { data };\n },\n\n /**\n * Update an existing resource\n */\n update: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n const url = buildResourceUrl(resource, id);\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"PUT\",\n body: JSON.stringify(variables),\n },\n {\n action: \"update\",\n resource,\n }\n );\n\n return { data };\n },\n\n /**\n * Delete a resource\n */\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n const url = buildResourceUrl(resource, id);\n\n await fetchWithCredentials(\n url,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n }\n );\n\n return { data: { id } as TData };\n },\n\n /**\n * Delete multiple resources by IDs\n */\n deleteMany: async <TData extends BaseRecord = BaseRecord>(params: {\n resource: string;\n ids: (string | number)[];\n }): Promise<{ data: TData[] }> => {\n const { resource, ids } = params;\n\n // Delete each item in parallel\n await Promise.all(\n ids.map((id) =>\n fetchWithCredentials(\n buildResourceUrl(resource, id),\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n }\n ).catch(() => {})\n )\n );\n\n return { data: ids.map((id) => ({ id }) as TData) };\n },\n\n /**\n * Get the API URL (required by Refine)\n */\n getApiUrl: () => API_URL,\n\n /**\n * Custom method for Framework M specific operations\n * e.g., workflow transitions, RPC calls\n */\n custom: async <TData extends BaseRecord = BaseRecord, TQuery = unknown, TPayload = unknown>(\n params: CustomParams<TQuery, TPayload>\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, headers } = params;\n const fullUrl = url.startsWith(\"http\") ? url : `${API_URL}${url}`;\n\n const data = await fetchWithCredentials<TData>(\n fullUrl,\n {\n method: method || \"GET\",\n body: payload ? JSON.stringify(payload) : undefined,\n headers: headers as HeadersInit,\n },\n {\n action: (method || \"GET\").toLowerCase(),\n resource: \"custom endpoint\",\n }\n );\n\n return { data };\n },\n};\n","/**\n * Auth Configuration Types\n *\n * Per checklist 4.1: Auth configuration via window.__FRAMEWORK_CONFIG__\n */\n\n/**\n * OIDC configuration for client-side PKCE flow\n */\nexport interface OIDCConfig {\n /** OIDC authority URL */\n authority: string;\n /** Client ID */\n clientId: string;\n /** Redirect URI after auth */\n redirectUri: string;\n /** Post-logout redirect URI */\n postLogoutRedirectUri?: string;\n /** Scopes to request */\n scope?: string;\n}\n\n/**\n * Auth strategy type\n * - \"cookie\": Indie/BFF mode with HttpOnly cookies\n * - \"oidc\": Client-side PKCE with OIDC provider\n */\nexport type AuthStrategy = \"cookie\" | \"oidc\";\n\n/**\n * Framework auth configuration\n */\nexport interface AuthConfig {\n /** Auth strategy */\n authStrategy: AuthStrategy;\n /** Login URL for cookie mode (redirect on 401) */\n loginUrl?: string;\n /** OIDC config for oidc mode */\n oidcConfig?: OIDCConfig;\n}\n\n/**\n * Get auth config from window or defaults\n */\nexport function getAuthConfig(): AuthConfig {\n const config = (window as unknown as { __FRAMEWORK_CONFIG__?: { auth?: AuthConfig } })\n .__FRAMEWORK_CONFIG__?.auth;\n\n return {\n authStrategy: config?.authStrategy ?? \"cookie\",\n loginUrl: config?.loginUrl ?? \"/login\",\n oidcConfig: config?.oidcConfig,\n };\n}\n","/**\n * Framework M Auth Provider for Refine\n *\n * Cookie-based authentication that integrates with Framework M's auth endpoints.\n * Uses HttpOnly cookies for secure token storage.\n */\n\nimport type { AuthProvider } from \"@refinedev/core\";\nimport { API_URL } from \"./constants\";\nimport { getAuthConfig } from \"./authConfig\";\nimport { fetchWithCredentials } from \"./api\";\nimport type { UserIdentity } from \"./types\";\n\n/**\n * Framework M Auth Provider\n *\n * Authentication Strategy:\n * - Login: POST /api/v1/auth/login (sets HttpOnly cookie)\n * - Logout: POST /api/v1/auth/logout (clears cookie)\n * - Check: GET /api/v1/auth/me (validates session)\n */\nexport const authProvider: AuthProvider = {\n /**\n * Login with email and password\n */\n login: async ({ email, password }: { email: string; password: string }) => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\", // Required for cookies\n body: JSON.stringify({ email, password }),\n });\n\n if (response.ok) {\n return {\n success: true,\n redirectTo: \"/\",\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Invalid credentials\",\n }));\n\n const errorMessage = error.message || error.detail || \"Invalid email or password\";\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: errorMessage,\n },\n };\n } catch {\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Network error. Please try again.\",\n },\n };\n }\n },\n\n /**\n * Logout and clear session\n */\n logout: async () => {\n try {\n await fetchWithCredentials(`${API_URL}/auth/logout`, {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n // Ignore logout errors, redirect anyway\n }\n\n return {\n success: true,\n redirectTo: \"/login\",\n };\n },\n\n /**\n * Check if user is authenticated\n */\n check: async () => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n return { authenticated: true };\n }\n\n const { loginUrl } = getAuthConfig();\n return { authenticated: false, redirectTo: loginUrl ?? \"/login\" };\n } catch {\n const { loginUrl } = getAuthConfig();\n return { authenticated: false, redirectTo: loginUrl ?? \"/login\" };\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<UserIdentity | null> => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } = await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (identityId === \"guest\" || identityName === \"guest user\" || identityEmail === \"guest\") {\n return null;\n }\n return {\n id: user.id,\n email: user.email,\n name: user.name || user.email,\n avatar: user.avatar,\n roles: user.roles || [],\n };\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get user permissions (roles)\n */\n getPermissions: async () => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } = await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (identityId === \"guest\" || identityName === \"guest user\" || identityEmail === \"guest\") {\n return null;\n }\n return user.roles || [];\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Handle authentication errors\n */\n onError: async (error: unknown) => {\n const err = error as { status?: number };\n // If 401 Unauthorized, logout and redirect\n if (err && err.status === 401) {\n const { loginUrl } = getAuthConfig();\n return {\n logout: true,\n redirectTo: loginUrl ?? \"/login\",\n };\n }\n\n // For other errors, just return the error\n return { error: error as Error };\n },\n};\n","/**\n * Framework M Live Provider for Refine\n *\n * WebSocket-based real-time updates provider.\n * Per checklist 6.1: Refine Live Provider Implementation.\n *\n * Features:\n * - Subscribe to resource changes via WebSocket\n * - Automatic UI updates on created/updated/deleted events\n * - Channel-based pub/sub\n */\n\nimport type { LiveProvider, LiveEvent } from \"@refinedev/core\";\nimport { WS_URL } from \"./constants\";\nimport { fetchWithCredentials } from \"./api\";\n\n/**\n * Active WebSocket connections by channel\n */\nconst connections = new Map<string, WebSocket>();\n\n/**\n * Subscription callbacks by channel\n */\nconst subscriptions = new Map<string, Set<(event: LiveEvent) => void>>();\n\n/**\n * Get or create WebSocket connection for a channel\n */\nfunction getConnection(channel: string): WebSocket {\n let ws = connections.get(channel);\n\n if (ws && ws.readyState === WebSocket.OPEN) {\n return ws;\n }\n\n // Create new connection\n let wsUrl = WS_URL;\n if (!WS_URL.startsWith(\"ws\")) {\n const protocol = globalThis.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl = `${protocol}//${globalThis.location.host}${WS_URL}`;\n }\n\n ws = new WebSocket(`${wsUrl}?channel=${encodeURIComponent(channel)}`);\n\n ws.onopen = () => {\n console.debug(`[LiveProvider] Connected to channel: ${channel}`);\n };\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data) as LiveEvent;\n\n // Notify all subscribers for this channel\n const callbacks = subscriptions.get(channel);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (err) {\n console.error(\"[LiveProvider] Callback error:\", err);\n }\n });\n }\n } catch (err) {\n console.error(\"[LiveProvider] Failed to parse message:\", err);\n }\n };\n\n ws.onerror = (error) => {\n console.error(`[LiveProvider] WebSocket error on channel ${channel}:`, error);\n };\n\n ws.onclose = () => {\n console.debug(`[LiveProvider] Disconnected from channel: ${channel}`);\n connections.delete(channel);\n };\n\n connections.set(channel, ws);\n return ws;\n}\n\n/**\n * Close connection if no more subscribers\n */\nfunction maybeCloseConnection(channel: string): void {\n const callbacks = subscriptions.get(channel);\n if (!callbacks || callbacks.size === 0) {\n const ws = connections.get(channel);\n if (ws) {\n ws.close();\n connections.delete(channel);\n }\n subscriptions.delete(channel);\n }\n}\n\n/**\n * Framework M Live Provider\n *\n * Implements Refine's LiveProvider interface for real-time updates.\n *\n * @example\n * ```tsx\n * <Refine\n * liveProvider={liveProvider}\n * options={{ liveMode: \"auto\" }}\n * />\n * ```\n */\nexport const liveProvider: LiveProvider = {\n /**\n * Subscribe to resource changes\n */\n subscribe: ({\n channel,\n types,\n callback,\n params,\n }: {\n channel?: string;\n types?: string[];\n callback: (event: LiveEvent) => void;\n params?: { resource?: string };\n }) => {\n // Use resource as channel if not specified\n const channelName = channel ?? params?.resource ?? \"default\";\n\n // Ensure connection exists\n getConnection(channelName);\n\n // Create filtered callback\n const filteredCallback = (event: LiveEvent) => {\n // Filter by types if specified\n if (types && types.length > 0 && !types.includes(event.type)) {\n return;\n }\n\n // Filter by resource if specified\n if (params?.resource && event.channel !== params.resource && event.channel !== channelName) {\n return;\n }\n\n callback(event);\n };\n\n // Add to subscriptions\n if (!subscriptions.has(channelName)) {\n subscriptions.set(channelName, new Set());\n }\n subscriptions.get(channelName)!.add(filteredCallback);\n\n // Return unsubscribe function\n return () => {\n const callbacks = subscriptions.get(channelName);\n if (callbacks) {\n callbacks.delete(filteredCallback);\n maybeCloseConnection(channelName);\n }\n };\n },\n\n /**\n * Unsubscribe from resource changes\n */\n unsubscribe: (unsubscribeFn: (() => void) | undefined) => {\n // Call the unsubscribe function returned by subscribe\n if (typeof unsubscribeFn === \"function\") {\n unsubscribeFn();\n }\n },\n\n /**\n * Publish an event (optional, usually server-driven)\n */\n publish: async (event: { channel: string; type: string; payload: unknown }) => {\n const { channel, type, payload } = event;\n\n try {\n // Use REST endpoint to publish (server will broadcast via WebSocket)\n const apiUrl = WS_URL.replace(/^ws/, \"http\").replace(\"/stream\", \"/live/publish\");\n\n await fetchWithCredentials(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ channel, type, payload }),\n });\n } catch (err) {\n console.error(\"[LiveProvider] Failed to publish event:\", err);\n }\n },\n};\n\n/**\n * Close all WebSocket connections\n * Call this on app unmount or logout\n */\nexport function closeAllConnections(): void {\n connections.forEach((ws) => {\n ws.close();\n });\n connections.clear();\n subscriptions.clear();\n}\n","import { fetchWithCredentials } from \"../api\";\n\n/**\n * useMFetch — A service-aware fetch hook for Framework M.\n *\n * This hook returns a fetch function that automatically handles:\n * 1. Routing of /api/v1/:resource to the correct macroservice (e.g. /api/finance/v1/...).\n * 2. Injection of credentials and idempotency keys (via fetchWithCredentials).\n * 3. Injection of X-Framework-M-Service headers for gateway proxying.\n */\nexport function useMFetch() {\n return fetchWithCredentials;\n}\n","import { useState, useEffect } from \"react\";\n\n/**\n * Debounce helper\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Get nested path values safely\n */\nexport function getPathValue(source: unknown, path: string): unknown {\n if (!source || !path) {\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n let current: unknown = source;\n\n for (const segment of segments) {\n if (current == null || typeof current !== \"object\") {\n return undefined;\n }\n\n if (Array.isArray(current)) {\n const index = Number(segment);\n if (!Number.isInteger(index) || index < 0 || index >= current.length) {\n return undefined;\n }\n current = current[index];\n continue;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Resolve watch relational paths\n */\nexport function resolveWatchPath(fieldName: string | undefined, watchField: string): string {\n if (!watchField) {\n return \"\";\n }\n\n if (watchField.includes(\".\")) {\n return watchField;\n }\n\n if (!fieldName || !fieldName.includes(\".\")) {\n return watchField;\n }\n\n const segments = fieldName.split(\".\");\n return `${segments.slice(0, -1).join(\".\")}.${watchField}`;\n}\n","/**\n * useDocTypeMeta Hook\n *\n * Fetches and caches DocType metadata from /api/meta/{doctype}.\n * Uses React Query for aggressive caching.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { META_URL } from \"../constants\";\nimport { fetchWithCredentials } from \"../api\";\nimport type {\n DocTypeMeta,\n DocTypeSchema,\n DocTypePermissions,\n LayoutConfig,\n WorkflowConfig,\n} from \"./types\";\n\n/**\n * Fetch metadata for a DocType\n */\nasync function fetchDocTypeMeta(doctype: string): Promise<DocTypeMeta> {\n const response = await fetchWithCredentials(`${META_URL}/${doctype}`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({ detail: response.statusText }))) as {\n detail?: string;\n message?: string;\n error?: string;\n };\n\n const backendMessage = payload.message || payload.detail || response.statusText;\n\n throw new Error(`Failed to fetch metadata for ${doctype}: ${backendMessage}`);\n }\n\n return response.json();\n}\n\n/**\n * Return type for useDocTypeMeta hook\n */\nexport interface UseDocTypeMetaResult {\n /** JSON Schema for the DocType */\n schema: DocTypeSchema | undefined;\n /** Layout configuration for form rendering */\n layout: LayoutConfig | undefined;\n /** Permissions for current user */\n permissions: DocTypePermissions | undefined;\n /** Workflow configuration if applicable */\n workflow: WorkflowConfig | undefined;\n /** Full metadata object */\n meta: DocTypeMeta | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch and cache DocType metadata\n *\n * @param doctype - Name of the DocType to fetch metadata for\n * @returns Metadata including schema, layout, permissions, and workflow\n *\n * @example\n * ```tsx\n * const { schema, layout, permissions, workflow } = useDocTypeMeta(\"Todo\");\n *\n * if (isLoading) return <Spinner />;\n * if (!permissions?.read) return <AccessDenied />;\n *\n * return <AutoForm schema={schema} layout={layout} />;\n * ```\n */\nexport function useDocTypeMeta(doctype: string): UseDocTypeMetaResult {\n const {\n data: meta,\n isLoading,\n error,\n refetch,\n } = useQuery<DocTypeMeta, Error>({\n queryKey: [\"doctype-meta\", doctype],\n queryFn: () => fetchDocTypeMeta(doctype),\n // Cache metadata aggressively - it rarely changes\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)\n // Only fetch when doctype is provided\n enabled: Boolean(doctype),\n });\n\n return {\n schema: meta?.schema,\n layout: meta?.layout,\n permissions: meta?.permissions,\n workflow: meta?.workflow,\n meta,\n isLoading,\n error: error ?? null,\n refetch,\n };\n}\n\n/**\n * Hook to prefetch DocType metadata\n *\n * Useful for preloading metadata before navigation\n */\nexport function usePrefetchDocTypeMeta() {\n // Using a dummy query to access the query system\n useQuery({\n queryKey: [\"prefetch-helper\"],\n queryFn: () => null,\n enabled: false,\n });\n\n return {\n prefetch: (doctype: string) => {\n // Access queryClient from context would be better,\n // but this works for simple prefetching\n fetchDocTypeMeta(doctype).catch(() => {\n // Silently fail prefetch\n });\n },\n };\n}\n","import React from \"react\";\nimport { MStack, MText, Heading } from \"@framework-m/ui\";\n\n/**\n * Standard audit fields used across Framework M\n */\nexport const AUDIT_FIELDS = [\n \"id\",\n \"owner\",\n \"creation\",\n \"modified\",\n \"deleted_at\",\n \"modified_by\",\n \"docstatus\",\n \"idx\",\n];\n\nexport interface SystemInfoProps {\n /** The unique ID of the record */\n id?: string;\n /** The record object containing audit data */\n record?: any;\n /** Optional title for the section */\n title?: string;\n}\n\n/**\n * SystemInfo Component\n *\n * Renders document metadata (ID, Owner, Timestamps) in a consistent, read-only style.\n * Primarily used in sidebars or document footers.\n */\nexport const SystemInfo: React.FC<SystemInfoProps> = ({ id, record, title = \"System Info\" }) => {\n return (\n <MStack gap=\"$md\" data-testid=\"system-info\">\n <Heading size=\"$xs\" color=\"$colorMuted\" textTransform=\"uppercase\" letterSpacing={1}>\n {title}\n </Heading>\n\n <MStack gap=\"$sm\">\n {/* ID */}\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n ID\n </MText>\n <MText fontSize=\"$sm\" fontWeight=\"600\">\n {id || record?.id || record?.Id || \"N/A\"}\n </MText>\n </MStack>\n\n {/* Owner */}\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Owner\n </MText>\n <MText fontSize=\"$sm\">{record?.owner || record?.Owner || \"N/A\"}</MText>\n </MStack>\n\n {/* Modified By */}\n {(record?.modified_by || record?.[\"Modified By\"]) && (\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Modified By\n </MText>\n <MText fontSize=\"$sm\">{record.modified_by || record[\"Modified By\"]}</MText>\n </MStack>\n )}\n\n {/* Timestamps */}\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Creation\n </MText>\n <MText fontSize=\"$sm\">\n {record?.creation || record?.Creation\n ? new Date(record.creation || record.Creation).toLocaleString()\n : \"N/A\"}\n </MText>\n </MStack>\n\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Last Modified\n </MText>\n <MText fontSize=\"$sm\">\n {record?.modified || record?.Modified\n ? new Date(record.modified || record.Modified).toLocaleString()\n : \"N/A\"}\n </MText>\n </MStack>\n\n {/* Deleted At */}\n {(record?.deleted_at || record?.[\"Deleted At\"]) && (\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Deleted At\n </MText>\n <MText fontSize=\"$sm\">\n {new Date(record.deleted_at || record[\"Deleted At\"]).toLocaleString()}\n </MText>\n </MStack>\n )}\n </MStack>\n </MStack>\n );\n};\n\nexport default SystemInfo;\n","import { useState, useCallback } from \"react\";\nimport { YStack, MText, Button, XStack } from \"@framework-m/ui\";\nimport { API_URL } from \"../../constants\";\nimport { useMFetch } from \"../../hooks/useMFetch\";\nimport { AutoForm } from \"./index\";\nimport { useDocTypeMeta } from \"../../hooks/useDocTypeMeta\";\nimport { AUDIT_FIELDS } from \"../layout/SystemInfo\";\n\nexport interface QuickEntryFormProps {\n linkedDoctype: string;\n onCreated: (id: string, label: string) => void;\n onClose: () => void;\n}\n\nexport function QuickEntryForm({ linkedDoctype, onCreated, onClose }: QuickEntryFormProps) {\n const { schema, isLoading } = useDocTypeMeta(linkedDoctype);\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [isSaving, setIsSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | null>(null);\n const mfetch = useMFetch();\n\n const handleSubmit = useCallback(async () => {\n if (!linkedDoctype) return;\n setIsSaving(true);\n setSaveError(null);\n try {\n const response = await mfetch(`${API_URL}/${linkedDoctype}`, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as {\n detail?: string;\n message?: string;\n };\n throw new Error(payload.message || payload.detail || `Failed to create ${linkedDoctype}`);\n }\n const created = (await response.json()) as Record<string, unknown>;\n const newId = String(created.id ?? created.name ?? \"\");\n const newLabel = String(created.name ?? created.title ?? created.id ?? newId);\n onCreated(newId, newLabel);\n } catch (err) {\n setSaveError(err instanceof Error ? err.message : \"Failed to create record\");\n } finally {\n setIsSaving(false);\n }\n }, [linkedDoctype, formData, onCreated]);\n\n if (isLoading) {\n return (\n <YStack padding=\"$md\">\n <MText color=\"$colorMuted\">Loading form...</MText>\n </YStack>\n );\n }\n\n const filteredSchema = schema\n ? {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties || {}).filter(\n ([key]) => !AUDIT_FIELDS.includes(key.toLowerCase().trim())\n )\n ),\n }\n : null;\n\n return (\n <YStack gap=\"$md\">\n {saveError && (\n <MText color=\"$error\" role=\"alert\">\n {saveError}\n </MText>\n )}\n {filteredSchema && (\n <AutoForm\n schema={filteredSchema as any}\n formData={formData}\n onChange={(data) => setFormData(data as Record<string, unknown>)}\n onSubmit={handleSubmit}\n hideSubmitButton\n disabled={isSaving}\n />\n )}\n <XStack gap=\"$sm\" justifyContent=\"flex-end\">\n <Button variant=\"ghost\" onPress={onClose} disabled={isSaving}>\n Cancel\n </Button>\n <Button variant=\"primary\" onPress={handleSubmit} disabled={isSaving}>\n {isSaving ? \"Creating...\" : `Create ${linkedDoctype}`}\n </Button>\n </XStack>\n </YStack>\n );\n}\n","/**\n * LinkWidget - Async Search Combobox for Link Fields\n *\n * A cross-platform async search field built with Tamagui and Uniforms.\n *\n * Quick Entry (Slide-over Drawer):\n * By default, a \"+ New\" button opens a Drawer to create a linked\n * record inline without navigating away.\n * To disable, set `\"x-quick-entry\": false` in the JSON Schema property.\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { connectField, useForm } from \"uniforms\";\nimport { Input, YStack, MText, Button, Paragraph, XStack, Card, Drawer } from \"@framework-m/ui\";\nimport { API_URL } from \"../../constants\";\nimport { useMFetch } from \"../../hooks/useMFetch\";\nimport { useDebounce, getPathValue, resolveWatchPath } from \"./LinkWidgetHelpers\";\nimport { QuickEntryForm } from \"./QuickEntryForm\";\n\ninterface LinkOption {\n value: string;\n label: string;\n}\n\n/**\n * LinkWidget - Combobox with async search + Drawer quick entry.\n */\nexport const Link = (props: any) => {\n const {\n id,\n name,\n value,\n disabled,\n onChange,\n label,\n placeholder,\n schema,\n error,\n showInlineError,\n required,\n compact,\n } = props;\n\n const { model } = useForm<any>();\n\n const fieldSchema = useMemo(() => {\n return (props?.schema ?? props?.field ?? {}) as Record<string, any>;\n }, [props?.schema, props?.field]);\n\n const staticLinkedDoctype = useMemo(() => {\n const configured =\n props?.[\"x-options\"] ||\n props?.link ||\n props?.ui_meta?.link_doctype ||\n fieldSchema?.[\"x-options\"] ||\n fieldSchema?.link ||\n fieldSchema?.ui_meta?.link_doctype;\n return typeof configured === \"string\" ? configured : \"\";\n }, [props, fieldSchema]);\n\n const watchField = useMemo(() => {\n const configured =\n props?.watch || props?.ui_meta?.watch || fieldSchema?.watch || fieldSchema?.ui_meta?.watch;\n return typeof configured === \"string\" ? configured : \"\";\n }, [props, fieldSchema]);\n\n const watchPath = useMemo(() => {\n return resolveWatchPath(name, watchField);\n }, [name, watchField]);\n\n const watchedDoctype = useMemo(() => {\n if (!watchPath) {\n return \"\";\n }\n\n const resolved = getPathValue(model, watchPath);\n return typeof resolved === \"string\" ? resolved.trim() : \"\";\n }, [model, watchPath]);\n\n const isDynamicLink = useMemo(() => {\n const configuredWidget =\n props?.ui_widget ||\n props?.[\"x-fieldtype\"] ||\n fieldSchema?.ui_widget ||\n fieldSchema?.[\"x-fieldtype\"];\n return String(configuredWidget || \"\").toLowerCase() === \"dynamic_link\" || Boolean(watchField);\n }, [props, fieldSchema, watchField]);\n\n const linkedDoctype = useMemo(() => {\n return watchedDoctype || staticLinkedDoctype;\n }, [watchedDoctype, staticLinkedDoctype]);\n\n const resolvedPlaceholder = useMemo(() => {\n if (placeholder) {\n return placeholder;\n }\n if (isDynamicLink && !linkedDoctype) {\n return \"Select target DocType first...\";\n }\n return `Search ${linkedDoctype || \"records\"}...`;\n }, [placeholder, isDynamicLink, linkedDoctype]);\n\n const watchLabel = useMemo(() => {\n if (!watchField) {\n return \"source field\";\n }\n const segment = watchField.split(\".\").pop() || watchField;\n return segment\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n }, [watchField]);\n\n // Opt-out: set x-quick-entry: false in the JSON Schema property to disable Drawer\n const quickEntryEnabled = useMemo(() => {\n const flag =\n props?.[\"x-quick-entry\"] ??\n fieldSchema?.[\"x-quick-entry\"] ??\n (schema as any)?.[\"x-quick-entry\"];\n // Default enabled — only disable when explicitly false\n return flag !== false;\n }, [props, fieldSchema, schema]);\n\n const [inputValue, setInputValue] = useState(value ?? \"\");\n\n // Synchronize internal input value with external value prop (e.g., when record loads)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n setInputValue(String(value));\n } else {\n setInputValue(\"\");\n }\n }, [value]);\n const [searchResults, setSearchResults] = useState<LinkOption[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const dropdownRef = useRef<any>(null);\n const previousDoctypeRef = useRef<string>(linkedDoctype);\n\n const debouncedSearch = useDebounce(inputValue, 300);\n const mfetch = useMFetch();\n\n // Fetch search results\n const fetchOptions = useCallback(\n async (search: string) => {\n if (!linkedDoctype) {\n setSearchResults([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (search) params.set(\"q\", search);\n params.set(\"limit\", \"10\");\n\n const response = await mfetch(`${API_URL}/${linkedDoctype}?${params}`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const data = await response.json();\n const items = (data as any).items || data;\n setSearchResults(\n (items as any[]).map((item: any) => ({\n value: item.name || item.id,\n label: item.name || item.title || item.id,\n }))\n );\n }\n } catch {\n setSearchResults([]);\n } finally {\n setIsLoading(false);\n }\n },\n [linkedDoctype]\n );\n\n // Fetch on debounced search change\n useEffect(() => {\n if (isOpen) {\n fetchOptions(debouncedSearch);\n }\n }, [debouncedSearch, isOpen, fetchOptions]);\n\n // Close dropdown on outside click (web only)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n function handleClickOutside(e: MouseEvent) {\n if (!dropdownRef.current || !(dropdownRef.current instanceof Element)) {\n return;\n }\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n useEffect(() => {\n const previousDoctype = previousDoctypeRef.current;\n\n if (previousDoctype && previousDoctype !== linkedDoctype && value) {\n onChange(undefined);\n setInputValue(\"\");\n setSearchResults([]);\n setIsOpen(false);\n }\n\n previousDoctypeRef.current = linkedDoctype;\n }, [linkedDoctype, onChange, value]);\n\n // Handle selection\n const handleSelect = (option: LinkOption) => {\n setInputValue(option.label);\n onChange(option.value);\n setIsOpen(false);\n };\n\n // Handle record created via Drawer quick entry\n const handleCreated = useCallback(\n (newId: string, newLabel: string) => {\n setInputValue(newLabel);\n onChange(newId);\n setIsDrawerOpen(false);\n },\n [onChange]\n );\n\n return (\n <YStack\n gap=\"$1\"\n marginBottom={compact ? 0 : \"$3\"}\n position=\"relative\"\n flex={compact ? 1 : undefined}\n minWidth={compact ? 50 : \"100%\"}\n alignSelf=\"stretch\"\n >\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n\n <XStack position=\"relative\" alignItems=\"center\" width=\"100%\" gap=\"$sm\">\n <XStack flex={1} position=\"relative\" alignItems=\"center\">\n <Input\n id={id}\n value={inputValue}\n disabled={disabled || (isDynamicLink && !linkedDoctype)}\n placeholder={resolvedPlaceholder}\n onChangeText={(text: string) => {\n setInputValue(text);\n if (isDynamicLink && !linkedDoctype) {\n return;\n }\n setIsOpen(true);\n if (!text) onChange(undefined);\n }}\n onFocus={() => {\n if (isDynamicLink && !linkedDoctype) {\n return;\n }\n setIsOpen(true);\n fetchOptions(inputValue);\n }}\n flex={1}\n error={!!error}\n paddingRight={value ? 40 : 35}\n size={compact ? \"sm\" : \"md\"}\n backgroundColor={compact ? \"transparent\" : \"$background\"}\n borderWidth={compact ? 0 : 1}\n borderColor=\"$borderColor\"\n hoverStyle={compact ? { backgroundColor: \"$backgroundHover\" } : undefined}\n focusStyle={\n compact\n ? {\n backgroundColor: \"$background\",\n borderWidth: 1,\n borderColor: \"$borderColor\",\n }\n : { borderColor: \"$primary\" }\n }\n minHeight={compact ? 32 : 44}\n />\n <XStack\n position=\"absolute\"\n right={12}\n top={0}\n bottom={0}\n alignItems=\"center\"\n pointerEvents=\"none\"\n >\n {!value && (\n <Paragraph opacity={0.5} fontSize={14}>\n 🔍\n </Paragraph>\n )}\n </XStack>\n {value && (\n <XStack position=\"absolute\" right={8} top={0} bottom={0} alignItems=\"center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={() => {\n setInputValue(\"\");\n onChange(undefined);\n }}\n >\n ✕\n </Button>\n </XStack>\n )}\n </XStack>\n\n {/* Quick Entry: Create New button — shown unless opted out */}\n {linkedDoctype && quickEntryEnabled && !disabled && !compact && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setIsDrawerOpen(true)}\n title={`Create new ${linkedDoctype}`}\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n >\n + New\n </Button>\n )}\n </XStack>\n\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n\n {isDynamicLink && !linkedDoctype && (\n <Paragraph color=\"$colorMuted\" size=\"sm\">\n Select {watchLabel} first to load link options.\n </Paragraph>\n )}\n\n {/* Dropdown / Results List */}\n {isOpen && (\n <YStack ref={dropdownRef} position=\"absolute\" top=\"100%\" left={0} right={0} zIndex={1000}>\n <Card elevated backgroundColor=\"$background\" marginTop=\"$1\" padding=\"$2\">\n {isLoading ? (\n <Paragraph size=\"sm\" padding=\"$2\">\n Loading...\n </Paragraph>\n ) : searchResults.length === 0 ? (\n <Paragraph size=\"sm\" padding=\"$2\">\n No results found\n </Paragraph>\n ) : (\n searchResults.map((option) => (\n <Button\n key={option.value}\n onPress={() => handleSelect(option)}\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n borderWidth={0}\n paddingVertical=\"$2\"\n backgroundColor={option.value === value ? \"$primary1\" : \"transparent\"}\n >\n {option.label}\n </Button>\n ))\n )}\n <Button size=\"sm\" onPress={() => setIsOpen(false)} marginTop=\"$2\">\n Close\n </Button>\n </Card>\n </YStack>\n )}\n\n {/* Quick Entry Drawer */}\n {linkedDoctype && quickEntryEnabled && (\n <Drawer\n isOpen={isDrawerOpen}\n onClose={() => setIsDrawerOpen(false)}\n title={`New ${linkedDoctype}`}\n width={480}\n >\n <QuickEntryForm\n linkedDoctype={linkedDoctype}\n onCreated={handleCreated}\n onClose={() => setIsDrawerOpen(false)}\n />\n </Drawer>\n )}\n </YStack>\n );\n};\n\nexport const LinkField = connectField(Link);\nexport default LinkField;\n","import { connectField } from \"uniforms\";\nimport { Input, DatePicker, YStack, MText, Paragraph } from \"@framework-m/ui\";\n\nconst formatValue = (value: any, type?: string) => {\n if (!value) return \"\";\n\n if (type === \"datetime-local\" || type === \"date\") {\n try {\n const date = new Date(value);\n if (isNaN(date.getTime())) return \"\";\n\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n const yyyy = date.getFullYear();\n const mm = pad(date.getMonth() + 1);\n const dd = pad(date.getDate());\n\n if (type === \"date\") return `${yyyy}-${mm}-${dd}`;\n\n const hh = pad(date.getHours());\n const min = pad(date.getMinutes());\n return `${yyyy}-${mm}-${dd}T${hh}:${min}`;\n } catch {\n return \"\";\n }\n }\n\n return value;\n};\n\n/**\n * Text/Date field component.\n *\n * UIMeta integration (3.1 — Field Meta Access):\n * -----------------------------------------------\n * Reads `ui_meta` from the raw field schema (via bridge.getField()) surfaced\n * by `enrich_schema()` on the backend. Note: `props.schema` is the Bridge\n * instance (not the field schema), so we must call getField() directly.\n *\n * Supported ui_meta keys:\n * - `placeholder` — overrides the default placeholder\n * - `hint` — renders a small helper text below the field\n * - `validation` — HTML5 native constraint attributes:\n * `minimum`, `maximum`, `minLength`, `maxLength`, `pattern`, `multipleOf`\n *\n * Constraint priority: direct prop (from uniforms rename) > ui_meta.validation.\n */\nexport const Text = (props: any) => {\n const {\n id,\n label,\n onChange,\n value,\n placeholder,\n disabled,\n error,\n showInlineError,\n type,\n name,\n required,\n compact,\n // uniforms-renamed constraint props (maximum→max, minimum→min, etc.)\n min: propsMin,\n max: propsMax,\n step: propsStep,\n } = props;\n\n // props.field = raw JSON Schema for this field, provided by uniforms' useField().\n // props.schema is NEVER set by uniforms — getField() call was always returning undefined.\n const rawField: Record<string, any> = props.field ?? {};\n const uiMeta: Record<string, any> = rawField.ui_meta ?? {};\n const validation: Record<string, any> = uiMeta.validation ?? {};\n\n // Merge placeholders: explicit prop > ui_meta > schema description fallback\n const resolvedPlaceholder =\n placeholder ??\n uiMeta.placeholder ??\n (typeof props.schema?.description === \"string\" ? undefined : undefined);\n\n // Hint text (brief helper text below the field)\n const hint: string | undefined = uiMeta.hint;\n\n // Constraint attributes for HTML5 native validation\n const minVal = propsMin ?? validation.minimum ?? validation.exclusiveMinimum;\n const maxVal = propsMax ?? validation.maximum ?? validation.exclusiveMaximum;\n const stepVal = propsStep ?? validation.multipleOf;\n const minLengthVal: number | undefined = validation.minLength;\n const maxLengthVal: number | undefined = validation.maxLength;\n const patternVal: string | undefined = validation.pattern;\n\n const isDateField = type === \"date\" || type === \"datetime-local\";\n // Use the unified DatePicker for all date-like fields so UX is consistent.\n const InputComp = isDateField ? DatePicker : Input;\n\n return (\n <YStack\n gap=\"$1\"\n marginBottom={compact ? 0 : \"$2\"}\n flex={compact ? 1 : undefined}\n minWidth={compact ? 50 : \"100%\"}\n alignSelf=\"stretch\"\n >\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n <InputComp\n id={id}\n name={name}\n value={formatValue(value, type || \"text\")}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n type={type || \"text\"}\n onChangeText={(text: string) => onChange(text)}\n error={!!error}\n size=\"sm\"\n backgroundColor={compact ? \"transparent\" : \"$background\"}\n borderWidth={compact ? 0 : 1}\n borderRadius={compact ? 0 : \"$round\"}\n borderColor=\"$borderColor\"\n opacity={1}\n textAlign={props.textAlign}\n hoverStyle={compact ? { backgroundColor: \"$backgroundHover\" } : undefined}\n focusStyle={\n compact\n ? {\n backgroundColor: \"$background\",\n borderWidth: 0,\n outlineWidth: 0,\n }\n : { borderColor: \"$primary\" }\n }\n minHeight={compact ? 40 : 32}\n paddingHorizontal={compact ? 14 : \"$md\"}\n // HTML5 native validation attributes (web only — ignored on RN)\n {...(minVal !== undefined ? { min: String(minVal) } : {})}\n {...(maxVal !== undefined ? { max: String(maxVal) } : {})}\n {...(stepVal !== undefined ? { step: String(stepVal) } : {})}\n {...(minLengthVal !== undefined ? { minLength: minLengthVal } : {})}\n {...(maxLengthVal !== undefined ? { maxLength: maxLengthVal } : {})}\n {...(patternVal !== undefined ? { pattern: patternVal } : {})}\n />\n {/* ui_meta hint text */}\n {hint && !compact && (\n <MText fontSize=\"$xs\" color=\"$colorMuted\" paddingTop=\"$1\" role=\"note\">\n {hint}\n </MText>\n )}\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\" marginTop=\"$1\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const TextField = connectField(Text);\n","import { connectField } from \"uniforms\";\nimport { XStack, YStack, MText } from \"@framework-m/ui\";\n\nexport const Bool = (props: any) => {\n const { label, onChange, value, disabled, required, compact } = props;\n\n return (\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n justifyContent={compact ? \"center\" : \"flex-start\"}\n marginBottom={compact ? 0 : \"$2\"}\n paddingHorizontal={compact ? 0 : \"$2\"}\n paddingVertical={compact ? 0 : \"$1.5\"}\n borderRadius=\"$sm\"\n cursor={disabled ? \"default\" : \"pointer\"}\n onPress={() => !disabled && onChange(!value)}\n opacity={disabled ? 0.6 : 1}\n flex={compact ? 1 : undefined}\n minHeight={compact ? 24 : 34}\n alignSelf=\"stretch\"\n focusable={!disabled}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e: any) => {\n if (!disabled && (e.key === \" \" || e.key === \"Enter\")) {\n e.preventDefault();\n onChange(!value);\n }\n }}\n focusStyle={{\n backgroundColor: \"$backgroundHover\",\n }}\n group\n >\n <YStack\n width={18}\n height={18}\n borderRadius={4}\n borderWidth={2}\n borderColor={value ? \"$primary\" : \"$borderColor\"}\n backgroundColor={value ? \"$primary\" : \"transparent\"}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n {value && (\n <MText color=\"#fff\" fontSize={11} fontWeight=\"900\" userSelect=\"none\">\n ✓\n </MText>\n )}\n </YStack>\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\" userSelect=\"none\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n </XStack>\n );\n};\n\n// Exported as BooleanField to match our tests, replacing the old BoolField name\nexport const BooleanField = connectField(Bool);\n","import { connectField } from \"uniforms\";\nimport { useMemo } from \"react\";\nimport { Select, YStack, MText, Paragraph } from \"@framework-m/ui\";\n\n/**\n * SelectField component.\n *\n * UIMeta integration (3.1 — Pydantic Enum Leveraging):\n * -------------------------------------------------------\n * Option sources (in priority order):\n * 1. `props.options` — from uniforms bridge (schema.enum)\n * 2. `props.schema.ui_meta.options` — human-friendly options from enrich_schema()\n * These are objects like `{ value: \"draft\", label: \"Draft\" }` generated\n * from Literal[\"draft\", ...] or Python Enum types.\n * 3. `props.allowedValues` — legacy uniforms fallback\n *\n * The ui_meta.options labels are preferred when present because they are\n * already title-cased by `enrich_schema` and may carry developer-supplied\n * overrides (e.g. `{\"value\": \"draft\", \"label\": \"In Progress\"}`).\n */\nexport const SelectF = (props: any) => {\n const {\n id,\n label,\n onChange,\n value,\n disabled,\n error,\n showInlineError,\n placeholder,\n required,\n compact,\n // uniforms bridge sets options from schema.enum\n options: bridgeOptions,\n // allowedValues is the legacy uniforms name\n allowedValues,\n } = props;\n\n // props.field = raw JSON Schema for this field, provided by uniforms' useField().\n // props.schema is NEVER set by uniforms — getField() call was always returning undefined.\n const rawField: Record<string, any> = props.field ?? {};\n\n // ui_meta.options carries human-friendly {value, label} pairs from enrich_schema\n const uiMetaOptions: Array<{ value: string; label: string }> | undefined = Array.isArray(\n rawField.ui_meta?.options\n )\n ? rawField.ui_meta.options\n : undefined;\n\n const enumOptions = useMemo(() => {\n // Priority 1: ui_meta.options (pre-labeled, from enrich_schema)\n if (uiMetaOptions && uiMetaOptions.length > 0) {\n return uiMetaOptions.map((o) => ({\n label: o.label || o.value,\n value: String(o.value),\n }));\n }\n\n // Priority 2: props.options (set by uniforms bridge from schema.enum)\n if (bridgeOptions && bridgeOptions.length > 0) {\n return bridgeOptions.map((o: any) => ({\n label: o.label || String(o.value),\n value: String(o.value),\n }));\n }\n\n // Priority 3: allowedValues (legacy uniforms)\n if (allowedValues && allowedValues.length > 0) {\n return (allowedValues as string[]).map((v) => ({\n label: String(v)\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase()),\n value: String(v),\n }));\n }\n\n return [];\n }, [uiMetaOptions, bridgeOptions, allowedValues]);\n\n // ui_meta.placeholder override (rawField already computed above via getField())\n const resolvedPlaceholder = placeholder ?? rawField.ui_meta?.placeholder ?? \"Select...\";\n\n return (\n <YStack gap=\"$1\" marginBottom={compact ? 0 : \"$2\"} flex={compact ? 1 : undefined}>\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n <Select\n id={id}\n value={String(value ?? \"\")}\n options={enumOptions}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n onChange={(val: any) => {\n const selected = typeof val === \"string\" ? val : (val?.target?.value ?? \"\");\n onChange(selected);\n }}\n error={!!error}\n size=\"sm\"\n backgroundColor={compact ? \"transparent\" : undefined}\n borderWidth={compact ? 0 : 1}\n borderRadius={compact ? 0 : undefined}\n paddingHorizontal={compact ? 14 : undefined}\n />\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const SelectField = connectField(SelectF);\n","import { connectField } from \"uniforms\";\nimport { XStack, YStack, MText, Button, Paragraph, Modal } from \"@framework-m/ui\";\nimport { AutoField } from \"./AutoField\";\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\n\nconst DEFAULT_PAGE_SIZE = 10;\nconst TABLE_CELL_PADDING_X = 14;\nconst TABLE_CELL_PADDING_Y = 10;\nconst TABLE_ROW_MIN_HEIGHT = 42;\n\nconst toPositiveInt = (value: unknown): number | null => {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n return null;\n }\n const normalized = Math.floor(parsed);\n return normalized > 0 ? normalized : null;\n};\n\n/**\n * ListFieldBase (Spreadsheet UX)\n */\nexport const List = (props: any) => {\n const {\n label,\n value = [],\n schema: schemaProp,\n error,\n showInlineError,\n required,\n disabled,\n onChange,\n grid_columns,\n } = props;\n\n // Prioritize props.field (guaranteed raw field schema from uniforms)\n // or fall back to schemaProp (if not a bridge instance)\n const schema = props.field || schemaProp;\n\n const rows = Array.isArray(value) ? value : [];\n\n const pageSize = useMemo(() => {\n const configured =\n toPositiveInt(props?.page_size) ??\n toPositiveInt(schema?.page_size) ??\n toPositiveInt(schema?.pagination?.page_size) ??\n toPositiveInt(schema?.list?.page_size) ??\n toPositiveInt(schema?.ui_meta?.list?.page_size);\n\n return configured ?? DEFAULT_PAGE_SIZE;\n }, [\n props?.page_size,\n schema?.page_size,\n schema?.pagination?.page_size,\n schema?.list?.page_size,\n schema?.ui_meta?.list?.page_size,\n ]);\n\n const [pageIndex, setPageIndex] = useState(0);\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\n\n // Resolve the schema for individual rows (uniforms lists have properties under 'items')\n const rowSchema = schema?.items || schema;\n\n // Exhaustive search for property keys from multiple sources\n let propsInSchema: string[] = [];\n\n // 1. Try items.properties (Pydantic array items schema)\n if (rowSchema?.properties && typeof rowSchema.properties === \"object\") {\n propsInSchema = Object.keys(rowSchema.properties);\n }\n\n // 2. Fallback: try root schema properties (for non-array schemas)\n if (propsInSchema.length === 0 && schema?.properties && typeof schema.properties === \"object\") {\n propsInSchema = Object.keys(schema.properties);\n }\n\n // 3. Fallback: try explicit grid_columns from schema\n if (propsInSchema.length === 0 && Array.isArray(schema?.grid_columns)) {\n propsInSchema = schema.grid_columns;\n }\n\n // Filter out any duplicates and ensure we have a unique list\n const uniqueProps = Array.from(new Set(propsInSchema));\n\n // Resolve column definitions from multiple sources with strict priority:\n // 1. grid_columns prop (explicitly passed to component)\n // 2. schema.ui_meta.grid_columns (from merged field metadata) - THIS IS KEY\n // 3. schema.list.columns or schema.ui_meta.list.columns\n // 4. Properties found in schema\n const uiMetaGridColumns = (schema as any)?.ui_meta?.grid_columns;\n const uiMetaListColumns = (schema as any)?.ui_meta?.list?.columns;\n const schemaListColumns = (schema as any)?.list?.columns;\n\n const officialColumns = schemaListColumns || uiMetaListColumns || uiMetaGridColumns;\n const gridColumns = grid_columns || officialColumns || uniqueProps;\n\n const totalPages = Math.max(1, Math.ceil(rows.length / pageSize));\n const pageStart = pageIndex * pageSize;\n const pageRows = rows.slice(pageStart, pageStart + pageSize);\n\n useEffect(() => {\n if (pageIndex > totalPages - 1) {\n setPageIndex(totalPages - 1);\n }\n }, [pageIndex, totalPages]);\n\n useEffect(() => {\n setPageIndex(0);\n }, [pageSize]);\n\n // Helper to extract clean labels from rowSchema or fallback to title-cased column name\n const getColLabel = (col: string) => {\n const prop = rowSchema?.properties?.[col];\n const label = prop?.label || prop?.title;\n if (label) return label;\n // Fallback: title case the field name\n return col\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n };\n\n const getColType = (col: string) => {\n return rowSchema?.properties?.[col]?.type || \"string\";\n };\n\n const handleAdd = () => {\n const nextRows = [...rows, {}];\n onChange(nextRows);\n setPageIndex(Math.max(0, Math.ceil(nextRows.length / pageSize) - 1));\n };\n\n const handleRemove = (index: number) => {\n const newValue = [...rows];\n newValue.splice(index, 1);\n onChange(newValue);\n };\n\n const handleDuplicate = (index: number) => {\n const newValue = [...rows];\n const cloned = JSON.parse(JSON.stringify(rows[index] || {}));\n newValue.splice(index + 1, 0, cloned);\n onChange(newValue);\n setPageIndex(Math.floor((index + 1) / pageSize));\n };\n\n // Keyboard Productivity: Ctrl + Enter to add row\n const handleKeyDown = useCallback(\n (e: any) => {\n if (e.ctrlKey && e.key === \"Enter\") {\n e.preventDefault();\n handleAdd();\n }\n },\n [rows, onChange]\n );\n\n // Use gridColumns if available (includes ui_meta.grid_columns), fallback to uniqueProps\n // This ensures we always use explicitly configured columns when available\n const allProperties = gridColumns && gridColumns.length > 0 ? gridColumns : uniqueProps;\n\n return (\n <YStack gap=\"$3\" marginVertical=\"$2\" onKeyDown={handleKeyDown}>\n {/* Full Row Edit Modal - Moved to root level of field to avoid grid clipping */}\n <Modal\n isOpen={editingIndex !== null}\n onClose={() => setEditingIndex(null)}\n title={`Edit Row ${editingIndex !== null ? editingIndex + 1 : \"\"}`}\n size=\"lg\"\n footer={\n <XStack gap=\"$2\" justifyContent=\"flex-end\" width=\"100%\">\n <Button\n theme=\"red\"\n variant=\"ghost\"\n onPress={() => {\n handleRemove(editingIndex!);\n setEditingIndex(null);\n }}\n >\n Delete Row\n </Button>\n <Button theme=\"active\" onPress={() => setEditingIndex(null)} width={100}>\n Done\n </Button>\n </XStack>\n }\n >\n <YStack\n gap=\"$4\"\n overflow=\"scroll\"\n padding=\"$4\"\n maxHeight=\"60vh\"\n backgroundColor=\"$background\"\n minWidth={300}\n >\n {allProperties.length === 0 && (\n <MText color=\"$colorMuted\">No editable properties found in schema.</MText>\n )}\n {allProperties.map((col: string) => (\n <YStack\n key={col}\n gap=\"$1\"\n paddingVertical=\"$2\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n minHeight={60}\n >\n <AutoField name={`${editingIndex}.${col}`} disabled={disabled} />\n </YStack>\n ))}\n </YStack>\n </Modal>\n\n {/* Header Section */}\n <XStack justifyContent=\"space-between\" alignItems=\"center\" paddingHorizontal=\"$1\">\n <MText fontSize=\"$4\" fontWeight=\"600\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n </XStack>\n\n {/* Spreadsheet Grid Container */}\n <YStack\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$3\"\n overflow=\"scroll\"\n backgroundColor=\"$background\"\n style={{ borderCollapse: \"collapse\", borderSpacing: 0 } as any}\n >\n {/* Header Row (Desktop Only) */}\n <XStack\n backgroundColor=\"$backgroundStrong\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n display=\"none\"\n $gtSm={{ display: \"flex\" }}\n minWidth={gridColumns.length * 150 + 140}\n >\n {/* Index Column */}\n <XStack\n width={40}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <MText fontSize=\"$1\" color=\"$colorMuted\" fontWeight=\"600\">\n #\n </MText>\n </XStack>\n\n {gridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n flex={1}\n flexBasis={0}\n minWidth={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n justifyContent={isNumeric ? \"flex-end\" : \"flex-start\"}\n alignItems=\"center\"\n >\n <MText fontSize=\"$2\" color=\"$colorMuted\" fontWeight=\"600\" numberOfLines={1}>\n {getColLabel(col)}\n </MText>\n </XStack>\n );\n })}\n <XStack\n marginLeft=\"auto\"\n width={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Button size=\"sm\" onPress={handleAdd} disabled={disabled} theme=\"active\">\n + Add Row\n </Button>\n </XStack>\n </XStack>\n\n {/* Data Rows */}\n {pageRows.map((_item: any, relativeIndex: number) => {\n const index = pageStart + relativeIndex;\n return (\n <YStack key={index}>\n {/* Desktop Row */}\n <XStack\n display=\"none\"\n $gtSm={{ display: \"flex\" }}\n borderBottomWidth={relativeIndex === pageRows.length - 1 ? 0 : 1}\n borderBottomColor=\"$borderColor\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n alignItems=\"center\"\n minHeight={TABLE_ROW_MIN_HEIGHT}\n minWidth={gridColumns.length * 150 + 140}\n >\n {/* Row Index */}\n <XStack\n width={40}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor=\"$backgroundStrong\"\n opacity={0.7}\n >\n <MText fontSize=\"$2\" fontWeight=\"500\">\n {index + 1}\n </MText>\n </XStack>\n\n {gridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n flex={1}\n flexBasis={0}\n minWidth={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n alignItems=\"center\"\n >\n <AutoField\n name={`${index}.${col}`}\n label={null}\n compact={true}\n disabled={disabled}\n textAlign={isNumeric ? \"end\" : \"start\"}\n />\n </XStack>\n );\n })}\n\n {/* Desktop Actions */}\n <XStack\n marginLeft=\"auto\"\n width={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n gap=\"$1\"\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => handleDuplicate(index)}\n disabled={disabled}\n padding=\"$1\"\n >\n ⎘\n </Button>\n <Button\n size=\"sm\"\n theme=\"red\"\n variant=\"ghost\"\n onPress={() => handleRemove(index)}\n disabled={disabled}\n padding=\"$1\"\n >\n ✕\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setEditingIndex(index)}\n disabled={disabled}\n padding=\"$1\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n >\n 🖉\n </Button>\n </XStack>\n </XStack>\n\n {/* Mobile Card View (Vertical Summary) */}\n <YStack\n padding=\"$4\"\n gap=\"$1\"\n display=\"flex\"\n $gtSm={{ display: \"none\" }}\n marginHorizontal=\"$2\"\n marginVertical=\"$2\"\n borderRadius=\"$4\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n onPress={() => setEditingIndex(index)}\n elevation={2}\n >\n {/* Card Header (Index + Edit Pencil) */}\n <XStack\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom=\"$2\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n paddingBottom=\"$1\"\n >\n <XStack\n backgroundColor=\"$active\"\n width={20}\n height={20}\n borderRadius={10}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize=\"$1\" color=\"white\" fontWeight=\"800\">\n {index + 1}\n </MText>\n </XStack>\n <XStack gap=\"$1\" alignItems=\"center\">\n <MText fontSize=\"$5\" color=\"$active\">\n 🖉\n </MText>\n </XStack>\n </XStack>\n\n {/* Card Body - Unified Horizontal Scroll for [Label + Value] */}\n <XStack overflow=\"scroll\" gap=\"$4\" paddingBottom=\"$2\">\n {gridColumns.map((col: string) => (\n <YStack key={col} minWidth={140} maxWidth={200} gap=\"$1\">\n <MText fontSize=\"$1\" color=\"$colorMuted\" fontWeight=\"700\" numberOfLines={1}>\n {getColLabel(col)}\n </MText>\n <AutoField name={`${index}.${col}`} disabled={true} compact={true} />\n </YStack>\n ))}\n </XStack>\n </YStack>\n </YStack>\n );\n })}\n </YStack>\n\n {rows.length > pageSize && (\n <XStack justifyContent=\"space-between\" alignItems=\"center\" paddingHorizontal=\"$1\">\n <MText fontSize=\"$2\" color=\"$colorMuted\">\n Showing {pageStart + 1}-{Math.min(pageStart + pageRows.length, rows.length)} of{\" \"}\n {rows.length}\n </MText>\n <XStack gap=\"$2\" alignItems=\"center\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setPageIndex((current) => Math.max(0, current - 1))}\n disabled={pageIndex === 0}\n >\n Previous\n </Button>\n <MText fontSize=\"$2\" color=\"$colorMuted\">\n Page {pageIndex + 1} of {totalPages}\n </MText>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setPageIndex((current) => Math.min(totalPages - 1, current + 1))}\n disabled={pageIndex >= totalPages - 1}\n >\n Next\n </Button>\n </XStack>\n </XStack>\n )}\n\n {/* Validation Message */}\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const ListField = connectField(List);\n","import React from \"react\";\n\ntype FieldComponent = React.ComponentType<Record<string, unknown>>;\n\n/**\n * FieldRegistry allows plugins and macroservices to register custom React\n * components for specific field types, preventing the monolithic AutoField\n * from needing to know about every possible UI widget.\n */\nclass Registry {\n private fields: Map<string, FieldComponent> = new Map();\n\n register(type: string, component: FieldComponent): void {\n this.fields.set(type, component);\n }\n\n get(type: string): FieldComponent | undefined {\n return this.fields.get(type);\n }\n\n clear(): void {\n this.fields.clear();\n }\n}\n\nexport const FieldRegistry = new Registry();\n","import { connectField } from \"uniforms\";\nimport { Link } from \"../LinkWidget\";\nimport { Text } from \"./TextField\";\nimport { Bool } from \"./BooleanField\";\nimport { SelectF } from \"./SelectField\";\nimport { List } from \"./ListField\";\nimport { FieldRegistry } from \"./registry\";\n\n/**\n * AutoField (Bridge Resolver)\n *\n * Automatically resolves the correct UI component based on field type and\n * JSON Schema metadata from the uniforms JSONSchemaBridge.\n *\n * IMPORTANT: This IS a connected field. It receives the schema and current\n * value path from uniforms. To prevent double-prefixing (e.g. name.name),\n * it MUST return raw (unconnected) components.\n *\n * ## How props are delivered (uniforms internals — useField.js)\n *\n * uniforms' `useField` hook passes these guaranteed props to every field:\n * - `props.field` — raw JSON schema for this field (from bridge.getField())\n * - `props.fieldType` — JS constructor (String/Number/Boolean/Date/Array/Object)\n * - `props.options` — array of {value} objects when schema has `enum`\n *\n * `props.schema` is NEVER set by uniforms — it would only exist if a parent\n * explicitly passed it, which nothing does here.\n *\n * ## Key bridge behaviors (JSONSchemaBridge)\n *\n * - `format` is in `propsToRemove` → deleted from getProps() output\n * ✓ Read it from `props.field.format` instead\n * - `x-options` is NOT in propsToRemove → passed through directly as `props[\"x-options\"]`\n * - `enum` is in propsToRemove BUT bridge converts it to `options` array first\n * - `getType()` returns Date ONLY for format:\"date-time\", NOT format:\"date\"\n * ✓ For date-only fields: `fieldType === String` but `props.field.format === \"date\"`\n *\n * ## Field detection decision tree\n *\n * 1. Plugin FieldRegistry override\n * 2. Array → ListField\n * 3. Link → props[\"x-options\"] OR props.field[\"x-options\"] OR props.field.ui_meta.link_doctype\n * 4. Select → props.options (non-empty, from bridge enum conversion) OR\n * props.field.ui_meta.options (from backend enrich_schema)\n * 5. DateTime → fieldType === Date (bridge maps format:\"date-time\" → Date)\n * 6. Date-only → props.field.format === \"date\" (format is stripped from schemaProps!)\n * OR field name ends with \"_date\" as heuristic fallback\n * 7. Boolean → fieldType === Boolean\n * 8. Default → TextField\n */\nexport const AutoField = connectField((props: any) => {\n const fieldName = String(props.name ?? \"\").toLowerCase();\n\n // props.field = raw JSON Schema for this field, provided by uniforms' useField()\n // This is the ONLY reliable way to access format, x-options, ui_meta, etc.\n const rawField: Record<string, any> = props.field ?? {};\n const rawFormat: string | undefined = rawField.format;\n\n // 1. Plugin registry override (highest priority)\n const typeKey = typeof props.fieldType === \"string\" ? props.fieldType : rawField.ui_meta?.widget;\n const CustomComponent = typeof typeKey === \"string\" ? FieldRegistry.get(typeKey) : undefined;\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n\n // 2. Array fields → ListField\n // fieldType === Array is set by bridge.getType() for type:\"array\"\n if (props.fieldType === Array) {\n return <List {...props} />;\n }\n\n // 3. Link field detection.\n // \"x-options\" is NOT in propsToRemove so it passes through getProps() onto props directly.\n // Also check props.field[\"x-options\"] in case it didn't spread (nested path edge case).\n const asLinkDoctype = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n };\n\n const configuredLinkDoctype =\n asLinkDoctype(props[\"x-options\"]) ??\n asLinkDoctype(rawField[\"x-options\"]) ??\n asLinkDoctype(props.link) ??\n asLinkDoctype(rawField.link) ??\n asLinkDoctype(rawField.ui_meta?.link_doctype);\n\n // Fallback for generated schemas that only include human-readable hints.\n // Example: description=\"Linked Supplier ID\" => doctype \"Supplier\".\n const inferredLinkDoctype = (() => {\n const description = asLinkDoctype(rawField.description);\n if (!description) {\n return undefined;\n }\n\n const match = /^linked\\s+(.+?)\\s+id$/i.exec(description);\n return match?.[1]?.trim() || undefined;\n })();\n\n const linkDoctype = configuredLinkDoctype ?? inferredLinkDoctype;\n if (linkDoctype) {\n return <Link {...props} link={linkDoctype} />;\n }\n\n // 4. Select field detection.\n // bridge converts schema.enum → props.options (array of {value} objects).\n // bridge ALWAYS sets options (even if undefined), so guard with length check.\n // enrich_schema additionally surfaces ui_meta.options with human-friendly labels.\n const bridgeOptions: any[] | undefined =\n Array.isArray(props.options) && props.options.length > 0 ? props.options : undefined;\n const uiMetaOptions: any[] | undefined =\n Array.isArray(rawField.ui_meta?.options) && rawField.ui_meta.options.length > 0\n ? rawField.ui_meta.options\n : undefined;\n\n if (bridgeOptions || uiMetaOptions) {\n const mergedProps = uiMetaOptions ? { ...props, options: uiMetaOptions } : props;\n return <SelectF {...mergedProps} />;\n }\n\n // 5. Date-time fields.\n // bridge.getType() returns Date for format:\"date-time\" fields.\n // Also handle standard system audit fields by name.\n if (\n props.fieldType === Date ||\n rawFormat === \"date-time\" ||\n fieldName === \"creation\" ||\n fieldName === \"modified\"\n ) {\n return <Text {...props} type=\"datetime-local\" />;\n }\n\n // 6. Date-only fields.\n // CRITICAL: bridge removes \"format\" from schemaProps (it's in propsToRemove).\n // bridge.getType() returns String for format:\"date\" (NOT Date).\n // Must read format from props.field (the raw field schema) not from schemaProps.\n if (rawFormat === \"date\" || fieldName.endsWith(\"_date\")) {\n return <Text {...props} type=\"date\" />;\n }\n\n // 7. Boolean\n if (props.fieldType === Boolean) {\n return <Bool {...props} />;\n }\n\n // 8. Default: String / Number / unknown → TextField\n return <Text {...props} />;\n});\n","import { useForm } from \"uniforms\";\nimport { YStack, MText } from \"@framework-m/ui\";\n\n/**\n * ErrorsField - Displays global errors\n */\nexport const ErrorsField = () => {\n const { error } = useForm();\n if (!error) return null;\n\n const details = (error as any).details || [];\n\n return (\n <YStack\n backgroundColor=\"$errorBg\"\n padding=\"$3\"\n borderRadius=\"$4\"\n marginBottom=\"$4\"\n borderStyle=\"solid\"\n borderWidth={1}\n borderColor=\"$errorBorder\"\n >\n <MText color=\"$error\" fontWeight=\"600\">\n Please correct the following errors:\n </MText>\n {details.map((detail: any, index: number) => (\n <MText key={index} color=\"$error\" size=\"sm\" marginLeft=\"$2\">\n • {detail.message}\n </MText>\n ))}\n </YStack>\n );\n};\n","import { filterDOMProps, useForm } from \"uniforms\";\nimport { Button } from \"@framework-m/ui\";\n\n// Filter props for native elements\n// Note: Uniforms 4 uses a more restricted set of allowed props for filtering\nfilterDOMProps.register(\"submitText\" as any);\n\n/**\n * SubmitField - Maps to Button\n */\nexport const SubmitField = ({ value, ...props }: any) => {\n const { state } = useForm();\n return (\n <Button\n type=\"submit\"\n disabled={state.disabled}\n theme=\"active\"\n marginTop=\"$4\"\n {...filterDOMProps(props)}\n >\n {value || \"Submit\"}\n </Button>\n );\n};\n","import Ajv from \"ajv\";\nimport { useMemo } from \"react\";\nimport { JSONSchemaBridge } from \"uniforms-bridge-json-schema\";\nimport { AutoField, ErrorsField, SubmitField } from \"./tamagui-fields\";\nimport { BaseForm } from \"uniforms\";\nimport { XStack, YStack } from \"@framework-m/ui\";\n\nconst ajv = new Ajv({\n allErrors: true,\n useDefaults: true,\n strict: false,\n});\n\n// Add custom keywords if needed (like rjsf uses)\najv.addKeyword({ keyword: \"ui:widget\" });\najv.addKeyword({ keyword: \"ui:options\" });\n\n/**\n * AutoForm props\n */\nexport interface AutoFormProps<T = any> {\n /** JSON Schema for the form */\n schema: any;\n /** UI Schema for customizing form appearance */\n uiSchema?: any;\n /** Current form data */\n formData?: T;\n /** Called when form data changes */\n onChange?: (data: T) => void;\n /** Called when form is submitted */\n onSubmit?: (data: T) => void;\n /** Called on validation error */\n onError?: (errors: any[]) => void;\n /** Whether form is read-only */\n readonly?: boolean;\n /** Whether form is disabled */\n disabled?: boolean;\n /** Hide submit button */\n hideSubmitButton?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Additional styling (Tamagui props) */\n className?: string;\n /** Number of columns for automatic layout */\n columns?: number;\n /** Children to render (e.g., custom buttons) */\n children?: React.ReactNode;\n}\n\n/**\n * AutoForm Component\n *\n * A schema-driven form built with Uniforms and Tamagui.\n * Works seamlessly on Web and React Native.\n */\nexport function AutoForm<T = any>({\n schema,\n formData,\n onChange,\n onSubmit,\n readonly = false,\n disabled = false,\n hideSubmitButton = false,\n submitText = \"Submit\",\n columns = 1,\n children,\n}: AutoFormProps<T>) {\n // Create Uniforms bridge\n const bridge = useMemo(() => {\n const validator = (model: any) => {\n ajv.validate(schema, model);\n if (ajv.errors) {\n return { details: ajv.errors };\n }\n };\n return new JSONSchemaBridge({ schema, validator });\n }, [schema, ajv]);\n\n const handleUpdate = (key: string, value: any) => {\n if (!onChange) return;\n\n const keys = key.split(\".\");\n if (keys.length === 1) {\n onChange({ ...(formData || {}), [key]: value } as T);\n return;\n }\n\n // Handle nested updates (e.g. \"items.0.qty\")\n const newModel = JSON.parse(JSON.stringify(formData || {}));\n let current: any = newModel;\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (current[k] === undefined) {\n // Infer type (array if next key is numeric)\n current[k] = !isNaN(Number(keys[i + 1])) ? [] : {};\n }\n current = current[k];\n }\n current[keys[keys.length - 1]] = value;\n onChange(newModel as T);\n };\n\n return (\n <BaseForm\n schema={bridge}\n model={formData}\n onChange={handleUpdate}\n onSubmit={(model: any) => onSubmit?.(model as T)}\n disabled={disabled || readonly}\n >\n <YStack gap=\"$1\">\n <ErrorsField />\n\n {/* Render fields automatically based on schema keys */}\n {columns > 1 ? (\n <XStack flexWrap=\"wrap\" marginHorizontal=\"$-1.5\">\n {Object.keys(schema.properties || {}).map((key) => (\n <YStack key={key} flexBasis={`${100 / columns}%`} paddingHorizontal=\"$1.5\">\n <AutoField name={key} />\n </YStack>\n ))}\n </XStack>\n ) : (\n Object.keys(schema.properties || {}).map((key) => <AutoField key={key} name={key} />)\n )}\n\n {children}\n\n {!hideSubmitButton && <SubmitField value={submitText} />}\n </YStack>\n </BaseForm>\n );\n}\n\nexport default AutoForm;\n","import { useTranslation as useI18nTranslation } from \"react-i18next\";\n\n/**\n * Return type for useTranslation hook\n */\nexport interface UseTranslationResult {\n /** Translate a key with optional interpolation values */\n t: (key: string, options?: Record<string, unknown>) => string;\n /** Current language code (e.g., \"en\", \"hi\", \"ta\") */\n language: string;\n /** Change the current language */\n changeLanguage: (lng: string) => Promise<void>;\n /** Available languages */\n languages: readonly string[];\n /** Whether translations are ready/loaded */\n ready: boolean;\n}\n\n/**\n * Custom hook wrapper for react-i18next's useTranslation.\n *\n * Provides translation functions with app-specific defaults and utilities.\n *\n * @param namespace - Translation namespace (default: \"common\")\n * @returns Translation functions and state\n *\n * @example\n * ```tsx\n * const { t } = useTranslation();\n *\n * // Basic translation\n * <h1>{t(\"Welcome\")}</h1>\n *\n * // With interpolation\n * <p>{t(\"Hello, {{name}}!\", { name: \"John\" })}</p>\n * ```\n */\nexport function useTranslation(namespace = \"common\"): UseTranslationResult {\n const { t, i18n, ready } = useI18nTranslation(namespace);\n\n return {\n t: t as (key: string, options?: Record<string, unknown>) => string,\n language: i18n.language,\n changeLanguage: (lng: string) => i18n.changeLanguage(lng) as unknown as Promise<void>,\n languages: i18n.languages,\n ready,\n };\n}\n","export const SYSTEM_FIELDS = [\n \"id\",\n \"creation\",\n \"modified\",\n \"modified_by\",\n \"owner\",\n \"deleted_at\",\n \"docstatus\",\n \"idx\",\n \"parent\",\n \"parentfield\",\n \"parenttype\",\n \"is_favorite\",\n \"lft\",\n \"rgt\",\n \"old_parent\",\n];\n\nexport function stringToHslColor(str: string, s = 65, l = 45) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (str.codePointAt(i) ?? 0) + ((hash << 5) - hash);\n }\n const h = Math.abs(hash) % 360;\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nexport function ensureUtc(dateStr: string): Date {\n if (!dateStr) return new Date();\n const hasTimezone = /[Zz]$|[+-]\\d{2}(:?\\d{2})?$/.test(dateStr.trim());\n const isoStr = dateStr.includes(\" \") ? dateStr.replace(\" \", \"T\") : dateStr;\n const normalized = hasTimezone ? isoStr : `${isoStr}Z`;\n const date = new Date(normalized);\n return Number.isNaN(date.getTime()) ? new Date(dateStr) : date;\n}\n\nexport function formatRelativeTime(dateInput: string | Date): string {\n const now = new Date();\n const date = typeof dateInput === \"string\" ? ensureUtc(dateInput) : dateInput;\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (diffInSeconds < 60) return \"just now\";\n const diffInMinutes = Math.floor(diffInSeconds / 60);\n if (diffInMinutes < 60) return `${diffInMinutes}m ago`;\n const diffInHours = Math.floor(diffInMinutes / 60);\n if (diffInHours < 24) return `${diffInHours}h ago`;\n const diffInDays = Math.floor(diffInHours / 24);\n if (diffInDays < 30) return `${diffInDays}d ago`;\n return date.toLocaleDateString();\n}\n","/**\n * AutoTable Component\n *\n * Schema-driven table using TanStack Table with Refine's data fetching.\n * Generates columns from metadata with built-in sorting, filtering, pagination.\n *\n * Per checklist section 2.3:\n * - Columns generated from metadata\n * - Sorting, filtering, pagination built-in\n * - Row selection for bulk actions\n */\n\nimport {\n MStack,\n XStack,\n YStack,\n Button,\n MText,\n Card,\n useTheme,\n Skeleton,\n Input,\n} from \"@framework-m/ui\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"../../hooks/useTranslation\";\nimport { useList, type CrudFilters } from \"@refinedev/core\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type RowSelectionState,\n type PaginationState,\n} from \"@tanstack/react-table\";\nimport type { DocTypeSchema, JSONSchemaProperty } from \"../../hooks/types\";\nimport { SYSTEM_FIELDS, stringToHslColor, ensureUtc, formatRelativeTime } from \"./tableUtils\";\n\n/**\n * AutoTable props\n */\nexport interface AutoTableProps<TData extends object = object> {\n /** Resource name (DocType) */\n resource: string;\n /** Schema for generating columns */\n schema?: DocTypeSchema;\n /** Optional filters forwarded to Refine useList */\n filters?: CrudFilters;\n /** Custom column definitions (overrides schema-generated) */\n columns?: ColumnDef<TData, unknown>[];\n /** Enable row selection */\n enableSelection?: boolean;\n /** Called when selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Called when row is clicked */\n onRowClick?: (row: TData) => void;\n /** Additional className */\n className?: string;\n}\n\nfunction serializeQueryState(\n resource: string,\n filters: CrudFilters | undefined,\n sorting: SortingState\n): string {\n return JSON.stringify({\n resource,\n filters: filters ?? null,\n sorting,\n });\n}\n\n/**\n * Generate column definitions from JSON Schema\n */\nfunction generateColumnsFromSchema<TData extends object>(\n schema: DocTypeSchema,\n t: (key: string) => string\n): ColumnDef<TData, unknown>[] {\n const columns: ColumnDef<TData, unknown>[] = [];\n\n for (const [key, prop] of Object.entries(schema.properties)) {\n const property: JSONSchemaProperty = prop;\n\n // Skip hidden and system fields in the main list\n if (property[\"x-hidden\"] || SYSTEM_FIELDS.includes(key)) continue;\n\n columns.push({\n id: key,\n accessorKey: key,\n header: property.title || key,\n cell: ({ getValue }) => {\n const value = getValue();\n\n // Format based on type\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (property.format === \"date\" || property.format === \"date-time\") {\n return ensureUtc(value as string).toLocaleDateString();\n }\n return String(value);\n },\n enableSorting: true,\n });\n }\n\n // Add accessible system info column at the end\n columns.push({\n id: \"system_info\",\n header: t(\"Updated\"),\n accessorKey: \"modified\",\n cell: ({ row }) => {\n const data = row.original as Record<string, unknown>;\n const rawId = data.id;\n const id = typeof rawId === \"string\" || typeof rawId === \"number\" ? String(rawId) : \"No ID\";\n\n const rawModified = data.modified;\n const modified =\n typeof rawModified === \"string\" && rawModified.trim() ? rawModified : undefined;\n\n const rawModifiedBy = data.modified_by ?? data.owner;\n const modifiedBy =\n typeof rawModifiedBy === \"string\" && rawModifiedBy.trim() ? rawModifiedBy : \"system\";\n\n const relativeTime = modified ? formatRelativeTime(modified) : \"Unknown\";\n const userColor = stringToHslColor(modifiedBy);\n\n // Filter out UUIDs and systems for initials\n const hasHumanName = modifiedBy && !modifiedBy.includes(\"-\") && modifiedBy !== \"system\";\n const initials = hasHumanName ? modifiedBy.charAt(0).toUpperCase() : \"ⓘ\";\n\n const infoText = `ID: ${id}\\nBy: ${modifiedBy}\\nModified: ${modified ? ensureUtc(modified).toLocaleString() : \"Unknown\"}`;\n\n return (\n <XStack\n alignItems=\"center\"\n gap=\"$xs\"\n cursor=\"help\"\n title={infoText}\n aria-label={infoText}\n opacity={0.6}\n hoverStyle={{ opacity: 1 }}\n >\n <YStack\n width={18}\n height={18}\n borderRadius=\"$xs\"\n backgroundColor={hasHumanName ? userColor : \"transparent\"}\n borderWidth={hasHumanName ? 0 : 1}\n borderColor=\"$borderColor\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize={10} color={hasHumanName ? \"#fff\" : \"$colorMuted\"} fontWeight=\"700\">\n {initials}\n </MText>\n </YStack>\n <MText fontSize={11} color=\"$colorMuted\" whiteSpace=\"nowrap\">\n {relativeTime}\n </MText>\n </XStack>\n );\n },\n enableSorting: true,\n });\n\n return columns;\n}\n\n/**\n * AutoTable Component\n *\n * Uses Refine's useList for data fetching and TanStack Table for display.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoTable } from \"../components/table\";\n *\n * function TaskList() {\n * const { schema } = useDocTypeMeta(\"Task\");\n *\n * return (\n * <AutoTable\n * resource=\"Task\"\n * schema={schema}\n * onRowClick={(row) => navigate(`/task/${row.id}`)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoTable<TData extends object = object>({\n resource,\n schema,\n filters,\n columns: customColumns,\n enableSelection = false,\n onSelectionChange,\n onRowClick,\n className,\n}: Readonly<AutoTableProps<TData>>) {\n const { t } = useTranslation();\n\n // Determine initial sorting state (default to modified desc if modified exists)\n const [sorting, setSorting] = useState<SortingState>(() => {\n // Check if 'modified' is a valid field (not hidden)\n const hasModified = schema?.properties?.modified && !schema.properties.modified[\"x-hidden\"];\n if (hasModified) {\n return [{ id: \"modified\", desc: true }];\n }\n return [];\n });\n\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 20,\n });\n\n const theme = useTheme();\n // Safe access to theme token for web style resolution\n const borderColor =\n (theme as { borderColorMuted?: { get?: () => string } }).borderColorMuted?.get?.() ||\n \"rgba(226, 232, 240, 0.4)\";\n\n // Stable sorters for useList\n const sorters = useMemo<Array<{ field: string; order: \"desc\" | \"asc\" }> | undefined>(() => {\n if (sorting.length === 0) return undefined;\n const sort = sorting[0];\n return [\n {\n field: sort.id,\n order: sort.desc ? \"desc\" : \"asc\",\n },\n ];\n }, [sorting]);\n\n // Fetch data using Refine's useList\n const { result, query } = useList({\n resource,\n pagination: {\n currentPage: pagination.pageIndex + 1,\n pageSize: pagination.pageSize,\n mode: \"server\",\n },\n filters,\n sorters,\n queryOptions: {\n placeholderData: (prev: any) => prev,\n },\n });\n\n const tableData = (result?.data ?? []) as TData[];\n const totalCount = result?.total ?? 0;\n const isLoading = query?.isLoading ?? false;\n const isFetching = query?.isFetching ?? false;\n const queryError = query?.error as Error | null | undefined;\n const queryStateKey = useMemo(\n () => serializeQueryState(resource, filters, sorting),\n [resource, filters, sorting]\n );\n const previousQueryStateKey = useRef<string | null>(null);\n\n useEffect(() => {\n if (previousQueryStateKey.current === null) {\n previousQueryStateKey.current = queryStateKey;\n return;\n }\n\n if (previousQueryStateKey.current !== queryStateKey) {\n previousQueryStateKey.current = queryStateKey;\n setPagination((current) =>\n current.pageIndex === 0 ? current : { ...current, pageIndex: 0 }\n );\n }\n }, [queryStateKey]);\n\n // Generate columns from schema or use custom\n const columns = useMemo(() => {\n if (customColumns) return customColumns;\n if (schema) return generateColumnsFromSchema<TData>(schema, t);\n return [];\n }, [customColumns, schema, t]);\n\n // Add selection column if enabled\n const columnsWithSelection = useMemo(() => {\n if (!enableSelection) return columns;\n\n const selectionColumn: ColumnDef<TData, unknown> = {\n id: \"select\",\n size: 48,\n header: ({ table }) => (\n <Input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler() as any}\n />\n ),\n cell: ({ row }) => (\n <Input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler() as any}\n onClick={(e: any) => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n };\n\n return [selectionColumn, ...columns];\n }, [columns, enableSelection]);\n\n // Create TanStack Table instance\n const table = useReactTable<TData>({\n data: tableData,\n columns: columnsWithSelection,\n pageCount: Math.ceil(totalCount / pagination.pageSize),\n state: {\n sorting,\n rowSelection,\n pagination,\n },\n // Use 'id' field (UUID) as row identifier, fallback to index\n getRowId: (row) => {\n const r = row as Record<string, unknown>;\n return String(r.id ?? r.name ?? \"\");\n },\n onSortingChange: setSorting,\n onRowSelectionChange: (updater) => {\n const newSelection = typeof updater === \"function\" ? updater(rowSelection) : updater;\n setRowSelection(newSelection);\n\n // Notify parent of selection change\n // Compute selected rows directly from newSelection and tableData\n // (table.getSelectedRowModel() uses stale state before setRowSelection takes effect)\n if (onSelectionChange) {\n const selectedIds = Object.keys(newSelection).filter((key) => newSelection[key]);\n const selectedRows = tableData.filter((row) => {\n const r = row as Record<string, unknown>;\n const rowId = String(r.id ?? r.name ?? \"\");\n return selectedIds.includes(rowId);\n });\n onSelectionChange(selectedRows);\n }\n },\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableRowSelection: enableSelection,\n });\n\n if (isLoading) {\n return (\n <MStack padding=\"$md\" gap=\"$sm\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} height={32} width=\"100%\" />\n ))}\n </MStack>\n );\n }\n\n if (queryError) {\n return (\n <Card padding=\"$md\" backgroundColor=\"$error\" borderColor=\"$error\" borderWidth={1}>\n <MText color=\"#fff\">{queryError.message || `Failed to load ${resource}.`}</MText>\n </Card>\n );\n }\n\n return (\n <YStack\n className={className}\n width=\"100%\"\n flex={1}\n role=\"table\"\n aria-label={resource}\n backgroundColor=\"$background\"\n borderRadius=\"$sm\"\n overflow=\"hidden\"\n opacity={isFetching ? 0.6 : 1}\n style={{ transition: \"opacity 0.2s ease\" } as any}\n >\n {/* Table Header */}\n <YStack\n borderBottomWidth={1}\n borderColor={borderColor as any}\n backgroundColor=\"$backgroundSecondary\"\n role=\"rowgroup\"\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <XStack key={headerGroup.id} width=\"100%\" role=\"row\">\n {headerGroup.headers.map((header) => {\n const width =\n header.column.id === \"select\"\n ? 48\n : header.getSize() !== 150\n ? header.getSize()\n : undefined;\n const layoutProps = width !== undefined ? { width, flexShrink: 0 } : { flex: 1 };\n\n return (\n <XStack\n key={header.id}\n {...layoutProps}\n padding={12}\n alignItems=\"center\"\n minHeight={48}\n cursor={header.column.getCanSort() ? \"pointer\" : \"default\"}\n onPress={\n header.column.getCanSort() ? header.column.getToggleSortingHandler() : undefined\n }\n role=\"columnheader\"\n >\n <XStack gap=\"$xs\" alignItems=\"center\">\n <MText fontWeight=\"700\" fontSize=\"$sm\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </MText>\n {header.column.getIsSorted() && (\n <MText fontSize=\"$xs\" color=\"$primary\">\n {header.column.getIsSorted() === \"asc\" ? \"↑\" : \"↓\"}\n </MText>\n )}\n </XStack>\n </XStack>\n );\n })}\n </XStack>\n ))}\n </YStack>\n\n {/* Table Body */}\n <YStack role=\"rowgroup\" flex={1} style={{ overflowY: \"auto\" } as any}>\n {table.getRowModel().rows.length === 0 ? (\n <Card\n margin=\"$md\"\n padding=\"$lg\"\n backgroundColor=\"$backgroundSecondary\"\n borderColor=\"$borderColorMuted\"\n borderWidth={1}\n >\n <MText color=\"$colorMuted\">No matching records found.</MText>\n </Card>\n ) : (\n table.getRowModel().rows.map((row) => (\n <XStack\n key={row.id}\n width=\"100%\"\n borderBottomWidth={1}\n borderColor={borderColor as any}\n backgroundColor={row.getIsSelected() ? \"$backgroundSecondary\" : \"$background\"}\n cursor={onRowClick ? \"pointer\" : \"default\"}\n onPress={() => onRowClick?.(row.original)}\n hoverStyle={onRowClick ? { backgroundColor: \"$backgroundHover\" as any } : undefined}\n focusStyle={onRowClick ? { backgroundColor: \"$backgroundHover\" as any } : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={(e: any) => {\n if (e.key === \"Enter\" && onRowClick) {\n e.preventDefault();\n onRowClick(row.original);\n }\n }}\n role=\"row\"\n >\n {row.getVisibleCells().map((cell) => {\n const isSelect = cell.column.id === \"select\";\n const customSize = cell.column.getSize() !== 150;\n const layoutProps = isSelect\n ? { width: 48, flexShrink: 0 }\n : customSize\n ? { width: cell.column.getSize(), flexShrink: 0 }\n : { flex: 1 };\n\n return (\n <XStack\n key={cell.id}\n {...layoutProps}\n padding={12}\n alignItems=\"center\"\n minHeight={52}\n role=\"cell\"\n >\n <MText fontSize=\"$sm\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </MText>\n </XStack>\n );\n })}\n </XStack>\n ))\n )}\n </YStack>\n\n {/* Pagination */}\n <XStack\n justifyContent=\"space-between\"\n alignItems=\"center\"\n borderTopWidth={1}\n borderColor={borderColor as any}\n paddingTop=\"$sm\"\n marginTop=\"$sm\"\n paddingVertical=\"$sm\"\n >\n <MText fontSize=\"$sm\" color=\"$colorMuted\">\n Page {pagination.pageIndex + 1} of {table.getPageCount() || 1}\n {\" | \"}Total: {totalCount}\n </MText>\n <XStack gap=\"$sm\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n borderWidth={1}\n borderColor=\"$borderColor\"\n >\n Previous\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n borderWidth={1}\n borderColor=\"$borderColor\"\n >\n Next\n </Button>\n </XStack>\n </XStack>\n </YStack>\n );\n}\n\nexport default AutoTable;\n","/**\n * Editable Cell Component\n *\n * Inline editable cell for list views.\n * Per checklist 5.2: Inline Editing.\n *\n * Features:\n * - Click cell to edit\n * - Save on blur\n * - Show validation errors\n */\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\nimport { XStack, YStack, MText, Input, Select } from \"@framework-m/ui\";\n\n/**\n * Editable cell props\n */\nexport interface EditableCellProps {\n /** Resource/DocType name */\n resource: string;\n /** Row ID */\n id: string;\n /** Field name */\n field: string;\n /** Current value */\n value: unknown;\n /** Field type for input */\n type?: \"text\" | \"number\" | \"date\" | \"select\" | \"checkbox\";\n /** Options for select type */\n options?: Array<{ value: string; label: string }>;\n /** Whether editing is disabled */\n disabled?: boolean;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Custom renderer for display mode */\n renderValue?: (value: unknown) => React.ReactNode;\n}\n\n/**\n * EditableCell Component\n *\n * @example\n * ```tsx\n * <EditableCell\n * resource=\"Customer\"\n * id=\"CUST-001\"\n * field=\"customer_name\"\n * value=\"John Smith\"\n * type=\"text\"\n * />\n * ```\n */\nexport function EditableCell({\n resource,\n id,\n field,\n value,\n type = \"text\",\n options,\n disabled = false,\n onSaveSuccess,\n renderValue,\n}: EditableCellProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement | HTMLSelectElement>(null);\n const updateMutation = useUpdate();\n\n // Focus input when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n if (inputRef.current instanceof HTMLInputElement) {\n inputRef.current.select();\n }\n }\n }, [isEditing]);\n\n // Reset edit value when prop value changes\n useEffect(() => {\n setEditValue(value);\n }, [value]);\n\n // Enter edit mode\n const handleClick = useCallback(() => {\n if (disabled) return;\n setIsEditing(true);\n setEditValue(value);\n setError(null);\n }, [disabled, value]);\n\n // Cancel edit\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setEditValue(value);\n setError(null);\n }, [value]);\n\n // Save on blur\n const handleBlur = useCallback(() => {\n if (editValue === value) {\n // No change, just exit edit mode\n setIsEditing(false);\n return;\n }\n\n // Save the value\n updateMutation.mutate(\n {\n resource,\n id,\n values: { [field]: editValue },\n },\n {\n onSuccess: () => {\n setIsEditing(false);\n setError(null);\n onSaveSuccess?.();\n },\n onError: (err) => {\n setError(err.message || \"Save failed\");\n },\n }\n );\n }, [resource, id, field, editValue, value, updateMutation, onSaveSuccess]);\n\n // Handle key press\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleBlur();\n } else if (e.key === \"Escape\") {\n handleCancel();\n }\n },\n [handleBlur, handleCancel]\n );\n\n // Handle value change\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const newValue =\n type === \"checkbox\"\n ? (e.target as HTMLInputElement).checked\n : type === \"number\"\n ? Number(e.target.value)\n : e.target.value;\n setEditValue(newValue);\n setError(null);\n },\n [type]\n );\n\n const isSaving = updateMutation.mutation.isPending;\n\n // Display mode\n if (!isEditing) {\n return (\n <XStack\n onPress={handleClick}\n paddingVertical=\"$xs\"\n paddingHorizontal=\"$sm\"\n cursor={disabled ? \"default\" : \"pointer\"}\n borderRadius=\"$sm\"\n minHeight={24}\n hoverStyle={!disabled ? { backgroundColor: \"$backgroundHover\" as any } : undefined}\n title={disabled ? undefined : \"Click to edit\"}\n >\n <MText>\n {renderValue\n ? renderValue(value)\n : type === \"checkbox\"\n ? value\n ? \"✓\"\n : \"✗\"\n : String(value ?? \"\")}\n </MText>\n </XStack>\n );\n }\n\n // Edit mode\n return (\n <YStack position=\"relative\">\n {type === \"select\" ? (\n <Select\n value={String(editValue ?? \"\")}\n onChange={handleChange as any}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown as any}\n disabled={isSaving}\n options={[{ value: \"\", label: \"-\" }, ...(options ?? [])]}\n borderColor={error ? \"$error\" : \"$primary\"}\n />\n ) : type === \"checkbox\" ? (\n <Input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type=\"checkbox\"\n checked={Boolean(editValue)}\n onChange={handleChange as any}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown as any}\n disabled={isSaving}\n style={{ cursor: \"pointer\" }}\n />\n ) : (\n <Input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type={type}\n value={String(editValue ?? \"\")}\n onChange={handleChange as any}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown as any}\n disabled={isSaving}\n borderColor={error ? \"$error\" : \"$primary\"}\n width=\"100%\"\n />\n )}\n\n {/* Error tooltip */}\n {error && (\n <YStack\n position=\"absolute\"\n top=\"100%\"\n left={0}\n marginTop=\"$xs\"\n paddingHorizontal=\"$sm\"\n paddingVertical=\"$xs\"\n backgroundColor=\"$error\"\n borderRadius=\"$sm\"\n zIndex={10}\n >\n <MText color=\"#fff\" fontSize=\"$xs\" whiteSpace=\"nowrap\">\n {error}\n </MText>\n </YStack>\n )}\n\n {/* Saving indicator */}\n {isSaving && (\n <YStack position=\"absolute\" right=\"$sm\" top=\"50%\" y=\"-50%\">\n <MText fontSize=\"$xs\" color=\"$primary\">\n ...\n </MText>\n </YStack>\n )}\n </YStack>\n );\n}\n\nexport default EditableCell;\n","import { useEffect, useMemo } from \"react\";\nimport { YStack, XStack, Button, Heading, MText, Card } from \"@framework-m/ui\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n destructive = false,\n onConfirm,\n onCancel,\n}: Readonly<ConfirmDialogProps>) {\n const titleId = useMemo(\n () => `confirm-dialog-title-${title.toLowerCase().replaceAll(\" \", \"-\")}`,\n [title]\n );\n\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onCancel();\n }\n };\n\n globalThis.addEventListener(\"keydown\", handleKeyDown);\n return () => globalThis.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onCancel]);\n\n if (!open) return null;\n\n return (\n <YStack\n role=\"dialog\"\n aria-modal={true}\n aria-labelledby={titleId}\n position=\"fixed\"\n inset={0}\n zIndex={10000}\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"rgba(0,0,0,0.45)\"\n onPress={onCancel}\n >\n <Card\n onPress={(e: any) => e.stopPropagation()}\n width=\"100%\"\n maxWidth={420}\n padding=\"$lg\"\n backgroundColor=\"$background\"\n elevated\n >\n <Heading id={titleId} size=\"$sm\" marginBottom=\"$sm\">\n {title}\n </Heading>\n <MText color=\"$colorMuted\" marginBottom=\"$lg\">\n {message}\n </MText>\n\n <XStack justifyContent=\"flex-end\" gap=\"$sm\">\n <Button variant=\"ghost\" onPress={onCancel}>\n {cancelLabel}\n </Button>\n <Button variant={destructive ? \"danger\" : \"primary\"} onPress={onConfirm}>\n {confirmLabel}\n </Button>\n </XStack>\n </Card>\n </YStack>\n );\n}\n\nexport default ConfirmDialog;\n","import { Card, XStack, MText, Button } from \"@framework-m/ui\";\n\nexport interface AlertBannerProps {\n message: string;\n variant?: \"info\" | \"error\" | \"success\";\n onDismiss?: () => void;\n}\n\nconst styles = {\n info: {\n bg: \"$backgroundSecondary\",\n border: \"$borderColor\",\n text: \"$color\",\n },\n error: {\n bg: \"$error\",\n border: \"$error\",\n text: \"white\",\n },\n success: {\n bg: \"$success\",\n border: \"$success\",\n text: \"white\",\n },\n} as const;\n\nexport function AlertBanner({ message, variant = \"info\", onDismiss }: Readonly<AlertBannerProps>) {\n const palette = styles[variant];\n\n return (\n <Card\n role={variant === \"error\" ? \"alert\" : \"status\"}\n backgroundColor={palette.bg}\n borderColor={palette.border}\n borderWidth={1}\n marginBottom=\"$md\"\n padding=\"$md\"\n >\n <XStack alignItems=\"center\" justifyContent=\"space-between\" gap=\"$sm\">\n <MText color={palette.text as any} flex={1}>\n {message}\n </MText>\n {onDismiss && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onDismiss} aria-label=\"Dismiss\">\n <MText color={palette.text as any} fontSize=\"$xl\" lineHeight={1}>\n ×\n </MText>\n </Button>\n )}\n </XStack>\n </Card>\n );\n}\n\nexport default AlertBanner;\n","import { Card, MText } from \"@framework-m/ui\";\n\nexport interface SubmittedBannerProps {\n docstatus: 0 | 1 | 2;\n}\n\nexport function SubmittedBanner({ docstatus }: Readonly<SubmittedBannerProps>) {\n if (docstatus === 1) {\n return (\n <Card\n role=\"alert\"\n padding=\"$sm\"\n backgroundColor=\"$warning\"\n borderColor=\"$warning\"\n borderWidth={1}\n >\n <MText color=\"#000\" fontSize=\"$sm\">\n Submitted - document is locked\n </MText>\n </Card>\n );\n }\n\n if (docstatus === 2) {\n return (\n <Card\n role=\"alert\"\n padding=\"$sm\"\n backgroundColor=\"$colorMuted\"\n borderColor=\"$borderColor\"\n borderWidth={1}\n >\n <MText color=\"$textOnColor\" fontSize=\"$sm\">\n Cancelled - document is locked\n </MText>\n </Card>\n );\n }\n\n return null;\n}\n\nexport default SubmittedBanner;\n","import { useState, useCallback } from \"react\";\nimport { XStack, YStack, Button, Select, Input, MText, Card } from \"@framework-m/ui\";\nimport { ConfirmDialog } from \"../feedback\";\n\n/**\n * BulkActionsBar props\n */\nexport interface BulkActionsBarProps {\n /** Number of selected items */\n selectedCount: number;\n /** Whether action is in progress */\n isLoading?: boolean;\n /** Handle bulk delete */\n onDelete?: () => void;\n /** Handle export as JSON */\n onExportJson?: () => void;\n /** Handle export as CSV */\n onExportCsv?: () => void;\n /** Handle bulk update */\n onBulkUpdate?: (field: string, value: unknown) => void;\n /** Available fields for bulk update */\n updateFields?: Array<{\n name: string;\n label: string;\n options?: Array<{ value: string; label: string }>;\n }>;\n /** Handle clear selection */\n onClear?: () => void;\n}\n\n/**\n * BulkActionsBar Component\n *\n * Standardized toolbar for bulk operations.\n * Uses themed primitives and the new Select component.\n */\nexport function BulkActionsBar({\n selectedCount,\n isLoading = false,\n onDelete,\n onExportJson,\n onExportCsv,\n onBulkUpdate,\n updateFields = [],\n onClear,\n}: Readonly<BulkActionsBarProps>) {\n const [showUpdateMenu, setShowUpdateMenu] = useState(false);\n const [selectedField, setSelectedField] = useState(\"\");\n const [updateValue, setUpdateValue] = useState(\"\");\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Handle update submit\n const handleUpdate = useCallback(() => {\n if (selectedField && onBulkUpdate) {\n onBulkUpdate(selectedField, updateValue);\n setShowUpdateMenu(false);\n setSelectedField(\"\");\n setUpdateValue(\"\");\n }\n }, [selectedField, updateValue, onBulkUpdate]);\n\n // Handle delete with confirmation\n const handleDelete = useCallback(() => {\n setIsDeleteConfirmOpen(true);\n }, []);\n\n if (selectedCount === 0) return null;\n\n return (\n <XStack\n alignItems=\"center\"\n gap=\"$md\"\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n backgroundColor=\"$backgroundSecondary\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$round\"\n marginBottom=\"$md\"\n flexWrap=\"wrap\"\n >\n {/* Selection count */}\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n {selectedCount} selected\n </MText>\n\n {/* Actions */}\n <XStack gap=\"$xs\" flexWrap=\"wrap\">\n {/* Delete */}\n {onDelete && (\n <Button\n variant=\"ghost\"\n backgroundColor=\"$error\"\n size=\"sm\"\n onPress={handleDelete}\n disabled={isLoading}\n >\n Delete\n </Button>\n )}\n\n {/* Export JSON */}\n {onExportJson && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onExportJson} disabled={isLoading}>\n Export JSON\n </Button>\n )}\n\n {/* Export CSV */}\n {onExportCsv && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onExportCsv} disabled={isLoading}>\n Export CSV\n </Button>\n )}\n\n {/* Bulk Update */}\n {onBulkUpdate && updateFields.length > 0 && (\n <YStack position=\"relative\" zIndex={100}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setShowUpdateMenu(!showUpdateMenu)}\n disabled={isLoading}\n >\n Update Field ▼\n </Button>\n\n {/* Update dropdown menu */}\n {showUpdateMenu && (\n <Card\n position=\"absolute\"\n top=\"100%\"\n left={0}\n marginTop=\"$xs\"\n width={280}\n padding=\"$md\"\n elevated\n zIndex={1000}\n backgroundColor=\"$background\"\n borderColor=\"$borderColor\"\n borderWidth={1}\n >\n <YStack gap=\"$md\">\n <YStack gap=\"$xs\">\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Select Field\n </MText>\n <Select\n size=\"sm\"\n value={selectedField}\n onChange={(e: any) => setSelectedField(e.target.value)}\n placeholder=\"Select a field...\"\n options={updateFields.map((f) => ({\n value: f.name,\n label: f.label,\n }))}\n />\n </YStack>\n\n {selectedField && (\n <YStack gap=\"$xs\">\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n New Value\n </MText>\n {updateFields.find((f) => f.name === selectedField)?.options ? (\n <Select\n size=\"sm\"\n value={String(updateValue)}\n onChange={(e: any) => setUpdateValue(e.target.value)}\n options={\n updateFields.find((f) => f.name === selectedField)?.options || []\n }\n />\n ) : (\n <Input\n size=\"sm\"\n value={String(updateValue)}\n onChange={(e: any) => setUpdateValue(e.target.value)}\n placeholder=\"Enter new value...\"\n />\n )}\n </YStack>\n )}\n\n <XStack gap=\"$xs\" justifyContent=\"flex-end\">\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setShowUpdateMenu(false)}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={handleUpdate}\n disabled={!selectedField}\n >\n Update\n </Button>\n </XStack>\n </YStack>\n </Card>\n )}\n </YStack>\n )}\n\n {/* Clear */}\n {onClear && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onClear} disabled={isLoading}>\n Clear Selected\n </Button>\n )}\n </XStack>\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Are you sure you want to delete ${selectedCount} selected document(s)? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n setIsDeleteConfirmOpen(false);\n onDelete?.();\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </XStack>\n );\n}\n\nexport default BulkActionsBar;\n","/**\n * StateBadge Component\n *\n * Displays the current workflow state as a colored badge.\n * Per checklist 2.4: Show current state badge (e.g., \"Draft\", \"Approved\")\n */\n\nimport type { CSSProperties } from \"react\";\nimport { XStack, MText } from \"@framework-m/ui\";\n\n/**\n * State color mapping\n */\nconst STATE_COLORS: Record<string, { bg: string; text: string }> = {\n // Common workflow states\n draft: { bg: \"#e0e0e0\", text: \"#333\" },\n pending: { bg: \"#fff3cd\", text: \"#856404\" },\n submitted: { bg: \"#cce5ff\", text: \"#004085\" },\n approved: { bg: \"#d4edda\", text: \"#155724\" },\n rejected: { bg: \"#f8d7da\", text: \"#721c24\" },\n cancelled: { bg: \"#f5f5f5\", text: \"#666\" },\n completed: { bg: \"#d4edda\", text: \"#155724\" },\n on_hold: { bg: \"#fff3cd\", text: \"#856404\" },\n // Default\n default: { bg: \"#e9ecef\", text: \"#495057\" },\n};\n\n/**\n * Get color for a state\n */\nfunction getStateColor(state: string | undefined): {\n bg: string;\n text: string;\n} {\n if (!state) return STATE_COLORS.default;\n\n const normalizedState = state.toLowerCase().replace(/\\s+/g, \"_\");\n return STATE_COLORS[normalizedState] ?? STATE_COLORS.default;\n}\n\n/**\n * StateBadge props\n */\nexport interface StateBadgeProps {\n /** Current workflow state */\n state?: string;\n /** Document status (0=Draft, 1=Submitted, 2=Cancelled) */\n docstatus?: number;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * StateBadge Component\n *\n * Displays workflow state as a styled badge.\n *\n * @example\n * ```tsx\n * <StateBadge state=\"Pending Approval\" />\n * <StateBadge state=\"Approved\" />\n * <StateBadge state=\"Draft\" docstatus={0} />\n * ```\n */\nexport function StateBadge({ state, docstatus, className, style }: StateBadgeProps) {\n // Determine display state\n const displayState =\n state ??\n (docstatus === 0\n ? \"Draft\"\n : docstatus === 1\n ? \"Submitted\"\n : docstatus === 2\n ? \"Cancelled\"\n : undefined);\n\n if (!displayState) return null;\n\n const colors = getStateColor(displayState);\n\n return (\n <XStack\n className={className}\n alignSelf=\"flex-start\"\n paddingVertical={4}\n paddingHorizontal={12}\n borderRadius=\"$round\"\n backgroundColor={colors.bg as any}\n style={style as any}\n >\n <MText fontSize={12} fontWeight=\"500\" textTransform=\"capitalize\" color={colors.text as any}>\n {displayState}\n </MText>\n </XStack>\n );\n}\n\nexport default StateBadge;\n","/**\n * useWorkflowActions Hook\n *\n * Fetches available workflow transitions for a document and\n * provides methods to execute transitions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { API_URL } from \"../constants\";\nimport { fetchWithCredentials } from \"../api\";\n\n/**\n * Workflow action (transition) definition\n */\nexport interface WorkflowAction {\n name: string;\n label: string;\n from_state: string;\n to_state: string;\n allowed: boolean;\n reason?: string; // Why not allowed, if applicable\n}\n\n/**\n * Workflow state information\n */\nexport interface WorkflowState {\n current_state: string;\n docstatus: number;\n workflow_name?: string;\n}\n\n/**\n * Workflow actions response from API\n */\ninterface WorkflowActionsResponse {\n state: WorkflowState;\n actions: WorkflowAction[];\n}\n\n/**\n * Return type for useWorkflowActions hook\n */\nexport interface UseWorkflowActionsResult {\n /** Current workflow state */\n state: WorkflowState | undefined;\n /** Available actions for current user */\n actions: WorkflowAction[];\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Execute a workflow transition */\n executeAction: (actionName: string) => Promise<void>;\n /** Is an action currently executing */\n isExecuting: boolean;\n /** Refresh actions */\n refetch: () => void;\n}\n\n/**\n * Fetch workflow actions for a document\n */\nasync function fetchWorkflowActions(doctype: string, id: string): Promise<WorkflowActionsResponse> {\n const response = await fetchWithCredentials(`${API_URL}/workflow/${doctype}/${id}/actions`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow actions: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Execute a workflow transition\n */\nasync function executeTransition(doctype: string, id: string, action: string): Promise<void> {\n const response = await fetchWithCredentials(`${API_URL}/workflow/${doctype}/${id}/transition`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({\n detail: response.statusText,\n }));\n throw new Error(error.detail || `Failed to execute ${action}`);\n }\n}\n\n/**\n * Hook to manage workflow actions for a document\n *\n * @param doctype - The DocType name\n * @param id - The document ID\n * @param options - Additional options\n *\n * @example\n * ```tsx\n * const { state, actions, executeAction, isExecuting } = useWorkflowActions(\"Todo\", todoId);\n *\n * return (\n * <div>\n * <StateBadge state={state?.current_state} />\n * {actions.map(action => (\n * <button\n * key={action.name}\n * onClick={() => executeAction(action.name)}\n * disabled={!action.allowed || isExecuting}\n * >\n * {action.label}\n * </button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useWorkflowActions(\n doctype: string,\n id: string | undefined,\n options?: { enabled?: boolean }\n): UseWorkflowActionsResult {\n const queryClient = useQueryClient();\n const [isExecuting, setIsExecuting] = useState(false);\n\n const enabled = Boolean(id) && (options?.enabled ?? true);\n\n const { data, isLoading, error, refetch } = useQuery<WorkflowActionsResponse, Error>({\n queryKey: [\"workflow-actions\", doctype, id],\n queryFn: () => fetchWorkflowActions(doctype, id!),\n enabled,\n staleTime: 30 * 1000, // 30 seconds\n });\n\n const executeAction = useCallback(\n async (actionName: string) => {\n if (!id) return;\n\n setIsExecuting(true);\n try {\n await executeTransition(doctype, id, actionName);\n\n // Invalidate queries to refresh state\n await queryClient.invalidateQueries({\n queryKey: [\"workflow-actions\", doctype, id],\n });\n // Also invalidate the document data\n await queryClient.invalidateQueries({\n queryKey: [doctype, id],\n });\n } finally {\n setIsExecuting(false);\n }\n },\n [doctype, id, queryClient]\n );\n\n return {\n state: data?.state,\n actions: data?.actions ?? [],\n isLoading,\n error: error ?? null,\n executeAction,\n isExecuting,\n refetch,\n };\n}\n","/**\n * WorkflowActions Component\n *\n * Renders action buttons for workflow transitions.\n * Per checklist 2.4: Render buttons like \"Submit\", \"Approve\", \"Reject\"\n */\n\nimport type { CSSProperties } from \"react\";\nimport { useWorkflowActions, type WorkflowAction } from \"../../hooks/useWorkflowActions\";\nimport { StateBadge } from \"./StateBadge\";\nimport { XStack, Button, MText } from \"@framework-m/ui\";\n\n/**\n * Action button color mapping\n */\nconst ACTION_COLORS: Record<string, { bg: string; text: string; hover: string }> = {\n submit: { bg: \"#007bff\", text: \"white\", hover: \"#0056b3\" },\n approve: { bg: \"#28a745\", text: \"white\", hover: \"#1e7e34\" },\n reject: { bg: \"#dc3545\", text: \"white\", hover: \"#bd2130\" },\n cancel: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n hold: { bg: \"#ffc107\", text: \"#212529\", hover: \"#d39e00\" },\n default: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n};\n\n/**\n * Get button color for an action\n */\nfunction getActionColor(actionName: string): {\n bg: string;\n text: string;\n hover: string;\n} {\n const normalized = actionName.toLowerCase();\n\n if (normalized.includes(\"submit\")) return ACTION_COLORS.submit;\n if (normalized.includes(\"approve\")) return ACTION_COLORS.approve;\n if (normalized.includes(\"reject\")) return ACTION_COLORS.reject;\n if (normalized.includes(\"cancel\")) return ACTION_COLORS.cancel;\n if (normalized.includes(\"hold\")) return ACTION_COLORS.hold;\n\n return ACTION_COLORS.default;\n}\n\n/**\n * WorkflowActions props\n */\nexport interface WorkflowActionsProps {\n /** DocType name */\n doctype: string;\n /** Document ID */\n id?: string;\n /** Show state badge */\n showState?: boolean;\n /** Callback after successful action */\n onActionComplete?: (action: string) => void;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * WorkflowActions Component\n *\n * Fetches and renders workflow action buttons.\n *\n * @example\n * ```tsx\n * // In form header\n * <WorkflowActions\n * doctype=\"Todo\"\n * id={todoId}\n * showState\n * onActionComplete={() => refetch()}\n * />\n * ```\n */\nexport function WorkflowActions({\n doctype,\n id,\n showState = true,\n onActionComplete,\n className,\n style,\n}: WorkflowActionsProps) {\n const { state, actions, isLoading, executeAction, isExecuting } = useWorkflowActions(doctype, id);\n\n // Handle action click\n const handleAction = async (action: WorkflowAction) => {\n try {\n await executeAction(action.name);\n onActionComplete?.(action.name);\n } catch (error) {\n console.error(\"Workflow action failed:\", error);\n // Could add toast notification here\n }\n };\n\n if (isLoading) {\n return <MText color=\"$colorMuted\">Loading workflow...</MText>;\n }\n\n // No workflow if no state\n if (!state) {\n return null;\n }\n\n // Filter to only show allowed actions\n const allowedActions = actions.filter((a) => a.allowed);\n\n return (\n <XStack className={className} alignItems=\"center\" gap=\"$md\" style={style}>\n {/* State Badge */}\n {showState && <StateBadge state={state.current_state} docstatus={state.docstatus} />}\n\n {/* Action Buttons */}\n {allowedActions.map((action) => {\n const colors = getActionColor(action.name);\n\n return (\n <Button\n key={action.name}\n onPress={() => handleAction(action)}\n disabled={isExecuting}\n backgroundColor={colors.bg as any}\n color={colors.text as any}\n hoverStyle={{ backgroundColor: colors.hover } as any}\n opacity={isExecuting ? 0.6 : 1}\n size=\"sm\"\n >\n {isExecuting ? \"...\" : action.label}\n </Button>\n );\n })}\n\n {/* Show message if no actions available */}\n {allowedActions.length === 0 && !isLoading && (\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n No actions available\n </MText>\n )}\n </XStack>\n );\n}\n\nexport default WorkflowActions;\n","/**\n * Plugin Registry\n *\n * Central registry for Framework M plugins.\n * Per checklist 2.5: No Monkey Patching - Plugins register via app.registerPlugin()\n */\n\nimport type {\n Plugin,\n PluginRegistry,\n FieldRegistration,\n SlotRegistration,\n PageRegistration,\n ResourceRegistration,\n ThemeRegistration,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown }).__FRAMEWORK_M_DEBUG__;\n if (typeof globalFlag === \"boolean\") {\n return globalFlag;\n }\n if (typeof globalFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(globalFlag.toLowerCase());\n }\n\n const processRef = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n const envFlag = processRef?.env?.FRAMEWORK_M_DEBUG;\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst pluginLogger = {\n info(message: string): void {\n if (isDebugEnabled()) {\n console.info(`[DeskPluginRegistry] ${message}`);\n }\n },\n warn(message: string): void {\n if (isDebugEnabled()) {\n console.warn(`[DeskPluginRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[DeskPluginRegistry] ${message}`, error);\n },\n};\n\n/**\n * Global plugin registry instance\n */\nconst registry: PluginRegistry = {\n plugins: new Map(),\n fields: new Map(),\n slots: new Map(),\n pages: new Map(),\n resources: [],\n theme: undefined,\n};\n\n/**\n * Register a plugin with the application\n *\n * @param plugin - Plugin definition\n *\n * @example\n * ```tsx\n * // In custom_app/frontend/index.ts\n * import { registerPlugin } from \"@framework-m/core\";\n * import { StarRating } from \"./components/StarRating\";\n * import { PaymentButton } from \"./components/PaymentButton\";\n *\n * registerPlugin({\n * name: \"custom_app\",\n * version: \"1.0.0\",\n * fields: [\n * { name: \"rating\", component: StarRating, fieldTypes: [\"Rating\"] }\n * ],\n * slots: [\n * { slot: \"form-header\", component: PaymentButton, doctypes: [\"Sales Invoice\"] }\n * ],\n * });\n * ```\n */\nexport function registerPlugin(plugin: Plugin): void {\n // Check for duplicate\n if (registry.plugins.has(plugin.name)) {\n pluginLogger.warn(`Plugin \"${plugin.name}\" is already registered. Skipping.`);\n return;\n }\n\n // Register plugin\n registry.plugins.set(plugin.name, plugin);\n\n // Register fields\n if (plugin.fields) {\n for (const field of plugin.fields) {\n registry.fields.set(field.name, field);\n }\n }\n\n // Register slots\n if (plugin.slots) {\n for (const slot of plugin.slots) {\n const existing = registry.slots.get(slot.slot) ?? [];\n existing.push(slot);\n // Sort by priority (higher first)\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot.slot, existing);\n }\n }\n\n // Register pages\n if (plugin.pages) {\n for (const page of plugin.pages) {\n const key = `${page.pageType}:${page.doctype}`;\n registry.pages.set(key, page);\n }\n }\n\n // Register resources\n if (plugin.resources) {\n registry.resources.push(...plugin.resources);\n }\n\n // Register theme (last one wins)\n if (plugin.theme) {\n registry.theme = {\n ...registry.theme,\n ...plugin.theme,\n };\n }\n\n // Run init if provided\n if (plugin.init) {\n Promise.resolve(plugin.init()).catch((err) => {\n pluginLogger.error(`Plugin \"${plugin.name}\" init failed`, err);\n });\n }\n\n pluginLogger.info(`Plugin \"${plugin.name}\" registered successfully.`);\n}\n\n/**\n * Register a custom field widget\n *\n * @param name - Field name/type\n * @param component - React component for the field\n * @param fieldTypes - Optional field types this widget handles\n *\n * @example\n * ```tsx\n * registerField(\"rating\", StarRating, [\"Rating\"]);\n * ```\n */\nexport function registerField(\n name: string,\n component: FieldRegistration[\"component\"],\n fieldTypes?: string[]\n): void {\n registry.fields.set(name, { name, component, fieldTypes });\n}\n\n/**\n * Register a slot injection\n *\n * @param slot - Slot name\n * @param component - React component to inject\n * @param options - Optional doctypes filter and priority\n *\n * @example\n * ```tsx\n * registerSlot(\"form-header\", PaymentButton, {\n * doctypes: [\"Sales Invoice\"],\n * priority: 10\n * });\n * ```\n */\nexport function registerSlot(\n slot: string,\n component: SlotRegistration[\"component\"],\n options?: { doctypes?: string[]; priority?: number }\n): void {\n const existing = registry.slots.get(slot) ?? [];\n\n // Prevent duplicate components in the same slot during HMR\n const isDuplicate = existing.some(\n (r) =>\n r.component === component && JSON.stringify(r.doctypes) === JSON.stringify(options?.doctypes)\n );\n\n if (isDuplicate) {\n return;\n }\n\n const registration: SlotRegistration = {\n slot,\n component,\n ...options,\n };\n\n existing.push(registration);\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot, existing);\n}\n\n/**\n * Register a page override\n *\n * @param pageType - Page type to override\n * @param doctype - DocType or '*' for all\n * @param component - React component for the page\n *\n * @example\n * ```tsx\n * registerPage(\"form\", \"Sales Invoice\", CustomInvoiceForm);\n * ```\n */\nexport function registerPage(\n pageType: PageRegistration[\"pageType\"],\n doctype: string,\n component: PageRegistration[\"component\"]\n): void {\n const key = `${pageType}:${doctype}`;\n registry.pages.set(key, { pageType, doctype, component });\n}\n\n/**\n * Get a registered field widget\n */\nexport function getField(name: string): FieldRegistration | undefined {\n return registry.fields.get(name);\n}\n\n/**\n * Get all slot components for a slot name\n */\nexport function getSlotComponents(slotName: string, doctype?: string): SlotRegistration[] {\n const slots = registry.slots.get(slotName) ?? [];\n\n // Filter by doctype if specified\n if (doctype) {\n return slots.filter((s) => !s.doctypes || s.doctypes.includes(doctype));\n }\n\n return slots;\n}\n\n/**\n * Get a page override\n */\nexport function getPage(pageType: string, doctype: string): PageRegistration | undefined {\n // Try specific doctype first\n const specific = registry.pages.get(`${pageType}:${doctype}`);\n if (specific) return specific;\n\n // Fall back to wildcard\n return registry.pages.get(`${pageType}:*`);\n}\n\n/**\n * Get all registered resources\n */\nexport function getResources(): ResourceRegistration[] {\n return registry.resources;\n}\n\n/**\n * Get the current theme\n */\nexport function getTheme(): ThemeRegistration | undefined {\n return registry.theme;\n}\n\n/**\n * Get all registered plugins\n */\nexport function getPlugins(): Plugin[] {\n return Array.from(registry.plugins.values());\n}\n\n/**\n * Check if a plugin is registered\n */\nexport function hasPlugin(name: string): boolean {\n return registry.plugins.has(name);\n}\n\n/**\n * Clear all registrations (for testing)\n */\nexport function clearRegistry(): void {\n registry.plugins.clear();\n registry.fields.clear();\n registry.slots.clear();\n registry.pages.clear();\n registry.resources.length = 0;\n registry.theme = undefined;\n}\n","/**\n * Slot Component\n *\n * Renders registered slot components for a named slot.\n * Used for injection points in the UI.\n */\n\nimport { getSlotComponents } from \"./registry\";\nimport type { SlotRegistration, SlotProps } from \"./types\";\n\n/**\n * Slot component props\n */\nexport interface SlotComponentProps extends SlotProps {\n /** Slot name */\n name: string;\n /** Children to render if no slot components */\n children?: React.ReactNode;\n}\n\n/**\n * Slot Component\n *\n * Renders all registered components for a named slot.\n *\n * @example\n * ```tsx\n * // In FormView header\n * <div className=\"form-header\">\n * <h1>{doctype}</h1>\n * <Slot name=\"form-header\" doctype={doctype} data={formData} />\n * </div>\n * ```\n */\nexport function Slot({ name, doctype, data, id, children }: SlotComponentProps) {\n const slotRegistrations = getSlotComponents(name, doctype);\n\n if (slotRegistrations.length === 0) {\n return <>{children}</>;\n }\n\n return (\n <>\n {slotRegistrations.map((registration: SlotRegistration, index: number) => {\n const Component = registration.component;\n return <Component key={`${name}-${index}`} doctype={doctype} data={data} id={id} />;\n })}\n </>\n );\n}\n\nexport default Slot;\n","import { useList } from \"@refinedev/core\";\n\nexport interface AuditTimelineDiffValue {\n old: unknown;\n new: unknown;\n}\n\nexport interface AuditTimelineEntry {\n id: string;\n timestamp: string;\n user_id: string;\n action: string;\n doctype_name?: string;\n document_id?: string;\n diff: Record<string, AuditTimelineDiffValue> | null;\n metadata: Record<string, unknown> | null;\n}\n\nexport interface UseAuditTimelineResult {\n entries: AuditTimelineEntry[];\n isLoading: boolean;\n error: string | null;\n}\n\nfunction toEntries(payload: unknown): AuditTimelineEntry[] {\n if (Array.isArray(payload)) {\n return payload as AuditTimelineEntry[];\n }\n\n if (\n payload &&\n typeof payload === \"object\" &&\n Array.isArray((payload as { items?: unknown }).items)\n ) {\n return (payload as { items: AuditTimelineEntry[] }).items;\n }\n\n return [];\n}\n\nfunction toErrorMessage(error: unknown): string | null {\n if (!error) {\n return null;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\nexport function useAuditTimeline(doctype: string, id: string | undefined): UseAuditTimelineResult {\n const listResult = useList({\n resource: \"ActivityLog\",\n filters: [\n { field: \"document_id\", operator: \"eq\", value: id ?? \"\" },\n { field: \"doctype_name\", operator: \"eq\", value: doctype },\n ],\n sorters: [{ field: \"timestamp\", order: \"desc\" }],\n pagination: { pageSize: 50 },\n queryOptions: { enabled: Boolean(id) },\n }) as {\n result?: { data?: unknown };\n data?: { data?: unknown };\n query?: { isLoading?: boolean; error?: unknown };\n isLoading?: boolean;\n error?: unknown;\n };\n\n const payload = listResult.result?.data ?? listResult.data?.data;\n\n return {\n entries: toEntries(payload),\n isLoading: Boolean(listResult.query?.isLoading ?? listResult.isLoading),\n error: toErrorMessage(listResult.query?.error ?? listResult.error),\n };\n}\n\nexport default useAuditTimeline;\n","import { MStack, XStack, MText } from \"@framework-m/ui\";\n\nimport type { AuditTimelineDiffValue } from \"../../hooks/useAuditTimeline\";\n\nexport interface DiffViewerProps {\n diff: Record<string, AuditTimelineDiffValue> | null;\n}\n\nfunction toDisplay(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value);\n } catch {\n return \"[object]\";\n }\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return `${value}`;\n }\n\n if (typeof value === \"symbol\") {\n return value.description ? `Symbol(${value.description})` : \"Symbol\";\n }\n\n if (typeof value === \"function\") {\n return \"[function]\";\n }\n\n return \"[unknown]\";\n}\n\nexport function DiffViewer({ diff }: Readonly<DiffViewerProps>) {\n const entries = diff ? Object.entries(diff) : [];\n if (entries.length === 0) {\n return null;\n }\n\n return (\n <MStack marginTop=\"$xs\" gap=\"$xs\" width=\"100%\">\n {/* Header */}\n <XStack borderBottomWidth={1} borderBottomColor=\"$borderColor\" paddingVertical=\"$xs\">\n <MText fontWeight=\"600\" size=\"$xs\" width=\"30%\">\n Field\n </MText>\n <MText fontWeight=\"600\" size=\"$xs\" width=\"35%\">\n Old\n </MText>\n <MText fontWeight=\"600\" size=\"$xs\" width=\"35%\">\n New\n </MText>\n </XStack>\n\n {/* Body */}\n {entries.map(([field, values]) => {\n const oldValue = toDisplay(values.old);\n const newValue = toDisplay(values.new);\n\n return (\n <XStack key={field} paddingVertical=\"$xs\" alignItems=\"flex-start\">\n <MText size=\"$xs\" width=\"30%\">\n {field}\n </MText>\n <MText size=\"$xs\" width=\"35%\">\n {oldValue}\n </MText>\n <MText size=\"$xs\" width=\"35%\">\n {newValue}\n </MText>\n </XStack>\n );\n })}\n </MStack>\n );\n}\n\nexport default DiffViewer;\n","import { Card, Heading, MStack, MText, XStack } from \"@framework-m/ui\";\n\nimport { useAuditTimeline } from \"../../hooks/useAuditTimeline\";\nimport { DiffViewer } from \"./DiffViewer\";\n\nexport interface AuditTimelineProps {\n doctype: string;\n id: string | undefined;\n}\n\nfunction toLabel(entry: { action: string; metadata: Record<string, unknown> | null }): string {\n if (entry.action === \"create\") return \"Document created\";\n if (entry.action === \"submit\") return \"Document submitted\";\n if (entry.action === \"amend\") {\n const reason = entry.metadata?.reason;\n if (typeof reason === \"string\" && reason.trim()) {\n return `Amended - ${reason}`;\n }\n return \"Amended\";\n }\n if (entry.action === \"update\") return \"Document updated\";\n if (entry.action === \"restore\") return \"Document restored\";\n if (entry.action === \"cancel\") return \"Document cancelled\";\n if (entry.action === \"in_place_edit\") return \"Document edited in place\";\n return entry.action;\n}\n\nexport function AuditTimeline({ doctype, id }: Readonly<AuditTimelineProps>) {\n const { entries, isLoading, error } = useAuditTimeline(doctype, id);\n\n return (\n <MStack marginTop=\"$md\" gap=\"$sm\">\n <Heading size=\"$sm\">History</Heading>\n\n {isLoading && (\n <MText role=\"status\" color=\"$colorMuted\">\n Loading history...\n </MText>\n )}\n\n {!isLoading && error && (\n <MText role=\"alert\" color=\"$error\">\n {error}\n </MText>\n )}\n\n {!isLoading && !error && entries.length === 0 && (\n <MText color=\"$colorMuted\">No history yet</MText>\n )}\n\n {!isLoading &&\n !error &&\n entries.map((entry) => (\n <Card key={entry.id} padding=\"$sm\" borderWidth={1}>\n <MStack gap=\"$xs\">\n <XStack justifyContent=\"space-between\" gap=\"$sm\" flexWrap=\"wrap\">\n <MText fontWeight=\"700\">{toLabel(entry)}</MText>\n <MText size=\"$xs\" color=\"$colorMuted\">\n {entry.timestamp}\n </MText>\n </XStack>\n <MText size=\"$xs\">{entry.user_id}</MText>\n {entry.action === \"update\" && <DiffViewer diff={entry.diff} />}\n </MStack>\n </Card>\n ))}\n </MStack>\n );\n}\n\nexport default AuditTimeline;\n","/**\n * useDocTypes Hook\n *\n * Fetches DocTypes from the backend API and converts them to Refine resources.\n * Used to dynamically populate the sidebar with available DocTypes.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useMFetch } from \"./useMFetch\";\n\n/**\n * DocType metadata from API\n */\nexport interface DocTypeMeta {\n name: string;\n module: string;\n label: string;\n is_child_table: boolean;\n is_singleton: boolean;\n api_resource: boolean;\n show_in_desk: boolean; // Whether to show in Desk UI\n metadata: Record<string, unknown>;\n}\n\n/**\n * Refine resource configuration\n */\nexport interface RefineResource {\n name: string;\n list?: string;\n create?: string;\n edit?: string;\n show?: string;\n meta?: {\n label?: string;\n canDelete?: boolean;\n is_singleton?: boolean;\n };\n}\n\n/**\n * Hook return type\n */\nexport interface UseDocTypesResult {\n /** Array of DocType metadata */\n doctypes: DocTypeMeta[];\n /** Array of Refine resources for dynamic routing */\n resources: RefineResource[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => Promise<void>;\n}\n\n/**\n * API response format\n */\ninterface DocTypesResponse {\n doctypes: DocTypeMeta[];\n count: number;\n}\n\n/**\n * Fetch DocTypes from Backend API\n *\n * Fetches all registered DocTypes from /api/meta/doctypes and converts\n * them to Refine resource format for use in the application.\n *\n * @returns Object containing doctypes, resources, loading state, and error\n *\n * @example\n * ```tsx\n * const { resources, isLoading, error } = useDocTypes();\n *\n * if (isLoading) return <Spinner />;\n *\n * return <Refine resources={resources}>...</Refine>;\n * ```\n */\nexport function mapDocTypeToResource(dt: DocTypeMeta): RefineResource {\n const isSingleton = Boolean(dt.is_singleton || dt.metadata?.is_singleton);\n const listRoute = isSingleton ? `/app/${dt.name}/edit/singleton` : `/app/${dt.name}/list`;\n\n return {\n name: dt.name,\n list: listRoute,\n create: isSingleton ? undefined : `/app/${dt.name}/new`,\n edit: `/app/${dt.name}/edit/:id`,\n show: `/app/${dt.name}/detail/:id`,\n meta: {\n label: dt.label || dt.name.replace(/([A-Z])/g, \" $1\").trim(),\n canDelete: !isSingleton,\n is_singleton: isSingleton,\n },\n };\n}\n\nexport function useDocTypes(): UseDocTypesResult {\n const [doctypes, setDocTypes] = useState<DocTypeMeta[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mfetch = useMFetch();\n\n const fetchDocTypes = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await mfetch(\"/api/meta/doctypes\");\n\n if (!response.ok) {\n throw new Error(`Failed to fetch DocTypes: ${response.statusText}`);\n }\n\n const data: DocTypesResponse = await response.json();\n setDocTypes(data.doctypes);\n } catch (err) {\n console.error(\"Error fetching DocTypes:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n fetchDocTypes();\n }, []);\n\n const resources: RefineResource[] = doctypes\n .filter((dt) => dt.show_in_desk && !dt.is_child_table && dt.api_resource)\n .map(mapDocTypeToResource);\n\n return {\n doctypes,\n resources,\n isLoading,\n error,\n refetch: fetchDocTypes,\n };\n}\n\nexport default useDocTypes;\n","/**\n * useRouteTraversal Hook\n *\n * Retrieves a custom route traversal function (e.g., \"resolveDetailRoute\").\n * Enforces a Last-In-Wins priority rule across loaded plugins.\n */\n\nimport { useContext } from \"react\";\nimport { PluginRegistryContext } from \"@framework-m/plugin-sdk\";\n\nexport function useRouteTraversal(action: string): ((...args: unknown[]) => unknown) | null {\n const registry = useContext(PluginRegistryContext);\n if (!registry) return null;\n\n const allPlugins = registry.getAllPlugins();\n\n // Traverse plugins backwards to enforce Last-In-Wins priority\n for (let i = allPlugins.length - 1; i >= 0; i--) {\n // Cast to include traversals in case the SDK hasn't been rebuilt locally yet\n const plugin = allPlugins[i] as (typeof allPlugins)[0] & {\n traversals?: Record<string, unknown>;\n };\n const traversals = plugin.traversals;\n if (traversals && typeof traversals[action] === \"function\") {\n return traversals[action] as (...args: unknown[]) => unknown;\n }\n }\n\n return null;\n}\n","import { useState, useCallback, useMemo, useEffect } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport { useOne, useCreate, useUpdate } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"./useDocTypeMeta\";\nimport { useWorkflowActions } from \"./useWorkflowActions\";\nimport { useRouteTraversal } from \"./useRouteTraversal\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Frm<T = any> {\n doc: T;\n setDoc: (data: Partial<T> | ((prev: T) => T)) => void;\n save: () => Promise<void>;\n cancel: () => void;\n isEditing: boolean;\n isSaving: boolean;\n isLocked: boolean;\n errors: string[];\n notices: string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n workflow?: any;\n refetch: () => Promise<void>;\n}\n\nexport interface UseFormControllerProps {\n doctype?: string;\n id?: string;\n}\n\nexport function useFormController({\n doctype: propDoctype,\n id: propId,\n}: UseFormControllerProps = {}) {\n const params = useParams<{ doctype: string; id: string }>();\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const id = propId ?? params.id;\n\n const { schema, isLoading: metaLoading, error: metaError } = useDocTypeMeta(doctype);\n const isEditing = !!id;\n\n const queryResult = useOne({\n resource: doctype,\n id: id ?? \"\",\n queryOptions: { enabled: isEditing },\n });\n\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n const { state: workflowState } = useWorkflowActions(doctype, id, {\n enabled: isEditing,\n });\n\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [errors, setErrors] = useState<string[]>([]);\n const [notices] = useState<string[]>([]);\n\n useEffect(() => {\n setFormData({});\n setErrors([]);\n }, [id, doctype]);\n\n const record = queryResult?.result ?? queryResult?.query?.data?.data;\n const currentDoc =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.keys(formData).length > 0 || !queryResult?.query?.isSuccess ? formData : (record as any);\n const isSaving = createMutation.mutation.isPending || updateMutation.mutation.isPending;\n const currentDocstatus = Number((currentDoc as { docstatus?: unknown }).docstatus);\n const isLocked = currentDocstatus === 1 || currentDocstatus === 2;\n\n const navigate = useNavigate();\n const resolveListRoute = useRouteTraversal(\"resolveListRoute\");\n\n const handleSave = useCallback(async () => {\n try {\n const values = currentDoc;\n const options = {\n onSuccess: () => {\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onError: (err: any) => setErrors([err.message]),\n };\n\n if (isEditing) {\n updateMutation.mutate({ resource: doctype, id: id ?? \"\", values }, options);\n } else {\n createMutation.mutate({ resource: doctype, values }, options);\n }\n } catch (err) {\n setErrors([(err as Error).message]);\n }\n }, [\n doctype,\n id,\n isEditing,\n currentDoc,\n navigate,\n resolveListRoute,\n updateMutation,\n createMutation,\n ]);\n\n const handleCancel = useCallback(() => {\n if (id === \"singleton\") {\n navigate(\"/app/dashboard\");\n return;\n }\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n }, [navigate, doctype, resolveListRoute, id]);\n\n const handleRefetch = useCallback(async () => {\n await queryResult?.query?.refetch?.();\n }, [queryResult]);\n\n const frm: Frm = useMemo(\n () => ({\n doc: currentDoc,\n setDoc: (update) => {\n if (typeof update === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setFormData((prev) => update(prev as any));\n } else {\n setFormData((prev) => ({ ...prev, ...update }));\n }\n setErrors([]);\n },\n save: handleSave,\n cancel: handleCancel,\n isEditing,\n isSaving,\n isLocked,\n errors,\n notices,\n workflow: workflowState,\n refetch: handleRefetch,\n }),\n [\n currentDoc,\n handleSave,\n handleCancel,\n isEditing,\n isSaving,\n isLocked,\n errors,\n notices,\n workflowState,\n handleRefetch,\n ]\n );\n\n return {\n doctype,\n id,\n frm,\n schema,\n metaLoading: metaLoading || (isEditing && queryResult?.query?.isLoading),\n metaError,\n docError: queryResult?.query?.error as unknown as Error,\n record,\n };\n}\n","/**\n * useInlineEdit Hook\n *\n * Hook for managing inline edit state in tables.\n * Per checklist 5.2: Inline Editing.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\n\n/**\n * Cell being edited\n */\nexport interface EditingCell {\n rowId: string;\n field: string;\n originalValue: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseInlineEditOptions {\n /** Resource/DocType name */\n resource: string;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseInlineEditReturn {\n /** Currently editing cell */\n editingCell: EditingCell | null;\n /** Start editing a cell */\n startEdit: (rowId: string, field: string, value: unknown) => void;\n /** Cancel current edit */\n cancelEdit: () => void;\n /** Save current edit */\n saveEdit: (value: unknown) => Promise<void>;\n /** Check if a cell is being edited */\n isEditing: (rowId: string, field: string) => boolean;\n /** Whether save is in progress */\n isSaving: boolean;\n /** Current error */\n error: string | null;\n}\n\n/**\n * useInlineEdit Hook\n *\n * @example\n * ```tsx\n * const { editingCell, startEdit, saveEdit, isEditing, isSaving } = useInlineEdit({\n * resource: \"Customer\",\n * onSaveSuccess: () => refetch(),\n * });\n *\n * // In table cell\n * {isEditing(row.id, \"name\") ? (\n * <input onBlur={(e) => saveEdit(e.target.value)} />\n * ) : (\n * <div onClick={() => startEdit(row.id, \"name\", row.name)}>{row.name}</div>\n * )}\n * ```\n */\nexport function useInlineEdit({\n resource,\n onSaveSuccess,\n onError,\n}: UseInlineEditOptions): UseInlineEditReturn {\n const [editingCell, setEditingCell] = useState<EditingCell | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const updateMutation = useUpdate();\n\n const startEdit = useCallback((rowId: string, field: string, value: unknown) => {\n setEditingCell({ rowId, field, originalValue: value });\n setError(null);\n }, []);\n\n const cancelEdit = useCallback(() => {\n setEditingCell(null);\n setError(null);\n }, []);\n\n const saveEdit = useCallback(\n async (value: unknown) => {\n if (!editingCell) return;\n\n // Skip if value unchanged\n if (value === editingCell.originalValue) {\n setEditingCell(null);\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n id: editingCell.rowId,\n values: { [editingCell.field]: value },\n },\n {\n onSuccess: () => {\n setEditingCell(null);\n setError(null);\n onSaveSuccess?.();\n resolve();\n },\n onError: (err) => {\n const errorMsg = err.message || \"Save failed\";\n setError(errorMsg);\n onError?.(new Error(errorMsg));\n reject(new Error(errorMsg));\n },\n }\n );\n });\n },\n [editingCell, resource, updateMutation, onSaveSuccess, onError]\n );\n\n const isEditing = useCallback(\n (rowId: string, field: string) => {\n return editingCell?.rowId === rowId && editingCell?.field === field;\n },\n [editingCell]\n );\n\n const isSaving = updateMutation.mutation.isPending;\n\n return {\n editingCell,\n startEdit,\n cancelEdit,\n saveEdit,\n isEditing,\n isSaving,\n error,\n };\n}\n","/**\n * useBulkActions Hook\n *\n * Hook for managing bulk operations on table rows.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useDeleteMany, useUpdateMany } from \"@refinedev/core\";\n\n/**\n * Row item type\n */\nexport interface BulkItem {\n id: string;\n [key: string]: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseBulkActionsOptions<T extends BulkItem = BulkItem> {\n /** Resource/DocType name */\n resource: string;\n /** All available items */\n items: T[];\n /** Callback after successful bulk action */\n onSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseBulkActionsReturn<T extends BulkItem = BulkItem> {\n /** Selected row IDs */\n selectedIds: Set<string>;\n /** Selected items */\n selectedItems: T[];\n /** Number of selected items */\n selectedCount: number;\n /** Whether all items are selected */\n isAllSelected: boolean;\n /** Whether some items are selected */\n isSomeSelected: boolean;\n /** Select a single row */\n selectRow: (id: string) => void;\n /** Deselect a single row */\n deselectRow: (id: string) => void;\n /** Toggle a single row */\n toggleRow: (id: string) => void;\n /** Select all rows */\n selectAll: () => void;\n /** Deselect all rows */\n deselectAll: () => void;\n /** Toggle all rows */\n toggleAll: () => void;\n /** Check if a row is selected */\n isSelected: (id: string) => boolean;\n /** Bulk delete selected rows */\n bulkDelete: () => Promise<void>;\n /** Bulk update selected rows */\n bulkUpdate: (values: Record<string, unknown>) => Promise<void>;\n /** Export selected rows as JSON */\n exportAsJson: () => void;\n /** Export selected rows as CSV */\n exportAsCsv: (fields: string[]) => void;\n /** Whether bulk action is in progress */\n isLoading: boolean;\n}\n\n/**\n * useBulkActions Hook\n *\n * @example\n * ```tsx\n * const {\n * selectedIds, toggleRow, toggleAll, isAllSelected,\n * bulkDelete, bulkUpdate, exportAsCsv\n * } = useBulkActions({\n * resource: \"Customer\",\n * items: data,\n * onSuccess: () => refetch(),\n * });\n * ```\n */\nexport function useBulkActions<T extends BulkItem = BulkItem>({\n resource,\n items,\n onSuccess,\n onError,\n}: UseBulkActionsOptions<T>): UseBulkActionsReturn<T> {\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const deleteMutation = useDeleteMany();\n const updateMutation = useUpdateMany();\n\n // Derived state\n const selectedItems = useMemo(\n () => items.filter((item) => selectedIds.has(item.id)),\n [items, selectedIds]\n );\n\n const selectedCount = selectedIds.size;\n const isAllSelected = items.length > 0 && selectedIds.size === items.length;\n const isSomeSelected = selectedIds.size > 0 && selectedIds.size < items.length;\n\n // Selection actions\n const selectRow = useCallback((id: string) => {\n setSelectedIds((prev) => new Set(prev).add(id));\n }, []);\n\n const deselectRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const toggleRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const selectAll = useCallback(() => {\n setSelectedIds(new Set(items.map((item) => item.id)));\n }, [items]);\n\n const deselectAll = useCallback(() => {\n setSelectedIds(new Set());\n }, []);\n\n const toggleAll = useCallback(() => {\n if (isAllSelected) {\n deselectAll();\n } else {\n selectAll();\n }\n }, [isAllSelected, selectAll, deselectAll]);\n\n const isSelected = useCallback((id: string) => selectedIds.has(id), [selectedIds]);\n\n // Bulk delete\n const bulkDelete = useCallback(async () => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n deleteMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Delete failed\"));\n reject(err);\n },\n }\n );\n });\n }, [resource, selectedIds, deleteMutation, deselectAll, onSuccess, onError]);\n\n // Bulk update\n const bulkUpdate = useCallback(\n async (values: Record<string, unknown>) => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n values,\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Update failed\"));\n reject(err);\n },\n }\n );\n });\n },\n [resource, selectedIds, updateMutation, deselectAll, onSuccess, onError]\n );\n\n // Export as JSON\n const exportAsJson = useCallback(() => {\n const data = JSON.stringify(selectedItems, null, 2);\n const blob = new Blob([data], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [resource, selectedItems]);\n\n // Export as CSV\n const exportAsCsv = useCallback(\n (fields: string[]) => {\n const header = fields.join(\",\");\n const rows = selectedItems.map((item) =>\n fields\n .map((f) => {\n const val = item[f];\n if (val === null || val === undefined) return \"\";\n const str = String(val);\n // Escape quotes and wrap in quotes if contains comma\n if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n })\n .join(\",\")\n );\n const csv = [header, ...rows].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.csv`;\n a.click();\n URL.revokeObjectURL(url);\n },\n [resource, selectedItems]\n );\n\n const isLoading = deleteMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n return {\n selectedIds,\n selectedItems,\n selectedCount,\n isAllSelected,\n isSomeSelected,\n selectRow,\n deselectRow,\n toggleRow,\n selectAll,\n deselectAll,\n toggleAll,\n isSelected,\n bulkDelete,\n bulkUpdate,\n exportAsJson,\n exportAsCsv,\n isLoading,\n };\n}\n","/**\n * useCommandPalette Hook\n *\n * Hook for managing global command palette state and keyboard shortcut.\n * Per checklist 6.5: Global Command Palette.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Hook return type\n */\nexport interface UseCommandPaletteReturn {\n /** Whether palette is open */\n isOpen: boolean;\n /** Open the palette */\n open: () => void;\n /** Close the palette */\n close: () => void;\n /** Toggle the palette */\n toggle: () => void;\n}\n\n/**\n * useCommandPalette Hook\n *\n * Listens for Ctrl+K (or Cmd+K on Mac) to toggle command palette.\n *\n * @example\n * ```tsx\n * const { isOpen, close } = useCommandPalette();\n *\n * return <CommandPalette open={isOpen} onClose={close} />;\n * ```\n */\nexport function useCommandPalette(): UseCommandPaletteReturn {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n // Listen for Ctrl+K / Cmd+K\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ctrl+K on Windows/Linux, Cmd+K on Mac\n if ((e.ctrlKey || e.metaKey) && e.key === \"k\") {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggle]);\n\n return {\n isOpen,\n open,\n close,\n toggle,\n };\n}\n","/**\n * useComponentOverride Hook\n *\n * Retrieves a custom component override for a specific DocType and View.\n * Enforces a Last-In-Wins priority rule across loaded plugins.\n */\n\nimport { ComponentType, useContext } from \"react\";\nimport { PluginRegistryContext } from \"@framework-m/plugin-sdk\";\n\nexport function useComponentOverride(\n doctype: string,\n viewName: string\n): ComponentType<Record<string, unknown>> | null {\n const registry = useContext(PluginRegistryContext);\n if (!registry) return null;\n\n const allPlugins = registry.getAllPlugins();\n\n // Normalize the doctype string to ignore case, spaces, dashes, and underscores\n // e.g., \"To Do\" == \"to-do\" == \"todo\" == \"Todo\"\n const targetDoctype = doctype.toLowerCase().replace(/[-_ ]/g, \"\");\n\n // Traverse plugins backwards to enforce Last-In-Wins priority\n for (let i = allPlugins.length - 1; i >= 0; i--) {\n const docExt = allPlugins[i].doctypes?.find(\n (d) => d.doctype.toLowerCase().replace(/[-_ ]/g, \"\") === targetDoctype\n );\n if (docExt?.components?.[viewName]) {\n return docExt.components[viewName] as ComponentType<Record<string, unknown>>;\n }\n }\n\n return null;\n}\n","/**\n * usePageOverride Hook\n *\n * Retrieves a custom component override for a specific global page (e.g., \"LoginPage\").\n * Enforces a Last-In-Wins priority rule across loaded plugins.\n */\n\nimport { ComponentType, useContext } from \"react\";\nimport { PluginRegistryContext } from \"@framework-m/plugin-sdk\";\n\nexport function usePageOverride(pageName: string): ComponentType<Record<string, unknown>> | null {\n const registry = useContext(PluginRegistryContext);\n if (!registry) return null;\n\n const allPlugins = registry.getAllPlugins();\n\n // Traverse plugins backwards to enforce Last-In-Wins priority\n for (let i = allPlugins.length - 1; i >= 0; i--) {\n const pageExt = allPlugins[i].pages?.find((p) => p.name === pageName);\n if (pageExt?.component) {\n return pageExt.component as ComponentType<Record<string, unknown>>;\n }\n }\n\n return null;\n}\n","/**\n * UIMeta endpoint mapping bounds.\n */\n\nexport function resolveMetaBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's useApiUrl often provides \"/api/v1\" or \"https://host/api/v1\".\n // Meta endpoint is served from \"/api/meta\", so strip the API prefix.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n}\n","/**\n * UIMeta — Unified UI Metadata hook for Framework M.\n *\n * Fetches and caches the UIMeta for a DocType from the backend API.\n * UIMeta is a single object that encapsulates form layout, list columns,\n * and additional view configurations (Kanban, Tree, Calendar) — replacing\n * the old FormMeta/ListMeta split.\n *\n * Defined in line with Phase 14 (ADR: Unified UIMeta Structure, Phase 14 §6.1):\n * - `form`: Layout sections and tabs for the form view.\n * - `list`: Columns, sorting, and row-level styling for the list view.\n * - `additional_views`: Kanban, Tree, Calendar configurations.\n * - Plugin adapters can extend UIMeta with custom namespaces (e.g., WMSMeta).\n *\n * @example\n * ```tsx\n * const { uiMeta, isLoading } = useUIMeta(\"SalesInvoice\");\n * if (uiMeta?.list?.columns) { ... }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { resolveMetaBaseUrl } from \"./uiMetaUtils\";\nimport { useMFetch } from \"./useMFetch\";\n\n/** A single form section with a label and ordered field names. */\nexport interface FormSection {\n label: string;\n fields: string[];\n collapsible?: boolean;\n /** Start this section collapsed (user can expand). */\n collapsed_by_default?: boolean;\n columns?: 1 | 2 | 3;\n}\n\n/** A tab containing multiple form sections. */\nexport interface FormTab {\n label: string;\n sections: FormSection[];\n}\n\n/** Form view configuration: tabs and/or flat sections. */\nexport interface FormMeta {\n tabs?: FormTab[];\n sections?: FormSection[];\n}\n\n/** A single column in the list view. */\nexport interface ListColumn {\n field: string;\n label?: string;\n width?: number | string;\n sortable?: boolean;\n visible?: boolean;\n}\n\n/** List view configuration: columns, default sort, row styling. */\nexport interface ListMeta {\n columns: ListColumn[];\n defaultSort?: { field: string; direction: \"asc\" | \"desc\" };\n /** JMESPath expression for row color (e.g. \"status == 'Overdue'\") */\n rowColorExpr?: string;\n rowColorValue?: string;\n}\n\n/** Kanban column definition. */\nexport interface KanbanConfig {\n groupByField: string;\n cardTitleField: string;\n cardSubtitleField?: string;\n swimlaneField?: string;\n}\n\n/** Tree view definition. */\nexport interface TreeConfig {\n parentField: string;\n labelField: string;\n orderField?: string;\n}\n\n/** Calendar view definition. */\nexport interface CalendarConfig {\n startField: string;\n endField?: string;\n titleField: string;\n colorField?: string;\n}\n\n/** Additional (non-standard) views registered by plugins. */\nexport interface AdditionalViews {\n kanban?: KanbanConfig;\n tree?: TreeConfig;\n calendar?: CalendarConfig;\n /** Custom plugin-registered view namespaces (e.g. WMSMeta, MobileMeta) */\n [key: string]: unknown;\n}\n\n/**\n * Unified UI Metadata structure.\n *\n * A single object that all frontend views read from, replacing FormMeta/ListMeta.\n * The `/api/meta/:doctype` endpoint returns this as `ui_meta`.\n */\nexport interface UIMeta {\n doctype: string;\n form?: FormMeta;\n list?: ListMeta;\n additional_views?: AdditionalViews;\n}\n\nexport interface UseUIMetaResult {\n uiMeta: UIMeta | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** In-memory cache to avoid duplicate network requests. */\nconst uiMetaCache = new Map<string, UIMeta>();\n\n/**\n * Hook to fetch and cache UIMeta for a given DocType.\n *\n * Reads from `/api/meta/:doctype` (Backend Meta endpoint).\n * Falls back to a minimal UIMeta on error.\n * Plugin adapters may extend the `additional_views` namespace.\n */\nexport function useUIMeta(\n doctype: string,\n baseUrl: string = \"\",\n uiContext?: string\n): UseUIMetaResult {\n const cacheKey = uiContext ? `${doctype}::${uiContext}` : doctype;\n const [uiMeta, setUiMeta] = useState<UIMeta | null>(() => uiMetaCache.get(cacheKey) ?? null);\n const [isLoading, setIsLoading] = useState(!uiMetaCache.has(cacheKey));\n const [error, setError] = useState<string | null>(null);\n const mfetch = useMFetch();\n\n const fetchMeta = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n const ctx = uiContext?.trim().toLowerCase();\n if (ctx) {\n params.set(\"ui_context\", ctx);\n }\n\n const queryString = params.toString();\n const metaBaseUrl = resolveMetaBaseUrl(baseUrl);\n const url = `${metaBaseUrl}/api/meta/${encodeURIComponent(doctype)}${queryString ? `?${queryString}` : \"\"}`;\n const response = await mfetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch meta for ${doctype}: ${response.status}`);\n }\n const data: { ui_meta?: UIMeta } = await response.json();\n const meta: UIMeta = data.ui_meta ?? { doctype };\n uiMetaCache.set(cacheKey, meta);\n setUiMeta(meta);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n // Provide minimal fallback so views don't break\n setUiMeta({ doctype });\n } finally {\n setIsLoading(false);\n }\n }, [baseUrl, cacheKey, doctype, uiContext]);\n\n useEffect(() => {\n if (!uiMetaCache.has(cacheKey)) {\n fetchMeta();\n }\n }, [cacheKey, fetchMeta]);\n\n return { uiMeta, isLoading, error, refetch: fetchMeta };\n}\n","import { useCallback, useState } from \"react\";\nimport { fetchWithCredentials } from \"../api\";\n\nexport type CorrectionType = \"amend\" | \"restore\" | \"in_place_edit\";\n\nexport interface CorrectionPayload {\n reason: string;\n version_no?: number;\n}\n\nexport interface UseCorrectionActionResult {\n execute: (\n type: CorrectionType,\n payload: CorrectionPayload\n ) => Promise<Record<string, unknown> | null>;\n isLoading: boolean;\n error: string | null;\n result: Record<string, unknown> | null;\n}\n\nfunction normalizeError(payload: unknown, fallback: string): string {\n if (payload && typeof payload === \"object\") {\n const maybeRecord = payload as Record<string, unknown>;\n const detail = maybeRecord.detail;\n const message = maybeRecord.message;\n const error = maybeRecord.error;\n\n if (typeof detail === \"string\" && detail.trim()) return detail;\n if (typeof message === \"string\" && message.trim()) return message;\n if (typeof error === \"string\" && error.trim()) return error;\n }\n\n return fallback;\n}\n\nexport function useCorrectionAction(doctype: string, id: string): UseCorrectionActionResult {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<Record<string, unknown> | null>(null);\n\n const execute = useCallback(\n async (\n type: CorrectionType,\n payload: CorrectionPayload\n ): Promise<Record<string, unknown> | null> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetchWithCredentials(\n `/api/v1/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}/${type}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n }\n );\n\n const jsonPayload = (await response.json().catch(() => null)) as unknown;\n\n if (!response.ok) {\n const fallback = response.statusText || `Correction request failed (${response.status})`;\n const resolvedError = normalizeError(jsonPayload, fallback);\n setError(resolvedError);\n setResult(null);\n return null;\n }\n\n const successPayload =\n jsonPayload && typeof jsonPayload === \"object\"\n ? (jsonPayload as Record<string, unknown>)\n : null;\n\n setResult(successPayload);\n return successPayload;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n setResult(null);\n return null;\n } finally {\n setIsLoading(false);\n }\n },\n [doctype, id]\n );\n\n return {\n execute,\n isLoading,\n error,\n result,\n };\n}\n\nexport default useCorrectionAction;\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMFetch } from \"./useMFetch\";\n\nexport interface SiblingDocTypeInfo {\n doctype: string;\n label: string;\n extends: string;\n is_metadata_overlay?: boolean;\n initial_data?: Record<string, unknown>;\n}\n\nexport interface UseSiblingDocTypesResult {\n siblings: SiblingDocTypeInfo[];\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\ninterface SiblingResponse {\n siblings?: SiblingDocTypeInfo[];\n}\n\nfunction toSiblings(payload: unknown): SiblingDocTypeInfo[] {\n if (\n payload &&\n typeof payload === \"object\" &&\n Array.isArray((payload as SiblingResponse).siblings)\n ) {\n return (payload as SiblingResponse).siblings ?? [];\n }\n\n return [];\n}\n\nexport function useSiblingDocTypes(doctype: string): UseSiblingDocTypesResult {\n const [siblings, setSiblings] = useState<SiblingDocTypeInfo[]>([]);\n const [isLoading, setIsLoading] = useState<boolean>(Boolean(doctype));\n const [error, setError] = useState<string | null>(null);\n const mfetch = useMFetch();\n\n const fetchSiblings = useCallback(async () => {\n if (!doctype) {\n setSiblings([]);\n setIsLoading(false);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await mfetch(`/api/v1/meta/${encodeURIComponent(doctype)}/siblings`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch siblings for ${doctype}: ${response.status}`);\n }\n\n const payload: unknown = await response.json();\n setSiblings(toSiblings(payload));\n } catch (err) {\n setSiblings([]);\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }, [doctype]);\n\n useEffect(() => {\n void fetchSiblings();\n }, [fetchSiblings]);\n\n return {\n siblings,\n isLoading,\n error,\n refetch: fetchSiblings,\n };\n}\n\nexport default useSiblingDocTypes;\n","/**\n * useFormKeyboard — Enter-to-next-field and Tab-in-cells navigation.\n *\n * Binds to the supplied container ref and intercepts:\n * - `Enter` inside `<input>` / `<textarea>` → moves focus to the\n * next focusable sibling field.\n * - `Tab` is left to native browser behavior inside table cells\n * (already correct by default); this hook only handles the Enter key.\n *\n * Web only — safely no-ops on React Native.\n */\n\nimport { type RefObject, useEffect } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n \"input:not([disabled]):not([type='submit']):not([type='button']),\" +\n \"select:not([disabled]),\" +\n \"textarea:not([disabled]),\" +\n \"[tabindex]:not([tabindex='-1'])\";\n\n/**\n * @param containerRef A ref to the form's root element.\n */\nexport function useFormKeyboard(containerRef: RefObject<HTMLElement | null>): void {\n useEffect(() => {\n // Guard: only bind on web\n if (typeof window === \"undefined\") return;\n\n const container = containerRef.current;\n if (!container) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== \"Enter\") return;\n\n const target = e.target as HTMLElement;\n const tagName = target.tagName.toLowerCase();\n\n // Only intercept Enter on text inputs (not textareas — Enter there is a newline)\n if (tagName !== \"input\") return;\n\n // Don't intercept if Enter is captured by something else (e.g. forms submit)\n // Only prevent for non-submit inputs\n const inputType = (target as HTMLInputElement).type;\n if (inputType === \"submit\" || inputType === \"button\") return;\n\n // Find all focusable fields in the container\n const focusables = Array.from(container!.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n\n const currentIndex = focusables.indexOf(target);\n if (currentIndex === -1) return;\n\n const next = focusables[currentIndex + 1];\n if (next) {\n e.preventDefault();\n next.focus();\n }\n }\n\n container.addEventListener(\"keydown\", handleKeyDown as EventListener);\n return () => container.removeEventListener(\"keydown\", handleKeyDown as EventListener);\n }, [containerRef]);\n}\n","import { useState, useMemo, useCallback, useRef } from \"react\";\nimport type { CrudFilters } from \"@refinedev/core\";\n\nexport type FilterOperator = \"eq\" | \"gt\" | \"lt\" | \"in\" | \"like\";\nexport type FilterValueKind = \"text\" | \"number\" | \"date\" | \"datetime\" | \"boolean\" | \"select\";\n\nexport interface FilterRow {\n id: string;\n field: string;\n operator: FilterOperator;\n value: string;\n}\n\nexport interface FilterFieldDefinition {\n label: string;\n value: string;\n type?: FilterValueKind;\n options?: Array<{ label: string; value: string }>;\n}\n\nfunction normalizeFilterValue(row: FilterRow, fieldType: FilterValueKind | undefined): unknown {\n if (row.operator === \"in\") {\n const values = row.value\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean);\n\n if (fieldType === \"number\") {\n return values.map((value) => Number(value)).filter((value) => !Number.isNaN(value));\n }\n\n if (fieldType === \"boolean\") {\n return values\n .map((value) => value.toLowerCase())\n .filter((value) => value === \"true\" || value === \"false\")\n .map((value) => value === \"true\");\n }\n\n return values;\n }\n\n if (fieldType === \"number\") {\n const parsed = Number(row.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n\n if (fieldType === \"boolean\") {\n const normalized = row.value.toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n return \"\";\n }\n\n if (row.operator === \"like\") {\n return `%${row.value}%`;\n }\n\n return row.value;\n}\n\nfunction cloneFilterRows(rows: FilterRow[]): FilterRow[] {\n return rows.map((row) => ({ ...row }));\n}\n\nfunction serializeFilterRows(rows: FilterRow[]): string {\n return JSON.stringify(\n rows.map((row) => ({\n id: row.id,\n field: row.field,\n operator: row.operator,\n value: row.value,\n }))\n );\n}\n\nexport function useListFilters(initialFilterableFields: FilterFieldDefinition[] = []) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [appliedSearchQuery, setAppliedSearchQuery] = useState(\"\");\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [appliedFilterRows, setAppliedFilterRows] = useState<FilterRow[]>([]);\n const [asOfFilter, setAsOfFilter] = useState<string | undefined>(undefined);\n const nextFilterRowId = useRef(1);\n const fieldTypeMap = useMemo(\n () =>\n initialFilterableFields.reduce<Record<string, FilterValueKind | undefined>>((acc, field) => {\n acc[field.value] = field.type;\n return acc;\n }, {}),\n [initialFilterableFields]\n );\n\n const advancedFilters = useMemo(() => {\n const filters: Array<{\n field: string;\n operator: FilterOperator;\n value: unknown;\n }> = [];\n\n for (const row of appliedFilterRows) {\n const field = row.field.trim();\n if (!field) continue;\n\n const normalizedValue = normalizeFilterValue(row, fieldTypeMap[field]);\n\n if (\n normalizedValue === \"\" ||\n (Array.isArray(normalizedValue) && normalizedValue.length === 0)\n ) {\n continue;\n }\n\n filters.push({\n field,\n operator: row.operator,\n value: normalizedValue,\n });\n }\n\n return filters;\n }, [appliedFilterRows, fieldTypeMap]);\n\n const tableFilters = useMemo<CrudFilters | undefined>(() => {\n const mergedFilters: Array<{\n field: string;\n operator: string;\n value: unknown;\n }> = [];\n const trimmedSearchQuery = appliedSearchQuery.trim();\n\n if (trimmedSearchQuery) {\n mergedFilters.push({\n field: \"q\",\n operator: \"contains\",\n value: trimmedSearchQuery,\n });\n }\n\n if (asOfFilter) {\n mergedFilters.push({ field: \"as_of\", operator: \"eq\", value: asOfFilter });\n }\n\n for (const filter of advancedFilters) {\n mergedFilters.push(filter);\n }\n\n return mergedFilters.length > 0 ? (mergedFilters as CrudFilters) : undefined;\n }, [appliedSearchQuery, asOfFilter, advancedFilters]);\n\n const hasPendingSearchChanges = searchQuery.trim() !== appliedSearchQuery.trim();\n const hasPendingFilterChanges =\n serializeFilterRows(filterRows) !== serializeFilterRows(appliedFilterRows);\n\n const addFilterRow = useCallback(() => {\n const defaultField = initialFilterableFields[0]?.value ?? \"name\";\n const rowId = String(nextFilterRowId.current);\n nextFilterRowId.current += 1;\n\n setFilterRows((currentRows) => [\n ...currentRows,\n {\n id: rowId,\n field: defaultField,\n operator: \"eq\",\n value: \"\",\n },\n ]);\n }, [initialFilterableFields]);\n\n const updateFilterRow = useCallback((id: string, patch: Partial<FilterRow>) => {\n setFilterRows((rows) => rows.map((row) => (row.id === id ? { ...row, ...patch } : row)));\n }, []);\n\n const removeFilterRow = useCallback((id: string) => {\n setFilterRows((rows) => rows.filter((row) => row.id !== id));\n }, []);\n\n const clearFilterRows = useCallback(() => {\n setFilterRows([]);\n }, []);\n\n const applySearch = useCallback(() => {\n setAppliedSearchQuery(searchQuery);\n }, [searchQuery]);\n\n const clearSearch = useCallback(() => {\n setSearchQuery(\"\");\n setAppliedSearchQuery(\"\");\n }, []);\n\n const applyFilters = useCallback(() => {\n setAppliedFilterRows(cloneFilterRows(filterRows));\n }, [filterRows]);\n\n const clearAppliedFilters = useCallback(() => {\n setFilterRows([]);\n setAppliedFilterRows([]);\n }, []);\n\n const removeAppliedFilterRow = useCallback((id: string) => {\n setFilterRows((rows) => rows.filter((row) => row.id !== id));\n setAppliedFilterRows((rows) => rows.filter((row) => row.id !== id));\n }, []);\n\n return {\n searchQuery,\n setSearchQuery,\n appliedSearchQuery,\n applySearch,\n clearSearch,\n hasPendingSearchChanges,\n filterRows,\n setFilterRows,\n appliedFilterRows,\n asOfFilter,\n setAsOfFilter,\n advancedFilters,\n tableFilters,\n hasPendingFilterChanges,\n addFilterRow,\n applyFilters,\n updateFilterRow,\n removeFilterRow,\n removeAppliedFilterRow,\n clearFilterRows,\n clearAppliedFilters,\n };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { PluginRegistry } from \"@framework-m/plugin-sdk\";\nimport type { Frm } from \"./useFormController\";\nimport { useMFetch } from \"./useMFetch\";\n\ninterface UseFormActionsProps {\n doctype: string;\n id?: string;\n frm: Frm;\n shell: {\n isMobile: boolean;\n rightSidebarOpen: boolean;\n setRightSidebarOpen: (open: boolean) => void;\n };\n apps: Array<{\n label?: string;\n app_id?: string;\n resources?: Array<{ name: string }>;\n }>;\n}\n\nexport interface SwipeEvent {\n nativeEvent: {\n touches?: TouchList | Touch[];\n changedTouches?: TouchList | Touch[];\n clientX?: number;\n };\n}\n\nexport function useFormActions({ doctype, id, frm, shell, apps }: UseFormActionsProps) {\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [printFormatName, setPrintFormatName] = useState(\"\");\n const mfetch = useMFetch();\n\n const handleTouchStart = useCallback((e: SwipeEvent) => {\n const clientX = e.nativeEvent?.touches?.[0]?.clientX ?? e.nativeEvent?.clientX;\n if (clientX !== undefined) {\n setTouchStart(clientX);\n }\n }, []);\n\n const handleTouchEnd = useCallback(\n (e: SwipeEvent) => {\n const clientX = e.nativeEvent?.changedTouches?.[0]?.clientX ?? e.nativeEvent?.clientX;\n if (touchStart === null || clientX !== undefined) {\n // distance evaluation\n const distance = touchStart! - (clientX ?? 0);\n const isLeftSwipe = distance > 50;\n const isRightSwipe = distance < -50;\n\n if (isLeftSwipe && !shell.rightSidebarOpen) {\n shell.setRightSidebarOpen(true);\n } else if (isRightSwipe && shell.rightSidebarOpen) {\n shell.setRightSidebarOpen(false);\n }\n setTouchStart(null);\n }\n },\n [touchStart, shell]\n );\n\n const openPrintPreview = useCallback(() => {\n if (!id) return;\n const params = new URLSearchParams({ format: \"html\" });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n const path = `/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n const url = PluginRegistry.getInstance().resolveApiUrl(path);\n globalThis.open(url, \"_blank\", \"noopener,noreferrer\");\n }, [doctype, id, printFormatName]);\n\n const downloadPrintPdf = useCallback(async () => {\n if (!id) return;\n const params = new URLSearchParams({\n format: \"pdf\",\n disposition: \"attachment\",\n strict_pdf: \"true\",\n });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n const url = `/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n\n try {\n const response = await mfetch(url, { credentials: \"include\" });\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as {\n error?: string;\n detail?: string;\n };\n throw new Error(\n payload.detail || payload.error || `Failed to download PDF (${response.status})`\n );\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (!contentType.includes(\"application/pdf\")) {\n throw new Error(\"PDF generation unavailable. Please ensure PDF service is running.\");\n }\n\n const blob = await response.blob();\n const downloadUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = downloadUrl;\n anchor.download = `${doctype}_${id}.pdf`;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(downloadUrl);\n } catch (err) {\n alert(err instanceof Error ? err.message : \"Failed to download PDF\");\n }\n }, [doctype, id, printFormatName, mfetch]);\n\n const isEditing = !!id;\n const isSingleton = id === \"singleton\";\n\n const docNameValue = (frm.doc as Record<string, unknown>)?.name;\n const displayName =\n typeof docNameValue === \"string\" || typeof docNameValue === \"number\"\n ? String(docNameValue)\n : (id ?? \"\");\n\n const title = useMemo(() => {\n if (isSingleton) return doctype.replaceAll(\"_\", \" \");\n return isEditing\n ? `Edit ${doctype.replaceAll(\"_\", \" \")}: ${displayName}`\n : `New ${doctype.replaceAll(\"_\", \" \")}`;\n }, [isSingleton, doctype, isEditing, displayName]);\n\n const appName = useMemo(() => {\n for (const app of apps || []) {\n if (app.resources?.some((r) => r.name === doctype)) {\n return app.label || app.app_id || \"App\";\n }\n }\n return \"App\";\n }, [apps, doctype]);\n\n const submitLabel = useMemo(() => {\n if (frm.isSaving) return \"Saving...\";\n return isEditing ? \"Save\" : \"Create\";\n }, [frm.isSaving, isEditing]);\n\n return {\n handleTouchStart,\n handleTouchEnd,\n printFormatName,\n setPrintFormatName,\n openPrintPreview,\n downloadPrintPdf,\n isEditing,\n isSingleton,\n displayName,\n title,\n appName,\n submitLabel,\n };\n}\n","import { useState, useCallback, useMemo, useEffect } from \"react\";\nimport { useNavigate, useLocation } from \"react-router\";\n\ninterface StoredListColumnPreferences {\n visibility: Record<string, boolean>;\n widths: Record<string, number>;\n}\n\nconst LIST_COLUMN_STORAGE_PREFIX = \"m_list_columns_\";\n\nexport interface UseListActionsProps {\n doctype: string;\n propView?: \"list\" | \"kanban\" | \"tree\";\n canKanban: boolean;\n canTree: boolean;\n resolveDetailRoute?: (\n doctype: string,\n id: string | number | bigint,\n row: Record<string, unknown>\n ) => string | undefined;\n}\n\nexport function useListActions({\n doctype,\n propView,\n canKanban,\n canTree,\n resolveDetailRoute,\n}: UseListActionsProps) {\n const navigate = useNavigate();\n const location = useLocation();\n\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n const [isColumnsMenuOpen, setIsColumnsMenuOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n const readPreferences = useCallback((): StoredListColumnPreferences => {\n if (!doctype || typeof localStorage === \"undefined\") {\n return { visibility: {}, widths: {} };\n }\n try {\n const raw = localStorage.getItem(`${LIST_COLUMN_STORAGE_PREFIX}${doctype}`);\n if (!raw) return { visibility: {}, widths: {} };\n const parsed = JSON.parse(raw);\n return {\n visibility: parsed.visibility || {},\n widths: parsed.widths || {},\n };\n } catch {\n return { visibility: {}, widths: {} };\n }\n }, [doctype]);\n\n const [columnPreferences, setColumnPreferences] = useState<StoredListColumnPreferences>(() =>\n readPreferences()\n );\n\n useEffect(() => {\n setColumnPreferences(readPreferences());\n }, [doctype, readPreferences]);\n\n useEffect(() => {\n if (!doctype || typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(\n `${LIST_COLUMN_STORAGE_PREFIX}${doctype}`,\n JSON.stringify(columnPreferences)\n );\n } catch {\n // Ignore storage issues\n }\n }, [doctype, columnPreferences]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setIsMobile(window.innerWidth < 1024);\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const toggleColumnVisibility = useCallback((field: string) => {\n setColumnPreferences((previous) => {\n const currentVisibility = previous.visibility[field] !== false;\n return {\n ...previous,\n visibility: {\n ...previous.visibility,\n [field]: !currentVisibility,\n },\n };\n });\n }, []);\n\n const updateColumnWidth = useCallback((field: string, widthInput: string) => {\n const parsedWidth = Number.parseInt(widthInput, 10);\n setColumnPreferences((previous) => {\n const nextWidths = { ...previous.widths };\n if (Number.isFinite(parsedWidth) && parsedWidth > 0) {\n nextWidths[field] = parsedWidth;\n } else {\n delete nextWidths[field];\n }\n return {\n ...previous,\n widths: nextWidths,\n };\n });\n }, []);\n\n const pathView = useMemo(() => {\n if (location.pathname.endsWith(\"/kanban\")) return \"kanban\";\n if (location.pathname.endsWith(\"/tree\")) return \"tree\";\n if (location.pathname.endsWith(\"/list\")) return \"list\";\n return undefined;\n }, [location.pathname]);\n\n const activeView = useMemo(() => {\n const requested = propView ?? pathView ?? \"list\";\n if (requested === \"kanban\" && !canKanban) return \"list\";\n if (requested === \"tree\" && !canTree) return \"list\";\n return requested as \"list\" | \"kanban\" | \"tree\";\n }, [propView, pathView, canKanban, canTree]);\n\n const setActiveView = useCallback(\n (view: \"list\" | \"kanban\" | \"tree\") => {\n navigate(`/app/${doctype}/${view}`);\n },\n [navigate, doctype]\n );\n\n const handleRowClick = useCallback(\n (row: Record<string, unknown>) => {\n const id = row.id ?? row.name;\n if (typeof id === \"string\" || typeof id === \"number\" || typeof id === \"bigint\") {\n if (resolveDetailRoute) {\n const customPath = resolveDetailRoute(doctype, id, row);\n if (typeof customPath === \"string\") {\n navigate(customPath);\n return;\n }\n }\n navigate(`/app/${doctype}/detail/${id}`);\n }\n },\n [navigate, doctype, resolveDetailRoute]\n );\n\n return {\n isDeleteConfirmOpen,\n setIsDeleteConfirmOpen,\n isColumnsMenuOpen,\n setIsColumnsMenuOpen,\n isMobile,\n columnPreferences,\n toggleColumnVisibility,\n updateColumnWidth,\n activeView,\n setActiveView,\n handleRowClick,\n };\n}\n","import { Button, Input, MText, XStack } from \"@framework-m/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useDocTypeMeta } from \"../../hooks\";\n\nconst TIME_TRAVEL_UNAVAILABLE_MESSAGE = \"Time travel not available for this DocType\";\n\nfunction normalizeAsOfInput(value: string): string | undefined {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n const match = trimmed.match(/^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?$/);\n\n if (!match) {\n return undefined;\n }\n\n const [, date, hours, minutes, seconds] = match;\n return `${date}T${hours}:${minutes}:${seconds ?? \"00\"}Z`;\n}\n\nfunction toInputValue(asOf?: string): string {\n if (!asOf) return \"\";\n\n const match = asOf.match(/^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})/);\n return match ? match[1] : \"\";\n}\n\nfunction isVersioningEnabled(meta: unknown): boolean {\n if (!meta || typeof meta !== \"object\") return false;\n\n const metadata = (meta as { metadata?: unknown }).metadata;\n if (metadata && typeof metadata === \"object\") {\n const versioningEnabled = (metadata as { versioning_enabled?: unknown }).versioning_enabled;\n if (typeof versioningEnabled === \"boolean\") {\n return versioningEnabled;\n }\n }\n\n const topLevelVersioningEnabled = (meta as { versioning_enabled?: unknown }).versioning_enabled;\n if (typeof topLevelVersioningEnabled === \"boolean\") {\n return topLevelVersioningEnabled;\n }\n\n return false;\n}\n\nexport interface AsOfDatePickerProps {\n doctype?: string;\n asOf?: string;\n onAsOfChange?: (value?: string) => void;\n onError?: (message: string | null) => void;\n}\n\nexport function AsOfDatePicker({\n doctype,\n asOf,\n onAsOfChange,\n onError,\n}: Readonly<AsOfDatePickerProps>) {\n const { meta } = useDocTypeMeta(doctype ?? \"\");\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n\n const versioningEnabled = useMemo(() => isVersioningEnabled(meta), [meta]);\n\n useEffect(() => {\n setInputValue(toInputValue(asOf));\n }, [asOf]);\n\n if (!doctype) {\n return null;\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n setInputValue(nextValue);\n\n if (!nextValue.trim()) {\n onAsOfChange?.(undefined);\n onError?.(null);\n return;\n }\n\n if (!versioningEnabled) {\n onError?.(TIME_TRAVEL_UNAVAILABLE_MESSAGE);\n return;\n }\n\n const normalized = normalizeAsOfInput(nextValue);\n if (!normalized) {\n return;\n }\n\n onError?.(null);\n onAsOfChange?.(normalized);\n };\n\n return (\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setIsOpen((prev) => !prev)}>\n View as of date\n </Button>\n\n {isOpen && (\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Input\n aria-label=\"As of date\"\n type=\"datetime-local\"\n value={inputValue}\n onChange={handleChange}\n size=\"sm\"\n />\n {!versioningEnabled && (\n <MText color=\"$error\" role=\"alert\">\n {TIME_TRAVEL_UNAVAILABLE_MESSAGE}\n </MText>\n )}\n </XStack>\n )}\n </XStack>\n );\n}\n","import React from \"react\";\nimport { Skeleton, XStack, YStack } from \"@framework-m/ui\";\n\nexport interface ShellSkeletonProps {\n // Add props here if needed in the future\n}\n\n/**\n * PageSkeleton\n *\n * Internal page shimmer (Header + Body).\n * Use this for internal route transitions to avoid 'double sidebar' artifacts.\n */\nexport const PageSkeleton: React.FC = () => (\n <XStack flex={1} backgroundColor=\"$background\">\n <YStack flex={1} padding=\"$lg\" overflow=\"hidden\">\n {/* Page Title placeholder */}\n <YStack marginBottom={24}>\n <Skeleton variant=\"heading\" width=\"30%\" height={32} />\n </YStack>\n\n {/* Large Dashboard-like tiles or Form sections */}\n <XStack flexWrap=\"wrap\" gap=\"$lg\">\n {[\"section-a\", \"section-b\", \"section-c\"].map((sectionKey) => (\n <YStack\n key={sectionKey}\n height={200}\n minWidth={300}\n flex={1}\n backgroundColor=\"$background\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$lg\"\n padding=\"$lg\"\n >\n <YStack marginBottom={16}>\n <Skeleton variant=\"heading\" width=\"40%\" />\n </YStack>\n <Skeleton variant=\"text\" count={3} />\n </YStack>\n ))}\n </XStack>\n </YStack>\n </XStack>\n);\n\n/**\n * TableSkeleton\n *\n * Shimmering list view placeholder.\n */\nexport const TableSkeleton: React.FC = () => (\n <YStack padding=\"$lg\" gap=\"$md\" backgroundColor=\"$background\">\n <XStack justifyContent=\"space-between\" marginBottom=\"$lg\">\n <Skeleton variant=\"heading\" width=\"20%\" />\n <Skeleton variant=\"button\" />\n </XStack>\n <YStack gap=\"$sm\">\n {[\n \"row-1\",\n \"row-2\",\n \"row-3\",\n \"row-4\",\n \"row-5\",\n \"row-6\",\n \"row-7\",\n \"row-8\",\n \"row-9\",\n \"row-10\",\n ].map((rowKey) => (\n <XStack\n key={rowKey}\n gap=\"$md\"\n padding=\"$sm\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n >\n <Skeleton variant=\"text\" width=\"5%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"20%\" />\n </XStack>\n ))}\n </YStack>\n </YStack>\n);\n\n/**\n * ShellSkeleton\n *\n * Full app layout (Rail + Drawer + Content).\n * Used for the very first bootstrap phase.\n */\nexport const ShellSkeleton: React.FC = () => {\n return (\n <XStack\n className=\"skeleton-layout\"\n height=\"100vh\"\n width=\"100%\"\n overflow=\"hidden\"\n backgroundColor=\"$background\"\n >\n {/* Primary Rail Skeleton */}\n <YStack\n width={64}\n backgroundColor=\"$backgroundSecondary\"\n paddingBottom=\"$lg\"\n gap=\"$md\"\n alignItems=\"center\"\n paddingTop=\"$lg\"\n borderRightWidth={1}\n borderColor=\"$borderColor\"\n >\n <Skeleton variant=\"avatar\" width={32} height={32} opacity={0.5} />\n <YStack gap=\"$lg\" marginTop=\"$xl\" opacity={0.2}>\n {[1, 2, 3, 4].map((idx) => (\n <Skeleton key={idx} variant=\"avatar\" width={32} height={32} />\n ))}\n </YStack>\n </YStack>\n\n {/* Contextual Drawer Skeleton */}\n <YStack\n width={240}\n backgroundColor=\"$background\"\n padding=\"$md\"\n gap=\"$lg\"\n display=\"none\"\n $gtSm={{ display: \"flex\" }}\n borderRightWidth={1}\n borderColor=\"$borderColor\"\n >\n <YStack opacity={0.1} padding=\"$sm\">\n <Skeleton variant=\"heading\" width=\"60%\" height={24} />\n </YStack>\n <YStack gap=\"$md\" opacity={0.1}>\n {[1, 2, 3, 4, 5, 6].map((idx) => (\n <XStack key={idx} alignItems=\"center\" gap=\"$sm\" paddingLeft=\"$sm\">\n <Skeleton variant=\"text\" width=\"70%\" height={16} />\n </XStack>\n ))}\n </YStack>\n </YStack>\n\n <YStack flex={1} minWidth={0} overflow=\"hidden\">\n {/* Navbar Skeleton (Minimal or none in the new layout) */}\n <XStack\n height={56}\n alignItems=\"center\"\n paddingHorizontal=\"$lg\"\n backgroundColor=\"$background\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n gap=\"$md\"\n display=\"none\" // Often hidden in Rail/Drawer model unless needed\n >\n <Skeleton variant=\"text\" width=\"40%\" height={24} />\n </XStack>\n\n {/* Page Area */}\n <PageSkeleton />\n </YStack>\n </XStack>\n );\n};\n","/**\n * View Registry\n *\n * Registry for custom views (Kanban, Calendar, Gantt).\n * Per checklist 5.1: Register custom views in DocType Config.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ViewType, ViewProps, ViewRegistration } from \"./types\";\n\n// Registry of view components\nconst viewRegistry = new Map<ViewType, ViewRegistration>();\n\n// DocType-specific view configs (which views are enabled per doctype)\nconst doctypeViews = new Map<string, ViewType[]>();\n\n/**\n * Register a view type\n */\nexport function registerView(registration: ViewRegistration): void {\n viewRegistry.set(registration.type, registration);\n}\n\n/**\n * Get a view component by type\n */\nexport function getViewComponent(type: ViewType): ComponentType<ViewProps> | undefined {\n return viewRegistry.get(type)?.component;\n}\n\n/**\n * Get all registered views\n */\nexport function getRegisteredViews(): ViewRegistration[] {\n return Array.from(viewRegistry.values());\n}\n\n/**\n * Get view registration by type\n */\nexport function getViewRegistration(type: ViewType): ViewRegistration | undefined {\n return viewRegistry.get(type);\n}\n\n/**\n * Set available views for a DocType\n */\nexport function setDocTypeViews(doctype: string, views: ViewType[]): void {\n doctypeViews.set(doctype, views);\n}\n\n/**\n * Get available views for a DocType\n * Returns default ['list'] if not configured\n */\nexport function getDocTypeViews(doctype: string): ViewType[] {\n return doctypeViews.get(doctype) ?? [\"list\"];\n}\n\n/**\n * Check if a view type is available for a DocType\n */\nexport function isViewAvailable(doctype: string, viewType: ViewType): boolean {\n const views = getDocTypeViews(doctype);\n return views.includes(viewType);\n}\n","import React, { useState, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\nimport { YStack, XStack, Button, Heading, MText, Input, Card, Select } from \"@framework-m/ui\";\n\nexport interface QuickEditColumn {\n id: string;\n title: string;\n}\n\nexport interface QuickEditItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/** Quick Edit modal — inline edit of standard resource properties. */\nexport function QuickEditModal({\n item,\n resource,\n titleField,\n descField,\n groupField,\n columns,\n onClose,\n onSaved,\n}: {\n item: QuickEditItem;\n resource: string;\n titleField: string;\n descField?: string;\n groupField: string;\n columns: QuickEditColumn[];\n onClose: () => void;\n onSaved: () => void;\n}) {\n const [title, setTitle] = useState(String(item[titleField] ?? item.name));\n const [desc, setDesc] = useState(descField ? String(item[descField] ?? \"\") : \"\");\n const [status, setStatus] = useState(String(item[groupField] ?? columns[0]?.id ?? \"\"));\n const [saving, setSaving] = useState(false);\n\n const { mutate: updateItem } = useUpdate();\n\n const handleSave = useCallback(() => {\n setSaving(true);\n const values: Record<string, unknown> = {\n [titleField]: title,\n [groupField]: status,\n };\n if (descField) values[descField] = desc;\n\n updateItem(\n { resource, id: item.id, values },\n {\n onSuccess: () => {\n setSaving(false);\n onSaved();\n onClose();\n },\n onError: () => setSaving(false),\n }\n );\n }, [\n title,\n desc,\n status,\n titleField,\n descField,\n groupField,\n resource,\n item.id,\n updateItem,\n onSaved,\n onClose,\n ]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose]\n );\n\n return (\n <YStack\n role=\"dialog\"\n aria-modal={true}\n aria-label={`Edit ${String(item[titleField] ?? item.name)}`}\n position=\"fixed\"\n inset={0}\n zIndex={1000}\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"rgba(0,0,0,0.45)\"\n onClick={onClose}\n onKeyDown={handleKeyDown}\n >\n <Card\n onClick={(e) => e.stopPropagation()}\n backgroundColor=\"$background\"\n padding=\"$lg\"\n width={420}\n maxWidth=\"90vw\"\n elevated\n >\n <XStack justifyContent=\"space-between\" alignItems=\"center\" marginBottom=\"$md\">\n <Heading size=\"$sm\">Quick Edit</Heading>\n <Button size=\"sm\" variant=\"ghost\" onPress={onClose}>\n ✕\n </Button>\n </XStack>\n\n {/* Title field */}\n <MText fontSize=\"$xs\" fontWeight=\"500\" color=\"$colorMuted\" marginBottom=\"$xs\">\n {titleField}\n </MText>\n <Input value={title} onChangeText={setTitle} marginBottom=\"$sm\" autoFocus />\n\n {/* Status/Group field */}\n <MText fontSize=\"$xs\" fontWeight=\"500\" color=\"$colorMuted\" marginBottom=\"$xs\">\n {groupField}\n </MText>\n <Select\n value={status}\n onValueChange={setStatus}\n options={columns.map((col) => ({ value: col.id, label: col.title }))}\n marginBottom=\"$sm\"\n />\n\n {/* Description field (if configured) */}\n {descField && (\n <>\n <MText fontSize=\"$xs\" fontWeight=\"500\" color=\"$colorMuted\" marginBottom=\"$xs\">\n {descField}\n </MText>\n <Input value={desc} onChangeText={setDesc} multiline rows={3} marginBottom=\"$md\" />\n </>\n )}\n\n <XStack gap=\"$sm\" justifyContent=\"flex-end\" marginTop=\"$sm\">\n <Button variant=\"ghost\" onPress={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" onPress={handleSave} disabled={saving}>\n {saving ? \"\" : \"Save\"}\n </Button>\n </XStack>\n </Card>\n </YStack>\n );\n}\n","import type { KanbanConfig, KanbanColumn, TreeConfig } from \"./types\";\n\n/**\n * Resolves the field to group Kanban columns by.\n */\nexport function resolveKanbanGroupField(config?: KanbanConfig): string {\n return config?.groupField ?? \"status\";\n}\n\n/**\n * Resolves the card title field for Kanban items.\n */\nexport function resolveKanbanTitleField(config?: KanbanConfig): string {\n return config?.titleField ?? \"name\";\n}\n\n/**\n * Resolves the card description field for Kanban items.\n */\nexport function resolveKanbanDescriptionField(config?: KanbanConfig): string | undefined {\n return config?.descriptionField;\n}\n\n/**\n * Discovers or applies Kanban column metrics.\n */\nexport function resolveKanbanColumns(\n config: KanbanConfig | undefined,\n items: Record<string, unknown>[],\n groupField: string\n): KanbanColumn[] {\n if (config?.columns && config.columns.length > 0) {\n return config.columns;\n }\n\n const seen = new Set<string>();\n const discovered: KanbanColumn[] = [];\n const COLUMN_COLORS = [\"#e0e0e0\", \"#faad14\", \"#52c41a\", \"#ff4d4f\", \"#1890ff\", \"#722ed1\"];\n\n for (const item of items) {\n const val = String(item[groupField] ?? \"\");\n if (val && !seen.has(val)) {\n seen.add(val);\n discovered.push({\n id: val,\n title: val.charAt(0).toUpperCase() + val.slice(1).replace(/_/g, \" \"),\n color: COLUMN_COLORS[discovered.length % COLUMN_COLORS.length],\n });\n }\n }\n\n return discovered.length > 0\n ? discovered\n : [\n { id: \"draft\", title: \"Draft\", color: \"#e0e0e0\" },\n { id: \"pending\", title: \"Pending\", color: \"#faad14\" },\n { id: \"approved\", title: \"Approved\", color: \"#52c41a\" },\n { id: \"rejected\", title: \"Rejected\", color: \"#ff4d4f\" },\n ];\n}\n\n/**\n * Resolves the backend field that links to parent node ID for Tree views.\n */\nexport function resolveTreeParentField(config?: TreeConfig): string {\n return config?.parentField ?? \"parent\";\n}\n\n/**\n * Resolves the field used as the display label for Tree views.\n */\nexport function resolveTreeLabelField(config?: TreeConfig): string {\n return config?.labelField ?? \"name\";\n}\n","/**\n * KanbanView — Enhanced Kanban board for state-based DocTypes.\n *\n * Improvements over the basic version:\n * - **Quick Edit modal**: Click a card to open inline edit (title + description)\n * - **Dynamic column discovery**: Auto-generates columns from actual data values\n * when no columns are configured in KanbanConfig\n * - **Grouping by any Select/Link field**: `groupField` is fully configurable\n * - Full keyboard accessibility and CSS-variable theming\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { QuickEditModal } from \"../components/feedback/QuickEditModal\";\nimport { useList, useUpdate } from \"@refinedev/core\";\nimport type { ViewProps, KanbanConfig } from \"./types\";\nimport { YStack, XStack, MText, Card } from \"@framework-m/ui\";\nimport { useComponentOverride } from \"../hooks\";\nimport {\n resolveKanbanGroupField,\n resolveKanbanTitleField,\n resolveKanbanDescriptionField,\n resolveKanbanColumns,\n} from \"./utils\";\n\nexport interface KanbanViewProps extends ViewProps {\n config: KanbanConfig;\n}\n\n/** Dragged item state */\ninterface DragState {\n item: KanbanItem;\n sourceColumn: string;\n}\n\ninterface KanbanItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * KanbanView — Full-featured Kanban board.\n *\n * Features:\n * - Drag cards between columns to update the group field\n * - Click a card to Quick Edit (title, description, status)\n * - Auto-discover columns from live data if none configured\n * - Group by any Select/Link field via `config.groupField`\n */\nexport function KanbanView(props: KanbanViewProps) {\n const CustomComponent = useComponentOverride(props.resource, \"KanbanView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardKanbanView {...props} />;\n}\n\nfunction StandardKanbanView({ resource, config }: KanbanViewProps) {\n const groupField = resolveKanbanGroupField(config);\n const titleField = resolveKanbanTitleField(config);\n const descField = resolveKanbanDescriptionField(config);\n\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const [editingItem, setEditingItem] = useState<KanbanItem | null>(null);\n\n // Fetch all items (up to 200 for Kanban)\n const { result, query } = useList<KanbanItem>({\n resource,\n pagination: { pageSize: 200 },\n });\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n\n const { mutate: updateItem } = useUpdate();\n\n // Auto-discover columns from data if none configured\n const columns = useMemo(\n () => resolveKanbanColumns(config, items as any[], groupField),\n [config, items, groupField]\n );\n\n // Group items by column\n const groupedItems = useMemo(() => {\n const groups: Record<string, KanbanItem[]> = {};\n for (const col of columns) groups[col.id] = [];\n\n for (const item of items) {\n const key = String(item[groupField] ?? \"\");\n if (key in groups) {\n groups[key].push(item);\n } else {\n // Fallback: first column\n const first = columns[0]?.id;\n if (first) groups[first]?.push(item);\n }\n }\n return groups;\n }, [items, columns, groupField]);\n\n const handleDrop = useCallback(\n (targetColumnId: string) => {\n if (!dragState || dragState.sourceColumn === targetColumnId) {\n setDragState(null);\n setDragOverColumn(null);\n return;\n }\n updateItem(\n {\n resource,\n id: dragState.item.id,\n values: { [groupField]: targetColumnId },\n },\n {\n onSuccess: () => {\n void query?.refetch?.();\n },\n }\n );\n setDragState(null);\n setDragOverColumn(null);\n },\n [dragState, resource, groupField, updateItem, query]\n );\n\n if (isLoading) {\n return (\n <YStack padding=\"$xl\" alignItems=\"center\">\n <MText color=\"$colorMuted\">Loading Kanban...</MText>\n <XStack gap=\"$md\" padding=\"$md\">\n {[1, 2, 3].map((i) => (\n <YStack\n key={i}\n width={280}\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$lg\"\n padding=\"$md\"\n >\n {[1, 2].map((j) => (\n <YStack\n key={j}\n height={72}\n marginBottom=\"$sm\"\n borderRadius=\"$md\"\n backgroundColor=\"rgba(0,0,0,0.05)\"\n />\n ))}\n </YStack>\n ))}\n </XStack>\n </YStack>\n );\n }\n\n return (\n <>\n {editingItem && (\n <QuickEditModal\n item={editingItem}\n resource={resource}\n titleField={titleField}\n descField={descField}\n groupField={groupField}\n columns={columns}\n onClose={() => setEditingItem(null)}\n onSaved={() => {\n void query?.refetch?.();\n }}\n />\n )}\n\n <XStack\n role=\"region\"\n aria-label=\"Kanban board\"\n gap=\"$md\"\n padding=\"$md\"\n overflow=\"scroll\"\n minHeight={400}\n alignItems=\"flex-start\"\n >\n {columns.map((column) => {\n const isOver = dragOverColumn === column.id;\n return (\n <YStack\n key={column.id}\n role=\"group\"\n aria-label={`${column.title} column`}\n {...({\n onDragOver: (e: any) => {\n e.preventDefault();\n setDragOverColumn(column.id);\n },\n onDragLeave: () => setDragOverColumn(null),\n onDrop: () => handleDrop(column.id),\n } as any)}\n width={280}\n flexShrink={0}\n backgroundColor={isOver ? \"$borderColorMuted\" : \"$backgroundSecondary\"}\n borderRadius=\"$lg\"\n borderWidth={2}\n borderColor={isOver ? \"$primary\" : \"transparent\"}\n >\n {/* Column Header */}\n <XStack\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n borderBottomWidth={3}\n borderBottomColor={column.color ?? \"$primary\"}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <MText fontWeight=\"600\">{column.title}</MText>\n <YStack\n backgroundColor=\"rgba(0,0,0,0.05)\"\n borderRadius={100}\n paddingHorizontal=\"$sm\"\n paddingVertical={2}\n >\n <MText fontSize={10} fontWeight=\"500\" color=\"$colorMuted\">\n {groupedItems[column.id]?.length ?? 0}\n </MText>\n </YStack>\n </XStack>\n\n {/* Cards */}\n <YStack flex={1} padding=\"$sm\" overflow=\"scroll\" gap=\"$sm\" minHeight={80}>\n {groupedItems[column.id]?.map((item) => {\n const isDragging = dragState?.item.id === item.id;\n return (\n <Card\n key={item.id}\n elevated={!isDragging}\n role=\"button\"\n tabIndex={0}\n aria-label={`${String(item[titleField] ?? item.name)} — drag to reorder, press Enter to edit`}\n {...({\n draggable: true,\n onDragStart: () => setDragState({ item, sourceColumn: column.id }),\n onDragEnd: () => setDragState(null),\n } as any)}\n onPress={() => setEditingItem(item)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setEditingItem(item);\n }\n }}\n padding=\"$md\"\n cursor=\"grab\"\n opacity={isDragging ? 0.4 : 1}\n scale={isDragging ? 0.98 : 1}\n animation=\"fast\"\n >\n <MText fontWeight=\"500\" fontSize=\"$sm\" marginBottom={descField ? \"$xs\" : 0}>\n {String(item[titleField] ?? item.name)}\n </MText>\n {descField && item[descField] !== undefined && item[descField] !== null && (\n <MText fontSize=\"$xs\" color=\"$colorMuted\" lineHeight={1.4}>\n {String(item[descField]).slice(0, 80)}\n {String(item[descField]).length > 80 ? \"…\" : \"\"}\n </MText>\n )}\n </Card>\n );\n })}\n\n {/* Empty column placeholder */}\n {groupedItems[column.id]?.length === 0 && (\n <YStack\n padding=\"$lg\"\n alignItems=\"center\"\n borderWidth={2}\n borderStyle=\"dashed\"\n borderColor=\"$borderColor\"\n borderRadius=\"$md\"\n >\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Drop here\n </MText>\n </YStack>\n )}\n </YStack>\n </YStack>\n );\n })}\n </XStack>\n </>\n );\n}\n\nexport default KanbanView;\n","/**\n * Calendar View Component\n *\n * Calendar view for date-based DocTypes.\n * Per checklist 5.1: Calendar view.\n */\n\nimport { useState, useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, CalendarConfig } from \"./types\";\nimport { YStack, XStack, Button, Heading, MText } from \"@framework-m/ui\";\nimport { useComponentOverride, useRouteTraversal } from \"../hooks\";\n\n/**\n * Calendar view props\n */\nexport interface CalendarViewProps extends ViewProps {\n /** Calendar configuration */\n config: CalendarConfig;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Get days in month\n */\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = [];\n const date = new Date(year, month, 1);\n\n while (date.getMonth() === month) {\n days.push(new Date(date));\n date.setDate(date.getDate() + 1);\n }\n\n return days;\n}\n\n/**\n * CalendarView Component\n */\nexport function CalendarView(props: CalendarViewProps) {\n const CustomComponent = useComponentOverride(props.resource, \"CalendarView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardCalendarView {...props} />;\n}\n\nfunction StandardCalendarView({ resource, config }: CalendarViewProps) {\n const startField = config.startField;\n const titleField = config.titleField;\n const go = useGo();\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\");\n\n // Current month state\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n\n // Fetch events for current month\n const startOfMonth = new Date(year, month, 1).toISOString();\n const endOfMonth = new Date(year, month + 1, 0).toISOString();\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n { field: startField, operator: \"gte\", value: startOfMonth },\n { field: startField, operator: \"lte\", value: endOfMonth },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Get days in current month\n const days = useMemo(() => getDaysInMonth(year, month), [year, month]);\n\n // Group events by day\n const eventsByDay = useMemo(() => {\n const groups: Record<string, CalendarEvent[]> = {};\n\n if (data?.data) {\n for (const event of data.data) {\n const dateStr = String(event[startField] ?? \"\").split(\"T\")[0];\n if (dateStr) {\n if (!groups[dateStr]) groups[dateStr] = [];\n groups[dateStr].push(event);\n }\n }\n }\n\n return groups;\n }, [data, startField]);\n\n // Navigation\n const prevMonth = () => setCurrentDate(new Date(year, month - 1));\n const nextMonth = () => setCurrentDate(new Date(year, month + 1));\n const today = () => setCurrentDate(new Date());\n\n // Format month name\n const monthName = currentDate.toLocaleString(\"default\", {\n month: \"long\",\n year: \"numeric\",\n });\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n // First day of month offset\n const firstDayOffset = new Date(year, month, 1).getDay();\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return (\n <YStack padding=\"$xl\">\n <MText color=\"$colorMuted\">Loading...</MText>\n </YStack>\n );\n }\n\n return (\n <YStack padding=\"$md\" flex={1}>\n {/* Header */}\n <XStack justifyContent=\"space-between\" alignItems=\"center\" marginBottom=\"$md\">\n <XStack gap=\"$sm\">\n <Button size=\"sm\" variant=\"ghost\" onPress={prevMonth}>\n ← Prev\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onPress={today}>\n Today\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onPress={nextMonth}>\n Next →\n </Button>\n </XStack>\n <Heading size=\"$sm\" margin={0}>\n {monthName}\n </Heading>\n </XStack>\n\n {/* Calendar Grid */}\n <XStack\n flexWrap=\"wrap\"\n backgroundColor=\"$borderColorMuted\"\n borderColor=\"$borderColorMuted\"\n borderWidth={1}\n borderRadius=\"$md\"\n overflow=\"hidden\"\n gap={1}\n >\n {/* Day Headers */}\n {weekDays.map((day) => (\n <YStack\n key={day}\n width={`${100 / 7}%`}\n padding=\"$sm\"\n backgroundColor=\"$backgroundSecondary\"\n alignItems=\"center\"\n >\n <MText fontWeight=\"600\" fontSize=\"$xs\">\n {day}\n </MText>\n </YStack>\n ))}\n\n {/* Empty cells for offset */}\n {Array.from({ length: firstDayOffset }).map((_, i) => (\n <YStack\n key={`empty-${i}`}\n width={`${100 / 7}%`}\n backgroundColor=\"rgba(0,0,0,0.02)\"\n minHeight={80}\n />\n ))}\n\n {/* Days */}\n {days.map((day) => {\n const dateStr = day.toISOString().split(\"T\")[0];\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === new Date().toISOString().split(\"T\")[0];\n\n return (\n <YStack\n key={dateStr}\n width={`${100 / 7}%`}\n backgroundColor=\"$background\"\n minHeight={80}\n padding=\"$xs\"\n >\n <MText\n fontSize=\"$xs\"\n fontWeight={isToday ? \"600\" : \"400\"}\n color={isToday ? \"$primary\" : \"$text\"}\n marginBottom=\"$xs\"\n >\n {day.getDate()}\n </MText>\n {events.slice(0, 3).map((event) => (\n <YStack\n key={event.id}\n onPress={() => {\n const customPath = resolveDetailRoute\n ? resolveDetailRoute(resource, event.id, event)\n : null;\n if (typeof customPath === \"string\") {\n go({ to: customPath });\n } else {\n go({ to: `/app/${resource}/detail/${event.id}` });\n }\n }}\n paddingHorizontal=\"$xs\"\n paddingVertical={2}\n backgroundColor=\"rgba(24, 144, 255, 0.1)\"\n borderRadius=\"$sm\"\n marginBottom={2}\n cursor=\"pointer\"\n overflow=\"hidden\"\n >\n <MText fontSize={11} color=\"$primary\" numberOfLines={1}>\n {String(event[titleField] ?? event.name)}\n </MText>\n </YStack>\n ))}\n {events.length > 3 && (\n <MText fontSize={10} color=\"$colorMuted\">\n +{events.length - 3} more\n </MText>\n )}\n </YStack>\n );\n })}\n </XStack>\n </YStack>\n );\n}\n\nexport default CalendarView;\n","/**\n * Gantt View Component\n *\n * Gantt chart view for project management.\n * Per checklist 5.1: Gantt view.\n */\n\nimport { useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, GanttConfig } from \"./types\";\nimport { YStack, XStack, MText } from \"@framework-m/ui\";\nimport { useComponentOverride, useRouteTraversal } from \"../hooks\";\n\n/**\n * Gantt view props\n */\nexport interface GanttViewProps extends ViewProps {\n /** Gantt configuration */\n config: GanttConfig;\n}\n\n/**\n * Gantt task item\n */\ninterface GanttTask {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Calculate date range for Gantt\n */\nfunction getDateRange(tasks: GanttTask[], startField: string, endField: string) {\n let minDate = new Date();\n let maxDate = new Date();\n\n for (const task of tasks) {\n const start = new Date(String(task[startField] ?? \"\"));\n const end = new Date(String(task[endField] ?? \"\"));\n if (!isNaN(start.getTime()) && start < minDate) minDate = start;\n if (!isNaN(end.getTime()) && end > maxDate) maxDate = end;\n }\n\n // Add padding\n minDate.setDate(minDate.getDate() - 7);\n maxDate.setDate(maxDate.getDate() + 7);\n\n return { minDate, maxDate };\n}\n\n/**\n * Get days between two dates\n */\nfunction getDaysBetween(start: Date, end: Date): number {\n return Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n/**\n * GanttView Component\n */\nexport function GanttView(props: GanttViewProps) {\n const CustomComponent = useComponentOverride(props.resource, \"GanttView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardGanttView {...props} />;\n}\n\nfunction StandardGanttView({ resource, config }: GanttViewProps) {\n const nameField = config.nameField ?? \"name\";\n const startField = config.startField;\n const endField = config.endField;\n const progressField = config.progressField;\n const go = useGo();\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\");\n\n // Fetch tasks\n const { result: data, query } = useList<GanttTask>({\n resource,\n pagination: { pageSize: 100 },\n sorters: [{ field: startField, order: \"asc\" }],\n });\n\n // Calculate date range and tasks\n const { tasks, minDate, maxDate, totalDays } = useMemo(() => {\n const tasks = data?.data ?? [];\n if (tasks.length === 0) {\n return {\n tasks: [],\n minDate: new Date(),\n maxDate: new Date(),\n totalDays: 30,\n };\n }\n\n const { minDate, maxDate } = getDateRange(tasks, startField, endField);\n const totalDays = getDaysBetween(minDate, maxDate);\n\n return { tasks, minDate, maxDate, totalDays };\n }, [data, startField, endField]);\n\n // Generate day headers\n const dayHeaders = useMemo(() => {\n const headers: Date[] = [];\n const current = new Date(minDate);\n while (current <= maxDate) {\n headers.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return headers;\n }, [minDate, maxDate]);\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return (\n <YStack padding=\"$xl\">\n <MText color=\"$colorMuted\">Loading...</MText>\n </YStack>\n );\n }\n\n if (tasks.length === 0) {\n return (\n <YStack padding=\"$xl\">\n <MText color=\"$colorMuted\">No tasks to display</MText>\n </YStack>\n );\n }\n\n const rowHeight = 36;\n const dayWidth = 30;\n\n return (\n <XStack padding=\"$md\" overflow=\"scroll\">\n <XStack minWidth={totalDays * dayWidth + 200}>\n {/* Task Names Column */}\n <YStack width={200} flexShrink={0} borderRightWidth={1} borderColor=\"$borderColor\">\n {/* Header */}\n <YStack\n height={40}\n padding=\"$sm\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$backgroundSecondary\"\n justifyContent=\"center\"\n >\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n Task\n </MText>\n </YStack>\n {/* Task rows */}\n {tasks.map((task) => (\n <YStack\n key={task.id}\n onPress={() => {\n const customPath = resolveDetailRoute\n ? resolveDetailRoute(resource, task.id, task)\n : null;\n if (typeof customPath === \"string\") {\n go({ to: customPath });\n } else {\n go({ to: `/app/${resource}/detail/${task.id}` });\n }\n }}\n height={rowHeight}\n padding=\"$sm\"\n borderBottomWidth={1}\n borderColor=\"rgba(0,0,0,0.05)\"\n cursor=\"pointer\"\n overflow=\"hidden\"\n justifyContent=\"center\"\n >\n <MText fontSize=\"$sm\" numberOfLines={1}>\n {String(task[nameField] ?? task.name)}\n </MText>\n </YStack>\n ))}\n </YStack>\n\n {/* Gantt Chart */}\n <YStack flex={1} overflow=\"hidden\">\n {/* Day Headers */}\n <XStack height={40} backgroundColor=\"$backgroundSecondary\">\n {dayHeaders.map((day, i) => (\n <YStack\n key={i}\n width={dayWidth}\n flexShrink={0}\n borderRightWidth={1}\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize={10}>{day.getDate()}</MText>\n </YStack>\n ))}\n </XStack>\n\n {/* Task Bars */}\n {tasks.map((task) => {\n const taskStart = new Date(String(task[startField] ?? \"\"));\n const taskEnd = new Date(String(task[endField] ?? \"\"));\n\n const startOffset = getDaysBetween(minDate, taskStart);\n const duration = getDaysBetween(taskStart, taskEnd);\n const progress = progressField ? Number(task[progressField] ?? 0) : 0;\n\n return (\n <YStack\n key={task.id}\n height={rowHeight}\n position=\"relative\"\n borderBottomWidth={1}\n borderColor=\"rgba(0,0,0,0.05)\"\n >\n {/* Background grid */}\n <XStack position=\"absolute\" inset={0}>\n {dayHeaders.map((_, i) => (\n <YStack\n key={i}\n width={dayWidth}\n flexShrink={0}\n borderRightWidth={1}\n borderColor=\"rgba(0,0,0,0.05)\"\n />\n ))}\n </XStack>\n\n {/* Task bar */}\n <YStack\n position=\"absolute\"\n left={startOffset * dayWidth}\n width={Math.max(duration, 1) * dayWidth}\n top={4}\n height={rowHeight - 8}\n backgroundColor=\"rgba(24, 144, 255, 0.2)\"\n borderWidth={1}\n borderColor=\"$primary\"\n borderRadius=\"$sm\"\n overflow=\"hidden\"\n >\n {/* Progress fill */}\n {progressField && (\n <YStack\n height=\"100%\"\n width={`${progress}%`}\n backgroundColor=\"$primary\"\n opacity={0.3}\n />\n )}\n </YStack>\n </YStack>\n );\n })}\n </YStack>\n </XStack>\n </XStack>\n );\n}\n\nexport default GanttView;\n","/**\n * TreeView Utilities\n * Data mutation bounds supporting API RPC layers securely.\n */\nimport { fetchWithCredentials } from \"../api\";\n\nexport interface TreeNode {\n id: string;\n label: string;\n data: Record<string, unknown>;\n children: TreeNode[];\n}\n\nexport async function fetchTree(doctype: string): Promise<TreeNode[]> {\n const res = await fetchWithCredentials(`/api/tree/${encodeURIComponent(doctype)}`);\n if (!res.ok) throw new Error(`Failed to fetch tree: ${res.status}`);\n const json = (await res.json()) as { tree: TreeNode[] };\n return json.tree;\n}\n\nexport async function updateNode(\n doctype: string,\n nodeId: string,\n values: { parent?: string | null; label?: string }\n): Promise<void> {\n const res = await fetchWithCredentials(\n `/api/tree/${encodeURIComponent(doctype)}/${encodeURIComponent(nodeId)}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(values),\n }\n );\n if (!res.ok) throw new Error(`Update failed: ${res.status}`);\n}\n\nexport async function reparentNode(\n doctype: string,\n nodeId: string,\n newParent: string | null\n): Promise<void> {\n await updateNode(doctype, nodeId, { parent: newParent });\n}\n\nexport async function addChildNode(\n doctype: string,\n parentId: string | null,\n label: string\n): Promise<void> {\n const res = await fetchWithCredentials(`/api/tree/${encodeURIComponent(doctype)}/add-child`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ parent: parentId, label }),\n });\n if (!res.ok) throw new Error(`Add child failed: ${res.status}`);\n}\n","/**\n * TreeView — Hierarchical nested DocType view.\n *\n * Features:\n * - Renders a full nested tree from flat list data using `parent_field`\n * - Inline **Add Child** — click \"+\" at any node to add a child\n * - Inline **Rename** — double-click a label to rename in-place\n * - **Drag-and-drop reparenting** — drag nodes to a new parent\n * - Uses `/api/tree/:doctype` backend endpoints for data + mutations\n * - Keyboard accessible (arrow keys, Enter, Escape)\n */\n\nimport { useState, useCallback, useRef, useEffect, type KeyboardEvent } from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\nimport { YStack, XStack, Button, Input, MText } from \"@framework-m/ui\";\nimport { useComponentOverride } from \"../hooks\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nimport { type TreeNode, fetchTree, reparentNode, updateNode, addChildNode } from \"./treeUtils\";\n\ninterface TreeState {\n tree: TreeNode[];\n loading: boolean;\n error: string | null;\n}\n\n// ── Inline Rename Input ────────────────────────────────────────────────────\n\nfunction InlineInput({\n initialValue,\n onConfirm,\n onCancel,\n}: Readonly<{\n initialValue: string;\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}>) {\n const [value, setValue] = useState(initialValue);\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") onConfirm(value.trim() || initialValue);\n if (e.key === \"Escape\") onCancel();\n };\n\n return (\n <Input\n ref={ref}\n value={value}\n onChangeText={setValue}\n onBlur={() => onConfirm(value.trim() || initialValue)}\n onKeyDown={handleKeyDown}\n size=\"sm\"\n minWidth={160}\n aria-label=\"Rename node\"\n />\n );\n}\n\n// ── Single Tree Node ───────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n doctype,\n onRefresh,\n dragNodeId,\n onDragStart,\n onDrop,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n doctype: string;\n onRefresh: () => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetId: string | null) => void;\n}>) {\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [addingChild, setAddingChild] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n async (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n try {\n await updateNode(doctype, node.id, { label: newLabel });\n onRefresh();\n } catch {\n // Silently revert on error\n }\n },\n [doctype, node.id, node.label, onRefresh]\n );\n\n const handleAddChild = useCallback(\n async (label: string) => {\n setAddingChild(false);\n if (!label.trim()) return;\n try {\n await addChildNode(doctype, node.id, label);\n setCollapsed(false);\n onRefresh();\n } catch {\n // Silently fail — UI remains consistent\n }\n },\n [doctype, node.id, onRefresh]\n );\n\n const hasChildren = node.children.length > 0;\n let toggleGlyph = \"•\";\n if (hasChildren) {\n toggleGlyph = collapsed ? \"▶\" : \"▼\";\n }\n\n return (\n <YStack role=\"treeitem\" aria-expanded={hasChildren ? !collapsed : undefined}>\n {/* Row */}\n <XStack\n {...({\n draggable: true,\n onDragStart: (e: any) => {\n e.stopPropagation();\n onDragStart(node.id);\n },\n onDragEnd: () => setIsDropTarget(false),\n onDragOver: (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(true);\n },\n onDragLeave: () => setIsDropTarget(false),\n onDrop: (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(false);\n onDrop(node.id);\n },\n } as any)}\n alignItems=\"center\"\n gap=\"$sm\"\n paddingVertical=\"$xs\"\n paddingHorizontal=\"$sm\"\n paddingLeft={8 + depth * 20}\n borderRadius=\"$md\"\n cursor=\"grab\"\n opacity={isDragging ? 0.4 : 1}\n backgroundColor={isDropTarget ? \"rgba(139, 92, 246, 0.1)\" : \"transparent\"}\n borderWidth={1}\n borderColor={isDropTarget ? \"$primary\" : \"transparent\"}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = \"rgba(0,0,0,0.02)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isDropTarget\n ? \"rgba(139, 92, 246, 0.1)\"\n : \"transparent\";\n }}\n onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setCollapsed((c) => !c);\n }\n }}\n tabIndex={0}\n aria-label={node.label}\n >\n {/* Expand/Collapse toggle */}\n <Button\n onPress={(e) => {\n e.stopPropagation();\n setCollapsed((c) => !c);\n }}\n variant=\"ghost\"\n size=\"sm\"\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n width={24}\n height={24}\n padding={0}\n >\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n {toggleGlyph}\n </MText>\n </Button>\n\n {/* Label / Rename input */}\n {renaming ? (\n <InlineInput\n initialValue={node.label}\n onConfirm={handleRename}\n onCancel={() => setRenaming(false)}\n />\n ) : (\n <MText flex={1} fontSize=\"$sm\" lineHeight={1.4}>\n {node.label}\n </MText>\n )}\n\n {/* Action buttons — shown on hover via CSS */}\n <XStack className=\"tree-node-actions\" gap=\"$xs\">\n <Button\n onPress={(e) => {\n e.stopPropagation();\n setAddingChild(true);\n setCollapsed(false);\n }}\n variant=\"ghost\"\n size=\"sm\"\n paddingHorizontal=\"$sm\"\n >\n <MText color=\"$primary\" fontSize=\"$sm\">\n +\n </MText>\n </Button>\n <Button\n onPress={(e) => {\n e.stopPropagation();\n setRenaming(true);\n }}\n variant=\"ghost\"\n size=\"sm\"\n paddingHorizontal=\"$sm\"\n >\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n ✎\n </MText>\n </Button>\n </XStack>\n </XStack>\n\n {/* Inline Add Child input */}\n {addingChild && (\n <YStack paddingLeft={8 + (depth + 1) * 20} paddingVertical=\"$xs\">\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddChild}\n onCancel={() => setAddingChild(false)}\n />\n </YStack>\n )}\n\n {/* Children */}\n {!collapsed && hasChildren && (\n <YStack role=\"group\">\n {node.children.map((child) => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n doctype={doctype}\n onRefresh={onRefresh}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n />\n ))}\n </YStack>\n )}\n </YStack>\n );\n}\n\n// ── TreeView ───────────────────────────────────────────────────────────────\n\n/**\n * TreeView — Hierarchical tree view for DocTypes with a parent field.\n *\n * Reads from `/api/tree/:doctype` and supports:\n * - Inline Add Child (click \"+\")\n * - Inline Rename (double-click)\n * - Drag-and-drop reparenting (PATCH /api/tree/:doctype/:id)\n */\nexport function TreeView(props: Readonly<TreeViewProps>) {\n const CustomComponent = useComponentOverride(props.resource, \"TreeView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardTreeView {...props} />;\n}\n\nfunction StandardTreeView({ resource }: Readonly<TreeViewProps>) {\n const [state, setState] = useState<TreeState>({\n tree: [],\n loading: true,\n error: null,\n });\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n\n const load = useCallback(async () => {\n setState((s) => ({ ...s, loading: true, error: null }));\n try {\n const tree = await fetchTree(resource);\n setState({ tree, loading: false, error: null });\n } catch (err) {\n setState({\n tree: [],\n loading: false,\n error: err instanceof Error ? err.message : \"Failed to load tree\",\n });\n }\n }, [resource]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleDrop = useCallback(\n async (targetId: string | null) => {\n if (!dragNodeId || dragNodeId === targetId) {\n setDragNodeId(null);\n return;\n }\n try {\n await reparentNode(resource, dragNodeId, targetId);\n void load();\n } catch {\n /* silent */\n }\n setDragNodeId(null);\n },\n [dragNodeId, resource, load]\n );\n\n const handleAddRoot = useCallback(\n async (label: string) => {\n setAddingRoot(false);\n if (!label.trim()) return;\n try {\n await addChildNode(resource, null, label);\n void load();\n } catch {\n /* silent */\n }\n },\n [resource, load]\n );\n\n if (state.loading) {\n return (\n <YStack padding=\"$lg\">\n <MText color=\"$colorMuted\">Loading tree...</MText>\n </YStack>\n );\n }\n\n if (state.error) {\n return (\n <YStack padding=\"$xl\" alignItems=\"center\">\n <MText color=\"$error\">{state.error}</MText>\n <Button variant=\"ghost\" onPress={() => void load()} marginTop=\"$sm\">\n Retry\n </Button>\n </YStack>\n );\n }\n\n return (\n <YStack padding=\"$md\">\n {/* Toolbar */}\n <XStack alignItems=\"center\" gap=\"$sm\" marginBottom=\"$sm\">\n <MText fontWeight=\"600\" fontSize=\"$sm\" color=\"$colorMuted\">\n {resource}\n </MText>\n <Button onPress={() => setAddingRoot(true)} size=\"sm\">\n + Add Root Node\n </Button>\n <Button variant=\"ghost\" onPress={() => void load()} size=\"sm\" aria-label=\"Refresh tree\">\n ↺\n </Button>\n </XStack>\n\n {/* Inline add root node */}\n {addingRoot && (\n <YStack marginBottom=\"$sm\">\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddRoot}\n onCancel={() => setAddingRoot(false)}\n />\n </YStack>\n )}\n\n {/* Drop zone for reparenting to root */}\n {dragNodeId && (\n <YStack\n {...({\n onDragOver: (e: any) => e.preventDefault(),\n onDrop: () => {\n handleDrop(null).catch(() => undefined);\n },\n } as any)}\n padding=\"$sm\"\n marginBottom=\"$sm\"\n borderWidth={2}\n borderStyle=\"dashed\"\n borderColor=\"$primary\"\n borderRadius=\"$md\"\n alignItems=\"center\"\n >\n <MText fontSize=\"$xs\" color=\"$primary\">\n Drop here to make root-level\n </MText>\n </YStack>\n )}\n\n {/* Tree */}\n {state.tree.length === 0 ? (\n <YStack alignItems=\"center\" padding=\"$xl\">\n <MText fontSize={32} marginBottom=\"$sm\">\n 🌳\n </MText>\n <MText color=\"$colorMuted\">No items yet. Click \"+ Add Root Node\" to get started.</MText>\n </YStack>\n ) : (\n <YStack role=\"tree\" aria-label={`${resource} tree`}>\n {state.tree.map((node) => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n doctype={resource}\n onRefresh={() => void load()}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={(targetId) => void handleDrop(targetId)}\n />\n ))}\n </YStack>\n )}\n\n {/* Style for hover-reveal action buttons */}\n <style>{`\n [draggable]:hover .tree-node-actions {\n opacity: 1 !important;\n }\n `}</style>\n </YStack>\n );\n}\n\nexport default TreeView;\n","import { useMemo, useState, type KeyboardEvent } from \"react\";\nimport {\n MStack,\n XStack,\n MText,\n Heading,\n Button,\n Input,\n Select,\n Card,\n Modal,\n} from \"@framework-m/ui\";\nimport { TableSkeleton } from \"../layout/ShellSkeleton\";\nimport { Slot } from \"../../plugins\";\nimport { KanbanView, TreeView } from \"../../views\";\nimport { ConfirmDialog } from \"../feedback\";\nimport { AutoTable } from \"../table\";\nimport type { FilterFieldDefinition, FilterRow } from \"../../hooks/useListFilters\";\nexport type FilterOperator = \"eq\" | \"gt\" | \"lt\" | \"in\" | \"like\";\n\nexport const FILTER_OPERATOR_OPTIONS: Array<{ label: string; value: FilterOperator }> = [\n { label: \"Equals\", value: \"eq\" },\n { label: \"Greater Than\", value: \"gt\" },\n { label: \"Less Than\", value: \"lt\" },\n { label: \"In\", value: \"in\" },\n { label: \"Like\", value: \"like\" },\n];\n\nexport interface ListBodyLayoutProps {\n doctype: string;\n metaLoading: boolean;\n metaError: any;\n schema: any;\n permissions: any;\n identity: any;\n isAuthenticated: boolean;\n selectedRows: Record<string, unknown>[];\n setSelectedRows: (rows: Record<string, unknown>[]) => void;\n searchQuery: string;\n setSearchQuery: (q: string) => void;\n appliedSearchQuery: string;\n applySearch: () => void;\n clearSearch: () => void;\n hasPendingSearchChanges: boolean;\n filterRows: FilterRow[];\n appliedFilterRows: FilterRow[];\n filterableFields: FilterFieldDefinition[];\n filterFieldMap: Record<string, FilterFieldDefinition>;\n addFilterRow: () => void;\n removeFilterRow: (id: string) => void;\n removeAppliedFilterRow: (id: string) => void;\n clearFilterRows: () => void;\n clearAppliedFilters: () => void;\n applyFilters: () => void;\n hasPendingFilterChanges: boolean;\n updateFilterRow: (id: string, updates: any) => void;\n listFilterSlotData: any;\n uiError: string | null;\n timeTravelError: string | null;\n\n // Hook metrics\n isDeleteConfirmOpen: boolean;\n setIsDeleteConfirmOpen: (open: boolean) => void;\n isColumnsMenuOpen: boolean;\n setIsColumnsMenuOpen: (open: boolean) => void;\n isMobile: boolean;\n columnPreferences: any;\n toggleColumnVisibility: (field: string) => void;\n updateColumnWidth: (field: string, width: string) => void;\n activeView: \"list\" | \"kanban\" | \"tree\";\n setActiveView: (v: \"list\" | \"kanban\" | \"tree\") => void;\n handleRowClick: (row: Record<string, unknown>) => void;\n\n // Derived values\n canKanban: boolean;\n canTree: boolean;\n appName: string;\n title: string;\n listColumns: any[];\n tableColumns: any[];\n tableFilters: any;\n kanbanGroupField: string | undefined;\n kanbanColumns: any[];\n kanbanTitleField: string;\n kanbanDescriptionField: string | undefined;\n detectedParentField: string | undefined;\n detectedLabelField: string;\n confirmBulkDelete: () => Promise<void>;\n handleBulkDelete: () => Promise<void>;\n handleNew: () => void;\n}\n\nfunction hasActionPermission(\n allowedRoles: string[] | undefined,\n userRoles: string[] | undefined\n): boolean {\n if (!allowedRoles || allowedRoles.length === 0) return false;\n if (allowedRoles.includes(\"All\")) return true;\n if (!userRoles || userRoles.length === 0) return false;\n return userRoles.some((role) => allowedRoles.includes(role));\n}\n\nfunction coerceSelectValue(value: any): string | undefined {\n if (!value) return undefined;\n if (typeof value === \"object\") {\n return String(value?.target?.value ?? value?.value ?? value);\n }\n return String(value);\n}\n\nconst FILTER_OPERATOR_LABELS: Record<FilterOperator, string> = {\n eq: \"=\",\n gt: \">\",\n lt: \"<\",\n in: \"in\",\n like: \"contains\",\n};\n\nfunction hasFilterValue(row: { value?: string }): boolean {\n return typeof row.value === \"string\" && row.value.trim().length > 0;\n}\n\nfunction getFilterFieldLabel(\n row: { field: string },\n filterFieldMap: Record<string, FilterFieldDefinition>\n): string {\n return filterFieldMap[row.field]?.label ?? row.field;\n}\n\nfunction getFilterDisplayValue(\n row: { operator: FilterOperator; value: string; field: string },\n filterFieldMap: Record<string, FilterFieldDefinition>\n): string {\n const fieldConfig = filterFieldMap[row.field];\n if (fieldConfig?.type === \"boolean\") {\n if (row.value === \"true\") return \"True\";\n if (row.value === \"false\") return \"False\";\n }\n\n const optionLabel = fieldConfig?.options?.find((option) => option.value === row.value)?.label;\n if (optionLabel) return optionLabel;\n\n if (row.operator === \"in\") {\n return row.value\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n .join(\", \");\n }\n\n return row.value;\n}\n\nfunction getFilterPillText(\n row: { operator: FilterOperator; value: string; field: string },\n filterFieldMap: Record<string, FilterFieldDefinition>\n): string {\n return `${getFilterFieldLabel(row, filterFieldMap)} ${\n FILTER_OPERATOR_LABELS[row.operator]\n } ${getFilterDisplayValue(row, filterFieldMap)}`;\n}\n\nfunction getFilterInputType(fieldConfig: FilterFieldDefinition | undefined): string {\n switch (fieldConfig?.type) {\n case \"number\":\n return \"number\";\n case \"date\":\n return \"date\";\n case \"datetime\":\n return \"datetime-local\";\n default:\n return \"text\";\n }\n}\n\nexport function ListBodyLayout({\n doctype,\n metaLoading,\n metaError,\n schema,\n permissions,\n identity,\n isAuthenticated,\n selectedRows,\n setSelectedRows,\n searchQuery,\n setSearchQuery,\n appliedSearchQuery,\n applySearch,\n clearSearch,\n hasPendingSearchChanges,\n filterRows,\n appliedFilterRows,\n filterableFields,\n filterFieldMap,\n addFilterRow,\n removeFilterRow,\n removeAppliedFilterRow,\n clearFilterRows,\n clearAppliedFilters,\n applyFilters,\n hasPendingFilterChanges,\n updateFilterRow,\n listFilterSlotData,\n uiError,\n timeTravelError,\n isDeleteConfirmOpen,\n setIsDeleteConfirmOpen,\n isColumnsMenuOpen,\n setIsColumnsMenuOpen,\n isMobile,\n columnPreferences,\n toggleColumnVisibility,\n updateColumnWidth,\n activeView,\n setActiveView,\n handleRowClick,\n canKanban,\n canTree,\n appName,\n title,\n listColumns,\n tableColumns,\n tableFilters,\n kanbanGroupField,\n kanbanColumns,\n kanbanTitleField,\n kanbanDescriptionField,\n detectedParentField,\n detectedLabelField,\n confirmBulkDelete,\n handleBulkDelete,\n handleNew,\n}: ListBodyLayoutProps) {\n const activeError = uiError ?? timeTravelError;\n const [isFilterPanelOpen, setIsFilterPanelOpen] = useState(false);\n const [isFilterOverflowOpen, setIsFilterOverflowOpen] = useState(false);\n const hasDraftSearchQuery = searchQuery.trim().length > 0;\n const hasAppliedSearchQuery = appliedSearchQuery.trim().length > 0;\n\n const appliedFilters = useMemo(\n () => appliedFilterRows.filter((row) => hasFilterValue(row)),\n [appliedFilterRows]\n );\n const visibleFilterPills = appliedFilters.slice(0, 3);\n const overflowFilterPills = appliedFilters.slice(3);\n\n if (metaLoading) {\n return <TableSkeleton />;\n }\n\n if (metaError) {\n return (\n <MStack padding=\"$xl\" backgroundColor=\"$background\" minHeight=\"100vh\">\n <MText color=\"$error\">\n Error loading {doctype}: {metaError.message}\n </MText>\n </MStack>\n );\n }\n\n return (\n <MStack\n padding={isMobile ? \"$sm\" : \"$md\"}\n backgroundColor=\"$background\"\n height=\"100%\"\n minHeight=\"100%\"\n flexDirection=\"column\"\n >\n {/* Contextual Header Area */}\n <MStack marginBottom=\"$md\" gap=\"$sm\">\n <XStack alignItems=\"center\" gap=\"$xs\" flexWrap=\"wrap\">\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n {appName}\n </MText>\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n /\n </MText>\n <MText color=\"$text\" fontSize=\"$sm\">\n {title}\n </MText>\n </XStack>\n\n <XStack justifyContent=\"space-between\" alignItems=\"center\" flexWrap=\"wrap\" gap=\"$md\">\n <MStack gap=\"$xs\" flex={1} minWidth={280}>\n <Heading size=\"$sm\" margin={0}>\n {title}\n </Heading>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Search, sort, and filter records from one workspace.\n </MText>\n </MStack>\n\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\" justifyContent=\"space-between\">\n <XStack\n role=\"tablist\"\n aria-label=\"View switcher\"\n gap=\"$xs\"\n padding=\"$xs\"\n borderRadius=\"$round\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n flexWrap=\"wrap\"\n >\n {(\n [\n { key: \"list\", label: \"List\", enabled: true },\n { key: \"kanban\", label: \"Kanban\", enabled: canKanban },\n { key: \"tree\", label: \"Tree\", enabled: canTree },\n ] as const\n ).map((view) => (\n <Button\n key={view.key}\n size=\"sm\"\n variant={activeView === view.key ? \"primary\" : \"ghost\"}\n disabled={!view.enabled}\n onPress={() => setActiveView(view.key)}\n borderRadius=\"$round\"\n borderWidth={0}\n aria-selected={activeView === view.key}\n role=\"tab\"\n >\n {view.label}\n </Button>\n ))}\n </XStack>\n\n <Slot name=\"list-header-actions\" doctype={doctype} />\n\n {activeView === \"list\" &&\n isAuthenticated &&\n hasActionPermission(permissions?.create, identity?.roles) && (\n <Button variant=\"primary\" size=\"md\" onPress={handleNew}>\n + New\n </Button>\n )}\n </XStack>\n </XStack>\n </MStack>\n\n {activeError && (\n <Card\n marginBottom=\"$md\"\n padding=\"$md\"\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$sm\"\n borderWidth={1}\n borderColor=\"$error\"\n >\n <MText color=\"$error\">{activeError}</MText>\n </Card>\n )}\n\n {activeView === \"list\" && (\n <>\n <Card\n padding={isMobile ? \"$sm\" : \"$md\"}\n marginBottom=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MStack gap=\"$md\">\n <XStack\n gap=\"$md\"\n alignItems=\"flex-start\"\n flexWrap=\"wrap\"\n justifyContent=\"space-between\"\n >\n <MStack gap=\"$xs\" flex={1} minWidth={200} width=\"100%\">\n <MText fontWeight=\"600\">Search</MText>\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\" width=\"100%\">\n <Input\n aria-label={`${title} search`}\n placeholder={`Search ${title.toLowerCase()}...`}\n value={searchQuery}\n onChangeText={setSearchQuery}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n applySearch();\n }\n }}\n flex={1}\n minWidth={150}\n />\n <XStack gap=\"$sm\" flexWrap=\"wrap\" width={isMobile ? \"100%\" : \"auto\"}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={applySearch}\n disabled={!hasPendingSearchChanges}\n flex={isMobile ? 1 : undefined}\n >\n Search\n </Button>\n {hasDraftSearchQuery || hasAppliedSearchQuery ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={clearSearch}\n flex={isMobile ? 1 : undefined}\n >\n Clear\n </Button>\n ) : null}\n </XStack>\n </XStack>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Use Search or press Enter to update results with the current sort order.\n </MText>\n {hasPendingSearchChanges && (\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n The query has changed. Select Search to refresh the table.\n </MText>\n )}\n </MStack>\n\n <MStack gap=\"$sm\" flex={1} minWidth={200}>\n <MText fontWeight=\"600\">Controls</MText>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Keep filters and columns close to the data they change.\n </MText>\n </MStack>\n </XStack>\n\n <MStack gap=\"$sm\">\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\">\n <Button\n variant={isFilterPanelOpen || appliedFilters.length > 0 ? \"primary\" : \"ghost\"}\n size=\"sm\"\n borderWidth={isFilterPanelOpen || appliedFilters.length > 0 ? 0 : 1}\n borderColor=\"$borderColorMuted\"\n onPress={() => setIsFilterPanelOpen((open) => !open)}\n >\n Filters{appliedFilters.length > 0 ? ` (${appliedFilters.length})` : \"\"}\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={() => {\n setIsFilterPanelOpen(true);\n addFilterRow();\n }}\n >\n Add filter\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={() => setIsColumnsMenuOpen(!isColumnsMenuOpen)}\n >\n Columns\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={() => {\n clearSearch();\n clearAppliedFilters();\n setIsFilterPanelOpen(false);\n }}\n disabled={\n filterRows.length === 0 &&\n appliedFilterRows.length === 0 &&\n !hasDraftSearchQuery &&\n !hasAppliedSearchQuery\n }\n >\n Reset\n </Button>\n\n <Slot name=\"list-filters\" doctype={doctype} data={listFilterSlotData} />\n </XStack>\n\n {(hasAppliedSearchQuery || appliedFilters.length > 0) && (\n <MStack gap=\"$xs\">\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Active state\n </MText>\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\">\n {hasAppliedSearchQuery && (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <MText fontSize=\"$sm\">Search: {appliedSearchQuery.trim()}</MText>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={clearSearch}\n aria-label=\"Clear search\"\n >\n ✕\n </Button>\n </XStack>\n </Card>\n )}\n\n {visibleFilterPills.map((row) => (\n <Card\n key={`filter-pill-${row.id}`}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <MText fontSize=\"$sm\">{getFilterPillText(row, filterFieldMap)}</MText>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => removeAppliedFilterRow(row.id)}\n aria-label={`Remove ${getFilterFieldLabel(row, filterFieldMap)} filter`}\n >\n ✕\n </Button>\n </XStack>\n </Card>\n ))}\n\n {overflowFilterPills.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={() => setIsFilterOverflowOpen(true)}\n >\n +{overflowFilterPills.length} more\n </Button>\n )}\n </XStack>\n </MStack>\n )}\n </MStack>\n </MStack>\n </Card>\n\n {isFilterPanelOpen && (\n <Card\n marginBottom=\"$sm\"\n padding={isMobile ? \"$sm\" : \"$md\"}\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n >\n <MStack gap=\"$sm\">\n <XStack\n justifyContent=\"space-between\"\n alignItems={isMobile ? \"flex-start\" : \"center\"}\n flexDirection={isMobile ? \"column\" : \"row\"}\n gap=\"$sm\"\n >\n <MStack gap=\"$xs\">\n <MText fontWeight=\"600\">Filter builder</MText>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Add targeted rules without overwhelming the workspace.\n </MText>\n </MStack>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={addFilterRow}\n >\n Add rule\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={() => {\n applyFilters();\n setIsFilterPanelOpen(false);\n }}\n disabled={!hasPendingFilterChanges}\n >\n Apply filters\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={clearFilterRows}\n disabled={filterRows.length === 0}\n >\n Clear draft\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setIsFilterPanelOpen(false)}>\n Close\n </Button>\n </XStack>\n </XStack>\n\n {hasPendingFilterChanges && (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n Filter changes are ready. Select Apply filters to refresh the table.\n </MText>\n </Card>\n )}\n\n {filterRows.length === 0 ? (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n No rules yet. Add one to narrow the list.\n </MText>\n </Card>\n ) : (\n filterRows.map((row, index) => {\n const fieldConfig = filterFieldMap[row.field];\n const selectOptions =\n fieldConfig?.type === \"boolean\"\n ? [\n { label: \"Choose value\", value: \"\" },\n { label: \"True\", value: \"true\" },\n { label: \"False\", value: \"false\" },\n ]\n : [{ label: \"Choose value\", value: \"\" }, ...(fieldConfig?.options ?? [])];\n\n return (\n <Card\n key={row.id}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n flexWrap=\"wrap\"\n width=\"100%\"\n >\n <Select\n aria-label={`Filter field ${index + 1}`}\n value={row.field}\n options={filterableFields}\n width={isMobile ? \"100%\" : 300}\n minWidth={isMobile ? undefined : 220}\n onChange={(value) => {\n const nextField = coerceSelectValue(value) || row.field;\n updateFilterRow(row.id, {\n field: nextField,\n value:\n filterFieldMap[nextField]?.type !== fieldConfig?.type\n ? \"\"\n : row.value,\n });\n }}\n />\n\n <Select\n aria-label={`Filter operator ${index + 1}`}\n value={row.operator}\n options={FILTER_OPERATOR_OPTIONS}\n width={isMobile ? \"100%\" : 180}\n minWidth={isMobile ? undefined : 150}\n onChange={(value) => {\n const nextOperator = coerceSelectValue(value);\n updateFilterRow(row.id, {\n operator: nextOperator || row.operator,\n });\n }}\n />\n\n {fieldConfig?.type === \"select\" || fieldConfig?.type === \"boolean\" ? (\n <Select\n aria-label={`Filter value ${index + 1}`}\n value={row.value}\n options={selectOptions}\n width={isMobile ? \"100%\" : 240}\n minWidth={isMobile ? undefined : 200}\n onChange={(value) =>\n updateFilterRow(row.id, {\n value: coerceSelectValue(value) ?? \"\",\n })\n }\n />\n ) : (\n <Input\n aria-label={`Filter value ${index + 1}`}\n placeholder={\n fieldConfig?.type === \"number\"\n ? \"Enter a number\"\n : fieldConfig?.type === \"date\"\n ? \"Select a date\"\n : fieldConfig?.type === \"datetime\"\n ? \"Select date & time\"\n : \"Value\"\n }\n type={getFilterInputType(fieldConfig)}\n value={row.value}\n onChangeText={(value: string) => updateFilterRow(row.id, { value })}\n width={isMobile ? \"100%\" : 240}\n />\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={() => removeFilterRow(row.id)}\n aria-label={`Remove filter ${index + 1}`}\n >\n ✕\n </Button>\n </XStack>\n </Card>\n );\n })\n )}\n </MStack>\n </Card>\n )}\n\n {isColumnsMenuOpen && (\n <MStack\n marginBottom=\"$sm\"\n gap=\"$sm\"\n padding=\"$md\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius=\"$sm\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MStack gap=\"$xs\">\n <MText fontWeight=\"600\">Visible columns</MText>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Choose which columns stay visible and adjust widths where needed.\n </MText>\n </MStack>\n {listColumns.map((column) => {\n const isVisible = columnPreferences.visibility[column.field] !== false;\n const widthValue = String(\n columnPreferences.widths[column.field] ?? column.width ?? \"\"\n );\n\n return (\n <XStack\n key={column.field}\n gap=\"$sm\"\n alignItems=\"center\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n >\n <XStack alignItems=\"center\" gap=\"$sm\" minWidth={220}>\n <Input\n type=\"checkbox\"\n aria-label={`Toggle column ${column.label}`}\n checked={isVisible}\n onChange={() => toggleColumnVisibility(column.field)}\n />\n <MText>{column.label}</MText>\n </XStack>\n\n <Input\n aria-label={`Width for ${column.label}`}\n placeholder=\"Width\"\n value={widthValue}\n onChangeText={(value: string) => updateColumnWidth(column.field, value)}\n width={isMobile ? \"100%\" : 180}\n />\n </XStack>\n );\n })}\n </MStack>\n )}\n\n <Slot name=\"list-above-table\" doctype={doctype} />\n\n <Card\n flex={1}\n padding={isMobile ? \"$sm\" : \"$md\"}\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n >\n <MStack gap=\"$sm\" flex={1}>\n <XStack\n justifyContent=\"space-between\"\n alignItems={isMobile ? \"flex-start\" : \"center\"}\n flexDirection={isMobile ? \"column\" : \"row\"}\n gap=\"$sm\"\n >\n <MStack gap=\"$xs\">\n <MText fontWeight=\"600\">Results</MText>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n {hasAppliedSearchQuery\n ? `Sorted results for \"${appliedSearchQuery.trim()}\".`\n : appliedFilters.length > 0\n ? `${appliedFilters.length} active filter${appliedFilters.length === 1 ? \"\" : \"s\"} applied.`\n : \"Browse records with sorting, search, and filters in one place.\"}\n </MText>\n </MStack>\n\n {selectedRows.length > 0 && (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$primary\"\n backgroundColor=\"$backgroundSecondary\"\n minWidth={isMobile ? \"100%\" : 240}\n >\n <XStack\n gap=\"$sm\"\n alignItems={isMobile ? \"flex-start\" : \"center\"}\n flexDirection={isMobile ? \"column\" : \"row\"}\n justifyContent=\"space-between\"\n >\n <MText color=\"$colorMuted\">{selectedRows.length} selected</MText>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n <Button\n variant=\"primary\"\n size=\"sm\"\n backgroundColor=\"$error\"\n onPress={handleBulkDelete}\n >\n Delete\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setSelectedRows([])}>\n Clear\n </Button>\n </XStack>\n </XStack>\n </Card>\n )}\n </XStack>\n\n <XStack width=\"100%\" flex={1} alignItems=\"stretch\" overflow=\"hidden\">\n <AutoTable\n resource={doctype}\n schema={schema}\n columns={tableColumns}\n filters={tableFilters}\n enableSelection\n onSelectionChange={setSelectedRows}\n onRowClick={handleRowClick}\n />\n </XStack>\n </MStack>\n </Card>\n\n <Slot name=\"list-below-table\" doctype={doctype} />\n </>\n )}\n\n <Modal\n isOpen={isFilterOverflowOpen}\n onClose={() => setIsFilterOverflowOpen(false)}\n title=\"Active filters\"\n footer={\n <>\n <Button\n variant=\"ghost\"\n onPress={() => {\n clearAppliedFilters();\n setIsFilterOverflowOpen(false);\n setIsFilterPanelOpen(false);\n }}\n >\n Clear filters\n </Button>\n <Button\n variant=\"primary\"\n onPress={() => {\n setIsFilterOverflowOpen(false);\n setIsFilterPanelOpen(true);\n }}\n >\n Manage filters\n </Button>\n </>\n }\n >\n <MStack gap=\"$sm\" padding=\"$md\">\n {appliedFilters.map((row) => (\n <Card\n key={`overflow-filter-${row.id}`}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n >\n <XStack justifyContent=\"space-between\" alignItems=\"center\" gap=\"$sm\">\n <MText>{getFilterPillText(row, filterFieldMap)}</MText>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => removeAppliedFilterRow(row.id)}\n aria-label={`Remove ${getFilterFieldLabel(row, filterFieldMap)} filter`}\n >\n ✕\n </Button>\n </XStack>\n </Card>\n ))}\n </MStack>\n </Modal>\n\n {activeView === \"kanban\" && canKanban && kanbanGroupField && (\n <KanbanView\n resource={doctype}\n config={{\n groupField: kanbanGroupField,\n columns: kanbanColumns,\n titleField: kanbanTitleField,\n descriptionField: kanbanDescriptionField,\n }}\n />\n )}\n\n {activeView === \"tree\" && canTree && detectedParentField && (\n <TreeView\n resource={doctype}\n config={{\n parentField: detectedParentField,\n labelField: detectedLabelField,\n allowReparent: true,\n allowAddChild: true,\n allowRename: true,\n }}\n />\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedRows.length} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n confirmBulkDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </MStack>\n );\n}\n","import { Button, Card, Heading, Input, MStack, MText, XStack } from \"@framework-m/ui\";\nimport { useCallback, useEffect, useMemo, useState, type ChangeEvent } from \"react\";\n\nimport { type CorrectionType, useCorrectionAction } from \"../../hooks/useCorrectionAction\";\n\nexport interface CorrectionWizardProps {\n doctype: string;\n id: string;\n isOpen: boolean;\n onClose: () => void;\n onSuccess: (result: Record<string, unknown>) => void;\n supportsInPlaceEdit: boolean;\n}\n\nconst MIN_REASON_LENGTH = 10;\n\nexport function CorrectionWizard({\n doctype,\n id,\n isOpen,\n onClose,\n onSuccess,\n supportsInPlaceEdit,\n}: Readonly<CorrectionWizardProps>) {\n const [strategy, setStrategy] = useState<CorrectionType>(\"amend\");\n const [reason, setReason] = useState(\"\");\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const { execute, isLoading, error } = useCorrectionAction(doctype, id);\n\n useEffect(() => {\n if (!supportsInPlaceEdit && strategy === \"in_place_edit\") {\n setStrategy(\"amend\");\n }\n }, [strategy, supportsInPlaceEdit]);\n\n const strategyOptions = useMemo(() => {\n const options = [\n {\n value: \"amend\",\n label: \"Amend (creates new document)\",\n },\n ];\n\n if (supportsInPlaceEdit) {\n options.push({\n value: \"in_place_edit\",\n label: \"In-Place Edit (retains document ID)\",\n });\n }\n\n return options;\n }, [supportsInPlaceEdit]);\n\n const handleConfirm = useCallback(async () => {\n const normalizedReason = reason.trim();\n\n if (!normalizedReason) {\n setValidationError(\"Reason is required\");\n return;\n }\n\n if (normalizedReason.length < MIN_REASON_LENGTH) {\n setValidationError(`Reason must be at least ${MIN_REASON_LENGTH} characters`);\n return;\n }\n\n setValidationError(null);\n\n const result = await execute(strategy, { reason: normalizedReason });\n if (result) {\n onSuccess(result);\n onClose();\n }\n }, [execute, onClose, onSuccess, reason, strategy]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <MStack\n role=\"dialog\"\n aria-modal\n aria-labelledby=\"correction-wizard-title\"\n padding=\"$md\"\n borderRadius=\"$md\"\n backgroundColor=\"rgba(0, 0, 0, 0.35)\"\n >\n <Card padding=\"$md\" backgroundColor=\"$background\" borderWidth={1}>\n <MStack gap=\"$sm\">\n <Heading id=\"correction-wizard-title\" size=\"$md\">\n Correct Document\n </Heading>\n <MText color=\"$colorMuted\" size=\"$sm\">\n Choose a correction strategy and provide a reason.\n </MText>\n\n <MStack gap=\"$xs\">\n <MText size=\"$sm\">Correction Strategy</MText>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n {strategyOptions.map((option) => {\n const optionValue = option.value as CorrectionType;\n const selected = strategy === optionValue;\n\n return (\n <Button\n key={option.value}\n variant={selected ? \"primary\" : \"ghost\"}\n onPress={() => setStrategy(optionValue)}\n aria-pressed={selected}\n disabled={isLoading}\n size=\"sm\"\n >\n {option.label}\n </Button>\n );\n })}\n </XStack>\n </MStack>\n\n <MStack gap=\"$xs\">\n <MText tag=\"label\" htmlFor=\"correction-reason\" size=\"$sm\">\n Reason\n </MText>\n <Input\n id=\"correction-reason\"\n name=\"correction-reason\"\n aria-label=\"Reason\"\n placeholder=\"Describe why this correction is needed\"\n value={reason}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setReason((event.target as HTMLInputElement).value)\n }\n disabled={isLoading}\n />\n </MStack>\n\n {validationError && (\n <MText role=\"alert\" color=\"$error\" size=\"$sm\">\n {validationError}\n </MText>\n )}\n\n {error && (\n <MText role=\"alert\" color=\"$error\" size=\"$sm\">\n {error}\n </MText>\n )}\n\n <XStack justifyContent=\"flex-end\" gap=\"$sm\" marginTop=\"$sm\">\n <Button onPress={onClose} variant=\"ghost\" disabled={isLoading}>\n Cancel\n </Button>\n <Button onPress={handleConfirm} variant=\"primary\" disabled={isLoading}>\n {isLoading ? \"Processing...\" : \"Confirm\"}\n </Button>\n </XStack>\n </MStack>\n </Card>\n </MStack>\n );\n}\n\nexport default CorrectionWizard;\n","import { Button, MStack } from \"@framework-m/ui\";\nimport { useCallback, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nimport { CorrectionWizard } from \"./CorrectionWizard\";\n\nexport interface CorrectButtonProps {\n doctype: string;\n id: string;\n docstatus: 0 | 1 | 2;\n supportsInPlaceEdit: boolean;\n}\n\nexport function CorrectButton({\n doctype,\n id,\n docstatus,\n supportsInPlaceEdit,\n}: Readonly<CorrectButtonProps>) {\n const [isOpen, setIsOpen] = useState(false);\n const navigate = useNavigate();\n\n const handleSuccess = useCallback(\n (result: Record<string, unknown>) => {\n const nextId = result.id;\n if (typeof nextId === \"string\" || typeof nextId === \"number\") {\n navigate(`/app/${doctype}/detail/${nextId}`);\n }\n setIsOpen(false);\n },\n [doctype, navigate]\n );\n\n if (docstatus !== 1 || !doctype || !id) {\n return null;\n }\n\n return (\n <MStack>\n <Button variant=\"ghost\" onPress={() => setIsOpen(true)}>\n Correct\n </Button>\n\n <CorrectionWizard\n doctype={doctype}\n id={id}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onSuccess={handleSuccess}\n supportsInPlaceEdit={supportsInPlaceEdit}\n />\n </MStack>\n );\n}\n\nexport default CorrectButton;\n","import { Card, Heading, MStack, MText } from \"@framework-m/ui\";\nimport { useCreate, useUpdate } from \"@refinedev/core\";\nimport { useState } from \"react\";\nimport { useDocTypeMeta } from \"../../hooks/useDocTypeMeta\";\nimport { type SiblingDocTypeInfo, useSiblingDocTypes } from \"../../hooks/useSiblingDocTypes\";\nimport { AutoForm } from \"../form\";\n\nexport interface SiblingPanelProps {\n doctype: string;\n id?: string;\n parentDocstatus?: number;\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n return {};\n}\n\ninterface SiblingEditorProps {\n sibling: SiblingDocTypeInfo;\n parentId?: string;\n onSaved: () => void;\n}\n\nfunction SiblingEditor({ sibling, parentId, onSaved }: Readonly<SiblingEditorProps>) {\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n const { schema } = useDocTypeMeta(sibling.doctype);\n const [formData, setFormData] = useState<Record<string, unknown>>(() =>\n toRecord(sibling.initial_data)\n );\n\n const handleSubmit = (submittedData: unknown) => {\n const values = toRecord(submittedData);\n const siblingIdValue = values.id;\n const siblingId =\n typeof siblingIdValue === \"string\" || typeof siblingIdValue === \"number\"\n ? String(siblingIdValue)\n : undefined;\n\n if (siblingId) {\n updateMutation.mutate(\n {\n resource: sibling.doctype,\n id: siblingId,\n values,\n },\n {\n onSuccess: onSaved,\n }\n );\n return;\n }\n\n createMutation.mutate(\n {\n resource: sibling.doctype,\n values: parentId ? { ...values, parent_id: parentId } : values,\n },\n {\n onSuccess: onSaved,\n }\n );\n };\n\n return (\n <Card padding=\"$md\" borderWidth={1} borderColor=\"$borderColor\">\n <Heading size=\"$xs\" marginBottom=\"$sm\">\n {sibling.label}\n </Heading>\n {schema ? (\n <AutoForm\n schema={schema as unknown as Record<string, unknown>}\n formData={formData}\n onChange={(next) => setFormData(toRecord(next))}\n onSubmit={handleSubmit}\n readonly={false}\n submitText=\"Save Sibling\"\n />\n ) : (\n <MText color=\"$colorMuted\">Loading sibling form...</MText>\n )}\n </Card>\n );\n}\n\nexport function SiblingPanel({ doctype, id }: Readonly<SiblingPanelProps>) {\n const { siblings, isLoading, error, refetch } = useSiblingDocTypes(doctype);\n\n if (isLoading) {\n return (\n <MStack marginTop=\"$md\">\n <MText color=\"$colorMuted\">Loading sibling metadata...</MText>\n </MStack>\n );\n }\n\n if (error) {\n return (\n <MStack marginTop=\"$md\">\n <MText role=\"alert\" color=\"$error\">\n {error}\n </MText>\n </MStack>\n );\n }\n\n if (siblings.length === 0) {\n return null;\n }\n\n const overlaySiblings = siblings.filter((s) => Boolean(s.is_metadata_overlay));\n const footerSiblings = siblings.filter((s) => !s.is_metadata_overlay);\n\n return (\n <MStack marginTop=\"$lg\" gap=\"$md\">\n <Heading size=\"$sm\">Sibling Data</Heading>\n\n {overlaySiblings.length > 0 && (\n <MStack gap=\"$sm\" data-testid=\"sibling-overlay-pane\">\n <MText color=\"$colorMuted\">Right-side metadata overlay</MText>\n {overlaySiblings.map((sibling) => (\n <SiblingEditor\n key={`overlay-${sibling.doctype}`}\n sibling={sibling}\n parentId={id}\n onSaved={refetch}\n />\n ))}\n </MStack>\n )}\n\n {footerSiblings.length > 0 && (\n <MStack gap=\"$sm\" data-testid=\"sibling-footer-tabs\">\n <MText color=\"$colorMuted\">Sibling tabs</MText>\n {footerSiblings.map((sibling) => (\n <SiblingEditor\n key={`footer-${sibling.doctype}`}\n sibling={sibling}\n parentId={id}\n onSaved={refetch}\n />\n ))}\n </MStack>\n )}\n </MStack>\n );\n}\n\nexport default SiblingPanel;\n","/**\n * Command Palette Component\n *\n * Global search and command palette with Ctrl+K.\n * Per checklist 6.5: Global Command Palette.\n *\n * Features:\n * - Search DocTypes (navigation)\n * - Search Documents (by title)\n * - Run Commands (e.g., \"New User\")\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { useGo, useList } from \"@refinedev/core\";\nimport { getResources } from \"../plugins\";\nimport { META_URL } from \"../constants\";\nimport { useMFetch } from \"../hooks/useMFetch\";\nimport { YStack, XStack, Input, MText } from \"@framework-m/ui\";\n\n/**\n * Command types\n */\nexport type CommandType = \"doctype\" | \"document\" | \"command\";\n\n/**\n * Command item\n */\nexport interface CommandItem {\n /** Unique ID */\n id: string;\n /** Type of command */\n type: CommandType;\n /** Display label */\n label: string;\n /** Secondary text */\n description?: string;\n /** Icon (emoji) */\n icon?: string;\n /** DocType for document items */\n doctype?: string;\n /** Action to execute */\n action?: () => void;\n}\n\n/**\n * CommandPalette props\n */\nexport interface CommandPaletteProps {\n /** Whether palette is open */\n open: boolean;\n /** Close callback */\n onClose: () => void;\n}\n\n/**\n * Built-in commands\n */\nconst BUILTIN_COMMANDS: CommandItem[] = [\n {\n id: \"cmd-dashboard\",\n type: \"command\",\n label: \"Go to Dashboard\",\n icon: \"🏠\",\n description: \"Open the main dashboard\",\n },\n {\n id: \"cmd-settings\",\n type: \"command\",\n label: \"Settings\",\n icon: \"⚙️\",\n description: \"Open settings\",\n },\n {\n id: \"cmd-logout\",\n type: \"command\",\n label: \"Logout\",\n icon: \"🚪\",\n description: \"Sign out of your account\",\n },\n];\n\n/**\n * CommandPalette Component\n */\nexport function CommandPalette({ open, onClose }: CommandPaletteProps) {\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [doctypes, setDoctypes] = useState<CommandItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const go = useGo();\n const mfetch = useMFetch();\n\n // Fetch DocTypes for navigation\n useEffect(() => {\n async function fetchDoctypes() {\n try {\n const response = await mfetch(`${META_URL}/doctypes`, {\n credentials: \"include\",\n });\n if (response.ok) {\n const data = await response.json();\n const items: CommandItem[] = (data.doctypes ?? [])\n .filter(\n (dt: { api_resource: boolean; show_in_desk: boolean }) =>\n dt.api_resource && dt.show_in_desk\n )\n .map((dt: { name: string; label?: string }) => ({\n id: `doctype-${dt.name}`,\n type: \"doctype\" as CommandType,\n label: dt.label ?? dt.name,\n description: `Go to ${dt.name}`,\n icon: \"📋\",\n doctype: dt.name,\n }));\n setDoctypes(items);\n }\n } catch {\n // Fallback to registered resources\n const resources = getResources();\n const items: CommandItem[] = resources.map((r) => ({\n id: `doctype-${r.name}`,\n type: \"doctype\" as CommandType,\n label: r.label ?? r.name,\n description: `Go to ${r.name}`,\n icon: \"📋\",\n doctype: r.name,\n }));\n setDoctypes(items);\n }\n }\n\n if (open) {\n fetchDoctypes();\n }\n }, [open]);\n\n // Search documents\n const { result: searchResults } = useList({\n resource: \"search\",\n filters: query.length >= 2 ? [{ field: \"q\", operator: \"contains\", value: query }] : [],\n pagination: { pageSize: 5 },\n queryOptions: { enabled: open && query.length >= 2 },\n });\n\n // Convert search results to command items\n const documentItems: CommandItem[] = useMemo(() => {\n if (!searchResults?.data) return [];\n return searchResults.data.map((doc) => {\n const d = doc as unknown as {\n id?: string;\n name?: string;\n title?: string;\n doctype?: string;\n };\n return {\n id: `doc-${d.id ?? \"unknown\"}`,\n type: \"document\" as CommandType,\n label: d.title ?? d.name ?? String(d.id ?? \"Unknown\"),\n description: d.doctype,\n icon: \"📄\",\n doctype: d.doctype,\n };\n });\n }, [searchResults]);\n\n // \"New X\" commands from DocTypes\n const newCommands: CommandItem[] = useMemo(() => {\n if (query.toLowerCase().startsWith(\"new \")) {\n const searchTerm = query.slice(4).toLowerCase();\n return doctypes\n .filter((dt) => dt.label.toLowerCase().includes(searchTerm))\n .slice(0, 5)\n .map((dt) => ({\n id: `new-${dt.doctype}`,\n type: \"command\" as CommandType,\n label: `New ${dt.label}`,\n description: `Create a new ${dt.label}`,\n icon: \"➕\",\n doctype: dt.doctype,\n }));\n }\n return [];\n }, [doctypes, query]);\n\n // Filter all items by query\n const filteredItems = useMemo(() => {\n const lowerQuery = query.toLowerCase();\n\n const filtered = [\n ...newCommands,\n ...doctypes.filter(\n (dt) =>\n dt.label.toLowerCase().includes(lowerQuery) ||\n dt.doctype?.toLowerCase().includes(lowerQuery)\n ),\n ...documentItems,\n ...BUILTIN_COMMANDS.filter((cmd) => cmd.label.toLowerCase().includes(lowerQuery)),\n ];\n\n return filtered.slice(0, 10);\n }, [doctypes, documentItems, newCommands, query]);\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0);\n }, [filteredItems.length]);\n\n // Focus input when opened\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n setQuery(\"\");\n setSelectedIndex(0);\n }\n }, [open]);\n\n // Execute selected command\n const executeCommand = useCallback(\n (item: CommandItem) => {\n onClose();\n\n if (item.type === \"doctype\" && item.doctype) {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"document\" && item.doctype) {\n go({\n to: `/app/${item.doctype}/detail/${item.id.replace(\"doc-\", \"\")}`,\n });\n } else if (item.type === \"command\") {\n if (item.id === \"cmd-dashboard\") {\n go({ to: \"/app/dashboard\" });\n } else if (item.id === \"cmd-settings\") {\n go({ to: \"/app/settings\" });\n } else if (item.id === \"cmd-logout\") {\n go({ to: \"/logout\" });\n } else if (item.id.startsWith(\"new-\") && item.doctype) {\n go({ to: `/app/${item.doctype}/new` });\n } else if (item.action) {\n item.action();\n }\n }\n },\n [go, onClose]\n );\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, filteredItems.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\" && filteredItems[selectedIndex]) {\n e.preventDefault();\n executeCommand(filteredItems[selectedIndex]);\n } else if (e.key === \"Escape\") {\n onClose();\n }\n },\n [filteredItems, selectedIndex, executeCommand, onClose]\n );\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <YStack\n position=\"fixed\"\n inset={0}\n backgroundColor=\"rgba(0,0,0,0.7)\"\n zIndex={1000}\n onPress={onClose}\n />\n\n {/* Palette */}\n <YStack\n position=\"fixed\"\n top=\"15%\"\n left=\"50%\"\n x=\"-50%\"\n width=\"100%\"\n maxWidth={500}\n backgroundColor=\"$background\"\n borderRadius=\"$lg\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n zIndex={1001}\n overflow=\"hidden\"\n elevation=\"$4\"\n >\n {/* Search Input */}\n <YStack padding=\"$sm\" borderBottomWidth={1} borderBottomColor=\"$borderColor\">\n <Input\n ref={inputRef as any}\n placeholder=\"Search or type a command...\"\n value={query}\n onChangeText={setQuery}\n onKeyDown={handleKeyDown as any}\n borderWidth={0}\n backgroundColor=\"transparent\"\n focusStyle={{ outlineWidth: 0, borderColor: \"transparent\" }}\n width=\"100%\"\n fontSize=\"$md\"\n />\n </YStack>\n\n {/* Results */}\n <YStack maxHeight={300} overflow=\"scroll\">\n {filteredItems.length === 0 && query && (\n <YStack padding=\"$md\" alignItems=\"center\">\n <MText color=\"$colorMuted\">No results found</MText>\n </YStack>\n )}\n\n {filteredItems.map((item, idx) => (\n <XStack\n key={item.id}\n onPress={() => executeCommand(item)}\n onMouseEnter={() => setSelectedIndex(idx)}\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n cursor=\"pointer\"\n alignItems=\"center\"\n gap=\"$sm\"\n backgroundColor={selectedIndex === idx ? \"$backgroundSecondary\" : \"$background\"}\n >\n <MText fontSize=\"$xl\">{item.icon}</MText>\n <YStack flex={1}>\n <MText fontWeight=\"500\" color=\"$color\">\n {item.label}\n </MText>\n {item.description && (\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {item.description}\n </MText>\n )}\n </YStack>\n <YStack\n backgroundColor=\"rgba(0,0,0,0.05)\"\n paddingHorizontal=\"$xs\"\n paddingVertical={2}\n borderRadius=\"$sm\"\n >\n <MText fontSize={10} color=\"$colorMuted\">\n {item.type}\n </MText>\n </YStack>\n </XStack>\n ))}\n </YStack>\n\n {/* Footer */}\n <XStack\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n borderTopWidth={1}\n borderTopColor=\"$borderColor\"\n gap=\"$md\"\n >\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n ↑↓ Navigate\n </MText>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n ↵ Select\n </MText>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n Esc Close\n </MText>\n </XStack>\n </YStack>\n </>\n );\n}\n\nexport default CommandPalette;\n","import { useLogout, useMenu } from \"@refinedev/core\";\nimport { NavLink } from \"react-router\";\nimport { YStack, Button, MText } from \"@framework-m/ui\";\n\nexport const Menu = () => {\n const { mutate: logout } = useLogout();\n const { menuItems } = useMenu();\n\n return (\n <YStack tag=\"nav\" className=\"menu\" gap=\"$md\">\n <YStack tag=\"ul\" padding={0} margin={0} gap=\"$xs\" style={{ listStyle: \"none\" }}>\n {menuItems.map((item) => (\n <YStack tag=\"li\" key={item.key}>\n <NavLink to={item.route ?? \"/\"} style={{ textDecoration: \"none\", display: \"block\" }}>\n <YStack\n paddingVertical=\"$sm\"\n paddingHorizontal=\"$md\"\n borderRadius=\"$sm\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" } as any}\n >\n <MText color=\"$color\">{item.label}</MText>\n </YStack>\n </NavLink>\n </YStack>\n ))}\n </YStack>\n\n <Button variant=\"ghost\" onPress={() => logout()}>\n Logout\n </Button>\n </YStack>\n );\n};\n","import { useBreadcrumb } from \"@refinedev/core\";\nimport { Link } from \"react-router\";\nimport { XStack, MText } from \"@framework-m/ui\";\n\nexport const Breadcrumb = () => {\n const { breadcrumbs } = useBreadcrumb();\n\n if (!breadcrumbs || breadcrumbs.length === 0) return null;\n\n return (\n <XStack alignItems=\"center\" flexWrap=\"wrap\" gap=\"$sm\">\n {breadcrumbs.map((breadcrumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n return (\n <XStack key={`breadcrumb-${breadcrumb.label}`} alignItems=\"center\" gap=\"$sm\">\n {breadcrumb.href ? (\n <Link to={breadcrumb.href} style={{ textDecoration: \"none\" }}>\n <MText color=\"$primary\" hoverStyle={{ textDecorationLine: \"underline\" } as any}>\n {breadcrumb.label}\n </MText>\n </Link>\n ) : (\n <MText color=\"$colorMuted\">{breadcrumb.label}</MText>\n )}\n {!isLast && (\n <MText color=\"$colorMuted\" opacity={0.5}>\n /\n </MText>\n )}\n </XStack>\n );\n })}\n </XStack>\n );\n};\n","/**\n * TabContainer — Tabbed Layout Engine for Framework M Form View.\n *\n * Renders a set of named tabs driven by `UIMeta.form.tabs`.\n * Persists the active tab per-DocType in localStorage so users\n * return to the same tab after navigation.\n *\n * Keyboard shortcut: `Alt + [1–9]` to switch tabs (web only).\n * Auto-focuses the first focusable element in the newly selected tab.\n */\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Button, MStack, MText, XStack } from \"@framework-m/ui\";\nimport type { FormTab } from \"../../hooks/useUIMeta\";\n\nexport interface TabContainerProps {\n /** Tab definitions from UIMeta.form.tabs */\n tabs: FormTab[];\n /** DocType name — used to key the localStorage persistence entry */\n doctype: string;\n /** Render prop receiving the active tab and its index */\n children: (tab: FormTab, index: number) => ReactNode;\n /** Initial tab index override (ignored if localStorage has a value) */\n defaultTabIndex?: number;\n /** Called after the active tab changes */\n onTabChange?: (index: number) => void;\n}\n\nconst STORAGE_KEY_PREFIX = \"m_tab_\";\n\nfunction readStoredTab(doctype: string): number | null {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY_PREFIX}${doctype}_active`);\n if (raw !== null) {\n const parsed = parseInt(raw, 10);\n return isNaN(parsed) ? null : parsed;\n }\n } catch {\n // localStorage may be unavailable (SSR, private mode)\n }\n return null;\n}\n\nfunction storeTab(doctype: string, index: number): void {\n try {\n localStorage.setItem(`${STORAGE_KEY_PREFIX}${doctype}_active`, String(index));\n } catch {\n // Silently ignore write failures\n }\n}\n\n/** Focus the first focusable element inside a container ref. */\nfunction focusFirst(container: HTMLElement | null): void {\n if (!container) return;\n const focusable = container.querySelector<HTMLElement>(\n 'input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n focusable?.focus({ preventScroll: false });\n}\n\nexport function TabContainer({\n tabs,\n doctype,\n children,\n defaultTabIndex = 0,\n onTabChange,\n}: Readonly<TabContainerProps>) {\n const [activeIndex, setActiveIndex] = useState<number>(() => {\n const stored = readStoredTab(doctype);\n if (stored !== null && stored < tabs.length) return stored;\n return Math.min(defaultTabIndex, tabs.length - 1);\n });\n\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Clamp active index when tabs change (e.g. permission filters)\n useEffect(() => {\n if (activeIndex >= tabs.length) {\n setActiveIndex(0);\n }\n }, [tabs.length, activeIndex]);\n\n function switchTab(index: number) {\n const clamped = Math.max(0, Math.min(index, tabs.length - 1));\n setActiveIndex(clamped);\n storeTab(doctype, clamped);\n onTabChange?.(clamped);\n // Auto-focus first field after React renders the new tab content\n requestAnimationFrame(() => {\n focusFirst(contentRef.current);\n });\n }\n\n // Alt+[1-9] keyboard shortcut — web only\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (!e.altKey) return;\n const digit = parseInt(e.key, 10);\n if (isNaN(digit) || digit < 1 || digit > 9) return;\n const targetIndex = digit - 1;\n if (targetIndex < tabs.length) {\n e.preventDefault();\n switchTab(targetIndex);\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabs.length]);\n\n if (tabs.length === 0) return null;\n\n return (\n <MStack gap=\"$0\">\n {/* Tab Bar */}\n <XStack\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n gap=\"$0\"\n flexWrap=\"wrap\"\n role=\"tablist\"\n aria-label=\"Document sections\"\n >\n {tabs.map((tab, idx) => {\n const isActive = idx === activeIndex;\n return (\n <Button\n key={tab.label}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tab-panel-${idx}`}\n id={`tab-${idx}`}\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => switchTab(idx)}\n borderRadius=\"$0\"\n borderBottomWidth={isActive ? 2 : 0}\n borderBottomColor={isActive ? \"$primary\" : \"transparent\"}\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n title={`${tab.label} (Alt+${idx + 1})`}\n >\n <MText\n fontSize=\"$sm\"\n fontWeight={isActive ? \"700\" : \"400\"}\n color={isActive ? \"$primary\" : \"$colorMuted\"}\n >\n {tab.label}\n </MText>\n </Button>\n );\n })}\n </XStack>\n\n {/* Tab Panel */}\n <MStack\n // @ts-expect-error — ref bridging\n ref={contentRef}\n role=\"tabpanel\"\n id={`tab-panel-${activeIndex}`}\n aria-labelledby={`tab-${activeIndex}`}\n paddingTop=\"$md\"\n gap=\"$md\"\n >\n {children(tabs[activeIndex], activeIndex)}\n </MStack>\n </MStack>\n );\n}\n\nexport default TabContainer;\n","/**\n * SectionField — A titled, optionally collapsible form section.\n *\n * Driven by `UIMeta.form.sections[*]` or `LayoutConfig.sections[*]`.\n * Supports 1, 2, or 3 auto-equal columns via the `columns` prop.\n * For explicit per-column field lists use the `columnFields` prop\n * (delegated to ColumnGrid).\n */\n\nimport { Children, useState, type ReactNode } from \"react\";\nimport { Card, Heading, MStack, MText, XStack } from \"@framework-m/ui\";\n\nexport interface SectionFieldProps {\n /** Section title */\n label?: string;\n /** Allow the user to collapse this section */\n collapsible?: boolean;\n /** Whether the section is collapsed initially */\n defaultCollapsed?: boolean;\n /** Number of auto-equal columns (1–3). Ignored if children is a single element */\n columns?: 1 | 2 | 3;\n children: ReactNode;\n}\n\nexport function SectionField({\n label,\n collapsible = false,\n defaultCollapsed = false,\n columns = 1,\n children,\n}: Readonly<SectionFieldProps>) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const childItems = Children.toArray(children);\n const fieldContent =\n columns > 1 && childItems.length > 1 ? (\n <XStack flexWrap=\"wrap\" gap=\"$sm\">\n {childItems.map((child, index) => (\n <MStack key={index} flexBasis={`${100 / columns}%`} flexGrow={1}>\n {child}\n </MStack>\n ))}\n </XStack>\n ) : (\n children\n );\n\n return (\n <Card outlined elevated={false} padding=\"$0\" overflow=\"visible\" borderRadius=\"$sm\">\n {/* Section Header */}\n {label && (\n <XStack\n paddingHorizontal=\"$sm\"\n paddingVertical=\"$2\"\n borderBottomWidth={isCollapsed ? 0 : 1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n alignItems=\"center\"\n gap=\"$sm\"\n onPress={collapsible ? () => setIsCollapsed((c) => !c) : undefined}\n cursor={collapsible ? \"pointer\" : \"default\"}\n role={collapsible ? \"button\" : undefined}\n aria-expanded={collapsible ? !isCollapsed : undefined}\n aria-label={collapsible ? `Toggle ${label} section` : undefined}\n >\n {collapsible && (\n <MText\n fontSize=\"$xs\"\n color=\"$colorMuted\"\n // Rotate the caret\n style={\n {\n display: \"inline-block\",\n transform: isCollapsed ? \"rotate(-90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n } as React.CSSProperties\n }\n >\n ▼\n </MText>\n )}\n <Heading size=\"$xs\" color=\"$colorMuted\" fontWeight=\"600\">\n {label}\n </Heading>\n </XStack>\n )}\n\n {/* Section Body */}\n {!isCollapsed && (\n <MStack padding=\"$sm\" position=\"relative\" zIndex={1}>\n {fieldContent}\n </MStack>\n )}\n </Card>\n );\n}\n\nexport default SectionField;\n","/**\n * ColumnGrid — Lays out children in named-fraction columns.\n *\n * Supports the same cross-platform safe named fractions agreed in\n * the implementation plan: \"1/3\", \"2/3\", \"1/2\", \"auto\".\n *\n * When no explicit column definitions are provided it falls back to\n * equal-width columns determined by `equalColumns`.\n *\n * React Native compatible: uses Tamagui XStack + flex/width instead\n * of CSS grid.\n */\n\nimport type { ReactNode } from \"react\";\nimport { MStack, XStack } from \"@framework-m/ui\";\n\n/** Named-fraction width tokens */\nexport type ColumnWidth = \"1/3\" | \"2/3\" | \"1/2\" | \"auto\";\n\n/** Explicit column definition used by ColumnGrid */\nexport interface ColumnDef {\n width?: ColumnWidth;\n children: ReactNode;\n}\n\nexport interface ColumnGridProps {\n /** Explicit column definitions (used when backend specifies per-column field lists). */\n columns?: ColumnDef[];\n /**\n * Number of equal-width columns when no explicit `columns` prop is provided.\n * Ignored when `columns` is set.\n */\n equalColumns?: 1 | 2 | 3;\n /** Children used only when `columns` is NOT provided (treated as equal-width slots). */\n children?: ReactNode;\n}\n\nconst fractionToFlex: Record<ColumnWidth, number> = {\n \"1/3\": 1,\n \"2/3\": 2,\n \"1/2\": 1, // paired fractions — flex=1 each gives equal halves\n auto: 1,\n};\n\n/**\n * Map named fraction to an approximate CSS percentage for\n * `minWidth` so columns wrap gracefully on small screens.\n */\nconst fractionToMinWidth: Record<ColumnWidth, string> = {\n \"1/3\": \"28%\",\n \"2/3\": \"60%\",\n \"1/2\": \"45%\",\n auto: \"0\",\n};\n\nfunction ColWrapper({ width, children }: { width?: ColumnWidth; children: ReactNode }) {\n const flexValue = width ? fractionToFlex[width] : 1;\n const minW = width ? fractionToMinWidth[width] : \"0\";\n\n return (\n <MStack flex={flexValue} minWidth={minW as any} gap=\"$sm\">\n {children}\n </MStack>\n );\n}\n\nexport function ColumnGrid({ columns, equalColumns = 1, children }: Readonly<ColumnGridProps>) {\n // Explicit column definitions take priority\n if (columns && columns.length > 0) {\n return (\n <XStack gap=\"$md\" flexWrap=\"wrap\" flex={1}>\n {columns.map((col, i) => (\n // Key by index — order is stable (driven by UIMeta order)\n // eslint-disable-next-line react/no-array-index-key\n <ColWrapper key={i} width={col.width}>\n {col.children}\n </ColWrapper>\n ))}\n </XStack>\n );\n }\n\n // Equal columns via children\n if (equalColumns === 1 || !children) {\n return <MStack gap=\"$sm\">{children}</MStack>;\n }\n\n return (\n <XStack gap=\"$md\" flexWrap=\"wrap\" flex={1}>\n {[...Array(equalColumns)].map((_, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <MStack key={i} flex={1} gap=\"$sm\">\n {/* Children are distributed externally; ColumnGrid provides the flex shell */}\n </MStack>\n ))}\n {/* When used without explicit columns, just wrap children in a row */}\n {children}\n </XStack>\n );\n}\n\nexport default ColumnGrid;\n","import type { ReactNode } from \"react\";\nimport { XStack, YStack, Heading, MText } from \"@framework-m/ui\";\n\nexport interface PageHeaderProps {\n title: string;\n breadcrumb?: {\n app: string;\n view?: string;\n };\n extra?: ReactNode;\n children?: ReactNode;\n isMobile?: boolean;\n}\n\n/**\n * PageHeader\n *\n * Standard header for all Framework M pages (List, Form, Dashboards).\n * Replaces the old global Top Navbar.\n */\nexport function PageHeader({ title, breadcrumb, extra, children, isMobile }: PageHeaderProps) {\n return (\n <YStack marginBottom=\"$lg\" gap=\"$sm\">\n {breadcrumb && (\n <XStack alignItems=\"center\" gap=\"$xs\">\n <MText color=\"$colorMuted\" size=\"$sm\">\n {breadcrumb.app}\n </MText>\n {breadcrumb.view && (\n <>\n <MText color=\"$colorMuted\" size=\"$sm\">\n /\n </MText>\n <MText color=\"$text\" size=\"$sm\">\n {breadcrumb.view}\n </MText>\n </>\n )}\n </XStack>\n )}\n\n <XStack\n justifyContent=\"space-between\"\n alignItems=\"center\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n gap=\"$md\"\n >\n <Heading size=\"$sm\" margin={0}>\n {title}\n </Heading>\n\n <XStack gap=\"$sm\" alignItems=\"center\">\n {extra}\n </XStack>\n </XStack>\n\n {children}\n </YStack>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { XStack, YStack } from \"@framework-m/ui\";\n\nexport interface LayoutProps {\n /** Sidebar component or slot */\n sidebar: ReactNode;\n /** Navbar component or slot */\n navbar: ReactNode;\n /** Primary content */\n children: ReactNode;\n /** Mobile layout toggle */\n isMobile?: boolean;\n}\n\n/**\n * Standard Framework M Desk Layout\n *\n * Provides a responsive structure for the sidebar, navbar, and main content area.\n */\nexport const Layout: React.FC<LayoutProps> = ({ sidebar, navbar, children, isMobile = false }) => {\n return (\n <XStack\n className=\"shell-layout\"\n flexDirection={isMobile ? \"column-reverse\" : \"row\"}\n height=\"100vh\"\n width=\"100%\"\n maxWidth=\"100vw\"\n overflow=\"hidden\"\n >\n {sidebar}\n <YStack className=\"shell-main\" flex={1} minWidth={0} overflow=\"hidden\">\n {navbar}\n <YStack\n tag=\"main\"\n className=\"shell-content\"\n flex={1}\n overflow=\"scroll\"\n padding={24}\n maxWidth=\"100%\"\n >\n {children}\n </YStack>\n </YStack>\n </XStack>\n );\n};\n\n// Layout container components for form views\nexport { TabContainer } from \"./TabContainer\";\nexport type { TabContainerProps } from \"./TabContainer\";\nexport { SectionField } from \"./SectionField\";\nexport type { SectionFieldProps } from \"./SectionField\";\nexport { ColumnGrid } from \"./ColumnGrid\";\nexport type { ColumnGridProps, ColumnDef, ColumnWidth } from \"./ColumnGrid\";\nexport { PageHeader } from \"./PageHeader\";\nexport type { PageHeaderProps } from \"./PageHeader\";\nexport { ShellSkeleton } from \"./ShellSkeleton\";\nexport type { ShellSkeletonProps } from \"./ShellSkeleton\";\n","import { useState } from \"react\";\nimport { useGo } from \"@refinedev/core\";\nimport { MStack, XStack, YStack, MText, Button } from \"@framework-m/ui\";\nimport type { DeskWorkspace, WorkspaceItem } from \"./types\";\n\nexport interface WorkspaceSectionProps {\n workspace: DeskWorkspace;\n collapsed?: boolean;\n}\n\nexport function WorkspaceSection({ workspace, collapsed = false }: WorkspaceSectionProps) {\n const [isExpanded, setIsExpanded] = useState(true);\n const go = useGo();\n\n const handleItemClick = (item: WorkspaceItem) => {\n if (item.type === \"shortcut\") {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"link\") {\n if (item.newTab) {\n window.open(item.url, \"_blank\");\n } else if (item.url.startsWith(\"/\")) {\n go({ to: item.url });\n } else {\n window.location.href = item.url;\n }\n }\n };\n\n return (\n <MStack marginBottom=\"$xs\">\n {/* Workspace Header */}\n <Button\n variant=\"ghost\"\n onPress={() => setIsExpanded(!isExpanded)}\n padding={collapsed ? \"$xs\" : \"$xs $sm\"}\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n gap=\"$xs\"\n width=\"100%\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n >\n <MText color=\"rgba(255,255,255,0.7)\" fontSize=\"$sm\">\n {workspace.icon}\n </MText>\n {!collapsed && (\n <XStack\n flex={1}\n alignItems=\"center\"\n gap=\"$xs\"\n justifyContent=\"space-between\"\n width=\"100%\"\n >\n <MText color=\"rgba(255,255,255,0.7)\" fontSize=\"$sm\" flex={1} textAlign=\"start\">\n {workspace.label}\n </MText>\n <MText color=\"rgba(255,255,255,0.7)\" fontSize=\"$xs\">\n {isExpanded ? \"▼\" : \"▶\"}\n </MText>\n </XStack>\n )}\n </Button>\n\n {/* Workspace Items */}\n {isExpanded && !collapsed && (\n <YStack paddingLeft=\"$md\">\n {workspace.items\n .filter((item) => item.type !== \"chart\")\n .map((item, idx) => (\n <Button\n key={`${item.type}-${idx}`}\n variant=\"ghost\"\n onPress={() => handleItemClick(item)}\n padding=\"$xs $sm\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n gap=\"$xs\"\n width=\"100%\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n >\n {\"icon\" in item && item.icon && (\n <MText color=\"rgba(255,255,255,0.6)\" fontSize=\"$xs\">\n {item.icon}\n </MText>\n )}\n <MText color=\"rgba(255,255,255,0.6)\" fontSize=\"$xs\" textAlign=\"start\">\n {item.label}\n </MText>\n {item.type === \"link\" && item.newTab && (\n <MText color=\"rgba(255,255,255,0.6)\" fontSize=\"$xs\" opacity={0.5}>\n ↗\n </MText>\n )}\n </Button>\n ))}\n </YStack>\n )}\n </MStack>\n );\n}\n\nexport default WorkspaceSection;\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport {\n useDocTypeMeta,\n useUIMeta,\n useListFilters,\n useListActions,\n useRouteTraversal,\n} from \"../hooks\";\nimport type { FilterFieldDefinition, FilterValueKind } from \"../hooks/useListFilters\";\nimport { usePluginApps } from \"@framework-m/plugin-sdk\";\nimport { useGetIdentity, useDeleteMany, useInvalidate } from \"@refinedev/core\";\nimport { ListBodyLayout } from \"../components/list/ListBodyLayout\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\n\nexport interface ListViewProps {\n doctype?: string;\n view?: \"list\" | \"kanban\" | \"tree\";\n}\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n [key: string]: unknown;\n}\n\nconst LIST_SYSTEM_FIELDS = new Set([\n \"id\",\n \"creation\",\n \"modified\",\n \"modified_by\",\n \"owner\",\n \"deleted_at\",\n \"docstatus\",\n \"idx\",\n \"parent\",\n \"parentfield\",\n \"parenttype\",\n \"is_favorite\",\n \"lft\",\n \"rgt\",\n \"old_parent\",\n]);\n\nfunction toSchemaFields(schema: unknown): Record<string, SchemaField> {\n if (!schema || typeof schema !== \"object\") return {};\n const properties = (schema as { properties?: unknown }).properties;\n if (!properties || typeof properties !== \"object\") return {};\n return properties as Record<string, SchemaField>;\n}\n\nfunction getStringEnums(field: SchemaField | undefined): string[] {\n if (!field?.enum || !Array.isArray(field.enum)) return [];\n return field.enum.filter((v): v is string => typeof v === \"string\");\n}\n\nfunction isSelectOrLinkField(field: SchemaField | undefined): boolean {\n if (!field) return false;\n if (Array.isArray(field.enum) && field.enum.length > 0) return true;\n const format = String(field.format ?? \"\").toLowerCase();\n if (format.includes(\"link\") || format.includes(\"reference\")) return true;\n const fieldType =\n typeof field[\"x-fieldtype\"] === \"string\" ? field[\"x-fieldtype\"].toLowerCase() : \"\";\n return fieldType === \"link\" || fieldType === \"select\";\n}\n\nfunction getFilterValueKind(field: SchemaField | undefined): FilterValueKind {\n if (!field) return \"text\";\n if (Array.isArray(field.enum) && field.enum.length > 0) return \"select\";\n\n const typeValue = Array.isArray(field.type) ? field.type[0] : field.type;\n if (typeValue === \"number\" || typeValue === \"integer\") return \"number\";\n if (typeValue === \"boolean\") return \"boolean\";\n\n const format = String(field.format ?? \"\").toLowerCase();\n if (format === \"date\") return \"date\";\n if (format === \"date-time\") return \"datetime\";\n\n return \"text\";\n}\n\nfunction pickFirst(...values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return undefined;\n}\n\nfunction toDisplayLabel(fieldName: string): string {\n return fieldName\n .replaceAll(\"_\", \" \")\n .split(\" \")\n .map((s) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : \"\"))\n .join(\" \");\n}\n\nfunction isHiddenField(fieldMeta: SchemaField): boolean {\n if (!fieldMeta) return false;\n if (fieldMeta[\"x-hidden\"] === true) return true;\n if (fieldMeta.type === \"object\" || fieldMeta.type === \"array\") return true;\n return false;\n}\n\nfunction formatCellValue(field: SchemaField | undefined, value: unknown): string {\n if (value === null || value === undefined || value === \"\") return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n const format = String(field?.format ?? \"\").toLowerCase();\n if (format === \"date\" || format === \"date-time\") {\n const date = new Date(String(value));\n return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n }\n return String(value);\n}\n\nexport function ListView({ doctype: propDoctype, view: propView }: Readonly<ListViewProps>) {\n const params = useParams();\n const navigate = useNavigate();\n\n const doctype = propDoctype ?? params.doctype ?? \"Task\";\n const { data: identity } = useGetIdentity();\n const isAuthenticated = Boolean(identity);\n const apps = usePluginApps();\n\n const { schema, permissions, isLoading: metaLoading, error: metaError } = useDocTypeMeta(doctype);\n const { uiMeta } = useUIMeta(doctype);\n\n const [uiError, setUiError] = useState<string | null>(null);\n const [timeTravelError, setTimeTravelError] = useState<string | null>(null);\n\n const [selectedRows, setSelectedRows] = useState<Record<string, unknown>[]>([]);\n const schemaFields = useMemo(() => toSchemaFields(schema), [schema]);\n\n const filterableFields = useMemo<FilterFieldDefinition[]>(() => {\n const fields = Object.entries(schemaFields)\n .filter(\n ([fieldName, fieldMeta]) => !LIST_SYSTEM_FIELDS.has(fieldName) && !isHiddenField(fieldMeta)\n )\n .map(([fieldName, fieldMeta]) => ({\n label:\n typeof fieldMeta.title === \"string\" && fieldMeta.title.trim()\n ? fieldMeta.title\n : toDisplayLabel(fieldName),\n value: fieldName,\n type: getFilterValueKind(fieldMeta),\n options: getStringEnums(fieldMeta).map((value) => ({ label: value, value })),\n }));\n return fields.length > 0 ? fields : [{ label: \"Name\", value: \"name\", type: \"text\" }];\n }, [schemaFields]);\n\n const filterFieldMap = useMemo(\n () =>\n filterableFields.reduce<Record<string, FilterFieldDefinition>>((acc, field) => {\n acc[field.value] = field;\n return acc;\n }, {}),\n [filterableFields]\n );\n\n const {\n searchQuery,\n setSearchQuery,\n appliedSearchQuery,\n applySearch,\n clearSearch,\n hasPendingSearchChanges,\n filterRows,\n appliedFilterRows,\n asOfFilter,\n setAsOfFilter,\n tableFilters,\n hasPendingFilterChanges,\n addFilterRow,\n applyFilters,\n updateFilterRow,\n removeFilterRow,\n removeAppliedFilterRow,\n clearFilterRows,\n clearAppliedFilters,\n } = useListFilters(filterableFields);\n\n const detectedParentField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as { parentField?: string } | undefined;\n if (fromMeta?.parentField) return fromMeta.parentField;\n if (schemaFields.parent_doctype) return \"parent_doctype\";\n if (schemaFields.parent) return \"parent\";\n return Object.keys(schemaFields).find((k) => k.startsWith(\"parent_\") || k.endsWith(\"_parent\"));\n }, [uiMeta, schemaFields]);\n\n const groupFieldCandidates = useMemo(() => {\n return Object.entries(schemaFields)\n .filter(([, f]) => isSelectOrLinkField(f))\n .map(([n]) => n);\n }, [schemaFields]);\n\n const metaKanban = uiMeta?.additional_views?.kanban as\n | { groupByField?: string; cardTitleField?: string; cardSubtitleField?: string }\n | undefined;\n\n const kanbanGroupField = useMemo(() => {\n return pickFirst(\n metaKanban?.groupByField,\n schemaFields.status ? \"status\" : undefined,\n schemaFields.workflow_state ? \"workflow_state\" : undefined,\n groupFieldCandidates[0]\n );\n }, [metaKanban, schemaFields, groupFieldCandidates]);\n\n const canKanban = Boolean(kanbanGroupField);\n const canTree = Boolean(detectedParentField);\n\n const listColumns = useMemo(() => {\n const fromMeta = uiMeta?.list?.columns || (uiMeta as any)?.list_columns;\n if (Array.isArray(fromMeta) && fromMeta.length > 0) {\n return fromMeta\n .map((col: any) => ({\n field: typeof col === \"string\" ? col : String(col.field ?? \"\"),\n label:\n typeof col === \"string\" ? toDisplayLabel(col) : String(col.label ?? col.field ?? \"\"),\n width:\n typeof col === \"object\" && col !== null ? Number(col.width) || undefined : undefined,\n sortable: typeof col === \"object\" && col !== null ? col.sortable !== false : true,\n }))\n .filter((c) => c.field);\n }\n\n const fallbackField = schemaFields.name\n ? \"name\"\n : Object.keys(schemaFields).find(\n (f) => !LIST_SYSTEM_FIELDS.has(f) && !isHiddenField(schemaFields[f])\n );\n if (!fallbackField) return [];\n\n const schemaField = schemaFields[fallbackField];\n return [\n {\n field: fallbackField,\n label:\n (typeof schemaField?.title === \"string\" && schemaField.title) ||\n toDisplayLabel(fallbackField),\n width: undefined,\n sortable: true,\n },\n ];\n }, [uiMeta, schemaFields]);\n\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\") as any;\n\n const {\n isDeleteConfirmOpen,\n setIsDeleteConfirmOpen,\n isColumnsMenuOpen,\n setIsColumnsMenuOpen,\n isMobile,\n columnPreferences,\n toggleColumnVisibility,\n updateColumnWidth,\n activeView,\n setActiveView,\n handleRowClick,\n } = useListActions({\n doctype,\n propView,\n canKanban,\n canTree,\n resolveDetailRoute,\n });\n\n const visibleListColumns = useMemo(() => {\n return listColumns.filter((column) => columnPreferences.visibility[column.field] !== false);\n }, [listColumns, columnPreferences.visibility]);\n\n const tableColumns = useMemo<ColumnDef<Record<string, unknown>, unknown>[]>(\n () =>\n visibleListColumns.map((column) => {\n const savedWidth = columnPreferences.widths[column.field];\n const width = typeof savedWidth === \"number\" && savedWidth > 0 ? savedWidth : column.width;\n return {\n id: column.field,\n accessorKey: column.field,\n header: column.label,\n size: width,\n enableSorting: column.sortable ?? true,\n cell: ({ getValue }) => formatCellValue(schemaFields[column.field], getValue()),\n };\n }),\n [visibleListColumns, columnPreferences.widths, schemaFields]\n );\n\n const detectedLabelField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as { labelField?: string } | undefined;\n return (\n pickFirst(\n fromMeta?.labelField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.label ? \"label\" : undefined,\n schemaFields.name ? \"name\" : undefined\n ) ?? \"name\"\n );\n }, [uiMeta, schemaFields]);\n\n const kanbanColumns = useMemo(() => {\n if (!kanbanGroupField) return [];\n const enums = getStringEnums(schemaFields[kanbanGroupField]);\n return enums.map((value) => ({\n id: value,\n title: value.charAt(0).toUpperCase() + value.slice(1).replaceAll(\"_\", \" \"),\n }));\n }, [kanbanGroupField, schemaFields]);\n\n const kanbanTitleField = pickFirst(\n metaKanban?.cardTitleField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.name ? \"name\" : undefined,\n \"name\"\n ) as string;\n\n const kanbanDescriptionField = pickFirst(\n metaKanban?.cardSubtitleField,\n schemaFields.description ? \"description\" : undefined,\n schemaFields.notes ? \"notes\" : undefined\n );\n\n const handleNew = useCallback(() => {\n if (!isAuthenticated) {\n setUiError(\"Authentication required. Please login first.\");\n navigate(\"/login\");\n return;\n }\n setUiError(null);\n navigate(`/app/${doctype}/new`);\n }, [isAuthenticated, navigate, doctype]);\n\n const deleteMutation = useDeleteMany();\n const invalidate = useInvalidate();\n\n const handleBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) return;\n setIsDeleteConfirmOpen(true);\n }, [selectedRows]);\n\n const confirmBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) {\n setIsDeleteConfirmOpen(false);\n return;\n }\n\n try {\n const ids = selectedRows.map((row) => String(row.id ?? row.name ?? \"\"));\n await deleteMutation.mutateAsync({\n resource: doctype,\n ids,\n });\n setSelectedRows([]);\n setIsDeleteConfirmOpen(false);\n setUiError(null);\n invalidate({ resource: doctype, invalidates: [\"list\"] });\n } catch (err: any) {\n setIsDeleteConfirmOpen(false);\n setUiError(err.message || `Failed to delete selected ${doctype}.`);\n }\n }, [selectedRows, deleteMutation, doctype, invalidate]);\n\n const title = useMemo(() => {\n return toDisplayLabel(doctype);\n }, [doctype]);\n\n const appName = useMemo(() => {\n const typedApps = apps as unknown as Array<{\n label?: string;\n app_id?: string;\n resources?: Array<{ name: string }>;\n }>;\n for (const app of typedApps || []) {\n if (app.resources?.some((r) => r.name === doctype)) {\n return app.label || app.app_id || \"App\";\n }\n }\n return \"App\";\n }, [apps, doctype]);\n\n const listFilterSlotData = useMemo(\n () => ({\n asOf: asOfFilter,\n setAsOf: (val: string | null) => {\n setAsOfFilter(val as string | undefined);\n if (val) {\n const date = new Date(val);\n if (Number.isNaN(date.getTime())) {\n setTimeTravelError(`Invalid point-in-time date string: \"${val}\"`);\n } else {\n setTimeTravelError(null);\n }\n } else {\n setTimeTravelError(null);\n }\n },\n }),\n [asOfFilter, setAsOfFilter]\n );\n\n return (\n <ListBodyLayout\n doctype={doctype}\n metaLoading={metaLoading}\n metaError={metaError}\n schema={schema}\n permissions={permissions}\n identity={identity}\n isAuthenticated={isAuthenticated}\n selectedRows={selectedRows}\n setSelectedRows={setSelectedRows}\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n appliedSearchQuery={appliedSearchQuery}\n applySearch={applySearch}\n clearSearch={clearSearch}\n hasPendingSearchChanges={hasPendingSearchChanges}\n filterRows={filterRows}\n appliedFilterRows={appliedFilterRows}\n filterableFields={filterableFields}\n filterFieldMap={filterFieldMap}\n addFilterRow={addFilterRow}\n removeFilterRow={removeFilterRow}\n removeAppliedFilterRow={removeAppliedFilterRow}\n clearFilterRows={clearFilterRows}\n clearAppliedFilters={clearAppliedFilters}\n applyFilters={applyFilters}\n hasPendingFilterChanges={hasPendingFilterChanges}\n updateFilterRow={updateFilterRow}\n listFilterSlotData={listFilterSlotData}\n uiError={uiError}\n timeTravelError={timeTravelError}\n isDeleteConfirmOpen={isDeleteConfirmOpen}\n setIsDeleteConfirmOpen={setIsDeleteConfirmOpen}\n isColumnsMenuOpen={isColumnsMenuOpen}\n setIsColumnsMenuOpen={setIsColumnsMenuOpen}\n isMobile={isMobile}\n columnPreferences={columnPreferences}\n toggleColumnVisibility={toggleColumnVisibility}\n updateColumnWidth={updateColumnWidth}\n activeView={activeView}\n setActiveView={setActiveView}\n handleRowClick={handleRowClick}\n canKanban={canKanban}\n canTree={canTree}\n appName={appName}\n title={title}\n listColumns={listColumns}\n tableColumns={tableColumns}\n tableFilters={tableFilters}\n kanbanGroupField={kanbanGroupField}\n kanbanColumns={kanbanColumns}\n kanbanTitleField={kanbanTitleField}\n kanbanDescriptionField={kanbanDescriptionField}\n detectedParentField={detectedParentField}\n detectedLabelField={detectedLabelField}\n confirmBulkDelete={confirmBulkDelete}\n handleBulkDelete={handleBulkDelete}\n handleNew={handleNew}\n />\n );\n}\n\nexport default ListView;\n","import { MStack, XStack, Button, Input, Card, MText } from \"@framework-m/ui\";\nimport { Frm } from \"../../hooks/useFormController\";\n\nexport interface FormToolbarProps {\n frm: Frm;\n submitLabel: string;\n isEditing: boolean;\n printFormatName: string;\n setPrintFormatName: (val: string) => void;\n openPrintPreview: () => void;\n downloadPrintPdf: () => void;\n layout?: \"sidebar\" | \"sticky-bottom\";\n}\n\nexport function FormToolbar({\n frm,\n submitLabel,\n isEditing,\n printFormatName,\n setPrintFormatName,\n openPrintPreview,\n downloadPrintPdf,\n layout = \"sidebar\",\n}: FormToolbarProps) {\n const printTools = isEditing ? (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MStack gap=\"$sm\">\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n Output\n </MText>\n <Input\n value={printFormatName}\n onChangeText={setPrintFormatName}\n placeholder=\"Print format (optional)\"\n size=\"md\"\n />\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n <Button\n variant=\"ghost\"\n onPress={openPrintPreview}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n Print Preview\n </Button>\n <Button\n variant=\"ghost\"\n onPress={downloadPrintPdf}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n Download PDF\n </Button>\n </XStack>\n </MStack>\n </Card>\n ) : null;\n\n if (layout === \"sticky-bottom\") {\n return (\n <Card\n style={{ position: \"sticky\", bottom: 16, zIndex: 40 }}\n marginTop=\"$lg\"\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n elevated\n >\n <MStack gap=\"$sm\">\n <XStack\n role=\"toolbar\"\n aria-label=\"Form actions\"\n gap=\"$sm\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n >\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n Actions\n </MText>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n {!frm.isLocked && (\n <Button\n variant=\"primary\"\n onPress={() => frm.save()}\n disabled={frm.isSaving}\n size=\"md\"\n >\n {submitLabel}\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n onPress={() => frm.cancel()}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n Cancel\n </Button>\n </XStack>\n </XStack>\n {printTools}\n </MStack>\n </Card>\n );\n }\n\n return (\n <Card\n padding=\"$md\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n elevated\n >\n <MStack role=\"toolbar\" aria-label=\"Form actions\" gap=\"$md\">\n <MStack gap=\"$xs\">\n <MText fontWeight=\"700\">Document actions</MText>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n Keep core actions anchored while you work through the form.\n </MText>\n </MStack>\n\n <MStack gap=\"$sm\">\n {!frm.isLocked && (\n <Button variant=\"primary\" onPress={() => frm.save()} disabled={frm.isSaving} size=\"md\">\n {submitLabel}\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n onPress={() => frm.cancel()}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n Cancel\n </Button>\n </MStack>\n\n {printTools}\n </MStack>\n </Card>\n );\n}\n","import { createContext } from \"react\";\nimport type { ShellContextValue } from \"./types\";\n\nexport const ShellContext = createContext<ShellContextValue | null>(null);\n","import { useContext } from \"react\";\nimport { ShellContext } from \"../shell/context\";\nimport type { ShellContextValue } from \"../shell/types\";\n\nexport function useShell(): ShellContextValue {\n const context = useContext(ShellContext);\n if (!context) {\n throw new Error(\"useShell must be used within a ShellProvider\");\n }\n return context;\n}\n","import { MStack } from \"@framework-m/ui\";\nimport { TabContainer } from \"../layout/TabContainer\";\nimport { SectionField } from \"../layout/SectionField\";\nimport { AutoForm } from \"./AutoForm\";\nimport { AUDIT_FIELDS } from \"../layout/SystemInfo\";\nimport { Frm } from \"../../hooks/useFormController\";\nimport { UIMeta } from \"../../hooks/useUIMeta\";\n\nexport interface FormBodyLayoutProps {\n meta: any;\n uiMeta: UIMeta | null;\n frm: Frm;\n id?: string;\n}\n\nfunction buildFilteredSchema(meta: any, fieldKeys: string[]): any {\n const properties: Record<string, unknown> = {};\n for (const key of fieldKeys) {\n const normalizedKey = key.toLowerCase().trim();\n if (AUDIT_FIELDS.includes(normalizedKey)) continue;\n if (meta.properties[key]) {\n properties[key] = meta.properties[key];\n }\n }\n return { ...meta, properties };\n}\n\nfunction buildFullFilteredSchema(meta: any): any {\n const properties: Record<string, unknown> = {};\n for (const key of Object.keys(meta.properties || {})) {\n const normalizedKey = key.toLowerCase().trim();\n if (AUDIT_FIELDS.includes(normalizedKey)) continue;\n properties[key] = meta.properties[key];\n }\n return { ...meta, properties };\n}\n\nexport function FormBodyLayout({ meta, uiMeta, frm, id }: Readonly<FormBodyLayoutProps>) {\n const tabs = uiMeta?.form?.tabs;\n const flatSections = uiMeta?.form?.sections;\n\n // --- Tabbed layout ---\n if (tabs && tabs.length > 0) {\n const doctype = uiMeta?.doctype ?? \"unknown\";\n return (\n <TabContainer tabs={tabs} doctype={doctype}>\n {(tab) => (\n <MStack gap=\"$md\">\n {tab.sections.map((section, si) => {\n const sectionSchema = buildFilteredSchema(meta, section.fields);\n return (\n <SectionField\n key={section.label || si}\n label={section.label}\n collapsible={section.collapsible}\n defaultCollapsed={section.collapsed_by_default}\n columns={section.columns ?? 1}\n >\n <AutoForm\n key={`${id}-${section.label}-${si}`}\n schema={sectionSchema}\n formData={frm.doc}\n onChange={(data) => frm.setDoc(data)}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n </SectionField>\n );\n })}\n </MStack>\n )}\n </TabContainer>\n );\n }\n\n // --- Flat sections (no tabs) ---\n if (flatSections && flatSections.length > 0) {\n return (\n <MStack gap=\"$md\">\n {flatSections.map((section, si) => {\n const sectionSchema = buildFilteredSchema(meta, section.fields);\n return (\n <SectionField\n key={section.label || si}\n label={section.label}\n collapsible={section.collapsible}\n defaultCollapsed={section.collapsed_by_default}\n columns={section.columns ?? 1}\n >\n <AutoForm\n key={`${id}-${section.label}-${si}`}\n schema={sectionSchema}\n formData={frm.doc}\n onChange={(data) => frm.setDoc(data)}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n </SectionField>\n );\n })}\n </MStack>\n );\n }\n\n // --- Fallback: flat AutoForm ---\n return (\n <AutoForm\n key={`${id}`}\n schema={buildFullFilteredSchema(meta)}\n formData={frm.doc}\n onChange={(data) => frm.setDoc(data)}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n );\n}\n","import React from \"react\";\nimport { XStack, MStack, MText, Heading, Card } from \"@framework-m/ui\";\nimport { WorkflowActions } from \"../workflow/WorkflowActions\";\nimport { AlertBanner } from \"../feedback/AlertBanner\";\nimport { SubmittedBanner } from \"../feedback/SubmittedBanner\";\n\ninterface FormViewHeaderProps {\n appName: string;\n isSingleton: boolean;\n doctype: string;\n id?: string;\n isEditing: boolean;\n displayName: string;\n title: string;\n frm: any;\n}\n\nexport const FormViewHeader: React.FC<FormViewHeaderProps> = ({\n appName,\n isSingleton,\n doctype,\n id,\n isEditing,\n displayName,\n title,\n frm,\n}) => {\n return (\n <MStack marginBottom=\"$lg\">\n {/* Breadcrumbs */}\n <XStack alignItems=\"center\" gap=\"$xs\" marginBottom=\"$sm\">\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n {appName}\n </MText>\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n /\n </MText>\n {isSingleton ? (\n <MText color=\"$text\" fontSize=\"$sm\">\n {doctype.replaceAll(\"_\", \" \")}\n </MText>\n ) : (\n <>\n <MText\n color=\"$colorMuted\"\n fontSize=\"$sm\"\n cursor=\"pointer\"\n onPress={() => frm.cancel()}\n hoverStyle={{ textDecorationLine: \"underline\" }}\n >\n {doctype.replaceAll(\"_\", \" \")}\n </MText>\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n /\n </MText>\n <MText color=\"$text\" fontSize=\"$sm\">\n {isEditing ? displayName : \"New\"}\n </MText>\n </>\n )}\n </XStack>\n\n <XStack justifyContent=\"space-between\" alignItems=\"center\">\n <Heading size=\"$sm\" margin={0}>\n {title}\n </Heading>\n\n {/* Workflow Actions */}\n {isEditing && frm.workflow && (\n <WorkflowActions\n doctype={doctype}\n id={id}\n showState\n onActionComplete={() => frm.refetch()}\n />\n )}\n </XStack>\n\n {/* Validation Errors */}\n {frm.errors && frm.errors.length > 0 && (\n <MStack marginBottom=\"$md\" gap=\"$xs\" position=\"relative\">\n {frm.errors.map((error: string, i: number) => (\n <Card\n key={`${error}-${i}`}\n padding=\"$sm\"\n backgroundColor=\"$error\"\n borderColor=\"$error\"\n borderWidth={1}\n opacity={0.1}\n />\n ))}\n <MStack position=\"absolute\" padding=\"$sm\" gap=\"$xs\">\n {frm.errors.map((error: string, i: number) => (\n <MText key={`${error}-text-${i}`} color=\"$error\" fontSize=\"$sm\">\n {error}\n </MText>\n ))}\n </MStack>\n </MStack>\n )}\n\n {/* Notices */}\n {frm.notices && frm.notices.length > 0 && (\n <MStack marginBottom=\"$md\" gap=\"$sm\">\n {frm.notices.map((notice: string, index: number) => (\n <AlertBanner key={`${notice}-${index}`} message={notice} variant=\"info\" />\n ))}\n </MStack>\n )}\n\n {/* Status Banners */}\n {frm.isLocked && (\n <MStack marginBottom=\"$md\">\n <SubmittedBanner\n docstatus={(Number((frm.doc as any)?.docstatus) === 2 ? 2 : 1) as 1 | 2}\n />\n </MStack>\n )}\n </MStack>\n );\n};\n","/**\n * FormView Page Component\n *\n * Generic form view for any DocType (create/edit).\n */\n\nimport { MStack, XStack, MText, Card, Button } from \"@framework-m/ui\";\nimport { SystemInfo } from \"../components/layout/SystemInfo\";\nimport { useRef, type ReactNode } from \"react\";\nimport { useComponentOverride, useFormController, useFormActions, type Frm } from \"../hooks\";\nimport { FormToolbar } from \"../components/form/FormToolbar\";\nimport { useShell } from \"../hooks/useShell\";\nimport { useUIMeta } from \"../hooks/useUIMeta\";\nimport { useFormKeyboard } from \"../hooks/useFormKeyboard\";\nimport { usePluginApps } from \"@framework-m/plugin-sdk\";\nimport { Slot } from \"../plugins\";\nimport { PageSkeleton } from \"../components/layout/ShellSkeleton\";\nimport { FormBodyLayout } from \"../components/form/FormBodyLayout\";\nimport { FormViewHeader } from \"../components/form/FormViewHeader\";\n\nexport interface FormViewProps {\n doctype?: string;\n id?: string;\n children?: ReactNode;\n}\n\nexport interface StandardFormViewProps {\n doctype: string;\n id?: string;\n frm: Frm;\n meta: any;\n metaLoading: boolean;\n metaError?: Error | null;\n docError?: Error | null;\n record?: any;\n}\n\nexport function FormView({ doctype: propDoctype, id: propId }: Readonly<FormViewProps>) {\n const { doctype, id, frm, schema, metaLoading, metaError, docError, record } = useFormController({\n doctype: propDoctype,\n id: propId,\n });\n\n const CustomComponent = useComponentOverride(doctype, \"FormView\");\n\n const commonProps: StandardFormViewProps = {\n doctype,\n id,\n frm,\n meta: schema,\n metaLoading,\n metaError,\n docError,\n record,\n };\n\n if (CustomComponent) {\n return (\n <CustomComponent {...commonProps}>\n <StandardFormView {...commonProps} />\n </CustomComponent>\n );\n }\n\n return <StandardFormView {...commonProps} />;\n}\n\nfunction StandardFormView({\n doctype,\n id,\n frm,\n meta,\n metaLoading,\n metaError,\n docError,\n record,\n}: StandardFormViewProps) {\n let shell: any = {\n isMobile: false,\n rightSidebarOpen: false,\n setRightSidebarOpen: () => {},\n };\n try {\n shell = useShell();\n } catch (e) {\n // Fallback for isolated tests\n }\n\n let apps: any[] = [];\n try {\n apps = usePluginApps();\n } catch (e) {\n // Fallback for isolated tests\n }\n\n const formRef = useRef<HTMLElement | null>(null);\n useFormKeyboard(formRef);\n\n const { uiMeta } = useUIMeta(doctype);\n\n const {\n handleTouchStart,\n handleTouchEnd,\n printFormatName,\n setPrintFormatName,\n openPrintPreview,\n downloadPrintPdf,\n isEditing,\n isSingleton,\n displayName,\n title,\n appName,\n submitLabel,\n } = useFormActions({\n doctype,\n id,\n frm,\n shell,\n apps,\n });\n\n if (metaLoading) {\n return <PageSkeleton />;\n }\n\n if (metaError) {\n return (\n <MStack padding=\"$xl\" backgroundColor=\"$background\" minHeight=\"100%\">\n <MText color=\"$error\">Error: {metaError.message}</MText>\n </MStack>\n );\n }\n\n if (docError) {\n return (\n <MStack padding=\"$xl\" backgroundColor=\"$background\" minHeight=\"100%\">\n <Card padding=\"$md\" backgroundColor=\"$error\" borderColor=\"$error\" borderWidth={1}>\n <MText color=\"#fff\" role=\"alert\">\n {docError.message || `Failed to load ${doctype}.`}\n </MText>\n </Card>\n </MStack>\n );\n }\n\n return (\n <MStack\n padding=\"$lg\"\n width=\"100%\"\n backgroundColor=\"$background\"\n minHeight=\"100%\"\n onTouchStart={shell.isMobile ? (e: any) => handleTouchStart(e) : undefined}\n onTouchEnd={shell.isMobile ? (e: any) => handleTouchEnd(e) : undefined}\n >\n {/* Contextual Header Area */}\n <FormViewHeader\n appName={appName}\n isSingleton={isSingleton}\n doctype={doctype}\n id={id}\n isEditing={isEditing}\n displayName={displayName}\n title={title}\n frm={frm}\n />\n\n {/* Plugin slot for form header */}\n <Slot name=\"form-header\" doctype={doctype} data={frm.doc} id={id} />\n\n {/* Main Content Area (3-column split) */}\n <XStack width=\"100%\" gap=\"$lg\" alignItems=\"flex-start\" backgroundColor=\"$background\">\n {/* Center Column: The Form */}\n {/* @ts-expect-error — ref bridging */}\n <MStack flex={1} minWidth={0} ref={formRef}>\n {meta && <FormBodyLayout meta={meta} uiMeta={uiMeta} frm={frm} id={id} />}\n\n {/* Plugin slot for form footer */}\n <Slot name=\"form-footer\" doctype={doctype} data={frm.doc} id={id} />\n </MStack>\n\n {/* Right Column: Anchored Actions + System Sidebar */}\n {!shell.isMobile && (\n <MStack width={320} minWidth={280} gap=\"$lg\" style={{ position: \"sticky\", top: 16 }}>\n <FormToolbar\n frm={frm}\n submitLabel={submitLabel}\n isEditing={isEditing}\n printFormatName={printFormatName}\n setPrintFormatName={setPrintFormatName}\n openPrintPreview={openPrintPreview}\n downloadPrintPdf={downloadPrintPdf}\n layout=\"sidebar\"\n />\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={frm.doc} id={id} />\n\n {isEditing && (\n <MStack\n borderLeftWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$backgroundSecondary\"\n paddingLeft=\"$lg\"\n paddingTop=\"$lg\"\n gap=\"$lg\"\n >\n <SystemInfo id={id} record={record} />\n </MStack>\n )}\n </MStack>\n )}\n\n {/* Right Column: System/Audit Sidebar (Mobile Overlay Only) */}\n {shell.isMobile && isEditing && shell.rightSidebarOpen && (\n <MStack\n width=\"80%\"\n maxWidth={320}\n borderLeftWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n paddingLeft=\"$lg\"\n paddingTop=\"$lg\"\n gap=\"$lg\"\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n zIndex={1000}\n elevation={20}\n shadowColor=\"$shadow\"\n shadowRadius={20}\n >\n <XStack justifyContent=\"flex-end\" paddingRight=\"$lg\">\n <Button size=\"sm\" variant=\"ghost\" onPress={() => shell.setRightSidebarOpen(false)}>\n Close ✕\n </Button>\n </XStack>\n\n <SystemInfo id={id} record={record} />\n </MStack>\n )}\n </XStack>\n\n {shell.isMobile && (\n <>\n <FormToolbar\n frm={frm}\n submitLabel={submitLabel}\n isEditing={isEditing}\n printFormatName={printFormatName}\n setPrintFormatName={setPrintFormatName}\n openPrintPreview={openPrintPreview}\n downloadPrintPdf={downloadPrintPdf}\n layout=\"sticky-bottom\"\n />\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={frm.doc} id={id} />\n </>\n )}\n </MStack>\n );\n}\n\nexport default FormView;\n","export const OAUTH_PROVIDERS: Record<string, { label: string; icon: string }> = {\n google: { label: \"Continue with Google\", icon: \"G\" },\n github: { label: \"Continue with GitHub\", icon: \"GH\" },\n microsoft: { label: \"Continue with Microsoft\", icon: \"MS\" },\n rauth: { label: \"Continue with RAuth\", icon: \"RA\" },\n};\n\nexport function resolveConfiguredProviders(): string[] {\n const configGlobal = globalThis as typeof globalThis & {\n __FRAMEWORK_CONFIG__?: {\n auth?: {\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n __FRAMEWORK_OAUTH_PROVIDERS__?: string[];\n };\n\n const injectedProviders = configGlobal.__FRAMEWORK_OAUTH_PROVIDERS__;\n if (Array.isArray(injectedProviders)) {\n return injectedProviders;\n }\n\n const rawProviders = configGlobal.__FRAMEWORK_CONFIG__?.auth?.oauth?.providers;\n if (Array.isArray(rawProviders)) {\n return rawProviders.filter((provider): provider is string => typeof provider === \"string\");\n }\n\n if (rawProviders && typeof rawProviders === \"object\") {\n return Object.keys(rawProviders);\n }\n\n return [];\n}\n","import React from \"react\";\nimport { YStack, Heading } from \"@framework-m/ui\";\n\nexport interface LoginLogoProps {\n logo?: string | React.ReactNode;\n}\n\nexport function LoginLogo({ logo }: LoginLogoProps) {\n if (!logo) {\n return (\n <YStack\n width={48}\n height={48}\n borderRadius=\"$lg\"\n backgroundColor=\"$primary\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Heading color=\"#fff\" fontSize=\"$lg\">\n M\n </Heading>\n </YStack>\n );\n }\n\n if (typeof logo === \"string\") {\n return <img src={logo} alt=\"Logo\" style={{ maxHeight: 48 }} />;\n }\n\n return <>{logo}</>;\n}\n","import React, { useState, useEffect } from \"react\";\n\nimport { useSearchParams } from \"react-router\";\nimport { useLogin } from \"@refinedev/core\";\nimport { YStack, XStack, Card, Input, Button, Heading, Paragraph, useTheme } from \"@framework-m/ui\";\nimport { usePageOverride } from \"../hooks\";\nimport { useMFetch } from \"../hooks/useMFetch\";\n\nimport { OAUTH_PROVIDERS, resolveConfiguredProviders } from \"./loginUtils\";\nimport { LoginLogo } from \"./LoginLogo\";\n\nexport interface LoginPageProps {\n /** Title to display */\n title?: string;\n /** Logo URL or component */\n logo?: string | React.ReactNode;\n /** Redirect URL after login */\n redirectTo?: string;\n}\n\n/**\n * LoginPage Component\n *\n * Refactored using Tamagui for premium aesthetics and cross-platform readiness.\n */\nexport function LoginPage({ ...props }: Readonly<LoginPageProps>) {\n const CustomComponent = usePageOverride(\"LoginPage\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n\n return <StandardLoginPage {...props} />;\n}\n\nfunction StandardLoginPage({\n title = \"Welcome back\",\n logo,\n redirectTo: propRedirectTo,\n}: Readonly<LoginPageProps>) {\n const [searchParams] = useSearchParams();\n const redirectTo = propRedirectTo ?? searchParams.get(\"to\") ?? \"/\";\n\n const { mutate: login, status } = useLogin();\n const [error, setError] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const { theme, toggleTheme } = useTheme();\n const mfetch = useMFetch();\n\n const isLoading = status === \"pending\";\n const [providers, setProviders] = useState<string[]>(resolveConfiguredProviders());\n\n // Discovery loop for development (Vite) where injection is bypassed\n useEffect(() => {\n const fetchProviders = async () => {\n try {\n const response = await mfetch(\"/api/v1/auth/oauth/providers\");\n if (response.ok) {\n const data = await response.json();\n if (data.enabled && Array.isArray(data.providers)) {\n setProviders((prev) => {\n // Merge and deduplicate\n const all = Array.from(new Set([...prev, ...data.providers]));\n return all.sort();\n });\n }\n }\n } catch (err) {\n console.warn(\"OAuth provider discovery failed:\", err);\n }\n };\n\n fetchProviders();\n }, []);\n\n const handleSubmit = (e?: any) => {\n e?.preventDefault();\n setError(null);\n\n login(\n { email, password, redirectTo },\n {\n onSuccess: (result) => {\n if (result && \"success\" in result) {\n if (result.success === false) {\n setError(result.error?.message || \"Invalid credentials\");\n } else {\n // Success: Perform full-page reload to ensure cookies are correctly synchronized\n globalThis.location.href = redirectTo || \"/\";\n }\n }\n },\n onError: (err) => {\n setError(err.message || \"Login failed. Please try again.\");\n },\n }\n );\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSubmit();\n }\n };\n\n return (\n <YStack\n fullscreen\n minHeight=\"100vh\"\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor=\"$background\"\n padding=\"$md\"\n paddingVertical=\"$xl\"\n overflowY=\"auto\"\n className=\"shell-login-container\"\n position=\"relative\"\n style={{\n background:\n theme === \"dark\"\n ? \"radial-gradient(circle at top right, var(--color-sidebar-hover), transparent), radial-gradient(circle at bottom left, var(--color-focus-ring), transparent)\"\n : \"radial-gradient(circle at top right, #f3f4f6, transparent), radial-gradient(circle at bottom left, #e5e7eb, transparent)\",\n }}\n >\n <XStack position=\"absolute\" top=\"$lg\" right=\"$lg\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={toggleTheme}\n borderRadius={100}\n width={40}\n height={40}\n >\n <Heading fontSize=\"$md\" opacity={0.7}>\n {theme === \"dark\" ? \"☀️\" : \"🌙\"}\n </Heading>\n </Button>\n </XStack>\n\n <Card\n width=\"100%\"\n maxWidth={400}\n padding=\"$xl\"\n borderRadius=\"$xl\"\n elevated\n backgroundColor=\"$bg\"\n >\n <YStack alignItems=\"center\" marginBottom=\"$xl\" gap=\"$md\">\n <LoginLogo logo={logo} />\n <YStack alignItems=\"center\" gap=\"$xs\">\n <Heading size=\"$lg\">{title}</Heading>\n <Paragraph color=\"$text-secondary\" fontSize=\"$sm\">\n Sign in to your account\n </Paragraph>\n </YStack>\n </YStack>\n\n {providers.length > 0 && (\n <YStack gap=\"$sm\" marginBottom=\"$lg\">\n {providers.map((provider) => (\n <Button\n key={provider}\n variant=\"default\"\n onClick={() => (globalThis.location.href = `/api/v1/auth/oauth/${provider}/start`)}\n width=\"100%\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Heading fontSize=\"$sm\" opacity={0.7}>\n {OAUTH_PROVIDERS[provider]?.icon || \"ID\"}\n </Heading>\n <Paragraph fontSize=\"$sm\">\n {OAUTH_PROVIDERS[provider]?.label || `Continue with ${provider}`}\n </Paragraph>\n </XStack>\n </Button>\n ))}\n\n <XStack alignItems=\"center\" gap=\"$sm\" marginVertical=\"$sm\">\n <YStack height={1} flex={1} backgroundColor=\"$border\" />\n <Paragraph fontSize=\"$xs\" color=\"$text-muted\">\n or\n </Paragraph>\n <YStack height={1} flex={1} backgroundColor=\"$border\" />\n </XStack>\n </YStack>\n )}\n\n {error && (\n <YStack\n backgroundColor=\"$error-bg\"\n borderColor=\"$error\"\n borderWidth={1}\n borderRadius=\"$md\"\n padding=\"$sm\"\n marginBottom=\"$lg\"\n >\n <Paragraph color=\"$error\" fontSize=\"$sm\">\n {error}\n </Paragraph>\n </YStack>\n )}\n\n <YStack gap=\"$lg\">\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n Email\n </Paragraph>\n <Input\n name=\"email\"\n type=\"email\"\n value={email}\n onChangeText={setEmail}\n required\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n onKeyDown={handleKeyDown}\n />\n </YStack>\n\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n Password\n </Paragraph>\n <Input\n name=\"password\"\n type=\"password\"\n value={password}\n onChangeText={setPassword}\n required\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n onKeyDown={handleKeyDown}\n />\n </YStack>\n\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={isLoading}\n size=\"lg\"\n onPress={() => handleSubmit()}\n >\n {isLoading ? \"Signing in...\" : \"Sign In\"}\n </Button>\n </YStack>\n <YStack marginTop=\"$xl\" alignItems=\"center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n globalThis.location.href = \"/forgot-password\";\n }}\n >\n Forgot password?\n </Button>\n </YStack>\n </Card>\n </YStack>\n );\n}\n\nexport default LoginPage;\n","import type { RealtimeAdapter, RealtimeMessage } from \"../types\";\n\nexport function localRealtimeAdapter(): RealtimeAdapter {\n const channelName = \"frameworkm-realtime\";\n return {\n connect: (onMessage) => {\n if (globalThis.BroadcastChannel === undefined) {\n return undefined;\n }\n const channel = new BroadcastChannel(channelName);\n const handler = (event: MessageEvent<RealtimeMessage>) => {\n if (event.data) {\n onMessage(event.data);\n }\n };\n channel.addEventListener(\"message\", handler);\n return () => {\n channel.removeEventListener(\"message\", handler);\n channel.close();\n };\n },\n publish: (message) => {\n if (globalThis.BroadcastChannel === undefined) {\n return;\n }\n const channel = new BroadcastChannel(channelName);\n channel.postMessage(message);\n channel.close();\n },\n };\n}\n","import { useCallback, useRef } from \"react\";\nimport type { RealtimeAdapter, RealtimeMessage, RealtimeSubscriber } from \"../types\";\nimport { localRealtimeAdapter } from \"../adapters/localRealtimeAdapter\";\n\nfunction removeRoomSubscriber(\n state: Record<string, RealtimeSubscriber[]>,\n room: string,\n listener: RealtimeSubscriber\n): Record<string, RealtimeSubscriber[]> {\n const next = [...(state[room] ?? [])].filter((item) => item !== listener);\n if (next.length > 0) {\n return { ...state, [room]: next };\n }\n const clone = { ...state };\n delete clone[room];\n return clone;\n}\n\nexport function useRealtime(initialAdapter?: RealtimeAdapter) {\n const realtimeAdapterRef = useRef<RealtimeAdapter>(initialAdapter ?? localRealtimeAdapter());\n const disconnectAdapterRef = useRef<(() => void) | null>(null);\n const roomSubscribersRef = useRef<Record<string, RealtimeSubscriber[]>>({});\n\n const dispatchRealtimeMessage = useCallback((message: RealtimeMessage) => {\n const currentSubscribers = roomSubscribersRef.current;\n const roomListeners = currentSubscribers[message.room] ?? [];\n const wildcardListeners = currentSubscribers[\"*\"] ?? [];\n const listeners = [...roomListeners, ...wildcardListeners];\n for (const listener of listeners) {\n listener(message);\n }\n }, []);\n\n const setRealtimeAdapter = useCallback(\n async (adapter: RealtimeAdapter | null) => {\n if (disconnectAdapterRef.current) {\n disconnectAdapterRef.current();\n }\n const nextAdapter = adapter ?? localRealtimeAdapter();\n const maybeDisconnect = await nextAdapter.connect(dispatchRealtimeMessage);\n disconnectAdapterRef.current = maybeDisconnect ?? null;\n realtimeAdapterRef.current = nextAdapter;\n },\n [dispatchRealtimeMessage]\n );\n\n const subscribeRealtime = useCallback((room: string, listener: RealtimeSubscriber) => {\n const current = roomSubscribersRef.current;\n roomSubscribersRef.current = {\n ...current,\n [room]: [...(current[room] ?? []), listener],\n };\n return () => {\n roomSubscribersRef.current = removeRoomSubscriber(roomSubscribersRef.current, room, listener);\n };\n }, []);\n\n const publishRealtime = useCallback(\n async (room: string, type: string, payload: Record<string, unknown>) => {\n const message: RealtimeMessage = {\n room,\n type,\n payload,\n timestamp: Date.now(),\n };\n dispatchRealtimeMessage(message);\n await Promise.resolve(realtimeAdapterRef.current.publish(message));\n },\n [dispatchRealtimeMessage]\n );\n\n return {\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { OmniSearchProvider, OmniSearchResult } from \"../types\";\n\nfunction removeProvider(\n current: OmniSearchProvider[],\n provider: OmniSearchProvider\n): OmniSearchProvider[] {\n return current.filter((item) => item !== provider);\n}\n\nexport function useOmniSearch() {\n const [searchProviders, setSearchProviders] = useState<OmniSearchProvider[]>([]);\n\n const registerOmniSearchProvider = useCallback((provider: OmniSearchProvider) => {\n setSearchProviders((prev) => [...prev, provider]);\n return () => {\n setSearchProviders((prev) => removeProvider(prev, provider));\n };\n }, []);\n\n const searchOmni = useCallback(\n async (query: string) => {\n const trimmed = query.trim();\n if (!trimmed || searchProviders.length === 0) return [];\n\n const resolved = await Promise.all(\n searchProviders.map((provider) => Promise.resolve(provider(trimmed)))\n );\n\n const seen = new Set<string>();\n const merged: OmniSearchResult[] = [];\n for (const providerResults of resolved) {\n for (const result of providerResults) {\n if (seen.has(result.id)) continue;\n seen.add(result.id);\n merged.push(result);\n }\n }\n return merged;\n },\n [searchProviders]\n );\n\n return {\n registerOmniSearchProvider,\n searchOmni,\n };\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport { useMFetch } from \"../../hooks/useMFetch\";\nimport type { ShellSection } from \"../types\";\nimport type { FrameworkMPlugin, NavigationNode } from \"@framework-m/plugin-sdk\";\n\nfunction upsertSection(current: ShellSection[], incoming: ShellSection): ShellSection[] {\n const next: ShellSection[] = [];\n for (const item of current) {\n if (item.id !== incoming.id) {\n next.push(item);\n }\n }\n next.push(incoming);\n return next;\n}\n\nfunction removeSectionById(current: ShellSection[], sectionId: string): ShellSection[] {\n const next: ShellSection[] = [];\n for (const item of current) {\n if (item.id !== sectionId) {\n next.push(item);\n }\n }\n return next;\n}\n\nexport function useSidebarSections(\n initialPlugins: FrameworkMPlugin[] = [],\n isGuestInitial = false\n) {\n const [sections, setSections] = useState<ShellSection[]>([]);\n const [internalIsGuest, setInternalIsGuest] = useState<boolean>(isGuestInitial);\n const [hasPermissionError, setHasPermissionError] = useState<boolean>(false);\n const mfetch = useMFetch();\n\n const registerSection = useCallback((section: ShellSection) => {\n setSections((prev) => upsertSection(prev, section));\n return () => {\n setSections((prev) => removeSectionById(prev, section.id));\n };\n }, []);\n\n const getSections = useCallback(\n (slot: ShellSection[\"slot\"]) =>\n sections\n .filter((section) => section.slot === slot)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999)),\n [sections]\n );\n\n useEffect(() => {\n setHasPermissionError(false);\n }, [typeof window !== \"undefined\" ? window.location.pathname : \"\"]);\n\n useEffect(() => {\n const cleanups: (() => void)[] = [];\n\n const fetchBackendMenu = async () => {\n try {\n const resp = await mfetch(\"/api/meta/doctypes?show_in_desk=true\");\n\n if (resp.status === 401) {\n setInternalIsGuest(true);\n return;\n }\n\n if (resp.status === 403) {\n setHasPermissionError(true);\n setInternalIsGuest(false);\n return;\n }\n\n if (resp.ok) {\n const data = await resp.json();\n setInternalIsGuest(false);\n setHasPermissionError(false);\n\n const authResp = await mfetch(\"/api/v1/auth/me\").catch(() => null);\n if (authResp && authResp.status === 401) {\n setInternalIsGuest(true);\n return;\n }\n\n for (const item of data.doctypes || []) {\n if (!item.show_in_desk || item.is_child_table) continue;\n\n let moduleName = item.module || \"Personnel\";\n if (moduleName.includes(\"core\")) moduleName = \"Core\";\n else if (moduleName.includes(\"standard\")) moduleName = \"Standard\";\n else if (moduleName.includes(\".\")) {\n moduleName =\n moduleName.split(\".\")[0].replace(\"framework_m_\", \"\").charAt(0).toUpperCase() +\n moduleName.split(\".\")[0].replace(\"framework_m_\", \"\").slice(1);\n }\n\n const isSingleton = item.is_singleton || item.metadata?.is_singleton;\n const route = isSingleton\n ? `/app/${item.name}/edit/singleton`\n : `/app/${item.name}/list`;\n\n const cleanup = registerSection({\n id: item.name,\n label:\n item.label ||\n item.metadata?.ui_meta?.label ||\n item.name.replace(/([A-Z])/g, \" $1\").trim(),\n icon: item.metadata?.ui_meta?.icon,\n route: route,\n slot: \"sidebar\",\n module: item.metadata?.ui_meta?.group || moduleName,\n order: item.metadata?.ui_meta?.order || 1000,\n });\n cleanups.push(cleanup);\n }\n }\n } catch (e) {\n console.error(\"Shell: Failed to fetch backend menu\", e);\n }\n };\n fetchBackendMenu();\n\n for (const plugin of initialPlugins) {\n if (plugin.manifests) {\n for (const manifest of plugin.manifests) {\n const registerNodes = (nodes: NavigationNode[], moduleName: string) => {\n for (const node of nodes) {\n const cleanup = registerSection({\n id: node.name,\n label: node.label,\n route: node.route,\n slot: \"sidebar\",\n module: moduleName,\n icon: node.icon,\n order: 1000,\n });\n cleanups.push(cleanup);\n\n if (node.children) {\n registerNodes(node.children, moduleName);\n }\n }\n };\n registerNodes(manifest.resources, manifest.label);\n }\n }\n }\n\n return () => {\n cleanups.forEach((c) => c());\n };\n }, [initialPlugins, registerSection]);\n\n return {\n sections,\n internalIsGuest,\n hasPermissionError,\n registerSection,\n getSections,\n };\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { ShellContext } from \"./context\";\nimport type { ShellContextValue, RealtimeAdapter } from \"./types\";\nimport type { FrameworkMPlugin } from \"@framework-m/plugin-sdk\";\nimport { useRealtime } from \"./hooks/useRealtime\";\nimport { useOmniSearch } from \"./hooks/useOmniSearch\";\nimport { useSidebarSections } from \"./hooks/useSidebarSections\";\n\nexport function ShellProvider({\n children,\n isMobile = false,\n isGuest = false,\n rightSidebarOpen = false,\n setRightSidebarOpen = () => {},\n focusMode,\n setFocusMode,\n realtimeAdapter,\n initialPlugins = [],\n}: Readonly<{\n children: ReactNode;\n isMobile?: boolean;\n isGuest?: boolean;\n rightSidebarOpen?: boolean;\n setRightSidebarOpen?: (value: boolean) => void;\n focusMode: boolean;\n setFocusMode: (value: boolean) => void;\n realtimeAdapter?: RealtimeAdapter;\n initialPlugins?: FrameworkMPlugin[];\n}>) {\n const { setRealtimeAdapter, subscribeRealtime, publishRealtime } = useRealtime(realtimeAdapter);\n const { registerOmniSearchProvider, searchOmni } = useOmniSearch();\n const { internalIsGuest, registerSection, getSections } = useSidebarSections(\n initialPlugins,\n isGuest\n );\n\n const value = useMemo<ShellContextValue>(\n () => ({\n isMobile,\n isGuest: internalIsGuest,\n rightSidebarOpen,\n setRightSidebarOpen,\n focusMode,\n setFocusMode,\n toggleFocusMode: () => setFocusMode(!focusMode),\n registerSection,\n getSections,\n registerOmniSearchProvider,\n searchOmni,\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n }),\n [\n isMobile,\n internalIsGuest,\n rightSidebarOpen,\n setRightSidebarOpen,\n focusMode,\n setFocusMode,\n registerSection,\n getSections,\n registerOmniSearchProvider,\n searchOmni,\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n ]\n );\n\n return <ShellContext.Provider value={value}>{children}</ShellContext.Provider>;\n}\n","import type { RealtimeAdapter, RealtimeMessage } from \"./types\";\n\n/**\n * Creates a WebSocket-based realtime adapter for the Shell.\n *\n * @param url The WebSocket server URL\n * @returns A RealtimeAdapter instance\n */\nexport function createWebSocketRealtimeAdapter(url: string): RealtimeAdapter {\n let socket: WebSocket | null = null;\n\n return {\n connect: (onMessage) => {\n socket = new WebSocket(url);\n const handleMessage = (event: MessageEvent<string>) => {\n try {\n const parsed = JSON.parse(event.data) as RealtimeMessage;\n if (parsed.room && parsed.type) {\n onMessage(parsed);\n }\n } catch {\n // Ignore malformed realtime payloads\n }\n };\n\n socket.addEventListener(\"message\", handleMessage);\n\n return () => {\n if (!socket) return;\n socket.removeEventListener(\"message\", handleMessage);\n socket.close();\n socket = null;\n };\n },\n publish: (message) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(JSON.stringify(message));\n },\n };\n}\n","'use strict';\n\n/** @type {import('./type')} */\nmodule.exports = TypeError;\n","export default {}","var hasMap = typeof Map === 'function' && Map.prototype;\nvar mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;\nvar mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;\nvar mapForEach = hasMap && Map.prototype.forEach;\nvar hasSet = typeof Set === 'function' && Set.prototype;\nvar setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;\nvar setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;\nvar setForEach = hasSet && Set.prototype.forEach;\nvar hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;\nvar weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;\nvar hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;\nvar weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;\nvar hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;\nvar weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;\nvar booleanValueOf = Boolean.prototype.valueOf;\nvar objectToString = Object.prototype.toString;\nvar functionToString = Function.prototype.toString;\nvar $match = String.prototype.match;\nvar $slice = String.prototype.slice;\nvar $replace = String.prototype.replace;\nvar $toUpperCase = String.prototype.toUpperCase;\nvar $toLowerCase = String.prototype.toLowerCase;\nvar $test = RegExp.prototype.test;\nvar $concat = Array.prototype.concat;\nvar $join = Array.prototype.join;\nvar $arrSlice = Array.prototype.slice;\nvar $floor = Math.floor;\nvar bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;\nvar gOPS = Object.getOwnPropertySymbols;\nvar symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;\nvar hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';\n// ie, `has-tostringtag/shams\nvar toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')\n ? Symbol.toStringTag\n : null;\nvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (\n [].__proto__ === Array.prototype // eslint-disable-line no-proto\n ? function (O) {\n return O.__proto__; // eslint-disable-line no-proto\n }\n : null\n);\n\nfunction addNumericSeparator(num, str) {\n if (\n num === Infinity\n || num === -Infinity\n || num !== num\n || (num && num > -1000 && num < 1000)\n || $test.call(/e/, str)\n ) {\n return str;\n }\n var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;\n if (typeof num === 'number') {\n var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)\n if (int !== num) {\n var intStr = String(int);\n var dec = $slice.call(str, intStr.length + 1);\n return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');\n }\n }\n return $replace.call(str, sepRegex, '$&_');\n}\n\nvar utilInspect = require('./util.inspect');\nvar inspectCustom = utilInspect.custom;\nvar inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;\n\nvar quotes = {\n __proto__: null,\n 'double': '\"',\n single: \"'\"\n};\nvar quoteREs = {\n __proto__: null,\n 'double': /([\"\\\\])/g,\n single: /(['\\\\])/g\n};\n\nmodule.exports = function inspect_(obj, options, depth, seen) {\n var opts = options || {};\n\n if (has(opts, 'quoteStyle') && !has(quotes, opts.quoteStyle)) {\n throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');\n }\n if (\n has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'\n ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity\n : opts.maxStringLength !== null\n )\n ) {\n throw new TypeError('option \"maxStringLength\", if provided, must be a positive integer, Infinity, or `null`');\n }\n var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;\n if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {\n throw new TypeError('option \"customInspect\", if provided, must be `true`, `false`, or `\\'symbol\\'`');\n }\n\n if (\n has(opts, 'indent')\n && opts.indent !== null\n && opts.indent !== '\\t'\n && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)\n ) {\n throw new TypeError('option \"indent\" must be \"\\\\t\", an integer > 0, or `null`');\n }\n if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {\n throw new TypeError('option \"numericSeparator\", if provided, must be `true` or `false`');\n }\n var numericSeparator = opts.numericSeparator;\n\n if (typeof obj === 'undefined') {\n return 'undefined';\n }\n if (obj === null) {\n return 'null';\n }\n if (typeof obj === 'boolean') {\n return obj ? 'true' : 'false';\n }\n\n if (typeof obj === 'string') {\n return inspectString(obj, opts);\n }\n if (typeof obj === 'number') {\n if (obj === 0) {\n return Infinity / obj > 0 ? '0' : '-0';\n }\n var str = String(obj);\n return numericSeparator ? addNumericSeparator(obj, str) : str;\n }\n if (typeof obj === 'bigint') {\n var bigIntStr = String(obj) + 'n';\n return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;\n }\n\n var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;\n if (typeof depth === 'undefined') { depth = 0; }\n if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {\n return isArray(obj) ? '[Array]' : '[Object]';\n }\n\n var indent = getIndent(opts, depth);\n\n if (typeof seen === 'undefined') {\n seen = [];\n } else if (indexOf(seen, obj) >= 0) {\n return '[Circular]';\n }\n\n function inspect(value, from, noIndent) {\n if (from) {\n seen = $arrSlice.call(seen);\n seen.push(from);\n }\n if (noIndent) {\n var newOpts = {\n depth: opts.depth\n };\n if (has(opts, 'quoteStyle')) {\n newOpts.quoteStyle = opts.quoteStyle;\n }\n return inspect_(value, newOpts, depth + 1, seen);\n }\n return inspect_(value, opts, depth + 1, seen);\n }\n\n if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable\n var name = nameOf(obj);\n var keys = arrObjKeys(obj, inspect);\n return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');\n }\n if (isSymbol(obj)) {\n var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\\(.*\\))_[^)]*$/, '$1') : symToString.call(obj);\n return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;\n }\n if (isElement(obj)) {\n var s = '<' + $toLowerCase.call(String(obj.nodeName));\n var attrs = obj.attributes || [];\n for (var i = 0; i < attrs.length; i++) {\n s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);\n }\n s += '>';\n if (obj.childNodes && obj.childNodes.length) { s += '...'; }\n s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';\n return s;\n }\n if (isArray(obj)) {\n if (obj.length === 0) { return '[]'; }\n var xs = arrObjKeys(obj, inspect);\n if (indent && !singleLineValues(xs)) {\n return '[' + indentedJoin(xs, indent) + ']';\n }\n return '[ ' + $join.call(xs, ', ') + ' ]';\n }\n if (isError(obj)) {\n var parts = arrObjKeys(obj, inspect);\n if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {\n return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';\n }\n if (parts.length === 0) { return '[' + String(obj) + ']'; }\n return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';\n }\n if (typeof obj === 'object' && customInspect) {\n if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {\n return utilInspect(obj, { depth: maxDepth - depth });\n } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {\n return obj.inspect();\n }\n }\n if (isMap(obj)) {\n var mapParts = [];\n if (mapForEach) {\n mapForEach.call(obj, function (value, key) {\n mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));\n });\n }\n return collectionOf('Map', mapSize.call(obj), mapParts, indent);\n }\n if (isSet(obj)) {\n var setParts = [];\n if (setForEach) {\n setForEach.call(obj, function (value) {\n setParts.push(inspect(value, obj));\n });\n }\n return collectionOf('Set', setSize.call(obj), setParts, indent);\n }\n if (isWeakMap(obj)) {\n return weakCollectionOf('WeakMap');\n }\n if (isWeakSet(obj)) {\n return weakCollectionOf('WeakSet');\n }\n if (isWeakRef(obj)) {\n return weakCollectionOf('WeakRef');\n }\n if (isNumber(obj)) {\n return markBoxed(inspect(Number(obj)));\n }\n if (isBigInt(obj)) {\n return markBoxed(inspect(bigIntValueOf.call(obj)));\n }\n if (isBoolean(obj)) {\n return markBoxed(booleanValueOf.call(obj));\n }\n if (isString(obj)) {\n return markBoxed(inspect(String(obj)));\n }\n // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other\n /* eslint-env browser */\n if (typeof window !== 'undefined' && obj === window) {\n return '{ [object Window] }';\n }\n if (\n (typeof globalThis !== 'undefined' && obj === globalThis)\n || (typeof global !== 'undefined' && obj === global)\n ) {\n return '{ [object globalThis] }';\n }\n if (!isDate(obj) && !isRegExp(obj)) {\n var ys = arrObjKeys(obj, inspect);\n var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;\n var protoTag = obj instanceof Object ? '' : 'null prototype';\n var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';\n var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';\n var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');\n if (ys.length === 0) { return tag + '{}'; }\n if (indent) {\n return tag + '{' + indentedJoin(ys, indent) + '}';\n }\n return tag + '{ ' + $join.call(ys, ', ') + ' }';\n }\n return String(obj);\n};\n\nfunction wrapQuotes(s, defaultStyle, opts) {\n var style = opts.quoteStyle || defaultStyle;\n var quoteChar = quotes[style];\n return quoteChar + s + quoteChar;\n}\n\nfunction quote(s) {\n return $replace.call(String(s), /\"/g, '"');\n}\n\nfunction canTrustToString(obj) {\n return !toStringTag || !(typeof obj === 'object' && (toStringTag in obj || typeof obj[toStringTag] !== 'undefined'));\n}\nfunction isArray(obj) { return toStr(obj) === '[object Array]' && canTrustToString(obj); }\nfunction isDate(obj) { return toStr(obj) === '[object Date]' && canTrustToString(obj); }\nfunction isRegExp(obj) { return toStr(obj) === '[object RegExp]' && canTrustToString(obj); }\nfunction isError(obj) { return toStr(obj) === '[object Error]' && canTrustToString(obj); }\nfunction isString(obj) { return toStr(obj) === '[object String]' && canTrustToString(obj); }\nfunction isNumber(obj) { return toStr(obj) === '[object Number]' && canTrustToString(obj); }\nfunction isBoolean(obj) { return toStr(obj) === '[object Boolean]' && canTrustToString(obj); }\n\n// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives\nfunction isSymbol(obj) {\n if (hasShammedSymbols) {\n return obj && typeof obj === 'object' && obj instanceof Symbol;\n }\n if (typeof obj === 'symbol') {\n return true;\n }\n if (!obj || typeof obj !== 'object' || !symToString) {\n return false;\n }\n try {\n symToString.call(obj);\n return true;\n } catch (e) {}\n return false;\n}\n\nfunction isBigInt(obj) {\n if (!obj || typeof obj !== 'object' || !bigIntValueOf) {\n return false;\n }\n try {\n bigIntValueOf.call(obj);\n return true;\n } catch (e) {}\n return false;\n}\n\nvar hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };\nfunction has(obj, key) {\n return hasOwn.call(obj, key);\n}\n\nfunction toStr(obj) {\n return objectToString.call(obj);\n}\n\nfunction nameOf(f) {\n if (f.name) { return f.name; }\n var m = $match.call(functionToString.call(f), /^function\\s*([\\w$]+)/);\n if (m) { return m[1]; }\n return null;\n}\n\nfunction indexOf(xs, x) {\n if (xs.indexOf) { return xs.indexOf(x); }\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) { return i; }\n }\n return -1;\n}\n\nfunction isMap(x) {\n if (!mapSize || !x || typeof x !== 'object') {\n return false;\n }\n try {\n mapSize.call(x);\n try {\n setSize.call(x);\n } catch (s) {\n return true;\n }\n return x instanceof Map; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakMap(x) {\n if (!weakMapHas || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakMapHas.call(x, weakMapHas);\n try {\n weakSetHas.call(x, weakSetHas);\n } catch (s) {\n return true;\n }\n return x instanceof WeakMap; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakRef(x) {\n if (!weakRefDeref || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakRefDeref.call(x);\n return true;\n } catch (e) {}\n return false;\n}\n\nfunction isSet(x) {\n if (!setSize || !x || typeof x !== 'object') {\n return false;\n }\n try {\n setSize.call(x);\n try {\n mapSize.call(x);\n } catch (m) {\n return true;\n }\n return x instanceof Set; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakSet(x) {\n if (!weakSetHas || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakSetHas.call(x, weakSetHas);\n try {\n weakMapHas.call(x, weakMapHas);\n } catch (s) {\n return true;\n }\n return x instanceof WeakSet; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isElement(x) {\n if (!x || typeof x !== 'object') { return false; }\n if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {\n return true;\n }\n return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';\n}\n\nfunction inspectString(str, opts) {\n if (str.length > opts.maxStringLength) {\n var remaining = str.length - opts.maxStringLength;\n var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');\n return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;\n }\n var quoteRE = quoteREs[opts.quoteStyle || 'single'];\n quoteRE.lastIndex = 0;\n // eslint-disable-next-line no-control-regex\n var s = $replace.call($replace.call(str, quoteRE, '\\\\$1'), /[\\x00-\\x1f]/g, lowbyte);\n return wrapQuotes(s, 'single', opts);\n}\n\nfunction lowbyte(c) {\n var n = c.charCodeAt(0);\n var x = {\n 8: 'b',\n 9: 't',\n 10: 'n',\n 12: 'f',\n 13: 'r'\n }[n];\n if (x) { return '\\\\' + x; }\n return '\\\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));\n}\n\nfunction markBoxed(str) {\n return 'Object(' + str + ')';\n}\n\nfunction weakCollectionOf(type) {\n return type + ' { ? }';\n}\n\nfunction collectionOf(type, size, entries, indent) {\n var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');\n return type + ' (' + size + ') {' + joinedEntries + '}';\n}\n\nfunction singleLineValues(xs) {\n for (var i = 0; i < xs.length; i++) {\n if (indexOf(xs[i], '\\n') >= 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction getIndent(opts, depth) {\n var baseIndent;\n if (opts.indent === '\\t') {\n baseIndent = '\\t';\n } else if (typeof opts.indent === 'number' && opts.indent > 0) {\n baseIndent = $join.call(Array(opts.indent + 1), ' ');\n } else {\n return null;\n }\n return {\n base: baseIndent,\n prev: $join.call(Array(depth + 1), baseIndent)\n };\n}\n\nfunction indentedJoin(xs, indent) {\n if (xs.length === 0) { return ''; }\n var lineJoiner = '\\n' + indent.prev + indent.base;\n return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\\n' + indent.prev;\n}\n\nfunction arrObjKeys(obj, inspect) {\n var isArr = isArray(obj);\n var xs = [];\n if (isArr) {\n xs.length = obj.length;\n for (var i = 0; i < obj.length; i++) {\n xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';\n }\n }\n var syms = typeof gOPS === 'function' ? gOPS(obj) : [];\n var symMap;\n if (hasShammedSymbols) {\n symMap = {};\n for (var k = 0; k < syms.length; k++) {\n symMap['$' + syms[k]] = syms[k];\n }\n }\n\n for (var key in obj) { // eslint-disable-line no-restricted-syntax\n if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {\n // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section\n continue; // eslint-disable-line no-restricted-syntax, no-continue\n } else if ($test.call(/[^\\w$]/, key)) {\n xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));\n } else {\n xs.push(key + ': ' + inspect(obj[key], obj));\n }\n }\n if (typeof gOPS === 'function') {\n for (var j = 0; j < syms.length; j++) {\n if (isEnumerable.call(obj, syms[j])) {\n xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));\n }\n }\n }\n return xs;\n}\n","'use strict';\n\nvar inspect = require('object-inspect');\n\nvar $TypeError = require('es-errors/type');\n\n/*\n* This function traverses the list returning the node corresponding to the given key.\n*\n* That node is also moved to the head of the list, so that if it's accessed again we don't need to traverse the whole list.\n* By doing so, all the recently used nodes can be accessed relatively quickly.\n*/\n/** @type {import('./list.d.ts').listGetNode} */\n// eslint-disable-next-line consistent-return\nvar listGetNode = function (list, key, isDelete) {\n\t/** @type {typeof list | NonNullable<(typeof list)['next']>} */\n\tvar prev = list;\n\t/** @type {(typeof list)['next']} */\n\tvar curr;\n\t// eslint-disable-next-line eqeqeq\n\tfor (; (curr = prev.next) != null; prev = curr) {\n\t\tif (curr.key === key) {\n\t\t\tprev.next = curr.next;\n\t\t\tif (!isDelete) {\n\t\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t\tcurr.next = /** @type {NonNullable<typeof list.next>} */ (list.next);\n\t\t\t\tlist.next = curr; // eslint-disable-line no-param-reassign\n\t\t\t}\n\t\t\treturn curr;\n\t\t}\n\t}\n};\n\n/** @type {import('./list.d.ts').listGet} */\nvar listGet = function (objects, key) {\n\tif (!objects) {\n\t\treturn void undefined;\n\t}\n\tvar node = listGetNode(objects, key);\n\treturn node && node.value;\n};\n/** @type {import('./list.d.ts').listSet} */\nvar listSet = function (objects, key, value) {\n\tvar node = listGetNode(objects, key);\n\tif (node) {\n\t\tnode.value = value;\n\t} else {\n\t\t// Prepend the new node to the beginning of the list\n\t\tobjects.next = /** @type {import('./list.d.ts').ListNode<typeof value, typeof key>} */ ({ // eslint-disable-line no-param-reassign, no-extra-parens\n\t\t\tkey: key,\n\t\t\tnext: objects.next,\n\t\t\tvalue: value\n\t\t});\n\t}\n};\n/** @type {import('./list.d.ts').listHas} */\nvar listHas = function (objects, key) {\n\tif (!objects) {\n\t\treturn false;\n\t}\n\treturn !!listGetNode(objects, key);\n};\n/** @type {import('./list.d.ts').listDelete} */\n// eslint-disable-next-line consistent-return\nvar listDelete = function (objects, key) {\n\tif (objects) {\n\t\treturn listGetNode(objects, key, true);\n\t}\n};\n\n/** @type {import('.')} */\nmodule.exports = function getSideChannelList() {\n\t/** @typedef {ReturnType<typeof getSideChannelList>} Channel */\n\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t/** @type {import('./list.d.ts').RootNode<V, K> | undefined} */ var $o;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\tvar deletedNode = listDelete($o, key);\n\t\t\tif (deletedNode && $o && !$o.next) {\n\t\t\t\t$o = void undefined;\n\t\t\t}\n\t\t\treturn !!deletedNode;\n\t\t},\n\t\tget: function (key) {\n\t\t\treturn listGet($o, key);\n\t\t},\n\t\thas: function (key) {\n\t\t\treturn listHas($o, key);\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$o) {\n\t\t\t\t// Initialize the linked list as an empty node, so that we don't have to special-case handling of the first node: we can always refer to it as (previous node).next, instead of something like (list).head\n\t\t\t\t$o = {\n\t\t\t\t\tnext: void undefined\n\t\t\t\t};\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\tlistSet(/** @type {NonNullable<typeof $o>} */ ($o), key, value);\n\t\t}\n\t};\n\treturn channel;\n};\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Object;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Error;\n","'use strict';\n\n/** @type {import('./eval')} */\nmodule.exports = EvalError;\n","'use strict';\n\n/** @type {import('./range')} */\nmodule.exports = RangeError;\n","'use strict';\n\n/** @type {import('./ref')} */\nmodule.exports = ReferenceError;\n","'use strict';\n\n/** @type {import('./syntax')} */\nmodule.exports = SyntaxError;\n","'use strict';\n\n/** @type {import('./uri')} */\nmodule.exports = URIError;\n","'use strict';\n\n/** @type {import('./abs')} */\nmodule.exports = Math.abs;\n","'use strict';\n\n/** @type {import('./floor')} */\nmodule.exports = Math.floor;\n","'use strict';\n\n/** @type {import('./max')} */\nmodule.exports = Math.max;\n","'use strict';\n\n/** @type {import('./min')} */\nmodule.exports = Math.min;\n","'use strict';\n\n/** @type {import('./pow')} */\nmodule.exports = Math.pow;\n","'use strict';\n\n/** @type {import('./round')} */\nmodule.exports = Math.round;\n","'use strict';\n\n/** @type {import('./isNaN')} */\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n","'use strict';\n\nvar $isNaN = require('./isNaN');\n\n/** @type {import('./sign')} */\nmodule.exports = function sign(number) {\n\tif ($isNaN(number) || number === 0) {\n\t\treturn number;\n\t}\n\treturn number < 0 ? -1 : +1;\n};\n","'use strict';\n\n/** @type {import('./gOPD')} */\nmodule.exports = Object.getOwnPropertyDescriptor;\n","'use strict';\n\n/** @type {import('.')} */\nvar $gOPD = require('./gOPD');\n\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n","'use strict';\n\n/** @type {import('.')} */\nvar $defineProperty = Object.defineProperty || false;\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = false;\n\t}\n}\n\nmodule.exports = $defineProperty;\n","'use strict';\n\n/** @type {import('./shams')} */\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\t/** @type {{ [k in symbol]?: unknown }} */\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\t// eslint-disable-next-line no-extra-parens\n\t\tvar descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/** @type {import('./Reflect.getPrototypeOf')} */\nmodule.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;\n","'use strict';\n\nvar $Object = require('es-object-atoms');\n\n/** @type {import('./Object.getPrototypeOf')} */\nmodule.exports = $Object.getPrototypeOf || null;\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar toStr = Object.prototype.toString;\nvar max = Math.max;\nvar funcType = '[object Function]';\n\nvar concatty = function concatty(a, b) {\n var arr = [];\n\n for (var i = 0; i < a.length; i += 1) {\n arr[i] = a[i];\n }\n for (var j = 0; j < b.length; j += 1) {\n arr[j + a.length] = b[j];\n }\n\n return arr;\n};\n\nvar slicy = function slicy(arrLike, offset) {\n var arr = [];\n for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {\n arr[j] = arrLike[i];\n }\n return arr;\n};\n\nvar joiny = function (arr, joiner) {\n var str = '';\n for (var i = 0; i < arr.length; i += 1) {\n str += arr[i];\n if (i + 1 < arr.length) {\n str += joiner;\n }\n }\n return str;\n};\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.apply(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slicy(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n concatty(args, arguments)\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n }\n return target.apply(\n that,\n concatty(args, arguments)\n );\n\n };\n\n var boundLength = max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs[i] = '$' + i;\n }\n\n bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\n/** @type {import('./functionCall')} */\nmodule.exports = Function.prototype.call;\n","'use strict';\n\n/** @type {import('./functionApply')} */\nmodule.exports = Function.prototype.apply;\n","'use strict';\n\n/** @type {import('./reflectApply')} */\nmodule.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;\n","'use strict';\n\nvar bind = require('function-bind');\n\nvar $apply = require('./functionApply');\nvar $call = require('./functionCall');\nvar $reflectApply = require('./reflectApply');\n\n/** @type {import('./actualApply')} */\nmodule.exports = $reflectApply || bind.call($call, $apply);\n","'use strict';\n\nvar bind = require('function-bind');\nvar $TypeError = require('es-errors/type');\n\nvar $call = require('./functionCall');\nvar $actualApply = require('./actualApply');\n\n/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */\nmodule.exports = function callBindBasic(args) {\n\tif (args.length < 1 || typeof args[0] !== 'function') {\n\t\tthrow new $TypeError('a function is required');\n\t}\n\treturn $actualApply(bind, $call, args);\n};\n","'use strict';\n\nvar callBind = require('call-bind-apply-helpers');\nvar gOPD = require('gopd');\n\nvar hasProtoAccessor;\ntry {\n\t// eslint-disable-next-line no-extra-parens, no-proto\n\thasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;\n} catch (e) {\n\tif (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {\n\t\tthrow e;\n\t}\n}\n\n// eslint-disable-next-line no-extra-parens\nvar desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));\n\nvar $Object = Object;\nvar $getPrototypeOf = $Object.getPrototypeOf;\n\n/** @type {import('./get')} */\nmodule.exports = desc && typeof desc.get === 'function'\n\t? callBind([desc.get])\n\t: typeof $getPrototypeOf === 'function'\n\t\t? /** @type {import('./get')} */ function getDunder(value) {\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\treturn $getPrototypeOf(value == null ? value : $Object(value));\n\t\t}\n\t\t: false;\n","'use strict';\n\nvar reflectGetProto = require('./Reflect.getPrototypeOf');\nvar originalGetProto = require('./Object.getPrototypeOf');\n\nvar getDunderProto = require('dunder-proto/get');\n\n/** @type {import('.')} */\nmodule.exports = reflectGetProto\n\t? function getProto(O) {\n\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\treturn reflectGetProto(O);\n\t}\n\t: originalGetProto\n\t\t? function getProto(O) {\n\t\t\tif (!O || (typeof O !== 'object' && typeof O !== 'function')) {\n\t\t\t\tthrow new TypeError('getProto: not an object');\n\t\t\t}\n\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\treturn originalGetProto(O);\n\t\t}\n\t\t: getDunderProto\n\t\t\t? function getProto(O) {\n\t\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\t\treturn getDunderProto(O);\n\t\t\t}\n\t\t\t: null;\n","'use strict';\n\nvar call = Function.prototype.call;\nvar $hasOwn = Object.prototype.hasOwnProperty;\nvar bind = require('function-bind');\n\n/** @type {import('.')} */\nmodule.exports = bind.call(call, $hasOwn);\n","'use strict';\n\nvar undefined;\n\nvar $Object = require('es-object-atoms');\n\nvar $Error = require('es-errors');\nvar $EvalError = require('es-errors/eval');\nvar $RangeError = require('es-errors/range');\nvar $ReferenceError = require('es-errors/ref');\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\nvar $URIError = require('es-errors/uri');\n\nvar abs = require('math-intrinsics/abs');\nvar floor = require('math-intrinsics/floor');\nvar max = require('math-intrinsics/max');\nvar min = require('math-intrinsics/min');\nvar pow = require('math-intrinsics/pow');\nvar round = require('math-intrinsics/round');\nvar sign = require('math-intrinsics/sign');\n\nvar $Function = Function;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = require('gopd');\nvar $defineProperty = require('es-define-property');\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = require('get-proto');\nvar $ObjectGPO = require('get-proto/Object.getPrototypeOf');\nvar $ReflectGPO = require('get-proto/Reflect.getPrototypeOf');\n\nvar $apply = require('call-bind-apply-helpers/functionApply');\nvar $call = require('call-bind-apply-helpers/functionCall');\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t__proto__: null,\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,\n\t'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': $Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': $EvalError,\n\t'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': $Object,\n\t'%Object.getOwnPropertyDescriptor%': $gOPD,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': $RangeError,\n\t'%ReferenceError%': $ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': $URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\n\t'%Function.prototype.call%': $call,\n\t'%Function.prototype.apply%': $apply,\n\t'%Object.defineProperty%': $defineProperty,\n\t'%Object.getPrototypeOf%': $ObjectGPO,\n\t'%Math.abs%': abs,\n\t'%Math.floor%': floor,\n\t'%Math.max%': max,\n\t'%Math.min%': min,\n\t'%Math.pow%': pow,\n\t'%Math.round%': round,\n\t'%Math.sign%': sign,\n\t'%Reflect.getPrototypeOf%': $ReflectGPO\n};\n\nif (getProto) {\n\ttry {\n\t\tnull.error; // eslint-disable-line no-unused-expressions\n\t} catch (e) {\n\t\t// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229\n\t\tvar errorProto = getProto(getProto(e));\n\t\tINTRINSICS['%Error.prototype%'] = errorProto;\n\t}\n}\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen && getProto) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t__proto__: null,\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('hasown');\nvar $concat = bind.call($call, Array.prototype.concat);\nvar $spliceApply = bind.call($apply, Array.prototype.splice);\nvar $replace = bind.call($call, String.prototype.replace);\nvar $strSlice = bind.call($call, String.prototype.slice);\nvar $exec = bind.call($call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBindBasic = require('call-bind-apply-helpers');\n\n/** @type {(thisArg: string, searchString: string, position?: number) => number} */\nvar $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]);\n\n/** @type {import('.')} */\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\t/* eslint no-extra-parens: 0 */\n\n\tvar intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing));\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBindBasic(/** @type {const} */ ([intrinsic]));\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar callBound = require('call-bound');\nvar inspect = require('object-inspect');\n\nvar $TypeError = require('es-errors/type');\nvar $Map = GetIntrinsic('%Map%', true);\n\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => V} */\nvar $mapGet = callBound('Map.prototype.get', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K, value: V) => void} */\nvar $mapSet = callBound('Map.prototype.set', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => boolean} */\nvar $mapHas = callBound('Map.prototype.has', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => boolean} */\nvar $mapDelete = callBound('Map.prototype.delete', true);\n/** @type {<K, V>(thisArg: Map<K, V>) => number} */\nvar $mapSize = callBound('Map.prototype.size', true);\n\n/** @type {import('.')} */\nmodule.exports = !!$Map && /** @type {Exclude<import('.'), false>} */ function getSideChannelMap() {\n\t/** @typedef {ReturnType<typeof getSideChannelMap>} Channel */\n\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t/** @type {Map<K, V> | undefined} */ var $m;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\tif ($m) {\n\t\t\t\tvar result = $mapDelete($m, key);\n\t\t\t\tif ($mapSize($m) === 0) {\n\t\t\t\t\t$m = void undefined;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tget: function (key) { // eslint-disable-line consistent-return\n\t\t\tif ($m) {\n\t\t\t\treturn $mapGet($m, key);\n\t\t\t}\n\t\t},\n\t\thas: function (key) {\n\t\t\tif ($m) {\n\t\t\t\treturn $mapHas($m, key);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$m) {\n\t\t\t\t// @ts-expect-error TS can't handle narrowing a variable inside a closure\n\t\t\t\t$m = new $Map();\n\t\t\t}\n\t\t\t$mapSet($m, key, value);\n\t\t}\n\t};\n\n\t// @ts-expect-error TODO: figure out why TS is erroring here\n\treturn channel;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar callBound = require('call-bound');\nvar inspect = require('object-inspect');\nvar getSideChannelMap = require('side-channel-map');\n\nvar $TypeError = require('es-errors/type');\nvar $WeakMap = GetIntrinsic('%WeakMap%', true);\n\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => V} */\nvar $weakMapGet = callBound('WeakMap.prototype.get', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K, value: V) => void} */\nvar $weakMapSet = callBound('WeakMap.prototype.set', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => boolean} */\nvar $weakMapHas = callBound('WeakMap.prototype.has', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => boolean} */\nvar $weakMapDelete = callBound('WeakMap.prototype.delete', true);\n\n/** @type {import('.')} */\nmodule.exports = $WeakMap\n\t? /** @type {Exclude<import('.'), false>} */ function getSideChannelWeakMap() {\n\t\t/** @typedef {ReturnType<typeof getSideChannelWeakMap>} Channel */\n\t\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t\t/** @type {WeakMap<K & object, V> | undefined} */ var $wm;\n\t\t/** @type {Channel | undefined} */ var $m;\n\n\t\t/** @type {Channel} */\n\t\tvar channel = {\n\t\t\tassert: function (key) {\n\t\t\t\tif (!channel.has(key)) {\n\t\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t\t}\n\t\t\t},\n\t\t\t'delete': function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapDelete($wm, key);\n\t\t\t\t\t}\n\t\t\t\t} else if (getSideChannelMap) {\n\t\t\t\t\tif ($m) {\n\t\t\t\t\t\treturn $m['delete'](key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tget: function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapGet($wm, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $m && $m.get(key);\n\t\t\t},\n\t\t\thas: function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapHas($wm, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn !!$m && $m.has(key);\n\t\t\t},\n\t\t\tset: function (key, value) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif (!$wm) {\n\t\t\t\t\t\t$wm = new $WeakMap();\n\t\t\t\t\t}\n\t\t\t\t\t$weakMapSet($wm, key, value);\n\t\t\t\t} else if (getSideChannelMap) {\n\t\t\t\t\tif (!$m) {\n\t\t\t\t\t\t$m = getSideChannelMap();\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t\t\t/** @type {NonNullable<typeof $m>} */ ($m).set(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// @ts-expect-error TODO: figure out why this is erroring\n\t\treturn channel;\n\t}\n\t: getSideChannelMap;\n","'use strict';\n\nvar $TypeError = require('es-errors/type');\nvar inspect = require('object-inspect');\nvar getSideChannelList = require('side-channel-list');\nvar getSideChannelMap = require('side-channel-map');\nvar getSideChannelWeakMap = require('side-channel-weakmap');\n\nvar makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;\n\n/** @type {import('.')} */\nmodule.exports = function getSideChannel() {\n\t/** @typedef {ReturnType<typeof getSideChannel>} Channel */\n\n\t/** @type {Channel | undefined} */ var $channelData;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\treturn !!$channelData && $channelData['delete'](key);\n\t\t},\n\t\tget: function (key) {\n\t\t\treturn $channelData && $channelData.get(key);\n\t\t},\n\t\thas: function (key) {\n\t\t\treturn !!$channelData && $channelData.has(key);\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$channelData) {\n\t\t\t\t$channelData = makeChannel();\n\t\t\t}\n\n\t\t\t$channelData.set(key, value);\n\t\t}\n\t};\n\t// @ts-expect-error TODO: figure out why this is erroring\n\treturn channel;\n};\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nvar Format = {\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n\nmodule.exports = {\n 'default': Format.RFC3986,\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return String(value);\n }\n },\n RFC1738: Format.RFC1738,\n RFC3986: Format.RFC3986\n};\n","'use strict';\n\nvar formats = require('./formats');\nvar getSideChannel = require('side-channel');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\n// Track objects created from arrayLimit overflow using side-channel\n// Stores the current max numeric index for O(1) lookup\nvar overflowChannel = getSideChannel();\n\nvar markOverflow = function markOverflow(obj, maxIndex) {\n overflowChannel.set(obj, maxIndex);\n return obj;\n};\n\nvar isOverflow = function isOverflow(obj) {\n return overflowChannel.has(obj);\n};\n\nvar getMaxIndex = function getMaxIndex(obj) {\n return overflowChannel.get(obj);\n};\n\nvar setMaxIndex = function setMaxIndex(obj, maxIndex) {\n overflowChannel.set(obj, maxIndex);\n};\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array[array.length] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n while (queue.length > 1) {\n var item = queue.pop();\n var obj = item.obj[item.prop];\n\n if (isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted[compacted.length] = obj[j];\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? { __proto__: null } : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n /* eslint no-param-reassign: 0 */\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object' && typeof source !== 'function') {\n if (isArray(target)) {\n var nextIndex = target.length;\n if (options && typeof options.arrayLimit === 'number' && nextIndex > options.arrayLimit) {\n return markOverflow(arrayToObject(target.concat(source), options), nextIndex);\n }\n target[nextIndex] = source;\n } else if (target && typeof target === 'object') {\n if (isOverflow(target)) {\n // Add at next numeric index for overflow objects\n var newIndex = getMaxIndex(target) + 1;\n target[newIndex] = source;\n setMaxIndex(target, newIndex);\n } else if (options && options.strictMerge) {\n return [target, source];\n } else if (\n (options && (options.plainObjects || options.allowPrototypes))\n || !has.call(Object.prototype, source)\n ) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (!target || typeof target !== 'object') {\n if (isOverflow(source)) {\n // Create new object with target at 0, source values shifted by 1\n var sourceKeys = Object.keys(source);\n var result = options && options.plainObjects\n ? { __proto__: null, 0: target }\n : { 0: target };\n for (var m = 0; m < sourceKeys.length; m++) {\n var oldKey = parseInt(sourceKeys[m], 10);\n result[oldKey + 1] = source[sourceKeys[m]];\n }\n return markOverflow(result, getMaxIndex(source) + 1);\n }\n var combined = [target].concat(source);\n if (options && typeof options.arrayLimit === 'number' && combined.length > options.arrayLimit) {\n return markOverflow(arrayToObject(combined, options), combined.length - 1);\n }\n return combined;\n }\n\n var mergeTarget = target;\n if (isArray(target) && !isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (isArray(target) && isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n var targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n } else {\n target[target.length] = item;\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n\n if (isOverflow(source) && !isOverflow(acc)) {\n markOverflow(acc, getMaxIndex(source));\n }\n if (isOverflow(acc)) {\n var keyNum = parseInt(key, 10);\n if (String(keyNum) === key && keyNum >= 0 && keyNum > getMaxIndex(acc)) {\n setMaxIndex(acc, keyNum);\n }\n }\n\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str, defaultDecoder, charset) {\n var strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n } catch (e) {\n return strWithoutPlus;\n }\n};\n\nvar limit = 1024;\n\n/* eslint operator-linebreak: [2, \"before\"] */\n\nvar encode = function encode(str, defaultEncoder, charset, kind, format) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n } else if (typeof str !== 'string') {\n string = String(str);\n }\n\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n\n var out = '';\n for (var j = 0; j < string.length; j += limit) {\n var segment = string.length >= limit ? string.slice(j, j + limit) : string;\n var arr = [];\n\n for (var i = 0; i < segment.length; ++i) {\n var c = segment.charCodeAt(i);\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n ) {\n arr[arr.length] = segment.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n arr[arr.length] = hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n arr[arr.length] = hexTable[0xC0 | (c >> 6)]\n + hexTable[0x80 | (c & 0x3F)];\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n arr[arr.length] = hexTable[0xE0 | (c >> 12)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF));\n\n arr[arr.length] = hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n out += arr.join('');\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue[queue.length] = { obj: obj, prop: key };\n refs[refs.length] = val;\n }\n }\n }\n\n compactQueue(queue);\n\n return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b, arrayLimit, plainObjects) {\n // If 'a' is already an overflow object, add to it\n if (isOverflow(a)) {\n var newIndex = getMaxIndex(a) + 1;\n a[newIndex] = b;\n setMaxIndex(a, newIndex);\n return a;\n }\n\n var result = [].concat(a, b);\n if (result.length > arrayLimit) {\n return markOverflow(arrayToObject(result, { plainObjects: plainObjects }), result.length - 1);\n }\n return result;\n};\n\nvar maybeMap = function maybeMap(val, fn) {\n if (isArray(val)) {\n var mapped = [];\n for (var i = 0; i < val.length; i += 1) {\n mapped[mapped.length] = fn(val[i]);\n }\n return mapped;\n }\n return fn(val);\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n combine: combine,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isOverflow: isOverflow,\n isRegExp: isRegExp,\n markOverflow: markOverflow,\n maybeMap: maybeMap,\n merge: merge\n};\n","'use strict';\n\nvar getSideChannel = require('side-channel');\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) {\n return prefix + '[]';\n },\n comma: 'comma',\n indices: function indices(prefix, key) {\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) {\n return prefix;\n }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaultFormat = formats['default'];\nvar defaults = {\n addQueryPrefix: false,\n allowDots: false,\n allowEmptyArrays: false,\n arrayFormat: 'indices',\n charset: 'utf-8',\n charsetSentinel: false,\n commaRoundTrip: false,\n delimiter: '&',\n encode: true,\n encodeDotInKeys: false,\n encoder: utils.encode,\n encodeValuesOnly: false,\n filter: void undefined,\n format: defaultFormat,\n formatter: formats.formatters[defaultFormat],\n // deprecated\n indices: false,\n serializeDate: function serializeDate(date) {\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar isNonNullishPrimitive = function isNonNullishPrimitive(v) {\n return typeof v === 'string'\n || typeof v === 'number'\n || typeof v === 'boolean'\n || typeof v === 'symbol'\n || typeof v === 'bigint';\n};\n\nvar sentinel = {};\n\nvar stringify = function stringify(\n object,\n prefix,\n generateArrayPrefix,\n commaRoundTrip,\n allowEmptyArrays,\n strictNullHandling,\n skipNulls,\n encodeDotInKeys,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n format,\n formatter,\n encodeValuesOnly,\n charset,\n sideChannel\n) {\n var obj = object;\n\n var tmpSc = sideChannel;\n var step = 0;\n var findFlag = false;\n while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {\n // Where object last appeared in the ref tree\n var pos = tmpSc.get(object);\n step += 1;\n if (typeof pos !== 'undefined') {\n if (pos === step) {\n throw new RangeError('Cyclic object value');\n } else {\n findFlag = true; // Break while\n }\n }\n if (typeof tmpSc.get(sentinel) === 'undefined') {\n step = 0;\n }\n }\n\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n obj = utils.maybeMap(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate(value);\n }\n return value;\n });\n }\n\n if (obj === null) {\n if (strictNullHandling) {\n return formatter(encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix);\n }\n\n obj = '';\n }\n\n if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (generateArrayPrefix === 'comma' && isArray(obj)) {\n // we need to join elements in\n if (encodeValuesOnly && encoder) {\n obj = utils.maybeMap(obj, function (v) {\n return v == null ? v : encoder(v);\n });\n }\n objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n } else if (isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n var encodedPrefix = encodeDotInKeys ? String(prefix).replace(/\\./g, '%2E') : String(prefix);\n\n var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix;\n\n if (allowEmptyArrays && isArray(obj) && obj.length === 0) {\n return adjustedPrefix + '[]';\n }\n\n for (var j = 0; j < objKeys.length; ++j) {\n var key = objKeys[j];\n var value = typeof key === 'object' && key && typeof key.value !== 'undefined'\n ? key.value\n : obj[key];\n\n if (skipNulls && value === null) {\n continue;\n }\n\n var encodedKey = allowDots && encodeDotInKeys ? String(key).replace(/\\./g, '%2E') : String(key);\n var keyPrefix = isArray(obj)\n ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix\n : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']');\n\n sideChannel.set(object, step);\n var valueSideChannel = getSideChannel();\n valueSideChannel.set(sentinel, sideChannel);\n pushToArray(values, stringify(\n value,\n keyPrefix,\n generateArrayPrefix,\n commaRoundTrip,\n allowEmptyArrays,\n strictNullHandling,\n skipNulls,\n encodeDotInKeys,\n generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n format,\n formatter,\n encodeValuesOnly,\n charset,\n valueSideChannel\n ));\n }\n\n return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n\n if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {\n throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n\n if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n var format = formats['default'];\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formats.formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n var formatter = formats.formatters[format];\n\n var filter = defaults.filter;\n if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n filter = opts.filter;\n }\n\n var arrayFormat;\n if (opts.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = opts.arrayFormat;\n } else if ('indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = defaults.arrayFormat;\n }\n\n if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {\n throw new TypeError('`commaRoundTrip` must be a boolean, or absent');\n }\n\n var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;\n\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n arrayFormat: arrayFormat,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n commaRoundTrip: !!opts.commaRoundTrip,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n format: format,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = normalizeStringifyOptions(opts);\n\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat];\n var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (options.sort) {\n objKeys.sort(options.sort);\n }\n\n var sideChannel = getSideChannel();\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (typeof key === 'undefined' || key === null) {\n continue;\n }\n\n var value = obj[key];\n\n if (options.skipNulls && value === null) {\n continue;\n }\n pushToArray(keys, stringify(\n value,\n key,\n generateArrayPrefix,\n commaRoundTrip,\n options.allowEmptyArrays,\n options.strictNullHandling,\n options.skipNulls,\n options.encodeDotInKeys,\n options.encode ? options.encoder : null,\n options.filter,\n options.sort,\n options.allowDots,\n options.serializeDate,\n options.format,\n options.formatter,\n options.encodeValuesOnly,\n options.charset,\n sideChannel\n ));\n }\n\n var joined = keys.join(options.delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B' + options.delimiter;\n } else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93' + options.delimiter;\n }\n }\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar defaults = {\n allowDots: false,\n allowEmptyArrays: false,\n allowPrototypes: false,\n allowSparse: false,\n arrayLimit: 20,\n charset: 'utf-8',\n charsetSentinel: false,\n comma: false,\n decodeDotInKeys: false,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n duplicates: 'combine',\n ignoreQueryPrefix: false,\n interpretNumericEntities: false,\n parameterLimit: 1000,\n parseArrays: true,\n plainObjects: false,\n strictDepth: false,\n strictMerge: true,\n strictNullHandling: false,\n throwOnLimitExceeded: false\n};\n\nvar interpretNumericEntities = function (str) {\n return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n return String.fromCharCode(parseInt(numberStr, 10));\n });\n};\n\nvar parseArrayValue = function (val, options, currentArrayLength) {\n if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {\n return val.split(',');\n }\n\n if (options.throwOnLimitExceeded && currentArrayLength >= options.arrayLimit) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n }\n\n return val;\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = { __proto__: null };\n\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n cleanStr = cleanStr.replace(/%5B/gi, '[').replace(/%5D/gi, ']');\n\n var limit = options.parameterLimit === Infinity ? void undefined : options.parameterLimit;\n var parts = cleanStr.split(\n options.delimiter,\n options.throwOnLimitExceeded && typeof limit !== 'undefined' ? limit + 1 : limit\n );\n\n if (options.throwOnLimitExceeded && typeof limit !== 'undefined' && parts.length > limit) {\n throw new RangeError('Parameter limit exceeded. Only ' + limit + ' parameter' + (limit === 1 ? '' : 's') + ' allowed.');\n }\n\n var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n var i;\n\n var charset = options.charset;\n if (options.charsetSentinel) {\n for (i = 0; i < parts.length; ++i) {\n if (parts[i].indexOf('utf8=') === 0) {\n if (parts[i] === charsetSentinel) {\n charset = 'utf-8';\n } else if (parts[i] === isoSentinel) {\n charset = 'iso-8859-1';\n }\n skipIndex = i;\n i = parts.length; // The eslint settings do not allow break;\n }\n }\n }\n\n for (i = 0; i < parts.length; ++i) {\n if (i === skipIndex) {\n continue;\n }\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key;\n var val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder, charset, 'key');\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');\n\n if (key !== null) {\n val = utils.maybeMap(\n parseArrayValue(\n part.slice(pos + 1),\n options,\n isArray(obj[key]) ? obj[key].length : 0\n ),\n function (encodedVal) {\n return options.decoder(encodedVal, defaults.decoder, charset, 'value');\n }\n );\n }\n }\n\n if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n val = interpretNumericEntities(String(val));\n }\n\n if (part.indexOf('[]=') > -1) {\n val = isArray(val) ? [val] : val;\n }\n\n if (options.comma && isArray(val) && val.length > options.arrayLimit) {\n if (options.throwOnLimitExceeded) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n }\n val = utils.combine([], val, options.arrayLimit, options.plainObjects);\n }\n\n if (key !== null) {\n var existing = has.call(obj, key);\n if (existing && (options.duplicates === 'combine' || part.indexOf('[]=') > -1)) {\n obj[key] = utils.combine(\n obj[key],\n val,\n options.arrayLimit,\n options.plainObjects\n );\n } else if (!existing || options.duplicates === 'last') {\n obj[key] = val;\n }\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options, valuesParsed) {\n var currentArrayLength = 0;\n if (chain.length > 0 && chain[chain.length - 1] === '[]') {\n var parentKey = chain.slice(0, -1).join('');\n currentArrayLength = Array.isArray(val) && val[parentKey] ? val[parentKey].length : 0;\n }\n\n var leaf = valuesParsed ? val : parseArrayValue(val, options, currentArrayLength);\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]' && options.parseArrays) {\n if (utils.isOverflow(leaf)) {\n // leaf is already an overflow object, preserve it\n obj = leaf;\n } else {\n obj = options.allowEmptyArrays && (leaf === '' || (options.strictNullHandling && leaf === null))\n ? []\n : utils.combine(\n [],\n leaf,\n options.arrayLimit,\n options.plainObjects\n );\n }\n } else {\n obj = options.plainObjects ? { __proto__: null } : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot;\n var index = parseInt(decodedRoot, 10);\n var isValidArrayIndex = !isNaN(index)\n && root !== decodedRoot\n && String(index) === decodedRoot\n && index >= 0\n && options.parseArrays;\n if (!options.parseArrays && decodedRoot === '') {\n obj = { 0: leaf };\n } else if (isValidArrayIndex && index < options.arrayLimit) {\n obj = [];\n obj[index] = leaf;\n } else if (isValidArrayIndex && options.throwOnLimitExceeded) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n } else if (isValidArrayIndex) {\n obj[index] = leaf;\n utils.markOverflow(obj, index);\n } else if (decodedRoot !== '__proto__') {\n obj[decodedRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\n// Split a key like \"a[b][c[]]\" into ['a', '[b]', '[c[]]'] while preserving\n// qs parse semantics for depth/prototype guards.\nvar splitKeyIntoSegments = function splitKeyIntoSegments(originalKey, options) {\n var key = options.allowDots ? originalKey.replace(/\\.([^.[]+)/g, '[$1]') : originalKey;\n\n // depth <= 0 keeps the whole key as one segment\n if (options.depth <= 0) {\n if (!options.plainObjects && has.call(Object.prototype, key)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n return [key];\n }\n\n var segments = [];\n\n // parent before the first '[' (may be empty if key starts with '[')\n var first = key.indexOf('[');\n var parent = first >= 0 ? key.slice(0, first) : key;\n if (parent) {\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n segments[segments.length] = parent;\n }\n\n var n = key.length;\n var open = first;\n var collected = 0;\n\n while (open >= 0 && collected < options.depth) {\n var level = 1;\n var i = open + 1;\n var close = -1;\n\n // balance nested '[' and ']' inside this bracket group using a nesting level counter\n while (i < n && close < 0) {\n var cu = key.charCodeAt(i);\n if (cu === 0x5B) { // '['\n level += 1;\n } else if (cu === 0x5D) { // ']'\n level -= 1;\n if (level === 0) {\n close = i; // found matching close; loop will exit by condition\n }\n }\n i += 1;\n }\n\n if (close < 0) {\n // Unterminated group: wrap the raw remainder in one bracket pair so it stays\n // a single literal segment (e.g. \"[[]b\" -> \"[[]b]\"); we do not infer missing ']'.\n segments[segments.length] = '[' + key.slice(open) + ']';\n return segments;\n }\n\n var seg = key.slice(open, close + 1);\n // prototype guard for the content of this group\n var content = seg.slice(1, -1);\n if (!options.plainObjects && has.call(Object.prototype, content) && !options.allowPrototypes) {\n return;\n }\n\n segments[segments.length] = seg;\n collected += 1;\n\n // find the next '[' after this balanced group\n open = key.indexOf('[', close + 1);\n }\n\n if (open >= 0) {\n if (options.strictDepth === true) {\n throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');\n }\n\n segments[segments.length] = '[' + key.slice(open) + ']';\n }\n\n return segments;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {\n if (!givenKey) {\n return;\n }\n\n var keys = splitKeyIntoSegments(givenKey, options);\n\n if (!keys) {\n return;\n }\n\n return parseObject(keys, val, options, valuesParsed);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n\n if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') {\n throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n\n if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n if (typeof opts.throwOnLimitExceeded !== 'undefined' && typeof opts.throwOnLimitExceeded !== 'boolean') {\n throw new TypeError('`throwOnLimitExceeded` option must be a boolean');\n }\n\n var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates;\n\n if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') {\n throw new TypeError('The duplicates option must be either combine, first, or last');\n }\n\n var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;\n\n return {\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,\n arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys,\n decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n // eslint-disable-next-line no-implicit-coercion, no-extra-parens\n depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,\n duplicates: duplicates,\n ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n parseArrays: opts.parseArrays !== false,\n plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth,\n strictMerge: typeof opts.strictMerge === 'boolean' ? !!opts.strictMerge : defaults.strictMerge,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,\n throwOnLimitExceeded: typeof opts.throwOnLimitExceeded === 'boolean' ? opts.throwOnLimitExceeded : false\n };\n};\n\nmodule.exports = function (str, opts) {\n var options = normalizeParseOptions(opts);\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? { __proto__: null } : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? { __proto__: null } : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');\n obj = utils.merge(obj, newObj, options);\n }\n\n if (options.allowSparse === true) {\n return obj;\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","// src/bindings.tsx\nimport React from \"react\";\nimport {\n matchResourceFromRoute,\n ResourceContext,\n QS_PARSE_DEPTH\n} from \"@refinedev/core\";\nimport { useCallback, useContext } from \"react\";\nimport qs from \"qs\";\nimport {\n useNavigate,\n useLocation,\n Link,\n matchPath,\n useParams\n} from \"react-router\";\n\n// src/convert-to-number-if-possible.ts\nvar convertToNumberIfPossible = (value) => {\n if (typeof value === \"undefined\") {\n return value;\n }\n const num = Number(value);\n if (`${num}` === value) {\n return num;\n }\n return value;\n};\n\n// src/bindings.tsx\nvar stringifyConfig = {\n addQueryPrefix: true,\n skipNulls: true,\n arrayFormat: \"indices\",\n encode: false,\n encodeValuesOnly: true\n};\nvar routerProvider = {\n go: () => {\n const { search: existingSearch, hash: existingHash } = useLocation();\n const navigate = useNavigate();\n const fn = useCallback(\n ({\n to,\n type,\n query,\n hash,\n options: { keepQuery, keepHash } = {}\n }) => {\n const urlQuery = {\n ...keepQuery && existingSearch && qs.parse(existingSearch, {\n ignoreQueryPrefix: true,\n depth: QS_PARSE_DEPTH\n }),\n ...query\n };\n if (urlQuery.to) {\n urlQuery.to = encodeURIComponent(`${urlQuery.to}`);\n }\n const hasUrlQuery = Object.keys(urlQuery).length > 0;\n const urlHash = `#${(hash || keepHash && existingHash || \"\").replace(\n /^#/,\n \"\"\n )}`;\n const hasUrlHash = urlHash.length > 1;\n const urlTo = to || \"\";\n const fullPath = `${urlTo}${hasUrlQuery ? qs.stringify(urlQuery, stringifyConfig) : \"\"}${hasUrlHash ? urlHash : \"\"}`;\n if (type === \"path\") {\n return fullPath;\n }\n navigate(fullPath, {\n replace: type === \"replace\"\n });\n return;\n },\n [existingHash, existingSearch, navigate]\n );\n return fn;\n },\n back: () => {\n const navigate = useNavigate();\n const fn = useCallback(() => {\n navigate(-1);\n }, [navigate]);\n return fn;\n },\n parse: () => {\n var _a;\n let params = useParams();\n const { pathname, search } = useLocation();\n const { resources } = useContext(ResourceContext);\n const { resource, action, matchedRoute } = React.useMemo(() => {\n return matchResourceFromRoute(pathname, resources);\n }, [resources, pathname]);\n if (Object.entries(params).length === 0 && matchedRoute) {\n params = ((_a = matchPath(matchedRoute, pathname)) == null ? void 0 : _a.params) || {};\n }\n const fn = useCallback(() => {\n const parsedSearch = qs.parse(search, {\n ignoreQueryPrefix: true,\n depth: QS_PARSE_DEPTH\n });\n const combinedParams = {\n ...params,\n ...parsedSearch\n };\n const response = {\n ...resource && { resource },\n ...action && { action },\n ...(params == null ? void 0 : params.id) && { id: decodeURIComponent(params.id) },\n // ...(params?.action && { action: params.action }), // lets see if there is a need for this\n pathname,\n params: {\n ...combinedParams,\n currentPage: convertToNumberIfPossible(\n combinedParams.currentPage\n ),\n pageSize: convertToNumberIfPossible(\n combinedParams.pageSize\n ),\n to: combinedParams.to ? decodeURIComponent(combinedParams.to) : void 0\n }\n };\n return response;\n }, [pathname, search, params, resource, action]);\n return fn;\n },\n Link: React.forwardRef(function RefineLink(props, ref) {\n return /* @__PURE__ */ React.createElement(Link, { to: props.to, ...props, ref });\n })\n};\n\n// src/navigate-to-resource.tsx\nimport { useResourceParams, useGetToPath } from \"@refinedev/core\";\nimport React2 from \"react\";\nimport { Navigate } from \"react-router\";\nvar NavigateToResource = ({\n resource: resourceProp,\n fallbackTo,\n meta\n}) => {\n const getToPath = useGetToPath();\n const { resource, resources } = useResourceParams({\n resource: resourceProp\n });\n const toResource = resource || resources.find((r) => r.list);\n if (toResource) {\n const path = getToPath({\n resource: toResource,\n action: \"list\",\n meta\n });\n if (path) {\n return /* @__PURE__ */ React2.createElement(Navigate, { to: path });\n }\n return null;\n }\n if (fallbackTo) {\n console.warn(`No resource is found. navigation to ${fallbackTo}.`);\n return /* @__PURE__ */ React2.createElement(Navigate, { to: fallbackTo });\n }\n console.warn(\n 'No resource and \"fallbackTo\" is found. No navigation will be made.'\n );\n return null;\n};\n\n// src/unsaved-changes-notifier.tsx\nimport React4 from \"react\";\nimport { useTranslate, useWarnAboutChange } from \"@refinedev/core\";\n\n// src/use-prompt-workaround.ts\nimport React3 from \"react\";\nimport { UNSAFE_NavigationContext as NavigationContext } from \"react-router\";\nfunction useConfirmExit(confirmExit, when = true) {\n const { navigator } = React3.useContext(NavigationContext);\n React3.useEffect(() => {\n if (!when) {\n return;\n }\n const go = navigator.go;\n const push = navigator.push;\n navigator.push = (...args) => {\n const result = confirmExit();\n if (result !== false) {\n push(...args);\n }\n };\n navigator.go = (...args) => {\n const result = confirmExit();\n if (result !== false) {\n go(...args);\n }\n };\n return () => {\n navigator.push = push;\n navigator.go = go;\n };\n }, [navigator, confirmExit, when]);\n}\nfunction usePrompt(message, when = true, onConfirm) {\n const warnWhenListener = React3.useCallback(\n (e) => {\n e.preventDefault();\n e.returnValue = message;\n return e.returnValue;\n },\n [message]\n );\n React3.useEffect(() => {\n if (when) {\n window.addEventListener(\"beforeunload\", warnWhenListener);\n }\n return () => {\n window.removeEventListener(\"beforeunload\", warnWhenListener);\n };\n }, [warnWhenListener, when]);\n const confirmExit = React3.useCallback(() => {\n const confirm = window.confirm(message);\n if (confirm && onConfirm) {\n onConfirm();\n }\n return confirm;\n }, [message]);\n useConfirmExit(confirmExit, when);\n}\n\n// src/unsaved-changes-notifier.tsx\nimport { useLocation as useLocation2 } from \"react-router\";\nvar UnsavedChangesNotifier = ({\n translationKey = \"warnWhenUnsavedChanges\",\n message = \"Are you sure you want to leave? You have unsaved changes.\"\n}) => {\n const translate = useTranslate();\n const { pathname } = useLocation2();\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n React4.useEffect(() => {\n return () => setWarnWhen == null ? void 0 : setWarnWhen(false);\n }, [pathname]);\n const warnMessage = React4.useMemo(() => {\n return translate(translationKey, message);\n }, [translationKey, message, translate]);\n usePrompt(warnMessage, warnWhen, () => {\n setWarnWhen == null ? void 0 : setWarnWhen(false);\n });\n return null;\n};\n\n// src/catch-all-navigate.tsx\nimport React5 from \"react\";\nimport { Navigate as Navigate2, useLocation as useLocation3 } from \"react-router\";\nvar CatchAllNavigate = ({ to }) => {\n const { pathname, search } = useLocation3();\n const queryValue = `${pathname}${search}`;\n const query = queryValue.length > 1 ? `?to=${encodeURIComponent(queryValue)}` : \"\";\n return /* @__PURE__ */ React5.createElement(Navigate2, { to: `${to}${query}` });\n};\n\n// src/document-title-handler.tsx\nimport {\n useParsed,\n useTranslate as useTranslate2,\n generateDefaultDocumentTitle,\n useUserFriendlyName\n} from \"@refinedev/core\";\nimport React6, { useLayoutEffect } from \"react\";\nimport { useLocation as useLocation4 } from \"react-router\";\nfunction DocumentTitleHandler({ handler }) {\n var _a;\n const location = useLocation4();\n const { action, id, params, pathname, resource } = useParsed();\n const translate = useTranslate2();\n const getUserFriendlyName = useUserFriendlyName();\n const identifier = (resource == null ? void 0 : resource.identifier) ?? (resource == null ? void 0 : resource.name);\n const preferredLabel = (_a = resource == null ? void 0 : resource.meta) == null ? void 0 : _a.label;\n const resourceName = preferredLabel ?? getUserFriendlyName(identifier, action === \"list\" ? \"plural\" : \"singular\");\n const populatedLabel = translate(\n `${resource == null ? void 0 : resource.name}.${resource == null ? void 0 : resource.name}`,\n resourceName\n );\n useLayoutEffect(() => {\n const autoGeneratedTitle = generateDefaultDocumentTitle(\n translate,\n resource,\n action,\n `${id}`,\n resourceName,\n getUserFriendlyName\n );\n if (handler) {\n document.title = handler({\n action,\n resource: {\n ...resource ?? {},\n meta: {\n ...resource == null ? void 0 : resource.meta,\n label: populatedLabel\n }\n },\n params,\n pathname,\n autoGeneratedTitle\n });\n } else {\n document.title = autoGeneratedTitle;\n }\n }, [location]);\n return /* @__PURE__ */ React6.createElement(React6.Fragment, null);\n}\n\n// src/use-document-title.ts\nimport { useTranslate as useTranslate3 } from \"@refinedev/core\";\nimport { useEffect } from \"react\";\nvar useDocumentTitle = (title) => {\n const translate = useTranslate3();\n useEffect(() => {\n if (!title)\n return;\n if (typeof title === \"string\") {\n document.title = translate(title);\n } else {\n document.title = translate(title.i18nKey);\n }\n }, [title]);\n return (title2) => {\n if (typeof title2 === \"string\") {\n document.title = translate(title2);\n } else {\n document.title = translate(title2.i18nKey);\n }\n };\n};\nexport {\n CatchAllNavigate,\n DocumentTitleHandler,\n NavigateToResource,\n UnsavedChangesNotifier,\n routerProvider as default,\n stringifyConfig,\n useDocumentTitle\n};\n//# sourceMappingURL=index.mjs.map","import { useMemo } from \"react\";\nimport { useGetIdentity, useLogout } from \"@refinedev/core\";\nimport {\n MStack,\n Button,\n YStack,\n Paragraph,\n useTheme,\n Avatar,\n Popover,\n Separator,\n Icon,\n MText,\n} from \"@framework-m/ui\";\n\nexport interface PrimaryRailProps {\n apps: Array<{\n app_id: string;\n label: string;\n icon: string;\n resources: any[];\n }>;\n activeAppId: string;\n onAppSelect: (appId: string) => void;\n isMobile?: boolean;\n}\n\nexport function PrimaryRail({\n apps,\n activeAppId,\n onAppSelect,\n isMobile = false,\n}: PrimaryRailProps) {\n const { data: identity } = useGetIdentity<{ name: string; email: string }>();\n const { mutate: logout } = useLogout();\n const { theme, setTheme } = useTheme();\n\n const userInitials = useMemo(() => {\n if (!identity?.name) return null;\n return identity.name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .substring(0, 2)\n .toUpperCase();\n }, [identity]);\n\n const isLoggedIn = !!identity;\n\n const userPopoverContent = (\n <YStack minWidth={200}>\n <YStack padding=\"$md\" gap=\"$xs\">\n <Paragraph fontWeight=\"bold\" size=\"$sm\">\n {identity?.name || \"Anonymous\"}\n </Paragraph>\n <Paragraph size=\"$xs\" color=\"$colorMuted\">\n {identity?.email || \"Not signed in\"}\n </Paragraph>\n </YStack>\n\n <Separator />\n\n <YStack padding=\"$sm\" gap=\"$sm\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setTheme(theme === \"light\" ? \"dark\" : \"light\")}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name={theme === \"light\" ? \"moon\" : \"sun\"} size={16} />\n <MText size=\"$sm\">{theme === \"light\" ? \"Dark Mode\" : \"Light Mode\"}</MText>\n </Button>\n\n {isLoggedIn ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => logout()}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name=\"log-out\" size={16} />\n <MText size=\"$sm\">Logout</MText>\n </Button>\n ) : (\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={() => {\n const to = encodeURIComponent(window.location.pathname + window.location.search);\n window.location.href = `/login?to=${to}`;\n }}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name=\"log-in\" size={16} color=\"white\" />\n <MText size=\"$sm\" color=\"white\">\n Login\n </MText>\n </Button>\n )}\n </YStack>\n </YStack>\n );\n\n const userMenu = (\n <Popover\n placement={isMobile ? \"top-end\" : \"right-end\"}\n trigger={\n <Avatar\n fallback={userInitials || <Icon name=\"user\" size={20} color=\"$colorMuted\" />}\n size={36}\n circular\n borderWidth={1}\n borderColor=\"$borderColor\"\n />\n }\n content={userPopoverContent}\n />\n );\n\n return (\n <MStack\n flexDirection={isMobile ? \"row\" : \"column\"}\n width={isMobile ? \"100%\" : 64}\n height={isMobile ? 64 : \"100%\"}\n backgroundColor=\"$backgroundHover\"\n borderRightWidth={isMobile ? 0 : 1}\n borderTopWidth={isMobile ? 1 : 0}\n borderColor=\"$borderColor\"\n paddingVertical={isMobile ? \"$xs\" : \"$sm\"}\n paddingHorizontal={isMobile ? \"$md\" : \"$0\"}\n alignItems=\"center\"\n justifyContent={isMobile ? \"space-around\" : \"space-between\"}\n gap=\"$sm\"\n zIndex={isMobile ? 101 : 50}\n >\n {/* Top Section: App Icons */}\n <MStack\n flexDirection={isMobile ? \"row\" : \"column\"}\n alignItems=\"center\"\n gap=\"$sm\"\n flex={isMobile ? 1 : undefined}\n style={isMobile ? { overflowX: \"auto\" } : {}}\n >\n {apps.map((app) => {\n const isActive = app.app_id === activeAppId;\n return (\n <Button\n key={app.app_id}\n size=\"md\"\n variant={isActive ? \"primary\" : \"ghost\"}\n onPress={() => onAppSelect(app.app_id)}\n aria-label={app.label}\n style={{ width: 44, height: 44, padding: 0 }}\n title={app.label}\n >\n <Icon name={app.icon || \"box\"} size={20} color={isActive ? \"#fff\" : undefined} />\n </Button>\n );\n })}\n </MStack>\n\n {/* Bottom Section: User Profile */}\n <MStack flexDirection={isMobile ? \"row\" : \"column\"} alignItems=\"center\" gap=\"$sm\">\n {userMenu}\n </MStack>\n </MStack>\n );\n}\n","import { useState } from \"react\";\nimport type { NavigationNode } from \"@framework-m/plugin-sdk\";\nimport { YStack, XStack, Heading, Button, Paragraph, Icon } from \"@framework-m/ui\";\n\nexport interface ContextualDrawerProps {\n app?: {\n label: string;\n resources: NavigationNode[];\n };\n collapsed?: boolean;\n onNavigate: (route: string) => void;\n isMobile?: boolean;\n onClose?: () => void;\n}\n\nexport function ContextualDrawer({\n app,\n collapsed = false,\n onNavigate,\n isMobile,\n onClose,\n}: ContextualDrawerProps) {\n const [expandedNodes, setExpandedNodes] = useState<Record<string, boolean>>({});\n\n if (!app || collapsed) {\n return (\n <YStack\n width={0}\n backgroundColor=\"$background\"\n overflow=\"hidden\"\n style={{ transition: \"width 0.2s ease\" }}\n />\n );\n }\n\n const toggleNode = (name: string) => {\n setExpandedNodes((prev) => ({ ...prev, [name]: !prev[name] }));\n };\n\n const renderNode = (node: NavigationNode, depth: number = 0) => {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expandedNodes[node.name];\n\n return (\n <YStack key={node.name} width=\"100%\">\n <XStack\n width=\"100%\"\n alignItems=\"center\"\n paddingLeft={16 + depth * 16}\n paddingRight=\"$md\"\n minHeight={36}\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n >\n <XStack flex={1} justifyContent=\"space-between\" alignItems=\"center\">\n <XStack alignItems=\"center\">\n <XStack\n cursor=\"pointer\"\n onPress={() => {\n if (hasChildren) {\n toggleNode(node.name);\n } else if (node.route) {\n onNavigate(node.route);\n }\n }}\n paddingVertical=\"$2\"\n >\n <Paragraph size=\"$sm\" color=\"$color\" cursor=\"pointer\">\n {node.label}\n </Paragraph>\n </XStack>\n </XStack>\n\n <XStack alignItems=\"center\" gap=\"$sm\">\n {node.type === \"DocType\" && !hasChildren && (\n <XStack\n cursor=\"pointer\"\n alignItems=\"center\"\n paddingVertical=\"$2\"\n paddingHorizontal=\"$1\"\n hoverStyle={{ opacity: 0.7 }}\n onPress={(e: any) => {\n if (e && e.stopPropagation) e.stopPropagation();\n if (node.workspace_route) {\n onNavigate(node.workspace_route);\n } else if (node.route) {\n onNavigate(node.route.replace(/\\/list$/, \"/new\"));\n }\n }}\n aria-label={`Create new ${node.label}`}\n >\n <Icon name=\"plus\" size={14} color=\"$colorMuted\" />\n </XStack>\n )}\n {node.badge && !hasChildren && (\n <YStack backgroundColor=\"$primary\" borderRadius=\"$full\" paddingHorizontal=\"$sm\">\n <Paragraph size=\"$xs\" color=\"#fff\">\n {node.badge}\n </Paragraph>\n </YStack>\n )}\n {hasChildren && (\n <XStack cursor=\"pointer\" onPress={() => toggleNode(node.name)} padding=\"$1\">\n <Paragraph size=\"$xs\" color=\"$colorMuted\" cursor=\"pointer\">\n {isExpanded ? \"▼\" : \"▶\"}\n </Paragraph>\n </XStack>\n )}\n </XStack>\n </XStack>\n </XStack>\n {hasChildren && isExpanded && (\n <YStack>{node.children!.map((child) => renderNode(child, depth + 1))}</YStack>\n )}\n </YStack>\n );\n };\n\n return (\n <YStack\n width={isMobile ? \"100%\" : 240}\n position={isMobile ? \"fixed\" : \"relative\"}\n top={isMobile ? 0 : undefined}\n left={0}\n right={0}\n bottom={isMobile ? 64 : undefined} // Leaves space for the bottom rail\n zIndex={isMobile ? 100 : 1}\n backgroundColor=\"$background\"\n borderRightWidth={isMobile ? 0 : 1}\n borderColor=\"$borderColor\"\n height=\"100%\"\n overflow=\"hidden\"\n style={{\n transition: \"width 0.2s ease\",\n boxShadow: isMobile ? \"0 -10px 40px rgba(0,0,0,0.1)\" : \"none\",\n }}\n >\n <XStack\n padding=\"$md\"\n borderBottomWidth={1}\n borderColor=\"$borderColorMuted\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Heading size=\"$sm\" color=\"$color\" fontWeight=\"700\">\n {app.label}\n </Heading>\n <Button size=\"sm\" variant=\"ghost\" onPress={onClose} width={32} height={32} padding={0}>\n <Icon name={isMobile ? \"x\" : \"panel-left-close\"} size={16} color=\"$colorMuted\" />\n </Button>\n </XStack>\n <YStack flex={1} overflowX=\"auto\" paddingVertical=\"$sm\" gap=\"$0\">\n {app.resources.map((node) => renderNode(node, 0))}\n </YStack>\n </YStack>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { XStack } from \"@framework-m/ui\";\nimport { PrimaryRail } from \"./PrimaryRail\";\nimport { ContextualDrawer } from \"./ContextualDrawer\";\nimport type { NavigationNode } from \"@framework-m/plugin-sdk\";\n\nexport interface AppManifest {\n app_id: string;\n label: string;\n icon: string;\n resources: NavigationNode[];\n}\n\nexport interface NavigationShellProps {\n apps: AppManifest[];\n defaultAppId?: string;\n collapsed?: boolean;\n onNavigate: (route: string) => void;\n isMobile?: boolean;\n}\n\nexport function NavigationShell({\n apps,\n defaultAppId,\n collapsed = false,\n onNavigate,\n isMobile,\n}: NavigationShellProps) {\n const [activeAppId, setActiveAppId] = useState<string | undefined>(\n defaultAppId || apps[0]?.app_id\n );\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [desktopCollapsed, setDesktopCollapsed] = useState(collapsed);\n\n // Ensure we always have an active app if the array changes\n useEffect(() => {\n if (!activeAppId && apps.length > 0) {\n setActiveAppId(apps[0].app_id);\n }\n }, [apps, activeAppId]);\n\n const activeApp = apps.find((app) => app.app_id === activeAppId) || apps[0];\n\n return (\n <XStack\n height={isMobile ? \"auto\" : \"100%\"}\n flexDirection={isMobile ? \"column-reverse\" : \"row\"}\n overflow=\"visible\"\n >\n <PrimaryRail\n apps={apps}\n activeAppId={activeAppId || \"\"}\n isMobile={isMobile}\n onAppSelect={(id) => {\n if (isMobile) {\n setActiveAppId(id);\n setDrawerOpen(true);\n } else {\n if (id === activeAppId) {\n setDesktopCollapsed(!desktopCollapsed);\n } else {\n setActiveAppId(id);\n setDesktopCollapsed(false);\n }\n }\n }}\n />\n <ContextualDrawer\n app={activeApp}\n collapsed={isMobile ? !drawerOpen : desktopCollapsed}\n isMobile={isMobile}\n onNavigate={(route) => {\n onNavigate(route);\n if (isMobile) setDrawerOpen(false);\n }}\n onClose={() => (isMobile ? setDrawerOpen(false) : setDesktopCollapsed(true))}\n />\n </XStack>\n );\n}\n","/// <reference types=\"vite/client\" />\nimport i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport HttpBackend from \"i18next-http-backend\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\n\nimport { fetchWithCredentials } from \"../api\";\nimport { API_VERSION, FRAMEWORK_MODE } from \"../constants\";\n\ni18n\n // Load translations from backend\n .use(HttpBackend)\n // Detect user language\n .use(LanguageDetector)\n // Pass i18n instance to react-i18next\n .use(initReactI18next)\n // Initialize i18next\n .init({\n // Fallback language if translation not found\n fallbackLng: \"en\",\n\n // Default namespace\n defaultNS: \"common\",\n\n // Debug mode (disable in production)\n debug: import.meta.env.DEV,\n\n showSupportNotice: false,\n\n // Language detection options\n detection: {\n // Order of detection methods\n order: [\"localStorage\", \"navigator\"],\n\n // Cache user language\n caches: [\"localStorage\"],\n\n // localStorage key\n lookupLocalStorage: \"i18nextLng\",\n },\n\n // Backend options for loading translations\n backend: {\n // Load translations from backend API (use relative URL for any port)\n loadPath:\n FRAMEWORK_MODE === \"MONOLITH\"\n ? `/api/${API_VERSION}/Translation?locale={{lng}}`\n : `/api/core/${API_VERSION}/Translation?locale={{lng}}`,\n\n // Parse backend response\n parse: (data: string) => {\n try {\n const response = JSON.parse(data);\n\n // Transform Translation DocType list to i18next format\n // Backend returns: { items: [{ source_text, translated_text, locale, context }] }\n // i18next expects: { [key]: value }\n const translations: Record<string, string> = {};\n\n if (response.items && Array.isArray(response.items)) {\n for (const item of response.items) {\n // Use context as prefix if present (e.g., \"button.Save\")\n const key = item.context ? `${item.context}.${item.source_text}` : item.source_text;\n\n translations[key] = item.translated_text;\n }\n }\n\n return translations;\n } catch (error) {\n console.error(\"Failed to parse translations:\", error);\n return {};\n }\n },\n\n // Custom request function to add authentication\n request: (\n _options: unknown,\n url: string,\n _payload: unknown,\n callback: (error: Error | null, response: { status: number; data: string }) => void\n ) => {\n fetchWithCredentials(url, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n })\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return response.text();\n })\n .then((data) => {\n callback(null, {\n status: 200,\n data,\n });\n })\n .catch((error) => {\n console.error(\"Translation loading error:\", error);\n callback(error, {\n status: 500,\n data: \"{}\",\n });\n });\n },\n },\n\n // Interpolation options\n interpolation: {\n // React already escapes values\n escapeValue: false,\n },\n\n // React options\n react: {\n // Use React Suspense for async loading\n useSuspense: true,\n },\n });\n\nexport default i18n;\n","import React, { ReactNode, useContext, useMemo, useState, useRef } from \"react\";\nimport {\n BrowserRouter,\n Routes,\n Route,\n Navigate,\n Outlet,\n useLocation,\n useNavigate,\n} from \"react-router\";\nimport { Refine, Authenticated } from \"@refinedev/core\";\nimport routerProvider from \"@refinedev/react-router\";\nimport { ShellProvider } from \"../../shell/ShellProvider\";\nimport { NavigationShell } from \"./Navigation/NavigationShell\";\nimport { createWebSocketRealtimeAdapter } from \"../../shell/realtime\";\nimport { FrameworkMPlugin } from \"@framework-m/plugin-sdk\";\nimport { ShellSkeleton } from \"./ShellSkeleton\";\nimport { authProvider } from \"../../auth\";\nimport { frameworkMDataProvider } from \"../../data\";\nimport { SCHEMA_URL, FRAMEWORK_MODE } from \"../../constants\";\nimport { liveProvider } from \"../../live\";\nimport { LoginPage } from \"../../pages/LoginPage\";\nimport { ListView } from \"../../pages/ListView\";\nimport { FormView } from \"../../pages/FormView\";\nimport {\n PluginRegistry,\n PluginRegistryContext,\n PluginRegistryProvider,\n DiscoveryClient,\n fetchRemotes,\n loadRemoteScript,\n initializeRemote,\n loadRemoteModule,\n} from \"@framework-m/plugin-sdk\";\nimport { ThemeProvider, MProvider, XStack, YStack } from \"@framework-m/ui\";\nimport { I18nextProvider } from \"react-i18next\";\nimport i18n from \"../../config/i18n\";\n\nexport interface FrameworkMShellProps {\n /** Application title for the Navbar */\n title: string;\n /** Primary content to render inside the main layout */\n children?: ReactNode;\n /** Optional plugins to initialize the shell with */\n initialPlugins?: FrameworkMPlugin[];\n /** Whether focus mode is enabled by default */\n defaultFocusMode?: boolean;\n /** The federation service name for this shell app (e.g. 'business_m') */\n serviceName?: string;\n /** Optional custom login page */\n loginPage?: ReactNode;\n}\n\n/**\n * ShellLayout\n *\n * Internal component to handle the authenticated layout structure.\n */\nconst ShellLayout: React.FC<{\n isMobile: boolean;\n registryVersion: number;\n}> = ({ isMobile, registryVersion }) => {\n const navigate = useNavigate();\n const registry = useContext(PluginRegistryContext);\n const apps = useMemo(() => {\n const allApps = registry?.getApps() ?? [];\n const rawAppsStr = process.env.INSTALLED_APPS || \"\";\n const installed = rawAppsStr.split(\",\").map((s: string) => s.trim());\n const mandatoryApps = [\"core\"];\n const filteredApps = allApps.filter(\n (app) => !rawAppsStr || mandatoryApps.includes(app.app_id) || installed.includes(app.app_id)\n );\n\n console.log(\"[framework-m/shell] Filtering apps:\", {\n all: allApps.map((a) => a.app_id).join(\", \"),\n installed: rawAppsStr,\n mandatory: mandatoryApps.join(\", \"),\n result: filteredApps.map((a) => a.app_id).join(\", \"),\n });\n\n return filteredApps;\n }, [registry, registryVersion]);\n\n const mainContent = (\n <YStack tag=\"main\" flex={1} minWidth={0} minHeight={0} overflowY=\"auto\" padding=\"$md\">\n <Outlet />\n </YStack>\n );\n\n const navigation = (\n <NavigationShell apps={apps} isMobile={isMobile} onNavigate={(route) => navigate(route)} />\n );\n\n if (isMobile) {\n return (\n <YStack flex={1} height=\"100vh\" overflow=\"hidden\">\n {mainContent}\n {navigation}\n </YStack>\n );\n }\n\n return (\n <XStack flex={1} height=\"100vh\" overflow=\"hidden\">\n {navigation}\n {mainContent}\n </XStack>\n );\n};\n\n/**\n * RedirectToLogin\n *\n * Helper component to redirect unauthenticated users to the login page\n * while preserving the current path in the 'to' query parameter.\n */\nexport const RedirectToLogin = () => {\n const { pathname, search } = useLocation();\n const to = encodeURIComponent(`${pathname}${search}`);\n return <Navigate to={`/login?to=${to}`} replace />;\n};\n\nconst EMPTY_PLUGINS: FrameworkMPlugin[] = [];\n\nexport const FrameworkMShell: React.FC<FrameworkMShellProps> = ({\n title,\n children,\n initialPlugins = EMPTY_PLUGINS,\n defaultFocusMode = false,\n serviceName = \"core\",\n loginPage,\n}) => {\n const [focusMode, setFocusMode] = useState(defaultFocusMode);\n const [isMobile, setIsMobile] = useState(\n globalThis.window?.innerWidth ? globalThis.window.innerWidth < 1024 : false\n );\n const [rightMobileOpen, setRightMobileOpen] = useState(false);\n\n React.useEffect(() => {\n const onResize = () => {\n const mobile = window.innerWidth < 1024;\n setIsMobile(mobile);\n };\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n // Initialize Plugin Registry\n const registry = useMemo(() => {\n const authzProvider = authProvider as {\n can?: (params: { resource: string; action: \"read\" }) => Promise<{ can?: boolean }>;\n };\n\n const reg = PluginRegistry.getInstance();\n\n // Explicitly configure mode and service context (No more global sniffing!)\n reg.setContext({\n frameworkMode: FRAMEWORK_MODE,\n serviceName: serviceName || \"core\",\n });\n\n reg.setPermissionChecker(async (permissions) => {\n if (permissions.length === 0 || !authzProvider?.can) {\n return true;\n }\n\n for (const permission of permissions) {\n const result = await authzProvider.can({\n resource: permission,\n action: \"read\",\n });\n if (!result?.can) {\n return false;\n }\n }\n\n return true;\n });\n\n // Pre-seed the registry synchronously with all initial plugins.\n // This ensures routes and manifests are available on the very first render,\n // preventing the * wildcard from firing before the async useEffect runs.\n for (const plugin of initialPlugins) {\n if (plugin.name && plugin.version) {\n try {\n // Use internal Map access for synchronous pre-seed if needed,\n // or just call a sync register if available.\n // Since we are in useMemo, this is safe.\n (reg as any).plugins.set(plugin.name, plugin);\n (reg as any).rebuildIndexesAndServices();\n (reg as any).appsCache = null;\n } catch (err) {\n console.warn(`[framework-m/shell] Synchronous pre-seed failed for ${plugin.name}:`, err);\n }\n }\n }\n\n // Initialize DiscoveryClient with this registry\n DiscoveryClient.getInstance(reg);\n\n return reg;\n }, [initialPlugins]); // Re-initialize if initialPlugins change\n\n // Registry version to trigger re-renders when plugins register\n const [registryVersion, setRegistryVersion] = useState(0);\n const initializationStarted = useRef(false);\n\n React.useEffect(() => {\n const unsubscribe = registry.on(\"plugin:registered\", () => {\n setRegistryVersion((v) => v + 1);\n });\n return unsubscribe;\n }, [registry]);\n\n // Initialize the shell (pre-warm core + register plugins + discovery)\n React.useEffect(() => {\n if (initializationStarted.current) return;\n initializationStarted.current = true;\n\n const prewarmCore = async () => {\n try {\n console.info(\"[framework-m/shell] Pre-warming core discovery...\");\n const discovery = DiscoveryClient.getInstance();\n const openapiPath = `${SCHEMA_URL}/openapi.json`;\n await discovery.loadFromOpenAPI(openapiPath, serviceName);\n } catch (err) {\n console.warn(\"[framework-m/shell] Failed to pre-warm core discovery:\", err);\n }\n };\n\n const registerInitial = async () => {\n console.info(`[framework-m/shell] Registering ${initialPlugins.length} initial plugins`);\n for (const plugin of initialPlugins) {\n try {\n await registry.register(plugin);\n } catch (err) {\n console.error(\n `[framework-m/shell] Failed to register initial plugin ${plugin.name}:`,\n err\n );\n }\n }\n };\n\n const discoverRemotes = async () => {\n try {\n console.info(\"[framework-m/shell] Fetching remotes from discovery API...\");\n const remotes = await fetchRemotes();\n console.info(\"[framework-m/shell] Discovered remotes:\", remotes);\n\n const bootstrapTasks = Object.entries(remotes).map(async ([scope, unit]) => {\n // Pre-warm DiscoveryClient with OpenAPI schema if available\n if (unit.openapiUrl) {\n try {\n console.info(\n `[framework-m/shell] Pre-warming discovery for ${scope} from ${unit.openapiUrl}`\n );\n const discovery = DiscoveryClient.getInstance();\n await discovery.loadFromOpenAPI(unit.openapiUrl);\n } catch (e) {\n console.warn(`[framework-m/shell] Failed to pre-warm discovery for ${scope}:`, e);\n }\n }\n\n if (registry.getAllPlugins().some((p: FrameworkMPlugin) => p.name === scope)) {\n console.debug(`[framework-m/shell] Remote ${scope} already registered as local plugin`);\n return;\n }\n\n try {\n console.info(`[framework-m/shell] 1. Loading script: ${unit.url}`);\n loadRemoteScript(unit.url);\n\n console.info(`[framework-m/shell] 2. Initializing remote container: ${scope}`);\n await initializeRemote(scope, unit.url);\n console.info(`[framework-m/shell] Container ${scope} initialized`);\n\n // 3. Load the plugin module\n let module;\n console.info(`[framework-m/shell] 3. Loading module ./plugin from ${scope}`);\n try {\n module = await loadRemoteModule<{ default: FrameworkMPlugin }>(scope, \"./plugin\");\n } catch (e) {\n console.warn(\n `[framework-m/shell] Failed to load ./plugin for ${scope}, trying ./remoteEntry`,\n e\n );\n module = await loadRemoteModule<{ default: FrameworkMPlugin }>(\n scope,\n \"./remoteEntry\"\n );\n }\n\n const plugin = module.default;\n if (plugin) {\n // Inject discovery metadata for dynamic service resolution in Phase 5\n plugin.discoveryUnit = unit;\n\n await registry.register(plugin);\n console.info(\n `[framework-m/shell] 4. Successfully registered remote plugin: ${scope}`\n );\n } else {\n console.error(`[framework-m/shell] No default export found for remote ${scope}`);\n }\n } catch (err) {\n console.error(`[framework-m/shell] Failed to bootstrap remote ${scope}:`, err);\n }\n });\n\n // Parallelize bootstrapping for all discovered remotes\n await Promise.allSettled(bootstrapTasks);\n } catch (err) {\n console.error(\"[framework-m/shell] Discovery failed:\", err);\n }\n };\n\n const run = async () => {\n await prewarmCore();\n await registerInitial();\n await discoverRemotes();\n };\n run();\n }, [registry, initialPlugins, serviceName]);\n\n // Memoize plugin routes to prevent router remounting on layout state changes\n const pluginRoutes = useMemo(() => {\n // Access registryVersion to ensure re-memoization when a plugin registers\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n registryVersion;\n\n const allRoutes = registry.getRoutes();\n return allRoutes.map((route) => {\n const LazyComponent =\n typeof route.element === \"function\" && !(route.element as any).$$typeof\n ? React.lazy(route.element as any)\n : null;\n\n const element = LazyComponent ? (\n <LazyComponent />\n ) : typeof route.element === \"function\" ? (\n (route.element as any)()\n ) : (\n route.element\n );\n\n return (\n <Route\n key={route.path}\n path={route.path.startsWith(\"/\") ? route.path : `/${route.path}`}\n element={element}\n />\n );\n });\n }, [registry, registryVersion]);\n\n // Using location.host for standard dev/prod behavior\n const protocol = globalThis.location?.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const wsUrl = `${protocol}//${globalThis.location?.host}/api/v1/stream`;\n\n return (\n <BrowserRouter>\n <I18nextProvider i18n={i18n}>\n <PluginRegistryProvider registry={registry}>\n <ThemeProvider>\n <MProvider>\n <React.Suspense fallback={<ShellSkeleton />}>\n <ShellProvider\n isMobile={isMobile}\n rightSidebarOpen={rightMobileOpen}\n setRightSidebarOpen={setRightMobileOpen}\n realtimeAdapter={createWebSocketRealtimeAdapter(wsUrl)}\n initialPlugins={initialPlugins}\n focusMode={focusMode}\n setFocusMode={setFocusMode}\n >\n <Refine\n dataProvider={frameworkMDataProvider}\n authProvider={authProvider}\n routerProvider={routerProvider}\n liveProvider={liveProvider}\n options={{\n syncWithLocation: true,\n warnWhenUnsavedChanges: true,\n }}\n >\n <Routes>\n {/* Public Routes */}\n <Route path=\"/login\" element={loginPage ?? <LoginPage title={title} />} />\n\n {/* Authenticated Application Routes */}\n <Route\n element={\n <Authenticated key=\"authenticated-routes\" fallback={<RedirectToLogin />}>\n <ShellLayout isMobile={isMobile} registryVersion={registryVersion} />\n </Authenticated>\n }\n >\n <Route index element={<Navigate to=\"/app/dashboard\" />} />\n\n {/* Plugin Routes */}\n {pluginRoutes}\n\n <Route path=\"/app\">\n <Route index element={<Navigate to=\"/app/dashboard\" />} />\n <Route path=\"dashboard\" element={children} />\n\n {/* Generic DocType Routes */}\n <Route path=\":doctype\">\n <Route index element={<Navigate to=\"list\" />} />\n <Route path=\"list\" element={<ListView />} />\n <Route path=\"kanban\" element={<ListView view=\"kanban\" />} />\n <Route path=\"tree\" element={<ListView view=\"tree\" />} />\n <Route path=\"new\" element={<FormView />} />\n <Route path=\"detail/:id\" element={<FormView />} />\n <Route path=\"edit/:id\" element={<FormView />} />\n </Route>\n </Route>\n </Route>\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"/\" />} />\n </Routes>\n </Refine>\n </ShellProvider>\n </React.Suspense>\n </MProvider>\n </ThemeProvider>\n </PluginRegistryProvider>\n </I18nextProvider>\n </BrowserRouter>\n );\n};\n"],"names":["API_VERSION","FRAMEWORK_MODE","config","envMode","API_URL","serviceName","base","prefix","META_URL","SCHEMA_URL","WS_URL","fetchWithCredentials","url","options","fetchOptions","headers","token","method","registry","PluginRegistry","finalUrl","resource","parseApiPath","owner","FrameworkApiError","message","status","code","details","__publicField","buildActionPermissionMessage","action","backendMessage","normalizedResource","buildPaginationParams","pagination","params","current","pageSize","buildSortingParams","sorters","sorter","order","filterValueToString","value","item","buildFilterParams","filters","filter","op","valueStr","buildQueryString","searchParams","key","context","response","coreFetch","payload","buildResourceUrl","id","query","service","doctype","s","rest","frameworkMDataProvider","variables","ids","fullUrl","getAuthConfig","_a","authProvider","email","password","error","loginUrl","user","identityId","identityName","identityEmail","err","connections","subscriptions","getConnection","channel","ws","wsUrl","event","data","callbacks","callback","maybeCloseConnection","liveProvider","types","channelName","filteredCallback","unsubscribeFn","type","apiUrl","closeAllConnections","useMFetch","useDebounce","delay","debouncedValue","setDebouncedValue","useState","useEffect","timer","getPathValue","source","path","segments","segment","index","resolveWatchPath","fieldName","watchField","fetchDocTypeMeta","useDocTypeMeta","meta","isLoading","refetch","useQuery","usePrefetchDocTypeMeta","AUDIT_FIELDS","SystemInfo","record","title","jsxs","MStack","jsx","Heading","MText","QuickEntryForm","linkedDoctype","onCreated","onClose","schema","formData","setFormData","isSaving","setIsSaving","saveError","setSaveError","mfetch","handleSubmit","useCallback","created","newId","newLabel","YStack","filteredSchema","AutoForm","XStack","Button","Link","props","name","disabled","onChange","label","placeholder","showInlineError","required","compact","model","useForm","fieldSchema","useMemo","staticLinkedDoctype","configured","_b","watchPath","watchedDoctype","resolved","isDynamicLink","configuredWidget","resolvedPlaceholder","watchLabel","part","quickEntryEnabled","inputValue","setInputValue","searchResults","setSearchResults","isOpen","setIsOpen","setIsLoading","isDrawerOpen","setIsDrawerOpen","dropdownRef","useRef","previousDoctypeRef","debouncedSearch","search","items","handleClickOutside","e","previousDoctype","handleSelect","option","handleCreated","Input","text","Paragraph","Card","Drawer","LinkField","connectField","formatValue","date","pad","n","yyyy","mm","dd","hh","min","Text","propsMin","propsMax","propsStep","uiMeta","validation","hint","minVal","maxVal","stepVal","minLengthVal","maxLengthVal","patternVal","DatePicker","Bool","SelectF","bridgeOptions","allowedValues","rawField","uiMetaOptions","enumOptions","o","v","c","Select","val","selected","DEFAULT_PAGE_SIZE","TABLE_CELL_PADDING_X","TABLE_CELL_PADDING_Y","TABLE_ROW_MIN_HEIGHT","toPositiveInt","parsed","normalized","List","schemaProp","grid_columns","rows","_d","_c","pageIndex","setPageIndex","editingIndex","setEditingIndex","rowSchema","propsInSchema","uniqueProps","uiMetaGridColumns","_e","uiMetaListColumns","_g","_f","officialColumns","_h","gridColumns","totalPages","pageStart","pageRows","getColLabel","col","prop","word","getColType","handleAdd","nextRows","handleRemove","newValue","handleDuplicate","cloned","handleKeyDown","allProperties","Modal","AutoField","_item","relativeIndex","isNumeric","Registry","component","FieldRegistry","rawFormat","typeKey","CustomComponent","asLinkDoctype","trimmed","configuredLinkDoctype","inferredLinkDoctype","description","match","linkDoctype","mergedProps","ErrorsField","detail","filterDOMProps","SubmitField","state","ajv","Ajv","onSubmit","readonly","hideSubmitButton","submitText","columns","children","bridge","validator","JSONSchemaBridge","BaseForm","keys","newModel","i","k","useTranslation","namespace","i18n","ready","useI18nTranslation","lng","SYSTEM_FIELDS","stringToHslColor","str","l","hash","ensureUtc","dateStr","hasTimezone","isoStr","formatRelativeTime","dateInput","now","diffInSeconds","diffInMinutes","diffInHours","diffInDays","serializeQueryState","sorting","generateColumnsFromSchema","property","getValue","row","rawId","rawModified","modified","rawModifiedBy","modifiedBy","relativeTime","userColor","hasHumanName","initials","infoText","AutoTable","customColumns","enableSelection","onSelectionChange","onRowClick","className","t","setSorting","rowSelection","setRowSelection","setPagination","borderColor","useTheme","sort","result","useList","prev","tableData","totalCount","isFetching","queryError","queryStateKey","previousQueryStateKey","columnsWithSelection","table","useReactTable","r","updater","newSelection","selectedIds","selectedRows","rowId","getCoreRowModel","getSortedRowModel","getPaginationRowModel","_","Skeleton","headerGroup","header","width","flexRender","cell","isSelect","customSize","layoutProps","EditableCell","field","onSaveSuccess","renderValue","isEditing","setIsEditing","editValue","setEditValue","setError","inputRef","updateMutation","useUpdate","handleClick","handleCancel","handleBlur","handleChange","ConfirmDialog","open","confirmLabel","cancelLabel","destructive","onConfirm","onCancel","titleId","styles","AlertBanner","variant","onDismiss","palette","SubmittedBanner","docstatus","BulkActionsBar","selectedCount","onDelete","onExportJson","onExportCsv","onBulkUpdate","updateFields","onClear","showUpdateMenu","setShowUpdateMenu","selectedField","setSelectedField","updateValue","setUpdateValue","isDeleteConfirmOpen","setIsDeleteConfirmOpen","handleUpdate","handleDelete","f","STATE_COLORS","getStateColor","normalizedState","StateBadge","style","displayState","colors","fetchWorkflowActions","executeTransition","useWorkflowActions","queryClient","useQueryClient","isExecuting","setIsExecuting","enabled","executeAction","actionName","ACTION_COLORS","getActionColor","WorkflowActions","showState","onActionComplete","actions","handleAction","allowedActions","a","registerSlot","slot","existing","registration","b","getSlotComponents","slotName","slots","getResources","Slot","slotRegistrations","Fragment","Component","toEntries","toErrorMessage","useAuditTimeline","listResult","toDisplay","DiffViewer","diff","entries","values","oldValue","toLabel","entry","reason","AuditTimeline","mapDocTypeToResource","dt","isSingleton","listRoute","useDocTypes","doctypes","setDocTypes","fetchDocTypes","resources","useRouteTraversal","useContext","PluginRegistryContext","allPlugins","traversals","useFormController","propDoctype","propId","useParams","metaLoading","metaError","queryResult","useOne","createMutation","useCreate","workflowState","errors","setErrors","notices","currentDoc","currentDocstatus","isLocked","navigate","useNavigate","resolveListRoute","handleSave","customPath","handleRefetch","frm","update","useInlineEdit","onError","editingCell","setEditingCell","startEdit","cancelEdit","saveEdit","resolve","reject","errorMsg","useBulkActions","onSuccess","setSelectedIds","deleteMutation","useDeleteMany","useUpdateMany","selectedItems","isAllSelected","isSomeSelected","selectRow","deselectRow","next","toggleRow","selectAll","deselectAll","toggleAll","isSelected","bulkDelete","bulkUpdate","exportAsJson","blob","exportAsCsv","fields","csv","useCommandPalette","close","toggle","useComponentOverride","viewName","targetDoctype","docExt","d","usePageOverride","pageName","pageExt","p","resolveMetaBaseUrl","baseUrl","uiMetaCache","useUIMeta","uiContext","cacheKey","setUiMeta","fetchMeta","ctx","queryString","normalizeError","fallback","maybeRecord","useCorrectionAction","setResult","jsonPayload","resolvedError","successPayload","toSiblings","useSiblingDocTypes","siblings","setSiblings","fetchSiblings","FOCUSABLE_SELECTOR","useFormKeyboard","containerRef","container","target","inputType","focusables","currentIndex","normalizeFilterValue","fieldType","cloneFilterRows","serializeFilterRows","useListFilters","initialFilterableFields","searchQuery","setSearchQuery","appliedSearchQuery","setAppliedSearchQuery","filterRows","setFilterRows","appliedFilterRows","setAppliedFilterRows","asOfFilter","setAsOfFilter","nextFilterRowId","fieldTypeMap","acc","advancedFilters","normalizedValue","tableFilters","mergedFilters","trimmedSearchQuery","hasPendingSearchChanges","hasPendingFilterChanges","addFilterRow","defaultField","currentRows","updateFilterRow","patch","removeFilterRow","clearFilterRows","applySearch","clearSearch","applyFilters","clearAppliedFilters","removeAppliedFilterRow","useFormActions","shell","apps","touchStart","setTouchStart","printFormatName","setPrintFormatName","handleTouchStart","clientX","handleTouchEnd","distance","isLeftSwipe","isRightSwipe","openPrintPreview","downloadPrintPdf","downloadUrl","anchor","docNameValue","displayName","appName","app","submitLabel","LIST_COLUMN_STORAGE_PREFIX","useListActions","propView","canKanban","canTree","resolveDetailRoute","location","useLocation","isColumnsMenuOpen","setIsColumnsMenuOpen","isMobile","setIsMobile","readPreferences","raw","columnPreferences","setColumnPreferences","onResize","toggleColumnVisibility","previous","currentVisibility","updateColumnWidth","widthInput","parsedWidth","nextWidths","pathView","activeView","requested","setActiveView","view","handleRowClick","TIME_TRAVEL_UNAVAILABLE_MESSAGE","normalizeAsOfInput","hours","minutes","seconds","toInputValue","asOf","isVersioningEnabled","metadata","versioningEnabled","topLevelVersioningEnabled","AsOfDatePicker","onAsOfChange","nextValue","PageSkeleton","sectionKey","TableSkeleton","rowKey","ShellSkeleton","idx","viewRegistry","doctypeViews","registerView","getViewComponent","getRegisteredViews","getViewRegistration","setDocTypeViews","views","getDocTypeViews","isViewAvailable","viewType","QuickEditModal","titleField","descField","groupField","onSaved","setTitle","desc","setDesc","setStatus","saving","setSaving","updateItem","resolveKanbanGroupField","resolveKanbanTitleField","resolveKanbanDescriptionField","resolveKanbanColumns","seen","discovered","COLUMN_COLORS","KanbanView","StandardKanbanView","dragState","setDragState","dragOverColumn","setDragOverColumn","editingItem","setEditingItem","groupedItems","groups","first","handleDrop","targetColumnId","j","column","isOver","isDragging","getDaysInMonth","year","month","days","CalendarView","StandardCalendarView","startField","go","useGo","currentDate","setCurrentDate","startOfMonth","endOfMonth","eventsByDay","prevMonth","nextMonth","today","monthName","weekDays","firstDayOffset","day","events","isToday","getDateRange","tasks","endField","minDate","maxDate","task","start","end","getDaysBetween","GanttView","StandardGanttView","nameField","progressField","totalDays","dayHeaders","rowHeight","dayWidth","taskStart","taskEnd","startOffset","duration","progress","fetchTree","res","updateNode","nodeId","reparentNode","newParent","addChildNode","parentId","InlineInput","initialValue","setValue","ref","TreeNodeRow","node","depth","onRefresh","dragNodeId","onDragStart","onDrop","collapsed","setCollapsed","renaming","setRenaming","addingChild","setAddingChild","isDropTarget","setIsDropTarget","handleRename","handleAddChild","hasChildren","toggleGlyph","child","TreeView","StandardTreeView","setState","setDragNodeId","addingRoot","setAddingRoot","load","tree","targetId","handleAddRoot","FILTER_OPERATOR_OPTIONS","hasActionPermission","allowedRoles","userRoles","role","coerceSelectValue","FILTER_OPERATOR_LABELS","hasFilterValue","getFilterFieldLabel","filterFieldMap","getFilterDisplayValue","fieldConfig","optionLabel","getFilterPillText","getFilterInputType","ListBodyLayout","permissions","identity","isAuthenticated","setSelectedRows","filterableFields","listFilterSlotData","uiError","timeTravelError","listColumns","tableColumns","kanbanGroupField","kanbanColumns","kanbanTitleField","kanbanDescriptionField","detectedParentField","detectedLabelField","confirmBulkDelete","handleBulkDelete","handleNew","activeError","isFilterPanelOpen","setIsFilterPanelOpen","isFilterOverflowOpen","setIsFilterOverflowOpen","hasDraftSearchQuery","hasAppliedSearchQuery","appliedFilters","visibleFilterPills","overflowFilterPills","selectOptions","nextField","nextOperator","isVisible","widthValue","MIN_REASON_LENGTH","CorrectionWizard","supportsInPlaceEdit","strategy","setStrategy","setReason","validationError","setValidationError","execute","strategyOptions","handleConfirm","normalizedReason","optionValue","CorrectButton","handleSuccess","nextId","toRecord","SiblingEditor","sibling","submittedData","siblingIdValue","siblingId","SiblingPanel","overlaySiblings","footerSiblings","BUILTIN_COMMANDS","CommandPalette","setQuery","selectedIndex","setSelectedIndex","setDoctypes","fetchDoctypes","documentItems","doc","newCommands","searchTerm","filteredItems","lowerQuery","cmd","executeCommand","Menu","logout","useLogout","menuItems","useMenu","NavLink","Breadcrumb","breadcrumbs","useBreadcrumb","breadcrumb","isLast","STORAGE_KEY_PREFIX","readStoredTab","storeTab","focusFirst","focusable","TabContainer","tabs","defaultTabIndex","onTabChange","activeIndex","setActiveIndex","stored","contentRef","switchTab","clamped","digit","targetIndex","tab","isActive","SectionField","collapsible","defaultCollapsed","isCollapsed","setIsCollapsed","childItems","Children","fieldContent","fractionToFlex","fractionToMinWidth","ColWrapper","flexValue","minW","ColumnGrid","equalColumns","PageHeader","extra","Layout","sidebar","navbar","WorkspaceSection","workspace","isExpanded","setIsExpanded","handleItemClick","LIST_SYSTEM_FIELDS","toSchemaFields","properties","getStringEnums","isSelectOrLinkField","format","getFilterValueKind","typeValue","pickFirst","toDisplayLabel","isHiddenField","fieldMeta","formatCellValue","ListView","useGetIdentity","usePluginApps","setUiError","setTimeTravelError","schemaFields","fromMeta","groupFieldCandidates","metaKanban","fallbackField","schemaField","visibleListColumns","savedWidth","invalidate","useInvalidate","typedApps","FormToolbar","layout","printTools","ShellContext","createContext","useShell","buildFilteredSchema","fieldKeys","normalizedKey","buildFullFilteredSchema","FormBodyLayout","flatSections","section","si","sectionSchema","FormViewHeader","notice","FormView","docError","commonProps","StandardFormView","formRef","OAUTH_PROVIDERS","resolveConfiguredProviders","configGlobal","injectedProviders","rawProviders","provider","LoginLogo","logo","LoginPage","StandardLoginPage","propRedirectTo","useSearchParams","redirectTo","login","useLogin","setEmail","setPassword","theme","toggleTheme","providers","setProviders","localRealtimeAdapter","onMessage","handler","removeRoomSubscriber","room","listener","clone","useRealtime","initialAdapter","realtimeAdapterRef","disconnectAdapterRef","roomSubscribersRef","dispatchRealtimeMessage","currentSubscribers","roomListeners","wildcardListeners","listeners","setRealtimeAdapter","adapter","nextAdapter","maybeDisconnect","subscribeRealtime","publishRealtime","removeProvider","useOmniSearch","searchProviders","setSearchProviders","registerOmniSearchProvider","searchOmni","merged","providerResults","upsertSection","incoming","removeSectionById","sectionId","useSidebarSections","initialPlugins","isGuestInitial","sections","setSections","internalIsGuest","setInternalIsGuest","hasPermissionError","setHasPermissionError","registerSection","getSections","cleanups","resp","authResp","moduleName","route","cleanup","_i","plugin","manifest","registerNodes","nodes","ShellProvider","isGuest","rightSidebarOpen","setRightSidebarOpen","focusMode","setFocusMode","realtimeAdapter","createWebSocketRealtimeAdapter","socket","handleMessage","__viteBrowserExternal","hasMap","mapSizeDescriptor","mapSize","mapForEach","hasSet","setSizeDescriptor","setSize","setForEach","hasWeakMap","weakMapHas","hasWeakSet","weakSetHas","hasWeakRef","weakRefDeref","booleanValueOf","objectToString","functionToString","$match","$slice","$replace","$toUpperCase","$toLowerCase","$test","$concat","$join","$arrSlice","$floor","bigIntValueOf","gOPS","symToString","hasShammedSymbols","toStringTag","isEnumerable","gPO","O","addNumericSeparator","num","sepRegex","int","intStr","dec","utilInspect","require$$0","inspectCustom","inspectSymbol","isSymbol","quotes","quoteREs","objectInspect","inspect_","obj","opts","has","customInspect","numericSeparator","inspectString","bigIntStr","maxDepth","isArray","indent","getIndent","indexOf","inspect","from","noIndent","newOpts","isRegExp","nameOf","arrObjKeys","symString","markBoxed","isElement","attrs","wrapQuotes","quote","xs","singleLineValues","indentedJoin","isError","parts","isMap","mapParts","collectionOf","isSet","setParts","isWeakMap","weakCollectionOf","isWeakSet","isWeakRef","isNumber","isBigInt","isBoolean","isString","global","isDate","ys","isPlainObject","protoTag","stringTag","toStr","constructorTag","tag","defaultStyle","quoteChar","canTrustToString","hasOwn","m","x","remaining","trailer","quoteRE","lowbyte","size","joinedEntries","baseIndent","lineJoiner","isArr","syms","symMap","$TypeError","require$$1","listGetNode","list","isDelete","curr","listGet","objects","listSet","listHas","listDelete","sideChannelList","$o","deletedNode","esObjectAtoms","esErrors","_eval","range","syntax","uri","abs","floor","max","pow","round","_isNaN","$isNaN","sign","number","gOPD","$gOPD","gopd","$defineProperty","esDefineProperty","shams","sym","symObj","symVal","descriptor","origSymbol","hasSymbolSham","hasSymbols","Reflect_getPrototypeOf","$Object","Object_getPrototypeOf","ERROR_MESSAGE","funcType","concatty","arr","slicy","arrLike","offset","joiny","joiner","implementation","that","args","bound","binder","boundLength","boundArgs","Empty","functionBind","functionCall","functionApply","reflectApply","bind","$apply","$call","require$$2","$reflectApply","require$$3","actualApply","$actualApply","callBindApplyHelpers","callBind","hasProtoAccessor","$getPrototypeOf","get","reflectGetProto","originalGetProto","getDunderProto","getProto","call","$hasOwn","hasown","undefined","$Error","$EvalError","$RangeError","$ReferenceError","require$$4","$SyntaxError","require$$5","require$$6","$URIError","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","$Function","getEvalledConstructor","expressionSyntax","require$$15","require$$16","throwTypeError","ThrowTypeError","require$$17","require$$18","$ObjectGPO","require$$19","$ReflectGPO","require$$20","require$$21","require$$22","needsEval","TypedArray","INTRINSICS","errorProto","doEval","fn","gen","LEGACY_ALIASES","require$$23","require$$24","$spliceApply","$strSlice","$exec","rePropName","reEscapeChar","stringToPath","string","last","subString","getBaseIntrinsic","allowMissing","intrinsicName","alias","getIntrinsic","intrinsicBaseName","intrinsic","intrinsicRealName","skipFurtherCaching","isOwn","GetIntrinsic","callBindBasic","$indexOf","callBound","$Map","$mapGet","$mapSet","$mapHas","$mapDelete","$mapSize","sideChannelMap","$m","getSideChannelMap","$WeakMap","$weakMapGet","$weakMapSet","$weakMapHas","$weakMapDelete","sideChannelWeakmap","$wm","getSideChannelList","getSideChannelWeakMap","makeChannel","sideChannel","$channelData","replace","percentTwenties","Format","formats","getSideChannel","overflowChannel","markOverflow","maxIndex","isOverflow","getMaxIndex","setMaxIndex","hexTable","array","compactQueue","queue","compacted","arrayToObject","merge","nextIndex","newIndex","sourceKeys","oldKey","combined","mergeTarget","targetItem","keyNum","assign","decode","defaultDecoder","charset","strWithoutPlus","limit","encode","defaultEncoder","kind","$0","out","refs","isBuffer","combine","arrayLimit","plainObjects","maybeMap","mapped","utils","arrayPrefixGenerators","push","pushToArray","valueOrArray","toISO","defaultFormat","defaults","isNonNullishPrimitive","sentinel","stringify","object","generateArrayPrefix","commaRoundTrip","allowEmptyArrays","strictNullHandling","skipNulls","encodeDotInKeys","encoder","allowDots","serializeDate","formatter","encodeValuesOnly","tmpSc","step","findFlag","pos","keyValue","objKeys","encodedPrefix","adjustedPrefix","encodedKey","keyPrefix","valueSideChannel","normalizeStringifyOptions","arrayFormat","stringify_1","joined","interpretNumericEntities","numberStr","parseArrayValue","currentArrayLength","isoSentinel","charsetSentinel","parseValues","cleanStr","skipIndex","bracketEqualsPos","encodedVal","parseObject","chain","valuesParsed","parentKey","leaf","root","cleanRoot","decodedRoot","isValidArrayIndex","splitKeyIntoSegments","originalKey","parent","collected","level","cu","seg","content","parseKeys","givenKey","normalizeParseOptions","duplicates","parse","tempObj","newObj","lib","convertToNumberIfPossible","stringifyConfig","routerProvider","existingSearch","existingHash","to","keepQuery","keepHash","urlQuery","qs","QS_PARSE_DEPTH","hasUrlQuery","urlHash","hasUrlHash","fullPath","pathname","ResourceContext","matchedRoute","React","matchResourceFromRoute","matchPath","parsedSearch","combinedParams","PrimaryRail","activeAppId","onAppSelect","setTheme","userInitials","isLoggedIn","userPopoverContent","Separator","Icon","userMenu","Popover","Avatar","ContextualDrawer","onNavigate","expandedNodes","setExpandedNodes","toggleNode","renderNode","NavigationShell","defaultAppId","setActiveAppId","drawerOpen","setDrawerOpen","desktopCollapsed","setDesktopCollapsed","activeApp","HttpBackend","LanguageDetector","initReactI18next","translations","_options","_payload","ShellLayout","registryVersion","allApps","rawAppsStr","installed","mandatoryApps","filteredApps","mainContent","Outlet","navigation","RedirectToLogin","Navigate","EMPTY_PLUGINS","FrameworkMShell","defaultFocusMode","loginPage","rightMobileOpen","setRightMobileOpen","mobile","authzProvider","reg","permission","DiscoveryClient","setRegistryVersion","initializationStarted","prewarmCore","discovery","openapiPath","registerInitial","discoverRemotes","remotes","fetchRemotes","bootstrapTasks","scope","unit","loadRemoteScript","initializeRemote","module","loadRemoteModule","pluginRoutes","LazyComponent","element","Route","BrowserRouter","I18nextProvider","PluginRegistryProvider","ThemeProvider","MProvider","Refine","Routes","Authenticated"],"mappings":"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","x_google_ignoreList":[92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["qs"],"sources":["../src/constants.ts","../src/api.ts","../src/data.ts","../src/authConfig.ts","../src/auth.ts","../src/live.ts","../src/providers/SystemConfigProvider.tsx","../src/hooks/useMFetch.ts","../src/components/form/LinkWidgetHelpers.ts","../src/hooks/useDocTypeMeta.ts","../src/hooks/useDocTypes.ts","../src/hooks/useWorkflowActions.ts","../src/hooks/useRouteTraversal.ts","../src/hooks/useFormController.ts","../src/hooks/useInlineEdit.ts","../src/hooks/useBulkActions.ts","../src/hooks/useCommandPalette.ts","../src/hooks/useTranslation.ts","../src/hooks/useComponentOverride.ts","../src/hooks/usePageOverride.ts","../src/hooks/uiMetaUtils.ts","../src/hooks/useUIMeta.ts","../src/hooks/useCorrectionAction.ts","../src/hooks/useAuditTimeline.ts","../src/hooks/useSiblingDocTypes.ts","../src/hooks/useFormKeyboard.ts","../src/hooks/useListFilters.ts","../src/hooks/useFormActions.ts","../src/hooks/useListActions.ts","../src/components/layout/SystemInfo.tsx","../src/components/form/QuickEntryForm.tsx","../src/components/form/LinkWidget.tsx","../src/components/form/fields/TextField.tsx","../src/components/form/fields/BooleanField.tsx","../src/components/form/fields/SelectField.tsx","../src/components/form/fields/ListField.tsx","../src/components/form/fields/MultiSelectField.tsx","../src/components/form/fields/registry.ts","../src/components/form/fields/AutoField.tsx","../src/components/form/fields/ErrorsField.tsx","../src/components/form/fields/SubmitField.tsx","../src/components/form/AutoForm.tsx","../src/components/table/tableUtils.ts","../src/components/table/AutoTable.tsx","../src/components/table/EditableCell.tsx","../src/components/feedback/ConfirmDialog.tsx","../src/components/feedback/AlertBanner.tsx","../src/components/feedback/SubmittedBanner.tsx","../src/components/table/BulkActionsBar.tsx","../src/components/workflow/StateBadge.tsx","../src/components/workflow/WorkflowActions.tsx","../src/plugins/registry.ts","../src/plugins/Slot.tsx","../src/components/audit/DiffViewer.tsx","../src/components/audit/AuditTimeline.tsx","../src/components/list/AsOfDatePicker.tsx","../src/components/layout/ShellSkeleton.tsx","../src/views/registry.ts","../src/components/feedback/QuickEditModal.tsx","../src/views/utils.ts","../src/views/KanbanView.tsx","../src/views/CalendarView.tsx","../src/views/GanttView.tsx","../src/views/treeUtils.ts","../src/views/TreeView.tsx","../src/components/list/ListBodyLayout.tsx","../src/components/correction/CorrectionWizard.tsx","../src/components/correction/CorrectButton.tsx","../src/components/sibling/SiblingPanel.tsx","../src/components/CommandPalette.tsx","../src/components/menu/index.tsx","../src/components/breadcrumb/index.tsx","../src/components/layout/TabContainer.tsx","../src/components/layout/SectionField.tsx","../src/components/layout/ColumnGrid.tsx","../src/components/layout/PageHeader.tsx","../src/components/layout/index.tsx","../src/workspace/WorkspaceSection.tsx","../src/pages/ListView.tsx","../src/components/form/FormToolbar.tsx","../src/shell/context.ts","../src/hooks/useShell.ts","../src/components/form/FormBodyLayout.tsx","../src/components/form/FormViewHeader.tsx","../src/pages/FormView.tsx","../src/pages/loginUtils.ts","../src/pages/LoginLogo.tsx","../src/pages/LoginPage.tsx","../src/shell/adapters/localRealtimeAdapter.ts","../src/shell/hooks/useRealtime.ts","../src/shell/hooks/useOmniSearch.ts","../src/shell/hooks/useSidebarSections.ts","../src/shell/ShellProvider.tsx","../src/shell/realtime.ts","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.js","../__vite-browser-external","../../../node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/index.js","../../../node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/index.js","../../../node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/index.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/abs.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/floor.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/max.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/min.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/pow.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/round.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNaN.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/sign.js","../../../node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/gOPD.js","../../../node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/index.js","../../../node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/index.js","../../../node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/shams.js","../../../node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/index.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Reflect.getPrototypeOf.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Object.getPrototypeOf.js","../../../node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js","../../../node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionCall.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/reflectApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/actualApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/index.js","../../../node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/get.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/index.js","../../../node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/index.js","../../../node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/index.js","../../../node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/index.js","../../../node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/index.js","../../../node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/index.js","../../../node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/index.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/formats.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/utils.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/stringify.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/parse.js","../../../node_modules/.pnpm/qs@6.15.2/node_modules/qs/lib/index.js","../../../node_modules/.pnpm/@refinedev+react-router@2.0.4_@refinedev+core@5.0.12_@tanstack+react-query@5.101.0_reac_d192e1680de91b7ac273581345937860/node_modules/@refinedev/react-router/dist/index.mjs","../src/components/layout/Navigation/PrimaryRail.tsx","../src/components/layout/Navigation/ContextualDrawer.tsx","../src/components/layout/Navigation/NavigationShell.tsx","../src/components/layout/DefaultLandingPage.tsx","../src/config/i18n.ts","../src/components/layout/FrameworkMShell.tsx"],"sourcesContent":["/**\n * Framework M Frontend Configuration\n *\n * Configuration is loaded from window.__FRAMEWORK_CONFIG__ if available,\n * otherwise uses same-origin defaults.\n */\n\n// Type definition for global config\ndeclare global {\n interface Window {\n __FRAMEWORK_CONFIG__?: {\n apiBaseUrl?: string;\n apiVersion?: string;\n metaBaseUrl?: string;\n openapiUrl?: string;\n wsBaseUrl?: string;\n frameworkMode?: \"MONOLITH\" | \"MACROSERVICE\";\n basename?: string;\n /** Auth configuration */\n auth?: {\n authStrategy?: \"cookie\" | \"oidc\";\n loginUrl?: string;\n oidcConfig?: {\n authority: string;\n clientId: string;\n redirectUri: string;\n };\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n }\n}\n\ndeclare const process: { env: Record<string, string | undefined> };\n\n/**\n * Basename prefix for routing.\n */\nexport const BASENAME = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n return config.basename || \"\";\n})();\n\n/**\n * API version - defaults to v1, configurable via window config.\n */\nexport const API_VERSION = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n return config.apiVersion || \"v1\";\n})();\n\n/**\n * Execution mode - defaults to MONOLITH, configurable via window config or env.\n */\nexport const FRAMEWORK_MODE = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n if (config.frameworkMode) return config.frameworkMode;\n\n const envMode = typeof process !== \"undefined\" ? process.env.FRAMEWORK_MODE : undefined;\n return (envMode?.toUpperCase() || \"MONOLITH\") as \"MONOLITH\" | \"MACROSERVICE\";\n})();\n\n/**\n * API endpoints - uses same-origin by default, configurable via window config.\n * Supports dynamic service-prefixed paths (e.g., /api/finance/v1).\n */\nexport const API_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}`\n : `/api/${API_VERSION}`;\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base;\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}`\n : `/api/${API_VERSION}`;\n})();\n\nexport const META_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.metaBaseUrl) return config.metaBaseUrl;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\" ? `/api/${serviceName}/meta` : \"/api/meta\";\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base.replace(`/${API_VERSION}`, \"/meta\");\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\" ? `/api/${serviceName}/meta` : \"/api/meta\";\n})();\n\nexport const SCHEMA_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.openapiUrl) return config.openapiUrl;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\" ? `/api/${serviceName}/schema` : \"/api/schema\";\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base.replace(`/${API_VERSION}`, \"/schema\");\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/schema`\n : \"/api/schema\";\n})();\n\nexport const WS_URL = (() => {\n const config =\n (typeof globalThis !== \"undefined\" && (globalThis as unknown as Window).__FRAMEWORK_CONFIG__) ||\n {};\n const serviceName =\n typeof process !== \"undefined\" ? process.env.FRAMEWORK_M_SERVICE_NAME : undefined;\n\n if (config.wsBaseUrl) return config.wsBaseUrl;\n\n if (config.apiBaseUrl) {\n const base = config.apiBaseUrl;\n if (!base.includes(\"/api/\")) {\n const prefix =\n serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}/stream`\n : `/api/${API_VERSION}/stream`;\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}${prefix}` : `${base}${prefix}`;\n }\n return base.endsWith(\"/\") ? `${base.slice(0, -1)}/stream` : `${base}/stream`;\n }\n\n return serviceName && FRAMEWORK_MODE !== \"MONOLITH\"\n ? `/api/${serviceName}/${API_VERSION}/stream`\n : `/api/${API_VERSION}/stream`;\n})();\n","/**\n * Core API Client Utilities.\n *\n * Centralizes fetch logic and standardizes request headers,\n * including automatic Idempotency-Key injection for mutations.\n */\n\nimport { parseApiPath, PluginRegistry } from \"@framework-m/plugin-sdk\";\n\n/**\n * Wrapper around standard `fetch` that ensures credentials are included\n * and automatically injects an `Idempotency-Key` for mutating requests.\n *\n * @param url The URL to fetch.\n * @param options Standard RequestInit options.\n * @returns Promise<Response>\n */\nexport async function fetchWithCredentials(\n url: string | URL | Request,\n options: RequestInit = {}\n): Promise<Response> {\n const fetchOptions: RequestInit = {\n ...options,\n credentials: options.credentials ?? \"include\",\n };\n\n const headers = (fetchOptions.headers || {}) as Record<string, string>;\n\n // 1. Inject JWT if present\n const token = typeof window !== \"undefined\" ? localStorage.getItem(\"token\") : null;\n if (token && !headers[\"Authorization\"]) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // 2. Auto-inject Idempotency-Key for mutations\n const method = (fetchOptions.method || \"GET\").toUpperCase();\n const mutatingMethods = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\n if (mutatingMethods.includes(method)) {\n if (!headers[\"Idempotency-Key\"]) {\n headers[\"Idempotency-Key\"] = crypto.randomUUID();\n }\n }\n\n const registry = PluginRegistry.getInstance();\n const finalUrl = typeof url === \"string\" ? registry.resolveApiUrl(url) : url;\n\n // 3. Inject service hint if owner is known\n if (typeof url === \"string\" && url.includes(\"/api/\")) {\n const { resource } = parseApiPath(url);\n if (resource) {\n const owner = registry.getOwner(resource);\n if (owner && !headers[\"X-Framework-M-Service\"]) {\n headers[\"X-Framework-M-Service\"] = owner;\n }\n }\n }\n\n if (Object.keys(headers).length > 0) {\n fetchOptions.headers = headers;\n }\n\n return fetch(finalUrl, fetchOptions);\n}\n","/**\n * Framework M Data Provider for Refine\n *\n * Custom DataProvider implementation that connects to Framework M REST API.\n * Handles CRUD operations, pagination, sorting, and filtering.\n */\n\nimport type {\n BaseRecord,\n CreateParams,\n CreateResponse,\n CustomParams,\n CustomResponse,\n DataProvider,\n DeleteOneParams,\n DeleteOneResponse,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n UpdateParams,\n UpdateResponse,\n} from \"@refinedev/core\";\nimport { API_URL, API_VERSION, FRAMEWORK_MODE } from \"./constants\";\nimport { fetchWithCredentials as coreFetch } from \"./api\";\nimport { PluginRegistry } from \"@framework-m/plugin-sdk\";\nimport type { ListResponse } from \"./types\";\n\ninterface ErrorPayload {\n detail?: string;\n message?: string;\n error?: string;\n errors?: unknown;\n}\n\nclass FrameworkApiError extends Error {\n status: number;\n code?: string;\n details?: unknown;\n\n constructor(message: string, status: number, code?: string, details?: unknown) {\n super(message);\n this.name = \"FrameworkApiError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nfunction buildActionPermissionMessage(\n status: number,\n action: string | undefined,\n resource: string | undefined,\n backendMessage: string | undefined\n): string {\n const normalizedResource = resource ? resource.replaceAll(\"_\", \" \") : \"resource\";\n\n if (status === 401) {\n return backendMessage || \"Authentication required. Please log in.\";\n }\n\n if (status === 403) {\n const actionText = action ?? \"perform this action on\";\n const base = `Insufficient permission to ${actionText} ${normalizedResource}.`;\n if (backendMessage && !backendMessage.toLowerCase().includes(\"insufficient permission\")) {\n return `${base} ${backendMessage}`;\n }\n return base;\n }\n\n return (\n backendMessage ||\n `Request failed (${status}) while trying to ${action ?? \"access\"} ${normalizedResource}.`\n );\n}\n\n/**\n * Build pagination params\n */\nfunction buildPaginationParams(\n pagination: { current?: number; currentPage?: number; pageSize?: number } | undefined\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!pagination) return params;\n\n const current = pagination.currentPage ?? pagination.current ?? 1;\n const pageSize = pagination.pageSize ?? 20;\n params.set(\"limit\", String(pageSize));\n params.set(\"offset\", String((current - 1) * pageSize));\n return params;\n}\n\n/**\n * Build sorting params\n */\nfunction buildSortingParams(\n sorters: Array<{ field: string; order: string }> | undefined\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!sorters || sorters.length === 0) return params;\n\n const sorter = sorters[0]; // Framework M supports single sort\n const order = sorter.order === \"desc\" ? \"-\" : \"\";\n params.set(\"order_by\", `${order}${sorter.field}`);\n return params;\n}\n\n/**\n * Convert filter value to string\n */\nfunction filterValueToString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n return value.map((item) => filterValueToString(item)).join(\",\");\n }\n return JSON.stringify(value);\n}\n\n/**\n * Build filter params\n */\nfunction buildFilterParams(\n filters: Array<{ field?: string; operator?: string; value?: unknown }> | undefined\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!filters || filters.length === 0) return params;\n\n for (const filter of filters) {\n if (!(\"field\" in filter) || !filter.field || filter.value === undefined) {\n continue;\n }\n\n const op = filter.operator || \"eq\";\n const valueStr = filterValueToString(filter.value);\n\n if (op === \"eq\") {\n params.set(filter.field, valueStr);\n } else {\n // Framework M uses field[op]=value format\n params.set(`${filter.field}[${op}]`, valueStr);\n }\n }\n return params;\n}\n\n/**\n * Build query string from Refine params\n */\nfunction buildQueryString(params: GetListParams): string {\n const searchParams = new URLSearchParams();\n\n // Pagination\n const paginationParams = buildPaginationParams(\n params.pagination as { current?: number; pageSize?: number } | undefined\n );\n paginationParams.forEach((value, key) => searchParams.set(key, value));\n\n // Sorting\n const sortingParams = buildSortingParams(params.sorters);\n sortingParams.forEach((value, key) => searchParams.set(key, value));\n\n // Filters\n const filterParams = buildFilterParams(params.filters);\n filterParams.forEach((value, key) => searchParams.set(key, value));\n\n return searchParams.toString();\n}\n\n/**\n * Make a fetch request with credentials (cookies)\n */\nasync function fetchWithCredentials<T>(\n url: string,\n options: RequestInit = {},\n context?: { action?: string; resource?: string }\n): Promise<T> {\n const response = await coreFetch(url, {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as ErrorPayload;\n\n const backendMessage =\n (typeof payload.message === \"string\" && payload.message) ||\n (typeof payload.detail === \"string\" && payload.detail) ||\n response.statusText;\n\n const message = buildActionPermissionMessage(\n response.status,\n context?.action,\n context?.resource,\n backendMessage\n );\n\n throw new FrameworkApiError(\n message,\n response.status,\n typeof payload.error === \"string\" ? payload.error : undefined,\n payload.errors\n );\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return {} as T;\n }\n\n return response.json();\n}\n\n/**\n * Build resource URL handling namespaced resources (service/doctype).\n * Automatically resolves owner from registry for flat resource names.\n */\nfunction buildResourceUrl(resource: string, id?: string | number, query?: string): string {\n let url: string;\n const registry = PluginRegistry.getInstance();\n\n let service: string | undefined;\n let doctype = resource;\n\n if (resource.includes(\"/\")) {\n const [s, ...rest] = resource.split(\"/\");\n service = s;\n doctype = rest.join(\"/\");\n } else {\n // Check registry for owner\n service = registry.getOwner(resource) || undefined;\n }\n\n if (service && FRAMEWORK_MODE !== \"MONOLITH\") {\n url = `/api/${service}/${API_VERSION}/${doctype}`;\n } else {\n url = `${API_URL}/${doctype}`;\n }\n\n if (id !== undefined) {\n url += `/${id}`;\n }\n\n if (query) {\n url += `?${query}`;\n }\n\n return registry.resolveApiUrl(url);\n}\n\n/**\n * Framework M Data Provider\n */\nexport const frameworkMDataProvider: DataProvider = {\n /**\n * Get a list of resources with pagination, sorting, and filtering\n */\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource } = params;\n const query = buildQueryString(params);\n const url = buildResourceUrl(resource, undefined, query);\n\n const response = await fetchWithCredentials<ListResponse<TData>>(\n url,\n {},\n {\n action: \"read\",\n resource,\n }\n );\n\n return {\n data: response.items,\n total: response.total,\n };\n },\n\n /**\n * Get a single resource by ID\n */\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n const url = buildResourceUrl(resource, id);\n\n const data = await fetchWithCredentials<TData>(\n url,\n {},\n {\n action: \"read\",\n resource,\n }\n );\n\n return { data };\n },\n\n /**\n * Create a new resource\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n const url = buildResourceUrl(resource);\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"POST\",\n body: JSON.stringify(variables),\n },\n {\n action: \"create\",\n resource,\n }\n );\n\n return { data };\n },\n\n /**\n * Update an existing resource\n */\n update: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n const url = buildResourceUrl(resource, id);\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"PUT\",\n body: JSON.stringify(variables),\n },\n {\n action: \"update\",\n resource,\n }\n );\n\n return { data };\n },\n\n /**\n * Delete a resource\n */\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n const url = buildResourceUrl(resource, id);\n\n await fetchWithCredentials(\n url,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n }\n );\n\n return { data: { id } as TData };\n },\n\n /**\n * Delete multiple resources by IDs\n */\n deleteMany: async <TData extends BaseRecord = BaseRecord>(params: {\n resource: string;\n ids: (string | number)[];\n }): Promise<{ data: TData[] }> => {\n const { resource, ids } = params;\n\n // Delete each item in parallel\n await Promise.all(\n ids.map((id) =>\n fetchWithCredentials(\n buildResourceUrl(resource, id),\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n }\n ).catch(() => {})\n )\n );\n\n return { data: ids.map((id) => ({ id }) as TData) };\n },\n\n /**\n * Get the API URL (required by Refine)\n */\n getApiUrl: () => API_URL,\n\n /**\n * Custom method for Framework M specific operations\n * e.g., workflow transitions, RPC calls\n */\n custom: async <TData extends BaseRecord = BaseRecord, TQuery = unknown, TPayload = unknown>(\n params: CustomParams<TQuery, TPayload>\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, headers } = params;\n const fullUrl = url.startsWith(\"http\") ? url : `${API_URL}${url}`;\n\n const data = await fetchWithCredentials<TData>(\n fullUrl,\n {\n method: method || \"GET\",\n body: payload ? JSON.stringify(payload) : undefined,\n headers: headers as HeadersInit,\n },\n {\n action: (method || \"GET\").toLowerCase(),\n resource: \"custom endpoint\",\n }\n );\n\n return { data };\n },\n};\n","/**\n * Auth Configuration Types\n *\n * Per checklist 4.1: Auth configuration via window.__FRAMEWORK_CONFIG__\n */\n\n/**\n * OIDC configuration for client-side PKCE flow\n */\nexport interface OIDCConfig {\n /** OIDC authority URL */\n authority: string;\n /** Client ID */\n clientId: string;\n /** Redirect URI after auth */\n redirectUri: string;\n /** Post-logout redirect URI */\n postLogoutRedirectUri?: string;\n /** Scopes to request */\n scope?: string;\n}\n\n/**\n * Auth strategy type\n * - \"cookie\": Indie/BFF mode with HttpOnly cookies\n * - \"oidc\": Client-side PKCE with OIDC provider\n */\nexport type AuthStrategy = \"cookie\" | \"oidc\";\n\n/**\n * Framework auth configuration\n */\nexport interface AuthConfig {\n /** Auth strategy */\n authStrategy: AuthStrategy;\n /** Login URL for cookie mode (redirect on 401) */\n loginUrl?: string;\n /** OIDC config for oidc mode */\n oidcConfig?: OIDCConfig;\n}\n\n/**\n * Get auth config from window or defaults\n */\nexport function getAuthConfig(): AuthConfig {\n const config = (window as unknown as { __FRAMEWORK_CONFIG__?: { auth?: AuthConfig } })\n .__FRAMEWORK_CONFIG__?.auth;\n\n return {\n authStrategy: config?.authStrategy ?? \"cookie\",\n loginUrl: config?.loginUrl ?? \"/login\",\n oidcConfig: config?.oidcConfig,\n };\n}\n","/**\n * Framework M Auth Provider for Refine\n *\n * Cookie-based authentication that integrates with Framework M's auth endpoints.\n * Uses HttpOnly cookies for secure token storage.\n */\n\nimport type { AuthProvider } from \"@refinedev/core\";\nimport { API_URL } from \"./constants\";\nimport { getAuthConfig } from \"./authConfig\";\nimport { fetchWithCredentials } from \"./api\";\nimport type { UserIdentity } from \"./types\";\n\n/**\n * Framework M Auth Provider\n *\n * Authentication Strategy:\n * - Login: POST /api/v1/auth/login (sets HttpOnly cookie)\n * - Logout: POST /api/v1/auth/logout (clears cookie)\n * - Check: GET /api/v1/auth/me (validates session)\n */\nexport const authProvider: AuthProvider = {\n /**\n * Login with email and password\n */\n login: async ({ email, password }: { email: string; password: string }) => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\", // Required for cookies\n body: JSON.stringify({ email, password }),\n });\n\n if (response.ok) {\n // Priority 1: ?to= deep-link param — always wins (shared links, permission redirects)\n const toParam = new URLSearchParams(globalThis.location?.search ?? \"\").get(\"to\");\n if (toParam) {\n return {\n success: true,\n redirectTo: decodeURIComponent(toParam),\n };\n }\n\n // Priority 2: Backend-resolved landing route (role-aware, policy-driven)\n try {\n const landingResp = await fetchWithCredentials(`${API_URL}/auth/landing`, {\n credentials: \"include\",\n });\n if (landingResp.ok) {\n const { route } = (await landingResp.json()) as { route: string };\n return { success: true, redirectTo: route ?? \"/app/dashboard\" };\n }\n } catch {\n // Landing endpoint unavailable — fall through to default\n }\n\n // Priority 3: Safe default\n return {\n success: true,\n redirectTo: \"/app/dashboard\",\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Invalid credentials\",\n }));\n\n const errorMessage = error.message || error.detail || \"Invalid email or password\";\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: errorMessage,\n },\n };\n } catch {\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Network error. Please try again.\",\n },\n };\n }\n },\n\n /**\n * Logout and clear session\n */\n logout: async () => {\n try {\n await fetchWithCredentials(`${API_URL}/auth/logout`, {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n // Ignore logout errors, redirect anyway\n }\n\n return {\n success: true,\n redirectTo: \"/login\",\n };\n },\n\n /**\n * Check if user is authenticated\n */\n check: async () => {\n const isGuest = (user: Record<string, unknown>) => {\n if (user.authenticated === false) return true;\n const id = String(user.id ?? \"\").toLowerCase();\n const name = String(user.name ?? \"\").toLowerCase();\n const email = String(user.email ?? \"\").toLowerCase();\n return id === \"guest\" || name === \"guest user\" || email === \"guest\";\n };\n\n const fetchMe = () => fetchWithCredentials(`${API_URL}/auth/me`, { credentials: \"include\" });\n\n try {\n let response = await fetchMe();\n\n if (response.ok) {\n let user = await response.json();\n\n // Race condition guard: if we got Guest right after login, retry once.\n // The browser may not have committed the Set-Cookie header yet.\n if (isGuest(user)) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n try {\n response = await fetchMe();\n if (response.ok) {\n user = await response.json();\n }\n } catch {\n // ignore retry failure, fall through\n }\n }\n\n if (isGuest(user)) {\n const { loginUrl } = getAuthConfig();\n return { authenticated: false, redirectTo: loginUrl ?? \"/login\" };\n }\n return { authenticated: true };\n }\n\n const { loginUrl } = getAuthConfig();\n return { authenticated: false, redirectTo: loginUrl ?? \"/login\" };\n } catch {\n const { loginUrl } = getAuthConfig();\n return { authenticated: false, redirectTo: loginUrl ?? \"/login\" };\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<UserIdentity | null> => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } = await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (identityId === \"guest\" || identityName === \"guest user\" || identityEmail === \"guest\") {\n return null;\n }\n return {\n id: user.id,\n email: user.email,\n name: user.name || user.email,\n avatar: user.avatar,\n roles: user.roles || [],\n locale: user.locale,\n };\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get user permissions (roles)\n */\n getPermissions: async () => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } = await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (identityId === \"guest\" || identityName === \"guest user\" || identityEmail === \"guest\") {\n return null;\n }\n return user.roles || [];\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Handle authentication errors\n */\n onError: async (error: unknown) => {\n const err = error as { status?: number };\n // If 401 Unauthorized, logout and redirect\n if (err && err.status === 401) {\n const { loginUrl } = getAuthConfig();\n return {\n logout: true,\n redirectTo: loginUrl ?? \"/login\",\n };\n }\n\n // For other errors, just return the error\n return { error: error as Error };\n },\n};\n\n/**\n * Check whether the current authenticated user is authorized to access a resource.\n *\n * Delegates to the backend `/authz/evaluate` endpoint which routes the request\n * through whatever `PermissionProtocol` adapter is configured on the server:\n *\n * - **Indie mode** (default): `RbacPermissionAdapter` — simple role matching\n * against `DocType.Meta.permissions`. Zero extra setup required.\n * - **Enterprise / SaaS mode**: Any custom adapter (OPA, SpiceDB, etc.) injected\n * via `configure_authz_routes(my_adapter)` at startup in the backend.\n *\n * Used by `FrameworkMShell`'s `setPermissionChecker` to gate navigation nodes\n * that declare `node.permissions = [\"Accounts Manager\"]`.\n *\n * The `resource` string is typically a role name for navigation gating or a\n * DocType name for fine-grained CRUD permission checks.\n */\nexport async function checkUserRole(resource: string): Promise<boolean> {\n try {\n const response = await fetchWithCredentials(`${API_URL}/authz/evaluate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ resource, action: \"read\" }),\n });\n\n if (!response.ok) return false;\n\n const result: { authorized: boolean } = await response.json();\n return result.authorized === true;\n } catch {\n return false;\n }\n}\n","/**\n * Framework M Live Provider for Refine\n *\n * WebSocket-based real-time updates provider.\n * Per checklist 6.1: Refine Live Provider Implementation.\n *\n * Features:\n * - Subscribe to resource changes via WebSocket\n * - Automatic UI updates on created/updated/deleted events\n * - Channel-based pub/sub\n */\n\nimport type { LiveProvider, LiveEvent } from \"@refinedev/core\";\nimport { WS_URL } from \"./constants\";\nimport { fetchWithCredentials } from \"./api\";\n\n/**\n * Active WebSocket connections by channel\n */\nconst connections = new Map<string, WebSocket>();\n\n/**\n * Subscription callbacks by channel\n */\nconst subscriptions = new Map<string, Set<(event: LiveEvent) => void>>();\n\n/**\n * Get or create WebSocket connection for a channel\n */\nfunction getConnection(channel: string): WebSocket {\n let ws = connections.get(channel);\n\n if (ws && ws.readyState === WebSocket.OPEN) {\n return ws;\n }\n\n // Create new connection\n let wsUrl = WS_URL;\n if (!WS_URL.startsWith(\"ws\")) {\n const protocol = globalThis.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl = `${protocol}//${globalThis.location.host}${WS_URL}`;\n }\n\n ws = new WebSocket(`${wsUrl}?channel=${encodeURIComponent(channel)}`);\n\n ws.onopen = () => {\n console.debug(`[LiveProvider] Connected to channel: ${channel}`);\n };\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data) as LiveEvent;\n\n // Notify all subscribers for this channel\n const callbacks = subscriptions.get(channel);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (err) {\n console.error(\"[LiveProvider] Callback error:\", err);\n }\n });\n }\n } catch (err) {\n console.error(\"[LiveProvider] Failed to parse message:\", err);\n }\n };\n\n ws.onerror = (error) => {\n console.error(`[LiveProvider] WebSocket error on channel ${channel}:`, error);\n };\n\n ws.onclose = () => {\n console.debug(`[LiveProvider] Disconnected from channel: ${channel}`);\n connections.delete(channel);\n };\n\n connections.set(channel, ws);\n return ws;\n}\n\n/**\n * Close connection if no more subscribers\n */\nfunction maybeCloseConnection(channel: string): void {\n const callbacks = subscriptions.get(channel);\n if (!callbacks || callbacks.size === 0) {\n const ws = connections.get(channel);\n if (ws) {\n ws.close();\n connections.delete(channel);\n }\n subscriptions.delete(channel);\n }\n}\n\n/**\n * Framework M Live Provider\n *\n * Implements Refine's LiveProvider interface for real-time updates.\n *\n * @example\n * ```tsx\n * <Refine\n * liveProvider={liveProvider}\n * options={{ liveMode: \"auto\" }}\n * />\n * ```\n */\nexport const liveProvider: LiveProvider = {\n /**\n * Subscribe to resource changes\n */\n subscribe: ({\n channel,\n types,\n callback,\n params,\n }: {\n channel?: string;\n types?: string[];\n callback: (event: LiveEvent) => void;\n params?: { resource?: string };\n }) => {\n // Use resource as channel if not specified\n const channelName = channel ?? params?.resource ?? \"default\";\n\n // Ensure connection exists\n getConnection(channelName);\n\n // Create filtered callback\n const filteredCallback = (event: LiveEvent) => {\n // Filter by types if specified\n if (types && types.length > 0 && !types.includes(event.type)) {\n return;\n }\n\n // Filter by resource if specified\n if (params?.resource && event.channel !== params.resource && event.channel !== channelName) {\n return;\n }\n\n callback(event);\n };\n\n // Add to subscriptions\n if (!subscriptions.has(channelName)) {\n subscriptions.set(channelName, new Set());\n }\n subscriptions.get(channelName)!.add(filteredCallback);\n\n // Return unsubscribe function\n return () => {\n const callbacks = subscriptions.get(channelName);\n if (callbacks) {\n callbacks.delete(filteredCallback);\n maybeCloseConnection(channelName);\n }\n };\n },\n\n /**\n * Unsubscribe from resource changes\n */\n unsubscribe: (unsubscribeFn: (() => void) | undefined) => {\n // Call the unsubscribe function returned by subscribe\n if (typeof unsubscribeFn === \"function\") {\n unsubscribeFn();\n }\n },\n\n /**\n * Publish an event (optional, usually server-driven)\n */\n publish: async (event: { channel: string; type: string; payload: unknown }) => {\n const { channel, type, payload } = event;\n\n try {\n // Use REST endpoint to publish (server will broadcast via WebSocket)\n const apiUrl = WS_URL.replace(/^ws/, \"http\").replace(\"/stream\", \"/live/publish\");\n\n await fetchWithCredentials(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ channel, type, payload }),\n });\n } catch (err) {\n console.error(\"[LiveProvider] Failed to publish event:\", err);\n }\n },\n};\n\n/**\n * Close all WebSocket connections\n * Call this on app unmount or logout\n */\nexport function closeAllConnections(): void {\n connections.forEach((ws) => {\n ws.close();\n });\n connections.clear();\n subscriptions.clear();\n}\n","import { createContext, useContext, ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { fetchWithCredentials } from \"../api\";\nimport { API_URL } from \"../constants\";\n\nexport interface LocaleInfo {\n code: string;\n label: string;\n}\n\nexport interface SystemConfig {\n app_name?: string;\n timezone?: string;\n date_format?: string;\n time_format?: string;\n language?: string;\n enable_signup?: boolean;\n maintenance_mode?: boolean;\n supported_locales?: LocaleInfo[];\n}\n\nexport interface SystemConfigContextValue {\n config: SystemConfig | undefined;\n supportedLocales: LocaleInfo[];\n isLoading: boolean;\n error: Error | null;\n}\n\nconst SystemConfigContext = createContext<SystemConfigContextValue | undefined>(undefined);\n\nconst DEFAULT_LOCALES: LocaleInfo[] = [\n { code: \"en\", label: \"English\" },\n { code: \"hi\", label: \"हिन्दी\" },\n { code: \"ta\", label: \"தமிழ்\" },\n { code: \"es\", label: \"Español\" },\n { code: \"fr\", label: \"Français\" },\n { code: \"mr\", label: \"मराठी\" },\n { code: \"ur\", label: \"اردو\" },\n];\n\nasync function fetchSystemConfig(): Promise<SystemConfig> {\n const response = await fetchWithCredentials(`${API_URL}/system/config`, {\n credentials: \"include\",\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch system settings: ${response.statusText}`);\n }\n return response.json();\n}\n\nexport function SystemConfigProvider({ children }: { children: ReactNode }) {\n const {\n data: config,\n isLoading,\n error,\n } = useQuery<SystemConfig, Error>({\n queryKey: [\"system-config\"],\n queryFn: fetchSystemConfig,\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n });\n\n const supportedLocales =\n config?.supported_locales && config.supported_locales.length > 0\n ? config.supported_locales\n : DEFAULT_LOCALES;\n\n return (\n <SystemConfigContext.Provider\n value={{ config, supportedLocales, isLoading, error: error ?? null }}\n >\n {children}\n </SystemConfigContext.Provider>\n );\n}\n\nexport function useSystemConfig(): SystemConfigContextValue {\n const context = useContext(SystemConfigContext);\n if (context === undefined) {\n return {\n config: undefined,\n supportedLocales: DEFAULT_LOCALES,\n isLoading: false,\n error: null,\n };\n }\n return context;\n}\n","import { fetchWithCredentials } from \"../api\";\n\n/**\n * useMFetch — A service-aware fetch hook for Framework M.\n *\n * This hook returns a fetch function that automatically handles:\n * 1. Routing of /api/v1/:resource to the correct macroservice (e.g. /api/finance/v1/...).\n * 2. Injection of credentials and idempotency keys (via fetchWithCredentials).\n * 3. Injection of X-Framework-M-Service headers for gateway proxying.\n */\nexport function useMFetch() {\n return fetchWithCredentials;\n}\n","import { useState, useEffect } from \"react\";\n\n/**\n * Debounce helper\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Get nested path values safely\n */\nexport function getPathValue(source: unknown, path: string): unknown {\n if (!source || !path) {\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n let current: unknown = source;\n\n for (const segment of segments) {\n if (current == null || typeof current !== \"object\") {\n return undefined;\n }\n\n if (Array.isArray(current)) {\n const index = Number(segment);\n if (!Number.isInteger(index) || index < 0 || index >= current.length) {\n return undefined;\n }\n current = current[index];\n continue;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Resolve watch relational paths\n */\nexport function resolveWatchPath(fieldName: string | undefined, watchField: string): string {\n if (!watchField) {\n return \"\";\n }\n\n if (watchField.includes(\".\")) {\n return watchField;\n }\n\n if (!fieldName || !fieldName.includes(\".\")) {\n return watchField;\n }\n\n const segments = fieldName.split(\".\");\n return `${segments.slice(0, -1).join(\".\")}.${watchField}`;\n}\n","/**\n * useDocTypeMeta Hook\n *\n * Fetches and caches DocType metadata from /api/meta/{doctype}.\n * Uses React Query for aggressive caching.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { META_URL } from \"../constants\";\nimport { fetchWithCredentials } from \"../api\";\nimport type {\n DocTypeMeta,\n DocTypeSchema,\n DocTypePermissions,\n LayoutConfig,\n WorkflowConfig,\n} from \"./types\";\n\n/**\n * Fetch metadata for a DocType\n */\nasync function fetchDocTypeMeta(doctype: string): Promise<DocTypeMeta> {\n const response = await fetchWithCredentials(`${META_URL}/${doctype}`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({ detail: response.statusText }))) as {\n detail?: string;\n message?: string;\n error?: string;\n };\n\n const backendMessage = payload.message || payload.detail || response.statusText;\n\n throw new Error(`Failed to fetch metadata for ${doctype}: ${backendMessage}`);\n }\n\n return response.json();\n}\n\n/**\n * Return type for useDocTypeMeta hook\n */\nexport interface UseDocTypeMetaResult {\n /** JSON Schema for the DocType */\n schema: DocTypeSchema | undefined;\n /** Layout configuration for form rendering */\n layout: LayoutConfig | undefined;\n /** Permissions for current user */\n permissions: DocTypePermissions | undefined;\n /** Workflow configuration if applicable */\n workflow: WorkflowConfig | undefined;\n /** Full metadata object */\n meta: DocTypeMeta | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch and cache DocType metadata\n *\n * @param doctype - Name of the DocType to fetch metadata for\n * @returns Metadata including schema, layout, permissions, and workflow\n *\n * @example\n * ```tsx\n * const { schema, layout, permissions, workflow } = useDocTypeMeta(\"Todo\");\n *\n * if (isLoading) return <Spinner />;\n * if (!permissions?.read) return <AccessDenied />;\n *\n * return <AutoForm schema={schema} layout={layout} />;\n * ```\n */\nexport function useDocTypeMeta(doctype: string): UseDocTypeMetaResult {\n const {\n data: meta,\n isLoading,\n error,\n refetch,\n } = useQuery<DocTypeMeta, Error>({\n queryKey: [\"doctype-meta\", doctype],\n queryFn: () => fetchDocTypeMeta(doctype),\n // Cache metadata aggressively - it rarely changes\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)\n // Only fetch when doctype is provided\n enabled: Boolean(doctype),\n });\n\n return {\n schema: meta?.schema,\n layout: meta?.layout,\n permissions: meta?.permissions,\n workflow: meta?.workflow,\n meta,\n isLoading,\n error: error ?? null,\n refetch,\n };\n}\n\n/**\n * Hook to prefetch DocType metadata\n *\n * Useful for preloading metadata before navigation\n */\nexport function usePrefetchDocTypeMeta() {\n // Using a dummy query to access the query system\n useQuery({\n queryKey: [\"prefetch-helper\"],\n queryFn: () => null,\n enabled: false,\n });\n\n return {\n prefetch: (doctype: string) => {\n // Access queryClient from context would be better,\n // but this works for simple prefetching\n fetchDocTypeMeta(doctype).catch(() => {\n // Silently fail prefetch\n });\n },\n };\n}\n","/**\n * useDocTypes Hook\n *\n * Fetches DocTypes from the backend API and converts them to Refine resources.\n * Used to dynamically populate the sidebar with available DocTypes.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useMFetch } from \"./useMFetch\";\n\n/**\n * DocType metadata from API\n */\nexport interface DocTypeMeta {\n name: string;\n module: string;\n label: string;\n is_child_table: boolean;\n is_singleton: boolean;\n api_resource: boolean;\n show_in_desk: boolean; // Whether to show in Desk UI\n metadata: Record<string, unknown>;\n}\n\n/**\n * Refine resource configuration\n */\nexport interface RefineResource {\n name: string;\n list?: string;\n create?: string;\n edit?: string;\n show?: string;\n meta?: {\n label?: string;\n canDelete?: boolean;\n is_singleton?: boolean;\n };\n}\n\n/**\n * Hook return type\n */\nexport interface UseDocTypesResult {\n /** Array of DocType metadata */\n doctypes: DocTypeMeta[];\n /** Array of Refine resources for dynamic routing */\n resources: RefineResource[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => Promise<void>;\n}\n\n/**\n * API response format\n */\ninterface DocTypesResponse {\n doctypes: DocTypeMeta[];\n count: number;\n}\n\n/**\n * Fetch DocTypes from Backend API\n *\n * Fetches all registered DocTypes from /api/meta/doctypes and converts\n * them to Refine resource format for use in the application.\n *\n * @returns Object containing doctypes, resources, loading state, and error\n *\n * @example\n * ```tsx\n * const { resources, isLoading, error } = useDocTypes();\n *\n * if (isLoading) return <Spinner />;\n *\n * return <Refine resources={resources}>...</Refine>;\n * ```\n */\nexport function mapDocTypeToResource(dt: DocTypeMeta): RefineResource {\n const isSingleton = Boolean(dt.is_singleton || dt.metadata?.is_singleton);\n const listRoute = isSingleton ? `/app/${dt.name}/edit/singleton` : `/app/${dt.name}/list`;\n\n return {\n name: dt.name,\n list: listRoute,\n create: isSingleton ? undefined : `/app/${dt.name}/new`,\n edit: `/app/${dt.name}/edit/:id`,\n show: `/app/${dt.name}/detail/:id`,\n meta: {\n label: dt.label || dt.name.replace(/([A-Z])/g, \" $1\").trim(),\n canDelete: !isSingleton,\n is_singleton: isSingleton,\n },\n };\n}\n\nexport function useDocTypes(): UseDocTypesResult {\n const [doctypes, setDocTypes] = useState<DocTypeMeta[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const mfetch = useMFetch();\n\n const fetchDocTypes = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await mfetch(\"/api/meta/doctypes\");\n\n if (!response.ok) {\n throw new Error(`Failed to fetch DocTypes: ${response.statusText}`);\n }\n\n const data: DocTypesResponse = await response.json();\n setDocTypes(data.doctypes);\n } catch (err) {\n console.error(\"Error fetching DocTypes:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n fetchDocTypes();\n }, []);\n\n const resources: RefineResource[] = doctypes\n .filter((dt) => dt.show_in_desk && !dt.is_child_table && dt.api_resource)\n .map(mapDocTypeToResource);\n\n return {\n doctypes,\n resources,\n isLoading,\n error,\n refetch: fetchDocTypes,\n };\n}\n\nexport default useDocTypes;\n","/**\n * useWorkflowActions Hook\n *\n * Fetches available workflow transitions for a document and\n * provides methods to execute transitions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { API_URL } from \"../constants\";\nimport { fetchWithCredentials } from \"../api\";\n\n/**\n * Workflow action (transition) definition\n */\nexport interface WorkflowAction {\n name: string;\n label: string;\n from_state: string;\n to_state: string;\n allowed: boolean;\n reason?: string; // Why not allowed, if applicable\n}\n\n/**\n * Workflow state information\n */\nexport interface WorkflowState {\n current_state: string;\n docstatus: number;\n workflow_name?: string;\n}\n\n/**\n * Workflow actions response from API\n */\ninterface WorkflowActionsResponse {\n state: WorkflowState;\n actions: WorkflowAction[];\n}\n\n/**\n * Return type for useWorkflowActions hook\n */\nexport interface UseWorkflowActionsResult {\n /** Current workflow state */\n state: WorkflowState | undefined;\n /** Available actions for current user */\n actions: WorkflowAction[];\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Execute a workflow transition */\n executeAction: (actionName: string) => Promise<void>;\n /** Is an action currently executing */\n isExecuting: boolean;\n /** Refresh actions */\n refetch: () => void;\n}\n\n/**\n * Fetch workflow actions for a document\n */\nasync function fetchWorkflowActions(doctype: string, id: string): Promise<WorkflowActionsResponse> {\n const response = await fetchWithCredentials(`${API_URL}/workflow/${doctype}/${id}/actions`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow actions: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Execute a workflow transition\n */\nasync function executeTransition(doctype: string, id: string, action: string): Promise<void> {\n const response = await fetchWithCredentials(`${API_URL}/workflow/${doctype}/${id}/transition`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({\n detail: response.statusText,\n }));\n throw new Error(error.detail || `Failed to execute ${action}`);\n }\n}\n\n/**\n * Hook to manage workflow actions for a document\n *\n * @param doctype - The DocType name\n * @param id - The document ID\n * @param options - Additional options\n *\n * @example\n * ```tsx\n * const { state, actions, executeAction, isExecuting } = useWorkflowActions(\"Todo\", todoId);\n *\n * return (\n * <div>\n * <StateBadge state={state?.current_state} />\n * {actions.map(action => (\n * <button\n * key={action.name}\n * onClick={() => executeAction(action.name)}\n * disabled={!action.allowed || isExecuting}\n * >\n * {action.label}\n * </button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useWorkflowActions(\n doctype: string,\n id: string | undefined,\n options?: { enabled?: boolean }\n): UseWorkflowActionsResult {\n const queryClient = useQueryClient();\n const [isExecuting, setIsExecuting] = useState(false);\n\n const enabled = Boolean(id) && (options?.enabled ?? true);\n\n const { data, isLoading, error, refetch } = useQuery<WorkflowActionsResponse, Error>({\n queryKey: [\"workflow-actions\", doctype, id],\n queryFn: () => fetchWorkflowActions(doctype, id!),\n enabled,\n staleTime: 30 * 1000, // 30 seconds\n });\n\n const executeAction = useCallback(\n async (actionName: string) => {\n if (!id) return;\n\n setIsExecuting(true);\n try {\n await executeTransition(doctype, id, actionName);\n\n // Invalidate queries to refresh state\n await queryClient.invalidateQueries({\n queryKey: [\"workflow-actions\", doctype, id],\n });\n // Also invalidate the document data\n await queryClient.invalidateQueries({\n queryKey: [doctype, id],\n });\n } finally {\n setIsExecuting(false);\n }\n },\n [doctype, id, queryClient]\n );\n\n return {\n state: data?.state,\n actions: data?.actions ?? [],\n isLoading,\n error: error ?? null,\n executeAction,\n isExecuting,\n refetch,\n };\n}\n","/**\n * useRouteTraversal Hook\n *\n * Retrieves a custom route traversal function (e.g., \"resolveDetailRoute\").\n * Enforces a Last-In-Wins priority rule across loaded plugins.\n */\n\nimport { useContext } from \"react\";\nimport { PluginRegistryContext } from \"@framework-m/plugin-sdk\";\n\nexport function useRouteTraversal(action: string): ((...args: unknown[]) => unknown) | null {\n const registry = useContext(PluginRegistryContext);\n if (!registry) return null;\n\n const allPlugins = registry.getAllPlugins();\n\n // Traverse plugins backwards to enforce Last-In-Wins priority\n for (let i = allPlugins.length - 1; i >= 0; i--) {\n // Cast to include traversals in case the SDK hasn't been rebuilt locally yet\n const plugin = allPlugins[i] as (typeof allPlugins)[0] & {\n traversals?: Record<string, unknown>;\n };\n const traversals = plugin.traversals;\n if (traversals && typeof traversals[action] === \"function\") {\n return traversals[action] as (...args: unknown[]) => unknown;\n }\n }\n\n return null;\n}\n","import { useState, useCallback, useMemo, useEffect } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport { useOne, useCreate, useUpdate } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"./useDocTypeMeta\";\nimport { useWorkflowActions } from \"./useWorkflowActions\";\nimport { useRouteTraversal } from \"./useRouteTraversal\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Frm<T = any> {\n doc: T;\n setDoc: (data: Partial<T> | ((prev: T) => T)) => void;\n save: () => Promise<void>;\n cancel: () => void;\n isEditing: boolean;\n isSaving: boolean;\n isLocked: boolean;\n errors: string[];\n notices: string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n workflow?: any;\n refetch: () => Promise<void>;\n}\n\nexport interface UseFormControllerProps {\n doctype?: string;\n id?: string;\n}\n\nexport function useFormController({\n doctype: propDoctype,\n id: propId,\n}: UseFormControllerProps = {}) {\n const params = useParams<{ doctype: string; id: string }>();\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const id = propId ?? params.id;\n\n const { schema, isLoading: metaLoading, error: metaError } = useDocTypeMeta(doctype);\n const isEditing = !!id;\n\n const queryResult = useOne({\n resource: doctype,\n id: id ?? \"\",\n queryOptions: { enabled: isEditing },\n });\n\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n const { state: workflowState } = useWorkflowActions(doctype, id, {\n enabled: isEditing,\n });\n\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [errors, setErrors] = useState<string[]>([]);\n const [notices] = useState<string[]>([]);\n\n useEffect(() => {\n setFormData({});\n setErrors([]);\n }, [id, doctype]);\n\n const record = queryResult?.result ?? queryResult?.query?.data?.data;\n const currentDoc =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.keys(formData).length > 0 || !queryResult?.query?.isSuccess ? formData : (record as any);\n const isSaving = createMutation.mutation.isPending || updateMutation.mutation.isPending;\n const currentDocstatus = Number((currentDoc as { docstatus?: unknown }).docstatus);\n const isLocked = currentDocstatus === 1 || currentDocstatus === 2;\n\n const navigate = useNavigate();\n const resolveListRoute = useRouteTraversal(\"resolveListRoute\");\n\n const handleSave = useCallback(async () => {\n try {\n const values = currentDoc;\n const options = {\n onSuccess: () => {\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onError: (err: any) => setErrors([err.message]),\n };\n\n if (isEditing) {\n updateMutation.mutate({ resource: doctype, id: id ?? \"\", values }, options);\n } else {\n createMutation.mutate({ resource: doctype, values }, options);\n }\n } catch (err) {\n setErrors([(err as Error).message]);\n }\n }, [\n doctype,\n id,\n isEditing,\n currentDoc,\n navigate,\n resolveListRoute,\n updateMutation,\n createMutation,\n ]);\n\n const handleCancel = useCallback(() => {\n if (id === \"singleton\") {\n navigate(\"/app/dashboard\");\n return;\n }\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n }, [navigate, doctype, resolveListRoute, id]);\n\n const handleRefetch = useCallback(async () => {\n await queryResult?.query?.refetch?.();\n }, [queryResult]);\n\n const frm: Frm = useMemo(\n () => ({\n doc: currentDoc,\n setDoc: (update) => {\n if (typeof update === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setFormData((prev) => update(prev as any));\n } else {\n setFormData((prev) => ({ ...prev, ...update }));\n }\n setErrors([]);\n },\n save: handleSave,\n cancel: handleCancel,\n isEditing,\n isSaving,\n isLocked,\n errors,\n notices,\n workflow: workflowState,\n refetch: handleRefetch,\n }),\n [\n currentDoc,\n handleSave,\n handleCancel,\n isEditing,\n isSaving,\n isLocked,\n errors,\n notices,\n workflowState,\n handleRefetch,\n ]\n );\n\n return {\n doctype,\n id,\n frm,\n schema,\n metaLoading: metaLoading || (isEditing && queryResult?.query?.isLoading),\n metaError,\n docError: queryResult?.query?.error as unknown as Error,\n record,\n };\n}\n","/**\n * useInlineEdit Hook\n *\n * Hook for managing inline edit state in tables.\n * Per checklist 5.2: Inline Editing.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\n\n/**\n * Cell being edited\n */\nexport interface EditingCell {\n rowId: string;\n field: string;\n originalValue: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseInlineEditOptions {\n /** Resource/DocType name */\n resource: string;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseInlineEditReturn {\n /** Currently editing cell */\n editingCell: EditingCell | null;\n /** Start editing a cell */\n startEdit: (rowId: string, field: string, value: unknown) => void;\n /** Cancel current edit */\n cancelEdit: () => void;\n /** Save current edit */\n saveEdit: (value: unknown) => Promise<void>;\n /** Check if a cell is being edited */\n isEditing: (rowId: string, field: string) => boolean;\n /** Whether save is in progress */\n isSaving: boolean;\n /** Current error */\n error: string | null;\n}\n\n/**\n * useInlineEdit Hook\n *\n * @example\n * ```tsx\n * const { editingCell, startEdit, saveEdit, isEditing, isSaving } = useInlineEdit({\n * resource: \"Customer\",\n * onSaveSuccess: () => refetch(),\n * });\n *\n * // In table cell\n * {isEditing(row.id, \"name\") ? (\n * <input onBlur={(e) => saveEdit(e.target.value)} />\n * ) : (\n * <div onClick={() => startEdit(row.id, \"name\", row.name)}>{row.name}</div>\n * )}\n * ```\n */\nexport function useInlineEdit({\n resource,\n onSaveSuccess,\n onError,\n}: UseInlineEditOptions): UseInlineEditReturn {\n const [editingCell, setEditingCell] = useState<EditingCell | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const updateMutation = useUpdate();\n\n const startEdit = useCallback((rowId: string, field: string, value: unknown) => {\n setEditingCell({ rowId, field, originalValue: value });\n setError(null);\n }, []);\n\n const cancelEdit = useCallback(() => {\n setEditingCell(null);\n setError(null);\n }, []);\n\n const saveEdit = useCallback(\n async (value: unknown) => {\n if (!editingCell) return;\n\n // Skip if value unchanged\n if (value === editingCell.originalValue) {\n setEditingCell(null);\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n id: editingCell.rowId,\n values: { [editingCell.field]: value },\n },\n {\n onSuccess: () => {\n setEditingCell(null);\n setError(null);\n onSaveSuccess?.();\n resolve();\n },\n onError: (err) => {\n const errorMsg = err.message || \"Save failed\";\n setError(errorMsg);\n onError?.(new Error(errorMsg));\n reject(new Error(errorMsg));\n },\n }\n );\n });\n },\n [editingCell, resource, updateMutation, onSaveSuccess, onError]\n );\n\n const isEditing = useCallback(\n (rowId: string, field: string) => {\n return editingCell?.rowId === rowId && editingCell?.field === field;\n },\n [editingCell]\n );\n\n const isSaving = updateMutation.mutation.isPending;\n\n return {\n editingCell,\n startEdit,\n cancelEdit,\n saveEdit,\n isEditing,\n isSaving,\n error,\n };\n}\n","/**\n * useBulkActions Hook\n *\n * Hook for managing bulk operations on table rows.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useDeleteMany, useUpdateMany } from \"@refinedev/core\";\n\n/**\n * Row item type\n */\nexport interface BulkItem {\n id: string;\n [key: string]: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseBulkActionsOptions<T extends BulkItem = BulkItem> {\n /** Resource/DocType name */\n resource: string;\n /** All available items */\n items: T[];\n /** Callback after successful bulk action */\n onSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseBulkActionsReturn<T extends BulkItem = BulkItem> {\n /** Selected row IDs */\n selectedIds: Set<string>;\n /** Selected items */\n selectedItems: T[];\n /** Number of selected items */\n selectedCount: number;\n /** Whether all items are selected */\n isAllSelected: boolean;\n /** Whether some items are selected */\n isSomeSelected: boolean;\n /** Select a single row */\n selectRow: (id: string) => void;\n /** Deselect a single row */\n deselectRow: (id: string) => void;\n /** Toggle a single row */\n toggleRow: (id: string) => void;\n /** Select all rows */\n selectAll: () => void;\n /** Deselect all rows */\n deselectAll: () => void;\n /** Toggle all rows */\n toggleAll: () => void;\n /** Check if a row is selected */\n isSelected: (id: string) => boolean;\n /** Bulk delete selected rows */\n bulkDelete: () => Promise<void>;\n /** Bulk update selected rows */\n bulkUpdate: (values: Record<string, unknown>) => Promise<void>;\n /** Export selected rows as JSON */\n exportAsJson: () => void;\n /** Export selected rows as CSV */\n exportAsCsv: (fields: string[]) => void;\n /** Whether bulk action is in progress */\n isLoading: boolean;\n}\n\n/**\n * useBulkActions Hook\n *\n * @example\n * ```tsx\n * const {\n * selectedIds, toggleRow, toggleAll, isAllSelected,\n * bulkDelete, bulkUpdate, exportAsCsv\n * } = useBulkActions({\n * resource: \"Customer\",\n * items: data,\n * onSuccess: () => refetch(),\n * });\n * ```\n */\nexport function useBulkActions<T extends BulkItem = BulkItem>({\n resource,\n items,\n onSuccess,\n onError,\n}: UseBulkActionsOptions<T>): UseBulkActionsReturn<T> {\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const deleteMutation = useDeleteMany();\n const updateMutation = useUpdateMany();\n\n // Derived state\n const selectedItems = useMemo(\n () => items.filter((item) => selectedIds.has(item.id)),\n [items, selectedIds]\n );\n\n const selectedCount = selectedIds.size;\n const isAllSelected = items.length > 0 && selectedIds.size === items.length;\n const isSomeSelected = selectedIds.size > 0 && selectedIds.size < items.length;\n\n // Selection actions\n const selectRow = useCallback((id: string) => {\n setSelectedIds((prev) => new Set(prev).add(id));\n }, []);\n\n const deselectRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const toggleRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const selectAll = useCallback(() => {\n setSelectedIds(new Set(items.map((item) => item.id)));\n }, [items]);\n\n const deselectAll = useCallback(() => {\n setSelectedIds(new Set());\n }, []);\n\n const toggleAll = useCallback(() => {\n if (isAllSelected) {\n deselectAll();\n } else {\n selectAll();\n }\n }, [isAllSelected, selectAll, deselectAll]);\n\n const isSelected = useCallback((id: string) => selectedIds.has(id), [selectedIds]);\n\n // Bulk delete\n const bulkDelete = useCallback(async () => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n deleteMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Delete failed\"));\n reject(err);\n },\n }\n );\n });\n }, [resource, selectedIds, deleteMutation, deselectAll, onSuccess, onError]);\n\n // Bulk update\n const bulkUpdate = useCallback(\n async (values: Record<string, unknown>) => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n values,\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Update failed\"));\n reject(err);\n },\n }\n );\n });\n },\n [resource, selectedIds, updateMutation, deselectAll, onSuccess, onError]\n );\n\n // Export as JSON\n const exportAsJson = useCallback(() => {\n const data = JSON.stringify(selectedItems, null, 2);\n const blob = new Blob([data], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [resource, selectedItems]);\n\n // Export as CSV\n const exportAsCsv = useCallback(\n (fields: string[]) => {\n const header = fields.join(\",\");\n const rows = selectedItems.map((item) =>\n fields\n .map((f) => {\n const val = item[f];\n if (val === null || val === undefined) return \"\";\n const str = String(val);\n // Escape quotes and wrap in quotes if contains comma\n if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n })\n .join(\",\")\n );\n const csv = [header, ...rows].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.csv`;\n a.click();\n URL.revokeObjectURL(url);\n },\n [resource, selectedItems]\n );\n\n const isLoading = deleteMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n return {\n selectedIds,\n selectedItems,\n selectedCount,\n isAllSelected,\n isSomeSelected,\n selectRow,\n deselectRow,\n toggleRow,\n selectAll,\n deselectAll,\n toggleAll,\n isSelected,\n bulkDelete,\n bulkUpdate,\n exportAsJson,\n exportAsCsv,\n isLoading,\n };\n}\n","/**\n * useCommandPalette Hook\n *\n * Hook for managing global command palette state and keyboard shortcut.\n * Per checklist 6.5: Global Command Palette.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Hook return type\n */\nexport interface UseCommandPaletteReturn {\n /** Whether palette is open */\n isOpen: boolean;\n /** Open the palette */\n open: () => void;\n /** Close the palette */\n close: () => void;\n /** Toggle the palette */\n toggle: () => void;\n}\n\n/**\n * useCommandPalette Hook\n *\n * Listens for Ctrl+K (or Cmd+K on Mac) to toggle command palette.\n *\n * @example\n * ```tsx\n * const { isOpen, close } = useCommandPalette();\n *\n * return <CommandPalette open={isOpen} onClose={close} />;\n * ```\n */\nexport function useCommandPalette(): UseCommandPaletteReturn {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n // Listen for Ctrl+K / Cmd+K\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ctrl+K on Windows/Linux, Cmd+K on Mac\n if ((e.ctrlKey || e.metaKey) && e.key === \"k\") {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggle]);\n\n return {\n isOpen,\n open,\n close,\n toggle,\n };\n}\n","import { useTranslation as useI18nTranslation } from \"react-i18next\";\n\n/**\n * Return type for useTranslation hook\n */\nexport interface UseTranslationResult {\n /** Translate a key with optional interpolation values */\n t: (key: string, options?: Record<string, unknown>) => string;\n /** Current language code (e.g., \"en\", \"hi\", \"ta\") */\n language: string;\n /** Change the current language */\n changeLanguage: (lng: string) => Promise<void>;\n /** Available languages */\n languages: readonly string[];\n /** Whether translations are ready/loaded */\n ready: boolean;\n}\n\n/**\n * Custom hook wrapper for react-i18next's useTranslation.\n *\n * Provides translation functions with app-specific defaults and utilities.\n *\n * @param namespace - Translation namespace (default: \"common\")\n * @returns Translation functions and state\n *\n * @example\n * ```tsx\n * const { t } = useTranslation();\n *\n * // Basic translation\n * <h1>{t(\"Welcome\")}</h1>\n *\n * // With interpolation\n * <p>{t(\"Hello, {{name}}!\", { name: \"John\" })}</p>\n * ```\n */\nexport function useTranslation(namespace = \"common\"): UseTranslationResult {\n const { t, i18n, ready } = useI18nTranslation(namespace);\n\n return {\n t: t as (key: string, options?: Record<string, unknown>) => string,\n language: i18n.language,\n changeLanguage: (lng: string) => i18n.changeLanguage(lng) as unknown as Promise<void>,\n languages: i18n.languages,\n ready,\n };\n}\n","/**\n * useComponentOverride Hook\n *\n * Retrieves a custom component override for a specific DocType and View.\n * Enforces a Last-In-Wins priority rule across loaded plugins.\n */\n\nimport { ComponentType, useContext } from \"react\";\nimport { PluginRegistryContext } from \"@framework-m/plugin-sdk\";\n\nexport function useComponentOverride(\n doctype: string,\n viewName: string\n): ComponentType<Record<string, unknown>> | null {\n const registry = useContext(PluginRegistryContext);\n if (!registry) return null;\n\n const allPlugins = registry.getAllPlugins();\n\n // Normalize the doctype string to ignore case, spaces, dashes, and underscores\n // e.g., \"To Do\" == \"to-do\" == \"todo\" == \"Todo\"\n const targetDoctype = doctype.toLowerCase().replace(/[-_ ]/g, \"\");\n\n // Traverse plugins backwards to enforce Last-In-Wins priority\n for (let i = allPlugins.length - 1; i >= 0; i--) {\n const docExt = allPlugins[i].doctypes?.find(\n (d) => d.doctype.toLowerCase().replace(/[-_ ]/g, \"\") === targetDoctype\n );\n if (docExt?.components?.[viewName]) {\n return docExt.components[viewName] as ComponentType<Record<string, unknown>>;\n }\n }\n\n return null;\n}\n","/**\n * usePageOverride Hook\n *\n * Retrieves a custom component override for a specific global page (e.g., \"LoginPage\").\n * Enforces a Last-In-Wins priority rule across loaded plugins.\n */\n\nimport { ComponentType, useContext } from \"react\";\nimport { PluginRegistryContext } from \"@framework-m/plugin-sdk\";\n\nexport function usePageOverride(pageName: string): ComponentType<Record<string, unknown>> | null {\n const registry = useContext(PluginRegistryContext);\n if (!registry) return null;\n\n const allPlugins = registry.getAllPlugins();\n\n // Traverse plugins backwards to enforce Last-In-Wins priority\n for (let i = allPlugins.length - 1; i >= 0; i--) {\n const pageExt = allPlugins[i].pages?.find((p) => p.name === pageName);\n if (pageExt?.component) {\n return pageExt.component as ComponentType<Record<string, unknown>>;\n }\n }\n\n return null;\n}\n","/**\n * UIMeta endpoint mapping bounds.\n */\n\nexport function resolveMetaBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's useApiUrl often provides \"/api/v1\" or \"https://host/api/v1\".\n // Meta endpoint is served from \"/api/meta\", so strip the API prefix.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n}\n","/**\n * UIMeta — Unified UI Metadata hook for Framework M.\n *\n * Fetches and caches the UIMeta for a DocType from the backend API.\n * UIMeta is a single object that encapsulates form layout, list columns,\n * and additional view configurations (Kanban, Tree, Calendar) — replacing\n * the old FormMeta/ListMeta split.\n *\n * Defined in line with Phase 14 (ADR: Unified UIMeta Structure, Phase 14 §6.1):\n * - `form`: Layout sections and tabs for the form view.\n * - `list`: Columns, sorting, and row-level styling for the list view.\n * - `additional_views`: Kanban, Tree, Calendar configurations.\n * - Plugin adapters can extend UIMeta with custom namespaces (e.g., WMSMeta).\n *\n * @example\n * ```tsx\n * const { uiMeta, isLoading } = useUIMeta(\"SalesInvoice\");\n * if (uiMeta?.list?.columns) { ... }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { resolveMetaBaseUrl } from \"./uiMetaUtils\";\nimport { useMFetch } from \"./useMFetch\";\n\n/** A single form section with a label and ordered field names. */\nexport interface FormSection {\n label: string;\n fields: string[];\n collapsible?: boolean;\n /** Start this section collapsed (user can expand). */\n collapsed_by_default?: boolean;\n columns?: 1 | 2 | 3;\n}\n\n/** A tab containing multiple form sections. */\nexport interface FormTab {\n label: string;\n sections: FormSection[];\n}\n\n/** Form view configuration: tabs and/or flat sections. */\nexport interface FormMeta {\n tabs?: FormTab[];\n sections?: FormSection[];\n}\n\n/** A single column in the list view. */\nexport interface ListColumn {\n field: string;\n label?: string;\n width?: number | string;\n sortable?: boolean;\n visible?: boolean;\n}\n\n/** List view configuration: columns, default sort, row styling. */\nexport interface ListMeta {\n columns: ListColumn[];\n defaultSort?: { field: string; direction: \"asc\" | \"desc\" };\n /** JMESPath expression for row color (e.g. \"status == 'Overdue'\") */\n rowColorExpr?: string;\n rowColorValue?: string;\n}\n\n/** Kanban column definition. */\nexport interface KanbanConfig {\n groupByField: string;\n cardTitleField: string;\n cardSubtitleField?: string;\n swimlaneField?: string;\n}\n\n/** Tree view definition. */\nexport interface TreeConfig {\n parentField: string;\n labelField: string;\n orderField?: string;\n}\n\n/** Calendar view definition. */\nexport interface CalendarConfig {\n startField: string;\n endField?: string;\n titleField: string;\n colorField?: string;\n}\n\n/** Gantt view definition. */\nexport interface GanttConfig {\n nameField?: string;\n startField: string;\n endField: string;\n progressField?: string;\n parentField?: string;\n}\n\n/** Additional (non-standard) views registered by plugins. */\nexport interface AdditionalViews {\n kanban?: KanbanConfig;\n tree?: TreeConfig;\n calendar?: CalendarConfig;\n gantt?: GanttConfig;\n /** Custom plugin-registered view namespaces (e.g. WMSMeta, MobileMeta) */\n [key: string]: unknown;\n}\n\n/**\n * Unified UI Metadata structure.\n *\n * A single object that all frontend views read from, replacing FormMeta/ListMeta.\n * The `/api/meta/:doctype` endpoint returns this as `ui_meta`.\n */\nexport interface UIMeta {\n doctype: string;\n form?: FormMeta;\n list?: ListMeta;\n additional_views?: AdditionalViews;\n}\n\nexport interface UseUIMetaResult {\n uiMeta: UIMeta | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** In-memory cache to avoid duplicate network requests. */\nconst uiMetaCache = new Map<string, UIMeta>();\n\n/**\n * Hook to fetch and cache UIMeta for a given DocType.\n *\n * Reads from `/api/meta/:doctype` (Backend Meta endpoint).\n * Falls back to a minimal UIMeta on error.\n * Plugin adapters may extend the `additional_views` namespace.\n */\nexport function useUIMeta(\n doctype: string,\n baseUrl: string = \"\",\n uiContext?: string\n): UseUIMetaResult {\n const cacheKey = uiContext ? `${doctype}::${uiContext}` : doctype;\n const [uiMeta, setUiMeta] = useState<UIMeta | null>(() => uiMetaCache.get(cacheKey) ?? null);\n const [isLoading, setIsLoading] = useState(!uiMetaCache.has(cacheKey));\n const [error, setError] = useState<string | null>(null);\n const mfetch = useMFetch();\n\n const fetchMeta = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n const ctx = uiContext?.trim().toLowerCase();\n if (ctx) {\n params.set(\"ui_context\", ctx);\n }\n\n const queryString = params.toString();\n const metaBaseUrl = resolveMetaBaseUrl(baseUrl);\n const url = `${metaBaseUrl}/api/meta/${encodeURIComponent(doctype)}${queryString ? `?${queryString}` : \"\"}`;\n const response = await mfetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch meta for ${doctype}: ${response.status}`);\n }\n const data: { ui_meta?: UIMeta } = await response.json();\n const meta: UIMeta = data.ui_meta ?? { doctype };\n uiMetaCache.set(cacheKey, meta);\n setUiMeta(meta);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n // Provide minimal fallback so views don't break\n setUiMeta({ doctype });\n } finally {\n setIsLoading(false);\n }\n }, [baseUrl, cacheKey, doctype, uiContext]);\n\n useEffect(() => {\n if (!uiMetaCache.has(cacheKey)) {\n fetchMeta();\n }\n }, [cacheKey, fetchMeta]);\n\n return { uiMeta, isLoading, error, refetch: fetchMeta };\n}\n","import { useCallback, useState } from \"react\";\nimport { fetchWithCredentials } from \"../api\";\n\nexport type CorrectionType = \"amend\" | \"restore\" | \"in_place_edit\";\n\nexport interface CorrectionPayload {\n reason: string;\n version_no?: number;\n}\n\nexport interface UseCorrectionActionResult {\n execute: (\n type: CorrectionType,\n payload: CorrectionPayload\n ) => Promise<Record<string, unknown> | null>;\n isLoading: boolean;\n error: string | null;\n result: Record<string, unknown> | null;\n}\n\nfunction normalizeError(payload: unknown, fallback: string): string {\n if (payload && typeof payload === \"object\") {\n const maybeRecord = payload as Record<string, unknown>;\n const detail = maybeRecord.detail;\n const message = maybeRecord.message;\n const error = maybeRecord.error;\n\n if (typeof detail === \"string\" && detail.trim()) return detail;\n if (typeof message === \"string\" && message.trim()) return message;\n if (typeof error === \"string\" && error.trim()) return error;\n }\n\n return fallback;\n}\n\nexport function useCorrectionAction(doctype: string, id: string): UseCorrectionActionResult {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<Record<string, unknown> | null>(null);\n\n const execute = useCallback(\n async (\n type: CorrectionType,\n payload: CorrectionPayload\n ): Promise<Record<string, unknown> | null> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetchWithCredentials(\n `/api/v1/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}/${type}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n }\n );\n\n const jsonPayload = (await response.json().catch(() => null)) as unknown;\n\n if (!response.ok) {\n const fallback = response.statusText || `Correction request failed (${response.status})`;\n const resolvedError = normalizeError(jsonPayload, fallback);\n setError(resolvedError);\n setResult(null);\n return null;\n }\n\n const successPayload =\n jsonPayload && typeof jsonPayload === \"object\"\n ? (jsonPayload as Record<string, unknown>)\n : null;\n\n setResult(successPayload);\n return successPayload;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setError(message);\n setResult(null);\n return null;\n } finally {\n setIsLoading(false);\n }\n },\n [doctype, id]\n );\n\n return {\n execute,\n isLoading,\n error,\n result,\n };\n}\n\nexport default useCorrectionAction;\n","import { useList } from \"@refinedev/core\";\n\nexport interface AuditTimelineDiffValue {\n old: unknown;\n new: unknown;\n}\n\nexport interface AuditTimelineEntry {\n id: string;\n timestamp: string;\n user_id: string;\n action: string;\n doctype_name?: string;\n document_id?: string;\n diff: Record<string, AuditTimelineDiffValue> | null;\n metadata: Record<string, unknown> | null;\n}\n\nexport interface UseAuditTimelineResult {\n entries: AuditTimelineEntry[];\n isLoading: boolean;\n error: string | null;\n}\n\nfunction toEntries(payload: unknown): AuditTimelineEntry[] {\n if (Array.isArray(payload)) {\n return payload as AuditTimelineEntry[];\n }\n\n if (\n payload &&\n typeof payload === \"object\" &&\n Array.isArray((payload as { items?: unknown }).items)\n ) {\n return (payload as { items: AuditTimelineEntry[] }).items;\n }\n\n return [];\n}\n\nfunction toErrorMessage(error: unknown): string | null {\n if (!error) {\n return null;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\nexport function useAuditTimeline(doctype: string, id: string | undefined): UseAuditTimelineResult {\n const listResult = useList({\n resource: \"ActivityLog\",\n filters: [\n { field: \"document_id\", operator: \"eq\", value: id ?? \"\" },\n { field: \"doctype_name\", operator: \"eq\", value: doctype },\n ],\n sorters: [{ field: \"timestamp\", order: \"desc\" }],\n pagination: { pageSize: 50 },\n queryOptions: { enabled: Boolean(id) },\n }) as {\n result?: { data?: unknown };\n data?: { data?: unknown };\n query?: { isLoading?: boolean; error?: unknown };\n isLoading?: boolean;\n error?: unknown;\n };\n\n const payload = listResult.result?.data ?? listResult.data?.data;\n\n return {\n entries: toEntries(payload),\n isLoading: Boolean(listResult.query?.isLoading ?? listResult.isLoading),\n error: toErrorMessage(listResult.query?.error ?? listResult.error),\n };\n}\n\nexport default useAuditTimeline;\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useMFetch } from \"./useMFetch\";\n\nexport interface SiblingDocTypeInfo {\n doctype: string;\n label: string;\n extends: string;\n is_metadata_overlay?: boolean;\n initial_data?: Record<string, unknown>;\n}\n\nexport interface UseSiblingDocTypesResult {\n siblings: SiblingDocTypeInfo[];\n isLoading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\ninterface SiblingResponse {\n siblings?: SiblingDocTypeInfo[];\n}\n\nfunction toSiblings(payload: unknown): SiblingDocTypeInfo[] {\n if (\n payload &&\n typeof payload === \"object\" &&\n Array.isArray((payload as SiblingResponse).siblings)\n ) {\n return (payload as SiblingResponse).siblings ?? [];\n }\n\n return [];\n}\n\nexport function useSiblingDocTypes(doctype: string): UseSiblingDocTypesResult {\n const [siblings, setSiblings] = useState<SiblingDocTypeInfo[]>([]);\n const [isLoading, setIsLoading] = useState<boolean>(Boolean(doctype));\n const [error, setError] = useState<string | null>(null);\n const mfetch = useMFetch();\n\n const fetchSiblings = useCallback(async () => {\n if (!doctype) {\n setSiblings([]);\n setIsLoading(false);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await mfetch(`/api/v1/meta/${encodeURIComponent(doctype)}/siblings`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch siblings for ${doctype}: ${response.status}`);\n }\n\n const payload: unknown = await response.json();\n setSiblings(toSiblings(payload));\n } catch (err) {\n setSiblings([]);\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }, [doctype]);\n\n useEffect(() => {\n void fetchSiblings();\n }, [fetchSiblings]);\n\n return {\n siblings,\n isLoading,\n error,\n refetch: fetchSiblings,\n };\n}\n\nexport default useSiblingDocTypes;\n","/**\n * useFormKeyboard — Enter-to-next-field and Tab-in-cells navigation.\n *\n * Binds to the supplied container ref and intercepts:\n * - `Enter` inside `<input>` / `<textarea>` → moves focus to the\n * next focusable sibling field.\n * - `Tab` is left to native browser behavior inside table cells\n * (already correct by default); this hook only handles the Enter key.\n *\n * Web only — safely no-ops on React Native.\n */\n\nimport { type RefObject, useEffect } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n \"input:not([disabled]):not([type='submit']):not([type='button']),\" +\n \"select:not([disabled]),\" +\n \"textarea:not([disabled]),\" +\n \"[tabindex]:not([tabindex='-1'])\";\n\n/**\n * @param containerRef A ref to the form's root element.\n */\nexport function useFormKeyboard(containerRef: RefObject<HTMLElement | null>): void {\n useEffect(() => {\n // Guard: only bind on web\n if (typeof window === \"undefined\") return;\n\n const container = containerRef.current;\n if (!container) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== \"Enter\") return;\n\n const target = e.target as HTMLElement;\n const tagName = target.tagName.toLowerCase();\n\n // Only intercept Enter on text inputs (not textareas — Enter there is a newline)\n if (tagName !== \"input\") return;\n\n // Don't intercept if Enter is captured by something else (e.g. forms submit)\n // Only prevent for non-submit inputs\n const inputType = (target as HTMLInputElement).type;\n if (inputType === \"submit\" || inputType === \"button\") return;\n\n // Find all focusable fields in the container\n const focusables = Array.from(container!.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n\n const currentIndex = focusables.indexOf(target);\n if (currentIndex === -1) return;\n\n const next = focusables[currentIndex + 1];\n if (next) {\n e.preventDefault();\n next.focus();\n }\n }\n\n container.addEventListener(\"keydown\", handleKeyDown as EventListener);\n return () => container.removeEventListener(\"keydown\", handleKeyDown as EventListener);\n }, [containerRef]);\n}\n","import { useState, useMemo, useCallback, useRef } from \"react\";\nimport type { CrudFilters } from \"@refinedev/core\";\n\nexport type FilterOperator = \"eq\" | \"gt\" | \"lt\" | \"in\" | \"like\";\nexport type FilterValueKind = \"text\" | \"number\" | \"date\" | \"datetime\" | \"boolean\" | \"select\";\n\nexport interface FilterRow {\n id: string;\n field: string;\n operator: FilterOperator;\n value: string;\n}\n\nexport interface FilterFieldDefinition {\n label: string;\n value: string;\n type?: FilterValueKind;\n options?: Array<{ label: string; value: string }>;\n}\n\nfunction normalizeFilterValue(row: FilterRow, fieldType: FilterValueKind | undefined): unknown {\n if (row.operator === \"in\") {\n const values = row.value\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean);\n\n if (fieldType === \"number\") {\n return values.map((value) => Number(value)).filter((value) => !Number.isNaN(value));\n }\n\n if (fieldType === \"boolean\") {\n return values\n .map((value) => value.toLowerCase())\n .filter((value) => value === \"true\" || value === \"false\")\n .map((value) => value === \"true\");\n }\n\n return values;\n }\n\n if (fieldType === \"number\") {\n const parsed = Number(row.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n\n if (fieldType === \"boolean\") {\n const normalized = row.value.toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n return \"\";\n }\n\n if (row.operator === \"like\") {\n return `%${row.value}%`;\n }\n\n return row.value;\n}\n\nfunction cloneFilterRows(rows: FilterRow[]): FilterRow[] {\n return rows.map((row) => ({ ...row }));\n}\n\nfunction serializeFilterRows(rows: FilterRow[]): string {\n return JSON.stringify(\n rows.map((row) => ({\n id: row.id,\n field: row.field,\n operator: row.operator,\n value: row.value,\n }))\n );\n}\n\nexport function useListFilters(initialFilterableFields: FilterFieldDefinition[] = []) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [appliedSearchQuery, setAppliedSearchQuery] = useState(\"\");\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [appliedFilterRows, setAppliedFilterRows] = useState<FilterRow[]>([]);\n const [asOfFilter, setAsOfFilter] = useState<string | undefined>(undefined);\n const nextFilterRowId = useRef(1);\n const fieldTypeMap = useMemo(\n () =>\n initialFilterableFields.reduce<Record<string, FilterValueKind | undefined>>((acc, field) => {\n acc[field.value] = field.type;\n return acc;\n }, {}),\n [initialFilterableFields]\n );\n\n const advancedFilters = useMemo(() => {\n const filters: Array<{\n field: string;\n operator: FilterOperator;\n value: unknown;\n }> = [];\n\n for (const row of appliedFilterRows) {\n const field = row.field.trim();\n if (!field) continue;\n\n const normalizedValue = normalizeFilterValue(row, fieldTypeMap[field]);\n\n if (\n normalizedValue === \"\" ||\n (Array.isArray(normalizedValue) && normalizedValue.length === 0)\n ) {\n continue;\n }\n\n filters.push({\n field,\n operator: row.operator,\n value: normalizedValue,\n });\n }\n\n return filters;\n }, [appliedFilterRows, fieldTypeMap]);\n\n const tableFilters = useMemo<CrudFilters | undefined>(() => {\n const mergedFilters: Array<{\n field: string;\n operator: string;\n value: unknown;\n }> = [];\n const trimmedSearchQuery = appliedSearchQuery.trim();\n\n if (trimmedSearchQuery) {\n mergedFilters.push({\n field: \"q\",\n operator: \"contains\",\n value: trimmedSearchQuery,\n });\n }\n\n if (asOfFilter) {\n mergedFilters.push({ field: \"as_of\", operator: \"eq\", value: asOfFilter });\n }\n\n for (const filter of advancedFilters) {\n mergedFilters.push(filter);\n }\n\n return mergedFilters.length > 0 ? (mergedFilters as CrudFilters) : undefined;\n }, [appliedSearchQuery, asOfFilter, advancedFilters]);\n\n const hasPendingSearchChanges = searchQuery.trim() !== appliedSearchQuery.trim();\n const hasPendingFilterChanges =\n serializeFilterRows(filterRows) !== serializeFilterRows(appliedFilterRows);\n\n const addFilterRow = useCallback(() => {\n const defaultField = initialFilterableFields[0]?.value ?? \"name\";\n const rowId = String(nextFilterRowId.current);\n nextFilterRowId.current += 1;\n\n setFilterRows((currentRows) => [\n ...currentRows,\n {\n id: rowId,\n field: defaultField,\n operator: \"eq\",\n value: \"\",\n },\n ]);\n }, [initialFilterableFields]);\n\n const updateFilterRow = useCallback((id: string, patch: Partial<FilterRow>) => {\n setFilterRows((rows) => rows.map((row) => (row.id === id ? { ...row, ...patch } : row)));\n }, []);\n\n const removeFilterRow = useCallback((id: string) => {\n setFilterRows((rows) => rows.filter((row) => row.id !== id));\n }, []);\n\n const clearFilterRows = useCallback(() => {\n setFilterRows([]);\n }, []);\n\n const applySearch = useCallback(() => {\n setAppliedSearchQuery(searchQuery);\n }, [searchQuery]);\n\n const clearSearch = useCallback(() => {\n setSearchQuery(\"\");\n setAppliedSearchQuery(\"\");\n }, []);\n\n const applyFilters = useCallback(() => {\n setAppliedFilterRows(cloneFilterRows(filterRows));\n }, [filterRows]);\n\n const clearAppliedFilters = useCallback(() => {\n setFilterRows([]);\n setAppliedFilterRows([]);\n }, []);\n\n const removeAppliedFilterRow = useCallback((id: string) => {\n setFilterRows((rows) => rows.filter((row) => row.id !== id));\n setAppliedFilterRows((rows) => rows.filter((row) => row.id !== id));\n }, []);\n\n return {\n searchQuery,\n setSearchQuery,\n appliedSearchQuery,\n applySearch,\n clearSearch,\n hasPendingSearchChanges,\n filterRows,\n setFilterRows,\n appliedFilterRows,\n asOfFilter,\n setAsOfFilter,\n advancedFilters,\n tableFilters,\n hasPendingFilterChanges,\n addFilterRow,\n applyFilters,\n updateFilterRow,\n removeFilterRow,\n removeAppliedFilterRow,\n clearFilterRows,\n clearAppliedFilters,\n };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { PluginRegistry } from \"@framework-m/plugin-sdk\";\nimport type { Frm } from \"./useFormController\";\nimport { useMFetch } from \"./useMFetch\";\n\ninterface UseFormActionsProps {\n doctype: string;\n id?: string;\n frm: Frm;\n shell: {\n isMobile: boolean;\n rightSidebarOpen: boolean;\n setRightSidebarOpen: (open: boolean) => void;\n };\n apps: Array<{\n label?: string;\n app_id?: string;\n resources?: Array<{ name: string }>;\n }>;\n}\n\nexport interface SwipeEvent {\n nativeEvent: {\n touches?: TouchList | Touch[];\n changedTouches?: TouchList | Touch[];\n clientX?: number;\n };\n}\n\nexport function useFormActions({ doctype, id, frm, shell, apps }: UseFormActionsProps) {\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [printFormatName, setPrintFormatName] = useState(\"\");\n const mfetch = useMFetch();\n\n const handleTouchStart = useCallback((e: SwipeEvent) => {\n const clientX = e.nativeEvent?.touches?.[0]?.clientX ?? e.nativeEvent?.clientX;\n if (clientX !== undefined) {\n setTouchStart(clientX);\n }\n }, []);\n\n const handleTouchEnd = useCallback(\n (e: SwipeEvent) => {\n const clientX = e.nativeEvent?.changedTouches?.[0]?.clientX ?? e.nativeEvent?.clientX;\n if (touchStart === null || clientX !== undefined) {\n // distance evaluation\n const distance = touchStart! - (clientX ?? 0);\n const isLeftSwipe = distance > 50;\n const isRightSwipe = distance < -50;\n\n if (isLeftSwipe && !shell.rightSidebarOpen) {\n shell.setRightSidebarOpen(true);\n } else if (isRightSwipe && shell.rightSidebarOpen) {\n shell.setRightSidebarOpen(false);\n }\n setTouchStart(null);\n }\n },\n [touchStart, shell]\n );\n\n const openPrintPreview = useCallback(() => {\n if (!id) return;\n const params = new URLSearchParams({ format: \"html\" });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n const path = `/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n const url = PluginRegistry.getInstance().resolveApiUrl(path);\n globalThis.open(url, \"_blank\", \"noopener,noreferrer\");\n }, [doctype, id, printFormatName]);\n\n const downloadPrintPdf = useCallback(async () => {\n if (!id) return;\n const params = new URLSearchParams({\n format: \"pdf\",\n disposition: \"attachment\",\n strict_pdf: \"true\",\n });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n const url = `/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n\n try {\n const response = await mfetch(url, { credentials: \"include\" });\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as {\n error?: string;\n detail?: string;\n };\n throw new Error(\n payload.detail || payload.error || `Failed to download PDF (${response.status})`\n );\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (!contentType.includes(\"application/pdf\")) {\n throw new Error(\"PDF generation unavailable. Please ensure PDF service is running.\");\n }\n\n const blob = await response.blob();\n const downloadUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = downloadUrl;\n anchor.download = `${doctype}_${id}.pdf`;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(downloadUrl);\n } catch (err) {\n alert(err instanceof Error ? err.message : \"Failed to download PDF\");\n }\n }, [doctype, id, printFormatName, mfetch]);\n\n const isEditing = !!id;\n const isSingleton = id === \"singleton\";\n\n const docNameValue = (frm.doc as Record<string, unknown>)?.name;\n const displayName =\n typeof docNameValue === \"string\" || typeof docNameValue === \"number\"\n ? String(docNameValue)\n : (id ?? \"\");\n\n const title = useMemo(() => {\n if (isSingleton) return doctype.replaceAll(\"_\", \" \");\n return isEditing\n ? `Edit ${doctype.replaceAll(\"_\", \" \")}: ${displayName}`\n : `New ${doctype.replaceAll(\"_\", \" \")}`;\n }, [isSingleton, doctype, isEditing, displayName]);\n\n const appName = useMemo(() => {\n for (const app of apps || []) {\n if (app.resources?.some((r) => r.name === doctype)) {\n return app.label || app.app_id || \"App\";\n }\n }\n return \"App\";\n }, [apps, doctype]);\n\n const submitLabel = useMemo(() => {\n if (frm.isSaving) return \"Saving...\";\n return isEditing ? \"Save\" : \"Create\";\n }, [frm.isSaving, isEditing]);\n\n return {\n handleTouchStart,\n handleTouchEnd,\n printFormatName,\n setPrintFormatName,\n openPrintPreview,\n downloadPrintPdf,\n isEditing,\n isSingleton,\n displayName,\n title,\n appName,\n submitLabel,\n };\n}\n","import { useState, useCallback, useMemo, useEffect } from \"react\";\nimport { useNavigate, useLocation } from \"react-router\";\n\ninterface StoredListColumnPreferences {\n visibility: Record<string, boolean>;\n}\n\nconst LIST_COLUMN_STORAGE_PREFIX = \"m_list_columns_\";\nexport type ListViewMode = \"list\" | \"kanban\" | \"tree\" | \"gantt\";\n\nexport interface UseListActionsProps {\n doctype: string;\n propView?: ListViewMode;\n canKanban: boolean;\n canTree: boolean;\n canGantt: boolean;\n resolveDetailRoute?: (\n doctype: string,\n id: string | number | bigint,\n row: Record<string, unknown>\n ) => string | undefined;\n}\n\nexport function useListActions({\n doctype,\n propView,\n canKanban,\n canTree,\n canGantt,\n resolveDetailRoute,\n}: UseListActionsProps) {\n const navigate = useNavigate();\n const location = useLocation();\n\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n const [isColumnsMenuOpen, setIsColumnsMenuOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n const readPreferences = useCallback((): StoredListColumnPreferences => {\n if (!doctype || typeof localStorage === \"undefined\") {\n return { visibility: {} };\n }\n try {\n const raw = localStorage.getItem(`${LIST_COLUMN_STORAGE_PREFIX}${doctype}`);\n if (!raw) return { visibility: {} };\n const parsed = JSON.parse(raw);\n return {\n visibility: parsed.visibility || {},\n };\n } catch {\n return { visibility: {} };\n }\n }, [doctype]);\n\n const [columnPreferences, setColumnPreferences] = useState<StoredListColumnPreferences>(() =>\n readPreferences()\n );\n\n useEffect(() => {\n setColumnPreferences(readPreferences());\n }, [doctype, readPreferences]);\n\n useEffect(() => {\n if (!doctype || typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(\n `${LIST_COLUMN_STORAGE_PREFIX}${doctype}`,\n JSON.stringify(columnPreferences)\n );\n } catch {\n // Ignore storage issues\n }\n }, [doctype, columnPreferences]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setIsMobile(window.innerWidth < 1024);\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const toggleColumnVisibility = useCallback((field: string) => {\n setColumnPreferences((previous) => {\n const currentVisibility = previous.visibility[field] !== false;\n return {\n ...previous,\n visibility: {\n ...previous.visibility,\n [field]: !currentVisibility,\n },\n };\n });\n }, []);\n\n const pathView = useMemo(() => {\n if (location.pathname.endsWith(\"/kanban\")) return \"kanban\";\n if (location.pathname.endsWith(\"/tree\")) return \"tree\";\n if (location.pathname.endsWith(\"/gantt\")) return \"gantt\";\n if (location.pathname.endsWith(\"/list\")) return \"list\";\n return undefined;\n }, [location.pathname]);\n\n const activeView = useMemo(() => {\n const requested = propView ?? pathView ?? \"list\";\n if (requested === \"kanban\" && !canKanban) return \"list\";\n if (requested === \"tree\" && !canTree) return \"list\";\n if (requested === \"gantt\" && !canGantt) return \"list\";\n return requested as ListViewMode;\n }, [propView, pathView, canKanban, canTree, canGantt]);\n\n const setActiveView = useCallback(\n (view: ListViewMode) => {\n navigate(`/app/${doctype}/${view}`);\n },\n [navigate, doctype]\n );\n\n const handleRowClick = useCallback(\n (row: Record<string, unknown>) => {\n const id = row.id ?? row.name;\n if (typeof id === \"string\" || typeof id === \"number\" || typeof id === \"bigint\") {\n if (resolveDetailRoute) {\n const customPath = resolveDetailRoute(doctype, id, row);\n if (typeof customPath === \"string\") {\n navigate(customPath);\n return;\n }\n }\n navigate(`/app/${doctype}/detail/${id}`);\n }\n },\n [navigate, doctype, resolveDetailRoute]\n );\n\n return {\n isDeleteConfirmOpen,\n setIsDeleteConfirmOpen,\n isColumnsMenuOpen,\n setIsColumnsMenuOpen,\n isMobile,\n columnPreferences,\n toggleColumnVisibility,\n activeView,\n setActiveView,\n handleRowClick,\n };\n}\n","import React from \"react\";\nimport { MStack, MText, Heading } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../hooks\";\n\n/**\n * Standard audit fields used across Framework M\n */\nexport const AUDIT_FIELDS = [\n \"id\",\n \"owner\",\n \"creation\",\n \"modified\",\n \"deleted_at\",\n \"modified_by\",\n \"docstatus\",\n \"idx\",\n];\n\nexport interface SystemInfoProps {\n /** The unique ID of the record */\n id?: string;\n /** The record object containing audit data */\n record?: any;\n /** Optional title for the section */\n title?: string;\n}\n\n/**\n * SystemInfo Component\n *\n * Renders document metadata (ID, Owner, Timestamps) in a consistent, read-only style.\n * Primarily used in sidebars or document footers.\n */\nexport const SystemInfo: React.FC<SystemInfoProps> = ({ id, record, title = \"System Info\" }) => {\n const { t } = useTranslation(\"desk\");\n return (\n <MStack gap=\"$md\" data-testid=\"system-info\">\n <Heading size=\"$xs\" color=\"$colorMuted\" textTransform=\"uppercase\" letterSpacing={1}>\n {title}\n </Heading>\n\n <MStack gap=\"$sm\">\n {/* ID */}\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"ID\")}\n </MText>\n <MText fontSize=\"$sm\" fontWeight=\"600\">\n {id || record?.id || record?.Id || \"N/A\"}\n </MText>\n </MStack>\n\n {/* Owner */}\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Owner\")}\n </MText>\n <MText fontSize=\"$sm\">{record?.owner || record?.Owner || \"N/A\"}</MText>\n </MStack>\n\n {/* Modified By */}\n {(record?.modified_by || record?.[\"Modified By\"]) && (\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Modified By\")}\n </MText>\n <MText fontSize=\"$sm\">{record.modified_by || record[\"Modified By\"]}</MText>\n </MStack>\n )}\n\n {/* Timestamps */}\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Creation\")}\n </MText>\n <MText fontSize=\"$sm\">\n {record?.creation || record?.Creation\n ? new Date(record.creation || record.Creation).toLocaleString()\n : \"N/A\"}\n </MText>\n </MStack>\n\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Last Modified\")}\n </MText>\n <MText fontSize=\"$sm\">\n {record?.modified || record?.Modified\n ? new Date(record.modified || record.Modified).toLocaleString()\n : \"N/A\"}\n </MText>\n </MStack>\n\n {/* Deleted At */}\n {(record?.deleted_at || record?.[\"Deleted At\"]) && (\n <MStack>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Deleted At\")}\n </MText>\n <MText fontSize=\"$sm\">\n {new Date(record.deleted_at || record[\"Deleted At\"]).toLocaleString()}\n </MText>\n </MStack>\n )}\n </MStack>\n </MStack>\n );\n};\n\nexport default SystemInfo;\n","import { useState, useCallback } from \"react\";\nimport { YStack, MText, Button, XStack } from \"@framework-m/ui\";\nimport { API_URL } from \"../../constants\";\nimport { useMFetch } from \"../../hooks/useMFetch\";\nimport { AutoForm } from \"./index\";\nimport { useDocTypeMeta } from \"../../hooks/useDocTypeMeta\";\nimport { AUDIT_FIELDS } from \"../layout/SystemInfo\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface QuickEntryFormProps {\n linkedDoctype: string;\n onCreated: (id: string, label: string) => void;\n onClose: () => void;\n}\n\nexport function QuickEntryForm({ linkedDoctype, onCreated, onClose }: QuickEntryFormProps) {\n const { t } = useTranslation(\"desk\");\n const { schema, isLoading } = useDocTypeMeta(linkedDoctype);\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [isSaving, setIsSaving] = useState(false);\n const [saveError, setSaveError] = useState<string | null>(null);\n const mfetch = useMFetch();\n\n const handleSubmit = useCallback(async () => {\n if (!linkedDoctype) return;\n setIsSaving(true);\n setSaveError(null);\n try {\n const response = await mfetch(`${API_URL}/${linkedDoctype}`, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(formData),\n });\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as {\n detail?: string;\n message?: string;\n };\n throw new Error(payload.message || payload.detail || `Failed to create ${linkedDoctype}`);\n }\n const created = (await response.json()) as Record<string, unknown>;\n const newId = String(created.id ?? created.name ?? \"\");\n const newLabel = String(created.name ?? created.title ?? created.id ?? newId);\n onCreated(newId, newLabel);\n } catch (err) {\n setSaveError(err instanceof Error ? err.message : \"Failed to create record\");\n } finally {\n setIsSaving(false);\n }\n }, [linkedDoctype, formData, onCreated]);\n\n if (isLoading) {\n return (\n <YStack padding=\"$md\">\n <MText color=\"$colorMuted\">{t(\"Loading form...\")}</MText>\n </YStack>\n );\n }\n\n const filteredSchema = schema\n ? {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties || {}).filter(\n ([key]) => !AUDIT_FIELDS.includes(key.toLowerCase().trim())\n )\n ),\n }\n : null;\n\n return (\n <YStack gap=\"$md\">\n {saveError && (\n <MText color=\"$error\" role=\"alert\">\n {saveError}\n </MText>\n )}\n {filteredSchema && (\n <AutoForm\n schema={filteredSchema as any}\n formData={formData}\n onChange={(data) => setFormData(data as Record<string, unknown>)}\n onSubmit={handleSubmit}\n hideSubmitButton\n disabled={isSaving}\n />\n )}\n <XStack gap=\"$sm\" justifyContent=\"flex-end\">\n <Button variant=\"ghost\" onPress={onClose} disabled={isSaving}>\n {t(\"Cancel\")}\n </Button>\n <Button variant=\"primary\" onPress={handleSubmit} disabled={isSaving}>\n {isSaving ? \"Creating...\" : `Create ${linkedDoctype}`}\n </Button>\n </XStack>\n </YStack>\n );\n}\n","/**\n * LinkWidget - Async Search Combobox for Link Fields\n *\n * A cross-platform async search field built with Tamagui and Uniforms.\n *\n * Quick Entry (Slide-over Drawer):\n * By default, a \"+ New\" button opens a Drawer to create a linked\n * record inline without navigating away.\n * To disable, set `\"x-quick-entry\": false` in the JSON Schema property.\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { connectField, useForm } from \"uniforms\";\nimport { Input, YStack, MText, Button, Paragraph, XStack, Card, Drawer } from \"@framework-m/ui\";\nimport { API_URL } from \"../../constants\";\nimport { useMFetch } from \"../../hooks/useMFetch\";\nimport { useDebounce, getPathValue, resolveWatchPath } from \"./LinkWidgetHelpers\";\nimport { QuickEntryForm } from \"./QuickEntryForm\";\nimport { useTranslation } from \"../../hooks\";\n\ninterface LinkOption {\n value: string;\n label: string;\n}\n\n/**\n * LinkWidget - Combobox with async search + Drawer quick entry.\n */\nexport const Link = (props: any) => {\n const { t } = useTranslation(\"desk\");\n const {\n id,\n name,\n value,\n disabled,\n onChange,\n label,\n placeholder,\n schema,\n error,\n showInlineError,\n required,\n compact,\n } = props;\n\n const { model } = useForm<any>();\n\n const fieldSchema = useMemo(() => {\n return (props?.schema ?? props?.field ?? {}) as Record<string, any>;\n }, [props?.schema, props?.field]);\n\n const staticLinkedDoctype = useMemo(() => {\n const configured =\n props?.[\"x-options\"] ||\n props?.link ||\n props?.ui_meta?.link_doctype ||\n fieldSchema?.[\"x-options\"] ||\n fieldSchema?.link ||\n fieldSchema?.ui_meta?.link_doctype;\n return typeof configured === \"string\" ? configured : \"\";\n }, [props, fieldSchema]);\n\n const watchField = useMemo(() => {\n const configured =\n props?.watch || props?.ui_meta?.watch || fieldSchema?.watch || fieldSchema?.ui_meta?.watch;\n return typeof configured === \"string\" ? configured : \"\";\n }, [props, fieldSchema]);\n\n const watchPath = useMemo(() => {\n return resolveWatchPath(name, watchField);\n }, [name, watchField]);\n\n const watchedDoctype = useMemo(() => {\n if (!watchPath) {\n return \"\";\n }\n\n const resolved = getPathValue(model, watchPath);\n return typeof resolved === \"string\" ? resolved.trim() : \"\";\n }, [model, watchPath]);\n\n const isDynamicLink = useMemo(() => {\n const configuredWidget =\n props?.ui_widget ||\n props?.[\"x-fieldtype\"] ||\n fieldSchema?.ui_widget ||\n fieldSchema?.[\"x-fieldtype\"];\n return String(configuredWidget || \"\").toLowerCase() === \"dynamic_link\" || Boolean(watchField);\n }, [props, fieldSchema, watchField]);\n\n const linkedDoctype = useMemo(() => {\n return watchedDoctype || staticLinkedDoctype;\n }, [watchedDoctype, staticLinkedDoctype]);\n\n const resolvedPlaceholder = useMemo(() => {\n if (placeholder) {\n return placeholder;\n }\n if (isDynamicLink && !linkedDoctype) {\n return \"Select target DocType first...\";\n }\n return `Search ${linkedDoctype || \"records\"}...`;\n }, [placeholder, isDynamicLink, linkedDoctype]);\n\n const watchLabel = useMemo(() => {\n if (!watchField) {\n return \"source field\";\n }\n const segment = watchField.split(\".\").pop() || watchField;\n return segment\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n }, [watchField]);\n\n // Opt-out: set x-quick-entry: false in the JSON Schema property to disable Drawer\n const quickEntryEnabled = useMemo(() => {\n const flag =\n props?.[\"x-quick-entry\"] ??\n fieldSchema?.[\"x-quick-entry\"] ??\n (schema as any)?.[\"x-quick-entry\"];\n // Default enabled — only disable when explicitly false\n return flag !== false;\n }, [props, fieldSchema, schema]);\n\n const [inputValue, setInputValue] = useState(value ?? \"\");\n\n // Synchronize internal input value with external value prop (e.g., when record loads)\n useEffect(() => {\n if (value !== undefined && value !== null) {\n setInputValue(String(value));\n } else {\n setInputValue(\"\");\n }\n }, [value]);\n const [searchResults, setSearchResults] = useState<LinkOption[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const dropdownRef = useRef<any>(null);\n const previousDoctypeRef = useRef<string>(linkedDoctype);\n\n const debouncedSearch = useDebounce(inputValue, 300);\n const mfetch = useMFetch();\n\n // Fetch search results\n const fetchOptions = useCallback(\n async (search: string) => {\n if (!linkedDoctype) {\n setSearchResults([]);\n return;\n }\n\n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (search) params.set(\"q\", search);\n params.set(\"limit\", \"10\");\n\n const response = await mfetch(`${API_URL}/${linkedDoctype}?${params}`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const data = await response.json();\n const items = (data as any).items || data;\n setSearchResults(\n (items as any[]).map((item: any) => ({\n value: item.name || item.id,\n label: item.name || item.title || item.id,\n }))\n );\n }\n } catch {\n setSearchResults([]);\n } finally {\n setIsLoading(false);\n }\n },\n [linkedDoctype]\n );\n\n // Fetch on debounced search change\n useEffect(() => {\n if (isOpen) {\n fetchOptions(debouncedSearch);\n }\n }, [debouncedSearch, isOpen, fetchOptions]);\n\n // Close dropdown on outside click (web only)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n function handleClickOutside(e: MouseEvent) {\n if (!dropdownRef.current || !(dropdownRef.current instanceof Element)) {\n return;\n }\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n useEffect(() => {\n const previousDoctype = previousDoctypeRef.current;\n\n if (previousDoctype && previousDoctype !== linkedDoctype && value) {\n onChange(undefined);\n setInputValue(\"\");\n setSearchResults([]);\n setIsOpen(false);\n }\n\n previousDoctypeRef.current = linkedDoctype;\n }, [linkedDoctype, onChange, value]);\n\n // Handle selection\n const handleSelect = (option: LinkOption) => {\n setInputValue(option.label);\n onChange(option.value);\n setIsOpen(false);\n };\n\n // Handle record created via Drawer quick entry\n const handleCreated = useCallback(\n (newId: string, newLabel: string) => {\n setInputValue(newLabel);\n onChange(newId);\n setIsDrawerOpen(false);\n },\n [onChange]\n );\n\n return (\n <YStack\n gap=\"$1\"\n marginBottom={compact ? 0 : \"$3\"}\n position=\"relative\"\n flex={compact ? 1 : undefined}\n minWidth={compact ? 50 : \"100%\"}\n alignSelf=\"stretch\"\n >\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n\n <XStack position=\"relative\" alignItems=\"center\" width=\"100%\" gap=\"$sm\">\n <XStack flex={1} position=\"relative\" alignItems=\"center\">\n <Input\n id={id}\n value={inputValue}\n disabled={disabled || (isDynamicLink && !linkedDoctype)}\n placeholder={resolvedPlaceholder}\n onChangeText={(text: string) => {\n setInputValue(text);\n if (isDynamicLink && !linkedDoctype) {\n return;\n }\n setIsOpen(true);\n if (!text) onChange(undefined);\n }}\n onFocus={() => {\n if (isDynamicLink && !linkedDoctype) {\n return;\n }\n setIsOpen(true);\n fetchOptions(inputValue);\n }}\n flex={1}\n error={!!error}\n paddingRight={value ? 40 : 35}\n size={compact ? \"sm\" : \"md\"}\n backgroundColor={compact ? \"transparent\" : \"$background\"}\n borderWidth={compact ? 0 : 1}\n borderColor=\"$borderColor\"\n hoverStyle={compact ? { backgroundColor: \"$backgroundHover\" } : undefined}\n focusStyle={\n compact\n ? {\n backgroundColor: \"$background\",\n borderWidth: 1,\n borderColor: \"$borderColor\",\n }\n : { borderColor: \"$primary\" }\n }\n minHeight={compact ? 32 : 44}\n />\n <XStack\n position=\"absolute\"\n right={12}\n top={0}\n bottom={0}\n alignItems=\"center\"\n pointerEvents=\"none\"\n >\n {!value && (\n <Paragraph opacity={0.5} fontSize={14}>\n 🔍\n </Paragraph>\n )}\n </XStack>\n {value && (\n <XStack position=\"absolute\" right={8} top={0} bottom={0} alignItems=\"center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={() => {\n setInputValue(\"\");\n onChange(undefined);\n }}\n >\n ✕\n </Button>\n </XStack>\n )}\n </XStack>\n\n {/* Quick Entry: Create New button — shown unless opted out */}\n {linkedDoctype && quickEntryEnabled && !disabled && !compact && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setIsDrawerOpen(true)}\n title={`Create new ${linkedDoctype}`}\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n >\n {t(\"+ New\")}\n </Button>\n )}\n </XStack>\n\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n\n {isDynamicLink && !linkedDoctype && (\n <Paragraph color=\"$colorMuted\" size=\"sm\">\n {t(\"Select\")} {watchLabel} {t(\"first to load link options.\")}\n </Paragraph>\n )}\n\n {/* Dropdown / Results List */}\n {isOpen && (\n <YStack ref={dropdownRef} position=\"absolute\" top=\"100%\" left={0} right={0} zIndex={1000}>\n <Card elevated backgroundColor=\"$background\" marginTop=\"$1\" padding=\"$2\">\n {isLoading ? (\n <Paragraph size=\"sm\" padding=\"$2\">\n {t(\"Loading...\")}\n </Paragraph>\n ) : searchResults.length === 0 ? (\n <Paragraph size=\"sm\" padding=\"$2\">\n {t(\"No results found\")}\n </Paragraph>\n ) : (\n searchResults.map((option) => (\n <Button\n key={option.value}\n onPress={() => handleSelect(option)}\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n borderWidth={0}\n paddingVertical=\"$2\"\n backgroundColor={option.value === value ? \"$primary1\" : \"transparent\"}\n >\n {option.label}\n </Button>\n ))\n )}\n <Button size=\"sm\" onPress={() => setIsOpen(false)} marginTop=\"$2\">\n {t(\"Close\")}\n </Button>\n </Card>\n </YStack>\n )}\n\n {/* Quick Entry Drawer */}\n {linkedDoctype && quickEntryEnabled && (\n <Drawer\n isOpen={isDrawerOpen}\n onClose={() => setIsDrawerOpen(false)}\n title={`New ${linkedDoctype}`}\n width={480}\n >\n <QuickEntryForm\n linkedDoctype={linkedDoctype}\n onCreated={handleCreated}\n onClose={() => setIsDrawerOpen(false)}\n />\n </Drawer>\n )}\n </YStack>\n );\n};\n\nexport const LinkField = connectField(Link);\nexport default LinkField;\n","import { connectField } from \"uniforms\";\nimport { Input, DatePicker, YStack, MText, Paragraph } from \"@framework-m/ui\";\n\nconst formatValue = (value: any, type?: string) => {\n if (!value) return \"\";\n\n if (type === \"datetime-local\" || type === \"date\") {\n try {\n const date = new Date(value);\n if (isNaN(date.getTime())) return \"\";\n\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n const yyyy = date.getFullYear();\n const mm = pad(date.getMonth() + 1);\n const dd = pad(date.getDate());\n\n if (type === \"date\") return `${yyyy}-${mm}-${dd}`;\n\n const hh = pad(date.getHours());\n const min = pad(date.getMinutes());\n return `${yyyy}-${mm}-${dd}T${hh}:${min}`;\n } catch {\n return \"\";\n }\n }\n\n return value;\n};\n\n/**\n * Text/Date field component.\n *\n * UIMeta integration (3.1 — Field Meta Access):\n * -----------------------------------------------\n * Reads `ui_meta` from the raw field schema (via bridge.getField()) surfaced\n * by `enrich_schema()` on the backend. Note: `props.schema` is the Bridge\n * instance (not the field schema), so we must call getField() directly.\n *\n * Supported ui_meta keys:\n * - `placeholder` — overrides the default placeholder\n * - `hint` — renders a small helper text below the field\n * - `validation` — HTML5 native constraint attributes:\n * `minimum`, `maximum`, `minLength`, `maxLength`, `pattern`, `multipleOf`\n *\n * Constraint priority: direct prop (from uniforms rename) > ui_meta.validation.\n */\nexport const Text = (props: any) => {\n const {\n id,\n label,\n onChange,\n value,\n placeholder,\n disabled,\n error,\n showInlineError,\n type,\n name,\n required,\n compact,\n // uniforms-renamed constraint props (maximum→max, minimum→min, etc.)\n min: propsMin,\n max: propsMax,\n step: propsStep,\n } = props;\n\n // props.field = raw JSON Schema for this field, provided by uniforms' useField().\n // props.schema is NEVER set by uniforms — getField() call was always returning undefined.\n const rawField: Record<string, any> = props.field ?? {};\n const uiMeta: Record<string, any> = rawField.ui_meta ?? {};\n const validation: Record<string, any> = uiMeta.validation ?? {};\n\n // Merge placeholders: explicit prop > ui_meta > schema description fallback\n const resolvedPlaceholder =\n placeholder ??\n uiMeta.placeholder ??\n (typeof props.schema?.description === \"string\" ? undefined : undefined);\n\n // Hint text (brief helper text below the field)\n const hint: string | undefined = uiMeta.hint;\n\n // Constraint attributes for HTML5 native validation\n const minVal = propsMin ?? validation.minimum ?? validation.exclusiveMinimum;\n const maxVal = propsMax ?? validation.maximum ?? validation.exclusiveMaximum;\n const stepVal = propsStep ?? validation.multipleOf;\n const minLengthVal: number | undefined = validation.minLength;\n const maxLengthVal: number | undefined = validation.maxLength;\n const patternVal: string | undefined = validation.pattern;\n\n const isDateField = type === \"date\" || type === \"datetime-local\";\n // Use the unified DatePicker for all date-like fields so UX is consistent.\n const InputComp = isDateField ? DatePicker : Input;\n\n return (\n <YStack\n gap=\"$1\"\n marginBottom={compact ? 0 : \"$2\"}\n flex={compact ? 1 : undefined}\n minWidth={compact ? 50 : \"100%\"}\n alignSelf=\"stretch\"\n >\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n <InputComp\n id={id}\n name={name}\n value={formatValue(value, type || \"text\")}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n type={type || \"text\"}\n onChangeText={(text: string) => onChange(text)}\n error={!!error}\n size=\"sm\"\n backgroundColor={compact ? \"transparent\" : \"$background\"}\n borderWidth={compact ? 0 : 1}\n borderRadius={compact ? 0 : \"$round\"}\n borderColor=\"$borderColor\"\n opacity={1}\n textAlign={props.textAlign}\n hoverStyle={compact ? { backgroundColor: \"$backgroundHover\" } : undefined}\n focusStyle={\n compact\n ? {\n backgroundColor: \"$background\",\n borderWidth: 0,\n outlineWidth: 0,\n }\n : { borderColor: \"$primary\" }\n }\n minHeight={compact ? 40 : 32}\n paddingHorizontal={compact ? 14 : \"$md\"}\n // HTML5 native validation attributes (web only — ignored on RN)\n {...(minVal !== undefined ? { min: String(minVal) } : {})}\n {...(maxVal !== undefined ? { max: String(maxVal) } : {})}\n {...(stepVal !== undefined ? { step: String(stepVal) } : {})}\n {...(minLengthVal !== undefined ? { minLength: minLengthVal } : {})}\n {...(maxLengthVal !== undefined ? { maxLength: maxLengthVal } : {})}\n {...(patternVal !== undefined ? { pattern: patternVal } : {})}\n />\n {/* ui_meta hint text */}\n {hint && !compact && (\n <MText fontSize=\"$xs\" color=\"$colorMuted\" paddingTop=\"$1\" role=\"note\">\n {hint}\n </MText>\n )}\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\" marginTop=\"$1\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const TextField = connectField(Text);\n","import { connectField } from \"uniforms\";\nimport { XStack, YStack, MText } from \"@framework-m/ui\";\n\nexport const Bool = (props: any) => {\n const { label, onChange, value, disabled, required, compact } = props;\n\n return (\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n justifyContent={compact ? \"center\" : \"flex-start\"}\n marginBottom={compact ? 0 : \"$2\"}\n paddingHorizontal={compact ? 0 : \"$2\"}\n paddingVertical={compact ? 0 : \"$1.5\"}\n borderRadius=\"$sm\"\n cursor={disabled ? \"default\" : \"pointer\"}\n onPress={() => !disabled && onChange(!value)}\n opacity={disabled ? 0.6 : 1}\n flex={compact ? 1 : undefined}\n minHeight={compact ? 24 : 34}\n alignSelf=\"stretch\"\n focusable={!disabled}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e: any) => {\n if (!disabled && (e.key === \" \" || e.key === \"Enter\")) {\n e.preventDefault();\n onChange(!value);\n }\n }}\n focusStyle={{\n backgroundColor: \"$backgroundHover\",\n }}\n group\n >\n <YStack\n width={18}\n height={18}\n borderRadius={4}\n borderWidth={2}\n borderColor={value ? \"$primary\" : \"$borderColor\"}\n backgroundColor={value ? \"$primary\" : \"transparent\"}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n {value && (\n <MText color=\"#fff\" fontSize={11} fontWeight=\"900\" userSelect=\"none\">\n ✓\n </MText>\n )}\n </YStack>\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\" userSelect=\"none\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n </XStack>\n );\n};\n\n// Exported as BooleanField to match our tests, replacing the old BoolField name\nexport const BooleanField = connectField(Bool);\n","import { connectField } from \"uniforms\";\nimport { useMemo } from \"react\";\nimport { Select, YStack, MText, Paragraph } from \"@framework-m/ui\";\n\n/**\n * SelectField component.\n *\n * UIMeta integration (3.1 — Pydantic Enum Leveraging):\n * -------------------------------------------------------\n * Option sources (in priority order):\n * 1. `props.options` — from uniforms bridge (schema.enum)\n * 2. `props.schema.ui_meta.options` — human-friendly options from enrich_schema()\n * These are objects like `{ value: \"draft\", label: \"Draft\" }` generated\n * from Literal[\"draft\", ...] or Python Enum types.\n * 3. `props.allowedValues` — legacy uniforms fallback\n *\n * The ui_meta.options labels are preferred when present because they are\n * already title-cased by `enrich_schema` and may carry developer-supplied\n * overrides (e.g. `{\"value\": \"draft\", \"label\": \"In Progress\"}`).\n */\nexport const SelectF = (props: any) => {\n const {\n id,\n label,\n onChange,\n value,\n disabled,\n error,\n showInlineError,\n placeholder,\n required,\n compact,\n // uniforms bridge sets options from schema.enum\n options: bridgeOptions,\n // allowedValues is the legacy uniforms name\n allowedValues,\n } = props;\n\n // props.field = raw JSON Schema for this field, provided by uniforms' useField().\n // props.schema is NEVER set by uniforms — getField() call was always returning undefined.\n const rawField: Record<string, any> = props.field ?? {};\n\n // ui_meta.options carries human-friendly {value, label} pairs from enrich_schema\n const uiMetaOptions: Array<{ value: string; label: string }> | undefined = Array.isArray(\n rawField.ui_meta?.options\n )\n ? rawField.ui_meta.options\n : undefined;\n\n const enumOptions = useMemo(() => {\n // Priority 1: ui_meta.options (pre-labeled, from enrich_schema)\n if (uiMetaOptions && uiMetaOptions.length > 0) {\n return uiMetaOptions.map((o) => ({\n label: o.label || o.value,\n value: String(o.value),\n }));\n }\n\n // Priority 2: props.options (set by uniforms bridge from schema.enum)\n if (bridgeOptions && bridgeOptions.length > 0) {\n return bridgeOptions.map((o: any) => ({\n label: o.label || String(o.value),\n value: String(o.value),\n }));\n }\n\n // Priority 3: allowedValues (legacy uniforms)\n if (allowedValues && allowedValues.length > 0) {\n return (allowedValues as string[]).map((v) => ({\n label: String(v)\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase()),\n value: String(v),\n }));\n }\n\n return [];\n }, [uiMetaOptions, bridgeOptions, allowedValues]);\n\n // ui_meta.placeholder override (rawField already computed above via getField())\n const resolvedPlaceholder = placeholder ?? rawField.ui_meta?.placeholder ?? \"Select...\";\n\n return (\n <YStack gap=\"$1\" marginBottom={compact ? 0 : \"$2\"} flex={compact ? 1 : undefined}>\n {label && !compact && (\n <MText fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n <Select\n id={id}\n value={String(value ?? \"\")}\n options={enumOptions}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n onChange={(val: any) => {\n const selected = typeof val === \"string\" ? val : (val?.target?.value ?? \"\");\n onChange(selected);\n }}\n error={!!error}\n size=\"sm\"\n backgroundColor={compact ? \"transparent\" : undefined}\n borderWidth={compact ? 0 : 1}\n borderRadius={compact ? 0 : undefined}\n paddingHorizontal={compact ? 14 : undefined}\n />\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const SelectField = connectField(SelectF);\n","import { connectField } from \"uniforms\";\nimport { XStack, YStack, MText, Button, Paragraph, Modal } from \"@framework-m/ui\";\nimport { AutoField } from \"./AutoField\";\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { useTranslation } from \"../../../hooks\";\n\nconst DEFAULT_PAGE_SIZE = 10;\nconst TABLE_CELL_PADDING_X = 14;\nconst TABLE_CELL_PADDING_Y = 10;\nconst TABLE_ROW_MIN_HEIGHT = 42;\n\nconst toPositiveInt = (value: unknown): number | null => {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n return null;\n }\n const normalized = Math.floor(parsed);\n return normalized > 0 ? normalized : null;\n};\n\n/**\n * ListFieldBase (Spreadsheet UX)\n */\nexport const List = (props: any) => {\n const { t } = useTranslation(\"desk\");\n const {\n label,\n value = [],\n schema: schemaProp,\n error,\n showInlineError,\n required,\n disabled,\n onChange,\n grid_columns,\n } = props;\n\n // Prioritize props.field (guaranteed raw field schema from uniforms)\n // or fall back to schemaProp (if not a bridge instance)\n const schema = props.field || schemaProp;\n\n const rows = Array.isArray(value) ? value : [];\n\n const pageSize = useMemo(() => {\n const configured =\n toPositiveInt(props?.page_size) ??\n toPositiveInt(schema?.page_size) ??\n toPositiveInt(schema?.pagination?.page_size) ??\n toPositiveInt(schema?.list?.page_size) ??\n toPositiveInt(schema?.ui_meta?.list?.page_size);\n\n return configured ?? DEFAULT_PAGE_SIZE;\n }, [\n props?.page_size,\n schema?.page_size,\n schema?.pagination?.page_size,\n schema?.list?.page_size,\n schema?.ui_meta?.list?.page_size,\n ]);\n\n const [pageIndex, setPageIndex] = useState(0);\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\n\n // Resolve the schema for individual rows (uniforms lists have properties under 'items')\n const rowSchema = schema?.items || schema;\n\n // Exhaustive search for property keys from multiple sources\n let propsInSchema: string[] = [];\n\n // 1. Try items.properties (Pydantic array items schema)\n if (rowSchema?.properties && typeof rowSchema.properties === \"object\") {\n propsInSchema = Object.keys(rowSchema.properties);\n }\n\n // 2. Fallback: try root schema properties (for non-array schemas)\n if (propsInSchema.length === 0 && schema?.properties && typeof schema.properties === \"object\") {\n propsInSchema = Object.keys(schema.properties);\n }\n\n // 3. Fallback: try explicit grid_columns from schema\n if (propsInSchema.length === 0 && Array.isArray(schema?.grid_columns)) {\n propsInSchema = schema.grid_columns;\n }\n\n // Filter out any duplicates and ensure we have a unique list\n const uniqueProps = Array.from(new Set(propsInSchema));\n\n // Resolve column definitions from multiple sources with strict priority:\n // 1. grid_columns prop (explicitly passed to component)\n // 2. schema.ui_meta.grid_columns (from merged field metadata) - THIS IS KEY\n // 3. schema.list.columns or schema.ui_meta.list.columns\n // 4. Properties found in schema\n const uiMetaGridColumns = (schema as any)?.ui_meta?.grid_columns;\n const uiMetaListColumns = (schema as any)?.ui_meta?.list?.columns;\n const schemaListColumns = (schema as any)?.list?.columns;\n\n const officialColumns = schemaListColumns || uiMetaListColumns || uiMetaGridColumns;\n const gridColumns = grid_columns || officialColumns || uniqueProps;\n\n const totalPages = Math.max(1, Math.ceil(rows.length / pageSize));\n const pageStart = pageIndex * pageSize;\n const pageRows = rows.slice(pageStart, pageStart + pageSize);\n\n useEffect(() => {\n if (pageIndex > totalPages - 1) {\n setPageIndex(totalPages - 1);\n }\n }, [pageIndex, totalPages]);\n\n useEffect(() => {\n setPageIndex(0);\n }, [pageSize]);\n\n // Helper to extract clean labels from rowSchema or fallback to title-cased column name\n const getColLabel = (col: string) => {\n const prop = rowSchema?.properties?.[col];\n const label = prop?.label || prop?.title;\n if (label) return label;\n // Fallback: title case the field name\n return col\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n };\n\n const getColType = (col: string) => {\n return rowSchema?.properties?.[col]?.type || \"string\";\n };\n\n const handleAdd = () => {\n const nextRows = [...rows, {}];\n onChange(nextRows);\n setPageIndex(Math.max(0, Math.ceil(nextRows.length / pageSize) - 1));\n };\n\n const handleRemove = (index: number) => {\n const newValue = [...rows];\n newValue.splice(index, 1);\n onChange(newValue);\n };\n\n const handleDuplicate = (index: number) => {\n const newValue = [...rows];\n const cloned = JSON.parse(JSON.stringify(rows[index] || {}));\n newValue.splice(index + 1, 0, cloned);\n onChange(newValue);\n setPageIndex(Math.floor((index + 1) / pageSize));\n };\n\n // Keyboard Productivity: Ctrl + Enter to add row\n const handleKeyDown = useCallback(\n (e: any) => {\n if (e.ctrlKey && e.key === \"Enter\") {\n e.preventDefault();\n handleAdd();\n }\n },\n [rows, onChange]\n );\n\n // Use gridColumns if available (includes ui_meta.grid_columns), fallback to uniqueProps\n // This ensures we always use explicitly configured columns when available\n const allProperties = gridColumns && gridColumns.length > 0 ? gridColumns : uniqueProps;\n\n return (\n <YStack gap=\"$3\" marginVertical=\"$2\" onKeyDown={handleKeyDown}>\n {/* Full Row Edit Modal - Moved to root level of field to avoid grid clipping */}\n <Modal\n isOpen={editingIndex !== null}\n onClose={() => setEditingIndex(null)}\n title={`Edit Row ${editingIndex !== null ? editingIndex + 1 : \"\"}`}\n size=\"lg\"\n footer={\n <XStack gap=\"$2\" justifyContent=\"flex-end\" width=\"100%\">\n <Button\n theme=\"red\"\n variant=\"ghost\"\n onPress={() => {\n handleRemove(editingIndex!);\n setEditingIndex(null);\n }}\n >\n {t(\"Delete Row\")}\n </Button>\n <Button theme=\"active\" onPress={() => setEditingIndex(null)} width={100}>\n {t(\"Done\")}\n </Button>\n </XStack>\n }\n >\n <YStack\n gap=\"$4\"\n overflow=\"scroll\"\n padding=\"$4\"\n maxHeight=\"60vh\"\n backgroundColor=\"$background\"\n minWidth={300}\n >\n {allProperties.length === 0 && (\n <MText color=\"$colorMuted\">{t(\"No editable properties found in schema.\")}</MText>\n )}\n {allProperties.map((col: string) => (\n <YStack\n key={col}\n gap=\"$1\"\n paddingVertical=\"$2\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n minHeight={60}\n >\n <AutoField name={`${editingIndex}.${col}`} disabled={disabled} />\n </YStack>\n ))}\n </YStack>\n </Modal>\n\n {/* Header Section */}\n <XStack justifyContent=\"space-between\" alignItems=\"center\" paddingHorizontal=\"$1\">\n <MText fontSize=\"$4\" fontWeight=\"600\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n </XStack>\n\n {/* Spreadsheet Grid Container */}\n <YStack\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$3\"\n overflow=\"scroll\"\n backgroundColor=\"$background\"\n style={{ borderCollapse: \"collapse\", borderSpacing: 0 } as any}\n >\n {/* Header Row (Desktop Only) */}\n <XStack\n backgroundColor=\"$backgroundStrong\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n display=\"none\"\n $gtSm={{ display: \"flex\" }}\n minWidth={gridColumns.length * 150 + 140}\n >\n {/* Index Column */}\n <XStack\n width={40}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <MText fontSize=\"$1\" color=\"$colorMuted\" fontWeight=\"600\">\n #\n </MText>\n </XStack>\n\n {gridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n flex={1}\n flexBasis={0}\n minWidth={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n justifyContent={isNumeric ? \"flex-end\" : \"flex-start\"}\n alignItems=\"center\"\n >\n <MText fontSize=\"$2\" color=\"$colorMuted\" fontWeight=\"600\" numberOfLines={1}>\n {getColLabel(col)}\n </MText>\n </XStack>\n );\n })}\n <XStack\n marginLeft=\"auto\"\n width={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Button size=\"sm\" onPress={handleAdd} disabled={disabled} theme=\"active\">\n {t(\"+ Add Row\")}\n </Button>\n </XStack>\n </XStack>\n\n {/* Data Rows */}\n {pageRows.map((_item: any, relativeIndex: number) => {\n const index = pageStart + relativeIndex;\n return (\n <YStack key={index}>\n {/* Desktop Row */}\n <XStack\n display=\"none\"\n $gtSm={{ display: \"flex\" }}\n borderBottomWidth={relativeIndex === pageRows.length - 1 ? 0 : 1}\n borderBottomColor=\"$borderColor\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n alignItems=\"center\"\n minHeight={TABLE_ROW_MIN_HEIGHT}\n minWidth={gridColumns.length * 150 + 140}\n >\n {/* Row Index */}\n <XStack\n width={40}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor=\"$backgroundStrong\"\n opacity={0.7}\n >\n <MText fontSize=\"$2\" fontWeight=\"500\">\n {index + 1}\n </MText>\n </XStack>\n\n {gridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n flex={1}\n flexBasis={0}\n minWidth={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n borderRightWidth={1}\n borderRightColor=\"$borderColor\"\n alignItems=\"center\"\n >\n <AutoField\n name={`${index}.${col}`}\n label={null}\n compact={true}\n disabled={disabled}\n textAlign={isNumeric ? \"end\" : \"start\"}\n />\n </XStack>\n );\n })}\n\n {/* Desktop Actions */}\n <XStack\n marginLeft=\"auto\"\n width={120}\n minHeight={TABLE_ROW_MIN_HEIGHT}\n gap=\"$1\"\n paddingHorizontal={TABLE_CELL_PADDING_X}\n paddingVertical={TABLE_CELL_PADDING_Y}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => handleDuplicate(index)}\n disabled={disabled}\n padding=\"$1\"\n >\n ⎘\n </Button>\n <Button\n size=\"sm\"\n theme=\"red\"\n variant=\"ghost\"\n onPress={() => handleRemove(index)}\n disabled={disabled}\n padding=\"$1\"\n >\n ✕\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setEditingIndex(index)}\n disabled={disabled}\n padding=\"$1\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n >\n 🖉\n </Button>\n </XStack>\n </XStack>\n\n {/* Mobile Card View (Vertical Summary) */}\n <YStack\n padding=\"$4\"\n gap=\"$1\"\n display=\"flex\"\n $gtSm={{ display: \"none\" }}\n marginHorizontal=\"$2\"\n marginVertical=\"$2\"\n borderRadius=\"$4\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n onPress={() => setEditingIndex(index)}\n elevation={2}\n >\n {/* Card Header (Index + Edit Pencil) */}\n <XStack\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom=\"$2\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n paddingBottom=\"$1\"\n >\n <XStack\n backgroundColor=\"$active\"\n width={20}\n height={20}\n borderRadius={10}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize=\"$1\" color=\"white\" fontWeight=\"800\">\n {index + 1}\n </MText>\n </XStack>\n <XStack gap=\"$1\" alignItems=\"center\">\n <MText fontSize=\"$5\" color=\"$active\">\n 🖉\n </MText>\n </XStack>\n </XStack>\n\n {/* Card Body - Unified Horizontal Scroll for [Label + Value] */}\n <XStack overflow=\"scroll\" gap=\"$4\" paddingBottom=\"$2\">\n {gridColumns.map((col: string) => (\n <YStack key={col} minWidth={140} maxWidth={200} gap=\"$1\">\n <MText fontSize=\"$1\" color=\"$colorMuted\" fontWeight=\"700\" numberOfLines={1}>\n {getColLabel(col)}\n </MText>\n <AutoField name={`${index}.${col}`} disabled={true} compact={true} />\n </YStack>\n ))}\n </XStack>\n </YStack>\n </YStack>\n );\n })}\n </YStack>\n\n {rows.length > pageSize && (\n <XStack justifyContent=\"space-between\" alignItems=\"center\" paddingHorizontal=\"$1\">\n <MText fontSize=\"$2\" color=\"$colorMuted\">\n {t(\"Showing\")} {pageStart + 1}-{Math.min(pageStart + pageRows.length, rows.length)}{\" \"}\n {t(\"of\")} {rows.length}\n </MText>\n <XStack gap=\"$2\" alignItems=\"center\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setPageIndex((current) => Math.max(0, current - 1))}\n disabled={pageIndex === 0}\n >\n {t(\"Previous\")}\n </Button>\n <MText fontSize=\"$2\" color=\"$colorMuted\">\n {t(\"Page\")} {pageIndex + 1} {t(\"of\")} {totalPages}\n </MText>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setPageIndex((current) => Math.min(totalPages - 1, current + 1))}\n disabled={pageIndex >= totalPages - 1}\n >\n {t(\"Next\")}\n </Button>\n </XStack>\n </XStack>\n )}\n\n {/* Validation Message */}\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const ListField = connectField(List);\n","import { useEffect, useMemo, useState } from \"react\";\nimport { connectField, useForm } from \"uniforms\";\nimport { useGetIdentity } from \"@refinedev/core\";\nimport { Button, Input, MText, Paragraph, XStack, YStack } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../../hooks\";\n\ninterface MultiSelectOption {\n value: string;\n label: string;\n}\n\nconst normalizeOptions = (props: any): MultiSelectOption[] => {\n const field = props?.field ?? {};\n const rawOptions =\n props?.options ??\n props?.ui_meta?.options ??\n field?.ui_meta?.options ??\n field?.options ??\n props?.schema?.ui_meta?.options ??\n props?.schema?.options ??\n field?.enum ??\n props?.allowedValues ??\n props?.schema?.enum ??\n [];\n\n if (!Array.isArray(rawOptions)) {\n return [];\n }\n\n return rawOptions\n .map((option: any) => {\n if (typeof option === \"string\") {\n return { value: option, label: option };\n }\n if (typeof option === \"number\" || typeof option === \"boolean\") {\n const normalized = String(option);\n return { value: normalized, label: normalized };\n }\n if (option && typeof option === \"object\") {\n const value = String(option.value ?? option.id ?? \"\");\n if (!value) return null;\n const label = String(option.label ?? option.name ?? value);\n return { value, label };\n }\n return null;\n })\n .filter((option): option is MultiSelectOption => Boolean(option));\n};\n\nconst toArrayValue = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => (entry == null ? \"\" : String(entry)))\n .filter((entry) => entry.length > 0);\n};\n\nexport const MultiSelect = (props: any) => {\n const { t } = useTranslation(\"desk\");\n const { id, value, onChange, disabled, error, showInlineError, placeholder, compact } = props;\n\n const [query, setQuery] = useState(\"\");\n const [remoteOptions, setRemoteOptions] = useState<MultiSelectOption[]>([]);\n\n const uiMeta = props?.schema?.ui_meta || props?.field?.ui_meta || props?.ui_meta;\n\n // Fetch remote options if source_url is configured\n useEffect(() => {\n const sourceUrl = uiMeta?.source_url;\n if (!sourceUrl) return;\n\n fetch(sourceUrl)\n .then((r) => r.json())\n .then((data) => {\n const items = data?.items ?? [];\n setRemoteOptions(\n items.map((r: any) => {\n const val = typeof r === \"string\" ? r : r.value || r.id || String(r);\n const lab = typeof r === \"string\" ? r : r.label || r.name || val;\n return { value: val, label: lab };\n })\n );\n })\n .catch((err) => console.warn(\"[MultiSelect] Failed to load remote options\", err));\n }, [uiMeta?.source_url]);\n\n const staticOptions = useMemo(() => normalizeOptions(props), [props]);\n const options = useMemo(\n () => (remoteOptions.length > 0 ? remoteOptions : staticOptions),\n [staticOptions, remoteOptions]\n );\n\n const selectedValues = toArrayValue(value);\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const { model } = useForm();\n const { data: identity } = useGetIdentity<{ id: string; roles: string[] }>();\n\n const preventSelfRemove: string[] = uiMeta?.guard?.prevent_self_remove ?? [];\n\n const isGuarded = (entry: string): boolean =>\n preventSelfRemove.includes(entry) && !!identity?.id && !!model?.id && identity.id === model.id;\n\n const filteredOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return options;\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(normalized) || o.value.toLowerCase().includes(normalized)\n );\n }, [options, query]);\n\n const toggleValue = (nextValue: string) => {\n if (disabled) return;\n const isRemoving = selectedSet.has(nextValue);\n if (isRemoving && isGuarded(nextValue)) return;\n const next = isRemoving\n ? selectedValues.filter((e) => e !== nextValue)\n : [...selectedValues, nextValue];\n onChange(next);\n };\n\n const unselectedInFiltered = filteredOptions.filter((o) => !selectedSet.has(o.value));\n\n return (\n <YStack gap=\"$3\" marginBottom={compact ? 0 : \"$4\"}>\n {/* Compact search */}\n <Input\n id={id}\n value={query}\n disabled={disabled}\n placeholder={placeholder || \"Search roles...\"}\n onChangeText={setQuery}\n size=\"sm\"\n error={!!error}\n />\n\n {/* Selected roles — always shown first even when filtered out */}\n {selectedValues.length > 0 && (\n <YStack gap=\"$2\" style={{ marginTop: 12, marginBottom: 8 }}>\n <MText size=\"xs\" color=\"$colorMuted\" fontWeight=\"600\">\n {t(\"Assigned\")}\n </MText>\n <XStack flexWrap=\"wrap\">\n {selectedValues.map((entry) => {\n const option = options.find((o) => o.value === entry);\n const displayLabel = option?.label ?? entry;\n const guarded = isGuarded(entry);\n\n return (\n <Button\n key={entry}\n variant=\"primary\"\n size=\"sm\"\n style={{ marginRight: 12, marginBottom: 8, marginTop: 8 }}\n onPress={() => toggleValue(entry)}\n disabled={disabled || guarded}\n >\n {displayLabel}\n {!guarded && \" ×\"}\n {guarded && \" 🔒\"}\n </Button>\n );\n })}\n </XStack>\n </YStack>\n )}\n\n {/* Available roles */}\n {unselectedInFiltered.length > 0 && (\n <YStack gap=\"$2\" style={{ marginBottom: 8 }}>\n <MText size=\"xs\" color=\"$colorMuted\" fontWeight=\"600\">\n {t(\"Available\")}\n </MText>\n <XStack flexWrap=\"wrap\">\n {unselectedInFiltered.map((option) => (\n <Button\n key={option.value}\n variant=\"default\"\n size=\"sm\"\n style={{ marginRight: 8, marginBottom: 8, marginTop: 8 }}\n onPress={() => toggleValue(option.value)}\n disabled={disabled}\n >\n {option.label}\n </Button>\n ))}\n </XStack>\n </YStack>\n )}\n\n {/* Empty state */}\n {filteredOptions.length === 0 && (\n <Paragraph size=\"sm\" color=\"$colorMuted\">\n {query ? `No roles matching \"${query}\"` : \"No roles available\"}\n </Paragraph>\n )}\n\n {showInlineError && error && (\n <Paragraph color=\"$error\" size=\"sm\">\n {error.message}\n </Paragraph>\n )}\n </YStack>\n );\n};\n\nexport const MultiSelectField = connectField(MultiSelect);\n","import React from \"react\";\n\ntype FieldComponent = React.ComponentType<Record<string, unknown>>;\n\n/**\n * FieldRegistry allows plugins and macroservices to register custom React\n * components for specific field types, preventing the monolithic AutoField\n * from needing to know about every possible UI widget.\n */\nclass Registry {\n private fields: Map<string, FieldComponent> = new Map();\n\n register(type: string, component: FieldComponent): void {\n this.fields.set(type, component);\n }\n\n get(type: string): FieldComponent | undefined {\n return this.fields.get(type);\n }\n\n clear(): void {\n this.fields.clear();\n }\n}\n\nexport const FieldRegistry = new Registry();\n","import { connectField } from \"uniforms\";\nimport { Link } from \"../LinkWidget\";\nimport { Text } from \"./TextField\";\nimport { Bool } from \"./BooleanField\";\nimport { SelectF } from \"./SelectField\";\nimport { List } from \"./ListField\";\nimport { MultiSelect } from \"./MultiSelectField\";\nimport { FieldRegistry } from \"./registry\";\n\n/**\n * AutoField (Bridge Resolver)\n *\n * Automatically resolves the correct UI component based on field type and\n * JSON Schema metadata from the uniforms JSONSchemaBridge.\n *\n * IMPORTANT: This IS a connected field. It receives the schema and current\n * value path from uniforms. To prevent double-prefixing (e.g. name.name),\n * it MUST return raw (unconnected) components.\n *\n * ## How props are delivered (uniforms internals — useField.js)\n *\n * uniforms' `useField` hook passes these guaranteed props to every field:\n * - `props.field` — raw JSON schema for this field (from bridge.getField())\n * - `props.fieldType` — JS constructor (String/Number/Boolean/Date/Array/Object)\n * - `props.options` — array of {value} objects when schema has `enum`\n *\n * `props.schema` is NEVER set by uniforms — it would only exist if a parent\n * explicitly passed it, which nothing does here.\n *\n * ## Key bridge behaviors (JSONSchemaBridge)\n *\n * - `format` is in `propsToRemove` → deleted from getProps() output\n * ✓ Read it from `props.field.format` instead\n * - `x-options` is NOT in propsToRemove → passed through directly as `props[\"x-options\"]`\n * - `enum` is in propsToRemove BUT bridge converts it to `options` array first\n * - `getType()` returns Date ONLY for format:\"date-time\", NOT format:\"date\"\n * ✓ For date-only fields: `fieldType === String` but `props.field.format === \"date\"`\n *\n * ## Field detection decision tree\n *\n * 1. Plugin FieldRegistry override\n * 2. Array → ListField\n * 3. Link → props[\"x-options\"] OR props.field[\"x-options\"] OR props.field.ui_meta.link_doctype\n * 4. Select → props.options (non-empty, from bridge enum conversion) OR\n * props.field.ui_meta.options (from backend enrich_schema)\n * 5. DateTime → fieldType === Date (bridge maps format:\"date-time\" → Date)\n * 6. Date-only → props.field.format === \"date\" (format is stripped from schemaProps!)\n * OR field name ends with \"_date\" as heuristic fallback\n * 7. Boolean → fieldType === Boolean\n * 8. Default → TextField\n */\nexport const AutoField = connectField((props: any) => {\n const fieldName = String(props.name ?? \"\").toLowerCase();\n\n // props.field = raw JSON Schema for this field, provided by uniforms' useField()\n // This is the ONLY reliable way to access format, x-options, ui_meta, etc.\n const rawField: Record<string, any> = props.field ?? {};\n const rawFormat: string | undefined = rawField.format;\n\n // 1. Plugin registry override (highest priority)\n const typeKey = typeof props.fieldType === \"string\" ? props.fieldType : rawField.ui_meta?.widget;\n const CustomComponent = typeof typeKey === \"string\" ? FieldRegistry.get(typeKey) : undefined;\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n\n // 2. Array fields → check ui_widget first, then fall back to ListField\n // fieldType === Array is set by bridge.getType() for type:\"array\"\n if (props.fieldType === Array) {\n // ui_widget can be set directly on the field's json_schema_extra\n // or merged into ui_meta by enrich_schema\n const arrayWidget =\n rawField.ui_widget || rawField.ui_meta?.ui_widget || rawField.ui_meta?.widget;\n if (arrayWidget === \"multiselect\") {\n const hideLabel = rawField.ui_meta?.hide_label === true;\n return <MultiSelect {...props} label={hideLabel ? undefined : props.label} />;\n }\n return <List {...props} />;\n }\n\n // 3. Link field detection.\n // \"x-options\" is NOT in propsToRemove so it passes through getProps() onto props directly.\n // Also check props.field[\"x-options\"] in case it didn't spread (nested path edge case).\n const asLinkDoctype = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n };\n\n const configuredLinkDoctype =\n asLinkDoctype(props[\"x-options\"]) ??\n asLinkDoctype(rawField[\"x-options\"]) ??\n asLinkDoctype(props.link) ??\n asLinkDoctype(rawField.link) ??\n asLinkDoctype(rawField.ui_meta?.link_doctype);\n\n // Fallback for generated schemas that only include human-readable hints.\n // Example: description=\"Linked Supplier ID\" => doctype \"Supplier\".\n const inferredLinkDoctype = (() => {\n const description = asLinkDoctype(rawField.description);\n if (!description) {\n return undefined;\n }\n\n const match = /^linked\\s+(.+?)\\s+id$/i.exec(description);\n return match?.[1]?.trim() || undefined;\n })();\n\n const linkDoctype = configuredLinkDoctype ?? inferredLinkDoctype;\n if (linkDoctype) {\n return <Link {...props} link={linkDoctype} />;\n }\n\n // 4. Select field detection.\n // bridge converts schema.enum → props.options (array of {value} objects).\n // bridge ALWAYS sets options (even if undefined), so guard with length check.\n // enrich_schema additionally surfaces ui_meta.options with human-friendly labels.\n const bridgeOptions: any[] | undefined =\n Array.isArray(props.options) && props.options.length > 0 ? props.options : undefined;\n const uiMetaOptions: any[] | undefined =\n Array.isArray(rawField.ui_meta?.options) && rawField.ui_meta.options.length > 0\n ? rawField.ui_meta.options\n : undefined;\n\n if (bridgeOptions || uiMetaOptions) {\n const mergedProps = uiMetaOptions ? { ...props, options: uiMetaOptions } : props;\n return <SelectF {...mergedProps} />;\n }\n\n // 5. Date-time fields.\n // bridge.getType() returns Date for format:\"date-time\" fields.\n // Also handle standard system audit fields by name.\n if (\n props.fieldType === Date ||\n rawFormat === \"date-time\" ||\n fieldName === \"creation\" ||\n fieldName === \"modified\"\n ) {\n return <Text {...props} type=\"datetime-local\" />;\n }\n\n // 6. Date-only fields.\n // CRITICAL: bridge removes \"format\" from schemaProps (it's in propsToRemove).\n // bridge.getType() returns String for format:\"date\" (NOT Date).\n // Must read format from props.field (the raw field schema) not from schemaProps.\n if (rawFormat === \"date\" || fieldName.endsWith(\"_date\")) {\n return <Text {...props} type=\"date\" />;\n }\n\n // 7. Boolean\n if (props.fieldType === Boolean) {\n return <Bool {...props} />;\n }\n\n // 8. Default: String / Number / unknown → TextField\n return <Text {...props} />;\n});\n","import { useForm } from \"uniforms\";\nimport { YStack, MText } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../../hooks\";\n\n/**\n * ErrorsField - Displays global errors\n */\nexport const ErrorsField = () => {\n const { t } = useTranslation(\"desk\");\n const { error } = useForm();\n if (!error) return null;\n\n const details = (error as any).details || [];\n\n return (\n <YStack\n backgroundColor=\"$errorBg\"\n padding=\"$3\"\n borderRadius=\"$4\"\n marginBottom=\"$4\"\n borderStyle=\"solid\"\n borderWidth={1}\n borderColor=\"$errorBorder\"\n >\n <MText color=\"$error\" fontWeight=\"600\">\n {t(\"Please correct the following errors:\")}\n </MText>\n {details.map((detail: any, index: number) => (\n <MText key={index} color=\"$error\" size=\"sm\" marginLeft=\"$2\">\n • {detail.message}\n </MText>\n ))}\n </YStack>\n );\n};\n","import { filterDOMProps, useForm } from \"uniforms\";\nimport { Button } from \"@framework-m/ui\";\n\n// Filter props for native elements\n// Note: Uniforms 4 uses a more restricted set of allowed props for filtering\nfilterDOMProps.register(\"submitText\" as any);\n\n/**\n * SubmitField - Maps to Button\n */\nexport const SubmitField = ({ value, ...props }: any) => {\n const { state } = useForm();\n return (\n <Button\n type=\"submit\"\n disabled={state.disabled}\n theme=\"active\"\n marginTop=\"$4\"\n {...filterDOMProps(props)}\n >\n {value || \"Submit\"}\n </Button>\n );\n};\n","import Ajv from \"ajv\";\nimport { useMemo } from \"react\";\nimport { JSONSchemaBridge } from \"uniforms-bridge-json-schema\";\nimport { AutoField, ErrorsField, SubmitField } from \"./tamagui-fields\";\nimport { BaseForm } from \"uniforms\";\nimport { XStack, YStack } from \"@framework-m/ui\";\n\nconst ajv = new Ajv({\n allErrors: true,\n useDefaults: true,\n strict: false,\n});\n\n// Add custom keywords if needed (like rjsf uses)\najv.addKeyword({ keyword: \"ui:widget\" });\najv.addKeyword({ keyword: \"ui:options\" });\n\n/**\n * AutoForm props\n */\nexport interface AutoFormProps<T = any> {\n /** JSON Schema for the form */\n schema: any;\n /** UI Schema for customizing form appearance */\n uiSchema?: any;\n /** Current form data */\n formData?: T;\n /** Called when form data changes */\n onChange?: (data: T) => void;\n /** Called when form is submitted */\n onSubmit?: (data: T) => void;\n /** Called on validation error */\n onError?: (errors: any[]) => void;\n /** Whether form is read-only */\n readonly?: boolean;\n /** Whether form is disabled */\n disabled?: boolean;\n /** Hide submit button */\n hideSubmitButton?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Additional styling (Tamagui props) */\n className?: string;\n /** Number of columns for automatic layout */\n columns?: number;\n /** Children to render (e.g., custom buttons) */\n children?: React.ReactNode;\n}\n\n/**\n * AutoForm Component\n *\n * A schema-driven form built with Uniforms and Tamagui.\n * Works seamlessly on Web and React Native.\n */\nexport function AutoForm<T = any>({\n schema,\n formData,\n onChange,\n onSubmit,\n readonly = false,\n disabled = false,\n hideSubmitButton = false,\n submitText = \"Submit\",\n columns = 1,\n children,\n}: AutoFormProps<T>) {\n // Create Uniforms bridge\n const bridge = useMemo(() => {\n const validator = (model: any) => {\n ajv.validate(schema, model);\n if (ajv.errors) {\n return { details: ajv.errors };\n }\n };\n return new JSONSchemaBridge({ schema, validator });\n }, [schema, ajv]);\n\n const handleUpdate = (key: string, value: any) => {\n if (!onChange) return;\n\n const keys = key.split(\".\");\n if (keys.length === 1) {\n onChange({ ...(formData || {}), [key]: value } as T);\n return;\n }\n\n // Handle nested updates (e.g. \"items.0.qty\")\n const newModel = JSON.parse(JSON.stringify(formData || {}));\n let current: any = newModel;\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (current[k] === undefined) {\n // Infer type (array if next key is numeric)\n current[k] = !isNaN(Number(keys[i + 1])) ? [] : {};\n }\n current = current[k];\n }\n current[keys[keys.length - 1]] = value;\n onChange(newModel as T);\n };\n\n return (\n <BaseForm\n schema={bridge}\n model={formData}\n onChange={handleUpdate}\n onSubmit={(model: any) => onSubmit?.(model as T)}\n disabled={disabled || readonly}\n >\n <YStack gap=\"$1\">\n <ErrorsField />\n\n {/* Render fields automatically based on schema keys */}\n {columns > 1 ? (\n <XStack flexWrap=\"wrap\" marginHorizontal=\"$-1.5\">\n {Object.keys(schema.properties || {}).map((key) => (\n <YStack key={key} flexBasis={`${100 / columns}%`} paddingHorizontal=\"$1.5\">\n <AutoField name={key} />\n </YStack>\n ))}\n </XStack>\n ) : (\n Object.keys(schema.properties || {}).map((key) => <AutoField key={key} name={key} />)\n )}\n\n {children}\n\n {!hideSubmitButton && <SubmitField value={submitText} />}\n </YStack>\n </BaseForm>\n );\n}\n\nexport default AutoForm;\n","export const SYSTEM_FIELDS = [\n \"id\",\n \"creation\",\n \"modified\",\n \"modified_by\",\n \"owner\",\n \"deleted_at\",\n \"docstatus\",\n \"idx\",\n \"parent\",\n \"parentfield\",\n \"parenttype\",\n \"is_favorite\",\n \"lft\",\n \"rgt\",\n \"old_parent\",\n];\n\nexport function stringToHslColor(str: string, s = 65, l = 45) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (str.codePointAt(i) ?? 0) + ((hash << 5) - hash);\n }\n const h = Math.abs(hash) % 360;\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nexport function ensureUtc(dateStr: string): Date {\n if (!dateStr) return new Date();\n const hasTimezone = /[Zz]$|[+-]\\d{2}(:?\\d{2})?$/.test(dateStr.trim());\n const isoStr = dateStr.includes(\" \") ? dateStr.replace(\" \", \"T\") : dateStr;\n const normalized = hasTimezone ? isoStr : `${isoStr}Z`;\n const date = new Date(normalized);\n return Number.isNaN(date.getTime()) ? new Date(dateStr) : date;\n}\n\nexport function formatRelativeTime(dateInput: string | Date): string {\n const now = new Date();\n const date = typeof dateInput === \"string\" ? ensureUtc(dateInput) : dateInput;\n const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (diffInSeconds < 60) return \"just now\";\n const diffInMinutes = Math.floor(diffInSeconds / 60);\n if (diffInMinutes < 60) return `${diffInMinutes}m ago`;\n const diffInHours = Math.floor(diffInMinutes / 60);\n if (diffInHours < 24) return `${diffInHours}h ago`;\n const diffInDays = Math.floor(diffInHours / 24);\n if (diffInDays < 30) return `${diffInDays}d ago`;\n return date.toLocaleDateString();\n}\n","/**\n * AutoTable Component\n *\n * Schema-driven table using TanStack Table with Refine's data fetching.\n * Generates columns from metadata with built-in sorting, filtering, pagination.\n *\n * Per checklist section 2.3:\n * - Columns generated from metadata\n * - Sorting, filtering, pagination built-in\n * - Row selection for bulk actions\n */\n\nimport {\n MStack,\n XStack,\n YStack,\n Button,\n MText,\n Card,\n useTheme,\n Skeleton,\n Input,\n Icon,\n} from \"@framework-m/ui\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"../../hooks/useTranslation\";\nimport { useList, type CrudFilters } from \"@refinedev/core\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type RowSelectionState,\n type PaginationState,\n type ColumnSizingState,\n} from \"@tanstack/react-table\";\nimport type { DocTypeSchema, JSONSchemaProperty } from \"../../hooks/types\";\nimport { SYSTEM_FIELDS, stringToHslColor, ensureUtc, formatRelativeTime } from \"./tableUtils\";\n\n/**\n * AutoTable props\n */\nexport interface AutoTableProps<TData extends object = object> {\n /** Resource name (DocType) */\n resource: string;\n /** Schema for generating columns */\n schema?: DocTypeSchema;\n /** Optional filters forwarded to Refine useList */\n filters?: CrudFilters;\n /** Custom column definitions (overrides schema-generated) */\n columns?: ColumnDef<TData, unknown>[];\n /** Enable row selection */\n enableSelection?: boolean;\n /** Called when selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Called when row is clicked */\n onRowClick?: (row: TData) => void;\n /** Additional className */\n className?: string;\n}\n\nfunction serializeQueryState(\n resource: string,\n filters: CrudFilters | undefined,\n sorting: SortingState\n): string {\n return JSON.stringify({\n resource,\n filters: filters ?? null,\n sorting,\n });\n}\n\nfunction clampColumnSize(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction getPropertyType(property: JSONSchemaProperty): string {\n const type = property.type;\n if (Array.isArray(type)) return type.find((item) => item !== \"null\") ?? \"\";\n return typeof type === \"string\" ? type : \"\";\n}\n\nfunction getDefaultColumnSize(field: string, label: string, property: JSONSchemaProperty): number {\n const labelWidth = Math.ceil(label.length * 8.5) + 58;\n const propertyType = getPropertyType(property);\n const dateLike = property.format === \"date\" || property.format === \"date-time\";\n\n if (field === \"name\") return clampColumnSize(Math.max(labelWidth, 220), 180, 320);\n if (/(amount|total|rate|qty|quantity|debit|credit|balance)$/i.test(field)) {\n return clampColumnSize(Math.max(labelWidth, 136), 120, 220);\n }\n if (/(date|status)$/i.test(field) || dateLike || propertyType === \"boolean\") {\n return clampColumnSize(Math.max(labelWidth, 132), 118, 220);\n }\n return clampColumnSize(Math.max(labelWidth, 180), 140, 300);\n}\n\n/**\n * Generate column definitions from JSON Schema\n */\nfunction generateColumnsFromSchema<TData extends object>(\n schema: DocTypeSchema,\n t: (key: string) => string\n): ColumnDef<TData, unknown>[] {\n const columns: ColumnDef<TData, unknown>[] = [];\n\n for (const [key, prop] of Object.entries(schema.properties)) {\n const property: JSONSchemaProperty = prop;\n\n // Skip hidden and system fields in the main list\n if (property[\"x-hidden\"] || SYSTEM_FIELDS.includes(key)) continue;\n\n const label = property.title || key;\n columns.push({\n id: key,\n accessorKey: key,\n header: label,\n cell: ({ getValue }) => {\n const value = getValue();\n\n // Format based on type\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (property.format === \"date\" || property.format === \"date-time\") {\n return ensureUtc(value as string).toLocaleDateString();\n }\n return String(value);\n },\n enableSorting: true,\n minSize: 96,\n maxSize: 560,\n size: getDefaultColumnSize(key, label, property),\n });\n }\n\n // Add accessible system info column at the end\n columns.push({\n id: \"system_info\",\n header: t(\"Updated\"),\n accessorKey: \"modified\",\n cell: ({ row }) => {\n const data = row.original as Record<string, unknown>;\n const rawId = data.id;\n const id = typeof rawId === \"string\" || typeof rawId === \"number\" ? String(rawId) : \"No ID\";\n\n const rawModified = data.modified;\n const modified =\n typeof rawModified === \"string\" && rawModified.trim() ? rawModified : undefined;\n\n const rawModifiedBy = data.modified_by ?? data.owner;\n const modifiedBy =\n typeof rawModifiedBy === \"string\" && rawModifiedBy.trim() ? rawModifiedBy : \"system\";\n\n const relativeTime = modified ? formatRelativeTime(modified) : \"Unknown\";\n const userColor = stringToHslColor(modifiedBy);\n\n // Filter out UUIDs and systems for initials\n const hasHumanName = modifiedBy && !modifiedBy.includes(\"-\") && modifiedBy !== \"system\";\n const initials = hasHumanName ? modifiedBy.charAt(0).toUpperCase() : \"ⓘ\";\n\n const infoText = `ID: ${id}\\nBy: ${modifiedBy}\\nModified: ${modified ? ensureUtc(modified).toLocaleString() : \"Unknown\"}`;\n\n return (\n <XStack\n alignItems=\"center\"\n gap=\"$xs\"\n cursor=\"help\"\n title={infoText}\n aria-label={infoText}\n opacity={0.6}\n hoverStyle={{ opacity: 1 }}\n >\n <YStack\n width={18}\n height={18}\n borderRadius=\"$xs\"\n backgroundColor={hasHumanName ? userColor : \"transparent\"}\n borderWidth={hasHumanName ? 0 : 1}\n borderColor=\"$borderColor\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize={10} color={hasHumanName ? \"#fff\" : \"$colorMuted\"} fontWeight=\"700\">\n {initials}\n </MText>\n </YStack>\n <MText fontSize={11} color=\"$colorMuted\" whiteSpace=\"nowrap\">\n {relativeTime}\n </MText>\n </XStack>\n );\n },\n enableSorting: true,\n });\n\n return columns;\n}\n\n/**\n * AutoTable Component\n *\n * Uses Refine's useList for data fetching and TanStack Table for display.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoTable } from \"../components/table\";\n *\n * function TaskList() {\n * const { schema } = useDocTypeMeta(\"Task\");\n *\n * return (\n * <AutoTable\n * resource=\"Task\"\n * schema={schema}\n * onRowClick={(row) => navigate(`/task/${row.id}`)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoTable<TData extends object = object>({\n resource,\n schema,\n filters,\n columns: customColumns,\n enableSelection = false,\n onSelectionChange,\n onRowClick,\n className,\n}: Readonly<AutoTableProps<TData>>) {\n const { t } = useTranslation();\n\n // Determine initial sorting state (default to modified desc if modified exists)\n const [sorting, setSorting] = useState<SortingState>(() => {\n // Check if 'modified' is a valid field (not hidden)\n const hasModified = schema?.properties?.modified && !schema.properties.modified[\"x-hidden\"];\n if (hasModified) {\n return [{ id: \"modified\", desc: true }];\n }\n return [];\n });\n\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 20,\n });\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\n const theme = useTheme();\n // Safe access to theme token for web style resolution\n const borderColor =\n (theme as { borderColorMuted?: { get?: () => string } }).borderColorMuted?.get?.() ||\n \"rgba(226, 232, 240, 0.4)\";\n\n // Stable sorters for useList\n const sorters = useMemo<Array<{ field: string; order: \"desc\" | \"asc\" }> | undefined>(() => {\n if (sorting.length === 0) return undefined;\n const sort = sorting[0];\n return [\n {\n field: sort.id,\n order: sort.desc ? \"desc\" : \"asc\",\n },\n ];\n }, [sorting]);\n\n // Fetch data using Refine's useList\n const { result, query } = useList({\n resource,\n pagination: {\n currentPage: pagination.pageIndex + 1,\n pageSize: pagination.pageSize,\n mode: \"server\",\n },\n filters,\n sorters,\n queryOptions: {\n placeholderData: (prev: any) => prev,\n },\n });\n\n const tableData = (result?.data ?? []) as TData[];\n const totalCount = result?.total ?? 0;\n const isLoading = query?.isLoading ?? false;\n const isFetching = query?.isFetching ?? false;\n const queryError = query?.error as Error | null | undefined;\n const queryStateKey = useMemo(\n () => serializeQueryState(resource, filters, sorting),\n [resource, filters, sorting]\n );\n const previousQueryStateKey = useRef<string | null>(null);\n\n useEffect(() => {\n if (previousQueryStateKey.current === null) {\n previousQueryStateKey.current = queryStateKey;\n return;\n }\n\n if (previousQueryStateKey.current !== queryStateKey) {\n previousQueryStateKey.current = queryStateKey;\n setPagination((current) =>\n current.pageIndex === 0 ? current : { ...current, pageIndex: 0 }\n );\n }\n }, [queryStateKey]);\n\n // Generate columns from schema or use custom\n const columns = useMemo(() => {\n if (customColumns) return customColumns;\n if (schema) return generateColumnsFromSchema<TData>(schema, t);\n return [];\n }, [customColumns, schema, t]);\n\n // Add selection column if enabled\n const columnsWithSelection = useMemo(() => {\n if (!enableSelection) return columns;\n\n const selectionColumn: ColumnDef<TData, unknown> = {\n id: \"select\",\n size: 48,\n header: ({ table }) => (\n <Input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler() as any}\n />\n ),\n cell: ({ row }) => (\n <Input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler() as any}\n onClick={(e: any) => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n };\n\n return [selectionColumn, ...columns];\n }, [columns, enableSelection]);\n\n // Create TanStack Table instance\n const table = useReactTable<TData>({\n data: tableData,\n columns: columnsWithSelection,\n pageCount: Math.ceil(totalCount / pagination.pageSize),\n state: {\n sorting,\n rowSelection,\n pagination,\n columnSizing,\n },\n // Use 'id' field (UUID) as row identifier, fallback to index\n getRowId: (row) => {\n const r = row as Record<string, unknown>;\n return String(r.id ?? r.name ?? \"\");\n },\n onSortingChange: setSorting,\n onColumnSizingChange: setColumnSizing,\n onRowSelectionChange: (updater) => {\n const newSelection = typeof updater === \"function\" ? updater(rowSelection) : updater;\n setRowSelection(newSelection);\n\n // Notify parent of selection change\n // Compute selected rows directly from newSelection and tableData\n // (table.getSelectedRowModel() uses stale state before setRowSelection takes effect)\n if (onSelectionChange) {\n const selectedIds = Object.keys(newSelection).filter((key) => newSelection[key]);\n const selectedRows = tableData.filter((row) => {\n const r = row as Record<string, unknown>;\n const rowId = String(r.id ?? r.name ?? \"\");\n return selectedIds.includes(rowId);\n });\n onSelectionChange(selectedRows);\n }\n },\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableRowSelection: enableSelection,\n enableColumnResizing: true,\n columnResizeMode: \"onChange\",\n defaultColumn: {\n minSize: 96,\n size: 180,\n maxSize: 560,\n },\n });\n\n if (isLoading) {\n return (\n <MStack padding=\"$md\" gap=\"$sm\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} height={32} width=\"100%\" />\n ))}\n </MStack>\n );\n }\n\n if (queryError) {\n return (\n <Card padding=\"$md\" backgroundColor=\"$error\" borderColor=\"$error\" borderWidth={1}>\n <MText color=\"#fff\">{queryError.message || `Failed to load ${resource}.`}</MText>\n </Card>\n );\n }\n\n return (\n <YStack\n className={className}\n width=\"100%\"\n flex={1}\n role=\"table\"\n aria-label={resource}\n backgroundColor=\"$background\"\n overflow=\"hidden\"\n opacity={isFetching ? 0.6 : 1}\n style={{ transition: \"opacity 0.2s ease\" } as any}\n >\n {/* Table Header */}\n <YStack\n borderBottomWidth={1}\n borderColor={borderColor as any}\n backgroundColor=\"$backgroundSecondary\"\n role=\"rowgroup\"\n marginBottom=\"$xs\"\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <XStack key={headerGroup.id} width=\"100%\" role=\"row\">\n {headerGroup.headers.map((header) => {\n const width =\n header.column.id === \"select\"\n ? 48\n : header.getSize() !== 180\n ? header.getSize()\n : undefined;\n const layoutProps = width !== undefined ? { width, flexShrink: 0 } : { flex: 1 };\n\n return (\n <XStack\n key={header.id}\n {...layoutProps}\n padding={12}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"$xs\"\n minHeight={70}\n cursor={header.column.getCanSort() ? \"pointer\" : \"default\"}\n onPress={\n header.column.getCanSort() ? header.column.getToggleSortingHandler() : undefined\n }\n role=\"columnheader\"\n >\n <XStack gap=\"$xs\" alignItems=\"center\" flex={1} minWidth={0}>\n <MText fontWeight=\"700\" fontSize=\"$sm\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </MText>\n {header.column.getIsSorted() && (\n <Icon\n name={header.column.getIsSorted() === \"asc\" ? \"chevron-up\" : \"chevron-down\"}\n size={14}\n color=\"$primary\"\n aria-label={\n header.column.getIsSorted() === \"asc\"\n ? \"Sorted ascending\"\n : \"Sorted descending\"\n }\n />\n )}\n </XStack>\n {header.column.getCanResize() && header.column.id !== \"select\" ? (\n <XStack\n aria-label={`Resize ${String(header.column.columnDef.header ?? header.column.id)} column`}\n role=\"separator\"\n cursor=\"col-resize\"\n width={12}\n alignSelf=\"stretch\"\n alignItems=\"center\"\n justifyContent=\"center\"\n onMouseDown={(event: any) => {\n event.preventDefault();\n event.stopPropagation();\n header.getResizeHandler()(event);\n }}\n onTouchStart={(event: any) => {\n event.stopPropagation();\n header.getResizeHandler()(event);\n }}\n >\n <YStack\n width={2}\n height=\"65%\"\n borderRadius=\"$round\"\n backgroundColor=\"$primary\"\n opacity={0.55}\n />\n </XStack>\n ) : null}\n </XStack>\n );\n })}\n </XStack>\n ))}\n </YStack>\n\n {/* Table Body */}\n <YStack role=\"rowgroup\" flex={1} minHeight={0} style={{ overflowY: \"auto\" } as any}>\n {table.getRowModel().rows.length === 0 ? (\n <YStack flex={1} minHeight={360} backgroundColor=\"$background\" />\n ) : (\n table.getRowModel().rows.map((row) => (\n <XStack\n key={row.id}\n width=\"100%\"\n borderBottomWidth={1}\n borderColor={borderColor as any}\n backgroundColor={row.getIsSelected() ? \"$backgroundSecondary\" : \"$background\"}\n cursor={onRowClick ? \"pointer\" : \"default\"}\n onPress={() => onRowClick?.(row.original)}\n hoverStyle={onRowClick ? { backgroundColor: \"$backgroundHover\" as any } : undefined}\n focusStyle={onRowClick ? { backgroundColor: \"$backgroundHover\" as any } : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={(e: any) => {\n if (e.key === \"Enter\" && onRowClick) {\n e.preventDefault();\n onRowClick(row.original);\n }\n }}\n role=\"row\"\n >\n {row.getVisibleCells().map((cell) => {\n const isSelect = cell.column.id === \"select\";\n const customSize = cell.column.getSize() !== 180;\n const layoutProps = isSelect\n ? { width: 48, flexShrink: 0 }\n : customSize\n ? { width: cell.column.getSize(), flexShrink: 0 }\n : { flex: 1 };\n\n return (\n <XStack\n key={cell.id}\n {...layoutProps}\n padding={12}\n alignItems=\"center\"\n minHeight={52}\n role=\"cell\"\n >\n <MText fontSize=\"$sm\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </MText>\n </XStack>\n );\n })}\n </XStack>\n ))\n )}\n </YStack>\n\n {/* Pagination */}\n <XStack\n justifyContent=\"space-between\"\n alignItems=\"center\"\n borderTopWidth={table.getRowModel().rows.length === 0 ? 0 : 1}\n borderColor={borderColor as any}\n paddingVertical=\"$xs\"\n paddingHorizontal=\"$0\"\n minHeight={36}\n >\n <MText fontSize=\"$sm\" color=\"$colorMuted\">\n {t(\"Page\")} {pagination.pageIndex + 1} {t(\"of\")} {table.getPageCount() || 1}\n {\" | \"}\n {t(\"Total:\")} {totalCount}\n </MText>\n <XStack gap=\"$sm\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n borderWidth={1}\n borderColor=\"$borderColor\"\n >\n {t(\"Previous\")}\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n borderWidth={1}\n borderColor=\"$borderColor\"\n >\n {t(\"Next\")}\n </Button>\n </XStack>\n </XStack>\n </YStack>\n );\n}\n\nexport default AutoTable;\n","/**\n * Editable Cell Component\n *\n * Inline editable cell for list views.\n * Per checklist 5.2: Inline Editing.\n *\n * Features:\n * - Click cell to edit\n * - Save on blur\n * - Show validation errors\n */\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\nimport { XStack, YStack, MText, Input, Select } from \"@framework-m/ui\";\n\n/**\n * Editable cell props\n */\nexport interface EditableCellProps {\n /** Resource/DocType name */\n resource: string;\n /** Row ID */\n id: string;\n /** Field name */\n field: string;\n /** Current value */\n value: unknown;\n /** Field type for input */\n type?: \"text\" | \"number\" | \"date\" | \"select\" | \"checkbox\";\n /** Options for select type */\n options?: Array<{ value: string; label: string }>;\n /** Whether editing is disabled */\n disabled?: boolean;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Custom renderer for display mode */\n renderValue?: (value: unknown) => React.ReactNode;\n}\n\n/**\n * EditableCell Component\n *\n * @example\n * ```tsx\n * <EditableCell\n * resource=\"Customer\"\n * id=\"CUST-001\"\n * field=\"customer_name\"\n * value=\"John Smith\"\n * type=\"text\"\n * />\n * ```\n */\nexport function EditableCell({\n resource,\n id,\n field,\n value,\n type = \"text\",\n options,\n disabled = false,\n onSaveSuccess,\n renderValue,\n}: EditableCellProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement | HTMLSelectElement>(null);\n const updateMutation = useUpdate();\n\n // Focus input when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n if (inputRef.current instanceof HTMLInputElement) {\n inputRef.current.select();\n }\n }\n }, [isEditing]);\n\n // Reset edit value when prop value changes\n useEffect(() => {\n setEditValue(value);\n }, [value]);\n\n // Enter edit mode\n const handleClick = useCallback(() => {\n if (disabled) return;\n setIsEditing(true);\n setEditValue(value);\n setError(null);\n }, [disabled, value]);\n\n // Cancel edit\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setEditValue(value);\n setError(null);\n }, [value]);\n\n // Save on blur\n const handleBlur = useCallback(() => {\n if (editValue === value) {\n // No change, just exit edit mode\n setIsEditing(false);\n return;\n }\n\n // Save the value\n updateMutation.mutate(\n {\n resource,\n id,\n values: { [field]: editValue },\n },\n {\n onSuccess: () => {\n setIsEditing(false);\n setError(null);\n onSaveSuccess?.();\n },\n onError: (err) => {\n setError(err.message || \"Save failed\");\n },\n }\n );\n }, [resource, id, field, editValue, value, updateMutation, onSaveSuccess]);\n\n // Handle key press\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleBlur();\n } else if (e.key === \"Escape\") {\n handleCancel();\n }\n },\n [handleBlur, handleCancel]\n );\n\n // Handle value change\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const newValue =\n type === \"checkbox\"\n ? (e.target as HTMLInputElement).checked\n : type === \"number\"\n ? Number(e.target.value)\n : e.target.value;\n setEditValue(newValue);\n setError(null);\n },\n [type]\n );\n\n const isSaving = updateMutation.mutation.isPending;\n\n // Display mode\n if (!isEditing) {\n return (\n <XStack\n onPress={handleClick}\n paddingVertical=\"$xs\"\n paddingHorizontal=\"$sm\"\n cursor={disabled ? \"default\" : \"pointer\"}\n borderRadius=\"$sm\"\n minHeight={24}\n hoverStyle={!disabled ? { backgroundColor: \"$backgroundHover\" as any } : undefined}\n title={disabled ? undefined : \"Click to edit\"}\n >\n <MText>\n {renderValue\n ? renderValue(value)\n : type === \"checkbox\"\n ? value\n ? \"✓\"\n : \"✗\"\n : String(value ?? \"\")}\n </MText>\n </XStack>\n );\n }\n\n // Edit mode\n return (\n <YStack position=\"relative\">\n {type === \"select\" ? (\n <Select\n value={String(editValue ?? \"\")}\n onChange={handleChange as any}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown as any}\n disabled={isSaving}\n options={[{ value: \"\", label: \"-\" }, ...(options ?? [])]}\n borderColor={error ? \"$error\" : \"$primary\"}\n />\n ) : type === \"checkbox\" ? (\n <Input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type=\"checkbox\"\n checked={Boolean(editValue)}\n onChange={handleChange as any}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown as any}\n disabled={isSaving}\n style={{ cursor: \"pointer\" }}\n />\n ) : (\n <Input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type={type}\n value={String(editValue ?? \"\")}\n onChange={handleChange as any}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown as any}\n disabled={isSaving}\n borderColor={error ? \"$error\" : \"$primary\"}\n width=\"100%\"\n />\n )}\n\n {/* Error tooltip */}\n {error && (\n <YStack\n position=\"absolute\"\n top=\"100%\"\n left={0}\n marginTop=\"$xs\"\n paddingHorizontal=\"$sm\"\n paddingVertical=\"$xs\"\n backgroundColor=\"$error\"\n borderRadius=\"$sm\"\n zIndex={10}\n >\n <MText color=\"#fff\" fontSize=\"$xs\" whiteSpace=\"nowrap\">\n {error}\n </MText>\n </YStack>\n )}\n\n {/* Saving indicator */}\n {isSaving && (\n <YStack position=\"absolute\" right=\"$sm\" top=\"50%\" y=\"-50%\">\n <MText fontSize=\"$xs\" color=\"$primary\">\n ...\n </MText>\n </YStack>\n )}\n </YStack>\n );\n}\n\nexport default EditableCell;\n","import { useEffect, useMemo } from \"react\";\nimport { YStack, XStack, Button, Heading, MText, Card } from \"@framework-m/ui\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n destructive = false,\n onConfirm,\n onCancel,\n}: Readonly<ConfirmDialogProps>) {\n const titleId = useMemo(\n () => `confirm-dialog-title-${title.toLowerCase().replaceAll(\" \", \"-\")}`,\n [title]\n );\n\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onCancel();\n }\n };\n\n globalThis.addEventListener(\"keydown\", handleKeyDown);\n return () => globalThis.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onCancel]);\n\n if (!open) return null;\n\n return (\n <YStack\n role=\"dialog\"\n aria-modal={true}\n aria-labelledby={titleId}\n position=\"fixed\"\n inset={0}\n zIndex={10000}\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"rgba(0,0,0,0.45)\"\n onPress={onCancel}\n >\n <Card\n onPress={(e: any) => e.stopPropagation()}\n width=\"100%\"\n maxWidth={420}\n padding=\"$lg\"\n backgroundColor=\"$background\"\n elevated\n >\n <Heading id={titleId} size=\"$sm\" marginBottom=\"$sm\">\n {title}\n </Heading>\n <MText color=\"$colorMuted\" marginBottom=\"$lg\">\n {message}\n </MText>\n\n <XStack justifyContent=\"flex-end\" gap=\"$sm\">\n <Button variant=\"ghost\" onPress={onCancel}>\n {cancelLabel}\n </Button>\n <Button variant={destructive ? \"danger\" : \"primary\"} onPress={onConfirm}>\n {confirmLabel}\n </Button>\n </XStack>\n </Card>\n </YStack>\n );\n}\n\nexport default ConfirmDialog;\n","import { Card, XStack, MText, Button } from \"@framework-m/ui\";\n\nexport interface AlertBannerProps {\n message: string;\n variant?: \"info\" | \"error\" | \"success\";\n onDismiss?: () => void;\n}\n\nconst styles = {\n info: {\n bg: \"$backgroundSecondary\",\n border: \"$borderColor\",\n text: \"$color\",\n },\n error: {\n bg: \"$error\",\n border: \"$error\",\n text: \"white\",\n },\n success: {\n bg: \"$success\",\n border: \"$success\",\n text: \"white\",\n },\n} as const;\n\nexport function AlertBanner({ message, variant = \"info\", onDismiss }: Readonly<AlertBannerProps>) {\n const palette = styles[variant];\n\n return (\n <Card\n role={variant === \"error\" ? \"alert\" : \"status\"}\n backgroundColor={palette.bg}\n borderColor={palette.border}\n borderWidth={1}\n marginBottom=\"$md\"\n padding=\"$md\"\n >\n <XStack alignItems=\"center\" justifyContent=\"space-between\" gap=\"$sm\">\n <MText color={palette.text as any} flex={1}>\n {message}\n </MText>\n {onDismiss && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onDismiss} aria-label=\"Dismiss\">\n <MText color={palette.text as any} fontSize=\"$xl\" lineHeight={1}>\n ×\n </MText>\n </Button>\n )}\n </XStack>\n </Card>\n );\n}\n\nexport default AlertBanner;\n","import { Card, MText } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface SubmittedBannerProps {\n docstatus: 0 | 1 | 2;\n}\n\nexport function SubmittedBanner({ docstatus }: Readonly<SubmittedBannerProps>) {\n const { t } = useTranslation(\"desk\");\n if (docstatus === 1) {\n return (\n <Card\n role=\"alert\"\n padding=\"$sm\"\n backgroundColor=\"$warning\"\n borderColor=\"$warning\"\n borderWidth={1}\n >\n <MText color=\"#000\" fontSize=\"$sm\">\n {t(\"Submitted - document is locked\")}\n </MText>\n </Card>\n );\n }\n\n if (docstatus === 2) {\n return (\n <Card\n role=\"alert\"\n padding=\"$sm\"\n backgroundColor=\"$colorMuted\"\n borderColor=\"$borderColor\"\n borderWidth={1}\n >\n <MText color=\"$textOnColor\" fontSize=\"$sm\">\n {t(\"Cancelled - document is locked\")}\n </MText>\n </Card>\n );\n }\n\n return null;\n}\n\nexport default SubmittedBanner;\n","import { useState, useCallback } from \"react\";\nimport { XStack, YStack, Button, Select, Input, MText, Card } from \"@framework-m/ui\";\nimport { ConfirmDialog } from \"../feedback\";\nimport { useTranslation } from \"../../hooks\";\n\n/**\n * BulkActionsBar props\n */\nexport interface BulkActionsBarProps {\n /** Number of selected items */\n selectedCount: number;\n /** Whether action is in progress */\n isLoading?: boolean;\n /** Handle bulk delete */\n onDelete?: () => void;\n /** Handle export as JSON */\n onExportJson?: () => void;\n /** Handle export as CSV */\n onExportCsv?: () => void;\n /** Handle bulk update */\n onBulkUpdate?: (field: string, value: unknown) => void;\n /** Available fields for bulk update */\n updateFields?: Array<{\n name: string;\n label: string;\n options?: Array<{ value: string; label: string }>;\n }>;\n /** Handle clear selection */\n onClear?: () => void;\n}\n\n/**\n * BulkActionsBar Component\n *\n * Standardized toolbar for bulk operations.\n * Uses themed primitives and the new Select component.\n */\nexport function BulkActionsBar({\n selectedCount,\n isLoading = false,\n onDelete,\n onExportJson,\n onExportCsv,\n onBulkUpdate,\n updateFields = [],\n onClear,\n}: Readonly<BulkActionsBarProps>) {\n const { t } = useTranslation(\"desk\");\n const [showUpdateMenu, setShowUpdateMenu] = useState(false);\n const [selectedField, setSelectedField] = useState(\"\");\n const [updateValue, setUpdateValue] = useState(\"\");\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Handle update submit\n const handleUpdate = useCallback(() => {\n if (selectedField && onBulkUpdate) {\n onBulkUpdate(selectedField, updateValue);\n setShowUpdateMenu(false);\n setSelectedField(\"\");\n setUpdateValue(\"\");\n }\n }, [selectedField, updateValue, onBulkUpdate]);\n\n // Handle delete with confirmation\n const handleDelete = useCallback(() => {\n setIsDeleteConfirmOpen(true);\n }, []);\n\n if (selectedCount === 0) return null;\n\n return (\n <XStack\n alignItems=\"center\"\n gap=\"$md\"\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n backgroundColor=\"$backgroundSecondary\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$round\"\n marginBottom=\"$md\"\n flexWrap=\"wrap\"\n >\n {/* Selection count */}\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n {selectedCount} {t(\"selected\")}\n </MText>\n\n {/* Actions */}\n <XStack gap=\"$xs\" flexWrap=\"wrap\">\n {/* Delete */}\n {onDelete && (\n <Button\n variant=\"ghost\"\n backgroundColor=\"$error\"\n size=\"sm\"\n onPress={handleDelete}\n disabled={isLoading}\n >\n {t(\"Delete\")}\n </Button>\n )}\n\n {/* Export JSON */}\n {onExportJson && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onExportJson} disabled={isLoading}>\n {t(\"Export JSON\")}\n </Button>\n )}\n\n {/* Export CSV */}\n {onExportCsv && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onExportCsv} disabled={isLoading}>\n {t(\"Export CSV\")}\n </Button>\n )}\n\n {/* Bulk Update */}\n {onBulkUpdate && updateFields.length > 0 && (\n <YStack position=\"relative\" zIndex={100}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setShowUpdateMenu(!showUpdateMenu)}\n disabled={isLoading}\n >\n {t(\"Update Field \\u25bc\")}\n </Button>\n\n {/* Update dropdown menu */}\n {showUpdateMenu && (\n <Card\n position=\"absolute\"\n top=\"100%\"\n left={0}\n marginTop=\"$xs\"\n width={280}\n padding=\"$md\"\n elevated\n zIndex={1000}\n backgroundColor=\"$background\"\n borderColor=\"$borderColor\"\n borderWidth={1}\n >\n <YStack gap=\"$md\">\n <YStack gap=\"$xs\">\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Select Field\")}\n </MText>\n <Select\n size=\"sm\"\n value={selectedField}\n onChange={(e: any) => setSelectedField(e.target.value)}\n placeholder=\"Select a field...\"\n options={updateFields.map((f) => ({\n value: f.name,\n label: f.label,\n }))}\n />\n </YStack>\n\n {selectedField && (\n <YStack gap=\"$xs\">\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"New Value\")}\n </MText>\n {updateFields.find((f) => f.name === selectedField)?.options ? (\n <Select\n size=\"sm\"\n value={String(updateValue)}\n onChange={(e: any) => setUpdateValue(e.target.value)}\n options={\n updateFields.find((f) => f.name === selectedField)?.options || []\n }\n />\n ) : (\n <Input\n size=\"sm\"\n value={String(updateValue)}\n onChange={(e: any) => setUpdateValue(e.target.value)}\n placeholder=\"Enter new value...\"\n />\n )}\n </YStack>\n )}\n\n <XStack gap=\"$xs\" justifyContent=\"flex-end\">\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setShowUpdateMenu(false)}>\n {t(\"Cancel\")}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={handleUpdate}\n disabled={!selectedField}\n >\n {t(\"Update\")}\n </Button>\n </XStack>\n </YStack>\n </Card>\n )}\n </YStack>\n )}\n\n {/* Clear */}\n {onClear && (\n <Button variant=\"ghost\" size=\"sm\" onPress={onClear} disabled={isLoading}>\n {t(\"Clear Selected\")}\n </Button>\n )}\n </XStack>\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Are you sure you want to delete ${selectedCount} selected document(s)? This action cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n setIsDeleteConfirmOpen(false);\n onDelete?.();\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </XStack>\n );\n}\n\nexport default BulkActionsBar;\n","/**\n * StateBadge Component\n *\n * Displays the current workflow state as a colored badge.\n * Per checklist 2.4: Show current state badge (e.g., \"Draft\", \"Approved\")\n */\n\nimport type { CSSProperties } from \"react\";\nimport { XStack, MText } from \"@framework-m/ui\";\n\n/**\n * State color mapping\n */\nconst STATE_COLORS: Record<string, { bg: string; text: string }> = {\n // Common workflow states\n draft: { bg: \"#e0e0e0\", text: \"#333\" },\n pending: { bg: \"#fff3cd\", text: \"#856404\" },\n submitted: { bg: \"#cce5ff\", text: \"#004085\" },\n approved: { bg: \"#d4edda\", text: \"#155724\" },\n rejected: { bg: \"#f8d7da\", text: \"#721c24\" },\n cancelled: { bg: \"#f5f5f5\", text: \"#666\" },\n completed: { bg: \"#d4edda\", text: \"#155724\" },\n on_hold: { bg: \"#fff3cd\", text: \"#856404\" },\n // Default\n default: { bg: \"#e9ecef\", text: \"#495057\" },\n};\n\n/**\n * Get color for a state\n */\nfunction getStateColor(state: string | undefined): {\n bg: string;\n text: string;\n} {\n if (!state) return STATE_COLORS.default;\n\n const normalizedState = state.toLowerCase().replace(/\\s+/g, \"_\");\n return STATE_COLORS[normalizedState] ?? STATE_COLORS.default;\n}\n\n/**\n * StateBadge props\n */\nexport interface StateBadgeProps {\n /** Current workflow state */\n state?: string;\n /** Document status (0=Draft, 1=Submitted, 2=Cancelled) */\n docstatus?: number;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * StateBadge Component\n *\n * Displays workflow state as a styled badge.\n *\n * @example\n * ```tsx\n * <StateBadge state=\"Pending Approval\" />\n * <StateBadge state=\"Approved\" />\n * <StateBadge state=\"Draft\" docstatus={0} />\n * ```\n */\nexport function StateBadge({ state, docstatus, className, style }: StateBadgeProps) {\n // Determine display state\n const displayState =\n state ??\n (docstatus === 0\n ? \"Draft\"\n : docstatus === 1\n ? \"Submitted\"\n : docstatus === 2\n ? \"Cancelled\"\n : undefined);\n\n if (!displayState) return null;\n\n const colors = getStateColor(displayState);\n\n return (\n <XStack\n className={className}\n alignSelf=\"flex-start\"\n paddingVertical={4}\n paddingHorizontal={12}\n borderRadius=\"$round\"\n backgroundColor={colors.bg as any}\n style={style as any}\n >\n <MText fontSize={12} fontWeight=\"500\" textTransform=\"capitalize\" color={colors.text as any}>\n {displayState}\n </MText>\n </XStack>\n );\n}\n\nexport default StateBadge;\n","/**\n * WorkflowActions Component\n *\n * Renders action buttons for workflow transitions.\n * Per checklist 2.4: Render buttons like \"Submit\", \"Approve\", \"Reject\"\n */\n\nimport type { CSSProperties } from \"react\";\nimport { useWorkflowActions, type WorkflowAction } from \"../../hooks/useWorkflowActions\";\nimport { StateBadge } from \"./StateBadge\";\nimport { XStack, Button, MText } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../hooks\";\n\n/**\n * Action button color mapping\n */\nconst ACTION_COLORS: Record<string, { bg: string; text: string; hover: string }> = {\n submit: { bg: \"#007bff\", text: \"white\", hover: \"#0056b3\" },\n approve: { bg: \"#28a745\", text: \"white\", hover: \"#1e7e34\" },\n reject: { bg: \"#dc3545\", text: \"white\", hover: \"#bd2130\" },\n cancel: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n hold: { bg: \"#ffc107\", text: \"#212529\", hover: \"#d39e00\" },\n default: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n};\n\n/**\n * Get button color for an action\n */\nfunction getActionColor(actionName: string): {\n bg: string;\n text: string;\n hover: string;\n} {\n const normalized = actionName.toLowerCase();\n\n if (normalized.includes(\"submit\")) return ACTION_COLORS.submit;\n if (normalized.includes(\"approve\")) return ACTION_COLORS.approve;\n if (normalized.includes(\"reject\")) return ACTION_COLORS.reject;\n if (normalized.includes(\"cancel\")) return ACTION_COLORS.cancel;\n if (normalized.includes(\"hold\")) return ACTION_COLORS.hold;\n\n return ACTION_COLORS.default;\n}\n\n/**\n * WorkflowActions props\n */\nexport interface WorkflowActionsProps {\n /** DocType name */\n doctype: string;\n /** Document ID */\n id?: string;\n /** Show state badge */\n showState?: boolean;\n /** Callback after successful action */\n onActionComplete?: (action: string) => void;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * WorkflowActions Component\n *\n * Fetches and renders workflow action buttons.\n *\n * @example\n * ```tsx\n * // In form header\n * <WorkflowActions\n * doctype=\"Todo\"\n * id={todoId}\n * showState\n * onActionComplete={() => refetch()}\n * />\n * ```\n */\nexport function WorkflowActions({\n doctype,\n id,\n showState = true,\n onActionComplete,\n className,\n style,\n}: WorkflowActionsProps) {\n const { t } = useTranslation(\"desk\");\n const { state, actions, isLoading, executeAction, isExecuting } = useWorkflowActions(doctype, id);\n\n // Handle action click\n const handleAction = async (action: WorkflowAction) => {\n try {\n await executeAction(action.name);\n onActionComplete?.(action.name);\n } catch (error) {\n console.error(\"Workflow action failed:\", error);\n // Could add toast notification here\n }\n };\n\n if (isLoading) {\n return <MText color=\"$colorMuted\">{t(\"Loading workflow...\")}</MText>;\n }\n\n // No workflow if no state\n if (!state) {\n return null;\n }\n\n // Filter to only show allowed actions\n const allowedActions = actions.filter((a) => a.allowed);\n\n return (\n <XStack className={className} alignItems=\"center\" gap=\"$md\" style={style}>\n {/* State Badge */}\n {showState && <StateBadge state={state.current_state} docstatus={state.docstatus} />}\n\n {/* Action Buttons */}\n {allowedActions.map((action) => {\n const colors = getActionColor(action.name);\n\n return (\n <Button\n key={action.name}\n onPress={() => handleAction(action)}\n disabled={isExecuting}\n backgroundColor={colors.bg as any}\n color={colors.text as any}\n hoverStyle={{ backgroundColor: colors.hover } as any}\n opacity={isExecuting ? 0.6 : 1}\n size=\"sm\"\n >\n {isExecuting ? \"...\" : action.label}\n </Button>\n );\n })}\n\n {/* Show message if no actions available */}\n {allowedActions.length === 0 && !isLoading && (\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n {t(\"No actions available\")}\n </MText>\n )}\n </XStack>\n );\n}\n\nexport default WorkflowActions;\n","/**\n * Plugin Registry\n *\n * Central registry for Framework M plugins.\n * Per checklist 2.5: No Monkey Patching - Plugins register via app.registerPlugin()\n */\n\nimport type {\n Plugin,\n PluginRegistry,\n FieldRegistration,\n SlotRegistration,\n PageRegistration,\n ResourceRegistration,\n ThemeRegistration,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown }).__FRAMEWORK_M_DEBUG__;\n if (typeof globalFlag === \"boolean\") {\n return globalFlag;\n }\n if (typeof globalFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(globalFlag.toLowerCase());\n }\n\n const processRef = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n const envFlag = processRef?.env?.FRAMEWORK_M_DEBUG;\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst pluginLogger = {\n info(message: string): void {\n if (isDebugEnabled()) {\n console.info(`[DeskPluginRegistry] ${message}`);\n }\n },\n warn(message: string): void {\n if (isDebugEnabled()) {\n console.warn(`[DeskPluginRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[DeskPluginRegistry] ${message}`, error);\n },\n};\n\n/**\n * Global plugin registry instance\n */\nconst registry: PluginRegistry = {\n plugins: new Map(),\n fields: new Map(),\n slots: new Map(),\n pages: new Map(),\n resources: [],\n theme: undefined,\n};\n\n/**\n * Register a plugin with the application\n *\n * @param plugin - Plugin definition\n *\n * @example\n * ```tsx\n * // In custom_app/frontend/index.ts\n * import { registerPlugin } from \"@framework-m/core\";\n * import { StarRating } from \"./components/StarRating\";\n * import { PaymentButton } from \"./components/PaymentButton\";\n *\n * registerPlugin({\n * name: \"custom_app\",\n * version: \"1.0.0\",\n * fields: [\n * { name: \"rating\", component: StarRating, fieldTypes: [\"Rating\"] }\n * ],\n * slots: [\n * { slot: \"form-header\", component: PaymentButton, doctypes: [\"Sales Invoice\"] }\n * ],\n * });\n * ```\n */\nexport function registerPlugin(plugin: Plugin): void {\n // Check for duplicate\n if (registry.plugins.has(plugin.name)) {\n pluginLogger.warn(`Plugin \"${plugin.name}\" is already registered. Skipping.`);\n return;\n }\n\n // Register plugin\n registry.plugins.set(plugin.name, plugin);\n\n // Register fields\n if (plugin.fields) {\n for (const field of plugin.fields) {\n registry.fields.set(field.name, field);\n }\n }\n\n // Register slots\n if (plugin.slots) {\n for (const slot of plugin.slots) {\n const existing = registry.slots.get(slot.slot) ?? [];\n existing.push(slot);\n // Sort by priority (higher first)\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot.slot, existing);\n }\n }\n\n // Register pages\n if (plugin.pages) {\n for (const page of plugin.pages) {\n const key = `${page.pageType}:${page.doctype}`;\n registry.pages.set(key, page);\n }\n }\n\n // Register resources\n if (plugin.resources) {\n registry.resources.push(...plugin.resources);\n }\n\n // Register theme (last one wins)\n if (plugin.theme) {\n registry.theme = {\n ...registry.theme,\n ...plugin.theme,\n };\n }\n\n // Run init if provided\n if (plugin.init) {\n Promise.resolve(plugin.init()).catch((err) => {\n pluginLogger.error(`Plugin \"${plugin.name}\" init failed`, err);\n });\n }\n\n pluginLogger.info(`Plugin \"${plugin.name}\" registered successfully.`);\n}\n\n/**\n * Register a custom field widget\n *\n * @param name - Field name/type\n * @param component - React component for the field\n * @param fieldTypes - Optional field types this widget handles\n *\n * @example\n * ```tsx\n * registerField(\"rating\", StarRating, [\"Rating\"]);\n * ```\n */\nexport function registerField(\n name: string,\n component: FieldRegistration[\"component\"],\n fieldTypes?: string[]\n): void {\n registry.fields.set(name, { name, component, fieldTypes });\n}\n\n/**\n * Register a slot injection\n *\n * @param slot - Slot name\n * @param component - React component to inject\n * @param options - Optional doctypes filter and priority\n *\n * @example\n * ```tsx\n * registerSlot(\"form-header\", PaymentButton, {\n * doctypes: [\"Sales Invoice\"],\n * priority: 10\n * });\n * ```\n */\nexport function registerSlot(\n slot: string,\n component: SlotRegistration[\"component\"],\n options?: { doctypes?: string[]; priority?: number }\n): void {\n const existing = registry.slots.get(slot) ?? [];\n\n // Prevent duplicate components in the same slot during HMR\n const isDuplicate = existing.some(\n (r) =>\n r.component === component && JSON.stringify(r.doctypes) === JSON.stringify(options?.doctypes)\n );\n\n if (isDuplicate) {\n return;\n }\n\n const registration: SlotRegistration = {\n slot,\n component,\n ...options,\n };\n\n existing.push(registration);\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot, existing);\n}\n\n/**\n * Register a page override\n *\n * @param pageType - Page type to override\n * @param doctype - DocType or '*' for all\n * @param component - React component for the page\n *\n * @example\n * ```tsx\n * registerPage(\"form\", \"Sales Invoice\", CustomInvoiceForm);\n * ```\n */\nexport function registerPage(\n pageType: PageRegistration[\"pageType\"],\n doctype: string,\n component: PageRegistration[\"component\"]\n): void {\n const key = `${pageType}:${doctype}`;\n registry.pages.set(key, { pageType, doctype, component });\n}\n\n/**\n * Get a registered field widget\n */\nexport function getField(name: string): FieldRegistration | undefined {\n return registry.fields.get(name);\n}\n\n/**\n * Get all slot components for a slot name\n */\nexport function getSlotComponents(slotName: string, doctype?: string): SlotRegistration[] {\n const slots = registry.slots.get(slotName) ?? [];\n\n // Filter by doctype if specified\n if (doctype) {\n return slots.filter((s) => !s.doctypes || s.doctypes.includes(doctype));\n }\n\n return slots;\n}\n\n/**\n * Get a page override\n */\nexport function getPage(pageType: string, doctype: string): PageRegistration | undefined {\n // Try specific doctype first\n const specific = registry.pages.get(`${pageType}:${doctype}`);\n if (specific) return specific;\n\n // Fall back to wildcard\n return registry.pages.get(`${pageType}:*`);\n}\n\n/**\n * Get all registered resources\n */\nexport function getResources(): ResourceRegistration[] {\n return registry.resources;\n}\n\n/**\n * Get the current theme\n */\nexport function getTheme(): ThemeRegistration | undefined {\n return registry.theme;\n}\n\n/**\n * Get all registered plugins\n */\nexport function getPlugins(): Plugin[] {\n return Array.from(registry.plugins.values());\n}\n\n/**\n * Check if a plugin is registered\n */\nexport function hasPlugin(name: string): boolean {\n return registry.plugins.has(name);\n}\n\n/**\n * Clear all registrations (for testing)\n */\nexport function clearRegistry(): void {\n registry.plugins.clear();\n registry.fields.clear();\n registry.slots.clear();\n registry.pages.clear();\n registry.resources.length = 0;\n registry.theme = undefined;\n}\n","/**\n * Slot Component\n *\n * Renders registered slot components for a named slot.\n * Used for injection points in the UI.\n */\n\nimport { getSlotComponents } from \"./registry\";\nimport type { SlotRegistration, SlotProps } from \"./types\";\n\n/**\n * Slot component props\n */\nexport interface SlotComponentProps extends SlotProps {\n /** Slot name */\n name: string;\n /** Children to render if no slot components */\n children?: React.ReactNode;\n}\n\n/**\n * Slot Component\n *\n * Renders all registered components for a named slot.\n *\n * @example\n * ```tsx\n * // In FormView header\n * <div className=\"form-header\">\n * <h1>{doctype}</h1>\n * <Slot name=\"form-header\" doctype={doctype} data={formData} />\n * </div>\n * ```\n */\nexport function Slot({ name, doctype, data, id, children }: SlotComponentProps) {\n const slotRegistrations = getSlotComponents(name, doctype);\n\n if (slotRegistrations.length === 0) {\n return <>{children}</>;\n }\n\n return (\n <>\n {slotRegistrations.map((registration: SlotRegistration, index: number) => {\n const Component = registration.component;\n return <Component key={`${name}-${index}`} doctype={doctype} data={data} id={id} />;\n })}\n </>\n );\n}\n\nexport default Slot;\n","import { MStack, XStack, MText } from \"@framework-m/ui\";\n\nimport type { AuditTimelineDiffValue } from \"../../hooks/useAuditTimeline\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface DiffViewerProps {\n diff: Record<string, AuditTimelineDiffValue> | null;\n}\n\nfunction toDisplay(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (typeof value === \"object\") {\n try {\n return JSON.stringify(value);\n } catch {\n return \"[object]\";\n }\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return `${value}`;\n }\n\n if (typeof value === \"symbol\") {\n return value.description ? `Symbol(${value.description})` : \"Symbol\";\n }\n\n if (typeof value === \"function\") {\n return \"[function]\";\n }\n\n return \"[unknown]\";\n}\n\nexport function DiffViewer({ diff }: Readonly<DiffViewerProps>) {\n const { t } = useTranslation(\"desk\");\n const entries = diff ? Object.entries(diff) : [];\n if (entries.length === 0) {\n return null;\n }\n\n return (\n <MStack marginTop=\"$xs\" gap=\"$xs\" width=\"100%\">\n {/* Header */}\n <XStack borderBottomWidth={1} borderBottomColor=\"$borderColor\" paddingVertical=\"$xs\">\n <MText fontWeight=\"600\" size=\"$xs\" width=\"30%\">\n {t(\"Field\")}\n </MText>\n <MText fontWeight=\"600\" size=\"$xs\" width=\"35%\">\n {t(\"Old\")}\n </MText>\n <MText fontWeight=\"600\" size=\"$xs\" width=\"35%\">\n {t(\"New\")}\n </MText>\n </XStack>\n\n {/* Body */}\n {entries.map(([field, values]) => {\n const oldValue = toDisplay(values.old);\n const newValue = toDisplay(values.new);\n\n return (\n <XStack key={field} paddingVertical=\"$xs\" alignItems=\"flex-start\">\n <MText size=\"$xs\" width=\"30%\">\n {field}\n </MText>\n <MText size=\"$xs\" width=\"35%\">\n {oldValue}\n </MText>\n <MText size=\"$xs\" width=\"35%\">\n {newValue}\n </MText>\n </XStack>\n );\n })}\n </MStack>\n );\n}\n\nexport default DiffViewer;\n","import { Card, Heading, MStack, MText, XStack } from \"@framework-m/ui\";\n\nimport { useAuditTimeline } from \"../../hooks/useAuditTimeline\";\nimport { DiffViewer } from \"./DiffViewer\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface AuditTimelineProps {\n doctype: string;\n id: string | undefined;\n}\n\nfunction toLabel(entry: { action: string; metadata: Record<string, unknown> | null }): string {\n if (entry.action === \"create\") return \"Document created\";\n if (entry.action === \"submit\") return \"Document submitted\";\n if (entry.action === \"amend\") {\n const reason = entry.metadata?.reason;\n if (typeof reason === \"string\" && reason.trim()) {\n return `Amended - ${reason}`;\n }\n return \"Amended\";\n }\n if (entry.action === \"update\") return \"Document updated\";\n if (entry.action === \"restore\") return \"Document restored\";\n if (entry.action === \"cancel\") return \"Document cancelled\";\n if (entry.action === \"in_place_edit\") return \"Document edited in place\";\n return entry.action;\n}\n\nexport function AuditTimeline({ doctype, id }: Readonly<AuditTimelineProps>) {\n const { t } = useTranslation(\"desk\");\n const { entries, isLoading, error } = useAuditTimeline(doctype, id);\n\n return (\n <MStack marginTop=\"$md\" gap=\"$sm\">\n <Heading size=\"$sm\">{t(\"History\")}</Heading>\n\n {isLoading && (\n <MText role=\"status\" color=\"$colorMuted\">\n {t(\"Loading history...\")}\n </MText>\n )}\n\n {!isLoading && error && (\n <MText role=\"alert\" color=\"$error\">\n {error}\n </MText>\n )}\n\n {!isLoading && !error && entries.length === 0 && (\n <MText color=\"$colorMuted\">{t(\"No history yet\")}</MText>\n )}\n\n {!isLoading &&\n !error &&\n entries.map((entry) => (\n <Card key={entry.id} padding=\"$sm\" borderWidth={1}>\n <MStack gap=\"$xs\">\n <XStack justifyContent=\"space-between\" gap=\"$sm\" flexWrap=\"wrap\">\n <MText fontWeight=\"700\">{toLabel(entry)}</MText>\n <MText size=\"$xs\" color=\"$colorMuted\">\n {entry.timestamp}\n </MText>\n </XStack>\n <MText size=\"$xs\">{entry.user_id}</MText>\n {entry.action === \"update\" && <DiffViewer diff={entry.diff} />}\n </MStack>\n </Card>\n ))}\n </MStack>\n );\n}\n\nexport default AuditTimeline;\n","import { Button, Input, MText, XStack } from \"@framework-m/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useDocTypeMeta } from \"../../hooks\";\nimport { useTranslation } from \"../../hooks\";\n\nconst TIME_TRAVEL_UNAVAILABLE_MESSAGE = \"Time travel not available for this DocType\";\n\nfunction normalizeAsOfInput(value: string): string | undefined {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n const match = trimmed.match(/^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?$/);\n\n if (!match) {\n return undefined;\n }\n\n const [, date, hours, minutes, seconds] = match;\n return `${date}T${hours}:${minutes}:${seconds ?? \"00\"}Z`;\n}\n\nfunction toInputValue(asOf?: string): string {\n if (!asOf) return \"\";\n\n const match = asOf.match(/^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})/);\n return match ? match[1] : \"\";\n}\n\nfunction isVersioningEnabled(meta: unknown): boolean {\n if (!meta || typeof meta !== \"object\") return false;\n\n const metadata = (meta as { metadata?: unknown }).metadata;\n if (metadata && typeof metadata === \"object\") {\n const versioningEnabled = (metadata as { versioning_enabled?: unknown }).versioning_enabled;\n if (typeof versioningEnabled === \"boolean\") {\n return versioningEnabled;\n }\n }\n\n const topLevelVersioningEnabled = (meta as { versioning_enabled?: unknown }).versioning_enabled;\n if (typeof topLevelVersioningEnabled === \"boolean\") {\n return topLevelVersioningEnabled;\n }\n\n return false;\n}\n\nexport interface AsOfDatePickerProps {\n doctype?: string;\n asOf?: string;\n onAsOfChange?: (value?: string) => void;\n onError?: (message: string | null) => void;\n}\n\nexport function AsOfDatePicker({\n doctype,\n asOf,\n onAsOfChange,\n onError,\n}: Readonly<AsOfDatePickerProps>) {\n const { t } = useTranslation(\"desk\");\n const { meta } = useDocTypeMeta(doctype ?? \"\");\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n\n const versioningEnabled = useMemo(() => isVersioningEnabled(meta), [meta]);\n\n useEffect(() => {\n setInputValue(toInputValue(asOf));\n }, [asOf]);\n\n if (!doctype) {\n return null;\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n setInputValue(nextValue);\n\n if (!nextValue.trim()) {\n onAsOfChange?.(undefined);\n onError?.(null);\n return;\n }\n\n if (!versioningEnabled) {\n onError?.(TIME_TRAVEL_UNAVAILABLE_MESSAGE);\n return;\n }\n\n const normalized = normalizeAsOfInput(nextValue);\n if (!normalized) {\n return;\n }\n\n onError?.(null);\n onAsOfChange?.(normalized);\n };\n\n return (\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setIsOpen((prev) => !prev)}>\n {t(\"View as of date\")}\n </Button>\n\n {isOpen && (\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Input\n aria-label=\"As of date\"\n type=\"datetime-local\"\n value={inputValue}\n onChange={handleChange}\n size=\"sm\"\n />\n {!versioningEnabled && (\n <MText color=\"$error\" role=\"alert\">\n {TIME_TRAVEL_UNAVAILABLE_MESSAGE}\n </MText>\n )}\n </XStack>\n )}\n </XStack>\n );\n}\n","import React from \"react\";\nimport { Skeleton, XStack, YStack } from \"@framework-m/ui\";\n\nexport interface ShellSkeletonProps {\n // Add props here if needed in the future\n}\n\n/**\n * PageSkeleton\n *\n * Internal page shimmer (Header + Body).\n * Use this for internal route transitions to avoid 'double sidebar' artifacts.\n */\nexport const PageSkeleton: React.FC = () => (\n <XStack flex={1} backgroundColor=\"$background\">\n <YStack flex={1} padding=\"$lg\" overflow=\"hidden\">\n {/* Page Title placeholder */}\n <YStack marginBottom={24}>\n <Skeleton variant=\"heading\" width=\"30%\" height={32} />\n </YStack>\n\n {/* Large Dashboard-like tiles or Form sections */}\n <XStack flexWrap=\"wrap\" gap=\"$lg\">\n {[\"section-a\", \"section-b\", \"section-c\"].map((sectionKey) => (\n <YStack\n key={sectionKey}\n height={200}\n minWidth={300}\n flex={1}\n backgroundColor=\"$background\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$lg\"\n padding=\"$lg\"\n >\n <YStack marginBottom={16}>\n <Skeleton variant=\"heading\" width=\"40%\" />\n </YStack>\n <Skeleton variant=\"text\" count={3} />\n </YStack>\n ))}\n </XStack>\n </YStack>\n </XStack>\n);\n\n/**\n * TableSkeleton\n *\n * Shimmering list view placeholder.\n */\nexport const TableSkeleton: React.FC = () => (\n <YStack padding=\"$lg\" gap=\"$md\" backgroundColor=\"$background\">\n <XStack justifyContent=\"space-between\" marginBottom=\"$lg\">\n <Skeleton variant=\"heading\" width=\"20%\" />\n <Skeleton variant=\"button\" />\n </XStack>\n <YStack gap=\"$sm\">\n {[\n \"row-1\",\n \"row-2\",\n \"row-3\",\n \"row-4\",\n \"row-5\",\n \"row-6\",\n \"row-7\",\n \"row-8\",\n \"row-9\",\n \"row-10\",\n ].map((rowKey) => (\n <XStack\n key={rowKey}\n gap=\"$md\"\n padding=\"$sm\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n >\n <Skeleton variant=\"text\" width=\"5%\" />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" width=\"20%\" />\n </XStack>\n ))}\n </YStack>\n </YStack>\n);\n\n/**\n * ShellSkeleton\n *\n * Full app layout (Rail + Drawer + Content).\n * Used for the very first bootstrap phase.\n */\nexport const ShellSkeleton: React.FC = () => {\n return (\n <XStack\n className=\"skeleton-layout\"\n height=\"100vh\"\n width=\"100%\"\n overflow=\"hidden\"\n backgroundColor=\"$background\"\n >\n {/* Primary Rail Skeleton */}\n <YStack\n width={64}\n backgroundColor=\"$backgroundSecondary\"\n paddingBottom=\"$lg\"\n gap=\"$md\"\n alignItems=\"center\"\n paddingTop=\"$lg\"\n borderRightWidth={1}\n borderColor=\"$borderColor\"\n >\n <Skeleton variant=\"avatar\" width={32} height={32} opacity={0.5} />\n <YStack gap=\"$lg\" marginTop=\"$xl\" opacity={0.2}>\n {[1, 2, 3, 4].map((idx) => (\n <Skeleton key={idx} variant=\"avatar\" width={32} height={32} />\n ))}\n </YStack>\n </YStack>\n\n {/* Contextual Drawer Skeleton */}\n <YStack\n width={240}\n backgroundColor=\"$background\"\n padding=\"$md\"\n gap=\"$lg\"\n display=\"none\"\n $gtSm={{ display: \"flex\" }}\n borderRightWidth={1}\n borderColor=\"$borderColor\"\n >\n <YStack opacity={0.1} padding=\"$sm\">\n <Skeleton variant=\"heading\" width=\"60%\" height={24} />\n </YStack>\n <YStack gap=\"$md\" opacity={0.1}>\n {[1, 2, 3, 4, 5, 6].map((idx) => (\n <XStack key={idx} alignItems=\"center\" gap=\"$sm\" paddingLeft=\"$sm\">\n <Skeleton variant=\"text\" width=\"70%\" height={16} />\n </XStack>\n ))}\n </YStack>\n </YStack>\n\n <YStack flex={1} minWidth={0} overflow=\"hidden\">\n {/* Navbar Skeleton (Minimal or none in the new layout) */}\n <XStack\n height={56}\n alignItems=\"center\"\n paddingHorizontal=\"$lg\"\n backgroundColor=\"$background\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n gap=\"$md\"\n display=\"none\" // Often hidden in Rail/Drawer model unless needed\n >\n <Skeleton variant=\"text\" width=\"40%\" height={24} />\n </XStack>\n\n {/* Page Area */}\n <PageSkeleton />\n </YStack>\n </XStack>\n );\n};\n","/**\n * View Registry\n *\n * Registry for custom views (Kanban, Calendar, Gantt).\n * Per checklist 5.1: Register custom views in DocType Config.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ViewType, ViewProps, ViewRegistration } from \"./types\";\n\n// Registry of view components\nconst viewRegistry = new Map<ViewType, ViewRegistration>();\n\n// DocType-specific view configs (which views are enabled per doctype)\nconst doctypeViews = new Map<string, ViewType[]>();\n\n/**\n * Register a view type\n */\nexport function registerView(registration: ViewRegistration): void {\n viewRegistry.set(registration.type, registration);\n}\n\n/**\n * Get a view component by type\n */\nexport function getViewComponent(type: ViewType): ComponentType<ViewProps> | undefined {\n return viewRegistry.get(type)?.component;\n}\n\n/**\n * Get all registered views\n */\nexport function getRegisteredViews(): ViewRegistration[] {\n return Array.from(viewRegistry.values());\n}\n\n/**\n * Get view registration by type\n */\nexport function getViewRegistration(type: ViewType): ViewRegistration | undefined {\n return viewRegistry.get(type);\n}\n\n/**\n * Set available views for a DocType\n */\nexport function setDocTypeViews(doctype: string, views: ViewType[]): void {\n doctypeViews.set(doctype, views);\n}\n\n/**\n * Get available views for a DocType\n * Returns default ['list'] if not configured\n */\nexport function getDocTypeViews(doctype: string): ViewType[] {\n return doctypeViews.get(doctype) ?? [\"list\"];\n}\n\n/**\n * Check if a view type is available for a DocType\n */\nexport function isViewAvailable(doctype: string, viewType: ViewType): boolean {\n const views = getDocTypeViews(doctype);\n return views.includes(viewType);\n}\n","import React, { useState, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\nimport { YStack, XStack, Button, Heading, MText, Input, Card, Select } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface QuickEditColumn {\n id: string;\n title: string;\n}\n\nexport interface QuickEditItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/** Quick Edit modal — inline edit of standard resource properties. */\nexport function QuickEditModal({\n item,\n resource,\n titleField,\n descField,\n groupField,\n columns,\n onClose,\n onSaved,\n}: {\n item: QuickEditItem;\n resource: string;\n titleField: string;\n descField?: string;\n groupField: string;\n columns: QuickEditColumn[];\n onClose: () => void;\n onSaved: () => void;\n}) {\n const { t } = useTranslation(\"desk\");\n const [title, setTitle] = useState(String(item[titleField] ?? item.name));\n const [desc, setDesc] = useState(descField ? String(item[descField] ?? \"\") : \"\");\n const [status, setStatus] = useState(String(item[groupField] ?? columns[0]?.id ?? \"\"));\n const [saving, setSaving] = useState(false);\n\n const { mutate: updateItem } = useUpdate();\n\n const handleSave = useCallback(() => {\n setSaving(true);\n const values: Record<string, unknown> = {\n [titleField]: title,\n [groupField]: status,\n };\n if (descField) values[descField] = desc;\n\n updateItem(\n { resource, id: item.id, values },\n {\n onSuccess: () => {\n setSaving(false);\n onSaved();\n onClose();\n },\n onError: () => setSaving(false),\n }\n );\n }, [\n title,\n desc,\n status,\n titleField,\n descField,\n groupField,\n resource,\n item.id,\n updateItem,\n onSaved,\n onClose,\n ]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose]\n );\n\n return (\n <YStack\n role=\"dialog\"\n aria-modal={true}\n aria-label={`Edit ${String(item[titleField] ?? item.name)}`}\n position=\"fixed\"\n inset={0}\n zIndex={1000}\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"rgba(0,0,0,0.45)\"\n onClick={onClose}\n onKeyDown={handleKeyDown}\n >\n <Card\n onClick={(e) => e.stopPropagation()}\n backgroundColor=\"$background\"\n padding=\"$lg\"\n width={420}\n maxWidth=\"90vw\"\n elevated\n >\n <XStack justifyContent=\"space-between\" alignItems=\"center\" marginBottom=\"$md\">\n <Heading size=\"$sm\">{t(\"Quick Edit\")}</Heading>\n <Button size=\"sm\" variant=\"ghost\" onPress={onClose}>\n ✕\n </Button>\n </XStack>\n\n {/* Title field */}\n <MText fontSize=\"$xs\" fontWeight=\"500\" color=\"$colorMuted\" marginBottom=\"$xs\">\n {titleField}\n </MText>\n <Input value={title} onChangeText={setTitle} marginBottom=\"$sm\" />\n\n {/* Status/Group field */}\n <MText fontSize=\"$xs\" fontWeight=\"500\" color=\"$colorMuted\" marginBottom=\"$xs\">\n {groupField}\n </MText>\n <Select\n value={status}\n onValueChange={setStatus}\n options={columns.map((col) => ({ value: col.id, label: col.title }))}\n marginBottom=\"$sm\"\n />\n\n {/* Description field (if configured) */}\n {descField && (\n <>\n <MText fontSize=\"$xs\" fontWeight=\"500\" color=\"$colorMuted\" marginBottom=\"$xs\">\n {descField}\n </MText>\n <Input value={desc} onChangeText={setDesc} multiline rows={3} marginBottom=\"$md\" />\n </>\n )}\n\n <XStack gap=\"$sm\" justifyContent=\"flex-end\" marginTop=\"$sm\">\n <Button variant=\"ghost\" onPress={onClose}>\n {t(\"Cancel\")}\n </Button>\n <Button variant=\"primary\" onPress={handleSave} disabled={saving}>\n {saving ? \"\" : \"Save\"}\n </Button>\n </XStack>\n </Card>\n </YStack>\n );\n}\n","import type { KanbanConfig, KanbanColumn, TreeConfig } from \"./types\";\n\n/**\n * Resolves the field to group Kanban columns by.\n */\nexport function resolveKanbanGroupField(config?: KanbanConfig): string {\n return config?.groupField ?? \"status\";\n}\n\n/**\n * Resolves the card title field for Kanban items.\n */\nexport function resolveKanbanTitleField(config?: KanbanConfig): string {\n return config?.titleField ?? \"name\";\n}\n\n/**\n * Resolves the card description field for Kanban items.\n */\nexport function resolveKanbanDescriptionField(config?: KanbanConfig): string | undefined {\n return config?.descriptionField;\n}\n\n/**\n * Discovers or applies Kanban column metrics.\n */\nexport function resolveKanbanColumns(\n config: KanbanConfig | undefined,\n items: Record<string, unknown>[],\n groupField: string\n): KanbanColumn[] {\n if (config?.columns && config.columns.length > 0) {\n return config.columns;\n }\n\n const seen = new Set<string>();\n const discovered: KanbanColumn[] = [];\n const COLUMN_COLORS = [\"#e0e0e0\", \"#faad14\", \"#52c41a\", \"#ff4d4f\", \"#1890ff\", \"#722ed1\"];\n\n for (const item of items) {\n const val = String(item[groupField] ?? \"\");\n if (val && !seen.has(val)) {\n seen.add(val);\n discovered.push({\n id: val,\n title: val.charAt(0).toUpperCase() + val.slice(1).replace(/_/g, \" \"),\n color: COLUMN_COLORS[discovered.length % COLUMN_COLORS.length],\n });\n }\n }\n\n return discovered.length > 0\n ? discovered\n : [\n { id: \"draft\", title: \"Draft\", color: \"#e0e0e0\" },\n { id: \"pending\", title: \"Pending\", color: \"#faad14\" },\n { id: \"approved\", title: \"Approved\", color: \"#52c41a\" },\n { id: \"rejected\", title: \"Rejected\", color: \"#ff4d4f\" },\n ];\n}\n\n/**\n * Resolves the backend field that links to parent node ID for Tree views.\n */\nexport function resolveTreeParentField(config?: TreeConfig): string {\n return config?.parentField ?? \"parent\";\n}\n\n/**\n * Resolves the field used as the display label for Tree views.\n */\nexport function resolveTreeLabelField(config?: TreeConfig): string {\n return config?.labelField ?? \"name\";\n}\n","/**\n * KanbanView — Enhanced Kanban board for state-based DocTypes.\n *\n * Improvements over the basic version:\n * - **Quick Edit modal**: Click a card to open inline edit (title + description)\n * - **Dynamic column discovery**: Auto-generates columns from actual data values\n * when no columns are configured in KanbanConfig\n * - **Grouping by any Select/Link field**: `groupField` is fully configurable\n * - Full keyboard accessibility and CSS-variable theming\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { QuickEditModal } from \"../components/feedback/QuickEditModal\";\nimport { useList, useUpdate } from \"@refinedev/core\";\nimport type { ViewProps, KanbanConfig } from \"./types\";\nimport { YStack, XStack, MText, Card } from \"@framework-m/ui\";\nimport { useTranslation } from \"../hooks\";\nimport { useComponentOverride } from \"../hooks\";\nimport {\n resolveKanbanGroupField,\n resolveKanbanTitleField,\n resolveKanbanDescriptionField,\n resolveKanbanColumns,\n} from \"./utils\";\n\nexport interface KanbanViewProps extends ViewProps {\n config: KanbanConfig;\n}\n\n/** Dragged item state */\ninterface DragState {\n item: KanbanItem;\n sourceColumn: string;\n}\n\ninterface KanbanItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * KanbanView — Full-featured Kanban board.\n *\n * Features:\n * - Drag cards between columns to update the group field\n * - Click a card to Quick Edit (title, description, status)\n * - Auto-discover columns from live data if none configured\n * - Group by any Select/Link field via `config.groupField`\n */\nexport function KanbanView(props: KanbanViewProps) {\n const CustomComponent = useComponentOverride(props.resource, \"KanbanView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardKanbanView {...props} />;\n}\n\nfunction StandardKanbanView({ resource, config }: KanbanViewProps) {\n const { t } = useTranslation(\"desk\");\n const groupField = resolveKanbanGroupField(config);\n const titleField = resolveKanbanTitleField(config);\n const descField = resolveKanbanDescriptionField(config);\n\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const [editingItem, setEditingItem] = useState<KanbanItem | null>(null);\n\n // Fetch all items (up to 200 for Kanban)\n const { result, query } = useList<KanbanItem>({\n resource,\n pagination: { pageSize: 200 },\n });\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n\n const { mutate: updateItem } = useUpdate();\n\n // Auto-discover columns from data if none configured\n const columns = useMemo(\n () => resolveKanbanColumns(config, items as any[], groupField),\n [config, items, groupField]\n );\n\n // Group items by column\n const groupedItems = useMemo(() => {\n const groups: Record<string, KanbanItem[]> = {};\n for (const col of columns) groups[col.id] = [];\n\n for (const item of items) {\n const key = String(item[groupField] ?? \"\");\n if (key in groups) {\n groups[key].push(item);\n } else {\n // Fallback: first column\n const first = columns[0]?.id;\n if (first) groups[first]?.push(item);\n }\n }\n return groups;\n }, [items, columns, groupField]);\n\n const handleDrop = useCallback(\n (targetColumnId: string) => {\n if (!dragState || dragState.sourceColumn === targetColumnId) {\n setDragState(null);\n setDragOverColumn(null);\n return;\n }\n updateItem(\n {\n resource,\n id: dragState.item.id,\n values: { [groupField]: targetColumnId },\n },\n {\n onSuccess: () => {\n void query?.refetch?.();\n },\n }\n );\n setDragState(null);\n setDragOverColumn(null);\n },\n [dragState, resource, groupField, updateItem, query]\n );\n\n if (isLoading) {\n return (\n <YStack padding=\"$xl\" alignItems=\"center\">\n <MText color=\"$colorMuted\">{t(\"Loading Kanban...\")}</MText>\n <XStack gap=\"$md\" padding=\"$md\">\n {[1, 2, 3].map((i) => (\n <YStack\n key={i}\n width={280}\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$lg\"\n padding=\"$md\"\n >\n {[1, 2].map((j) => (\n <YStack\n key={j}\n height={72}\n marginBottom=\"$sm\"\n borderRadius=\"$md\"\n backgroundColor=\"rgba(0,0,0,0.05)\"\n />\n ))}\n </YStack>\n ))}\n </XStack>\n </YStack>\n );\n }\n\n return (\n <>\n {editingItem && (\n <QuickEditModal\n item={editingItem}\n resource={resource}\n titleField={titleField}\n descField={descField}\n groupField={groupField}\n columns={columns}\n onClose={() => setEditingItem(null)}\n onSaved={() => {\n void query?.refetch?.();\n }}\n />\n )}\n\n <XStack\n role=\"region\"\n aria-label=\"Kanban board\"\n gap=\"$md\"\n padding=\"$md\"\n overflow=\"scroll\"\n minHeight={400}\n alignItems=\"flex-start\"\n >\n {columns.map((column) => {\n const isOver = dragOverColumn === column.id;\n return (\n <YStack\n key={column.id}\n role=\"group\"\n aria-label={`${column.title} column`}\n {...({\n onDragOver: (e: any) => {\n e.preventDefault();\n setDragOverColumn(column.id);\n },\n onDragLeave: () => setDragOverColumn(null),\n onDrop: () => handleDrop(column.id),\n } as any)}\n width={280}\n flexShrink={0}\n backgroundColor={isOver ? \"$borderColorMuted\" : \"$backgroundSecondary\"}\n borderRadius=\"$lg\"\n borderWidth={2}\n borderColor={isOver ? \"$primary\" : \"transparent\"}\n >\n {/* Column Header */}\n <XStack\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n borderBottomWidth={3}\n borderBottomColor={column.color ?? \"$primary\"}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <MText fontWeight=\"600\">{column.title}</MText>\n <YStack\n backgroundColor=\"rgba(0,0,0,0.05)\"\n borderRadius={100}\n paddingHorizontal=\"$sm\"\n paddingVertical={2}\n >\n <MText fontSize={10} fontWeight=\"500\" color=\"$colorMuted\">\n {groupedItems[column.id]?.length ?? 0}\n </MText>\n </YStack>\n </XStack>\n\n {/* Cards */}\n <YStack flex={1} padding=\"$sm\" overflow=\"scroll\" gap=\"$sm\" minHeight={80}>\n {groupedItems[column.id]?.map((item) => {\n const isDragging = dragState?.item.id === item.id;\n return (\n <Card\n key={item.id}\n elevated={!isDragging}\n role=\"button\"\n tabIndex={0}\n aria-label={`${String(item[titleField] ?? item.name)} — drag to reorder, press Enter to edit`}\n {...({\n draggable: true,\n onDragStart: () => setDragState({ item, sourceColumn: column.id }),\n onDragEnd: () => setDragState(null),\n } as any)}\n onPress={() => setEditingItem(item)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setEditingItem(item);\n }\n }}\n padding=\"$md\"\n cursor=\"grab\"\n opacity={isDragging ? 0.4 : 1}\n scale={isDragging ? 0.98 : 1}\n animation=\"fast\"\n >\n <MText fontWeight=\"500\" fontSize=\"$sm\" marginBottom={descField ? \"$xs\" : 0}>\n {String(item[titleField] ?? item.name)}\n </MText>\n {descField && item[descField] !== undefined && item[descField] !== null && (\n <MText fontSize=\"$xs\" color=\"$colorMuted\" lineHeight={1.4}>\n {String(item[descField]).slice(0, 80)}\n {String(item[descField]).length > 80 ? \"…\" : \"\"}\n </MText>\n )}\n </Card>\n );\n })}\n\n {/* Empty column placeholder */}\n {groupedItems[column.id]?.length === 0 && (\n <YStack\n padding=\"$lg\"\n alignItems=\"center\"\n borderWidth={2}\n borderStyle=\"dashed\"\n borderColor=\"$borderColor\"\n borderRadius=\"$md\"\n >\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Drop here\")}\n </MText>\n </YStack>\n )}\n </YStack>\n </YStack>\n );\n })}\n </XStack>\n </>\n );\n}\n\nexport default KanbanView;\n","/**\n * Calendar View Component\n *\n * Calendar view for date-based DocTypes.\n * Per checklist 5.1: Calendar view.\n */\n\nimport { useState, useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, CalendarConfig } from \"./types\";\nimport { YStack, XStack, Button, Heading, MText } from \"@framework-m/ui\";\nimport { useComponentOverride, useRouteTraversal } from \"../hooks\";\nimport { useTranslation } from \"../hooks\";\n\n/**\n * Calendar view props\n */\nexport interface CalendarViewProps extends ViewProps {\n /** Calendar configuration */\n config: CalendarConfig;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Get days in month\n */\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = [];\n const date = new Date(year, month, 1);\n\n while (date.getMonth() === month) {\n days.push(new Date(date));\n date.setDate(date.getDate() + 1);\n }\n\n return days;\n}\n\n/**\n * CalendarView Component\n */\nexport function CalendarView(props: CalendarViewProps) {\n const CustomComponent = useComponentOverride(props.resource, \"CalendarView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardCalendarView {...props} />;\n}\n\nfunction StandardCalendarView({ resource, config }: CalendarViewProps) {\n const { t } = useTranslation(\"desk\");\n const startField = config.startField;\n const titleField = config.titleField;\n const go = useGo();\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\");\n\n // Current month state\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n\n // Fetch events for current month\n const startOfMonth = new Date(year, month, 1).toISOString();\n const endOfMonth = new Date(year, month + 1, 0).toISOString();\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n { field: startField, operator: \"gte\", value: startOfMonth },\n { field: startField, operator: \"lte\", value: endOfMonth },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Get days in current month\n const days = useMemo(() => getDaysInMonth(year, month), [year, month]);\n\n // Group events by day\n const eventsByDay = useMemo(() => {\n const groups: Record<string, CalendarEvent[]> = {};\n\n if (data?.data) {\n for (const event of data.data) {\n const dateStr = String(event[startField] ?? \"\").split(\"T\")[0];\n if (dateStr) {\n if (!groups[dateStr]) groups[dateStr] = [];\n groups[dateStr].push(event);\n }\n }\n }\n\n return groups;\n }, [data, startField]);\n\n // Navigation\n const prevMonth = () => setCurrentDate(new Date(year, month - 1));\n const nextMonth = () => setCurrentDate(new Date(year, month + 1));\n const today = () => setCurrentDate(new Date());\n\n // Format month name\n const monthName = currentDate.toLocaleString(\"default\", {\n month: \"long\",\n year: \"numeric\",\n });\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n // First day of month offset\n const firstDayOffset = new Date(year, month, 1).getDay();\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return (\n <YStack padding=\"$xl\">\n <MText color=\"$colorMuted\">{t(\"Loading...\")}</MText>\n </YStack>\n );\n }\n\n return (\n <YStack padding=\"$md\" flex={1}>\n {/* Header */}\n <XStack justifyContent=\"space-between\" alignItems=\"center\" marginBottom=\"$md\">\n <XStack gap=\"$sm\">\n <Button size=\"sm\" variant=\"ghost\" onPress={prevMonth}>\n {t(\"\\u2190 Prev\")}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onPress={today}>\n {t(\"Today\")}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onPress={nextMonth}>\n {t(\"Next \\u2192\")}\n </Button>\n </XStack>\n <Heading size=\"$sm\" margin={0}>\n {monthName}\n </Heading>\n </XStack>\n\n {/* Calendar Grid */}\n <XStack\n flexWrap=\"wrap\"\n backgroundColor=\"$borderColorMuted\"\n borderColor=\"$borderColorMuted\"\n borderWidth={1}\n borderRadius=\"$md\"\n overflow=\"hidden\"\n gap={1}\n >\n {/* Day Headers */}\n {weekDays.map((day) => (\n <YStack\n key={day}\n width={`${100 / 7}%`}\n padding=\"$sm\"\n backgroundColor=\"$backgroundSecondary\"\n alignItems=\"center\"\n >\n <MText fontWeight=\"600\" fontSize=\"$xs\">\n {day}\n </MText>\n </YStack>\n ))}\n\n {/* Empty cells for offset */}\n {Array.from({ length: firstDayOffset }).map((_, i) => (\n <YStack\n key={`empty-${i}`}\n width={`${100 / 7}%`}\n backgroundColor=\"rgba(0,0,0,0.02)\"\n minHeight={80}\n />\n ))}\n\n {/* Days */}\n {days.map((day) => {\n const dateStr = day.toISOString().split(\"T\")[0];\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === new Date().toISOString().split(\"T\")[0];\n\n return (\n <YStack\n key={dateStr}\n width={`${100 / 7}%`}\n backgroundColor=\"$background\"\n minHeight={80}\n padding=\"$xs\"\n >\n <MText\n fontSize=\"$xs\"\n fontWeight={isToday ? \"600\" : \"400\"}\n color={isToday ? \"$primary\" : \"$text\"}\n marginBottom=\"$xs\"\n >\n {day.getDate()}\n </MText>\n {events.slice(0, 3).map((event) => (\n <YStack\n key={event.id}\n onPress={() => {\n const customPath = resolveDetailRoute\n ? resolveDetailRoute(resource, event.id, event)\n : null;\n if (typeof customPath === \"string\") {\n go({ to: customPath });\n } else {\n go({ to: `/app/${resource}/detail/${event.id}` });\n }\n }}\n paddingHorizontal=\"$xs\"\n paddingVertical={2}\n backgroundColor=\"rgba(24, 144, 255, 0.1)\"\n borderRadius=\"$sm\"\n marginBottom={2}\n cursor=\"pointer\"\n overflow=\"hidden\"\n >\n <MText fontSize={11} color=\"$primary\" numberOfLines={1}>\n {String(event[titleField] ?? event.name)}\n </MText>\n </YStack>\n ))}\n {events.length > 3 && (\n <MText fontSize={10} color=\"$colorMuted\">\n +{events.length - 3} {t(\"more\")}\n </MText>\n )}\n </YStack>\n );\n })}\n </XStack>\n </YStack>\n );\n}\n\nexport default CalendarView;\n","/**\n * Gantt View Component\n *\n * Gantt chart view for project management.\n * Per checklist 5.1: Gantt view.\n */\n\nimport { useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, GanttConfig } from \"./types\";\nimport { YStack, XStack, MText } from \"@framework-m/ui\";\nimport { useComponentOverride, useRouteTraversal } from \"../hooks\";\nimport { useTranslation } from \"../hooks\";\n\n/**\n * Gantt view props\n */\nexport interface GanttViewProps extends ViewProps {\n /** Gantt configuration */\n config: GanttConfig;\n}\n\n/**\n * Gantt task item\n */\ninterface GanttTask {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Calculate date range for Gantt\n */\nfunction getDateRange(tasks: GanttTask[], startField: string, endField: string) {\n let minDate = new Date();\n let maxDate = new Date();\n\n for (const task of tasks) {\n const start = new Date(String(task[startField] ?? \"\"));\n const end = new Date(String(task[endField] ?? \"\"));\n if (!isNaN(start.getTime()) && start < minDate) minDate = start;\n if (!isNaN(end.getTime()) && end > maxDate) maxDate = end;\n }\n\n // Add padding\n minDate.setDate(minDate.getDate() - 7);\n maxDate.setDate(maxDate.getDate() + 7);\n\n return { minDate, maxDate };\n}\n\n/**\n * Get days between two dates\n */\nfunction getDaysBetween(start: Date, end: Date): number {\n return Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n/**\n * GanttView Component\n */\nexport function GanttView(props: GanttViewProps) {\n const CustomComponent = useComponentOverride(props.resource, \"GanttView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardGanttView {...props} />;\n}\n\nfunction StandardGanttView({ resource, config }: GanttViewProps) {\n const { t } = useTranslation(\"desk\");\n const nameField = config.nameField ?? \"name\";\n const startField = config.startField;\n const endField = config.endField;\n const progressField = config.progressField;\n const go = useGo();\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\");\n\n // Fetch tasks\n const { result: data, query } = useList<GanttTask>({\n resource,\n pagination: { pageSize: 100 },\n sorters: [{ field: startField, order: \"asc\" }],\n });\n\n // Calculate date range and tasks\n const { tasks, minDate, maxDate, totalDays } = useMemo(() => {\n const tasks = data?.data ?? [];\n if (tasks.length === 0) {\n return {\n tasks: [],\n minDate: new Date(),\n maxDate: new Date(),\n totalDays: 30,\n };\n }\n\n const { minDate, maxDate } = getDateRange(tasks, startField, endField);\n const totalDays = getDaysBetween(minDate, maxDate);\n\n return { tasks, minDate, maxDate, totalDays };\n }, [data, startField, endField]);\n\n // Generate day headers\n const dayHeaders = useMemo(() => {\n const headers: Date[] = [];\n const current = new Date(minDate);\n while (current <= maxDate) {\n headers.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return headers;\n }, [minDate, maxDate]);\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return (\n <YStack padding=\"$xl\">\n <MText color=\"$colorMuted\">{t(\"Loading...\")}</MText>\n </YStack>\n );\n }\n\n if (tasks.length === 0) {\n return (\n <YStack padding=\"$xl\">\n <MText color=\"$colorMuted\">{t(\"No tasks to display\")}</MText>\n </YStack>\n );\n }\n\n const rowHeight = 36;\n const dayWidth = 30;\n\n return (\n <XStack padding=\"$md\" overflow=\"scroll\">\n <XStack minWidth={totalDays * dayWidth + 200}>\n {/* Task Names Column */}\n <YStack width={200} flexShrink={0} borderRightWidth={1} borderColor=\"$borderColor\">\n {/* Header */}\n <YStack\n height={40}\n padding=\"$sm\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$backgroundSecondary\"\n justifyContent=\"center\"\n >\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n {t(\"Task\")}\n </MText>\n </YStack>\n {/* Task rows */}\n {tasks.map((task) => (\n <YStack\n key={task.id}\n onPress={() => {\n const customPath = resolveDetailRoute\n ? resolveDetailRoute(resource, task.id, task)\n : null;\n if (typeof customPath === \"string\") {\n go({ to: customPath });\n } else {\n go({ to: `/app/${resource}/detail/${task.id}` });\n }\n }}\n height={rowHeight}\n padding=\"$sm\"\n borderBottomWidth={1}\n borderColor=\"rgba(0,0,0,0.05)\"\n cursor=\"pointer\"\n overflow=\"hidden\"\n justifyContent=\"center\"\n >\n <MText fontSize=\"$sm\" numberOfLines={1}>\n {String(task[nameField] ?? task.name)}\n </MText>\n </YStack>\n ))}\n </YStack>\n\n {/* Gantt Chart */}\n <YStack flex={1} overflow=\"hidden\">\n {/* Day Headers */}\n <XStack height={40} backgroundColor=\"$backgroundSecondary\">\n {dayHeaders.map((day, i) => (\n <YStack\n key={i}\n width={dayWidth}\n flexShrink={0}\n borderRightWidth={1}\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize={10}>{day.getDate()}</MText>\n </YStack>\n ))}\n </XStack>\n\n {/* Task Bars */}\n {tasks.map((task) => {\n const taskStart = new Date(String(task[startField] ?? \"\"));\n const taskEnd = new Date(String(task[endField] ?? \"\"));\n\n const startOffset = getDaysBetween(minDate, taskStart);\n const duration = getDaysBetween(taskStart, taskEnd);\n const progress = progressField ? Number(task[progressField] ?? 0) : 0;\n\n return (\n <YStack\n key={task.id}\n height={rowHeight}\n position=\"relative\"\n borderBottomWidth={1}\n borderColor=\"rgba(0,0,0,0.05)\"\n >\n {/* Background grid */}\n <XStack position=\"absolute\" inset={0}>\n {dayHeaders.map((_, i) => (\n <YStack\n key={i}\n width={dayWidth}\n flexShrink={0}\n borderRightWidth={1}\n borderColor=\"rgba(0,0,0,0.05)\"\n />\n ))}\n </XStack>\n\n {/* Task bar */}\n <YStack\n position=\"absolute\"\n left={startOffset * dayWidth}\n width={Math.max(duration, 1) * dayWidth}\n top={4}\n height={rowHeight - 8}\n backgroundColor=\"rgba(24, 144, 255, 0.2)\"\n borderWidth={1}\n borderColor=\"$primary\"\n borderRadius=\"$sm\"\n overflow=\"hidden\"\n >\n {/* Progress fill */}\n {progressField && (\n <YStack\n height=\"100%\"\n width={`${progress}%`}\n backgroundColor=\"$primary\"\n opacity={0.3}\n />\n )}\n </YStack>\n </YStack>\n );\n })}\n </YStack>\n </XStack>\n </XStack>\n );\n}\n\nexport default GanttView;\n","/**\n * TreeView Utilities\n * Data mutation bounds supporting API RPC layers securely.\n */\nimport { fetchWithCredentials } from \"../api\";\n\nexport interface TreeNode {\n id: string;\n label: string;\n data: Record<string, unknown>;\n children: TreeNode[];\n}\n\nexport async function fetchTree(doctype: string): Promise<TreeNode[]> {\n const res = await fetchWithCredentials(`/api/tree/${encodeURIComponent(doctype)}`);\n if (!res.ok) throw new Error(`Failed to fetch tree: ${res.status}`);\n const json = (await res.json()) as { tree: TreeNode[] };\n return json.tree;\n}\n\nexport async function updateNode(\n doctype: string,\n nodeId: string,\n values: { parent?: string | null; label?: string }\n): Promise<void> {\n const res = await fetchWithCredentials(\n `/api/tree/${encodeURIComponent(doctype)}/${encodeURIComponent(nodeId)}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(values),\n }\n );\n if (!res.ok) throw new Error(`Update failed: ${res.status}`);\n}\n\nexport async function reparentNode(\n doctype: string,\n nodeId: string,\n newParent: string | null\n): Promise<void> {\n await updateNode(doctype, nodeId, { parent: newParent });\n}\n\nexport async function addChildNode(\n doctype: string,\n parentId: string | null,\n label: string\n): Promise<void> {\n const res = await fetchWithCredentials(`/api/tree/${encodeURIComponent(doctype)}/add-child`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ parent: parentId, label }),\n });\n if (!res.ok) throw new Error(`Add child failed: ${res.status}`);\n}\n","/**\n * TreeView — Hierarchical nested DocType view.\n *\n * Features:\n * - Renders a full nested tree from flat list data using `parent_field`\n * - Inline **Add Child** — click \"+\" at any node to add a child\n * - Inline **Rename** — double-click a label to rename in-place\n * - **Drag-and-drop reparenting** — drag nodes to a new parent\n * - Uses `/api/tree/:doctype` backend endpoints for data + mutations\n * - Keyboard accessible (arrow keys, Enter, Escape)\n */\n\nimport { useState, useCallback, useRef, useEffect, type KeyboardEvent } from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\nimport { YStack, XStack, Button, Input, MText } from \"@framework-m/ui\";\nimport { useComponentOverride } from \"../hooks\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nimport { type TreeNode, fetchTree, reparentNode, updateNode, addChildNode } from \"./treeUtils\";\nimport { useTranslation } from \"../hooks\";\n\ninterface TreeState {\n tree: TreeNode[];\n loading: boolean;\n error: string | null;\n}\n\n// ── Inline Rename Input ────────────────────────────────────────────────────\n\nfunction InlineInput({\n initialValue,\n onConfirm,\n onCancel,\n}: Readonly<{\n initialValue: string;\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}>) {\n const { t } = useTranslation(\"desk\");\n const [value, setValue] = useState(initialValue);\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") onConfirm(value.trim() || initialValue);\n if (e.key === \"Escape\") onCancel();\n };\n\n return (\n <Input\n ref={ref}\n value={value}\n onChangeText={setValue}\n onBlur={() => onConfirm(value.trim() || initialValue)}\n onKeyDown={handleKeyDown}\n size=\"sm\"\n minWidth={160}\n aria-label={t(\"Rename node\")}\n />\n );\n}\n\n// ── Single Tree Node ───────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n doctype,\n onRefresh,\n dragNodeId,\n onDragStart,\n onDrop,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n doctype: string;\n onRefresh: () => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetId: string | null) => void;\n}>) {\n const { t } = useTranslation(\"desk\");\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [addingChild, setAddingChild] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n async (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n try {\n await updateNode(doctype, node.id, { label: newLabel });\n onRefresh();\n } catch {\n // Silently revert on error\n }\n },\n [doctype, node.id, node.label, onRefresh]\n );\n\n const handleAddChild = useCallback(\n async (label: string) => {\n setAddingChild(false);\n if (!label.trim()) return;\n try {\n await addChildNode(doctype, node.id, label);\n setCollapsed(false);\n onRefresh();\n } catch {\n // Silently fail — UI remains consistent\n }\n },\n [doctype, node.id, onRefresh]\n );\n\n const hasChildren = node.children.length > 0;\n let toggleGlyph = \"•\";\n if (hasChildren) {\n toggleGlyph = collapsed ? \"▶\" : \"▼\";\n }\n\n return (\n <YStack role=\"treeitem\" aria-expanded={hasChildren ? !collapsed : undefined}>\n {/* Row */}\n <XStack\n {...({\n draggable: true,\n onDragStart: (e: any) => {\n e.stopPropagation();\n onDragStart(node.id);\n },\n onDragEnd: () => setIsDropTarget(false),\n onDragOver: (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(true);\n },\n onDragLeave: () => setIsDropTarget(false),\n onDrop: (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(false);\n onDrop(node.id);\n },\n } as any)}\n alignItems=\"center\"\n gap=\"$sm\"\n paddingVertical=\"$xs\"\n paddingHorizontal=\"$sm\"\n paddingLeft={8 + depth * 20}\n borderRadius=\"$md\"\n cursor=\"grab\"\n opacity={isDragging ? 0.4 : 1}\n backgroundColor={isDropTarget ? \"rgba(139, 92, 246, 0.1)\" : \"transparent\"}\n borderWidth={1}\n borderColor={isDropTarget ? \"$primary\" : \"transparent\"}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = \"rgba(0,0,0,0.02)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isDropTarget\n ? \"rgba(139, 92, 246, 0.1)\"\n : \"transparent\";\n }}\n onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setCollapsed((c) => !c);\n }\n }}\n tabIndex={0}\n aria-label={node.label}\n >\n {/* Expand/Collapse toggle */}\n <Button\n onPress={(e) => {\n e.stopPropagation();\n setCollapsed((c) => !c);\n }}\n variant=\"ghost\"\n size=\"sm\"\n aria-label={collapsed ? t(\"Expand\") : t(\"Collapse\")}\n width={24}\n height={24}\n padding={0}\n >\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n {toggleGlyph}\n </MText>\n </Button>\n\n {/* Label / Rename input */}\n {renaming ? (\n <InlineInput\n initialValue={node.label}\n onConfirm={handleRename}\n onCancel={() => setRenaming(false)}\n />\n ) : (\n <MText flex={1} fontSize=\"$sm\" lineHeight={1.4}>\n {node.label}\n </MText>\n )}\n\n {/* Action buttons — shown on hover via CSS */}\n <XStack className=\"tree-node-actions\" gap=\"$xs\">\n <Button\n onPress={(e) => {\n e.stopPropagation();\n setAddingChild(true);\n setCollapsed(false);\n }}\n variant=\"ghost\"\n size=\"sm\"\n paddingHorizontal=\"$sm\"\n >\n <MText color=\"$primary\" fontSize=\"$sm\">\n +\n </MText>\n </Button>\n <Button\n onPress={(e) => {\n e.stopPropagation();\n setRenaming(true);\n }}\n variant=\"ghost\"\n size=\"sm\"\n paddingHorizontal=\"$sm\"\n >\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n ✎\n </MText>\n </Button>\n </XStack>\n </XStack>\n\n {/* Inline Add Child input */}\n {addingChild && (\n <YStack paddingLeft={8 + (depth + 1) * 20} paddingVertical=\"$xs\">\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddChild}\n onCancel={() => setAddingChild(false)}\n />\n </YStack>\n )}\n\n {/* Children */}\n {!collapsed && hasChildren && (\n <YStack role=\"group\">\n {node.children.map((child) => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n doctype={doctype}\n onRefresh={onRefresh}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n />\n ))}\n </YStack>\n )}\n </YStack>\n );\n}\n\n// ── TreeView ───────────────────────────────────────────────────────────────\n\n/**\n * TreeView — Hierarchical tree view for DocTypes with a parent field.\n *\n * Reads from `/api/tree/:doctype` and supports:\n * - Inline Add Child (click \"+\")\n * - Inline Rename (double-click)\n * - Drag-and-drop reparenting (PATCH /api/tree/:doctype/:id)\n */\nexport function TreeView(props: Readonly<TreeViewProps>) {\n const CustomComponent = useComponentOverride(props.resource, \"TreeView\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n return <StandardTreeView {...props} />;\n}\n\nfunction StandardTreeView({ resource }: Readonly<TreeViewProps>) {\n const { t } = useTranslation(\"desk\");\n const [state, setState] = useState<TreeState>({\n tree: [],\n loading: true,\n error: null,\n });\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n\n const load = useCallback(async () => {\n setState((s) => ({ ...s, loading: true, error: null }));\n try {\n const tree = await fetchTree(resource);\n setState({ tree, loading: false, error: null });\n } catch (err) {\n setState({\n tree: [],\n loading: false,\n error: err instanceof Error ? err.message : \"Failed to load tree\",\n });\n }\n }, [resource]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleDrop = useCallback(\n async (targetId: string | null) => {\n if (!dragNodeId || dragNodeId === targetId) {\n setDragNodeId(null);\n return;\n }\n try {\n await reparentNode(resource, dragNodeId, targetId);\n void load();\n } catch {\n /* silent */\n }\n setDragNodeId(null);\n },\n [dragNodeId, resource, load]\n );\n\n const handleAddRoot = useCallback(\n async (label: string) => {\n setAddingRoot(false);\n if (!label.trim()) return;\n try {\n await addChildNode(resource, null, label);\n void load();\n } catch {\n /* silent */\n }\n },\n [resource, load]\n );\n\n if (state.loading) {\n return (\n <YStack padding=\"$lg\">\n <MText color=\"$colorMuted\">{t(\"Loading tree...\")}</MText>\n </YStack>\n );\n }\n\n if (state.error) {\n return (\n <YStack padding=\"$xl\" alignItems=\"center\">\n <MText color=\"$error\">{state.error}</MText>\n <Button variant=\"ghost\" onPress={() => void load()} marginTop=\"$sm\">\n {t(\"Retry\")}\n </Button>\n </YStack>\n );\n }\n\n return (\n <YStack padding=\"$md\">\n {/* Toolbar */}\n <XStack alignItems=\"center\" gap=\"$sm\" marginBottom=\"$sm\">\n <MText fontWeight=\"600\" fontSize=\"$sm\" color=\"$colorMuted\">\n {resource}\n </MText>\n <Button onPress={() => setAddingRoot(true)} size=\"sm\">\n {t(\"+ Add Root Node\")}\n </Button>\n <Button variant=\"ghost\" onPress={() => void load()} size=\"sm\" aria-label=\"Refresh tree\">\n ↺\n </Button>\n </XStack>\n\n {/* Inline add root node */}\n {addingRoot && (\n <YStack marginBottom=\"$sm\">\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddRoot}\n onCancel={() => setAddingRoot(false)}\n />\n </YStack>\n )}\n\n {/* Drop zone for reparenting to root */}\n {dragNodeId && (\n <YStack\n {...({\n onDragOver: (e: any) => e.preventDefault(),\n onDrop: () => {\n handleDrop(null).catch(() => undefined);\n },\n } as any)}\n padding=\"$sm\"\n marginBottom=\"$sm\"\n borderWidth={2}\n borderStyle=\"dashed\"\n borderColor=\"$primary\"\n borderRadius=\"$md\"\n alignItems=\"center\"\n >\n <MText fontSize=\"$xs\" color=\"$primary\">\n {t(\"Drop here to make root-level\")}\n </MText>\n </YStack>\n )}\n\n {/* Tree */}\n {state.tree.length === 0 ? (\n <YStack alignItems=\"center\" padding=\"$xl\">\n <MText fontSize={32} marginBottom=\"$sm\">\n 🌳\n </MText>\n <MText color=\"$colorMuted\">\n {t('No items yet. Click \"+ Add Root Node\" to get started.')}\n </MText>\n </YStack>\n ) : (\n <YStack role=\"tree\" aria-label={`${resource} tree`}>\n {state.tree.map((node) => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n doctype={resource}\n onRefresh={() => void load()}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={(targetId) => void handleDrop(targetId)}\n />\n ))}\n </YStack>\n )}\n\n {/* Style for hover-reveal action buttons */}\n <style>{`\n [draggable]:hover .tree-node-actions {\n opacity: 1 !important;\n }\n `}</style>\n </YStack>\n );\n}\n\nexport default TreeView;\n","import { useMemo, useState, type KeyboardEvent } from \"react\";\nimport {\n MStack,\n XStack,\n MText,\n Heading,\n Button,\n Input,\n Select,\n Card,\n Modal,\n Icon,\n} from \"@framework-m/ui\";\nimport { TableSkeleton } from \"../layout/ShellSkeleton\";\nimport { Slot } from \"../../plugins\";\nimport { GanttView, KanbanView, TreeView } from \"../../views\";\nimport { ConfirmDialog } from \"../feedback\";\nimport { AutoTable } from \"../table\";\nimport type { FilterFieldDefinition, FilterRow } from \"../../hooks/useListFilters\";\nimport { useTranslation } from \"../../hooks\";\nimport type { GanttConfig } from \"../../views/types\";\nimport type { ListViewMode } from \"../../hooks/useListActions\";\nexport type FilterOperator = \"eq\" | \"gt\" | \"lt\" | \"in\" | \"like\";\n\nexport const FILTER_OPERATOR_OPTIONS: Array<{ label: string; value: FilterOperator }> = [\n { label: \"Equals\", value: \"eq\" },\n { label: \"Greater Than\", value: \"gt\" },\n { label: \"Less Than\", value: \"lt\" },\n { label: \"In\", value: \"in\" },\n { label: \"Contains\", value: \"like\" },\n];\n\nexport interface ListBodyLayoutProps {\n doctype: string;\n metaLoading: boolean;\n metaError: any;\n schema: any;\n permissions: any;\n identity: any;\n isAuthenticated: boolean;\n selectedRows: Record<string, unknown>[];\n setSelectedRows: (rows: Record<string, unknown>[]) => void;\n searchQuery: string;\n setSearchQuery: (q: string) => void;\n appliedSearchQuery: string;\n applySearch: () => void;\n clearSearch: () => void;\n hasPendingSearchChanges: boolean;\n filterRows: FilterRow[];\n appliedFilterRows: FilterRow[];\n filterableFields: FilterFieldDefinition[];\n filterFieldMap: Record<string, FilterFieldDefinition>;\n addFilterRow: () => void;\n removeFilterRow: (id: string) => void;\n removeAppliedFilterRow: (id: string) => void;\n clearFilterRows: () => void;\n clearAppliedFilters: () => void;\n applyFilters: () => void;\n hasPendingFilterChanges: boolean;\n updateFilterRow: (id: string, updates: any) => void;\n listFilterSlotData: any;\n uiError: string | null;\n timeTravelError: string | null;\n\n // Hook metrics\n isDeleteConfirmOpen: boolean;\n setIsDeleteConfirmOpen: (open: boolean) => void;\n isColumnsMenuOpen: boolean;\n setIsColumnsMenuOpen: (open: boolean) => void;\n isMobile: boolean;\n columnPreferences: any;\n toggleColumnVisibility: (field: string) => void;\n activeView: ListViewMode;\n setActiveView: (v: ListViewMode) => void;\n handleRowClick: (row: Record<string, unknown>) => void;\n\n // Derived values\n canKanban: boolean;\n canTree: boolean;\n canGantt: boolean;\n appName: string;\n title: string;\n listColumns: any[];\n tableColumns: any[];\n tableFilters: any;\n kanbanGroupField: string | undefined;\n kanbanColumns: any[];\n kanbanTitleField: string;\n kanbanDescriptionField: string | undefined;\n detectedParentField: string | undefined;\n detectedLabelField: string;\n ganttConfig: GanttConfig | undefined;\n confirmBulkDelete: () => Promise<void>;\n handleBulkDelete: () => Promise<void>;\n handleNew: () => void;\n}\n\nfunction coerceSelectValue(value: any): string | undefined {\n if (!value) return undefined;\n if (typeof value === \"object\") {\n return String(value?.target?.value ?? value?.value ?? value);\n }\n return String(value);\n}\n\nconst FILTER_OPERATOR_LABELS: Record<FilterOperator, string> = {\n eq: \"=\",\n gt: \">\",\n lt: \"<\",\n in: \"in\",\n like: \"contains\",\n};\n\nfunction hasFilterValue(row: { value?: string }): boolean {\n return typeof row.value === \"string\" && row.value.trim().length > 0;\n}\n\nfunction getFilterFieldLabel(\n row: { field: string },\n filterFieldMap: Record<string, FilterFieldDefinition>\n): string {\n return filterFieldMap[row.field]?.label ?? row.field;\n}\n\nfunction getFilterDisplayValue(\n row: { operator: FilterOperator; value: string; field: string },\n filterFieldMap: Record<string, FilterFieldDefinition>\n): string {\n const fieldConfig = filterFieldMap[row.field];\n if (fieldConfig?.type === \"boolean\") {\n if (row.value === \"true\") return \"True\";\n if (row.value === \"false\") return \"False\";\n }\n\n const optionLabel = fieldConfig?.options?.find((option) => option.value === row.value)?.label;\n if (optionLabel) return optionLabel;\n\n if (row.operator === \"in\") {\n return row.value\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n .join(\", \");\n }\n\n return row.value;\n}\n\nfunction getFilterPillText(\n row: { operator: FilterOperator; value: string; field: string },\n filterFieldMap: Record<string, FilterFieldDefinition>\n): string {\n return `${getFilterFieldLabel(row, filterFieldMap)} ${\n FILTER_OPERATOR_LABELS[row.operator]\n } ${getFilterDisplayValue(row, filterFieldMap)}`;\n}\n\nfunction getFilterInputType(fieldConfig: FilterFieldDefinition | undefined): string {\n switch (fieldConfig?.type) {\n case \"number\":\n return \"number\";\n case \"date\":\n return \"date\";\n case \"datetime\":\n return \"datetime-local\";\n default:\n return \"text\";\n }\n}\n\nexport function ListBodyLayout({\n doctype,\n metaLoading,\n metaError,\n schema,\n selectedRows,\n setSelectedRows,\n searchQuery,\n setSearchQuery,\n appliedSearchQuery,\n applySearch,\n clearSearch,\n hasPendingSearchChanges,\n filterRows,\n appliedFilterRows,\n filterableFields,\n filterFieldMap,\n addFilterRow,\n removeFilterRow,\n removeAppliedFilterRow,\n clearFilterRows,\n clearAppliedFilters,\n applyFilters,\n hasPendingFilterChanges,\n updateFilterRow,\n listFilterSlotData,\n uiError,\n timeTravelError,\n isDeleteConfirmOpen,\n setIsDeleteConfirmOpen,\n isColumnsMenuOpen,\n setIsColumnsMenuOpen,\n isMobile,\n columnPreferences,\n toggleColumnVisibility,\n activeView,\n setActiveView,\n handleRowClick,\n canKanban,\n canTree,\n canGantt,\n title,\n listColumns,\n tableColumns,\n tableFilters,\n kanbanGroupField,\n kanbanColumns,\n kanbanTitleField,\n kanbanDescriptionField,\n detectedParentField,\n detectedLabelField,\n ganttConfig,\n confirmBulkDelete,\n handleBulkDelete,\n handleNew,\n}: ListBodyLayoutProps) {\n const { t } = useTranslation(\"desk\");\n const activeError = uiError ?? timeTravelError;\n const [isFilterPanelOpen, setIsFilterPanelOpen] = useState(false);\n const [isFilterOverflowOpen, setIsFilterOverflowOpen] = useState(false);\n const hasDraftSearchQuery = searchQuery.trim().length > 0;\n const hasAppliedSearchQuery = appliedSearchQuery.trim().length > 0;\n\n const appliedFilters = useMemo(\n () => appliedFilterRows.filter((row) => hasFilterValue(row)),\n [appliedFilterRows]\n );\n const visibleFilterPills = appliedFilters.slice(0, 3);\n const overflowFilterPills = appliedFilters.slice(3);\n\n if (metaLoading) {\n return <TableSkeleton />;\n }\n\n if (metaError) {\n return (\n <MStack padding=\"$xl\" backgroundColor=\"$background\" minHeight=\"100vh\">\n <MText color=\"$error\">\n {t(\"Error loading\")} {doctype}: {metaError.message}\n </MText>\n </MStack>\n );\n }\n\n return (\n <MStack\n padding=\"$0\"\n backgroundColor=\"$background\"\n height=\"100%\"\n minHeight=\"100%\"\n flexDirection=\"column\"\n >\n <MStack marginBottom=\"$sm\" gap=\"$sm\">\n <XStack justifyContent=\"space-between\" alignItems=\"center\" gap=\"$md\">\n <MStack gap=\"$xs\" flex={1} minWidth={0}>\n <Heading size=\"$sm\" margin={0} color=\"$color\">\n {title}\n </Heading>\n </MStack>\n\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\" justifyContent=\"flex-end\">\n <XStack\n role=\"tablist\"\n aria-label=\"View switcher\"\n gap=\"$xs\"\n padding=\"$xs\"\n borderRadius=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n flexWrap=\"wrap\"\n >\n {(\n [\n { key: \"list\", label: t(\"List\"), enabled: true },\n { key: \"kanban\", label: t(\"Kanban\"), enabled: canKanban },\n { key: \"tree\", label: t(\"Tree\"), enabled: canTree },\n ] as const\n ).map((view) => (\n <Button\n key={view.key}\n size=\"sm\"\n variant={activeView === view.key ? \"primary\" : \"ghost\"}\n disabled={!view.enabled}\n onPress={() => setActiveView(view.key)}\n borderRadius=\"$sm\"\n borderWidth={0}\n aria-selected={activeView === view.key}\n role=\"tab\"\n >\n {view.label}\n </Button>\n ))}\n </XStack>\n\n <Slot name=\"list-header-actions\" doctype={doctype} />\n <Button variant=\"primary\" size=\"md\" borderRadius=\"$sm\" onPress={handleNew}>\n <Icon name=\"plus\" size={14} color=\"#fff\" strokeWidth={2.4} />\n {t(\"New\")}\n </Button>\n </XStack>\n </XStack>\n </MStack>\n\n {activeError && (\n <Card\n marginBottom=\"$md\"\n padding=\"$md\"\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$sm\"\n borderWidth={1}\n borderColor=\"$error\"\n >\n <MText color=\"$error\">{activeError}</MText>\n </Card>\n )}\n\n {activeView === \"list\" && (\n <>\n <Card\n padding={isMobile ? \"$sm\" : \"$md\"}\n marginBottom=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$sm\"\n shadowOpacity={0}\n >\n <MStack gap=\"$sm\">\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\" justifyContent=\"space-between\">\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n flex={1}\n minWidth={isMobile ? \"100%\" : 320}\n >\n <Input\n aria-label={`${title} search`}\n placeholder={`Search ${title.toLowerCase()}...`}\n value={searchQuery}\n onChangeText={setSearchQuery}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n applySearch();\n }\n }}\n flex={1}\n minWidth={isMobile ? \"100%\" : 220}\n maxWidth={isMobile ? undefined : 320}\n borderRadius=\"$sm\"\n />\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={applySearch}\n disabled={!hasPendingSearchChanges}\n flex={isMobile ? 1 : undefined}\n borderRadius=\"$sm\"\n >\n <Icon name=\"search\" size={13} color=\"#fff\" strokeWidth={2.4} />\n {t(\"Search\")}\n </Button>\n {(hasDraftSearchQuery || hasAppliedSearchQuery) && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={clearSearch}\n flex={isMobile ? 1 : undefined}\n >\n {t(\"Clear\")}\n </Button>\n )}\n </XStack>\n\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n position=\"relative\"\n zIndex={20}\n >\n <Button\n variant={isFilterPanelOpen || appliedFilters.length > 0 ? \"primary\" : \"ghost\"}\n size=\"sm\"\n borderWidth={1}\n borderColor={isFilterPanelOpen ? \"$primary\" : \"$borderColorMuted\"}\n borderRadius=\"$sm\"\n onPress={() => {\n if (!isFilterPanelOpen && filterRows.length === 0) {\n addFilterRow();\n }\n setIsFilterPanelOpen((open) => !open);\n }}\n >\n <Icon\n name=\"filter\"\n size={14}\n color={isFilterPanelOpen || appliedFilters.length > 0 ? \"#fff\" : \"$color\"}\n />\n {t(\"Filter\")}\n {appliedFilters.length > 0 ? ` (${appliedFilters.length})` : \"\"}\n <Icon\n name={isFilterPanelOpen ? \"x\" : \"chevron-down\"}\n size={13}\n color={\n isFilterPanelOpen || appliedFilters.length > 0 ? \"#fff\" : \"$colorMuted\"\n }\n />\n </Button>\n\n {isFilterPanelOpen && (\n <Card\n position={isMobile ? \"relative\" : \"absolute\"}\n top={isMobile ? undefined : 44}\n right={isMobile ? undefined : 124}\n width={isMobile ? \"100%\" : 520}\n maxWidth={isMobile ? \"100%\" : 520}\n padding=\"$md\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n borderRadius=\"$sm\"\n shadowOpacity={0.12}\n shadowRadius={18}\n shadowOffset={{ width: 0, height: 12 }}\n >\n <MStack gap=\"$sm\">\n {filterRows.length === 0 ? (\n <MStack\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius=\"$sm\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n {t(\"No filters added.\")}\n </MText>\n </MStack>\n ) : (\n <MStack gap=\"$sm\">\n {filterRows.map((row, index) => {\n const fieldConfig = filterFieldMap[row.field];\n const selectOptions =\n fieldConfig?.type === \"boolean\"\n ? [\n { label: t(\"Choose value\"), value: \"\" },\n { label: t(\"True\"), value: \"true\" },\n { label: t(\"False\"), value: \"false\" },\n ]\n : [\n { label: t(\"Choose value\"), value: \"\" },\n ...(fieldConfig?.options ?? []),\n ];\n\n return (\n <XStack\n key={row.id}\n gap=\"$sm\"\n alignItems=\"center\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n flexWrap={isMobile ? \"wrap\" : \"nowrap\"}\n width=\"100%\"\n >\n <Select\n aria-label={`Filter field ${index + 1}`}\n value={row.field}\n options={filterableFields}\n width={isMobile ? \"100%\" : 118}\n onChange={(value) => {\n const nextField = coerceSelectValue(value) || row.field;\n updateFilterRow(row.id, {\n field: nextField,\n value:\n filterFieldMap[nextField]?.type !== fieldConfig?.type\n ? \"\"\n : row.value,\n });\n }}\n />\n\n <Select\n aria-label={`Filter operator ${index + 1}`}\n value={row.operator}\n options={FILTER_OPERATOR_OPTIONS}\n width={isMobile ? \"100%\" : 112}\n onChange={(value) => {\n const nextOperator = coerceSelectValue(value);\n updateFilterRow(row.id, {\n operator: nextOperator || row.operator,\n });\n }}\n />\n\n {fieldConfig?.type === \"select\" ||\n fieldConfig?.type === \"boolean\" ? (\n <Select\n aria-label={`Filter value ${index + 1}`}\n value={row.value}\n options={selectOptions}\n width={isMobile ? \"100%\" : 158}\n onChange={(value) =>\n updateFilterRow(row.id, {\n value: coerceSelectValue(value) ?? \"\",\n })\n }\n />\n ) : (\n <Input\n aria-label={`Filter value ${index + 1}`}\n placeholder={t(\"Value\")}\n type={getFilterInputType(fieldConfig)}\n value={row.value}\n onChangeText={(value: string) =>\n updateFilterRow(row.id, { value })\n }\n width={isMobile ? \"100%\" : 158}\n />\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n width={isMobile ? \"100%\" : 36}\n minWidth={isMobile ? undefined : 36}\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius=\"$sm\"\n onPress={() => removeFilterRow(row.id)}\n aria-label={`Remove filter ${index + 1}`}\n >\n <Icon name=\"x\" size={13} color=\"$color\" />\n </Button>\n </XStack>\n );\n })}\n </MStack>\n )}\n\n <MStack height={1} backgroundColor=\"$borderColorMuted\" />\n\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n >\n <Button variant=\"ghost\" size=\"sm\" onPress={addFilterRow}>\n {t(\"+ Add a Filter\")}\n </Button>\n <XStack gap=\"$sm\" flexWrap=\"wrap\" justifyContent=\"flex-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius=\"$sm\"\n onPress={clearFilterRows}\n disabled={filterRows.length === 0}\n >\n {t(\"Clear Filters\")}\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n borderRadius=\"$sm\"\n onPress={() => {\n applyFilters();\n setIsFilterPanelOpen(false);\n }}\n disabled={!hasPendingFilterChanges}\n >\n {t(\"Apply Filters\")}\n </Button>\n </XStack>\n </XStack>\n </MStack>\n </Card>\n )}\n\n <MStack position=\"relative\" width={isMobile ? \"100%\" : 90}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor={isColumnsMenuOpen ? \"$primary\" : \"$borderColorMuted\"}\n borderRadius=\"$sm\"\n onPress={() => setIsColumnsMenuOpen(!isColumnsMenuOpen)}\n >\n <Icon name=\"columns-3\" size={14} color=\"$color\" />\n {t(\"Columns\")}\n </Button>\n\n {isColumnsMenuOpen && (\n <Card\n position={isMobile ? \"relative\" : \"absolute\"}\n top={isMobile ? undefined : 44}\n right={isMobile ? undefined : 0}\n width={isMobile ? \"100%\" : 188}\n maxWidth={isMobile ? \"100%\" : 188}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n borderRadius=\"$sm\"\n shadowOpacity={0.12}\n shadowRadius={18}\n shadowOffset={{ width: 0, height: 12 }}\n zIndex={30}\n >\n <MStack gap=\"$sm\">\n {listColumns.map((column) => {\n const isVisible = columnPreferences.visibility[column.field] !== false;\n const label = column.label ?? column.title ?? column.field;\n\n return (\n <XStack key={column.field} gap=\"$sm\" alignItems=\"center\">\n <Input\n type=\"checkbox\"\n aria-label={`Toggle column ${label}`}\n checked={isVisible}\n size=\"sm\"\n style={{\n width: 14,\n height: 14,\n minWidth: 14,\n padding: 0,\n cursor: \"pointer\",\n accentColor: \"#8b5cf6\",\n }}\n onChange={() => toggleColumnVisibility(column.field)}\n />\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n {label}\n </MText>\n </XStack>\n );\n })}\n </MStack>\n </Card>\n )}\n </MStack>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius=\"$sm\"\n onPress={() => {\n clearSearch();\n clearAppliedFilters();\n setIsFilterPanelOpen(false);\n setIsColumnsMenuOpen(false);\n }}\n disabled={\n filterRows.length === 0 &&\n appliedFilterRows.length === 0 &&\n !hasDraftSearchQuery &&\n !hasAppliedSearchQuery\n }\n >\n <Icon name=\"rotate-ccw\" size={13} color=\"$colorMuted\" />\n {t(\"Reset\")}\n </Button>\n\n <Slot name=\"list-filters\" doctype={doctype} data={listFilterSlotData} />\n </XStack>\n </XStack>\n\n {(hasAppliedSearchQuery || appliedFilters.length > 0) && (\n <XStack gap=\"$sm\" alignItems=\"center\" flexWrap=\"wrap\">\n {hasAppliedSearchQuery && (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <MText fontSize=\"$sm\">\n {t(\"Search:\")} {appliedSearchQuery.trim()}\n </MText>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={clearSearch}\n aria-label=\"Clear search\"\n >\n ✕\n </Button>\n </XStack>\n </Card>\n )}\n\n {visibleFilterPills.map((row) => (\n <Card\n key={`filter-pill-${row.id}`}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <MText fontSize=\"$sm\">{getFilterPillText(row, filterFieldMap)}</MText>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => removeAppliedFilterRow(row.id)}\n aria-label={`Remove ${getFilterFieldLabel(row, filterFieldMap)} filter`}\n >\n ✕\n </Button>\n </XStack>\n </Card>\n ))}\n\n {overflowFilterPills.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n onPress={() => setIsFilterOverflowOpen(true)}\n >\n +{overflowFilterPills.length} {t(\"more\")}\n </Button>\n )}\n </XStack>\n )}\n </MStack>\n </Card>\n\n <Slot name=\"list-above-table\" doctype={doctype} />\n\n <Card\n flex={1}\n padding={isMobile ? \"$sm\" : \"$md\"}\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$background\"\n borderRadius=\"$sm\"\n shadowOpacity={0}\n >\n <MStack gap=\"$sm\" flex={1}>\n {selectedRows.length > 0 && (\n <XStack justifyContent=\"flex-end\">\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$primary\"\n backgroundColor=\"$backgroundSecondary\"\n minWidth={isMobile ? \"100%\" : 240}\n >\n <XStack\n gap=\"$sm\"\n alignItems={isMobile ? \"flex-start\" : \"center\"}\n flexDirection={isMobile ? \"column\" : \"row\"}\n justifyContent=\"space-between\"\n >\n <MText color=\"$colorMuted\">\n {selectedRows.length} {t(\"selected\")}\n </MText>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n <Button\n variant=\"primary\"\n size=\"sm\"\n backgroundColor=\"$error\"\n onPress={handleBulkDelete}\n >\n {t(\"Delete\")}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onPress={() => setSelectedRows([])}>\n {t(\"Clear\")}\n </Button>\n </XStack>\n </XStack>\n </Card>\n </XStack>\n )}\n\n <XStack width=\"100%\" flex={1} alignItems=\"stretch\" overflow=\"hidden\">\n <AutoTable\n resource={doctype}\n schema={schema}\n columns={tableColumns}\n filters={tableFilters}\n enableSelection\n onSelectionChange={setSelectedRows}\n onRowClick={handleRowClick}\n />\n </XStack>\n </MStack>\n </Card>\n\n <Slot name=\"list-below-table\" doctype={doctype} />\n </>\n )}\n\n <Modal\n isOpen={isFilterOverflowOpen}\n onClose={() => setIsFilterOverflowOpen(false)}\n title=\"Active filters\"\n footer={\n <>\n <Button\n variant=\"ghost\"\n onPress={() => {\n clearAppliedFilters();\n setIsFilterOverflowOpen(false);\n setIsFilterPanelOpen(false);\n }}\n >\n {t(\"Clear filters\")}\n </Button>\n <Button\n variant=\"primary\"\n onPress={() => {\n setIsFilterOverflowOpen(false);\n setIsFilterPanelOpen(true);\n }}\n >\n {t(\"Manage filters\")}\n </Button>\n </>\n }\n >\n <MStack gap=\"$sm\" padding=\"$md\">\n {appliedFilters.map((row) => (\n <Card\n key={`overflow-filter-${row.id}`}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n >\n <XStack justifyContent=\"space-between\" alignItems=\"center\" gap=\"$sm\">\n <MText>{getFilterPillText(row, filterFieldMap)}</MText>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => removeAppliedFilterRow(row.id)}\n aria-label={`Remove ${getFilterFieldLabel(row, filterFieldMap)} filter`}\n >\n ✕\n </Button>\n </XStack>\n </Card>\n ))}\n </MStack>\n </Modal>\n\n {activeView === \"kanban\" && canKanban && kanbanGroupField && (\n <KanbanView\n resource={doctype}\n config={{\n groupField: kanbanGroupField,\n columns: kanbanColumns,\n titleField: kanbanTitleField,\n descriptionField: kanbanDescriptionField,\n }}\n />\n )}\n\n {activeView === \"tree\" && canTree && detectedParentField && (\n <TreeView\n resource={doctype}\n config={{\n parentField: detectedParentField,\n labelField: detectedLabelField,\n allowReparent: true,\n allowAddChild: true,\n allowRename: true,\n }}\n />\n )}\n\n {activeView === \"gantt\" && canGantt && ganttConfig && (\n <GanttView resource={doctype} config={ganttConfig} />\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedRows.length} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n confirmBulkDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </MStack>\n );\n}\n","import { Button, Card, Heading, Input, MStack, MText, XStack } from \"@framework-m/ui\";\nimport { useCallback, useEffect, useMemo, useState, type ChangeEvent } from \"react\";\n\nimport { type CorrectionType, useCorrectionAction } from \"../../hooks/useCorrectionAction\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface CorrectionWizardProps {\n doctype: string;\n id: string;\n isOpen: boolean;\n onClose: () => void;\n onSuccess: (result: Record<string, unknown>) => void;\n supportsInPlaceEdit: boolean;\n}\n\nconst MIN_REASON_LENGTH = 10;\n\nexport function CorrectionWizard({\n doctype,\n id,\n isOpen,\n onClose,\n onSuccess,\n supportsInPlaceEdit,\n}: Readonly<CorrectionWizardProps>) {\n const { t } = useTranslation(\"desk\");\n const [strategy, setStrategy] = useState<CorrectionType>(\"amend\");\n const [reason, setReason] = useState(\"\");\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const { execute, isLoading, error } = useCorrectionAction(doctype, id);\n\n useEffect(() => {\n if (!supportsInPlaceEdit && strategy === \"in_place_edit\") {\n setStrategy(\"amend\");\n }\n }, [strategy, supportsInPlaceEdit]);\n\n const strategyOptions = useMemo(() => {\n const options = [\n {\n value: \"amend\",\n label: \"Amend (creates new document)\",\n },\n ];\n\n if (supportsInPlaceEdit) {\n options.push({\n value: \"in_place_edit\",\n label: \"In-Place Edit (retains document ID)\",\n });\n }\n\n return options;\n }, [supportsInPlaceEdit]);\n\n const handleConfirm = useCallback(async () => {\n const normalizedReason = reason.trim();\n\n if (!normalizedReason) {\n setValidationError(\"Reason is required\");\n return;\n }\n\n if (normalizedReason.length < MIN_REASON_LENGTH) {\n setValidationError(`Reason must be at least ${MIN_REASON_LENGTH} characters`);\n return;\n }\n\n setValidationError(null);\n\n const result = await execute(strategy, { reason: normalizedReason });\n if (result) {\n onSuccess(result);\n onClose();\n }\n }, [execute, onClose, onSuccess, reason, strategy]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <MStack\n role=\"dialog\"\n aria-modal\n aria-labelledby=\"correction-wizard-title\"\n padding=\"$md\"\n borderRadius=\"$md\"\n backgroundColor=\"rgba(0, 0, 0, 0.35)\"\n >\n <Card padding=\"$md\" backgroundColor=\"$background\" borderWidth={1}>\n <MStack gap=\"$sm\">\n <Heading id=\"correction-wizard-title\" size=\"$md\">\n {t(\"Correct Document\")}\n </Heading>\n <MText color=\"$colorMuted\" size=\"$sm\">\n {t(\"Choose a correction strategy and provide a reason.\")}\n </MText>\n\n <MStack gap=\"$xs\">\n <MText size=\"$sm\">{t(\"Correction Strategy\")}</MText>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n {strategyOptions.map((option) => {\n const optionValue = option.value as CorrectionType;\n const selected = strategy === optionValue;\n\n return (\n <Button\n key={option.value}\n variant={selected ? \"primary\" : \"ghost\"}\n onPress={() => setStrategy(optionValue)}\n aria-pressed={selected}\n disabled={isLoading}\n size=\"sm\"\n >\n {option.label}\n </Button>\n );\n })}\n </XStack>\n </MStack>\n\n <MStack gap=\"$xs\">\n <MText tag=\"label\" htmlFor=\"correction-reason\" size=\"$sm\">\n {t(\"Reason\")}\n </MText>\n <Input\n id=\"correction-reason\"\n name=\"correction-reason\"\n aria-label=\"Reason\"\n placeholder=\"Describe why this correction is needed\"\n value={reason}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setReason((event.target as HTMLInputElement).value)\n }\n disabled={isLoading}\n />\n </MStack>\n\n {validationError && (\n <MText role=\"alert\" color=\"$error\" size=\"$sm\">\n {validationError}\n </MText>\n )}\n\n {error && (\n <MText role=\"alert\" color=\"$error\" size=\"$sm\">\n {error}\n </MText>\n )}\n\n <XStack justifyContent=\"flex-end\" gap=\"$sm\" marginTop=\"$sm\">\n <Button onPress={onClose} variant=\"ghost\" disabled={isLoading}>\n {t(\"Cancel\")}\n </Button>\n <Button onPress={handleConfirm} variant=\"primary\" disabled={isLoading}>\n {isLoading ? \"Processing...\" : \"Confirm\"}\n </Button>\n </XStack>\n </MStack>\n </Card>\n </MStack>\n );\n}\n\nexport default CorrectionWizard;\n","import { Button, MStack } from \"@framework-m/ui\";\nimport { useCallback, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nimport { CorrectionWizard } from \"./CorrectionWizard\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface CorrectButtonProps {\n doctype: string;\n id: string;\n docstatus: 0 | 1 | 2;\n supportsInPlaceEdit: boolean;\n}\n\nexport function CorrectButton({\n doctype,\n id,\n docstatus,\n supportsInPlaceEdit,\n}: Readonly<CorrectButtonProps>) {\n const { t } = useTranslation(\"desk\");\n const [isOpen, setIsOpen] = useState(false);\n const navigate = useNavigate();\n\n const handleSuccess = useCallback(\n (result: Record<string, unknown>) => {\n const nextId = result.id;\n if (typeof nextId === \"string\" || typeof nextId === \"number\") {\n navigate(`/app/${doctype}/detail/${nextId}`);\n }\n setIsOpen(false);\n },\n [doctype, navigate]\n );\n\n if (docstatus !== 1 || !doctype || !id) {\n return null;\n }\n\n return (\n <MStack>\n <Button variant=\"ghost\" onPress={() => setIsOpen(true)}>\n {t(\"Correct\")}\n </Button>\n\n <CorrectionWizard\n doctype={doctype}\n id={id}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onSuccess={handleSuccess}\n supportsInPlaceEdit={supportsInPlaceEdit}\n />\n </MStack>\n );\n}\n\nexport default CorrectButton;\n","import { Card, Heading, MStack, MText } from \"@framework-m/ui\";\nimport { useCreate, useUpdate } from \"@refinedev/core\";\nimport { useState } from \"react\";\nimport { useDocTypeMeta } from \"../../hooks/useDocTypeMeta\";\nimport { type SiblingDocTypeInfo, useSiblingDocTypes } from \"../../hooks/useSiblingDocTypes\";\nimport { AutoForm } from \"../form\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface SiblingPanelProps {\n doctype: string;\n id?: string;\n parentDocstatus?: number;\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n return {};\n}\n\ninterface SiblingEditorProps {\n sibling: SiblingDocTypeInfo;\n parentId?: string;\n onSaved: () => void;\n}\n\nfunction SiblingEditor({ sibling, parentId, onSaved }: Readonly<SiblingEditorProps>) {\n const { t } = useTranslation(\"desk\");\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n const { schema } = useDocTypeMeta(sibling.doctype);\n const [formData, setFormData] = useState<Record<string, unknown>>(() =>\n toRecord(sibling.initial_data)\n );\n\n const handleSubmit = (submittedData: unknown) => {\n const values = toRecord(submittedData);\n const siblingIdValue = values.id;\n const siblingId =\n typeof siblingIdValue === \"string\" || typeof siblingIdValue === \"number\"\n ? String(siblingIdValue)\n : undefined;\n\n if (siblingId) {\n updateMutation.mutate(\n {\n resource: sibling.doctype,\n id: siblingId,\n values,\n },\n {\n onSuccess: onSaved,\n }\n );\n return;\n }\n\n createMutation.mutate(\n {\n resource: sibling.doctype,\n values: parentId ? { ...values, parent_id: parentId } : values,\n },\n {\n onSuccess: onSaved,\n }\n );\n };\n\n return (\n <Card padding=\"$md\" borderWidth={1} borderColor=\"$borderColor\">\n <Heading size=\"$xs\" marginBottom=\"$sm\">\n {sibling.label}\n </Heading>\n {schema ? (\n <AutoForm\n schema={schema as unknown as Record<string, unknown>}\n formData={formData}\n onChange={(next) => setFormData(toRecord(next))}\n onSubmit={handleSubmit}\n readonly={false}\n submitText=\"Save Sibling\"\n />\n ) : (\n <MText color=\"$colorMuted\">{t(\"Loading sibling form...\")}</MText>\n )}\n </Card>\n );\n}\n\nexport function SiblingPanel({ doctype, id }: Readonly<SiblingPanelProps>) {\n const { t } = useTranslation(\"desk\");\n const { siblings, isLoading, error, refetch } = useSiblingDocTypes(doctype);\n\n if (isLoading) {\n return (\n <MStack marginTop=\"$md\">\n <MText color=\"$colorMuted\">{t(\"Loading sibling metadata...\")}</MText>\n </MStack>\n );\n }\n\n if (error) {\n return (\n <MStack marginTop=\"$md\">\n <MText role=\"alert\" color=\"$error\">\n {error}\n </MText>\n </MStack>\n );\n }\n\n if (siblings.length === 0) {\n return null;\n }\n\n const overlaySiblings = siblings.filter((s) => Boolean(s.is_metadata_overlay));\n const footerSiblings = siblings.filter((s) => !s.is_metadata_overlay);\n\n return (\n <MStack marginTop=\"$lg\" gap=\"$md\">\n <Heading size=\"$sm\">{t(\"Sibling Data\")}</Heading>\n\n {overlaySiblings.length > 0 && (\n <MStack gap=\"$sm\" data-testid=\"sibling-overlay-pane\">\n <MText color=\"$colorMuted\">{t(\"Right-side metadata overlay\")}</MText>\n {overlaySiblings.map((sibling) => (\n <SiblingEditor\n key={`overlay-${sibling.doctype}`}\n sibling={sibling}\n parentId={id}\n onSaved={refetch}\n />\n ))}\n </MStack>\n )}\n\n {footerSiblings.length > 0 && (\n <MStack gap=\"$sm\" data-testid=\"sibling-footer-tabs\">\n <MText color=\"$colorMuted\">{t(\"Sibling tabs\")}</MText>\n {footerSiblings.map((sibling) => (\n <SiblingEditor\n key={`footer-${sibling.doctype}`}\n sibling={sibling}\n parentId={id}\n onSaved={refetch}\n />\n ))}\n </MStack>\n )}\n </MStack>\n );\n}\n\nexport default SiblingPanel;\n","/**\n * Command Palette Component\n *\n * Global search and command palette with Ctrl+K.\n * Per checklist 6.5: Global Command Palette.\n *\n * Features:\n * - Search DocTypes (navigation)\n * - Search Documents (by title)\n * - Run Commands (e.g., \"New User\")\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { useGo, useList } from \"@refinedev/core\";\nimport { getResources } from \"../plugins\";\nimport { META_URL } from \"../constants\";\nimport { useMFetch } from \"../hooks/useMFetch\";\nimport { YStack, XStack, Input, MText } from \"@framework-m/ui\";\nimport { useTranslation } from \"../hooks\";\n\n/**\n * Command types\n */\nexport type CommandType = \"doctype\" | \"document\" | \"command\";\n\n/**\n * Command item\n */\nexport interface CommandItem {\n /** Unique ID */\n id: string;\n /** Type of command */\n type: CommandType;\n /** Display label */\n label: string;\n /** Secondary text */\n description?: string;\n /** Icon (emoji) */\n icon?: string;\n /** DocType for document items */\n doctype?: string;\n /** Action to execute */\n action?: () => void;\n}\n\n/**\n * CommandPalette props\n */\nexport interface CommandPaletteProps {\n /** Whether palette is open */\n open: boolean;\n /** Close callback */\n onClose: () => void;\n}\n\n/**\n * Built-in commands\n */\nconst BUILTIN_COMMANDS: CommandItem[] = [\n {\n id: \"cmd-dashboard\",\n type: \"command\",\n label: \"Go to Dashboard\",\n icon: \"🏠\",\n description: \"Open the main dashboard\",\n },\n {\n id: \"cmd-settings\",\n type: \"command\",\n label: \"Settings\",\n icon: \"⚙️\",\n description: \"Open settings\",\n },\n {\n id: \"cmd-logout\",\n type: \"command\",\n label: \"Logout\",\n icon: \"🚪\",\n description: \"Sign out of your account\",\n },\n];\n\n/**\n * CommandPalette Component\n */\nexport function CommandPalette({ open, onClose }: CommandPaletteProps) {\n const { t } = useTranslation(\"desk\");\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [doctypes, setDoctypes] = useState<CommandItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const go = useGo();\n const mfetch = useMFetch();\n\n // Fetch DocTypes for navigation\n useEffect(() => {\n async function fetchDoctypes() {\n try {\n const response = await mfetch(`${META_URL}/doctypes`, {\n credentials: \"include\",\n });\n if (response.ok) {\n const data = await response.json();\n const items: CommandItem[] = (data.doctypes ?? [])\n .filter(\n (dt: { api_resource: boolean; show_in_desk: boolean }) =>\n dt.api_resource && dt.show_in_desk\n )\n .map((dt: { name: string; label?: string }) => ({\n id: `doctype-${dt.name}`,\n type: \"doctype\" as CommandType,\n label: dt.label ?? dt.name,\n description: `Go to ${dt.name}`,\n icon: \"📋\",\n doctype: dt.name,\n }));\n setDoctypes(items);\n }\n } catch {\n // Fallback to registered resources\n const resources = getResources();\n const items: CommandItem[] = resources.map((r) => ({\n id: `doctype-${r.name}`,\n type: \"doctype\" as CommandType,\n label: r.label ?? r.name,\n description: `Go to ${r.name}`,\n icon: \"📋\",\n doctype: r.name,\n }));\n setDoctypes(items);\n }\n }\n\n if (open) {\n fetchDoctypes();\n }\n }, [open]);\n\n // Search documents\n const { result: searchResults } = useList({\n resource: \"search\",\n filters: query.length >= 2 ? [{ field: \"q\", operator: \"contains\", value: query }] : [],\n pagination: { pageSize: 5 },\n queryOptions: { enabled: open && query.length >= 2 },\n });\n\n // Convert search results to command items\n const documentItems: CommandItem[] = useMemo(() => {\n if (!searchResults?.data) return [];\n return searchResults.data.map((doc) => {\n const d = doc as unknown as {\n id?: string;\n name?: string;\n title?: string;\n doctype?: string;\n };\n return {\n id: `doc-${d.id ?? \"unknown\"}`,\n type: \"document\" as CommandType,\n label: d.title ?? d.name ?? String(d.id ?? \"Unknown\"),\n description: d.doctype,\n icon: \"📄\",\n doctype: d.doctype,\n };\n });\n }, [searchResults]);\n\n // \"New X\" commands from DocTypes\n const newCommands: CommandItem[] = useMemo(() => {\n if (query.toLowerCase().startsWith(\"new \")) {\n const searchTerm = query.slice(4).toLowerCase();\n return doctypes\n .filter((dt) => dt.label.toLowerCase().includes(searchTerm))\n .slice(0, 5)\n .map((dt) => ({\n id: `new-${dt.doctype}`,\n type: \"command\" as CommandType,\n label: `New ${dt.label}`,\n description: `Create a new ${dt.label}`,\n icon: \"➕\",\n doctype: dt.doctype,\n }));\n }\n return [];\n }, [doctypes, query]);\n\n // Filter all items by query\n const filteredItems = useMemo(() => {\n const lowerQuery = query.toLowerCase();\n\n const filtered = [\n ...newCommands,\n ...doctypes.filter(\n (dt) =>\n dt.label.toLowerCase().includes(lowerQuery) ||\n dt.doctype?.toLowerCase().includes(lowerQuery)\n ),\n ...documentItems,\n ...BUILTIN_COMMANDS.filter((cmd) => cmd.label.toLowerCase().includes(lowerQuery)),\n ];\n\n return filtered.slice(0, 10);\n }, [doctypes, documentItems, newCommands, query]);\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0);\n }, [filteredItems.length]);\n\n // Focus input when opened\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n setQuery(\"\");\n setSelectedIndex(0);\n }\n }, [open]);\n\n // Execute selected command\n const executeCommand = useCallback(\n (item: CommandItem) => {\n onClose();\n\n if (item.type === \"doctype\" && item.doctype) {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"document\" && item.doctype) {\n go({\n to: `/app/${item.doctype}/detail/${item.id.replace(\"doc-\", \"\")}`,\n });\n } else if (item.type === \"command\") {\n if (item.id === \"cmd-dashboard\") {\n go({ to: \"/app/dashboard\" });\n } else if (item.id === \"cmd-settings\") {\n go({ to: \"/app/settings\" });\n } else if (item.id === \"cmd-logout\") {\n go({ to: \"/logout\" });\n } else if (item.id.startsWith(\"new-\") && item.doctype) {\n go({ to: `/app/${item.doctype}/new` });\n } else if (item.action) {\n item.action();\n }\n }\n },\n [go, onClose]\n );\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, filteredItems.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\" && filteredItems[selectedIndex]) {\n e.preventDefault();\n executeCommand(filteredItems[selectedIndex]);\n } else if (e.key === \"Escape\") {\n onClose();\n }\n },\n [filteredItems, selectedIndex, executeCommand, onClose]\n );\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <YStack\n position=\"fixed\"\n inset={0}\n backgroundColor=\"rgba(0,0,0,0.7)\"\n zIndex={1000}\n onPress={onClose}\n />\n\n {/* Palette */}\n <YStack\n position=\"fixed\"\n top=\"15%\"\n left=\"50%\"\n x=\"-50%\"\n width=\"100%\"\n maxWidth={500}\n backgroundColor=\"$background\"\n borderRadius=\"$lg\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n zIndex={1001}\n overflow=\"hidden\"\n elevation=\"$4\"\n >\n {/* Search Input */}\n <YStack padding=\"$sm\" borderBottomWidth={1} borderBottomColor=\"$borderColor\">\n <Input\n ref={inputRef as any}\n placeholder=\"Search or type a command...\"\n value={query}\n onChangeText={setQuery}\n onKeyDown={handleKeyDown as any}\n borderWidth={0}\n backgroundColor=\"transparent\"\n focusStyle={{ outlineWidth: 0, borderColor: \"transparent\" }}\n width=\"100%\"\n fontSize=\"$md\"\n />\n </YStack>\n\n {/* Results */}\n <YStack maxHeight={300} overflow=\"scroll\">\n {filteredItems.length === 0 && query && (\n <YStack padding=\"$md\" alignItems=\"center\">\n <MText color=\"$colorMuted\">{t(\"No results found\")}</MText>\n </YStack>\n )}\n\n {filteredItems.map((item, idx) => (\n <XStack\n key={item.id}\n onPress={() => executeCommand(item)}\n onMouseEnter={() => setSelectedIndex(idx)}\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n cursor=\"pointer\"\n alignItems=\"center\"\n gap=\"$sm\"\n backgroundColor={selectedIndex === idx ? \"$backgroundSecondary\" : \"$background\"}\n >\n <MText fontSize=\"$xl\">{item.icon}</MText>\n <YStack flex={1}>\n <MText fontWeight=\"500\" color=\"$color\">\n {item.label}\n </MText>\n {item.description && (\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {item.description}\n </MText>\n )}\n </YStack>\n <YStack\n backgroundColor=\"rgba(0,0,0,0.05)\"\n paddingHorizontal=\"$xs\"\n paddingVertical={2}\n borderRadius=\"$sm\"\n >\n <MText fontSize={10} color=\"$colorMuted\">\n {item.type}\n </MText>\n </YStack>\n </XStack>\n ))}\n </YStack>\n\n {/* Footer */}\n <XStack\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n borderTopWidth={1}\n borderTopColor=\"$borderColor\"\n gap=\"$md\"\n >\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"\\u2191\\u2193 Navigate\")}\n </MText>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"\\u21b5 Select\")}\n </MText>\n <MText fontSize=\"$xs\" color=\"$colorMuted\">\n {t(\"Esc Close\")}\n </MText>\n </XStack>\n </YStack>\n </>\n );\n}\n\nexport default CommandPalette;\n","import { useLogout, useMenu } from \"@refinedev/core\";\nimport { NavLink } from \"react-router\";\nimport { YStack, Button, MText } from \"@framework-m/ui\";\nimport { useTranslation } from \"../../hooks\";\n\nexport const Menu = () => {\n const { t } = useTranslation(\"desk\");\n const { mutate: logout } = useLogout();\n const { menuItems } = useMenu();\n\n return (\n <YStack tag=\"nav\" className=\"menu\" gap=\"$md\">\n <YStack tag=\"ul\" padding={0} margin={0} gap=\"$xs\" style={{ listStyle: \"none\" }}>\n {menuItems.map((item) => (\n <YStack tag=\"li\" key={item.key}>\n <NavLink to={item.route ?? \"/\"} style={{ textDecoration: \"none\", display: \"block\" }}>\n <YStack\n paddingVertical=\"$sm\"\n paddingHorizontal=\"$md\"\n borderRadius=\"$sm\"\n hoverStyle={{ backgroundColor: \"$backgroundHover\" } as any}\n >\n <MText color=\"$color\">{item.label}</MText>\n </YStack>\n </NavLink>\n </YStack>\n ))}\n </YStack>\n\n <Button variant=\"ghost\" onPress={() => logout()}>\n {t(\"Logout\")}\n </Button>\n </YStack>\n );\n};\n","import { useBreadcrumb } from \"@refinedev/core\";\nimport { Link } from \"react-router\";\nimport { XStack, MText } from \"@framework-m/ui\";\n\nexport const Breadcrumb = () => {\n const { breadcrumbs } = useBreadcrumb();\n\n if (!breadcrumbs || breadcrumbs.length === 0) return null;\n\n return (\n <XStack alignItems=\"center\" flexWrap=\"wrap\" gap=\"$sm\">\n {breadcrumbs.map((breadcrumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n return (\n <XStack key={`breadcrumb-${breadcrumb.label}`} alignItems=\"center\" gap=\"$sm\">\n {breadcrumb.href ? (\n <Link to={breadcrumb.href} style={{ textDecoration: \"none\" }}>\n <MText color=\"$primary\" hoverStyle={{ textDecorationLine: \"underline\" } as any}>\n {breadcrumb.label}\n </MText>\n </Link>\n ) : (\n <MText color=\"$colorMuted\">{breadcrumb.label}</MText>\n )}\n {!isLast && (\n <MText color=\"$colorMuted\" opacity={0.5}>\n /\n </MText>\n )}\n </XStack>\n );\n })}\n </XStack>\n );\n};\n","/**\n * TabContainer — Tabbed Layout Engine for Framework M Form View.\n *\n * Renders a set of named tabs driven by `UIMeta.form.tabs`.\n * Persists the active tab per-DocType in localStorage so users\n * return to the same tab after navigation.\n *\n * Keyboard shortcut: `Alt + [1–9]` to switch tabs (web only).\n * Auto-focuses the first focusable element in the newly selected tab.\n */\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Button, MStack, MText, XStack } from \"@framework-m/ui\";\nimport type { FormTab } from \"../../hooks/useUIMeta\";\n\nexport interface TabContainerProps {\n /** Tab definitions from UIMeta.form.tabs */\n tabs: FormTab[];\n /** DocType name — used to key the localStorage persistence entry */\n doctype: string;\n /** Render prop receiving the active tab and its index */\n children: (tab: FormTab, index: number) => ReactNode;\n /** Initial tab index override (ignored if localStorage has a value) */\n defaultTabIndex?: number;\n /** Called after the active tab changes */\n onTabChange?: (index: number) => void;\n}\n\nconst STORAGE_KEY_PREFIX = \"m_tab_\";\n\nfunction readStoredTab(doctype: string): number | null {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY_PREFIX}${doctype}_active`);\n if (raw !== null) {\n const parsed = parseInt(raw, 10);\n return isNaN(parsed) ? null : parsed;\n }\n } catch {\n // localStorage may be unavailable (SSR, private mode)\n }\n return null;\n}\n\nfunction storeTab(doctype: string, index: number): void {\n try {\n localStorage.setItem(`${STORAGE_KEY_PREFIX}${doctype}_active`, String(index));\n } catch {\n // Silently ignore write failures\n }\n}\n\n/** Focus the first focusable element inside a container ref. */\nfunction focusFirst(container: HTMLElement | null): void {\n if (!container) return;\n const focusable = container.querySelector<HTMLElement>(\n 'input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n focusable?.focus({ preventScroll: false });\n}\n\nexport function TabContainer({\n tabs,\n doctype,\n children,\n defaultTabIndex = 0,\n onTabChange,\n}: Readonly<TabContainerProps>) {\n const [activeIndex, setActiveIndex] = useState<number>(() => {\n const stored = readStoredTab(doctype);\n if (stored !== null && stored < tabs.length) return stored;\n return Math.min(defaultTabIndex, tabs.length - 1);\n });\n\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Clamp active index when tabs change (e.g. permission filters)\n useEffect(() => {\n if (activeIndex >= tabs.length) {\n setActiveIndex(0);\n }\n }, [tabs.length, activeIndex]);\n\n function switchTab(index: number) {\n const clamped = Math.max(0, Math.min(index, tabs.length - 1));\n setActiveIndex(clamped);\n storeTab(doctype, clamped);\n onTabChange?.(clamped);\n // Auto-focus first field after React renders the new tab content\n requestAnimationFrame(() => {\n focusFirst(contentRef.current);\n });\n }\n\n // Alt+[1-9] keyboard shortcut — web only\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (!e.altKey) return;\n const digit = parseInt(e.key, 10);\n if (isNaN(digit) || digit < 1 || digit > 9) return;\n const targetIndex = digit - 1;\n if (targetIndex < tabs.length) {\n e.preventDefault();\n switchTab(targetIndex);\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [tabs.length]);\n\n if (tabs.length === 0) return null;\n\n return (\n <MStack gap=\"$0\">\n {/* Tab Bar */}\n <XStack\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n gap=\"$0\"\n flexWrap=\"wrap\"\n role=\"tablist\"\n aria-label=\"Document sections\"\n >\n {tabs.map((tab, idx) => {\n const isActive = idx === activeIndex;\n return (\n <Button\n key={tab.label}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tab-panel-${idx}`}\n id={`tab-${idx}`}\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => switchTab(idx)}\n borderRadius=\"$0\"\n borderBottomWidth={isActive ? 2 : 0}\n borderBottomColor={isActive ? \"$primary\" : \"transparent\"}\n paddingHorizontal=\"$md\"\n paddingVertical=\"$sm\"\n title={`${tab.label} (Alt+${idx + 1})`}\n >\n <MText\n fontSize=\"$sm\"\n fontWeight={isActive ? \"700\" : \"400\"}\n color={isActive ? \"$primary\" : \"$colorMuted\"}\n >\n {tab.label}\n </MText>\n </Button>\n );\n })}\n </XStack>\n\n {/* Tab Panel */}\n <MStack\n // @ts-expect-error — ref bridging\n ref={contentRef}\n role=\"tabpanel\"\n id={`tab-panel-${activeIndex}`}\n aria-labelledby={`tab-${activeIndex}`}\n paddingTop=\"$md\"\n gap=\"$md\"\n >\n {children(tabs[activeIndex], activeIndex)}\n </MStack>\n </MStack>\n );\n}\n\nexport default TabContainer;\n","/**\n * SectionField — A titled, optionally collapsible form section.\n *\n * Driven by `UIMeta.form.sections[*]` or `LayoutConfig.sections[*]`.\n * Supports 1, 2, or 3 auto-equal columns via the `columns` prop.\n * For explicit per-column field lists use the `columnFields` prop\n * (delegated to ColumnGrid).\n */\n\nimport { Children, useState, type ReactNode } from \"react\";\nimport { Card, Heading, MStack, MText, XStack } from \"@framework-m/ui\";\n\nexport interface SectionFieldProps {\n /** Section title */\n label?: string;\n /** Allow the user to collapse this section */\n collapsible?: boolean;\n /** Whether the section is collapsed initially */\n defaultCollapsed?: boolean;\n /** Number of auto-equal columns (1–3). Ignored if children is a single element */\n columns?: 1 | 2 | 3;\n children: ReactNode;\n}\n\nexport function SectionField({\n label,\n collapsible = false,\n defaultCollapsed = false,\n columns = 1,\n children,\n}: Readonly<SectionFieldProps>) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const childItems = Children.toArray(children);\n const fieldContent =\n columns > 1 && childItems.length > 1 ? (\n <XStack flexWrap=\"wrap\" gap=\"$sm\">\n {childItems.map((child, index) => (\n <MStack key={index} flexBasis={`${100 / columns}%`} flexGrow={1}>\n {child}\n </MStack>\n ))}\n </XStack>\n ) : (\n children\n );\n\n return (\n <Card outlined elevated={false} padding=\"$0\" overflow=\"visible\" borderRadius=\"$sm\">\n {/* Section Header */}\n {label && (\n <XStack\n paddingHorizontal=\"$sm\"\n paddingVertical=\"$2\"\n borderBottomWidth={isCollapsed ? 0 : 1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n alignItems=\"center\"\n gap=\"$sm\"\n onPress={collapsible ? () => setIsCollapsed((c) => !c) : undefined}\n cursor={collapsible ? \"pointer\" : \"default\"}\n role={collapsible ? \"button\" : undefined}\n aria-expanded={collapsible ? !isCollapsed : undefined}\n aria-label={collapsible ? `Toggle ${label} section` : undefined}\n >\n {collapsible && (\n <MText\n fontSize=\"$xs\"\n color=\"$colorMuted\"\n // Rotate the caret\n style={\n {\n display: \"inline-block\",\n transform: isCollapsed ? \"rotate(-90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n } as React.CSSProperties\n }\n >\n ▼\n </MText>\n )}\n <Heading size=\"$xs\" color=\"$colorMuted\" fontWeight=\"600\">\n {label}\n </Heading>\n </XStack>\n )}\n\n {/* Section Body */}\n {!isCollapsed && (\n <MStack padding=\"$sm\" position=\"relative\" zIndex={1}>\n {fieldContent}\n </MStack>\n )}\n </Card>\n );\n}\n\nexport default SectionField;\n","/**\n * ColumnGrid — Lays out children in named-fraction columns.\n *\n * Supports the same cross-platform safe named fractions agreed in\n * the implementation plan: \"1/3\", \"2/3\", \"1/2\", \"auto\".\n *\n * When no explicit column definitions are provided it falls back to\n * equal-width columns determined by `equalColumns`.\n *\n * React Native compatible: uses Tamagui XStack + flex/width instead\n * of CSS grid.\n */\n\nimport type { ReactNode } from \"react\";\nimport { MStack, XStack } from \"@framework-m/ui\";\n\n/** Named-fraction width tokens */\nexport type ColumnWidth = \"1/3\" | \"2/3\" | \"1/2\" | \"auto\";\n\n/** Explicit column definition used by ColumnGrid */\nexport interface ColumnDef {\n width?: ColumnWidth;\n children: ReactNode;\n}\n\nexport interface ColumnGridProps {\n /** Explicit column definitions (used when backend specifies per-column field lists). */\n columns?: ColumnDef[];\n /**\n * Number of equal-width columns when no explicit `columns` prop is provided.\n * Ignored when `columns` is set.\n */\n equalColumns?: 1 | 2 | 3;\n /** Children used only when `columns` is NOT provided (treated as equal-width slots). */\n children?: ReactNode;\n}\n\nconst fractionToFlex: Record<ColumnWidth, number> = {\n \"1/3\": 1,\n \"2/3\": 2,\n \"1/2\": 1, // paired fractions — flex=1 each gives equal halves\n auto: 1,\n};\n\n/**\n * Map named fraction to an approximate CSS percentage for\n * `minWidth` so columns wrap gracefully on small screens.\n */\nconst fractionToMinWidth: Record<ColumnWidth, string> = {\n \"1/3\": \"28%\",\n \"2/3\": \"60%\",\n \"1/2\": \"45%\",\n auto: \"0\",\n};\n\nfunction ColWrapper({ width, children }: { width?: ColumnWidth; children: ReactNode }) {\n const flexValue = width ? fractionToFlex[width] : 1;\n const minW = width ? fractionToMinWidth[width] : \"0\";\n\n return (\n <MStack flex={flexValue} minWidth={minW as any} gap=\"$sm\">\n {children}\n </MStack>\n );\n}\n\nexport function ColumnGrid({ columns, equalColumns = 1, children }: Readonly<ColumnGridProps>) {\n // Explicit column definitions take priority\n if (columns && columns.length > 0) {\n return (\n <XStack gap=\"$md\" flexWrap=\"wrap\" flex={1}>\n {columns.map((col, i) => (\n // Key by index — order is stable (driven by UIMeta order)\n <ColWrapper key={i} width={col.width}>\n {col.children}\n </ColWrapper>\n ))}\n </XStack>\n );\n }\n\n // Equal columns via children\n if (equalColumns === 1 || !children) {\n return <MStack gap=\"$sm\">{children}</MStack>;\n }\n\n return (\n <XStack gap=\"$md\" flexWrap=\"wrap\" flex={1}>\n {[...Array(equalColumns)].map((_, i) => (\n <MStack key={i} flex={1} gap=\"$sm\">\n {/* Children are distributed externally; ColumnGrid provides the flex shell */}\n </MStack>\n ))}\n {/* When used without explicit columns, just wrap children in a row */}\n {children}\n </XStack>\n );\n}\n\nexport default ColumnGrid;\n","import type { ReactNode } from \"react\";\nimport { XStack, YStack, Heading, MText } from \"@framework-m/ui\";\n\nexport interface PageHeaderProps {\n title: string;\n breadcrumb?: {\n app: string;\n view?: string;\n };\n extra?: ReactNode;\n children?: ReactNode;\n isMobile?: boolean;\n}\n\n/**\n * PageHeader\n *\n * Standard header for all Framework M pages (List, Form, Dashboards).\n * Replaces the old global Top Navbar.\n */\nexport function PageHeader({ title, breadcrumb, extra, children, isMobile }: PageHeaderProps) {\n return (\n <YStack marginBottom=\"$lg\" gap=\"$sm\">\n {breadcrumb && (\n <XStack alignItems=\"center\" gap=\"$xs\">\n <MText color=\"$colorMuted\" size=\"$sm\">\n {breadcrumb.app}\n </MText>\n {breadcrumb.view && (\n <>\n <MText color=\"$colorMuted\" size=\"$sm\">\n /\n </MText>\n <MText color=\"$text\" size=\"$sm\">\n {breadcrumb.view}\n </MText>\n </>\n )}\n </XStack>\n )}\n\n <XStack\n justifyContent=\"space-between\"\n alignItems=\"center\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n gap=\"$md\"\n >\n <Heading size=\"$sm\" margin={0}>\n {title}\n </Heading>\n\n <XStack gap=\"$sm\" alignItems=\"center\">\n {extra}\n </XStack>\n </XStack>\n\n {children}\n </YStack>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { XStack, YStack } from \"@framework-m/ui\";\n\nexport interface LayoutProps {\n /** Sidebar component or slot */\n sidebar: ReactNode;\n /** Navbar component or slot */\n navbar: ReactNode;\n /** Primary content */\n children: ReactNode;\n /** Mobile layout toggle */\n isMobile?: boolean;\n}\n\n/**\n * Standard Framework M Desk Layout\n *\n * Provides a responsive structure for the sidebar, navbar, and main content area.\n */\nexport const Layout: React.FC<LayoutProps> = ({ sidebar, navbar, children, isMobile = false }) => {\n return (\n <XStack\n className=\"shell-layout\"\n flexDirection={isMobile ? \"column-reverse\" : \"row\"}\n height=\"100vh\"\n width=\"100%\"\n maxWidth=\"100vw\"\n overflow=\"hidden\"\n >\n {sidebar}\n <YStack className=\"shell-main\" flex={1} minWidth={0} overflow=\"hidden\">\n {navbar}\n <YStack\n tag=\"main\"\n className=\"shell-content\"\n flex={1}\n overflow=\"scroll\"\n padding={24}\n maxWidth=\"100%\"\n >\n {children}\n </YStack>\n </YStack>\n </XStack>\n );\n};\n\n// Layout container components for form views\nexport { TabContainer } from \"./TabContainer\";\nexport type { TabContainerProps } from \"./TabContainer\";\nexport { SectionField } from \"./SectionField\";\nexport type { SectionFieldProps } from \"./SectionField\";\nexport { ColumnGrid } from \"./ColumnGrid\";\nexport type { ColumnGridProps, ColumnDef, ColumnWidth } from \"./ColumnGrid\";\nexport { PageHeader } from \"./PageHeader\";\nexport type { PageHeaderProps } from \"./PageHeader\";\nexport { ShellSkeleton } from \"./ShellSkeleton\";\nexport type { ShellSkeletonProps } from \"./ShellSkeleton\";\n","import { useState } from \"react\";\nimport { useGo } from \"@refinedev/core\";\nimport { MStack, XStack, YStack, MText, Button } from \"@framework-m/ui\";\nimport type { DeskWorkspace, WorkspaceItem } from \"./types\";\n\nexport interface WorkspaceSectionProps {\n workspace: DeskWorkspace;\n collapsed?: boolean;\n}\n\nexport function WorkspaceSection({ workspace, collapsed = false }: WorkspaceSectionProps) {\n const [isExpanded, setIsExpanded] = useState(true);\n const go = useGo();\n\n const handleItemClick = (item: WorkspaceItem) => {\n if (item.type === \"shortcut\") {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"link\") {\n if (item.newTab) {\n window.open(item.url, \"_blank\");\n } else if (item.url.startsWith(\"/\")) {\n go({ to: item.url });\n } else {\n window.location.href = item.url;\n }\n }\n };\n\n return (\n <MStack marginBottom=\"$xs\">\n {/* Workspace Header */}\n <Button\n variant=\"ghost\"\n onPress={() => setIsExpanded(!isExpanded)}\n padding={collapsed ? \"$xs\" : \"$xs $sm\"}\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n gap=\"$xs\"\n width=\"100%\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n >\n <MText color=\"rgba(255,255,255,0.7)\" fontSize=\"$sm\">\n {workspace.icon}\n </MText>\n {!collapsed && (\n <XStack\n flex={1}\n alignItems=\"center\"\n gap=\"$xs\"\n justifyContent=\"space-between\"\n width=\"100%\"\n >\n <MText color=\"rgba(255,255,255,0.7)\" fontSize=\"$sm\" flex={1} textAlign=\"start\">\n {workspace.label}\n </MText>\n <MText color=\"rgba(255,255,255,0.7)\" fontSize=\"$xs\">\n {isExpanded ? \"▼\" : \"▶\"}\n </MText>\n </XStack>\n )}\n </Button>\n\n {/* Workspace Items */}\n {isExpanded && !collapsed && (\n <YStack paddingLeft=\"$md\">\n {workspace.items\n .filter((item) => item.type !== \"chart\")\n .map((item, idx) => (\n <Button\n key={`${item.type}-${idx}`}\n variant=\"ghost\"\n onPress={() => handleItemClick(item)}\n padding=\"$xs $sm\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n gap=\"$xs\"\n width=\"100%\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n >\n {\"icon\" in item && item.icon && (\n <MText color=\"rgba(255,255,255,0.6)\" fontSize=\"$xs\">\n {item.icon}\n </MText>\n )}\n <MText color=\"rgba(255,255,255,0.6)\" fontSize=\"$xs\" textAlign=\"start\">\n {item.label}\n </MText>\n {item.type === \"link\" && item.newTab && (\n <MText color=\"rgba(255,255,255,0.6)\" fontSize=\"$xs\" opacity={0.5}>\n {\"↗\"}\n </MText>\n )}\n </Button>\n ))}\n </YStack>\n )}\n </MStack>\n );\n}\n\nexport default WorkspaceSection;\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport {\n useDocTypeMeta,\n useUIMeta,\n useListFilters,\n useListActions,\n useRouteTraversal,\n} from \"../hooks\";\nimport type { FilterFieldDefinition, FilterValueKind } from \"../hooks/useListFilters\";\nimport { usePluginApps } from \"@framework-m/plugin-sdk\";\nimport { useGetIdentity, useDeleteMany, useInvalidate } from \"@refinedev/core\";\nimport { ListBodyLayout } from \"../components/list/ListBodyLayout\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type { GanttConfig } from \"../views/types\";\n\nexport interface ListViewProps {\n doctype?: string;\n view?: \"list\" | \"kanban\" | \"tree\" | \"gantt\";\n}\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n [key: string]: unknown;\n}\n\nconst LIST_SYSTEM_FIELDS = new Set([\n \"id\",\n \"creation\",\n \"modified\",\n \"modified_by\",\n \"owner\",\n \"deleted_at\",\n \"docstatus\",\n \"idx\",\n \"parent\",\n \"parentfield\",\n \"parenttype\",\n \"is_favorite\",\n \"lft\",\n \"rgt\",\n \"old_parent\",\n]);\n\nfunction toSchemaFields(schema: unknown): Record<string, SchemaField> {\n if (!schema || typeof schema !== \"object\") return {};\n const properties = (schema as { properties?: unknown }).properties;\n if (!properties || typeof properties !== \"object\") return {};\n return properties as Record<string, SchemaField>;\n}\n\nfunction getStringEnums(field: SchemaField | undefined): string[] {\n if (!field?.enum || !Array.isArray(field.enum)) return [];\n return field.enum.filter((v): v is string => typeof v === \"string\");\n}\n\nfunction isSelectOrLinkField(field: SchemaField | undefined): boolean {\n if (!field) return false;\n if (Array.isArray(field.enum) && field.enum.length > 0) return true;\n const format = String(field.format ?? \"\").toLowerCase();\n if (format.includes(\"link\") || format.includes(\"reference\")) return true;\n const fieldType =\n typeof field[\"x-fieldtype\"] === \"string\" ? field[\"x-fieldtype\"].toLowerCase() : \"\";\n return fieldType === \"link\" || fieldType === \"select\";\n}\n\nfunction getFilterValueKind(field: SchemaField | undefined): FilterValueKind {\n if (!field) return \"text\";\n if (Array.isArray(field.enum) && field.enum.length > 0) return \"select\";\n\n const typeValue = Array.isArray(field.type) ? field.type[0] : field.type;\n if (typeValue === \"number\" || typeValue === \"integer\") return \"number\";\n if (typeValue === \"boolean\") return \"boolean\";\n\n const format = String(field.format ?? \"\").toLowerCase();\n if (format === \"date\") return \"date\";\n if (format === \"date-time\") return \"datetime\";\n\n return \"text\";\n}\n\nfunction pickFirst(...values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return undefined;\n}\n\nfunction toDisplayLabel(fieldName: string): string {\n return fieldName\n .replaceAll(\"_\", \" \")\n .split(\" \")\n .map((s) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : \"\"))\n .join(\" \");\n}\n\nfunction isHiddenField(fieldMeta: SchemaField): boolean {\n if (!fieldMeta) return false;\n if (fieldMeta[\"x-hidden\"] === true) return true;\n if (fieldMeta.type === \"object\" || fieldMeta.type === \"array\") return true;\n return false;\n}\n\nfunction formatCellValue(field: SchemaField | undefined, value: unknown): string {\n if (value === null || value === undefined || value === \"\") return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n const format = String(field?.format ?? \"\").toLowerCase();\n if (format === \"date\" || format === \"date-time\") {\n const date = new Date(String(value));\n return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n }\n return String(value);\n}\n\nexport function ListView({ doctype: propDoctype, view: propView }: Readonly<ListViewProps>) {\n const params = useParams();\n const navigate = useNavigate();\n\n const doctype = propDoctype ?? params.doctype ?? \"Task\";\n const { data: identity } = useGetIdentity();\n const isAuthenticated = Boolean(identity);\n const apps = usePluginApps();\n\n const { schema, permissions, isLoading: metaLoading, error: metaError } = useDocTypeMeta(doctype);\n const { uiMeta } = useUIMeta(doctype);\n\n const [uiError, setUiError] = useState<string | null>(null);\n const [timeTravelError, setTimeTravelError] = useState<string | null>(null);\n\n const [selectedRows, setSelectedRows] = useState<Record<string, unknown>[]>([]);\n const schemaFields = useMemo(() => toSchemaFields(schema), [schema]);\n\n const filterableFields = useMemo<FilterFieldDefinition[]>(() => {\n const fields = Object.entries(schemaFields)\n .filter(\n ([fieldName, fieldMeta]) => !LIST_SYSTEM_FIELDS.has(fieldName) && !isHiddenField(fieldMeta)\n )\n .map(([fieldName, fieldMeta]) => ({\n label:\n typeof fieldMeta.title === \"string\" && fieldMeta.title.trim()\n ? fieldMeta.title\n : toDisplayLabel(fieldName),\n value: fieldName,\n type: getFilterValueKind(fieldMeta),\n options: getStringEnums(fieldMeta).map((value) => ({ label: value, value })),\n }));\n return fields.length > 0 ? fields : [{ label: \"Name\", value: \"name\", type: \"text\" }];\n }, [schemaFields]);\n\n const filterFieldMap = useMemo(\n () =>\n filterableFields.reduce<Record<string, FilterFieldDefinition>>((acc, field) => {\n acc[field.value] = field;\n return acc;\n }, {}),\n [filterableFields]\n );\n\n const {\n searchQuery,\n setSearchQuery,\n appliedSearchQuery,\n applySearch,\n clearSearch,\n hasPendingSearchChanges,\n filterRows,\n appliedFilterRows,\n asOfFilter,\n setAsOfFilter,\n tableFilters,\n hasPendingFilterChanges,\n addFilterRow,\n applyFilters,\n updateFilterRow,\n removeFilterRow,\n removeAppliedFilterRow,\n clearFilterRows,\n clearAppliedFilters,\n } = useListFilters(filterableFields);\n\n const detectedParentField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as { parentField?: string } | undefined;\n if (fromMeta?.parentField) return fromMeta.parentField;\n if (schemaFields.parent_doctype) return \"parent_doctype\";\n if (schemaFields.parent) return \"parent\";\n return Object.keys(schemaFields).find((k) => k.startsWith(\"parent_\") || k.endsWith(\"_parent\"));\n }, [uiMeta, schemaFields]);\n\n const groupFieldCandidates = useMemo(() => {\n return Object.entries(schemaFields)\n .filter(([, f]) => isSelectOrLinkField(f))\n .map(([n]) => n);\n }, [schemaFields]);\n\n const metaKanban = uiMeta?.additional_views?.kanban as\n | { groupByField?: string; cardTitleField?: string; cardSubtitleField?: string }\n | undefined;\n const metaGantt = uiMeta?.additional_views?.gantt as\n | {\n nameField?: string;\n startField?: string;\n endField?: string;\n progressField?: string;\n parentField?: string;\n }\n | undefined;\n\n const kanbanGroupField = useMemo(() => {\n return pickFirst(\n metaKanban?.groupByField,\n schemaFields.status ? \"status\" : undefined,\n schemaFields.workflow_state ? \"workflow_state\" : undefined,\n groupFieldCandidates[0]\n );\n }, [metaKanban, schemaFields, groupFieldCandidates]);\n\n const canKanban = Boolean(kanbanGroupField);\n const canTree = Boolean(detectedParentField);\n\n const ganttStartField = useMemo(() => {\n return pickFirst(\n metaGantt?.startField,\n schemaFields.start_date ? \"start_date\" : undefined,\n schemaFields.start ? \"start\" : undefined\n );\n }, [metaGantt, schemaFields]);\n\n const ganttEndField = useMemo(() => {\n return pickFirst(\n metaGantt?.endField,\n schemaFields.due_date ? \"due_date\" : undefined,\n schemaFields.end_date ? \"end_date\" : undefined,\n schemaFields.end ? \"end\" : undefined\n );\n }, [metaGantt, schemaFields]);\n\n const ganttConfig = useMemo<GanttConfig | undefined>(() => {\n if (!ganttStartField || !ganttEndField) return undefined;\n return {\n nameField:\n pickFirst(\n metaGantt?.nameField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.name ? \"name\" : undefined\n ) ?? \"name\",\n startField: ganttStartField,\n endField: ganttEndField,\n progressField: pickFirst(\n metaGantt?.progressField,\n schemaFields.progress ? \"progress\" : undefined\n ),\n parentField: pickFirst(metaGantt?.parentField, detectedParentField),\n };\n }, [metaGantt, schemaFields, ganttStartField, ganttEndField, detectedParentField]);\n\n const canGantt = Boolean(ganttConfig);\n\n const listColumns = useMemo(() => {\n const fromMeta = uiMeta?.list?.columns || (uiMeta as any)?.list_columns;\n if (Array.isArray(fromMeta) && fromMeta.length > 0) {\n return fromMeta\n .map((col: any) => ({\n field: typeof col === \"string\" ? col : String(col.field ?? \"\"),\n label:\n typeof col === \"string\" ? toDisplayLabel(col) : String(col.label ?? col.field ?? \"\"),\n width:\n typeof col === \"object\" && col !== null ? Number(col.width) || undefined : undefined,\n sortable: typeof col === \"object\" && col !== null ? col.sortable !== false : true,\n }))\n .filter((c) => c.field);\n }\n\n const fallbackFields = Object.keys(schemaFields)\n .filter((field) => !LIST_SYSTEM_FIELDS.has(field) && !isHiddenField(schemaFields[field]))\n .sort((a, b) => {\n if (a === \"name\") return -1;\n if (b === \"name\") return 1;\n return 0;\n })\n .slice(0, 4);\n\n return fallbackFields.map((field) => {\n const schemaField = schemaFields[field];\n return {\n field,\n label:\n (typeof schemaField?.title === \"string\" && schemaField.title) || toDisplayLabel(field),\n width: undefined,\n sortable: true,\n };\n });\n }, [uiMeta, schemaFields]);\n\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\") as any;\n\n const {\n isDeleteConfirmOpen,\n setIsDeleteConfirmOpen,\n isColumnsMenuOpen,\n setIsColumnsMenuOpen,\n isMobile,\n columnPreferences,\n toggleColumnVisibility,\n activeView,\n setActiveView,\n handleRowClick,\n } = useListActions({\n doctype,\n propView,\n canKanban,\n canTree,\n canGantt,\n resolveDetailRoute,\n });\n\n const visibleListColumns = useMemo(() => {\n return listColumns.filter((column) => columnPreferences.visibility[column.field] !== false);\n }, [listColumns, columnPreferences.visibility]);\n\n const tableColumns = useMemo<ColumnDef<Record<string, unknown>, unknown>[]>(\n () =>\n visibleListColumns.map((column) => {\n return {\n id: column.field,\n accessorKey: column.field,\n header: column.label,\n size: column.width,\n enableSorting: column.sortable ?? true,\n cell: ({ getValue }) => formatCellValue(schemaFields[column.field], getValue()),\n };\n }),\n [visibleListColumns, schemaFields]\n );\n\n const detectedLabelField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as { labelField?: string } | undefined;\n return (\n pickFirst(\n fromMeta?.labelField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.label ? \"label\" : undefined,\n schemaFields.name ? \"name\" : undefined\n ) ?? \"name\"\n );\n }, [uiMeta, schemaFields]);\n\n const kanbanColumns = useMemo(() => {\n if (!kanbanGroupField) return [];\n const enums = getStringEnums(schemaFields[kanbanGroupField]);\n return enums.map((value) => ({\n id: value,\n title: value.charAt(0).toUpperCase() + value.slice(1).replaceAll(\"_\", \" \"),\n }));\n }, [kanbanGroupField, schemaFields]);\n\n const kanbanTitleField = pickFirst(\n metaKanban?.cardTitleField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.name ? \"name\" : undefined,\n \"name\"\n ) as string;\n\n const kanbanDescriptionField = pickFirst(\n metaKanban?.cardSubtitleField,\n schemaFields.description ? \"description\" : undefined,\n schemaFields.notes ? \"notes\" : undefined\n );\n\n const handleNew = useCallback(() => {\n if (!isAuthenticated) {\n setUiError(\"Authentication required. Please login first.\");\n navigate(\"/login\");\n return;\n }\n setUiError(null);\n navigate(`/app/${doctype}/new`);\n }, [isAuthenticated, navigate, doctype]);\n\n const deleteMutation = useDeleteMany();\n const invalidate = useInvalidate();\n\n const handleBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) return;\n setIsDeleteConfirmOpen(true);\n }, [selectedRows]);\n\n const confirmBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) {\n setIsDeleteConfirmOpen(false);\n return;\n }\n\n try {\n const ids = selectedRows.map((row) => String(row.id ?? row.name ?? \"\"));\n await deleteMutation.mutateAsync({\n resource: doctype,\n ids,\n });\n setSelectedRows([]);\n setIsDeleteConfirmOpen(false);\n setUiError(null);\n invalidate({ resource: doctype, invalidates: [\"list\"] });\n } catch (err: any) {\n setIsDeleteConfirmOpen(false);\n setUiError(err.message || `Failed to delete selected ${doctype}.`);\n }\n }, [selectedRows, deleteMutation, doctype, invalidate]);\n\n const title = useMemo(() => {\n return toDisplayLabel(doctype);\n }, [doctype]);\n\n const appName = useMemo(() => {\n const typedApps = apps as unknown as Array<{\n label?: string;\n app_id?: string;\n resources?: Array<{ name: string }>;\n }>;\n for (const app of typedApps || []) {\n if (app.resources?.some((r) => r.name === doctype)) {\n return app.label || app.app_id || \"App\";\n }\n }\n return \"App\";\n }, [apps, doctype]);\n\n const listFilterSlotData = useMemo(\n () => ({\n asOf: asOfFilter,\n setAsOf: (val: string | null) => {\n setAsOfFilter(val as string | undefined);\n if (val) {\n const date = new Date(val);\n if (Number.isNaN(date.getTime())) {\n setTimeTravelError(`Invalid point-in-time date string: \"${val}\"`);\n } else {\n setTimeTravelError(null);\n }\n } else {\n setTimeTravelError(null);\n }\n },\n }),\n [asOfFilter, setAsOfFilter]\n );\n\n return (\n <ListBodyLayout\n doctype={doctype}\n metaLoading={metaLoading}\n metaError={metaError}\n schema={schema}\n permissions={permissions}\n identity={identity}\n isAuthenticated={isAuthenticated}\n selectedRows={selectedRows}\n setSelectedRows={setSelectedRows}\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n appliedSearchQuery={appliedSearchQuery}\n applySearch={applySearch}\n clearSearch={clearSearch}\n hasPendingSearchChanges={hasPendingSearchChanges}\n filterRows={filterRows}\n appliedFilterRows={appliedFilterRows}\n filterableFields={filterableFields}\n filterFieldMap={filterFieldMap}\n addFilterRow={addFilterRow}\n removeFilterRow={removeFilterRow}\n removeAppliedFilterRow={removeAppliedFilterRow}\n clearFilterRows={clearFilterRows}\n clearAppliedFilters={clearAppliedFilters}\n applyFilters={applyFilters}\n hasPendingFilterChanges={hasPendingFilterChanges}\n updateFilterRow={updateFilterRow}\n listFilterSlotData={listFilterSlotData}\n uiError={uiError}\n timeTravelError={timeTravelError}\n isDeleteConfirmOpen={isDeleteConfirmOpen}\n setIsDeleteConfirmOpen={setIsDeleteConfirmOpen}\n isColumnsMenuOpen={isColumnsMenuOpen}\n setIsColumnsMenuOpen={setIsColumnsMenuOpen}\n isMobile={isMobile}\n columnPreferences={columnPreferences}\n toggleColumnVisibility={toggleColumnVisibility}\n activeView={activeView}\n setActiveView={setActiveView}\n handleRowClick={handleRowClick}\n canKanban={canKanban}\n canTree={canTree}\n canGantt={canGantt}\n appName={appName}\n title={title}\n listColumns={listColumns}\n tableColumns={tableColumns}\n tableFilters={tableFilters}\n kanbanGroupField={kanbanGroupField}\n kanbanColumns={kanbanColumns}\n kanbanTitleField={kanbanTitleField}\n kanbanDescriptionField={kanbanDescriptionField}\n detectedParentField={detectedParentField}\n detectedLabelField={detectedLabelField}\n ganttConfig={ganttConfig}\n confirmBulkDelete={confirmBulkDelete}\n handleBulkDelete={handleBulkDelete}\n handleNew={handleNew}\n />\n );\n}\n\nexport default ListView;\n","import { MStack, XStack, Button, Input, Card, MText } from \"@framework-m/ui\";\nimport { Frm } from \"../../hooks/useFormController\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface FormToolbarProps {\n frm: Frm;\n submitLabel: string;\n isEditing: boolean;\n printFormatName: string;\n setPrintFormatName: (val: string) => void;\n openPrintPreview: () => void;\n downloadPrintPdf: () => void;\n layout?: \"sidebar\" | \"sticky-bottom\";\n}\n\nexport function FormToolbar({\n frm,\n submitLabel,\n isEditing,\n printFormatName,\n setPrintFormatName,\n openPrintPreview,\n downloadPrintPdf,\n layout = \"sidebar\",\n}: FormToolbarProps) {\n const { t } = useTranslation(\"desk\");\n const printTools = isEditing ? (\n <Card\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n backgroundColor=\"$backgroundSecondary\"\n >\n <MStack gap=\"$sm\">\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n {t(\"Output\")}\n </MText>\n <Input\n value={printFormatName}\n onChangeText={setPrintFormatName}\n placeholder=\"Print format (optional)\"\n size=\"md\"\n />\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n <Button\n variant=\"ghost\"\n onPress={openPrintPreview}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n {t(\"Print Preview\")}\n </Button>\n <Button\n variant=\"ghost\"\n onPress={downloadPrintPdf}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n {t(\"Download PDF\")}\n </Button>\n </XStack>\n </MStack>\n </Card>\n ) : null;\n\n if (layout === \"sticky-bottom\") {\n return (\n <Card\n style={{ position: \"sticky\", bottom: 16, zIndex: 40 }}\n marginTop=\"$lg\"\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n elevated\n >\n <MStack gap=\"$sm\">\n <XStack\n role=\"toolbar\"\n aria-label=\"Form actions\"\n gap=\"$sm\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flexWrap=\"wrap\"\n >\n <MText fontWeight=\"600\" fontSize=\"$sm\">\n {t(\"Actions\")}\n </MText>\n <XStack gap=\"$sm\" flexWrap=\"wrap\">\n {!frm.isLocked && (\n <Button\n variant=\"primary\"\n onPress={() => frm.save()}\n disabled={frm.isSaving}\n size=\"md\"\n >\n {submitLabel}\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n onPress={() => frm.cancel()}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n {t(\"Cancel\")}\n </Button>\n </XStack>\n </XStack>\n {printTools}\n </MStack>\n </Card>\n );\n }\n\n return (\n <Card\n padding=\"$md\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n elevated\n >\n <MStack role=\"toolbar\" aria-label=\"Form actions\" gap=\"$md\">\n <MStack gap=\"$xs\">\n <MText fontWeight=\"700\">{t(\"Document actions\")}</MText>\n <MText color=\"$colorMuted\" fontSize=\"$xs\">\n {t(\"Keep core actions anchored while you work through the form.\")}\n </MText>\n </MStack>\n\n <MStack gap=\"$sm\">\n {!frm.isLocked && (\n <Button variant=\"primary\" onPress={() => frm.save()} disabled={frm.isSaving} size=\"md\">\n {submitLabel}\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n onPress={() => frm.cancel()}\n borderColor=\"$borderColor\"\n borderWidth={1}\n size=\"md\"\n >\n {t(\"Cancel\")}\n </Button>\n </MStack>\n\n {printTools}\n </MStack>\n </Card>\n );\n}\n","import { createContext } from \"react\";\nimport type { ShellContextValue } from \"./types\";\n\nexport const ShellContext = createContext<ShellContextValue | null>(null);\n","import { useContext } from \"react\";\nimport { ShellContext } from \"../shell/context\";\nimport type { ShellContextValue } from \"../shell/types\";\n\nexport function useShell(): ShellContextValue {\n const context = useContext(ShellContext);\n if (!context) {\n throw new Error(\"useShell must be used within a ShellProvider\");\n }\n return context;\n}\n","import { MStack } from \"@framework-m/ui\";\nimport { TabContainer } from \"../layout/TabContainer\";\nimport { SectionField } from \"../layout/SectionField\";\nimport { AutoForm } from \"./AutoForm\";\nimport { AUDIT_FIELDS } from \"../layout/SystemInfo\";\nimport { Frm } from \"../../hooks/useFormController\";\nimport { UIMeta } from \"../../hooks/useUIMeta\";\n\nexport interface FormBodyLayoutProps {\n meta: any;\n uiMeta: UIMeta | null;\n frm: Frm;\n id?: string;\n}\n\nfunction buildFilteredSchema(meta: any, fieldKeys: string[]): any {\n const properties: Record<string, unknown> = {};\n for (const key of fieldKeys) {\n const normalizedKey = key.toLowerCase().trim();\n if (AUDIT_FIELDS.includes(normalizedKey)) continue;\n if (meta.properties[key]) {\n properties[key] = meta.properties[key];\n }\n }\n return { ...meta, properties };\n}\n\nfunction buildFullFilteredSchema(meta: any): any {\n const properties: Record<string, unknown> = {};\n for (const key of Object.keys(meta.properties || {})) {\n const normalizedKey = key.toLowerCase().trim();\n if (AUDIT_FIELDS.includes(normalizedKey)) continue;\n properties[key] = meta.properties[key];\n }\n return { ...meta, properties };\n}\n\nexport function FormBodyLayout({ meta, uiMeta, frm, id }: Readonly<FormBodyLayoutProps>) {\n const tabs = uiMeta?.form?.tabs;\n const flatSections = uiMeta?.form?.sections;\n\n // --- Tabbed layout ---\n if (tabs && tabs.length > 0) {\n const doctype = uiMeta?.doctype ?? \"unknown\";\n return (\n <TabContainer tabs={tabs} doctype={doctype}>\n {(tab) => (\n <MStack gap=\"$md\">\n {tab.sections.map((section, si) => {\n const sectionSchema = buildFilteredSchema(meta, section.fields);\n return (\n <SectionField\n key={section.label || si}\n label={section.label}\n collapsible={section.collapsible}\n defaultCollapsed={section.collapsed_by_default}\n columns={section.columns ?? 1}\n >\n <AutoForm\n key={`${id}-${section.label}-${si}`}\n schema={sectionSchema}\n formData={frm.doc}\n onChange={(data) => frm.setDoc(data)}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n </SectionField>\n );\n })}\n </MStack>\n )}\n </TabContainer>\n );\n }\n\n // --- Flat sections (no tabs) ---\n if (flatSections && flatSections.length > 0) {\n return (\n <MStack gap=\"$md\">\n {flatSections.map((section, si) => {\n const sectionSchema = buildFilteredSchema(meta, section.fields);\n return (\n <SectionField\n key={section.label || si}\n label={section.label}\n collapsible={section.collapsible}\n defaultCollapsed={section.collapsed_by_default}\n columns={section.columns ?? 1}\n >\n <AutoForm\n key={`${id}-${section.label}-${si}`}\n schema={sectionSchema}\n formData={frm.doc}\n onChange={(data) => frm.setDoc(data)}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n </SectionField>\n );\n })}\n </MStack>\n );\n }\n\n // --- Fallback: flat AutoForm ---\n return (\n <AutoForm\n key={`${id}`}\n schema={buildFullFilteredSchema(meta)}\n formData={frm.doc}\n onChange={(data) => frm.setDoc(data)}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n );\n}\n","import React from \"react\";\nimport { XStack, MStack, MText, Heading, Card } from \"@framework-m/ui\";\nimport { WorkflowActions } from \"../workflow/WorkflowActions\";\nimport { AlertBanner } from \"../feedback/AlertBanner\";\nimport { SubmittedBanner } from \"../feedback/SubmittedBanner\";\n\ninterface FormViewHeaderProps {\n appName: string;\n isSingleton: boolean;\n doctype: string;\n id?: string;\n isEditing: boolean;\n displayName: string;\n title: string;\n frm: any;\n}\n\nexport const FormViewHeader: React.FC<FormViewHeaderProps> = ({\n appName,\n isSingleton,\n doctype,\n id,\n isEditing,\n displayName,\n title,\n frm,\n}) => {\n return (\n <MStack marginBottom=\"$lg\">\n {/* Breadcrumbs */}\n <XStack alignItems=\"center\" gap=\"$xs\" marginBottom=\"$sm\">\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n {appName}\n </MText>\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n /\n </MText>\n {isSingleton ? (\n <MText color=\"$text\" fontSize=\"$sm\">\n {doctype.replaceAll(\"_\", \" \")}\n </MText>\n ) : (\n <>\n <MText\n color=\"$colorMuted\"\n fontSize=\"$sm\"\n cursor=\"pointer\"\n onPress={() => frm.cancel()}\n hoverStyle={{ textDecorationLine: \"underline\" }}\n >\n {doctype.replaceAll(\"_\", \" \")}\n </MText>\n <MText color=\"$colorMuted\" fontSize=\"$sm\">\n /\n </MText>\n <MText color=\"$text\" fontSize=\"$sm\">\n {isEditing ? displayName : \"New\"}\n </MText>\n </>\n )}\n </XStack>\n\n <XStack justifyContent=\"space-between\" alignItems=\"center\">\n <Heading size=\"$sm\" margin={0}>\n {title}\n </Heading>\n\n {/* Workflow Actions */}\n {isEditing && frm.workflow && (\n <WorkflowActions\n doctype={doctype}\n id={id}\n showState\n onActionComplete={() => frm.refetch()}\n />\n )}\n </XStack>\n\n {/* Validation Errors */}\n {frm.errors && frm.errors.length > 0 && (\n <MStack marginBottom=\"$md\" gap=\"$xs\" position=\"relative\">\n {frm.errors.map((error: string, i: number) => (\n <Card\n key={`${error}-${i}`}\n padding=\"$sm\"\n backgroundColor=\"$error\"\n borderColor=\"$error\"\n borderWidth={1}\n opacity={0.1}\n />\n ))}\n <MStack position=\"absolute\" padding=\"$sm\" gap=\"$xs\">\n {frm.errors.map((error: string, i: number) => (\n <MText key={`${error}-text-${i}`} color=\"$error\" fontSize=\"$sm\">\n {error}\n </MText>\n ))}\n </MStack>\n </MStack>\n )}\n\n {/* Notices */}\n {frm.notices && frm.notices.length > 0 && (\n <MStack marginBottom=\"$md\" gap=\"$sm\">\n {frm.notices.map((notice: string, index: number) => (\n <AlertBanner key={`${notice}-${index}`} message={notice} variant=\"info\" />\n ))}\n </MStack>\n )}\n\n {/* Status Banners */}\n {frm.isLocked && (\n <MStack marginBottom=\"$md\">\n <SubmittedBanner\n docstatus={(Number((frm.doc as any)?.docstatus) === 2 ? 2 : 1) as 1 | 2}\n />\n </MStack>\n )}\n </MStack>\n );\n};\n","/**\n * FormView Page Component\n *\n * Generic form view for any DocType (create/edit).\n */\n\nimport { MStack, XStack, MText, Card, Button } from \"@framework-m/ui\";\nimport { SystemInfo } from \"../components/layout/SystemInfo\";\nimport { useRef, useState, type ReactNode } from \"react\";\nimport { useComponentOverride, useFormController, useFormActions, type Frm } from \"../hooks\";\nimport { FormToolbar } from \"../components/form/FormToolbar\";\nimport { useShell } from \"../hooks/useShell\";\nimport { useUIMeta } from \"../hooks/useUIMeta\";\nimport { useFormKeyboard } from \"../hooks/useFormKeyboard\";\nimport { usePluginApps } from \"@framework-m/plugin-sdk\";\nimport { Slot } from \"../plugins\";\nimport { PageSkeleton } from \"../components/layout/ShellSkeleton\";\nimport { FormBodyLayout } from \"../components/form/FormBodyLayout\";\nimport { FormViewHeader } from \"../components/form/FormViewHeader\";\nimport { useTranslation } from \"../hooks\";\n\nexport interface FormViewProps {\n doctype?: string;\n id?: string;\n children?: ReactNode;\n}\n\nexport interface StandardFormViewProps {\n doctype: string;\n id?: string;\n frm: Frm;\n meta: any;\n metaLoading: boolean;\n metaError?: Error | null;\n docError?: Error | null;\n record?: any;\n}\n\nexport function FormView({ doctype: propDoctype, id: propId }: Readonly<FormViewProps>) {\n const { doctype, id, frm, schema, metaLoading, metaError, docError, record } = useFormController({\n doctype: propDoctype,\n id: propId,\n });\n\n const CustomComponent = useComponentOverride(doctype, \"FormView\");\n\n const commonProps: StandardFormViewProps = {\n doctype,\n id,\n frm,\n meta: schema,\n metaLoading,\n metaError,\n docError,\n record,\n };\n\n if (CustomComponent) {\n return (\n <CustomComponent {...commonProps}>\n <StandardFormView {...commonProps} />\n </CustomComponent>\n );\n }\n\n return <StandardFormView {...commonProps} />;\n}\n\nfunction StandardFormView({\n doctype,\n id,\n frm,\n meta,\n metaLoading,\n metaError,\n docError,\n record,\n}: StandardFormViewProps) {\n const { t } = useTranslation(\"desk\");\n let shell: any = {\n isMobile: false,\n rightSidebarOpen: false,\n setRightSidebarOpen: () => {},\n };\n try {\n shell = useShell();\n } catch (e) {\n // Fallback for isolated tests\n }\n\n let apps: any[] = [];\n try {\n apps = usePluginApps();\n } catch (e) {\n // Fallback for isolated tests\n }\n\n const formRef = useRef<HTMLElement | null>(null);\n const [showSystemInfo, setShowSystemInfo] = useState(false);\n useFormKeyboard(formRef);\n\n const { uiMeta } = useUIMeta(doctype);\n\n const {\n handleTouchStart,\n handleTouchEnd,\n printFormatName,\n setPrintFormatName,\n openPrintPreview,\n downloadPrintPdf,\n isEditing,\n isSingleton,\n displayName,\n title,\n appName,\n submitLabel,\n } = useFormActions({\n doctype,\n id,\n frm,\n shell,\n apps,\n });\n\n if (metaLoading) {\n return <PageSkeleton />;\n }\n\n if (metaError) {\n return (\n <MStack padding=\"$xl\" backgroundColor=\"$background\" minHeight=\"100%\">\n <MText color=\"$error\">\n {t(\"Error:\")} {metaError.message}\n </MText>\n </MStack>\n );\n }\n\n if (docError) {\n return (\n <MStack padding=\"$xl\" backgroundColor=\"$background\" minHeight=\"100%\">\n <Card padding=\"$md\" backgroundColor=\"$error\" borderColor=\"$error\" borderWidth={1}>\n <MText color=\"#fff\" role=\"alert\">\n {docError.message || `Failed to load ${doctype}.`}\n </MText>\n </Card>\n </MStack>\n );\n }\n\n return (\n <MStack\n padding=\"$lg\"\n width=\"100%\"\n backgroundColor=\"$background\"\n height=\"100%\"\n minHeight=\"100%\"\n overflowY=\"auto\"\n overflowX=\"hidden\"\n onTouchStart={shell.isMobile ? (e: any) => handleTouchStart(e) : undefined}\n onTouchEnd={shell.isMobile ? (e: any) => handleTouchEnd(e) : undefined}\n >\n {/* Contextual Header Area */}\n <FormViewHeader\n appName={appName}\n isSingleton={isSingleton}\n doctype={doctype}\n id={id}\n isEditing={isEditing}\n displayName={displayName}\n title={title}\n frm={frm}\n />\n\n {/* Plugin slot for form header */}\n <Slot name=\"form-header\" doctype={doctype} data={frm.doc} id={id} />\n\n {/* Main Content Area (3-column split) */}\n <XStack\n width=\"100%\"\n gap=\"$lg\"\n alignItems=\"flex-start\"\n backgroundColor=\"$background\"\n minHeight={0}\n >\n {/* Center Column: The Form */}\n {/* @ts-expect-error — ref bridging */}\n <MStack flex={1} minWidth={0} ref={formRef}>\n {meta && <FormBodyLayout meta={meta} uiMeta={uiMeta} frm={frm} id={id} />}\n\n {/* Plugin slot for form footer */}\n <Slot name=\"form-footer\" doctype={doctype} data={frm.doc} id={id} />\n </MStack>\n\n {/* Right Column: Anchored Actions + System Sidebar */}\n {!shell.isMobile && (\n <MStack width={320} minWidth={280} gap=\"$lg\" style={{ position: \"sticky\", top: 16 }}>\n <FormToolbar\n frm={frm}\n submitLabel={submitLabel}\n isEditing={isEditing}\n printFormatName={printFormatName}\n setPrintFormatName={setPrintFormatName}\n openPrintPreview={openPrintPreview}\n downloadPrintPdf={downloadPrintPdf}\n layout=\"sidebar\"\n />\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={frm.doc} id={id} />\n\n {isEditing && (\n <>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setShowSystemInfo((value) => !value)}\n >\n {showSystemInfo ? \"Hide system info\" : \"System info\"}\n </Button>\n\n {showSystemInfo && (\n <MStack\n borderLeftWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$backgroundSecondary\"\n paddingLeft=\"$lg\"\n paddingTop=\"$lg\"\n gap=\"$lg\"\n >\n <SystemInfo id={id} record={record} />\n </MStack>\n )}\n </>\n )}\n </MStack>\n )}\n\n {/* Right Column: System/Audit Sidebar (Mobile Overlay Only) */}\n {shell.isMobile && isEditing && shell.rightSidebarOpen && (\n <MStack\n width=\"80%\"\n maxWidth={320}\n borderLeftWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n paddingLeft=\"$lg\"\n paddingTop=\"$lg\"\n gap=\"$lg\"\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n zIndex={1000}\n elevation={20}\n shadowColor=\"$shadow\"\n shadowRadius={20}\n >\n <XStack justifyContent=\"flex-end\" paddingRight=\"$lg\">\n <Button size=\"sm\" variant=\"ghost\" onPress={() => shell.setRightSidebarOpen(false)}>\n {t(\"Close \\u2715\")}\n </Button>\n </XStack>\n\n <SystemInfo id={id} record={record} />\n </MStack>\n )}\n </XStack>\n\n {shell.isMobile && (\n <>\n <FormToolbar\n frm={frm}\n submitLabel={submitLabel}\n isEditing={isEditing}\n printFormatName={printFormatName}\n setPrintFormatName={setPrintFormatName}\n openPrintPreview={openPrintPreview}\n downloadPrintPdf={downloadPrintPdf}\n layout=\"sticky-bottom\"\n />\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={frm.doc} id={id} />\n </>\n )}\n </MStack>\n );\n}\n\nexport default FormView;\n","export const OAUTH_PROVIDERS: Record<string, { label: string; icon: string }> = {\n google: { label: \"Continue with Google\", icon: \"G\" },\n github: { label: \"Continue with GitHub\", icon: \"GH\" },\n microsoft: { label: \"Continue with Microsoft\", icon: \"MS\" },\n rauth: { label: \"Continue with RAuth\", icon: \"RA\" },\n};\n\nexport function resolveConfiguredProviders(): string[] {\n const configGlobal = globalThis as typeof globalThis & {\n __FRAMEWORK_CONFIG__?: {\n auth?: {\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n __FRAMEWORK_OAUTH_PROVIDERS__?: string[];\n };\n\n const injectedProviders = configGlobal.__FRAMEWORK_OAUTH_PROVIDERS__;\n if (Array.isArray(injectedProviders)) {\n return injectedProviders;\n }\n\n const rawProviders = configGlobal.__FRAMEWORK_CONFIG__?.auth?.oauth?.providers;\n if (Array.isArray(rawProviders)) {\n return rawProviders.filter((provider): provider is string => typeof provider === \"string\");\n }\n\n if (rawProviders && typeof rawProviders === \"object\") {\n return Object.keys(rawProviders);\n }\n\n return [];\n}\n","import React from \"react\";\nimport { YStack, Heading } from \"@framework-m/ui\";\nimport { useTranslation } from \"../hooks\";\n\nexport interface LoginLogoProps {\n logo?: string | React.ReactNode;\n}\n\nexport function LoginLogo({ logo }: LoginLogoProps) {\n const { t } = useTranslation(\"desk\");\n if (!logo) {\n return (\n <YStack\n width={48}\n height={48}\n borderRadius=\"$lg\"\n backgroundColor=\"$primary\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Heading color=\"#fff\" fontSize=\"$lg\">\n {t(\"M\")}\n </Heading>\n </YStack>\n );\n }\n\n if (typeof logo === \"string\") {\n return <img src={logo} alt=\"Logo\" style={{ maxHeight: 48 }} />;\n }\n\n return <>{logo}</>;\n}\n","import React, { useState, useEffect } from \"react\";\n\nimport { useSearchParams } from \"react-router\";\nimport { useLogin } from \"@refinedev/core\";\nimport { YStack, XStack, Card, Input, Button, Heading, Paragraph, useTheme } from \"@framework-m/ui\";\nimport { usePageOverride, useTranslation } from \"../hooks\";\nimport { useMFetch } from \"../hooks/useMFetch\";\n\nimport { OAUTH_PROVIDERS, resolveConfiguredProviders } from \"./loginUtils\";\nimport { LoginLogo } from \"./LoginLogo\";\n\nconst FORGOT_PASSWORD_MESSAGE =\n \"Password reset is not configured yet. Please contact your administrator.\";\n\nexport interface LoginPageProps {\n /** Title to display */\n title?: string;\n /** Logo URL or component */\n logo?: string | React.ReactNode;\n /** Redirect URL after login */\n redirectTo?: string;\n}\n\n/**\n * LoginPage Component\n *\n * Refactored using Tamagui for premium aesthetics and cross-platform readiness.\n */\nexport function LoginPage({ ...props }: Readonly<LoginPageProps>) {\n const CustomComponent = usePageOverride(\"LoginPage\");\n\n if (CustomComponent) {\n return <CustomComponent {...props} />;\n }\n\n return <StandardLoginPage {...props} />;\n}\n\nfunction StandardLoginPage({\n title = \"Welcome back\",\n logo,\n redirectTo: propRedirectTo,\n}: Readonly<LoginPageProps>) {\n const { t } = useTranslation(\"desk\");\n const [searchParams] = useSearchParams();\n const redirectTo = propRedirectTo ?? searchParams.get(\"to\") ?? undefined;\n\n const { mutate: login, status } = useLogin();\n const [error, setError] = useState<string | null>(null);\n const [infoMessage, setInfoMessage] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [showPassword, setShowPassword] = useState(false);\n const { theme, toggleTheme } = useTheme();\n const mfetch = useMFetch();\n\n const isLoading = status === \"pending\";\n const [providers, setProviders] = useState<string[]>(resolveConfiguredProviders());\n const displayTitle = title === \"Welcome back\" ? t(\"Welcome back\") : title;\n\n // Discovery loop for development (Vite) where injection is bypassed\n useEffect(() => {\n const fetchProviders = async () => {\n try {\n const response = await mfetch(\"/api/v1/auth/oauth/providers\");\n if (response.ok) {\n const data = await response.json();\n if (data.enabled && Array.isArray(data.providers)) {\n setProviders((prev) => {\n // Merge and deduplicate\n const all = Array.from(new Set([...prev, ...data.providers]));\n return all.sort();\n });\n }\n }\n } catch (err) {\n console.warn(\"OAuth provider discovery failed:\", err);\n }\n };\n\n fetchProviders();\n }, []);\n\n const handleSubmit = (e?: any) => {\n e?.preventDefault();\n if (isLoading) return;\n setError(null);\n setInfoMessage(null);\n\n login(\n { email, password, redirectTo },\n {\n onSuccess: (result) => {\n if (result && result.success === false) {\n setError(result.error?.message || t(\"Invalid credentials\"));\n } else {\n // Success: use the backend-resolved redirectTo, fallback to local then /app/dashboard\n const destination = (result as any)?.redirectTo ?? redirectTo ?? \"/app/dashboard\";\n globalThis.location.href = destination;\n }\n },\n onError: (err) => {\n setError(err.message || t(\"Login failed. Please try again.\"));\n },\n }\n );\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSubmit();\n }\n };\n\n return (\n <YStack\n fullscreen\n minHeight=\"100vh\"\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor=\"$background\"\n padding=\"$md\"\n paddingVertical=\"$xl\"\n overflowY=\"auto\"\n className=\"shell-login-container\"\n position=\"relative\"\n style={{\n background:\n theme === \"dark\"\n ? \"radial-gradient(circle at top right, var(--color-sidebar-hover), transparent), radial-gradient(circle at bottom left, var(--color-focus-ring), transparent)\"\n : \"radial-gradient(circle at top right, #f3f4f6, transparent), radial-gradient(circle at bottom left, #e5e7eb, transparent)\",\n }}\n >\n <XStack position=\"absolute\" top=\"$lg\" right=\"$lg\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={toggleTheme}\n disabled={isLoading}\n borderRadius={100}\n width={40}\n height={40}\n >\n <Heading fontSize=\"$md\" opacity={0.7}>\n {theme === \"dark\" ? \"☀️\" : \"🌙\"}\n </Heading>\n </Button>\n </XStack>\n\n <Card\n width=\"100%\"\n maxWidth={400}\n padding=\"$xl\"\n borderRadius=\"$xl\"\n elevated\n backgroundColor=\"$bg\"\n >\n <YStack alignItems=\"center\" marginBottom=\"$xl\" gap=\"$md\">\n <LoginLogo logo={logo} />\n <YStack alignItems=\"center\" gap=\"$xs\">\n <Heading size=\"$lg\">{displayTitle}</Heading>\n <Paragraph color=\"$text-secondary\" fontSize=\"$sm\">\n {t(\"Sign in to your account\")}\n </Paragraph>\n </YStack>\n </YStack>\n\n {providers.length > 0 && (\n <YStack gap=\"$sm\" marginBottom=\"$lg\">\n {providers.map((provider) => (\n <Button\n key={provider}\n variant=\"default\"\n onClick={() => (globalThis.location.href = `/api/v1/auth/oauth/${provider}/start`)}\n disabled={isLoading}\n width=\"100%\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Heading fontSize=\"$sm\" opacity={0.7}>\n {OAUTH_PROVIDERS[provider]?.icon || \"ID\"}\n </Heading>\n <Paragraph fontSize=\"$sm\">\n {OAUTH_PROVIDERS[provider]?.label ||\n t(\"Continue with {{provider}}\", { provider })}\n </Paragraph>\n </XStack>\n </Button>\n ))}\n\n <XStack alignItems=\"center\" gap=\"$sm\" marginVertical=\"$sm\">\n <YStack height={1} flex={1} backgroundColor=\"$border\" />\n <Paragraph fontSize=\"$xs\" color=\"$text-muted\">\n {t(\"or\")}\n </Paragraph>\n <YStack height={1} flex={1} backgroundColor=\"$border\" />\n </XStack>\n </YStack>\n )}\n\n {error && (\n <YStack\n backgroundColor=\"$error-bg\"\n borderColor=\"$error\"\n borderWidth={1}\n borderRadius=\"$md\"\n padding=\"$sm\"\n marginBottom=\"$lg\"\n >\n <Paragraph color=\"$error\" fontSize=\"$sm\">\n {error}\n </Paragraph>\n </YStack>\n )}\n\n {infoMessage && (\n <YStack\n backgroundColor=\"$backgroundSecondary\"\n borderColor=\"$borderColor\"\n borderWidth={1}\n borderRadius=\"$md\"\n padding=\"$sm\"\n marginBottom=\"$lg\"\n >\n <Paragraph color=\"$text-secondary\" fontSize=\"$sm\">\n {infoMessage}\n </Paragraph>\n </YStack>\n )}\n\n <YStack gap=\"$lg\">\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n {t(\"Email\")}\n </Paragraph>\n <Input\n name=\"email\"\n type=\"email\"\n value={email}\n onChangeText={setEmail}\n required\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n onKeyDown={handleKeyDown}\n disabled={isLoading}\n />\n </YStack>\n\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n {t(\"Password\")}\n </Paragraph>\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Input\n name=\"password\"\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChangeText={setPassword}\n required\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n onKeyDown={handleKeyDown}\n disabled={isLoading}\n flex={1}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setShowPassword((value) => !value)}\n disabled={isLoading}\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n >\n {showPassword ? \"Hide\" : \"Show\"}\n </Button>\n </XStack>\n </YStack>\n\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={isLoading}\n disabled={isLoading}\n size=\"lg\"\n onPress={() => handleSubmit()}\n >\n {isLoading ? t(\"Signing in...\") : t(\"Sign In\")}\n </Button>\n </YStack>\n <YStack marginTop=\"$xl\" alignItems=\"center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isLoading}\n onPress={() => {\n setError(null);\n setInfoMessage(FORGOT_PASSWORD_MESSAGE);\n }}\n >\n {t(\"Forgot password?\")}\n </Button>\n </YStack>\n </Card>\n </YStack>\n );\n}\n\nexport default LoginPage;\n","import type { RealtimeAdapter, RealtimeMessage } from \"../types\";\n\nexport function localRealtimeAdapter(): RealtimeAdapter {\n const channelName = \"frameworkm-realtime\";\n return {\n connect: (onMessage) => {\n if (globalThis.BroadcastChannel === undefined) {\n return undefined;\n }\n const channel = new BroadcastChannel(channelName);\n const handler = (event: MessageEvent<RealtimeMessage>) => {\n if (event.data) {\n onMessage(event.data);\n }\n };\n channel.addEventListener(\"message\", handler);\n return () => {\n channel.removeEventListener(\"message\", handler);\n channel.close();\n };\n },\n publish: (message) => {\n if (globalThis.BroadcastChannel === undefined) {\n return;\n }\n const channel = new BroadcastChannel(channelName);\n channel.postMessage(message);\n channel.close();\n },\n };\n}\n","import { useCallback, useRef } from \"react\";\nimport type { RealtimeAdapter, RealtimeMessage, RealtimeSubscriber } from \"../types\";\nimport { localRealtimeAdapter } from \"../adapters/localRealtimeAdapter\";\n\nfunction removeRoomSubscriber(\n state: Record<string, RealtimeSubscriber[]>,\n room: string,\n listener: RealtimeSubscriber\n): Record<string, RealtimeSubscriber[]> {\n const next = [...(state[room] ?? [])].filter((item) => item !== listener);\n if (next.length > 0) {\n return { ...state, [room]: next };\n }\n const clone = { ...state };\n delete clone[room];\n return clone;\n}\n\nexport function useRealtime(initialAdapter?: RealtimeAdapter) {\n const realtimeAdapterRef = useRef<RealtimeAdapter>(initialAdapter ?? localRealtimeAdapter());\n const disconnectAdapterRef = useRef<(() => void) | null>(null);\n const roomSubscribersRef = useRef<Record<string, RealtimeSubscriber[]>>({});\n\n const dispatchRealtimeMessage = useCallback((message: RealtimeMessage) => {\n const currentSubscribers = roomSubscribersRef.current;\n const roomListeners = currentSubscribers[message.room] ?? [];\n const wildcardListeners = currentSubscribers[\"*\"] ?? [];\n const listeners = [...roomListeners, ...wildcardListeners];\n for (const listener of listeners) {\n listener(message);\n }\n }, []);\n\n const setRealtimeAdapter = useCallback(\n async (adapter: RealtimeAdapter | null) => {\n if (disconnectAdapterRef.current) {\n disconnectAdapterRef.current();\n }\n const nextAdapter = adapter ?? localRealtimeAdapter();\n const maybeDisconnect = await nextAdapter.connect(dispatchRealtimeMessage);\n disconnectAdapterRef.current = maybeDisconnect ?? null;\n realtimeAdapterRef.current = nextAdapter;\n },\n [dispatchRealtimeMessage]\n );\n\n const subscribeRealtime = useCallback((room: string, listener: RealtimeSubscriber) => {\n const current = roomSubscribersRef.current;\n roomSubscribersRef.current = {\n ...current,\n [room]: [...(current[room] ?? []), listener],\n };\n return () => {\n roomSubscribersRef.current = removeRoomSubscriber(roomSubscribersRef.current, room, listener);\n };\n }, []);\n\n const publishRealtime = useCallback(\n async (room: string, type: string, payload: Record<string, unknown>) => {\n const message: RealtimeMessage = {\n room,\n type,\n payload,\n timestamp: Date.now(),\n };\n dispatchRealtimeMessage(message);\n await Promise.resolve(realtimeAdapterRef.current.publish(message));\n },\n [dispatchRealtimeMessage]\n );\n\n return {\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { OmniSearchProvider, OmniSearchResult } from \"../types\";\n\nfunction removeProvider(\n current: OmniSearchProvider[],\n provider: OmniSearchProvider\n): OmniSearchProvider[] {\n return current.filter((item) => item !== provider);\n}\n\nexport function useOmniSearch() {\n const [searchProviders, setSearchProviders] = useState<OmniSearchProvider[]>([]);\n\n const registerOmniSearchProvider = useCallback((provider: OmniSearchProvider) => {\n setSearchProviders((prev) => [...prev, provider]);\n return () => {\n setSearchProviders((prev) => removeProvider(prev, provider));\n };\n }, []);\n\n const searchOmni = useCallback(\n async (query: string) => {\n const trimmed = query.trim();\n if (!trimmed || searchProviders.length === 0) return [];\n\n const resolved = await Promise.all(\n searchProviders.map((provider) => Promise.resolve(provider(trimmed)))\n );\n\n const seen = new Set<string>();\n const merged: OmniSearchResult[] = [];\n for (const providerResults of resolved) {\n for (const result of providerResults) {\n if (seen.has(result.id)) continue;\n seen.add(result.id);\n merged.push(result);\n }\n }\n return merged;\n },\n [searchProviders]\n );\n\n return {\n registerOmniSearchProvider,\n searchOmni,\n };\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport { useMFetch } from \"../../hooks/useMFetch\";\nimport type { ShellSection } from \"../types\";\nimport type { FrameworkMPlugin, NavigationNode } from \"@framework-m/plugin-sdk\";\n\nfunction upsertSection(current: ShellSection[], incoming: ShellSection): ShellSection[] {\n const next: ShellSection[] = [];\n for (const item of current) {\n if (item.id !== incoming.id) {\n next.push(item);\n }\n }\n next.push(incoming);\n return next;\n}\n\nfunction removeSectionById(current: ShellSection[], sectionId: string): ShellSection[] {\n const next: ShellSection[] = [];\n for (const item of current) {\n if (item.id !== sectionId) {\n next.push(item);\n }\n }\n return next;\n}\n\nexport function useSidebarSections(\n initialPlugins: FrameworkMPlugin[] = [],\n isGuestInitial = false\n) {\n const [sections, setSections] = useState<ShellSection[]>([]);\n const [internalIsGuest, setInternalIsGuest] = useState<boolean>(isGuestInitial);\n const [hasPermissionError, setHasPermissionError] = useState<boolean>(false);\n const mfetch = useMFetch();\n\n const registerSection = useCallback((section: ShellSection) => {\n setSections((prev) => upsertSection(prev, section));\n return () => {\n setSections((prev) => removeSectionById(prev, section.id));\n };\n }, []);\n\n const getSections = useCallback(\n (slot: ShellSection[\"slot\"]) =>\n sections\n .filter((section) => section.slot === slot)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999)),\n [sections]\n );\n\n useEffect(() => {\n setHasPermissionError(false);\n }, [typeof window !== \"undefined\" ? window.location.pathname : \"\"]);\n\n useEffect(() => {\n const cleanups: (() => void)[] = [];\n\n const fetchBackendMenu = async () => {\n try {\n const resp = await mfetch(\"/api/meta/doctypes?show_in_desk=true\");\n\n if (resp.status === 401) {\n setInternalIsGuest(true);\n return;\n }\n\n if (resp.status === 403) {\n setHasPermissionError(true);\n setInternalIsGuest(false);\n return;\n }\n\n if (resp.ok) {\n const data = await resp.json();\n setInternalIsGuest(false);\n setHasPermissionError(false);\n\n const authResp = await mfetch(\"/api/v1/auth/me\").catch(() => null);\n if (authResp && authResp.status === 401) {\n setInternalIsGuest(true);\n return;\n }\n\n for (const item of data.doctypes || []) {\n if (!item.show_in_desk || item.is_child_table) continue;\n\n let moduleName = item.module || \"Personnel\";\n if (moduleName.includes(\"core\")) moduleName = \"Core\";\n else if (moduleName.includes(\"standard\")) moduleName = \"Standard\";\n else if (moduleName.includes(\".\")) {\n moduleName =\n moduleName.split(\".\")[0].replace(\"framework_m_\", \"\").charAt(0).toUpperCase() +\n moduleName.split(\".\")[0].replace(\"framework_m_\", \"\").slice(1);\n }\n\n const isSingleton = item.is_singleton || item.metadata?.is_singleton;\n const route = isSingleton\n ? `/app/${item.name}/edit/singleton`\n : `/app/${item.name}/list`;\n\n const cleanup = registerSection({\n id: item.name,\n label:\n item.label ||\n item.metadata?.ui_meta?.label ||\n item.name.replace(/([A-Z])/g, \" $1\").trim(),\n icon: item.metadata?.ui_meta?.icon,\n route: route,\n slot: \"sidebar\",\n module: item.metadata?.ui_meta?.group || moduleName,\n order: item.metadata?.ui_meta?.order || 1000,\n });\n cleanups.push(cleanup);\n }\n }\n } catch (e) {\n console.error(\"Shell: Failed to fetch backend menu\", e);\n }\n };\n fetchBackendMenu();\n\n for (const plugin of initialPlugins) {\n if (plugin.manifests) {\n for (const manifest of plugin.manifests) {\n const registerNodes = (nodes: NavigationNode[], moduleName: string) => {\n for (const node of nodes) {\n const cleanup = registerSection({\n id: node.name,\n label: node.label,\n route: node.route,\n slot: \"sidebar\",\n module: moduleName,\n icon: node.icon,\n order: 1000,\n });\n cleanups.push(cleanup);\n\n if (node.children) {\n registerNodes(node.children, moduleName);\n }\n }\n };\n registerNodes(manifest.resources, manifest.label);\n }\n }\n }\n\n return () => {\n cleanups.forEach((c) => c());\n };\n }, [initialPlugins, registerSection]);\n\n return {\n sections,\n internalIsGuest,\n hasPermissionError,\n registerSection,\n getSections,\n };\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { ShellContext } from \"./context\";\nimport type { ShellContextValue, RealtimeAdapter } from \"./types\";\nimport type { FrameworkMPlugin } from \"@framework-m/plugin-sdk\";\nimport { useRealtime } from \"./hooks/useRealtime\";\nimport { useOmniSearch } from \"./hooks/useOmniSearch\";\nimport { useSidebarSections } from \"./hooks/useSidebarSections\";\n\nexport function ShellProvider({\n children,\n isMobile = false,\n isGuest = false,\n rightSidebarOpen = false,\n setRightSidebarOpen = () => {},\n focusMode,\n setFocusMode,\n realtimeAdapter,\n initialPlugins = [],\n}: Readonly<{\n children: ReactNode;\n isMobile?: boolean;\n isGuest?: boolean;\n rightSidebarOpen?: boolean;\n setRightSidebarOpen?: (value: boolean) => void;\n focusMode: boolean;\n setFocusMode: (value: boolean) => void;\n realtimeAdapter?: RealtimeAdapter;\n initialPlugins?: FrameworkMPlugin[];\n}>) {\n const { setRealtimeAdapter, subscribeRealtime, publishRealtime } = useRealtime(realtimeAdapter);\n const { registerOmniSearchProvider, searchOmni } = useOmniSearch();\n const { internalIsGuest, registerSection, getSections } = useSidebarSections(\n initialPlugins,\n isGuest\n );\n\n const value = useMemo<ShellContextValue>(\n () => ({\n isMobile,\n isGuest: internalIsGuest,\n rightSidebarOpen,\n setRightSidebarOpen,\n focusMode,\n setFocusMode,\n toggleFocusMode: () => setFocusMode(!focusMode),\n registerSection,\n getSections,\n registerOmniSearchProvider,\n searchOmni,\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n }),\n [\n isMobile,\n internalIsGuest,\n rightSidebarOpen,\n setRightSidebarOpen,\n focusMode,\n setFocusMode,\n registerSection,\n getSections,\n registerOmniSearchProvider,\n searchOmni,\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n ]\n );\n\n return <ShellContext.Provider value={value}>{children}</ShellContext.Provider>;\n}\n","import type { RealtimeAdapter, RealtimeMessage } from \"./types\";\n\n/**\n * Creates a WebSocket-based realtime adapter for the Shell.\n *\n * @param url The WebSocket server URL\n * @returns A RealtimeAdapter instance\n */\nexport function createWebSocketRealtimeAdapter(url: string): RealtimeAdapter {\n let socket: WebSocket | null = null;\n\n return {\n connect: (onMessage) => {\n socket = new WebSocket(url);\n const handleMessage = (event: MessageEvent<string>) => {\n try {\n const parsed = JSON.parse(event.data) as RealtimeMessage;\n if (parsed.room && parsed.type) {\n onMessage(parsed);\n }\n } catch {\n // Ignore malformed realtime payloads\n }\n };\n\n socket.addEventListener(\"message\", handleMessage);\n\n return () => {\n if (!socket) return;\n socket.removeEventListener(\"message\", handleMessage);\n socket.close();\n socket = null;\n };\n },\n publish: (message) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(JSON.stringify(message));\n },\n };\n}\n","'use strict';\n\n/** @type {import('./type')} */\nmodule.exports = TypeError;\n","module.exports = {}","var hasMap = typeof Map === 'function' && Map.prototype;\nvar mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;\nvar mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;\nvar mapForEach = hasMap && Map.prototype.forEach;\nvar hasSet = typeof Set === 'function' && Set.prototype;\nvar setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;\nvar setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;\nvar setForEach = hasSet && Set.prototype.forEach;\nvar hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;\nvar weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;\nvar hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;\nvar weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;\nvar hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;\nvar weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;\nvar booleanValueOf = Boolean.prototype.valueOf;\nvar objectToString = Object.prototype.toString;\nvar functionToString = Function.prototype.toString;\nvar $match = String.prototype.match;\nvar $slice = String.prototype.slice;\nvar $replace = String.prototype.replace;\nvar $toUpperCase = String.prototype.toUpperCase;\nvar $toLowerCase = String.prototype.toLowerCase;\nvar $test = RegExp.prototype.test;\nvar $concat = Array.prototype.concat;\nvar $join = Array.prototype.join;\nvar $arrSlice = Array.prototype.slice;\nvar $floor = Math.floor;\nvar bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;\nvar gOPS = Object.getOwnPropertySymbols;\nvar symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;\nvar hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';\n// ie, `has-tostringtag/shams\nvar toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')\n ? Symbol.toStringTag\n : null;\nvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (\n [].__proto__ === Array.prototype // eslint-disable-line no-proto\n ? function (O) {\n return O.__proto__; // eslint-disable-line no-proto\n }\n : null\n);\n\nfunction addNumericSeparator(num, str) {\n if (\n num === Infinity\n || num === -Infinity\n || num !== num\n || (num && num > -1000 && num < 1000)\n || $test.call(/e/, str)\n ) {\n return str;\n }\n var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;\n if (typeof num === 'number') {\n var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)\n if (int !== num) {\n var intStr = String(int);\n var dec = $slice.call(str, intStr.length + 1);\n return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');\n }\n }\n return $replace.call(str, sepRegex, '$&_');\n}\n\nvar utilInspect = require('./util.inspect');\nvar inspectCustom = utilInspect.custom;\nvar inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;\n\nvar quotes = {\n __proto__: null,\n 'double': '\"',\n single: \"'\"\n};\nvar quoteREs = {\n __proto__: null,\n 'double': /([\"\\\\])/g,\n single: /(['\\\\])/g\n};\n\nmodule.exports = function inspect_(obj, options, depth, seen) {\n var opts = options || {};\n\n if (has(opts, 'quoteStyle') && !has(quotes, opts.quoteStyle)) {\n throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');\n }\n if (\n has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'\n ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity\n : opts.maxStringLength !== null\n )\n ) {\n throw new TypeError('option \"maxStringLength\", if provided, must be a positive integer, Infinity, or `null`');\n }\n var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;\n if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {\n throw new TypeError('option \"customInspect\", if provided, must be `true`, `false`, or `\\'symbol\\'`');\n }\n\n if (\n has(opts, 'indent')\n && opts.indent !== null\n && opts.indent !== '\\t'\n && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)\n ) {\n throw new TypeError('option \"indent\" must be \"\\\\t\", an integer > 0, or `null`');\n }\n if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {\n throw new TypeError('option \"numericSeparator\", if provided, must be `true` or `false`');\n }\n var numericSeparator = opts.numericSeparator;\n\n if (typeof obj === 'undefined') {\n return 'undefined';\n }\n if (obj === null) {\n return 'null';\n }\n if (typeof obj === 'boolean') {\n return obj ? 'true' : 'false';\n }\n\n if (typeof obj === 'string') {\n return inspectString(obj, opts);\n }\n if (typeof obj === 'number') {\n if (obj === 0) {\n return Infinity / obj > 0 ? '0' : '-0';\n }\n var str = String(obj);\n return numericSeparator ? addNumericSeparator(obj, str) : str;\n }\n if (typeof obj === 'bigint') {\n var bigIntStr = String(obj) + 'n';\n return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;\n }\n\n var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;\n if (typeof depth === 'undefined') { depth = 0; }\n if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {\n return isArray(obj) ? '[Array]' : '[Object]';\n }\n\n var indent = getIndent(opts, depth);\n\n if (typeof seen === 'undefined') {\n seen = [];\n } else if (indexOf(seen, obj) >= 0) {\n return '[Circular]';\n }\n\n function inspect(value, from, noIndent) {\n if (from) {\n seen = $arrSlice.call(seen);\n seen.push(from);\n }\n if (noIndent) {\n var newOpts = {\n depth: opts.depth\n };\n if (has(opts, 'quoteStyle')) {\n newOpts.quoteStyle = opts.quoteStyle;\n }\n return inspect_(value, newOpts, depth + 1, seen);\n }\n return inspect_(value, opts, depth + 1, seen);\n }\n\n if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable\n var name = nameOf(obj);\n var keys = arrObjKeys(obj, inspect);\n return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');\n }\n if (isSymbol(obj)) {\n var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\\(.*\\))_[^)]*$/, '$1') : symToString.call(obj);\n return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;\n }\n if (isElement(obj)) {\n var s = '<' + $toLowerCase.call(String(obj.nodeName));\n var attrs = obj.attributes || [];\n for (var i = 0; i < attrs.length; i++) {\n s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);\n }\n s += '>';\n if (obj.childNodes && obj.childNodes.length) { s += '...'; }\n s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';\n return s;\n }\n if (isArray(obj)) {\n if (obj.length === 0) { return '[]'; }\n var xs = arrObjKeys(obj, inspect);\n if (indent && !singleLineValues(xs)) {\n return '[' + indentedJoin(xs, indent) + ']';\n }\n return '[ ' + $join.call(xs, ', ') + ' ]';\n }\n if (isError(obj)) {\n var parts = arrObjKeys(obj, inspect);\n if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {\n return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';\n }\n if (parts.length === 0) { return '[' + String(obj) + ']'; }\n return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';\n }\n if (typeof obj === 'object' && customInspect) {\n if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {\n return utilInspect(obj, { depth: maxDepth - depth });\n } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {\n return obj.inspect();\n }\n }\n if (isMap(obj)) {\n var mapParts = [];\n if (mapForEach) {\n mapForEach.call(obj, function (value, key) {\n mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));\n });\n }\n return collectionOf('Map', mapSize.call(obj), mapParts, indent);\n }\n if (isSet(obj)) {\n var setParts = [];\n if (setForEach) {\n setForEach.call(obj, function (value) {\n setParts.push(inspect(value, obj));\n });\n }\n return collectionOf('Set', setSize.call(obj), setParts, indent);\n }\n if (isWeakMap(obj)) {\n return weakCollectionOf('WeakMap');\n }\n if (isWeakSet(obj)) {\n return weakCollectionOf('WeakSet');\n }\n if (isWeakRef(obj)) {\n return weakCollectionOf('WeakRef');\n }\n if (isNumber(obj)) {\n return markBoxed(inspect(Number(obj)));\n }\n if (isBigInt(obj)) {\n return markBoxed(inspect(bigIntValueOf.call(obj)));\n }\n if (isBoolean(obj)) {\n return markBoxed(booleanValueOf.call(obj));\n }\n if (isString(obj)) {\n return markBoxed(inspect(String(obj)));\n }\n // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other\n /* eslint-env browser */\n if (typeof window !== 'undefined' && obj === window) {\n return '{ [object Window] }';\n }\n if (\n (typeof globalThis !== 'undefined' && obj === globalThis)\n || (typeof global !== 'undefined' && obj === global)\n ) {\n return '{ [object globalThis] }';\n }\n if (!isDate(obj) && !isRegExp(obj)) {\n var ys = arrObjKeys(obj, inspect);\n var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;\n var protoTag = obj instanceof Object ? '' : 'null prototype';\n var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';\n var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';\n var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');\n if (ys.length === 0) { return tag + '{}'; }\n if (indent) {\n return tag + '{' + indentedJoin(ys, indent) + '}';\n }\n return tag + '{ ' + $join.call(ys, ', ') + ' }';\n }\n return String(obj);\n};\n\nfunction wrapQuotes(s, defaultStyle, opts) {\n var style = opts.quoteStyle || defaultStyle;\n var quoteChar = quotes[style];\n return quoteChar + s + quoteChar;\n}\n\nfunction quote(s) {\n return $replace.call(String(s), /\"/g, '"');\n}\n\nfunction canTrustToString(obj) {\n return !toStringTag || !(typeof obj === 'object' && (toStringTag in obj || typeof obj[toStringTag] !== 'undefined'));\n}\nfunction isArray(obj) { return toStr(obj) === '[object Array]' && canTrustToString(obj); }\nfunction isDate(obj) { return toStr(obj) === '[object Date]' && canTrustToString(obj); }\nfunction isRegExp(obj) { return toStr(obj) === '[object RegExp]' && canTrustToString(obj); }\nfunction isError(obj) { return toStr(obj) === '[object Error]' && canTrustToString(obj); }\nfunction isString(obj) { return toStr(obj) === '[object String]' && canTrustToString(obj); }\nfunction isNumber(obj) { return toStr(obj) === '[object Number]' && canTrustToString(obj); }\nfunction isBoolean(obj) { return toStr(obj) === '[object Boolean]' && canTrustToString(obj); }\n\n// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives\nfunction isSymbol(obj) {\n if (hasShammedSymbols) {\n return obj && typeof obj === 'object' && obj instanceof Symbol;\n }\n if (typeof obj === 'symbol') {\n return true;\n }\n if (!obj || typeof obj !== 'object' || !symToString) {\n return false;\n }\n try {\n symToString.call(obj);\n return true;\n } catch (e) {}\n return false;\n}\n\nfunction isBigInt(obj) {\n if (!obj || typeof obj !== 'object' || !bigIntValueOf) {\n return false;\n }\n try {\n bigIntValueOf.call(obj);\n return true;\n } catch (e) {}\n return false;\n}\n\nvar hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };\nfunction has(obj, key) {\n return hasOwn.call(obj, key);\n}\n\nfunction toStr(obj) {\n return objectToString.call(obj);\n}\n\nfunction nameOf(f) {\n if (f.name) { return f.name; }\n var m = $match.call(functionToString.call(f), /^function\\s*([\\w$]+)/);\n if (m) { return m[1]; }\n return null;\n}\n\nfunction indexOf(xs, x) {\n if (xs.indexOf) { return xs.indexOf(x); }\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) { return i; }\n }\n return -1;\n}\n\nfunction isMap(x) {\n if (!mapSize || !x || typeof x !== 'object') {\n return false;\n }\n try {\n mapSize.call(x);\n try {\n setSize.call(x);\n } catch (s) {\n return true;\n }\n return x instanceof Map; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakMap(x) {\n if (!weakMapHas || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakMapHas.call(x, weakMapHas);\n try {\n weakSetHas.call(x, weakSetHas);\n } catch (s) {\n return true;\n }\n return x instanceof WeakMap; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakRef(x) {\n if (!weakRefDeref || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakRefDeref.call(x);\n return true;\n } catch (e) {}\n return false;\n}\n\nfunction isSet(x) {\n if (!setSize || !x || typeof x !== 'object') {\n return false;\n }\n try {\n setSize.call(x);\n try {\n mapSize.call(x);\n } catch (m) {\n return true;\n }\n return x instanceof Set; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakSet(x) {\n if (!weakSetHas || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakSetHas.call(x, weakSetHas);\n try {\n weakMapHas.call(x, weakMapHas);\n } catch (s) {\n return true;\n }\n return x instanceof WeakSet; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isElement(x) {\n if (!x || typeof x !== 'object') { return false; }\n if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {\n return true;\n }\n return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';\n}\n\nfunction inspectString(str, opts) {\n if (str.length > opts.maxStringLength) {\n var remaining = str.length - opts.maxStringLength;\n var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');\n return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;\n }\n var quoteRE = quoteREs[opts.quoteStyle || 'single'];\n quoteRE.lastIndex = 0;\n // eslint-disable-next-line no-control-regex\n var s = $replace.call($replace.call(str, quoteRE, '\\\\$1'), /[\\x00-\\x1f]/g, lowbyte);\n return wrapQuotes(s, 'single', opts);\n}\n\nfunction lowbyte(c) {\n var n = c.charCodeAt(0);\n var x = {\n 8: 'b',\n 9: 't',\n 10: 'n',\n 12: 'f',\n 13: 'r'\n }[n];\n if (x) { return '\\\\' + x; }\n return '\\\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));\n}\n\nfunction markBoxed(str) {\n return 'Object(' + str + ')';\n}\n\nfunction weakCollectionOf(type) {\n return type + ' { ? }';\n}\n\nfunction collectionOf(type, size, entries, indent) {\n var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');\n return type + ' (' + size + ') {' + joinedEntries + '}';\n}\n\nfunction singleLineValues(xs) {\n for (var i = 0; i < xs.length; i++) {\n if (indexOf(xs[i], '\\n') >= 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction getIndent(opts, depth) {\n var baseIndent;\n if (opts.indent === '\\t') {\n baseIndent = '\\t';\n } else if (typeof opts.indent === 'number' && opts.indent > 0) {\n baseIndent = $join.call(Array(opts.indent + 1), ' ');\n } else {\n return null;\n }\n return {\n base: baseIndent,\n prev: $join.call(Array(depth + 1), baseIndent)\n };\n}\n\nfunction indentedJoin(xs, indent) {\n if (xs.length === 0) { return ''; }\n var lineJoiner = '\\n' + indent.prev + indent.base;\n return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\\n' + indent.prev;\n}\n\nfunction arrObjKeys(obj, inspect) {\n var isArr = isArray(obj);\n var xs = [];\n if (isArr) {\n xs.length = obj.length;\n for (var i = 0; i < obj.length; i++) {\n xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';\n }\n }\n var syms = typeof gOPS === 'function' ? gOPS(obj) : [];\n var symMap;\n if (hasShammedSymbols) {\n symMap = {};\n for (var k = 0; k < syms.length; k++) {\n symMap['$' + syms[k]] = syms[k];\n }\n }\n\n for (var key in obj) { // eslint-disable-line no-restricted-syntax\n if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {\n // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section\n continue; // eslint-disable-line no-restricted-syntax, no-continue\n } else if ($test.call(/[^\\w$]/, key)) {\n xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));\n } else {\n xs.push(key + ': ' + inspect(obj[key], obj));\n }\n }\n if (typeof gOPS === 'function') {\n for (var j = 0; j < syms.length; j++) {\n if (isEnumerable.call(obj, syms[j])) {\n xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));\n }\n }\n }\n return xs;\n}\n","'use strict';\n\nvar inspect = require('object-inspect');\n\nvar $TypeError = require('es-errors/type');\n\n/*\n* This function traverses the list returning the node corresponding to the given key.\n*\n* That node is also moved to the head of the list, so that if it's accessed again we don't need to traverse the whole list.\n* By doing so, all the recently used nodes can be accessed relatively quickly.\n*/\n/** @type {import('./list.d.ts').listGetNode} */\n// eslint-disable-next-line consistent-return\nvar listGetNode = function (list, key, isDelete) {\n\t/** @type {typeof list | NonNullable<(typeof list)['next']>} */\n\tvar prev = list;\n\t/** @type {(typeof list)['next']} */\n\tvar curr;\n\t// eslint-disable-next-line eqeqeq\n\tfor (; (curr = prev.next) != null; prev = curr) {\n\t\tif (curr.key === key) {\n\t\t\tprev.next = curr.next;\n\t\t\tif (!isDelete) {\n\t\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t\tcurr.next = /** @type {NonNullable<typeof list.next>} */ (list.next);\n\t\t\t\tlist.next = curr; // eslint-disable-line no-param-reassign\n\t\t\t}\n\t\t\treturn curr;\n\t\t}\n\t}\n};\n\n/** @type {import('./list.d.ts').listGet} */\nvar listGet = function (objects, key) {\n\tif (!objects) {\n\t\treturn void undefined;\n\t}\n\tvar node = listGetNode(objects, key);\n\treturn node && node.value;\n};\n/** @type {import('./list.d.ts').listSet} */\nvar listSet = function (objects, key, value) {\n\tvar node = listGetNode(objects, key);\n\tif (node) {\n\t\tnode.value = value;\n\t} else {\n\t\t// Prepend the new node to the beginning of the list\n\t\tobjects.next = /** @type {import('./list.d.ts').ListNode<typeof value, typeof key>} */ ({ // eslint-disable-line no-param-reassign, no-extra-parens\n\t\t\tkey: key,\n\t\t\tnext: objects.next,\n\t\t\tvalue: value\n\t\t});\n\t}\n};\n/** @type {import('./list.d.ts').listHas} */\nvar listHas = function (objects, key) {\n\tif (!objects) {\n\t\treturn false;\n\t}\n\treturn !!listGetNode(objects, key);\n};\n/** @type {import('./list.d.ts').listDelete} */\n// eslint-disable-next-line consistent-return\nvar listDelete = function (objects, key) {\n\tif (objects) {\n\t\treturn listGetNode(objects, key, true);\n\t}\n};\n\n/** @type {import('.')} */\nmodule.exports = function getSideChannelList() {\n\t/** @typedef {ReturnType<typeof getSideChannelList>} Channel */\n\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t/** @type {import('./list.d.ts').RootNode<V, K> | undefined} */ var $o;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\tvar deletedNode = listDelete($o, key);\n\t\t\tif (deletedNode && $o && !$o.next) {\n\t\t\t\t$o = void undefined;\n\t\t\t}\n\t\t\treturn !!deletedNode;\n\t\t},\n\t\tget: function (key) {\n\t\t\treturn listGet($o, key);\n\t\t},\n\t\thas: function (key) {\n\t\t\treturn listHas($o, key);\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$o) {\n\t\t\t\t// Initialize the linked list as an empty node, so that we don't have to special-case handling of the first node: we can always refer to it as (previous node).next, instead of something like (list).head\n\t\t\t\t$o = {\n\t\t\t\t\tnext: void undefined\n\t\t\t\t};\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\tlistSet(/** @type {NonNullable<typeof $o>} */ ($o), key, value);\n\t\t}\n\t};\n\treturn channel;\n};\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Object;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Error;\n","'use strict';\n\n/** @type {import('./eval')} */\nmodule.exports = EvalError;\n","'use strict';\n\n/** @type {import('./range')} */\nmodule.exports = RangeError;\n","'use strict';\n\n/** @type {import('./ref')} */\nmodule.exports = ReferenceError;\n","'use strict';\n\n/** @type {import('./syntax')} */\nmodule.exports = SyntaxError;\n","'use strict';\n\n/** @type {import('./uri')} */\nmodule.exports = URIError;\n","'use strict';\n\n/** @type {import('./abs')} */\nmodule.exports = Math.abs;\n","'use strict';\n\n/** @type {import('./floor')} */\nmodule.exports = Math.floor;\n","'use strict';\n\n/** @type {import('./max')} */\nmodule.exports = Math.max;\n","'use strict';\n\n/** @type {import('./min')} */\nmodule.exports = Math.min;\n","'use strict';\n\n/** @type {import('./pow')} */\nmodule.exports = Math.pow;\n","'use strict';\n\n/** @type {import('./round')} */\nmodule.exports = Math.round;\n","'use strict';\n\n/** @type {import('./isNaN')} */\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n","'use strict';\n\nvar $isNaN = require('./isNaN');\n\n/** @type {import('./sign')} */\nmodule.exports = function sign(number) {\n\tif ($isNaN(number) || number === 0) {\n\t\treturn number;\n\t}\n\treturn number < 0 ? -1 : +1;\n};\n","'use strict';\n\n/** @type {import('./gOPD')} */\nmodule.exports = Object.getOwnPropertyDescriptor;\n","'use strict';\n\n/** @type {import('.')} */\nvar $gOPD = require('./gOPD');\n\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n","'use strict';\n\n/** @type {import('.')} */\nvar $defineProperty = Object.defineProperty || false;\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = false;\n\t}\n}\n\nmodule.exports = $defineProperty;\n","'use strict';\n\n/** @type {import('./shams')} */\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\t/** @type {{ [k in symbol]?: unknown }} */\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\t// eslint-disable-next-line no-extra-parens\n\t\tvar descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/** @type {import('./Reflect.getPrototypeOf')} */\nmodule.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;\n","'use strict';\n\nvar $Object = require('es-object-atoms');\n\n/** @type {import('./Object.getPrototypeOf')} */\nmodule.exports = $Object.getPrototypeOf || null;\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar toStr = Object.prototype.toString;\nvar max = Math.max;\nvar funcType = '[object Function]';\n\nvar concatty = function concatty(a, b) {\n var arr = [];\n\n for (var i = 0; i < a.length; i += 1) {\n arr[i] = a[i];\n }\n for (var j = 0; j < b.length; j += 1) {\n arr[j + a.length] = b[j];\n }\n\n return arr;\n};\n\nvar slicy = function slicy(arrLike, offset) {\n var arr = [];\n for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {\n arr[j] = arrLike[i];\n }\n return arr;\n};\n\nvar joiny = function (arr, joiner) {\n var str = '';\n for (var i = 0; i < arr.length; i += 1) {\n str += arr[i];\n if (i + 1 < arr.length) {\n str += joiner;\n }\n }\n return str;\n};\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.apply(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slicy(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n concatty(args, arguments)\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n }\n return target.apply(\n that,\n concatty(args, arguments)\n );\n\n };\n\n var boundLength = max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs[i] = '$' + i;\n }\n\n bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\n/** @type {import('./functionCall')} */\nmodule.exports = Function.prototype.call;\n","'use strict';\n\n/** @type {import('./functionApply')} */\nmodule.exports = Function.prototype.apply;\n","'use strict';\n\n/** @type {import('./reflectApply')} */\nmodule.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;\n","'use strict';\n\nvar bind = require('function-bind');\n\nvar $apply = require('./functionApply');\nvar $call = require('./functionCall');\nvar $reflectApply = require('./reflectApply');\n\n/** @type {import('./actualApply')} */\nmodule.exports = $reflectApply || bind.call($call, $apply);\n","'use strict';\n\nvar bind = require('function-bind');\nvar $TypeError = require('es-errors/type');\n\nvar $call = require('./functionCall');\nvar $actualApply = require('./actualApply');\n\n/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */\nmodule.exports = function callBindBasic(args) {\n\tif (args.length < 1 || typeof args[0] !== 'function') {\n\t\tthrow new $TypeError('a function is required');\n\t}\n\treturn $actualApply(bind, $call, args);\n};\n","'use strict';\n\nvar callBind = require('call-bind-apply-helpers');\nvar gOPD = require('gopd');\n\nvar hasProtoAccessor;\ntry {\n\t// eslint-disable-next-line no-extra-parens, no-proto\n\thasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;\n} catch (e) {\n\tif (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {\n\t\tthrow e;\n\t}\n}\n\n// eslint-disable-next-line no-extra-parens\nvar desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));\n\nvar $Object = Object;\nvar $getPrototypeOf = $Object.getPrototypeOf;\n\n/** @type {import('./get')} */\nmodule.exports = desc && typeof desc.get === 'function'\n\t? callBind([desc.get])\n\t: typeof $getPrototypeOf === 'function'\n\t\t? /** @type {import('./get')} */ function getDunder(value) {\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\treturn $getPrototypeOf(value == null ? value : $Object(value));\n\t\t}\n\t\t: false;\n","'use strict';\n\nvar reflectGetProto = require('./Reflect.getPrototypeOf');\nvar originalGetProto = require('./Object.getPrototypeOf');\n\nvar getDunderProto = require('dunder-proto/get');\n\n/** @type {import('.')} */\nmodule.exports = reflectGetProto\n\t? function getProto(O) {\n\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\treturn reflectGetProto(O);\n\t}\n\t: originalGetProto\n\t\t? function getProto(O) {\n\t\t\tif (!O || (typeof O !== 'object' && typeof O !== 'function')) {\n\t\t\t\tthrow new TypeError('getProto: not an object');\n\t\t\t}\n\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\treturn originalGetProto(O);\n\t\t}\n\t\t: getDunderProto\n\t\t\t? function getProto(O) {\n\t\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\t\treturn getDunderProto(O);\n\t\t\t}\n\t\t\t: null;\n","'use strict';\n\nvar call = Function.prototype.call;\nvar $hasOwn = Object.prototype.hasOwnProperty;\nvar bind = require('function-bind');\n\n/** @type {import('.')} */\nmodule.exports = bind.call(call, $hasOwn);\n","'use strict';\n\nvar undefined;\n\nvar $Object = require('es-object-atoms');\n\nvar $Error = require('es-errors');\nvar $EvalError = require('es-errors/eval');\nvar $RangeError = require('es-errors/range');\nvar $ReferenceError = require('es-errors/ref');\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\nvar $URIError = require('es-errors/uri');\n\nvar abs = require('math-intrinsics/abs');\nvar floor = require('math-intrinsics/floor');\nvar max = require('math-intrinsics/max');\nvar min = require('math-intrinsics/min');\nvar pow = require('math-intrinsics/pow');\nvar round = require('math-intrinsics/round');\nvar sign = require('math-intrinsics/sign');\n\nvar $Function = Function;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = require('gopd');\nvar $defineProperty = require('es-define-property');\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = require('get-proto');\nvar $ObjectGPO = require('get-proto/Object.getPrototypeOf');\nvar $ReflectGPO = require('get-proto/Reflect.getPrototypeOf');\n\nvar $apply = require('call-bind-apply-helpers/functionApply');\nvar $call = require('call-bind-apply-helpers/functionCall');\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t__proto__: null,\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,\n\t'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': $Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': $EvalError,\n\t'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': $Object,\n\t'%Object.getOwnPropertyDescriptor%': $gOPD,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': $RangeError,\n\t'%ReferenceError%': $ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': $URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\n\t'%Function.prototype.call%': $call,\n\t'%Function.prototype.apply%': $apply,\n\t'%Object.defineProperty%': $defineProperty,\n\t'%Object.getPrototypeOf%': $ObjectGPO,\n\t'%Math.abs%': abs,\n\t'%Math.floor%': floor,\n\t'%Math.max%': max,\n\t'%Math.min%': min,\n\t'%Math.pow%': pow,\n\t'%Math.round%': round,\n\t'%Math.sign%': sign,\n\t'%Reflect.getPrototypeOf%': $ReflectGPO\n};\n\nif (getProto) {\n\ttry {\n\t\tnull.error; // eslint-disable-line no-unused-expressions\n\t} catch (e) {\n\t\t// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229\n\t\tvar errorProto = getProto(getProto(e));\n\t\tINTRINSICS['%Error.prototype%'] = errorProto;\n\t}\n}\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen && getProto) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t__proto__: null,\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('hasown');\nvar $concat = bind.call($call, Array.prototype.concat);\nvar $spliceApply = bind.call($apply, Array.prototype.splice);\nvar $replace = bind.call($call, String.prototype.replace);\nvar $strSlice = bind.call($call, String.prototype.slice);\nvar $exec = bind.call($call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBindBasic = require('call-bind-apply-helpers');\n\n/** @type {(thisArg: string, searchString: string, position?: number) => number} */\nvar $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]);\n\n/** @type {import('.')} */\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\t/* eslint no-extra-parens: 0 */\n\n\tvar intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing));\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBindBasic(/** @type {const} */ ([intrinsic]));\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar callBound = require('call-bound');\nvar inspect = require('object-inspect');\n\nvar $TypeError = require('es-errors/type');\nvar $Map = GetIntrinsic('%Map%', true);\n\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => V} */\nvar $mapGet = callBound('Map.prototype.get', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K, value: V) => void} */\nvar $mapSet = callBound('Map.prototype.set', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => boolean} */\nvar $mapHas = callBound('Map.prototype.has', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => boolean} */\nvar $mapDelete = callBound('Map.prototype.delete', true);\n/** @type {<K, V>(thisArg: Map<K, V>) => number} */\nvar $mapSize = callBound('Map.prototype.size', true);\n\n/** @type {import('.')} */\nmodule.exports = !!$Map && /** @type {Exclude<import('.'), false>} */ function getSideChannelMap() {\n\t/** @typedef {ReturnType<typeof getSideChannelMap>} Channel */\n\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t/** @type {Map<K, V> | undefined} */ var $m;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\tif ($m) {\n\t\t\t\tvar result = $mapDelete($m, key);\n\t\t\t\tif ($mapSize($m) === 0) {\n\t\t\t\t\t$m = void undefined;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tget: function (key) { // eslint-disable-line consistent-return\n\t\t\tif ($m) {\n\t\t\t\treturn $mapGet($m, key);\n\t\t\t}\n\t\t},\n\t\thas: function (key) {\n\t\t\tif ($m) {\n\t\t\t\treturn $mapHas($m, key);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$m) {\n\t\t\t\t// @ts-expect-error TS can't handle narrowing a variable inside a closure\n\t\t\t\t$m = new $Map();\n\t\t\t}\n\t\t\t$mapSet($m, key, value);\n\t\t}\n\t};\n\n\t// @ts-expect-error TODO: figure out why TS is erroring here\n\treturn channel;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar callBound = require('call-bound');\nvar inspect = require('object-inspect');\nvar getSideChannelMap = require('side-channel-map');\n\nvar $TypeError = require('es-errors/type');\nvar $WeakMap = GetIntrinsic('%WeakMap%', true);\n\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => V} */\nvar $weakMapGet = callBound('WeakMap.prototype.get', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K, value: V) => void} */\nvar $weakMapSet = callBound('WeakMap.prototype.set', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => boolean} */\nvar $weakMapHas = callBound('WeakMap.prototype.has', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => boolean} */\nvar $weakMapDelete = callBound('WeakMap.prototype.delete', true);\n\n/** @type {import('.')} */\nmodule.exports = $WeakMap\n\t? /** @type {Exclude<import('.'), false>} */ function getSideChannelWeakMap() {\n\t\t/** @typedef {ReturnType<typeof getSideChannelWeakMap>} Channel */\n\t\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t\t/** @type {WeakMap<K & object, V> | undefined} */ var $wm;\n\t\t/** @type {Channel | undefined} */ var $m;\n\n\t\t/** @type {Channel} */\n\t\tvar channel = {\n\t\t\tassert: function (key) {\n\t\t\t\tif (!channel.has(key)) {\n\t\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t\t}\n\t\t\t},\n\t\t\t'delete': function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapDelete($wm, key);\n\t\t\t\t\t}\n\t\t\t\t} else if (getSideChannelMap) {\n\t\t\t\t\tif ($m) {\n\t\t\t\t\t\treturn $m['delete'](key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tget: function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapGet($wm, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $m && $m.get(key);\n\t\t\t},\n\t\t\thas: function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapHas($wm, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn !!$m && $m.has(key);\n\t\t\t},\n\t\t\tset: function (key, value) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif (!$wm) {\n\t\t\t\t\t\t$wm = new $WeakMap();\n\t\t\t\t\t}\n\t\t\t\t\t$weakMapSet($wm, key, value);\n\t\t\t\t} else if (getSideChannelMap) {\n\t\t\t\t\tif (!$m) {\n\t\t\t\t\t\t$m = getSideChannelMap();\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t\t\t/** @type {NonNullable<typeof $m>} */ ($m).set(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// @ts-expect-error TODO: figure out why this is erroring\n\t\treturn channel;\n\t}\n\t: getSideChannelMap;\n","'use strict';\n\nvar $TypeError = require('es-errors/type');\nvar inspect = require('object-inspect');\nvar getSideChannelList = require('side-channel-list');\nvar getSideChannelMap = require('side-channel-map');\nvar getSideChannelWeakMap = require('side-channel-weakmap');\n\nvar makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;\n\n/** @type {import('.')} */\nmodule.exports = function getSideChannel() {\n\t/** @typedef {ReturnType<typeof getSideChannel>} Channel */\n\n\t/** @type {Channel | undefined} */ var $channelData;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tvar keyDesc = key && Object(key) === key\n\t\t\t\t\t? 'the given object key'\n\t\t\t\t\t: inspect(key);\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + keyDesc);\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\treturn !!$channelData && $channelData['delete'](key);\n\t\t},\n\t\tget: function (key) {\n\t\t\treturn $channelData && $channelData.get(key);\n\t\t},\n\t\thas: function (key) {\n\t\t\treturn !!$channelData && $channelData.has(key);\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$channelData) {\n\t\t\t\t$channelData = makeChannel();\n\t\t\t}\n\n\t\t\t$channelData.set(key, value);\n\t\t}\n\t};\n\n\treturn channel;\n};\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nvar Format = {\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n\nmodule.exports = {\n 'default': Format.RFC3986,\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return String(value);\n }\n },\n RFC1738: Format.RFC1738,\n RFC3986: Format.RFC3986\n};\n","'use strict';\n\nvar formats = require('./formats');\nvar getSideChannel = require('side-channel');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\n// Track objects created from arrayLimit overflow using side-channel\n// Stores the current max numeric index for O(1) lookup\nvar overflowChannel = getSideChannel();\n\nvar markOverflow = function markOverflow(obj, maxIndex) {\n overflowChannel.set(obj, maxIndex);\n return obj;\n};\n\nvar isOverflow = function isOverflow(obj) {\n return overflowChannel.has(obj);\n};\n\nvar getMaxIndex = function getMaxIndex(obj) {\n return overflowChannel.get(obj);\n};\n\nvar setMaxIndex = function setMaxIndex(obj, maxIndex) {\n overflowChannel.set(obj, maxIndex);\n};\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array[array.length] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n while (queue.length > 1) {\n var item = queue.pop();\n var obj = item.obj[item.prop];\n\n if (isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted[compacted.length] = obj[j];\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? { __proto__: null } : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n /* eslint no-param-reassign: 0 */\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object' && typeof source !== 'function') {\n if (isArray(target)) {\n var nextIndex = target.length;\n if (options && typeof options.arrayLimit === 'number' && nextIndex > options.arrayLimit) {\n return markOverflow(arrayToObject(target.concat(source), options), nextIndex);\n }\n target[nextIndex] = source;\n } else if (target && typeof target === 'object') {\n if (isOverflow(target)) {\n // Add at next numeric index for overflow objects\n var newIndex = getMaxIndex(target) + 1;\n target[newIndex] = source;\n setMaxIndex(target, newIndex);\n } else if (options && options.strictMerge) {\n return [target, source];\n } else if (\n (options && (options.plainObjects || options.allowPrototypes))\n || !has.call(Object.prototype, source)\n ) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (!target || typeof target !== 'object') {\n if (isOverflow(source)) {\n // Create new object with target at 0, source values shifted by 1\n var sourceKeys = Object.keys(source);\n var result = options && options.plainObjects\n ? { __proto__: null, 0: target }\n : { 0: target };\n for (var m = 0; m < sourceKeys.length; m++) {\n var oldKey = parseInt(sourceKeys[m], 10);\n result[oldKey + 1] = source[sourceKeys[m]];\n }\n return markOverflow(result, getMaxIndex(source) + 1);\n }\n var combined = [target].concat(source);\n if (options && typeof options.arrayLimit === 'number' && combined.length > options.arrayLimit) {\n return markOverflow(arrayToObject(combined, options), combined.length - 1);\n }\n return combined;\n }\n\n var mergeTarget = target;\n if (isArray(target) && !isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (isArray(target) && isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n var targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n } else {\n target[target.length] = item;\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n\n if (isOverflow(source) && !isOverflow(acc)) {\n markOverflow(acc, getMaxIndex(source));\n }\n if (isOverflow(acc)) {\n var keyNum = parseInt(key, 10);\n if (String(keyNum) === key && keyNum >= 0 && keyNum > getMaxIndex(acc)) {\n setMaxIndex(acc, keyNum);\n }\n }\n\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str, defaultDecoder, charset) {\n var strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n } catch (e) {\n return strWithoutPlus;\n }\n};\n\nvar limit = 1024;\n\n/* eslint operator-linebreak: [2, \"before\"] */\n\nvar encode = function encode(str, defaultEncoder, charset, kind, format) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n } else if (typeof str !== 'string') {\n string = String(str);\n }\n\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n\n var out = '';\n for (var j = 0; j < string.length; j += limit) {\n var segment = string.length >= limit ? string.slice(j, j + limit) : string;\n var arr = [];\n\n for (var i = 0; i < segment.length; ++i) {\n var c = segment.charCodeAt(i);\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n ) {\n arr[arr.length] = segment.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n arr[arr.length] = hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n arr[arr.length] = hexTable[0xC0 | (c >> 6)]\n + hexTable[0x80 | (c & 0x3F)];\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n arr[arr.length] = hexTable[0xE0 | (c >> 12)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF));\n\n arr[arr.length] = hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n out += arr.join('');\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue[queue.length] = { obj: obj, prop: key };\n refs[refs.length] = val;\n }\n }\n }\n\n compactQueue(queue);\n\n return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b, arrayLimit, plainObjects) {\n // If 'a' is already an overflow object, add to it\n if (isOverflow(a)) {\n var newIndex = getMaxIndex(a) + 1;\n a[newIndex] = b;\n setMaxIndex(a, newIndex);\n return a;\n }\n\n var result = [].concat(a, b);\n if (result.length > arrayLimit) {\n return markOverflow(arrayToObject(result, { plainObjects: plainObjects }), result.length - 1);\n }\n return result;\n};\n\nvar maybeMap = function maybeMap(val, fn) {\n if (isArray(val)) {\n var mapped = [];\n for (var i = 0; i < val.length; i += 1) {\n mapped[mapped.length] = fn(val[i]);\n }\n return mapped;\n }\n return fn(val);\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n combine: combine,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isOverflow: isOverflow,\n isRegExp: isRegExp,\n markOverflow: markOverflow,\n maybeMap: maybeMap,\n merge: merge\n};\n","'use strict';\n\nvar getSideChannel = require('side-channel');\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) {\n return prefix + '[]';\n },\n comma: 'comma',\n indices: function indices(prefix, key) {\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) {\n return prefix;\n }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaultFormat = formats['default'];\nvar defaults = {\n addQueryPrefix: false,\n allowDots: false,\n allowEmptyArrays: false,\n arrayFormat: 'indices',\n charset: 'utf-8',\n charsetSentinel: false,\n commaRoundTrip: false,\n delimiter: '&',\n encode: true,\n encodeDotInKeys: false,\n encoder: utils.encode,\n encodeValuesOnly: false,\n filter: void undefined,\n format: defaultFormat,\n formatter: formats.formatters[defaultFormat],\n // deprecated\n indices: false,\n serializeDate: function serializeDate(date) {\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar isNonNullishPrimitive = function isNonNullishPrimitive(v) {\n return typeof v === 'string'\n || typeof v === 'number'\n || typeof v === 'boolean'\n || typeof v === 'symbol'\n || typeof v === 'bigint';\n};\n\nvar sentinel = {};\n\nvar stringify = function stringify(\n object,\n prefix,\n generateArrayPrefix,\n commaRoundTrip,\n allowEmptyArrays,\n strictNullHandling,\n skipNulls,\n encodeDotInKeys,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n format,\n formatter,\n encodeValuesOnly,\n charset,\n sideChannel\n) {\n var obj = object;\n\n var tmpSc = sideChannel;\n var step = 0;\n var findFlag = false;\n while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {\n // Where object last appeared in the ref tree\n var pos = tmpSc.get(object);\n step += 1;\n if (typeof pos !== 'undefined') {\n if (pos === step) {\n throw new RangeError('Cyclic object value');\n } else {\n findFlag = true; // Break while\n }\n }\n if (typeof tmpSc.get(sentinel) === 'undefined') {\n step = 0;\n }\n }\n\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n obj = utils.maybeMap(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate(value);\n }\n return value;\n });\n }\n\n if (obj === null) {\n if (strictNullHandling) {\n return formatter(encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix);\n }\n\n obj = '';\n }\n\n if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (generateArrayPrefix === 'comma' && isArray(obj)) {\n // we need to join elements in\n if (encodeValuesOnly && encoder) {\n obj = utils.maybeMap(obj, function (v) {\n return v == null ? v : encoder(v);\n });\n }\n objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n } else if (isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n var encodedPrefix = encodeDotInKeys ? String(prefix).replace(/\\./g, '%2E') : String(prefix);\n\n var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix;\n\n if (allowEmptyArrays && isArray(obj) && obj.length === 0) {\n return adjustedPrefix + '[]';\n }\n\n for (var j = 0; j < objKeys.length; ++j) {\n var key = objKeys[j];\n var value = typeof key === 'object' && key && typeof key.value !== 'undefined'\n ? key.value\n : obj[key];\n\n if (skipNulls && value === null) {\n continue;\n }\n\n var encodedKey = allowDots && encodeDotInKeys ? String(key).replace(/\\./g, '%2E') : String(key);\n var keyPrefix = isArray(obj)\n ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix\n : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']');\n\n sideChannel.set(object, step);\n var valueSideChannel = getSideChannel();\n valueSideChannel.set(sentinel, sideChannel);\n pushToArray(values, stringify(\n value,\n keyPrefix,\n generateArrayPrefix,\n commaRoundTrip,\n allowEmptyArrays,\n strictNullHandling,\n skipNulls,\n encodeDotInKeys,\n generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n format,\n formatter,\n encodeValuesOnly,\n charset,\n valueSideChannel\n ));\n }\n\n return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n\n if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {\n throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n\n if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n var format = formats['default'];\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formats.formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n var formatter = formats.formatters[format];\n\n var filter = defaults.filter;\n if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n filter = opts.filter;\n }\n\n var arrayFormat;\n if (opts.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = opts.arrayFormat;\n } else if ('indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = defaults.arrayFormat;\n }\n\n if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {\n throw new TypeError('`commaRoundTrip` must be a boolean, or absent');\n }\n\n var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;\n\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n arrayFormat: arrayFormat,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n commaRoundTrip: !!opts.commaRoundTrip,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n format: format,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = normalizeStringifyOptions(opts);\n\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat];\n var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (options.sort) {\n objKeys.sort(options.sort);\n }\n\n var sideChannel = getSideChannel();\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (typeof key === 'undefined' || key === null) {\n continue;\n }\n\n var value = obj[key];\n\n if (options.skipNulls && value === null) {\n continue;\n }\n pushToArray(keys, stringify(\n value,\n key,\n generateArrayPrefix,\n commaRoundTrip,\n options.allowEmptyArrays,\n options.strictNullHandling,\n options.skipNulls,\n options.encodeDotInKeys,\n options.encode ? options.encoder : null,\n options.filter,\n options.sort,\n options.allowDots,\n options.serializeDate,\n options.format,\n options.formatter,\n options.encodeValuesOnly,\n options.charset,\n sideChannel\n ));\n }\n\n var joined = keys.join(options.delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B' + options.delimiter;\n } else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93' + options.delimiter;\n }\n }\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar defaults = {\n allowDots: false,\n allowEmptyArrays: false,\n allowPrototypes: false,\n allowSparse: false,\n arrayLimit: 20,\n charset: 'utf-8',\n charsetSentinel: false,\n comma: false,\n decodeDotInKeys: false,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n duplicates: 'combine',\n ignoreQueryPrefix: false,\n interpretNumericEntities: false,\n parameterLimit: 1000,\n parseArrays: true,\n plainObjects: false,\n strictDepth: false,\n strictMerge: true,\n strictNullHandling: false,\n throwOnLimitExceeded: false\n};\n\nvar interpretNumericEntities = function (str) {\n return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n return String.fromCharCode(parseInt(numberStr, 10));\n });\n};\n\nvar parseArrayValue = function (val, options, currentArrayLength) {\n if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {\n return val.split(',');\n }\n\n if (options.throwOnLimitExceeded && currentArrayLength >= options.arrayLimit) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n }\n\n return val;\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = { __proto__: null };\n\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n cleanStr = cleanStr.replace(/%5B/gi, '[').replace(/%5D/gi, ']');\n\n var limit = options.parameterLimit === Infinity ? void undefined : options.parameterLimit;\n var parts = cleanStr.split(\n options.delimiter,\n options.throwOnLimitExceeded && typeof limit !== 'undefined' ? limit + 1 : limit\n );\n\n if (options.throwOnLimitExceeded && typeof limit !== 'undefined' && parts.length > limit) {\n throw new RangeError('Parameter limit exceeded. Only ' + limit + ' parameter' + (limit === 1 ? '' : 's') + ' allowed.');\n }\n\n var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n var i;\n\n var charset = options.charset;\n if (options.charsetSentinel) {\n for (i = 0; i < parts.length; ++i) {\n if (parts[i].indexOf('utf8=') === 0) {\n if (parts[i] === charsetSentinel) {\n charset = 'utf-8';\n } else if (parts[i] === isoSentinel) {\n charset = 'iso-8859-1';\n }\n skipIndex = i;\n i = parts.length; // The eslint settings do not allow break;\n }\n }\n }\n\n for (i = 0; i < parts.length; ++i) {\n if (i === skipIndex) {\n continue;\n }\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key;\n var val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder, charset, 'key');\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');\n\n if (key !== null) {\n val = utils.maybeMap(\n parseArrayValue(\n part.slice(pos + 1),\n options,\n isArray(obj[key]) ? obj[key].length : 0\n ),\n function (encodedVal) {\n return options.decoder(encodedVal, defaults.decoder, charset, 'value');\n }\n );\n }\n }\n\n if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n val = interpretNumericEntities(String(val));\n }\n\n if (part.indexOf('[]=') > -1) {\n val = isArray(val) ? [val] : val;\n }\n\n if (options.comma && isArray(val) && val.length > options.arrayLimit) {\n if (options.throwOnLimitExceeded) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n }\n val = utils.combine([], val, options.arrayLimit, options.plainObjects);\n }\n\n if (key !== null) {\n var existing = has.call(obj, key);\n if (existing && (options.duplicates === 'combine' || part.indexOf('[]=') > -1)) {\n obj[key] = utils.combine(\n obj[key],\n val,\n options.arrayLimit,\n options.plainObjects\n );\n } else if (!existing || options.duplicates === 'last') {\n obj[key] = val;\n }\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options, valuesParsed) {\n var currentArrayLength = 0;\n if (chain.length > 0 && chain[chain.length - 1] === '[]') {\n var parentKey = chain.slice(0, -1).join('');\n currentArrayLength = Array.isArray(val) && val[parentKey] ? val[parentKey].length : 0;\n }\n\n var leaf = valuesParsed ? val : parseArrayValue(val, options, currentArrayLength);\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]' && options.parseArrays) {\n if (utils.isOverflow(leaf)) {\n // leaf is already an overflow object, preserve it\n obj = leaf;\n } else {\n obj = options.allowEmptyArrays && (leaf === '' || (options.strictNullHandling && leaf === null))\n ? []\n : utils.combine(\n [],\n leaf,\n options.arrayLimit,\n options.plainObjects\n );\n }\n } else {\n obj = options.plainObjects ? { __proto__: null } : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot;\n var index = parseInt(decodedRoot, 10);\n var isValidArrayIndex = !isNaN(index)\n && root !== decodedRoot\n && String(index) === decodedRoot\n && index >= 0\n && options.parseArrays;\n if (!options.parseArrays && decodedRoot === '') {\n obj = { 0: leaf };\n } else if (isValidArrayIndex && index < options.arrayLimit) {\n obj = [];\n obj[index] = leaf;\n } else if (isValidArrayIndex && options.throwOnLimitExceeded) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n } else if (isValidArrayIndex) {\n obj[index] = leaf;\n utils.markOverflow(obj, index);\n } else if (decodedRoot !== '__proto__') {\n obj[decodedRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\n// Split a key like \"a[b][c[]]\" into ['a', '[b]', '[c[]]'] while preserving\n// qs parse semantics for depth/prototype guards.\nvar splitKeyIntoSegments = function splitKeyIntoSegments(originalKey, options) {\n var key = options.allowDots ? originalKey.replace(/\\.([^.[]+)/g, '[$1]') : originalKey;\n\n // depth <= 0 keeps the whole key as one segment\n if (options.depth <= 0) {\n if (!options.plainObjects && has.call(Object.prototype, key)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n return [key];\n }\n\n var segments = [];\n\n // parent before the first '[' (may be empty if key starts with '[')\n var first = key.indexOf('[');\n var parent = first >= 0 ? key.slice(0, first) : key;\n if (parent) {\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n segments[segments.length] = parent;\n }\n\n var n = key.length;\n var open = first;\n var collected = 0;\n\n while (open >= 0 && collected < options.depth) {\n var level = 1;\n var i = open + 1;\n var close = -1;\n\n // balance nested '[' and ']' inside this bracket group using a nesting level counter\n while (i < n && close < 0) {\n var cu = key.charCodeAt(i);\n if (cu === 0x5B) { // '['\n level += 1;\n } else if (cu === 0x5D) { // ']'\n level -= 1;\n if (level === 0) {\n close = i; // found matching close; loop will exit by condition\n }\n }\n i += 1;\n }\n\n if (close < 0) {\n // Unterminated group: wrap the raw remainder in one bracket pair so it stays\n // a single literal segment (e.g. \"[[]b\" -> \"[[]b]\"); we do not infer missing ']'.\n segments[segments.length] = '[' + key.slice(open) + ']';\n return segments;\n }\n\n var seg = key.slice(open, close + 1);\n // prototype guard for the content of this group\n var content = seg.slice(1, -1);\n if (!options.plainObjects && has.call(Object.prototype, content) && !options.allowPrototypes) {\n return;\n }\n\n segments[segments.length] = seg;\n collected += 1;\n\n // find the next '[' after this balanced group\n open = key.indexOf('[', close + 1);\n }\n\n if (open >= 0) {\n if (options.strictDepth === true) {\n throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');\n }\n\n segments[segments.length] = '[' + key.slice(open) + ']';\n }\n\n return segments;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {\n if (!givenKey) {\n return;\n }\n\n var keys = splitKeyIntoSegments(givenKey, options);\n\n if (!keys) {\n return;\n }\n\n return parseObject(keys, val, options, valuesParsed);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n\n if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') {\n throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n\n if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n if (typeof opts.throwOnLimitExceeded !== 'undefined' && typeof opts.throwOnLimitExceeded !== 'boolean') {\n throw new TypeError('`throwOnLimitExceeded` option must be a boolean');\n }\n\n var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates;\n\n if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') {\n throw new TypeError('The duplicates option must be either combine, first, or last');\n }\n\n var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;\n\n return {\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,\n arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys,\n decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n // eslint-disable-next-line no-implicit-coercion, no-extra-parens\n depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,\n duplicates: duplicates,\n ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n parseArrays: opts.parseArrays !== false,\n plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth,\n strictMerge: typeof opts.strictMerge === 'boolean' ? !!opts.strictMerge : defaults.strictMerge,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,\n throwOnLimitExceeded: typeof opts.throwOnLimitExceeded === 'boolean' ? opts.throwOnLimitExceeded : false\n };\n};\n\nmodule.exports = function (str, opts) {\n var options = normalizeParseOptions(opts);\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? { __proto__: null } : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? { __proto__: null } : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');\n obj = utils.merge(obj, newObj, options);\n }\n\n if (options.allowSparse === true) {\n return obj;\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","// src/bindings.tsx\nimport React from \"react\";\nimport {\n matchResourceFromRoute,\n ResourceContext,\n QS_PARSE_DEPTH\n} from \"@refinedev/core\";\nimport { useCallback, useContext } from \"react\";\nimport qs from \"qs\";\nimport {\n useNavigate,\n useLocation,\n Link,\n matchPath,\n useParams\n} from \"react-router\";\n\n// src/convert-to-number-if-possible.ts\nvar convertToNumberIfPossible = (value) => {\n if (typeof value === \"undefined\") {\n return value;\n }\n const num = Number(value);\n if (`${num}` === value) {\n return num;\n }\n return value;\n};\n\n// src/bindings.tsx\nvar stringifyConfig = {\n addQueryPrefix: true,\n skipNulls: true,\n arrayFormat: \"indices\",\n encode: false,\n encodeValuesOnly: true\n};\nvar routerProvider = {\n go: () => {\n const { search: existingSearch, hash: existingHash } = useLocation();\n const navigate = useNavigate();\n const fn = useCallback(\n ({\n to,\n type,\n query,\n hash,\n options: { keepQuery, keepHash } = {}\n }) => {\n const urlQuery = {\n ...keepQuery && existingSearch && qs.parse(existingSearch, {\n ignoreQueryPrefix: true,\n depth: QS_PARSE_DEPTH\n }),\n ...query\n };\n if (urlQuery.to) {\n urlQuery.to = encodeURIComponent(`${urlQuery.to}`);\n }\n const hasUrlQuery = Object.keys(urlQuery).length > 0;\n const urlHash = `#${(hash || keepHash && existingHash || \"\").replace(\n /^#/,\n \"\"\n )}`;\n const hasUrlHash = urlHash.length > 1;\n const urlTo = to || \"\";\n const fullPath = `${urlTo}${hasUrlQuery ? qs.stringify(urlQuery, stringifyConfig) : \"\"}${hasUrlHash ? urlHash : \"\"}`;\n if (type === \"path\") {\n return fullPath;\n }\n navigate(fullPath, {\n replace: type === \"replace\"\n });\n return;\n },\n [existingHash, existingSearch, navigate]\n );\n return fn;\n },\n back: () => {\n const navigate = useNavigate();\n const fn = useCallback(() => {\n navigate(-1);\n }, [navigate]);\n return fn;\n },\n parse: () => {\n var _a;\n let params = useParams();\n const { pathname, search } = useLocation();\n const { resources } = useContext(ResourceContext);\n const { resource, action, matchedRoute } = React.useMemo(() => {\n return matchResourceFromRoute(pathname, resources);\n }, [resources, pathname]);\n if (Object.entries(params).length === 0 && matchedRoute) {\n params = ((_a = matchPath(matchedRoute, pathname)) == null ? void 0 : _a.params) || {};\n }\n const fn = useCallback(() => {\n const parsedSearch = qs.parse(search, {\n ignoreQueryPrefix: true,\n depth: QS_PARSE_DEPTH\n });\n const combinedParams = {\n ...params,\n ...parsedSearch\n };\n const response = {\n ...resource && { resource },\n ...action && { action },\n ...(params == null ? void 0 : params.id) && { id: decodeURIComponent(params.id) },\n // ...(params?.action && { action: params.action }), // lets see if there is a need for this\n pathname,\n params: {\n ...combinedParams,\n currentPage: convertToNumberIfPossible(\n combinedParams.currentPage\n ),\n pageSize: convertToNumberIfPossible(\n combinedParams.pageSize\n ),\n to: combinedParams.to ? decodeURIComponent(combinedParams.to) : void 0\n }\n };\n return response;\n }, [pathname, search, params, resource, action]);\n return fn;\n },\n Link: React.forwardRef(function RefineLink(props, ref) {\n return /* @__PURE__ */ React.createElement(Link, { to: props.to, ...props, ref });\n })\n};\n\n// src/navigate-to-resource.tsx\nimport { useResourceParams, useGetToPath } from \"@refinedev/core\";\nimport React2 from \"react\";\nimport { Navigate } from \"react-router\";\nvar NavigateToResource = ({\n resource: resourceProp,\n fallbackTo,\n meta\n}) => {\n const getToPath = useGetToPath();\n const { resource, resources } = useResourceParams({\n resource: resourceProp\n });\n const toResource = resource || resources.find((r) => r.list);\n if (toResource) {\n const path = getToPath({\n resource: toResource,\n action: \"list\",\n meta\n });\n if (path) {\n return /* @__PURE__ */ React2.createElement(Navigate, { to: path });\n }\n return null;\n }\n if (fallbackTo) {\n console.warn(`No resource is found. navigation to ${fallbackTo}.`);\n return /* @__PURE__ */ React2.createElement(Navigate, { to: fallbackTo });\n }\n console.warn(\n 'No resource and \"fallbackTo\" is found. No navigation will be made.'\n );\n return null;\n};\n\n// src/unsaved-changes-notifier.tsx\nimport React4 from \"react\";\nimport { useTranslate, useWarnAboutChange } from \"@refinedev/core\";\n\n// src/use-prompt-workaround.ts\nimport React3 from \"react\";\nimport { UNSAFE_NavigationContext as NavigationContext } from \"react-router\";\nfunction useConfirmExit(confirmExit, when = true) {\n const { navigator } = React3.useContext(NavigationContext);\n React3.useEffect(() => {\n if (!when) {\n return;\n }\n const go = navigator.go;\n const push = navigator.push;\n navigator.push = (...args) => {\n const result = confirmExit();\n if (result !== false) {\n push(...args);\n }\n };\n navigator.go = (...args) => {\n const result = confirmExit();\n if (result !== false) {\n go(...args);\n }\n };\n return () => {\n navigator.push = push;\n navigator.go = go;\n };\n }, [navigator, confirmExit, when]);\n}\nfunction usePrompt(message, when = true, onConfirm) {\n const warnWhenListener = React3.useCallback(\n (e) => {\n e.preventDefault();\n e.returnValue = message;\n return e.returnValue;\n },\n [message]\n );\n React3.useEffect(() => {\n if (when) {\n window.addEventListener(\"beforeunload\", warnWhenListener);\n }\n return () => {\n window.removeEventListener(\"beforeunload\", warnWhenListener);\n };\n }, [warnWhenListener, when]);\n const confirmExit = React3.useCallback(() => {\n const confirm = window.confirm(message);\n if (confirm && onConfirm) {\n onConfirm();\n }\n return confirm;\n }, [message]);\n useConfirmExit(confirmExit, when);\n}\n\n// src/unsaved-changes-notifier.tsx\nimport { useLocation as useLocation2 } from \"react-router\";\nvar UnsavedChangesNotifier = ({\n translationKey = \"warnWhenUnsavedChanges\",\n message = \"Are you sure you want to leave? You have unsaved changes.\"\n}) => {\n const translate = useTranslate();\n const { pathname } = useLocation2();\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n React4.useEffect(() => {\n return () => setWarnWhen == null ? void 0 : setWarnWhen(false);\n }, [pathname]);\n const warnMessage = React4.useMemo(() => {\n return translate(translationKey, message);\n }, [translationKey, message, translate]);\n usePrompt(warnMessage, warnWhen, () => {\n setWarnWhen == null ? void 0 : setWarnWhen(false);\n });\n return null;\n};\n\n// src/catch-all-navigate.tsx\nimport React5 from \"react\";\nimport { Navigate as Navigate2, useLocation as useLocation3 } from \"react-router\";\nvar CatchAllNavigate = ({ to }) => {\n const { pathname, search } = useLocation3();\n const queryValue = `${pathname}${search}`;\n const query = queryValue.length > 1 ? `?to=${encodeURIComponent(queryValue)}` : \"\";\n return /* @__PURE__ */ React5.createElement(Navigate2, { to: `${to}${query}` });\n};\n\n// src/document-title-handler.tsx\nimport {\n useParsed,\n useTranslate as useTranslate2,\n generateDefaultDocumentTitle,\n useUserFriendlyName\n} from \"@refinedev/core\";\nimport React6, { useLayoutEffect } from \"react\";\nimport { useLocation as useLocation4 } from \"react-router\";\nfunction DocumentTitleHandler({ handler }) {\n var _a;\n const location = useLocation4();\n const { action, id, params, pathname, resource } = useParsed();\n const translate = useTranslate2();\n const getUserFriendlyName = useUserFriendlyName();\n const identifier = (resource == null ? void 0 : resource.identifier) ?? (resource == null ? void 0 : resource.name);\n const preferredLabel = (_a = resource == null ? void 0 : resource.meta) == null ? void 0 : _a.label;\n const resourceName = preferredLabel ?? getUserFriendlyName(identifier, action === \"list\" ? \"plural\" : \"singular\");\n const populatedLabel = translate(\n `${resource == null ? void 0 : resource.name}.${resource == null ? void 0 : resource.name}`,\n resourceName\n );\n useLayoutEffect(() => {\n const autoGeneratedTitle = generateDefaultDocumentTitle(\n translate,\n resource,\n action,\n `${id}`,\n resourceName,\n getUserFriendlyName\n );\n if (handler) {\n document.title = handler({\n action,\n resource: {\n ...resource ?? {},\n meta: {\n ...resource == null ? void 0 : resource.meta,\n label: populatedLabel\n }\n },\n params,\n pathname,\n autoGeneratedTitle\n });\n } else {\n document.title = autoGeneratedTitle;\n }\n }, [location]);\n return /* @__PURE__ */ React6.createElement(React6.Fragment, null);\n}\n\n// src/use-document-title.ts\nimport { useTranslate as useTranslate3 } from \"@refinedev/core\";\nimport { useEffect } from \"react\";\nvar useDocumentTitle = (title) => {\n const translate = useTranslate3();\n useEffect(() => {\n if (!title)\n return;\n if (typeof title === \"string\") {\n document.title = translate(title);\n } else {\n document.title = translate(title.i18nKey);\n }\n }, [title]);\n return (title2) => {\n if (typeof title2 === \"string\") {\n document.title = translate(title2);\n } else {\n document.title = translate(title2.i18nKey);\n }\n };\n};\nexport {\n CatchAllNavigate,\n DocumentTitleHandler,\n NavigateToResource,\n UnsavedChangesNotifier,\n routerProvider as default,\n stringifyConfig,\n useDocumentTitle\n};\n//# sourceMappingURL=index.mjs.map","import { useMemo } from \"react\";\nimport { useGetIdentity, useLogout } from \"@refinedev/core\";\nimport { useTranslation } from \"../../../hooks\";\nimport { useSystemConfig } from \"../../../providers/SystemConfigProvider\";\nimport { fetchWithCredentials } from \"../../../api\";\nimport { API_URL } from \"../../../constants\";\nimport {\n MStack,\n XStack,\n Button,\n YStack,\n Paragraph,\n useTheme,\n Avatar,\n Popover,\n Separator,\n Icon,\n MText,\n LocaleSwitcher,\n} from \"@framework-m/ui\";\n\nexport interface PrimaryRailProps {\n apps: Array<{\n app_id: string;\n label: string;\n icon: string;\n resources: any[];\n }>;\n activeAppId: string;\n onAppSelect: (appId: string) => void;\n isMobile?: boolean;\n}\n\nexport function PrimaryRail({\n apps,\n activeAppId,\n onAppSelect,\n isMobile = false,\n}: PrimaryRailProps) {\n const { t, language, changeLanguage } = useTranslation(\"desk\");\n const { data: identity } = useGetIdentity<{ id: string; name: string; email: string }>();\n const { mutate: logout } = useLogout();\n const { theme, setTheme } = useTheme();\n const { supportedLocales } = useSystemConfig();\n\n const getLocaleLabel = (code: string) => {\n const customMap: Record<string, string> = {\n en: \"English\",\n hi: \"हिन्दी\",\n ta: \"தமிழ்\",\n es: \"Español\",\n fr: \"Français\",\n mr: \"मराठी\",\n ur: \"اردو\",\n };\n if (customMap[code]) return customMap[code];\n try {\n const displayNames = new Intl.DisplayNames([code, \"en\"], { type: \"language\" });\n return displayNames.of(code) || code;\n } catch {\n return code;\n }\n };\n\n const localesList = useMemo(() => {\n return supportedLocales.map((locale) => ({\n code: locale.code,\n label: locale.label || getLocaleLabel(locale.code),\n }));\n }, [supportedLocales]);\n\n const handleLanguageChange = async (lng: string) => {\n await changeLanguage(lng);\n if (identity?.id) {\n try {\n const listResponse = await fetchWithCredentials(\n `${API_URL}/UserPreferences?filters=${encodeURIComponent(\n JSON.stringify([{ field: \"user_id\", operator: \"eq\", value: identity.id }])\n )}`\n );\n if (listResponse.ok) {\n const listData = (await listResponse.json()) as {\n items: Array<{ id: string; settings: Record<string, any> }>;\n };\n if (listData.items && listData.items.length > 0) {\n const existing = listData.items[0];\n await fetchWithCredentials(`${API_URL}/UserPreferences/${existing.id}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...existing,\n settings: {\n ...existing.settings,\n locale: lng,\n },\n }),\n });\n } else {\n await fetchWithCredentials(`${API_URL}/UserPreferences`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n user_id: identity.id,\n settings: {\n locale: lng,\n },\n }),\n });\n }\n }\n } catch (err) {\n console.error(\"Failed to sync locale preference to backend:\", err);\n }\n }\n };\n\n const userInitials = useMemo(() => {\n if (!identity?.name) return null;\n return identity.name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .substring(0, 2)\n .toUpperCase();\n }, [identity]);\n\n const isLoggedIn = !!identity;\n\n const isRtl = typeof document !== \"undefined\" && document.documentElement.dir === \"rtl\";\n\n const userPopoverContent = (\n <YStack minWidth={220}>\n <YStack padding=\"$md\" gap=\"$xs\">\n <Paragraph fontWeight=\"bold\" size=\"$sm\">\n {identity?.name || \"Anonymous\"}\n </Paragraph>\n <Paragraph size=\"$xs\" color=\"$colorMuted\">\n {identity?.email || \"Not signed in\"}\n </Paragraph>\n </YStack>\n\n <Separator />\n\n <YStack padding=\"$sm\" gap=\"$sm\">\n <XStack\n paddingHorizontal={8}\n paddingVertical={4}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"$sm\"\n >\n <MText size=\"$sm\" color=\"$colorMuted\">\n {t(\"Language\")}\n </MText>\n <LocaleSwitcher\n language={language}\n onChangeLanguage={handleLanguageChange}\n locales={localesList}\n />\n </XStack>\n\n <Separator />\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setTheme(theme === \"light\" ? \"dark\" : \"light\")}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name={theme === \"light\" ? \"moon\" : \"sun\"} size={16} />\n <MText size=\"$sm\">{theme === \"light\" ? \"Dark Mode\" : \"Light Mode\"}</MText>\n </Button>\n\n {isLoggedIn ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => logout()}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name=\"log-out\" size={16} />\n <MText size=\"$sm\">{t(\"Logout\")}</MText>\n </Button>\n ) : (\n <Button\n variant=\"primary\"\n size=\"sm\"\n onPress={() => {\n const to = encodeURIComponent(window.location.pathname + window.location.search);\n window.location.href = `/login?to=${to}`;\n }}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name=\"log-in\" size={16} color=\"white\" />\n <MText size=\"$sm\" color=\"white\">\n {t(\"Login\")}\n </MText>\n </Button>\n )}\n </YStack>\n </YStack>\n );\n\n const userMenu = (\n <Popover\n placement={isMobile ? (isRtl ? \"top-start\" : \"top-end\") : isRtl ? \"right-start\" : \"right-end\"}\n trigger={\n <Avatar\n fallback={userInitials || <Icon name=\"user\" size={20} color=\"$colorMuted\" />}\n size={36}\n circular\n borderWidth={1}\n borderColor=\"$borderColor\"\n />\n }\n content={userPopoverContent}\n />\n );\n\n return (\n <MStack\n flexDirection={isMobile ? \"row\" : \"column\"}\n width={isMobile ? \"100%\" : 64}\n height={isMobile ? 64 : \"100%\"}\n backgroundColor=\"$background\"\n borderRightWidth={isMobile ? 0 : 1}\n borderTopWidth={isMobile ? 1 : 0}\n borderColor=\"$borderColorMuted\"\n paddingVertical={isMobile ? \"$xs\" : \"$sm\"}\n paddingHorizontal={isMobile ? \"$md\" : \"$0\"}\n alignItems=\"center\"\n justifyContent={isMobile ? \"space-around\" : \"space-between\"}\n gap=\"$sm\"\n zIndex={isMobile ? 101 : 50}\n >\n {/* Top Section: App Icons */}\n <MStack\n flexDirection={isMobile ? \"row\" : \"column\"}\n alignItems=\"center\"\n gap=\"$sm\"\n flex={isMobile ? 1 : undefined}\n style={isMobile ? { overflowX: \"auto\" } : {}}\n >\n {apps.map((app) => {\n const isActive = app.app_id === activeAppId;\n return (\n <Button\n key={app.app_id}\n size=\"md\"\n variant={isActive ? \"primary\" : \"ghost\"}\n onPress={() => onAppSelect(app.app_id)}\n aria-label={app.label}\n aria-current={isActive ? \"page\" : undefined}\n borderWidth={0}\n borderRadius=\"$sm\"\n shadowOpacity={isActive ? 0.25 : 0}\n style={{ width: 44, height: 44, padding: 0 }}\n title={app.label}\n >\n <Icon name={app.icon || \"box\"} size={20} color={isActive ? \"#fff\" : undefined} />\n </Button>\n );\n })}\n </MStack>\n\n {/* Bottom Section: User Profile */}\n <MStack flexDirection={isMobile ? \"row\" : \"column\"} alignItems=\"center\" gap=\"$sm\">\n {userMenu}\n </MStack>\n </MStack>\n );\n}\n","import { useState } from \"react\";\nimport type { NavigationNode } from \"@framework-m/plugin-sdk\";\nimport { YStack, XStack, Heading, Button, Paragraph, Icon } from \"@framework-m/ui\";\n\nexport interface ContextualDrawerProps {\n app?: {\n label: string;\n resources: NavigationNode[];\n };\n collapsed?: boolean;\n onNavigate: (route: string) => void;\n isMobile?: boolean;\n onClose?: () => void;\n}\n\nexport function ContextualDrawer({\n app,\n collapsed = false,\n onNavigate,\n isMobile,\n onClose,\n}: ContextualDrawerProps) {\n const [expandedNodes, setExpandedNodes] = useState<Record<string, boolean>>({});\n\n if (!app || collapsed) {\n return (\n <YStack\n width={0}\n backgroundColor=\"$background\"\n overflow=\"hidden\"\n style={{ transition: \"width 0.2s ease\" }}\n />\n );\n }\n\n const toggleNode = (name: string) => {\n setExpandedNodes((prev) => ({ ...prev, [name]: !prev[name] }));\n };\n\n const renderNode = (node: NavigationNode, depth: number = 0) => {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expandedNodes[node.name];\n\n return (\n <YStack key={node.name} width=\"100%\">\n <XStack\n width=\"100%\"\n alignItems=\"center\"\n paddingLeft={16 + depth * 16}\n paddingRight=\"$md\"\n minHeight={37}\n hoverStyle={{ backgroundColor: \"$backgroundHover\" }}\n >\n <XStack flex={1} justifyContent=\"space-between\" alignItems=\"center\">\n <XStack alignItems=\"center\">\n <XStack\n cursor=\"pointer\"\n onPress={() => {\n if (hasChildren) {\n toggleNode(node.name);\n } else if (node.route) {\n onNavigate(node.route);\n }\n }}\n paddingVertical=\"$2\"\n >\n <Paragraph size=\"$sm\" color=\"$color\" cursor=\"pointer\">\n {node.label}\n </Paragraph>\n </XStack>\n </XStack>\n\n <XStack alignItems=\"center\" gap=\"$sm\">\n {node.type === \"DocType\" && !hasChildren && (\n <XStack\n cursor=\"pointer\"\n alignItems=\"center\"\n paddingVertical=\"$2\"\n paddingHorizontal=\"$1\"\n hoverStyle={{ opacity: 0.7 }}\n onPress={(e: any) => {\n if (e && e.stopPropagation) e.stopPropagation();\n if (node.workspace_route) {\n onNavigate(node.workspace_route);\n } else if (node.route) {\n onNavigate(node.route.replace(/\\/list$/, \"/new\"));\n }\n }}\n aria-label={`Create new ${node.label}`}\n >\n <Icon name=\"plus\" size={14} color=\"$colorMuted\" />\n </XStack>\n )}\n {node.badge && !hasChildren && (\n <YStack backgroundColor=\"$primary\" borderRadius=\"$full\" paddingHorizontal=\"$sm\">\n <Paragraph size=\"$xs\" color=\"#fff\">\n {node.badge}\n </Paragraph>\n </YStack>\n )}\n {hasChildren && (\n <XStack cursor=\"pointer\" onPress={() => toggleNode(node.name)} padding=\"$1\">\n <Paragraph size=\"$xs\" color=\"$colorMuted\" cursor=\"pointer\">\n {isExpanded ? \"▼\" : \"▶\"}\n </Paragraph>\n </XStack>\n )}\n </XStack>\n </XStack>\n </XStack>\n {hasChildren && isExpanded && (\n <YStack>{node.children!.map((child) => renderNode(child, depth + 1))}</YStack>\n )}\n </YStack>\n );\n };\n\n return (\n <YStack\n width={isMobile ? \"100%\" : 240}\n position={isMobile ? \"fixed\" : \"relative\"}\n top={isMobile ? 0 : undefined}\n left={0}\n right={0}\n bottom={isMobile ? 64 : undefined} // Leaves space for the bottom rail\n zIndex={isMobile ? 100 : 1}\n backgroundColor=\"$background\"\n borderRightWidth={isMobile ? 0 : 1}\n borderColor=\"$borderColorMuted\"\n height=\"100%\"\n overflow=\"hidden\"\n style={{\n transition: \"width 0.2s ease\",\n boxShadow: isMobile ? \"0 -10px 40px rgba(0,0,0,0.1)\" : \"none\",\n }}\n >\n <XStack\n padding=\"$md\"\n minHeight={58}\n borderBottomWidth={1}\n borderColor=\"$borderColorMuted\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Heading size=\"$sm\" color=\"$color\" fontWeight=\"700\">\n {app.label}\n </Heading>\n <Button size=\"sm\" variant=\"ghost\" onPress={onClose} width={32} height={32} padding={0}>\n <Icon name={isMobile ? \"x\" : \"panel-left-close\"} size={16} color=\"$colorMuted\" />\n </Button>\n </XStack>\n <YStack flex={1} overflowX=\"auto\" paddingVertical=\"$sm\" gap=\"$0\">\n {app.resources.map((node) => renderNode(node, 0))}\n </YStack>\n </YStack>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { XStack } from \"@framework-m/ui\";\nimport { PrimaryRail } from \"./PrimaryRail\";\nimport { ContextualDrawer } from \"./ContextualDrawer\";\nimport type { NavigationNode } from \"@framework-m/plugin-sdk\";\n\nexport interface AppManifest {\n app_id: string;\n label: string;\n icon: string;\n resources: NavigationNode[];\n}\n\nexport interface NavigationShellProps {\n apps: AppManifest[];\n defaultAppId?: string;\n collapsed?: boolean;\n onNavigate: (route: string) => void;\n isMobile?: boolean;\n /** When true, renders no navigation chrome (for unauthenticated / guest sessions). */\n isGuest?: boolean;\n}\n\nexport function NavigationShell({\n apps,\n defaultAppId,\n collapsed = false,\n onNavigate,\n isMobile,\n isGuest = false,\n}: NavigationShellProps) {\n // Render nothing for anonymous / guest sessions\n if (isGuest) return null;\n\n const [activeAppId, setActiveAppId] = useState<string | undefined>(\n defaultAppId || apps[0]?.app_id\n );\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [desktopCollapsed, setDesktopCollapsed] = useState(collapsed);\n\n // Ensure we always have an active app if the array changes\n useEffect(() => {\n if (!activeAppId && apps.length > 0) {\n setActiveAppId(apps[0].app_id);\n }\n }, [apps, activeAppId]);\n\n const activeApp = apps.find((app) => app.app_id === activeAppId) || apps[0];\n\n return (\n <XStack\n height={isMobile ? \"auto\" : \"100%\"}\n flexDirection={isMobile ? \"column-reverse\" : \"row\"}\n overflow=\"visible\"\n >\n <PrimaryRail\n apps={apps}\n activeAppId={activeAppId || \"\"}\n isMobile={isMobile}\n onAppSelect={(id) => {\n if (isMobile) {\n setActiveAppId(id);\n setDrawerOpen(true);\n } else {\n if (id === activeAppId) {\n setDesktopCollapsed(!desktopCollapsed);\n } else {\n setActiveAppId(id);\n setDesktopCollapsed(false);\n }\n }\n }}\n />\n <ContextualDrawer\n app={activeApp}\n collapsed={isMobile ? !drawerOpen : desktopCollapsed}\n isMobile={isMobile}\n onNavigate={(route) => {\n onNavigate(route);\n if (isMobile) setDrawerOpen(false);\n }}\n onClose={() => (isMobile ? setDrawerOpen(false) : setDesktopCollapsed(true))}\n />\n </XStack>\n );\n}\n","import { useNavigate } from \"react-router\";\nimport { useTranslation } from \"react-i18next\";\nimport { YStack, XStack, Heading, Paragraph, Button, useTheme } from \"@framework-m/ui\";\n\nexport interface DefaultLandingPageProps {\n /** Application title shown in the landing hero */\n title?: string;\n}\n\n/**\n * DefaultLandingPage\n *\n * Framework-level public landing page rendered at \"/\" for anonymous visitors.\n * This is a generic SaaS/self-hosted landing experience.\n *\n * Apps can override this by registering a plugin route with:\n * { path: \"/\", isPublic: true, element: () => import(\"./pages/MyLandingPage\") }\n */\nexport function DefaultLandingPage({ title = \"Welcome\" }: DefaultLandingPageProps) {\n const navigate = useNavigate();\n const { theme, toggleTheme } = useTheme();\n const { t } = useTranslation(\"desk\");\n\n return (\n <YStack\n minHeight=\"100vh\"\n justifyContent=\"center\"\n alignItems=\"center\"\n position=\"relative\"\n padding=\"$xl\"\n style={{\n background:\n theme === \"dark\"\n ? \"radial-gradient(ellipse at top, #1e1b4b 0%, #0f0f1a 60%)\"\n : \"radial-gradient(ellipse at top, #ede9fe 0%, #f8fafc 60%)\",\n }}\n >\n {/* Theme toggle */}\n <XStack position=\"absolute\" top=\"$lg\" right=\"$lg\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={toggleTheme}\n borderRadius={100}\n width={40}\n height={40}\n >\n <Heading fontSize=\"$md\" opacity={0.7}>\n {theme === \"dark\" ? \"☀️\" : \"🌙\"}\n </Heading>\n </Button>\n </XStack>\n\n {/* Hero */}\n <YStack alignItems=\"center\" gap=\"$lg\" maxWidth={600}>\n <YStack alignItems=\"center\" gap=\"$sm\">\n <Heading\n size=\"$2xl\"\n textAlign=\"center\"\n key={theme}\n style={{\n background:\n theme === \"dark\"\n ? \"linear-gradient(135deg, #a78bfa, #60a5fa)\"\n : \"linear-gradient(135deg, #7c3aed, #2563eb)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {title}\n </Heading>\n <Paragraph textAlign=\"center\" color=\"$colorMuted\" fontSize=\"$lg\" maxWidth={440}>\n {t(\"A modern, modular business platform. Built for teams that move fast.\")}\n </Paragraph>\n </YStack>\n\n {/* CTAs */}\n <XStack gap=\"$md\" flexWrap=\"wrap\" justifyContent=\"center\">\n <Button variant=\"primary\" size=\"lg\" onPress={() => navigate(\"/login\")}>\n {t(\"Sign In\")}\n </Button>\n </XStack>\n </YStack>\n </YStack>\n );\n}\n\nexport default DefaultLandingPage;\n","/// <reference types=\"vite/client\" />\nimport i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport HttpBackend from \"i18next-http-backend\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\n\n// Initialize only if not already initialized by the host application\nif (!i18n.isInitialized) {\n i18n\n // Load translations statically from the served public directory\n .use(HttpBackend)\n // Detect user language\n .use(LanguageDetector)\n // Pass i18n instance to react-i18next\n .use(initReactI18next)\n // Initialize i18next\n .init({\n fallbackLng: \"en\",\n\n // Define default and fallback namespaces\n ns: [\"common\", \"desk\", \"ui\"],\n defaultNS: \"common\",\n fallbackNS: \"common\",\n\n // Debug mode (disable in production)\n debug: import.meta.env.DEV,\n\n // Language detection options\n detection: {\n // Include querystring to support ?lng=hi parameter\n order: [\"querystring\", \"localStorage\", \"navigator\"],\n\n // Cache user language\n caches: [\"localStorage\"],\n\n // localStorage key\n lookupLocalStorage: \"i18nextLng\",\n },\n\n // Backend options for loading static locales\n backend: {\n loadPath: \"/locales/{{lng}}/{{ns}}.json\",\n },\n\n // Disable namespace separator so keys like \"Total:\" are not parsed as namespace \"Total\"\n nsSeparator: false,\n\n // Interpolation options\n interpolation: {\n escapeValue: false, // React already escapes values\n },\n\n // React options\n react: {\n useSuspense: true,\n },\n });\n}\n\n// Register document direction updates on language change\nif (typeof document !== \"undefined\") {\n i18n.on(\"languageChanged\", (lng) => {\n document.documentElement.lang = lng;\n const isRtl = [\"ur\", \"ar\", \"he\", \"fa\", \"ps\"].includes(lng.split(\"-\")[0]);\n document.documentElement.dir = isRtl ? \"rtl\" : \"ltr\";\n });\n}\n\nexport default i18n;\n","import React, { ReactNode, useMemo, useState, useRef } from \"react\";\nimport {\n BrowserRouter,\n Routes,\n Route,\n Navigate,\n Outlet,\n useLocation,\n useNavigate,\n} from \"react-router\";\nimport { Refine, Authenticated, useGetIdentity } from \"@refinedev/core\";\nimport routerProvider from \"@refinedev/react-router\";\nimport { ShellProvider } from \"../../shell/ShellProvider\";\nimport { NavigationShell } from \"./Navigation/NavigationShell\";\nimport { createWebSocketRealtimeAdapter } from \"../../shell/realtime\";\nimport { FrameworkMPlugin, usePluginApps } from \"@framework-m/plugin-sdk\";\nimport { ShellSkeleton } from \"./ShellSkeleton\";\nimport { authProvider, checkUserRole } from \"../../auth\";\nimport { frameworkMDataProvider } from \"../../data\";\nimport { SCHEMA_URL, FRAMEWORK_MODE, BASENAME } from \"../../constants\";\nimport { liveProvider } from \"../../live\";\nimport { LoginPage } from \"../../pages/LoginPage\";\nimport { ListView } from \"../../pages/ListView\";\nimport { FormView } from \"../../pages/FormView\";\nimport { DefaultLandingPage } from \"./DefaultLandingPage\";\nimport {\n PluginRegistry,\n PluginRegistryProvider,\n DiscoveryClient,\n fetchRemotes,\n loadRemoteScript,\n initializeRemote,\n loadRemoteModule,\n} from \"@framework-m/plugin-sdk\";\nimport { ThemeProvider, MProvider, XStack, YStack } from \"@framework-m/ui\";\nimport { I18nextProvider } from \"react-i18next\";\nimport i18n from \"../../config/i18n\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\nimport { SystemConfigProvider } from \"../../providers/SystemConfigProvider\";\n\ndeclare const process: { env: Record<string, string | undefined> };\n\nexport interface FrameworkMShellProps {\n /** Application title for the Navbar */\n title: string;\n /** Primary content to render inside the main layout */\n children?: ReactNode;\n /** Optional plugins to initialize the shell with */\n initialPlugins?: FrameworkMPlugin[];\n /** Whether focus mode is enabled by default */\n defaultFocusMode?: boolean;\n /** The federation service name for this shell app (e.g. 'business_m') */\n serviceName?: string;\n /** Optional custom login page */\n loginPage?: ReactNode;\n}\n\n/**\n * ShellLayout\n *\n * Internal component to handle the authenticated layout structure.\n * Uses usePluginApps() so that role-based visibility_policy filtering\n * is applied before rendering the navigation.\n */\nconst ShellLayout: React.FC<{\n isMobile: boolean;\n}> = ({ isMobile }) => {\n const navigate = useNavigate();\n\n // Fetch session identity so roles and locale are available.\n // useGetIdentity is safe here — ShellLayout only renders inside <Authenticated>.\n const { data: identity } = useGetIdentity<{ roles?: string[]; locale?: string }>();\n const userRoles = identity?.roles ?? [];\n\n // usePluginApps applies visibility_policy.roles filtering using the session roles.\n // It re-runs whenever the registry changes (new plugins registered) or roles change.\n const allApps = usePluginApps(userRoles);\n\n const langSynced = useRef(false);\n\n React.useEffect(() => {\n if (identity?.locale && !langSynced.current) {\n langSynced.current = true;\n if (i18n.language !== identity.locale) {\n i18n.changeLanguage(identity.locale);\n }\n }\n }, [identity]);\n const apps = useMemo(() => {\n const rawAppsStr = process.env.INSTALLED_APPS || \"\";\n const installed = rawAppsStr.split(\",\").map((s: string) => s.trim());\n const mandatoryApps = [\"core\"];\n\n const filteredApps = rawAppsStr\n ? allApps.filter(\n (app) => mandatoryApps.includes(app.app_id) || installed.includes(app.app_id)\n )\n : allApps;\n\n console.log(\"[framework-m/shell] Navigation apps (post-filter):\", {\n installed: rawAppsStr || \"(all)\",\n result: filteredApps.map((a) => a.app_id).join(\", \"),\n });\n\n return filteredApps;\n }, [allApps]);\n\n const mainContent = (\n <YStack\n tag=\"main\"\n flex={1}\n minWidth={0}\n minHeight={0}\n overflowY=\"auto\"\n padding={isMobile ? \"$sm\" : \"$md\"}\n backgroundColor=\"$background\"\n >\n <Outlet />\n </YStack>\n );\n\n const navigation = (\n <NavigationShell apps={apps} isMobile={isMobile} onNavigate={(route) => navigate(route)} />\n );\n\n if (isMobile) {\n return (\n <YStack flex={1} height=\"100vh\" overflow=\"hidden\">\n {mainContent}\n {navigation}\n </YStack>\n );\n }\n\n return (\n <XStack flex={1} height=\"100vh\" overflow=\"hidden\">\n {navigation}\n {mainContent}\n </XStack>\n );\n};\n\n/**\n * RedirectToLogin\n *\n * Helper component to redirect unauthenticated users to the login page\n * while preserving the current path in the 'to' query parameter.\n */\nexport const RedirectToLogin = () => {\n const { pathname, search } = useLocation();\n const to = encodeURIComponent(`${pathname}${search}`);\n return (\n <>\n <ShellSkeleton />\n <Navigate to={`/login?to=${to}`} replace />\n </>\n );\n};\n\nconst EMPTY_PLUGINS: FrameworkMPlugin[] = [];\n\nexport const FrameworkMShell: React.FC<FrameworkMShellProps> = ({\n title,\n children,\n initialPlugins = EMPTY_PLUGINS,\n defaultFocusMode = false,\n serviceName = \"core\",\n loginPage,\n}) => {\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n }),\n []\n );\n const [focusMode, setFocusMode] = useState(defaultFocusMode);\n const [isMobile, setIsMobile] = useState(\n globalThis.window?.innerWidth ? globalThis.window.innerWidth < 1024 : false\n );\n const [rightMobileOpen, setRightMobileOpen] = useState(false);\n\n React.useEffect(() => {\n const onResize = () => {\n const mobile = window.innerWidth < 1024;\n setIsMobile(mobile);\n };\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n // Initialize Plugin Registry\n const registry = useMemo(() => {\n const reg = PluginRegistry.getInstance();\n\n // Explicitly configure mode and service context (No more global sniffing!)\n reg.setContext({\n frameworkMode: FRAMEWORK_MODE,\n serviceName: serviceName || \"core\",\n });\n\n // Gate navigation nodes that declare explicit node.permissions[] (fine-grained RBAC).\n // visibility_policy.roles is handled client-side in usePluginApps — no async call needed.\n reg.setPermissionChecker(async (permissions) => {\n if (permissions.length === 0) return true;\n\n for (const permission of permissions) {\n const allowed = await checkUserRole(permission);\n if (!allowed) return false;\n }\n\n return true;\n });\n\n // Pre-seed the registry synchronously with all initial plugins.\n // This ensures routes and manifests are available on the very first render,\n // preventing the * wildcard from firing before the async useEffect runs.\n for (const plugin of initialPlugins) {\n if (plugin.name && plugin.version) {\n try {\n // Use internal Map access for synchronous pre-seed if needed,\n // or just call a sync register if available.\n // Since we are in useMemo, this is safe.\n (reg as any).plugins.set(plugin.name, plugin);\n (reg as any).rebuildIndexesAndServices();\n (reg as any).appsCache = null;\n } catch (err) {\n console.warn(`[framework-m/shell] Synchronous pre-seed failed for ${plugin.name}:`, err);\n }\n }\n }\n\n // Initialize DiscoveryClient with this registry\n DiscoveryClient.getInstance(reg);\n\n return reg;\n }, [initialPlugins]); // Re-initialize if initialPlugins change\n\n // Registry version to trigger re-renders when plugins register\n const [registryVersion, setRegistryVersion] = useState(0);\n const initializationStarted = useRef(false);\n\n React.useEffect(() => {\n const unsubscribe = registry.on(\"plugin:registered\", () => {\n setRegistryVersion((v) => v + 1);\n });\n return unsubscribe;\n }, [registry]);\n\n // Initialize the shell (pre-warm core + register plugins + discovery)\n React.useEffect(() => {\n if (initializationStarted.current) return;\n initializationStarted.current = true;\n\n const prewarmCore = async () => {\n try {\n console.info(\"[framework-m/shell] Pre-warming core discovery...\");\n const discovery = DiscoveryClient.getInstance();\n const openapiPath = `${SCHEMA_URL}/openapi.json`;\n await discovery.loadFromOpenAPI(openapiPath, serviceName);\n } catch (err) {\n console.warn(\"[framework-m/shell] Failed to pre-warm core discovery:\", err);\n }\n };\n\n const registerInitial = async () => {\n console.info(`[framework-m/shell] Registering ${initialPlugins.length} initial plugins`);\n for (const plugin of initialPlugins) {\n try {\n await registry.register(plugin);\n } catch (err) {\n console.error(\n `[framework-m/shell] Failed to register initial plugin ${plugin.name}:`,\n err\n );\n }\n }\n };\n\n const discoverRemotes = async () => {\n try {\n console.info(\"[framework-m/shell] Fetching remotes from discovery API...\");\n const remotes = await fetchRemotes();\n console.info(\"[framework-m/shell] Discovered remotes:\", remotes);\n\n const bootstrapTasks = Object.entries(remotes).map(async ([scope, unit]) => {\n // Pre-warm DiscoveryClient with OpenAPI schema if available\n if (unit.openapiUrl) {\n try {\n console.info(\n `[framework-m/shell] Pre-warming discovery for ${scope} from ${unit.openapiUrl}`\n );\n const discovery = DiscoveryClient.getInstance();\n await discovery.loadFromOpenAPI(unit.openapiUrl);\n } catch (e) {\n console.warn(`[framework-m/shell] Failed to pre-warm discovery for ${scope}:`, e);\n }\n }\n\n if (registry.getAllPlugins().some((p: FrameworkMPlugin) => p.name === scope)) {\n console.debug(`[framework-m/shell] Remote ${scope} already registered as local plugin`);\n return;\n }\n\n try {\n console.info(`[framework-m/shell] 1. Loading script: ${unit.url}`);\n loadRemoteScript(unit.url);\n\n console.info(`[framework-m/shell] 2. Initializing remote container: ${scope}`);\n await initializeRemote(scope, unit.url);\n console.info(`[framework-m/shell] Container ${scope} initialized`);\n\n // 3. Load the plugin module\n let module;\n console.info(`[framework-m/shell] 3. Loading module ./plugin from ${scope}`);\n try {\n module = await loadRemoteModule<{ default: FrameworkMPlugin }>(scope, \"./plugin\");\n } catch (e) {\n console.warn(\n `[framework-m/shell] Failed to load ./plugin for ${scope}, trying ./remoteEntry`,\n e\n );\n module = await loadRemoteModule<{ default: FrameworkMPlugin }>(\n scope,\n \"./remoteEntry\"\n );\n }\n\n const plugin = module.default;\n if (plugin) {\n // Inject discovery metadata for dynamic service resolution in Phase 5\n plugin.discoveryUnit = unit;\n\n await registry.register(plugin);\n console.info(\n `[framework-m/shell] 4. Successfully registered remote plugin: ${scope}`\n );\n } else {\n console.error(`[framework-m/shell] No default export found for remote ${scope}`);\n }\n } catch (err) {\n console.error(`[framework-m/shell] Failed to bootstrap remote ${scope}:`, err);\n }\n });\n\n // Parallelize bootstrapping for all discovered remotes\n await Promise.allSettled(bootstrapTasks);\n } catch (err) {\n console.error(\"[framework-m/shell] Discovery failed:\", err);\n }\n };\n\n const run = async () => {\n await prewarmCore();\n await registerInitial();\n await discoverRemotes();\n };\n run();\n }, [registry, initialPlugins, serviceName]);\n\n // Memoize plugin routes to prevent router remounting on layout state changes.\n // Split into public (outside auth guard) and authenticated (inside auth guard).\n const { publicPluginRoutes, authenticatedPluginRoutes, hasPluginRootRoute } = useMemo(() => {\n // Access registryVersion to ensure re-memoization when a plugin registers\n registryVersion;\n\n const allRoutes = registry.getRoutes();\n const publicPluginRoutes: React.ReactElement[] = [];\n const authenticatedPluginRoutes: React.ReactElement[] = [];\n let hasPluginRootRoute = false;\n\n for (const route of allRoutes) {\n const normalizedPath = route.path.startsWith(\"/\") ? route.path : `/${route.path}`;\n const isPublicRoute = Boolean((route as { isPublic?: boolean }).isPublic);\n\n if (isPublicRoute && normalizedPath === \"/\") {\n hasPluginRootRoute = true;\n }\n\n const LazyComponent =\n typeof route.element === \"function\" && !(route.element as any).$$typeof\n ? React.lazy(route.element as any)\n : null;\n\n const element = LazyComponent ? (\n <LazyComponent />\n ) : typeof route.element === \"function\" ? (\n (route.element as any)()\n ) : (\n route.element\n );\n\n const node = <Route key={normalizedPath} path={normalizedPath} element={element} />;\n\n if (isPublicRoute) {\n publicPluginRoutes.push(node);\n } else {\n authenticatedPluginRoutes.push(node);\n }\n }\n\n return { publicPluginRoutes, authenticatedPluginRoutes, hasPluginRootRoute };\n }, [registry, registryVersion]);\n\n // Using location.host for standard dev/prod behavior\n const protocol = globalThis.location?.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const wsUrl = `${protocol}//${globalThis.location?.host}/api/v1/stream`;\n\n return (\n <BrowserRouter basename={BASENAME}>\n <I18nextProvider i18n={i18n}>\n <PluginRegistryProvider registry={registry}>\n <ThemeProvider>\n <MProvider>\n <React.Suspense fallback={<ShellSkeleton />}>\n <QueryClientProvider client={queryClient}>\n <ShellProvider\n isMobile={isMobile}\n rightSidebarOpen={rightMobileOpen}\n setRightSidebarOpen={setRightMobileOpen}\n realtimeAdapter={createWebSocketRealtimeAdapter(wsUrl)}\n initialPlugins={initialPlugins}\n focusMode={focusMode}\n setFocusMode={setFocusMode}\n >\n <Refine\n dataProvider={frameworkMDataProvider}\n authProvider={authProvider}\n routerProvider={routerProvider}\n liveProvider={liveProvider}\n options={{\n syncWithLocation: true,\n warnWhenUnsavedChanges: true,\n }}\n >\n <SystemConfigProvider>\n <Routes>\n {/* Plugin-provided public routes (e.g. branded landing at \"/\") */}\n {publicPluginRoutes}\n\n {/* Fallback landing page — only shown when no plugin claims \"/\" */}\n {!hasPluginRootRoute && (\n <Route path=\"/\" element={<DefaultLandingPage title={title} />} />\n )}\n <Route path=\"/login\" element={loginPage ?? <LoginPage title={title} />} />\n\n {/* Authenticated Application Routes */}\n <Route\n element={\n <Authenticated\n key=\"authenticated-routes\"\n fallback={<RedirectToLogin />}\n loading={<ShellSkeleton />}\n >\n <ShellLayout isMobile={isMobile} />\n </Authenticated>\n }\n >\n {/* Authenticated plugin routes */}\n {authenticatedPluginRoutes}\n\n <Route path=\"/app\">\n <Route index element={<Navigate to=\"/app/dashboard\" />} />\n <Route path=\"dashboard\" element={children} />\n\n {/* Generic DocType Routes */}\n <Route path=\":doctype\">\n <Route index element={<Navigate to=\"list\" />} />\n <Route path=\"list\" element={<ListView />} />\n <Route path=\"kanban\" element={<ListView view=\"kanban\" />} />\n <Route path=\"tree\" element={<ListView view=\"tree\" />} />\n <Route path=\"gantt\" element={<ListView view=\"gantt\" />} />\n <Route path=\"new\" element={<FormView />} />\n <Route path=\"detail/:id\" element={<FormView />} />\n <Route path=\"edit/:id\" element={<FormView />} />\n </Route>\n </Route>\n </Route>\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"/\" />} />\n </Routes>\n </SystemConfigProvider>\n </Refine>\n </ShellProvider>\n </QueryClientProvider>\n </React.Suspense>\n </MProvider>\n </ThemeProvider>\n </PluginRegistryProvider>\n </I18nextProvider>\n </BrowserRouter>\n );\n};\n"],"x_google_ignoreList":[94,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140],"mappings":"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"}
|