@framework-m/desk 0.16.0 → 0.18.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 +20 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/components/form/fields/MultiSelectField.d.ts.map +1 -1
- package/dist/components/form/fields/SelectField.d.ts +4 -3
- package/dist/components/form/fields/SelectField.d.ts.map +1 -1
- package/dist/components/layout/Navigation/PrimaryRail.d.ts.map +1 -1
- package/dist/components/list/ListBodyLayout.d.ts.map +1 -1
- package/dist/index.js +1039 -847
- package/dist/index.js.map +1 -1
- package/dist/locales/en/desk.json +2 -0
- package/dist/locales/es/desk.json +2 -0
- package/dist/locales/fr/desk.json +2 -0
- package/dist/locales/hi/desk.json +2 -0
- package/dist/locales/mr/desk.json +2 -0
- package/dist/locales/ta/desk.json +2 -0
- package/dist/locales/ur/desk.json +2 -0
- package/dist/pages/LoginPage.d.ts.map +1 -1
- package/dist/providers/SystemConfigProvider.d.ts +1 -0
- package/dist/providers/SystemConfigProvider.d.ts.map +1 -1
- package/dist/views/TreeView.d.ts.map +1 -1
- package/locales/en/desk.json +2 -0
- package/locales/es/desk.json +2 -0
- package/locales/fr/desk.json +2 -0
- package/locales/hi/desk.json +2 -0
- package/locales/mr/desk.json +2 -0
- package/locales/ta/desk.json +2 -0
- package/locales/ur/desk.json +2 -0
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/uiMetaUtils.ts","../src/hooks/useUIMeta.ts","../src/components/layout/TabContainer.tsx","../src/components/layout/SectionField.tsx","../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/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/FormBodyLayout.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/table/tableUtils.ts","../src/components/form/fields/ListField.tsx","../src/components/form/fields/MultiSelectField.tsx","../src/components/form/fields/TagInputField.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/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/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/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/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 * 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 auto_save?: boolean;\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","/**\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 * 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, useRef } from \"react\";\nimport { useParams, useNavigate, useSearchParams } from \"react-router\";\nimport { useOne, useCreate, useUpdate, HttpError } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"./useDocTypeMeta\";\nimport { useWorkflowActions } from \"./useWorkflowActions\";\nimport { useRouteTraversal } from \"./useRouteTraversal\";\n\nexport interface ValidationErrorDetail {\n dataPath: string;\n message: string;\n keyword: string;\n}\n\nexport interface ValidationError {\n details: ValidationErrorDetail[];\n}\n\nexport interface Frm<T = Record<string, unknown>> {\n doc: T;\n setDoc: (data: Partial<T> | ((prev: T) => T)) => void;\n save: (options?: { preventNavigation?: boolean }) => Promise<void>;\n cancel: () => void;\n isEditing: boolean;\n isSaving: boolean;\n isLocked: boolean;\n errors: string[];\n notices: string[];\n validationError?: ValidationError | null;\n workflow?: unknown;\n refetch: () => Promise<void>;\n}\n\nexport interface UseFormControllerProps {\n doctype?: string;\n id?: string;\n}\n\ninterface CustomHttpError extends HttpError {\n validation_errors?: Record<string, unknown>;\n response?: {\n data?: {\n validation_errors?: Record<string, unknown>;\n };\n validation_errors?: Record<string, unknown>;\n };\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, meta } = useDocTypeMeta(doctype);\n const isEditing = !!id;\n\n const queryResult = useOne<Record<string, unknown>>({\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 [searchParams] = useSearchParams();\n const formParam = searchParams.get(\"form\");\n const lastAppliedFormParam = useRef<string | null>(formParam);\n\n const prevIdRef = useRef(id);\n const prevDoctypeRef = useRef(doctype);\n\n const [formData, setFormData] = useState<Record<string, unknown>>(() => {\n if (!isEditing && formParam) {\n try {\n return JSON.parse(formParam);\n } catch (e) {\n console.error(\"Failed to parse form query parameter:\", e);\n }\n }\n return {};\n });\n const [errors, setErrors] = useState<string[]>([]);\n const [notices] = useState<string[]>([]);\n const [validationError, setValidationError] = useState<ValidationError | null>(null);\n\n useEffect(() => {\n const routeChanged = prevIdRef.current !== id || prevDoctypeRef.current !== doctype;\n const formParamChanged = formParam !== lastAppliedFormParam.current;\n\n if (routeChanged || formParamChanged) {\n prevIdRef.current = id;\n prevDoctypeRef.current = doctype;\n lastAppliedFormParam.current = formParam;\n\n let initialData = {};\n if (!isEditing && formParam) {\n try {\n initialData = JSON.parse(formParam);\n } catch (e) {\n console.error(\"Failed to parse form query parameter:\", e);\n }\n }\n setFormData(initialData);\n setErrors([]);\n setValidationError(null);\n }\n }, [id, doctype, isEditing, formParam]);\n\n const record = queryResult?.result ?? queryResult?.query?.data?.data;\n const currentDoc =\n Object.keys(formData).length > 0 || !queryResult?.query?.isSuccess ? formData : (record ?? {});\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 const resolveEditRoute = useRouteTraversal(\"resolveEditRoute\");\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\");\n\n const handleSave = useCallback(\n async (saveOptions?: { preventNavigation?: boolean }) => {\n try {\n // Changed to _is_new to satisfy the lint rule for unused variables\n const { _is_new, ...values } = (currentDoc || {}) as Record<string, unknown>;\n const options = {\n onSuccess: (data: unknown) => {\n setFormData({});\n\n const isSingleton = id === \"singleton\" || meta?.is_singleton;\n if (!isEditing && !isSingleton) {\n const res = data as\n | { data?: { id?: string | number }; id?: string | number }\n | null\n | undefined;\n const newId = res?.data?.id ?? res?.id;\n if (newId && saveOptions?.preventNavigation) {\n // After auto_save of a new form, transition to the edit page of the newly created record.\n const customPath = resolveEditRoute\n ? resolveEditRoute(doctype, newId)\n : resolveDetailRoute\n ? resolveDetailRoute(doctype, newId)\n : null;\n navigate(\n typeof customPath === \"string\" ? customPath : `/app/${doctype}/edit/${newId}`,\n { replace: true }\n );\n } else {\n // Standard manual save or fallback redirects back to list view\n if (typeof window !== \"undefined\" && window.location.hash === \"#_editing\") {\n const cleanUrl = window.location.pathname + window.location.search;\n window.history.replaceState(null, \"\", cleanUrl);\n }\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n }\n } else if (!saveOptions?.preventNavigation && !isSingleton) {\n if (typeof window !== \"undefined\" && window.location.hash === \"#_editing\") {\n const cleanUrl = window.location.pathname + window.location.search;\n window.history.replaceState(null, \"\", cleanUrl);\n }\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n }\n },\n onError: (err: CustomHttpError) => {\n const vErrors =\n err?.validation_errors ||\n err?.response?.data?.validation_errors ||\n err?.response?.validation_errors;\n\n if (vErrors && typeof vErrors === \"object\") {\n const details = Object.entries(vErrors).map(([field, msg]) => ({\n dataPath: field === \"base\" ? \"\" : `.${field}`,\n message: String(msg),\n keyword: \"custom\",\n }));\n setValidationError({ details });\n setErrors([]);\n } else {\n setValidationError(null);\n setErrors([err?.message || \"An error occurred during save.\"]);\n }\n },\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 [\n doctype,\n id,\n isEditing,\n currentDoc,\n navigate,\n resolveListRoute,\n updateMutation,\n createMutation,\n meta?.is_singleton,\n ]\n );\n\n const handleCancel = useCallback(() => {\n if (typeof window !== \"undefined\" && window.location.hash === \"#_editing\") {\n const cleanUrl = window.location.pathname + window.location.search;\n window.history.replaceState(null, \"\", cleanUrl);\n }\n const isSingleton = id === \"singleton\" || meta?.is_singleton;\n if (isSingleton) {\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, meta?.is_singleton]);\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 setFormData((prev) => update(prev));\n } else {\n setFormData((prev) => ({ ...prev, ...update }));\n }\n setErrors([]);\n setValidationError(null);\n },\n save: handleSave,\n cancel: handleCancel,\n isEditing,\n isSaving,\n isLocked,\n errors,\n validationError,\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 validationError,\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","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, useEffect } from \"react\";\nimport { useSearchParams } from \"react-router\";\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 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 [searchParams, setSearchParams] = useSearchParams();\n\n // 1. Read Truth from URL\n const appliedSearchQuery = searchParams.get(\"search\") || \"\";\n const asOfFilter = searchParams.get(\"as_of\") || undefined;\n\n const appliedFilterRows = useMemo<FilterRow[]>(() => {\n const filtersParam = searchParams.get(\"filters\");\n if (!filtersParam) return [];\n try {\n const parsed = JSON.parse(filtersParam);\n if (Array.isArray(parsed)) {\n return parsed.filter((r) => r.id && r.field && r.operator);\n }\n } catch {\n // ignore parse errors\n }\n return [];\n }, [searchParams]);\n\n // 2. Local \"Draft\" State\n const [searchQuery, setSearchQuery] = useState(appliedSearchQuery);\n const [filterRows, setFilterRows] = useState<FilterRow[]>(appliedFilterRows);\n\n useEffect(() => {\n setSearchQuery(appliedSearchQuery);\n setFilterRows(appliedFilterRows);\n }, [appliedSearchQuery, appliedFilterRows]);\n\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 = Math.random().toString(36).substring(2, 9);\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 setSearchParams((prev) => {\n const trimmed = searchQuery.trim();\n if (trimmed) {\n prev.set(\"search\", trimmed);\n } else {\n prev.delete(\"search\");\n }\n return prev;\n });\n }, [searchQuery, setSearchParams]);\n\n const clearSearch = useCallback(() => {\n setSearchQuery(\"\");\n setSearchParams((prev) => {\n prev.delete(\"search\");\n return prev;\n });\n }, [setSearchParams]);\n\n const setAsOfFilter = useCallback(\n (val: string | undefined) => {\n setSearchParams((prev) => {\n if (val) {\n prev.set(\"as_of\", val);\n } else {\n prev.delete(\"as_of\");\n }\n return prev;\n });\n },\n [setSearchParams]\n );\n\n const applyFilters = useCallback(() => {\n setSearchParams((prev) => {\n const validFilters = filterRows.filter((r) => r.field && r.value !== \"\");\n if (validFilters.length > 0) {\n prev.set(\"filters\", serializeFilterRows(validFilters));\n } else {\n prev.delete(\"filters\");\n }\n return prev;\n });\n }, [filterRows, setSearchParams]);\n\n const clearAppliedFilters = useCallback(() => {\n setFilterRows([]);\n setSearchParams((prev) => {\n prev.delete(\"filters\");\n return prev;\n });\n }, [setSearchParams]);\n\n const removeAppliedFilterRow = useCallback(\n (id: string) => {\n setSearchParams((prev) => {\n const updated = appliedFilterRows.filter((r) => r.id !== id);\n if (updated.length > 0) {\n prev.set(\"filters\", serializeFilterRows(updated));\n } else {\n prev.delete(\"filters\");\n }\n return prev;\n });\n },\n [appliedFilterRows, setSearchParams]\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 throw err instanceof Error ? err : new Error(\"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\" | \"calendar\";\n\nexport interface UseListActionsProps {\n doctype: string;\n propView?: ListViewMode;\n canKanban: boolean;\n canTree: boolean;\n canGantt: boolean;\n canCalendar: 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 canCalendar,\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(\"/calendar\")) return \"calendar\";\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 if (requested === \"calendar\" && !canCalendar) return \"list\";\n return requested as ListViewMode;\n }, [propView, pathView, canKanban, canTree, canGantt, canCalendar]);\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 { 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\n const fieldMeta = meta.properties[key];\n if (fieldMeta) {\n if (fieldMeta.ui_meta?.hidden === true) continue;\n properties[key] = fieldMeta;\n }\n }\n return { ...meta, properties };\n}\n\nfunction buildFullFilteredSchema(meta: any): any {\n const properties: Record<string, unknown> = {};\n for (const [key, fieldMeta] of Object.entries(meta.properties || {})) {\n const normalizedKey = key.toLowerCase().trim();\n if (AUDIT_FIELDS.includes(normalizedKey)) continue;\n if ((fieldMeta as any).ui_meta?.hidden === true) continue;\n\n properties[key] = fieldMeta;\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 error={frm.validationError}\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 error={frm.validationError}\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 error={frm.validationError}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n );\n}\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 { useDocTypeMeta } from \"../../hooks/useDocTypeMeta\";\nimport { useUIMeta } from \"../../hooks/useUIMeta\";\nimport { FormBodyLayout } from \"./FormBodyLayout\";\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 { uiMeta } = useUIMeta(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, mfetch]);\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 frmShim = {\n doc: formData,\n setDoc: setFormData,\n save: handleSubmit,\n isLocked: isSaving,\n };\n\n return (\n <YStack gap=\"$md\">\n {saveError && (\n <MText color=\"$error\" role=\"alert\">\n {saveError}\n </MText>\n )}\n {schema && <FormBodyLayout meta={schema} uiMeta={uiMeta} frm={frmShim as any} />}\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 {\n Input,\n YStack,\n MText,\n Button,\n Paragraph,\n XStack,\n Card,\n Drawer,\n Icon,\n} from \"@framework-m/ui\";\nimport { useGo } from \"@refinedev/core\";\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 add_new: false or x-quick-entry: false in the JSON Schema property\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 props?.add_new ??\n fieldSchema?.add_new ??\n fieldSchema?.ui_meta?.add_new;\n // Default enabled — only disable when explicitly false\n return flag !== false;\n }, [props, fieldSchema, schema]);\n\n // Support for custom search filtering from Python schema\n const linkFilters = useMemo(() => {\n const filters =\n props?.link_filters || fieldSchema?.link_filters || fieldSchema?.ui_meta?.link_filters;\n return typeof filters === \"object\" && filters !== null ? filters : null;\n }, [props, fieldSchema]);\n\n const mfetch = useMFetch();\n const go = useGo();\n\n // State for hydration status\n const [isHydrating, setIsHydrating] = useState(false);\n\n // inputValue is what the user types. displayValue is the hydrated label.\n const [inputValue, setInputValue] = useState(\"\");\n const [displayValue, setDisplayValue] = useState(\"\");\n // Tracks the last 'value' (ID) for which we successfully hydrated a label.\n // This prevents re-hydrating if the value hasn't changed.\n const lastHydratedValue = useRef<string | null>(null);\n\n // On-demand fetch to swap the UUID for the human-readable title\n const handleHydrate = useCallback(\n async (e?: any) => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n if (!value || !linkedDoctype) return;\n\n setIsHydrating(true);\n try {\n const response = await mfetch(`${API_URL}/${linkedDoctype}/${value}`, {\n credentials: \"include\",\n });\n if (response.ok) {\n const data = await response.json();\n const label = data?.title || data?.name || data?.id || String(value);\n setDisplayValue(label); // Set the display value\n lastHydratedValue.current = value; // Mark this value as hydrated\n }\n } catch {\n // Ignore network errors\n // Fallback to raw ID if hydration fails, or keep displayValue empty\n setDisplayValue(String(value));\n } finally {\n // This finally block is part of handleHydrate\n setIsHydrating(false);\n }\n },\n [value, linkedDoctype, mfetch]\n );\n\n // Effect to trigger hydration when 'value' changes externally (e.g., from URL params or parent form)\n useEffect(() => {\n if (value && linkedDoctype) {\n // If the current 'value' is different from the last one we hydrated,\n // then trigger hydration.\n if (value !== lastHydratedValue.current) {\n // Clear inputValue and displayValue to show loading/raw ID while hydrating\n setInputValue(\"\");\n setDisplayValue(\"\");\n // Only trigger if not already hydrating to prevent multiple calls\n if (!isHydrating) {\n handleHydrate();\n }\n }\n } else if (!value) {\n // If value becomes null/undefined, clear both input and display, and reset last hydrated.\n setInputValue(\"\");\n setDisplayValue(\"\");\n lastHydratedValue.current = null;\n }\n }, [value, linkedDoctype, handleHydrate, isHydrating]);\n\n // Effect to handle initial hydration if value is present on mount\n useEffect(() => {\n // This runs once on mount if 'value' is already set (e.g., from URL params)\n // and hasn't been hydrated yet.\n if (value && linkedDoctype && !isHydrating && !lastHydratedValue.current) {\n handleHydrate();\n }\n }, [value, linkedDoctype, isHydrating, handleHydrate]);\n\n // Determine the value to show in the input field\n const inputDisplayValue = useMemo(() => {\n // Prioritize user's input, then hydrated label, then raw ID if hydration is pending\n if (inputValue) return inputValue;\n if (displayValue) return displayValue;\n if (value && !isHydrating) return String(value); // Show raw ID if not hydrated yet\n return \"\";\n }, [inputValue, displayValue, value, isHydrating]);\n\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 const debouncedSearch = useDebounce(inputValue, 300);\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 if (linkFilters) {\n Object.entries(linkFilters).forEach(([key, val]) => {\n params.append(key, String(val));\n });\n }\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?.data || data?.items || data;\n const itemsArray = Array.isArray(items) ? items : [];\n setSearchResults(\n itemsArray.map((item: any) => ({\n value: String(item.id),\n label: item.title || item.name || 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 lastHydratedValue.current = option.value; // Mark as hydrated\n setInputValue(option.label); // Set user input to selected label\n setDisplayValue(option.label); // Also set display value\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 lastHydratedValue.current = newId; // Mark as hydrated\n setInputValue(newLabel); // Set user input to new label\n setDisplayValue(newLabel); // Also set display value\n onChange(newId);\n setIsDrawerOpen(false);\n },\n [onChange]\n );\n\n // Determine if the input should be disabled\n const isInputDisabled = disabled || (isDynamicLink && !linkedDoctype);\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={inputDisplayValue}\n disabled={isInputDisabled}\n placeholder={resolvedPlaceholder}\n onChangeText={(text: string) => {\n setInputValue(text);\n setDisplayValue(\"\"); // Clear display value if user starts typing\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 || (isHydrating && !value)} // Show error if hydration fails and no value\n paddingRight={value ? 88 : 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 <Icon name=\"search\" size={15} />\n </Paragraph>\n )}\n </XStack>\n {value && (\n <XStack position=\"absolute\" right={8} top={0} bottom={0} alignItems=\"center\" gap=\"$1\">\n {!disabled && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={handleHydrate}\n disabled={isHydrating || isInputDisabled}\n title=\"Fetch record name\"\n >\n <Icon\n name=\"refresh-cw\"\n size={14}\n color={isHydrating ? \"$primary\" : \"$colorMuted\"}\n />\n </Button>\n )}\n {!disabled && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={(e: any) => {\n e.preventDefault();\n e.stopPropagation();\n go({ to: `/app/${linkedDoctype}/detail/${value}` });\n }}\n title={`Open ${linkedDoctype}`}\n >\n <Icon name=\"external-link\" size={14} color=\"$colorMuted\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={() => {\n // Clear button\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 const ss = pad(date.getSeconds());\n return `${yyyy}-${mm}-${dd}T${hh}:${min}:${ss}`;\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","export const SYSTEM_FIELDS = [\n \"id\",\n \"name\",\n \"creation\",\n \"modified\",\n \"modified_by\",\n \"owner\",\n \"deleted_at\",\n \"docstatus\",\n \"idx\",\n \"parent\",\n \"parentfield\",\n \"parent_value\",\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","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\";\nimport { SYSTEM_FIELDS } from \"../../table/tableUtils\";\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 // Filter out any columns that don't actually exist in the schema to prevent Uniforms from crashing\n // (e.g., if a developer misspells a column name in the grid_columns metadata)\n const validGridColumns = gridColumns.filter((col: string) => !!rowSchema?.properties?.[col]);\n\n const modalProperties = uniqueProps.filter(\n (col: string) => !SYSTEM_FIELDS.includes(col.toLowerCase()) && !!rowSchema?.properties?.[col]\n );\n\n const getColumnLayout = useCallback(\n (col: string) => {\n const type = getColType(col);\n if (type === \"boolean\") return { width: 80, flexShrink: 0 };\n return { flex: 1, flexBasis: 0, minWidth: 120 };\n },\n [rowSchema]\n );\n\n const tableMinWidth = useMemo(() => {\n return validGridColumns.reduce(\n (sum: number, col: string) => sum + (getColType(col) === \"boolean\" ? 80 : 150),\n 160\n );\n }, [validGridColumns, rowSchema]);\n\n return (\n <YStack gap=\"$2\" marginTop=\"$4\" marginBottom=\"$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 {modalProperties.length === 0 && (\n <MText color=\"$colorMuted\">{t(\"No editable properties found in schema.\")}</MText>\n )}\n {modalProperties.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\n justifyContent=\"space-between\"\n alignItems=\"center\"\n paddingHorizontal=\"$1\"\n paddingBottom=\"$2\"\n >\n <MText fontSize=\"$4\" fontWeight=\"600\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n <Button\n size=\"sm\"\n onPress={handleAdd}\n disabled={disabled}\n variant=\"ghost\"\n backgroundColor=\"transparent\"\n >\n {t(\"+ Add Row\")}\n </Button>\n </XStack>\n\n {/* Spreadsheet Grid Container */}\n <YStack\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$3\"\n overflowX=\"auto\"\n backgroundColor=\"$background\"\n style={{ borderCollapse: \"collapse\", borderSpacing: 0 } as any}\n >\n {/* Header Row */}\n <XStack\n backgroundColor=\"$backgroundStrong\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n minWidth={tableMinWidth}\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 {validGridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n {...getColumnLayout(col)}\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 {/* Action column spacer */}\n </XStack>\n </XStack>\n\n {/* Data Rows */}\n {rows.length === 0 ? (\n <YStack alignItems=\"center\" justifyContent=\"center\" padding=\"$6\">\n <MText color=\"$colorMuted\">{t(\"No data\")}</MText>\n </YStack>\n ) : (\n pageRows.map((_item: any, relativeIndex: number) => {\n const index = pageStart + relativeIndex;\n return (\n <YStack key={index}>\n {/* Data Row */}\n <XStack\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={tableMinWidth}\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 {validGridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n {...getColumnLayout(col)}\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 </YStack>\n );\n })\n )}\n </YStack>\n\n {/* Pagination */}\n {rows.length > pageSize && (\n <XStack\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n paddingHorizontal=\"$1\"\n flexWrap=\"wrap\"\n gap=\"$2\"\n marginTop=\"$1\"\n >\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 <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 )}\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 { useState, useCallback, KeyboardEvent } from \"react\";\nimport { FieldProps } from \"uniforms\";\nimport { Input, XStack, YStack, MText, Button, Icon, Paragraph } from \"@framework-m/ui\";\n\ninterface TagInputFieldProps {\n placeholder?: string;\n compact?: boolean;\n /**\n * Optional key to use if the value is an array of objects instead of strings.\n * E.g., if value is `[{ id: \"tag1\" }, { id: \"tag2\" }]`, set `valueKey=\"id\"`.\n * If not provided, assumes value is `string[]`.\n */\n valueKey?: string;\n // FieldProps already provides: name, label, value, onChange, field, required, error, showInlineError\n}\n\n// The actual value type from Uniforms can be string[] or Record<string, any>[]\n// We use `any[]` to accommodate both and handle the specific logic internally.\ntype TagInputFieldCombinedProps = TagInputFieldProps & FieldProps<any[] | string[], any>;\n\n// Combine with Uniforms' FieldProps.\n/**\n * A custom Uniforms field component for managing a list of strings as tags.\n * It reads `ui_meta.placeholder` from the field schema. Uses MText and Button for tags.\n * Can be configured to work with an array of strings or an array of objects.\n */\n// TODO: For future custom options (e.g., maxTags, allowSpaces), define them in the JSON schema's\n// `json_schema_extra` (or `uniforms` property) for this field. The TagInputField component\n// should then consume these properties from the `field.ui_meta` or `schema.uniforms` props.\n// This ensures schema-driven UI configuration and avoids hardcoding.\nexport function TagInputField(props: TagInputFieldCombinedProps) {\n const {\n name,\n placeholder,\n label, // from FieldProps\n value = [], // value can be string[] or Record<string, any>[]\n onChange,\n field, // from FieldProps\n compact, // from FieldProps\n required, // from FieldProps\n error, // from FieldProps\n showInlineError, // from FieldProps\n valueKey, // New prop for object-based tags\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n\n // Helper to get the display string from a tag value (string or object)\n const getTagDisplayValue = useCallback(\n (tag: any): string => {\n if (valueKey && typeof tag === \"object\" && tag !== null && tag[valueKey] !== undefined) {\n return String(tag[valueKey]);\n }\n return String(tag); // Assume it's already a string or can be stringified\n },\n [valueKey]\n );\n\n // Helper to create a new tag value (string or object) from an input string\n const createNewTagValue = useCallback(\n (inputString: string): any => {\n if (valueKey) {\n return { [valueKey]: inputString };\n }\n return inputString;\n },\n [valueKey]\n );\n\n // Helper to compare a display string with a tag value (string or object)\n const compareTagWithDisplay = useCallback(\n (tag: any, displayString: string): boolean => {\n if (valueKey && typeof tag === \"object\" && tag !== null && tag[valueKey] !== undefined) {\n return String(tag[valueKey]) === displayString;\n }\n return String(tag) === displayString;\n },\n [valueKey]\n );\n\n const handleAddTag = useCallback(() => {\n const trimmedValue = inputValue.trim();\n if (trimmedValue) {\n // Check if tag already exists (case-insensitive for display value)\n const exists = value.some((tag) => compareTagWithDisplay(tag, trimmedValue));\n if (!exists) {\n const newTag = createNewTagValue(trimmedValue);\n onChange([...value, newTag]);\n }\n // Clear input regardless of whether tag was added or was a duplicate\n setInputValue(\"\");\n }\n }, [inputValue, value, onChange, createNewTagValue, compareTagWithDisplay]);\n\n const handleRemoveTag = useCallback(\n (tagToRemoveDisplay: string) => {\n const newValue = value.filter((tag) => !compareTagWithDisplay(tag, tagToRemoveDisplay));\n onChange(newValue);\n },\n [value, onChange, compareTagWithDisplay]\n );\n\n const rawField: Record<string, any> = field ?? {};\n const uiMeta: Record<string, any> = rawField.ui_meta ?? {};\n\n // Resolve label: direct prop > ui_meta.label > field.label > name\n const resolvedLabel = label ?? uiMeta.label ?? (rawField as Record<string, any>).label ?? name;\n\n // Resolve placeholder: explicit prop > ui_meta.placeholder > default\n const resolvedPlaceholder = placeholder ?? uiMeta.placeholder ?? `Add ${resolvedLabel}`;\n\n // Hint text (brief helper text below the field)\n const hint: string | undefined = uiMeta.hint;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n event.preventDefault(); // Prevent form submission or tab navigation\n handleAddTag();\n } else if (event.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n // Remove last tag if input is empty and backspace is pressed\n const lastTagDisplay = getTagDisplayValue(value[value.length - 1]);\n handleRemoveTag(lastTagDisplay);\n }\n },\n [handleAddTag, handleRemoveTag, inputValue, value, getTagDisplayValue]\n );\n\n return (\n <YStack\n gap=\"$1\" // Aligned with TextField\n marginBottom={compact ? 0 : \"$2\"} // Aligned with TextField\n flex={compact ? 1 : undefined} // Aligned with TextField\n minWidth={compact ? 50 : \"100%\"} // Aligned with TextField\n alignSelf=\"stretch\" // Aligned with TextField\n role=\"group\"\n aria-labelledby={`${name}-label`}\n >\n {resolvedLabel &&\n !compact && ( // Conditional label rendering\n <MText id={`${name}-label`} fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {resolvedLabel} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n <XStack flexWrap=\"wrap\" gap=\"$2\">\n {value.map((tag: any, index: number) => {\n const displayTag = getTagDisplayValue(tag);\n return (\n <Button\n key={`${displayTag}-${index}`} // Use index in key for uniqueness if tags can be identical (e.g., two tags with value \"A\")\n size=\"sm\" // Corrected: Valid size for Button\n variant=\"default\" // Corrected: Use a supported variant like 'default'\n borderRadius=\"$6\"\n paddingHorizontal=\"$3\"\n paddingVertical=\"$1\"\n backgroundColor=\"$blue1\"\n borderColor=\"$blue8\"\n color=\"$blue10\"\n onPress={() => handleRemoveTag(displayTag)}\n aria-label={`Remove ${displayTag}`}\n >\n <MText fontSize=\"$3\" color=\"$blue10\">\n {displayTag}\n </MText>\n <Icon name=\"x\" size={12} color=\"$blue10\" marginLeft=\"$1\" />\n </Button>\n );\n })}\n </XStack>\n <XStack gap=\"$2\" alignItems=\"center\">\n {\" \"}\n {/* This XStack is now just for the input, but can be removed if not needed for other elements */}\n <Input\n flex={1}\n value={inputValue}\n onChangeText={setInputValue}\n onKeyPress={handleKeyDown}\n onBlur={handleAddTag} // Add tag on blur if input has value\n placeholder={resolvedPlaceholder}\n aria-label={`Add new ${resolvedLabel}`}\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 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 />\n <Button\n onPress={handleAddTag}\n disabled={!inputValue.trim()}\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Add ${resolvedLabel}`}\n >\n <Icon name=\"plus\" size={16} />\n </Button>\n </XStack>\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 {typeof error === \"string\" ? error : (error as { message?: string })?.message}\n </Paragraph>\n )}\n </YStack>\n );\n}\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 { TagInputField } from \"./TagInputField\"; // Import the new TagInputField\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 const explicitWidget =\n rawField.ui_widget || rawField.ui_meta?.ui_widget || rawField.ui_meta?.widget;\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 // Check for custom input_widget for Array of strings or objects (e.g., tag_input)\n // If the array items are objects, ui_meta.value_key should specify which property\n // to use as the tag value (e.g., \"name\" for [{name: \"Tag1\"}, {name: \"Tag2\"}]).\n // If ui_meta.value_key is not provided, TagInputField assumes an array of strings.\n if (rawField.ui_meta?.input_widget === \"tag_input\") {\n return (\n <TagInputField\n {...props}\n placeholder={rawField.ui_meta?.placeholder}\n valueKey={rawField.ui_meta?.value_key}\n />\n );\n }\n\n // ui_widget can be set directly on the field's json_schema_extra\n // or merged into ui_meta by enrich_schema\n if (explicitWidget === \"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 explicitWidget === \"datetime\" ||\n explicitWidget === \"datetime-local\" ||\n props.fieldType === Date ||\n rawFormat === \"date-time\" ||\n fieldName === \"creation\" ||\n fieldName === \"modified\"\n ) {\n return <Text {...props} type=\"datetime-local\" step={1} />;\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 (explicitWidget === \"date\" || 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. Numbers (Integers & Floats)\n if (props.fieldType === Number) {\n const isInteger =\n rawField.type === \"integer\" ||\n (Array.isArray(rawField.type) && rawField.type.includes(\"integer\"));\n return <Text {...props} type=\"number\" step={isInteger ? 1 : \"any\"} />;\n }\n\n // 9. Default: String / 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: false,\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 /** External validation error object to display */\n error?: any;\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 error,\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 error={error}\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","/**\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 /** Current selected rows (used to sync clears from parent) */\n selectedRows?: TData[];\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 selectedRows,\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 // Sync external clears (if parent sets selectedRows to empty, reset internal checkboxes)\n useEffect(() => {\n if (selectedRows && selectedRows.length === 0) {\n setRowSelection((prev) => (Object.keys(prev).length > 0 ? {} : prev));\n }\n }, [selectedRows]);\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: 36,\n header: ({ table }) => (\n <Input\n type=\"checkbox\"\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler() as any}\n style={{\n width: 14,\n height: 14,\n minWidth: 14,\n minHeight: 14,\n padding: 0,\n margin: 0,\n cursor: \"pointer\",\n accentColor: \"#8b5cf6\",\n }}\n />\n ),\n cell: ({ row }) => (\n <Input\n type=\"checkbox\"\n size=\"sm\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler() as any}\n onClick={(e: any) => e.stopPropagation()}\n style={{\n width: 14,\n height: 14,\n minWidth: 14,\n minHeight: 14,\n padding: 0,\n margin: 0,\n cursor: \"pointer\",\n accentColor: \"#8b5cf6\",\n }}\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 <YStack flex={1} overflowX=\"auto\" overflowY=\"hidden\">\n {/* Table Header */}\n <YStack\n borderBottomWidth={1}\n borderColor={borderColor as any}\n backgroundColor=\"$backgroundSecondary\"\n role=\"rowgroup\"\n marginBottom=\"$xs\"\n minWidth=\"fit-content\"\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <XStack key={headerGroup.id} width=\"100%\" minWidth=\"fit-content\" role=\"row\">\n {headerGroup.headers.map((header) => {\n const width =\n header.column.id === \"select\"\n ? 36\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 alignItems=\"stretch\"\n justifyContent=\"space-between\"\n minHeight={36}\n role=\"columnheader\"\n borderRightWidth={1}\n borderColor=\"transparent\"\n hoverStyle={{ borderColor: borderColor as any }}\n >\n <XStack\n gap=\"$xs\"\n alignItems=\"center\"\n flex={1}\n minWidth={0}\n paddingVertical={6}\n paddingHorizontal={8}\n cursor={header.column.getCanSort() ? \"pointer\" : \"default\"}\n onPress={\n header.column.getCanSort()\n ? header.column.getToggleSortingHandler()\n : undefined\n }\n >\n <MText fontWeight=\"700\" fontSize=\"$sm\" numberOfLines={1}>\n {flexRender(header.column.columnDef.header, header.getContext())}\n </MText>\n {header.column.getIsSorted() && (\n <Icon\n name={\n header.column.getIsSorted() === \"asc\" ? \"chevron-up\" : \"chevron-down\"\n }\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={16}\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 onPress={(e: any) => e.stopPropagation()}\n onClick={(e: any) => e.stopPropagation()}\n hoverStyle={{ backgroundColor: \"rgba(0,0,0,0.05)\" }}\n >\n <YStack\n width={2}\n height=\"50%\"\n borderRadius=\"$round\"\n backgroundColor=\"$primary\"\n opacity={0.3}\n />\n </XStack>\n ) : null}\n </XStack>\n );\n })}\n </XStack>\n ))}\n </YStack>\n\n {/* Table Body */}\n <YStack\n role=\"rowgroup\"\n flex={1}\n minHeight={0}\n minWidth=\"fit-content\"\n style={{ overflowY: \"auto\" } as any}\n >\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 minWidth=\"fit-content\"\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: 36, 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 paddingVertical={4}\n paddingHorizontal={8}\n alignItems=\"center\"\n minHeight={32}\n role=\"cell\"\n >\n <MText fontSize=\"$sm\" numberOfLines={1}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </MText>\n </XStack>\n );\n })}\n </XStack>\n ))\n )}\n </YStack>\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 $sm={{ flexDirection: \"column-reverse\" }}\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 $sm={{\n width: \"100%\",\n height: 64,\n flexDirection: \"row\",\n borderRightWidth: 0,\n borderTopWidth: 1,\n justifyContent: \"space-between\",\n paddingTop: 0,\n paddingBottom: 0,\n paddingHorizontal: \"$lg\",\n }}\n >\n <Skeleton variant=\"avatar\" width={32} height={32} opacity={0.5} />\n <YStack\n gap=\"$lg\"\n marginTop=\"$xl\"\n opacity={0.2}\n $sm={{\n flexDirection: \"row\",\n marginTop: 0,\n }}\n >\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, type CrudFilters } 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 filters?: CrudFilters;\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, filters }: 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 filters,\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=\"stretch\"\n flex={1}\n width=\"100%\"\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, type CrudFilters } 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 /** Additional filters */\n filters?: CrudFilters;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Format date as local YYYY-MM-DD\n */\nfunction formatLocalDate(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\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, filters }: 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 // View and Date state\n const [viewMode, setViewMode] = useState<\"month\" | \"week\" | \"day\">(\"month\");\n const [currentDate, setCurrentDate] = useState(new Date());\n\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n const date = currentDate.getDate();\n const dayOfWeek = currentDate.getDay();\n\n // Calculate exact bounds for the API query\n const { startDate, endDate } = useMemo(() => {\n let start: Date, end: Date;\n if (viewMode === \"month\") {\n start = new Date(year, month, 1);\n end = new Date(year, month + 1, 0);\n } else if (viewMode === \"week\") {\n start = new Date(year, month, date - dayOfWeek);\n end = new Date(year, month, date + (6 - dayOfWeek));\n } else {\n start = new Date(year, month, date);\n end = new Date(year, month, date);\n }\n start.setHours(0, 0, 0, 0);\n end.setHours(23, 59, 59, 999);\n return { startDate: start, endDate: end };\n }, [year, month, date, dayOfWeek, viewMode]);\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n ...(filters || []),\n { field: startField, operator: \"gte\", value: startDate.toISOString() },\n { field: startField, operator: \"lte\", value: endDate.toISOString() },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Generate the specific days to display on the grid\n const displayedDays = useMemo(() => {\n const days: Date[] = [];\n const current = new Date(startDate);\n current.setHours(0, 0, 0, 0);\n const end = new Date(endDate);\n end.setHours(0, 0, 0, 0);\n\n while (current <= end) {\n days.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return days;\n }, [startDate, endDate]);\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 rawDate = event[startField];\n if (!rawDate) continue;\n\n const dateObj = new Date(String(rawDate));\n const dateStr = isNaN(dateObj.getTime())\n ? String(rawDate).split(\"T\")[0]\n : formatLocalDate(dateObj);\n\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 prev = () => {\n if (viewMode === \"month\") setCurrentDate(new Date(year, month - 1, date));\n else if (viewMode === \"week\") setCurrentDate(new Date(year, month, date - 7));\n else setCurrentDate(new Date(year, month, date - 1));\n };\n const next = () => {\n if (viewMode === \"month\") setCurrentDate(new Date(year, month + 1, date));\n else if (viewMode === \"week\") setCurrentDate(new Date(year, month, date + 7));\n else setCurrentDate(new Date(year, month, date + 1));\n };\n const today = () => setCurrentDate(new Date());\n\n // Dynamic Header Title\n const headerTitle = useMemo(() => {\n if (viewMode === \"month\") {\n return currentDate.toLocaleString(\"default\", { month: \"long\", year: \"numeric\" });\n }\n if (viewMode === \"day\") {\n return currentDate.toLocaleString(\"default\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n }\n const startStr = startDate.toLocaleString(\"default\", { month: \"short\", day: \"numeric\" });\n const endStr = endDate.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n return `${startStr} - ${endStr}`;\n }, [currentDate, startDate, endDate, viewMode]);\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n const firstDayOffset = viewMode === \"month\" ? new Date(year, month, 1).getDay() : 0;\n const colWidth = viewMode === \"day\" ? \"100%\" : `${100 / 7}%`;\n const maxEventsShown = viewMode === \"month\" ? 3 : 10;\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\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom=\"$md\"\n flexWrap=\"wrap\"\n gap=\"$sm\"\n >\n <XStack gap=\"$sm\">\n <Button size=\"sm\" variant=\"ghost\" onPress={prev}>\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={next}>\n {t(\"Next \\u2192\")}\n </Button>\n </XStack>\n\n <Heading size=\"$sm\" margin={0}>\n {headerTitle}\n </Heading>\n\n <XStack\n gap={0}\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$sm\"\n overflow=\"hidden\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n >\n <Button\n size=\"sm\"\n variant={viewMode === \"month\" ? \"primary\" : \"ghost\"}\n borderRadius={0}\n borderWidth={0}\n onPress={() => setViewMode(\"month\")}\n >\n {t(\"Month\")}\n </Button>\n <Button\n size=\"sm\"\n variant={viewMode === \"week\" ? \"primary\" : \"ghost\"}\n borderRadius={0}\n borderWidth={0}\n onPress={() => setViewMode(\"week\")}\n >\n {t(\"Week\")}\n </Button>\n <Button\n size=\"sm\"\n variant={viewMode === \"day\" ? \"primary\" : \"ghost\"}\n borderRadius={0}\n borderWidth={0}\n onPress={() => setViewMode(\"day\")}\n >\n {t(\"Day\")}\n </Button>\n </XStack>\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 {viewMode !== \"day\" &&\n weekDays.map((day) => (\n <YStack\n key={day}\n width={colWidth}\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 {viewMode === \"month\" &&\n Array.from({ length: firstDayOffset }).map((_, i) => (\n <YStack\n key={`empty-${i}`}\n width={colWidth}\n backgroundColor=\"rgba(0,0,0,0.02)\"\n minHeight={80}\n />\n ))}\n\n {/* Days */}\n {displayedDays.map((day) => {\n const dateStr = formatLocalDate(day);\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === formatLocalDate(new Date());\n\n return (\n <YStack\n key={dateStr}\n width={colWidth}\n backgroundColor=\"$background\"\n minHeight={viewMode === \"month\" ? 80 : 200}\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, maxEventsShown).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 > maxEventsShown && (\n <MText fontSize={10} color=\"$colorMuted\">\n +{events.length - maxEventsShown} {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, type CrudFilters } 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 /** Additional filters */\n filters?: CrudFilters;\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 const now = new Date();\n let minDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n let maxDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\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())) {\n const s = new Date(start.getFullYear(), start.getMonth(), start.getDate());\n if (s < minDate) minDate = s;\n }\n if (!isNaN(end.getTime())) {\n const e = new Date(end.getFullYear(), end.getMonth(), end.getDate());\n if (e > maxDate) maxDate = e;\n }\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 const s = new Date(start.getFullYear(), start.getMonth(), start.getDate());\n const e = new Date(end.getFullYear(), end.getMonth(), end.getDate());\n return Math.round((e.getTime() - s.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, filters }: 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 filters,\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 // Generate month spans\n const monthSpans = useMemo(() => {\n const spans: { label: string; colSpan: number }[] = [];\n if (dayHeaders.length === 0) return spans;\n\n let currentMonth = dayHeaders[0].getMonth();\n let currentYear = dayHeaders[0].getFullYear();\n let spanCount = 0;\n\n for (const day of dayHeaders) {\n if (day.getMonth() === currentMonth && day.getFullYear() === currentYear) {\n spanCount++;\n } else {\n const date = new Date(currentYear, currentMonth, 1);\n spans.push({\n label: date.toLocaleString(\"default\", { month: \"short\", year: \"numeric\" }),\n colSpan: spanCount,\n });\n currentMonth = day.getMonth();\n currentYear = day.getFullYear();\n spanCount = 1;\n }\n }\n if (spanCount > 0) {\n const date = new Date(currentYear, currentMonth, 1);\n spans.push({\n label: date.toLocaleString(\"default\", { month: \"short\", year: \"numeric\" }),\n colSpan: spanCount,\n });\n }\n return spans;\n }, [dayHeaders]);\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\" flex={1} width=\"100%\">\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={54}\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 {/* Month Headers */}\n <XStack\n height={24}\n backgroundColor=\"$backgroundSecondary\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n >\n {monthSpans.map((span, i) => (\n <YStack\n key={i}\n width={span.colSpan * dayWidth}\n flexShrink={0}\n borderRightWidth={1}\n borderColor=\"$borderColor\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize={11} fontWeight=\"600\">\n {span.label}\n </MText>\n </YStack>\n ))}\n </XStack>\n {/* Day Headers */}\n <XStack height={30} 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 — 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, useMemo, type KeyboardEvent } from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\nimport { YStack, XStack, Button, Input, MText } from \"@framework-m/ui\";\nimport { useComponentOverride } from \"../hooks\";\nimport { useTranslation } from \"../hooks\";\nimport { useList, useUpdate, useCreate, useGo, type CrudFilters } from \"@refinedev/core\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n filters?: CrudFilters;\n onNodeClick?: (row: any) => void;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\ninterface TreeNode {\n id: string;\n name: string;\n label: string;\n children: TreeNode[];\n raw: any;\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 onRename,\n onAddChild,\n dragNodeId,\n onDragStart,\n onDrop,\n onNodeClick,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n onRename: (node: TreeNode, newLabel: string) => void;\n onAddChild: (node: TreeNode) => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetNode: TreeNode | null) => void;\n onNodeClick?: (row: any) => void;\n}>) {\n const { t } = useTranslation(\"desk\");\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n onRename(node, newLabel);\n },\n [node, onRename]\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);\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\n flex={1}\n fontSize=\"$sm\"\n lineHeight={1.4}\n cursor={onNodeClick ? \"pointer\" : \"default\"}\n hoverStyle={onNodeClick ? { color: \"$primary\" } : undefined}\n onPress={(e: any) => {\n e.stopPropagation();\n onNodeClick?.(node.raw);\n }}\n >\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 onAddChild(node);\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 {/* 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 onRename={onRename}\n onAddChild={onAddChild}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n onNodeClick={onNodeClick}\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, config, filters, onNodeClick }: Readonly<TreeViewProps>) {\n const { t } = useTranslation(\"desk\");\n const titleField = (config as any)?.titleField || \"title\";\n const parentField = (config as any)?.parentField || \"parent_value\";\n\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n const go = useGo();\n\n const { result, query } = useList<any>({\n resource,\n pagination: { pageSize: 1000 },\n sorters: [{ field: \"lft\", order: \"asc\" }],\n filters,\n });\n\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n const isError = query?.isError ?? false;\n const refetch = query?.refetch ?? (() => {});\n\n const { mutate: updateItem } = useUpdate();\n const { mutate: createItem } = useCreate();\n\n const tree = useMemo(() => {\n const nodeMap = new Map<string, TreeNode>();\n const roots: TreeNode[] = [];\n\n // Pass 1: Map items to tree nodes\n items.forEach((item: any) => {\n nodeMap.set(item.id, {\n id: item.id,\n name: item.name,\n label: String(item[titleField] || item.name || \"Untitled\"),\n children: [],\n raw: item,\n });\n });\n\n // Pass 2: Reconstruct Hierarchy\n items.forEach((item: any) => {\n const node = nodeMap.get(item.id)!;\n const parentId = item[parentField];\n if (parentId && nodeMap.has(parentId)) {\n nodeMap.get(parentId)!.children.push(node);\n } else {\n roots.push(node);\n }\n });\n\n return roots;\n }, [items, titleField]);\n\n const handleDrop = useCallback(\n (targetNode: TreeNode | null) => {\n if (!dragNodeId || dragNodeId === targetNode?.id) {\n setDragNodeId(null);\n return;\n }\n updateItem(\n {\n resource,\n id: dragNodeId,\n values: { [parentField]: targetNode ? targetNode.id : null },\n },\n { onSuccess: () => refetch() }\n );\n setDragNodeId(null);\n },\n [dragNodeId, resource, updateItem, refetch]\n );\n\n const handleAddRoot = useCallback(\n (label: string) => {\n setAddingRoot(false);\n if (label.trim()) {\n createItem(\n { resource, values: { [titleField]: label, [parentField]: null } },\n { onSuccess: () => refetch() }\n );\n }\n },\n [createItem, resource, titleField, refetch]\n );\n\n const handleRename = useCallback(\n (node: TreeNode, newLabel: string) => {\n updateItem(\n { resource, id: node.id, values: { [titleField]: newLabel } },\n { onSuccess: () => refetch() }\n );\n },\n [updateItem, resource, titleField, refetch]\n );\n\n const handleAddChild = useCallback(\n (node: TreeNode) => {\n const formStr = JSON.stringify({ [parentField]: node.id });\n go({\n to: `/app/${resource}/new`,\n query: { form: formStr },\n });\n },\n [go, resource, parentField]\n );\n\n if (isLoading) {\n return (\n <YStack padding=\"$lg\">\n <MText color=\"$colorMuted\">{t(\"Loading tree...\")}</MText>\n </YStack>\n );\n }\n\n if (isError) {\n return (\n <YStack padding=\"$xl\" alignItems=\"center\">\n <MText color=\"$error\">{t(\"Failed to load tree\")}</MText>\n <Button variant=\"ghost\" onPress={() => void refetch()} marginTop=\"$sm\">\n {t(\"Retry\")}\n </Button>\n </YStack>\n );\n }\n\n return (\n <YStack padding=\"$md\" flex={1} width=\"100%\">\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 refetch()} 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);\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 {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 {tree.map((node) => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n onRename={handleRename}\n onAddChild={handleAddChild}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={handleDrop}\n onNodeClick={onNodeClick}\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 YStack,\n Popover,\n} from \"@framework-m/ui\";\nimport { TableSkeleton } from \"../layout/ShellSkeleton\";\nimport { Slot } from \"../../plugins\";\nimport { GanttView, KanbanView, TreeView, CalendarView } from \"../../views\";\nimport { ConfirmDialog } from \"../feedback\";\nimport { AutoTable } from \"../table\";\nimport type { FilterFieldDefinition, FilterRow, FilterValueKind } 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\nfunction getValidOperators(type: FilterValueKind | undefined): FilterOperator[] {\n switch (type) {\n case \"number\":\n return [\"eq\", \"gt\", \"lt\", \"in\"];\n case \"date\":\n case \"datetime\":\n return [\"eq\", \"gt\", \"lt\"];\n case \"boolean\":\n return [\"eq\"];\n case \"select\":\n return [\"eq\", \"in\"];\n case \"text\":\n default:\n return [\"eq\", \"like\", \"in\"];\n }\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 canCalendar: boolean;\n calendarConfig: any;\n confirmBulkDelete: () => Promise<void>;\n handleBulkDelete: () => Promise<void>;\n hasLockedSelection?: boolean;\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 canCalendar,\n calendarConfig,\n confirmBulkDelete,\n handleBulkDelete,\n hasLockedSelection,\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 const availableViews = [\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 { key: \"gantt\", label: t(\"Gantt\"), enabled: canGantt },\n { key: \"calendar\", label: t(\"Calendar\"), enabled: canCalendar },\n ].filter((v) => v.enabled);\n\n const actionButtons = (\n <>\n {availableViews.length > 1 && (\n <Select\n value={activeView}\n onValueChange={(val: string) => setActiveView(val as ListViewMode)}\n options={availableViews.map((v) => ({ label: v.label, value: v.key }))}\n size=\"sm\"\n width={isMobile ? 105 : 120}\n placement=\"bottom-end\"\n />\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n borderRadius=\"$sm\"\n onPress={handleNew}\n paddingHorizontal={isMobile ? \"$sm\" : \"$md\"}\n >\n <Icon name=\"plus\" size={14} color=\"#fff\" strokeWidth={2.4} />\n {t(\"New\")}\n </Button>\n </>\n );\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\n justifyContent=\"space-between\"\n alignItems={isMobile ? \"flex-start\" : \"center\"}\n gap=\"$md\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n >\n <XStack\n gap=\"$sm\"\n flex={1}\n minWidth={0}\n width=\"100%\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n overflow=\"visible\"\n >\n <YStack flex={1} minWidth={0} flexShrink={1}>\n <Heading size=\"$sm\" margin={0} color=\"$color\" numberOfLines={1}>\n {title}\n </Heading>\n </YStack>\n {isMobile && (\n <XStack gap=\"$xs\" alignItems=\"center\" flexShrink={0}>\n {actionButtons}\n </XStack>\n )}\n </XStack>\n\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n justifyContent={isMobile ? \"flex-start\" : \"flex-end\"}\n width={isMobile ? \"100%\" : undefined}\n >\n <Slot name=\"list-header-actions\" doctype={doctype} />\n {!isMobile && actionButtons}\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 <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 position=\"relative\"\n alignItems=\"center\"\n flex={1}\n width={isMobile ? \"100%\" : undefined}\n >\n <XStack position=\"absolute\" left={10} zIndex={10} pointerEvents=\"none\">\n <Icon name=\"search\" size={16} color=\"$colorMuted\" />\n </XStack>\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={0}\n borderRadius=\"$sm\"\n paddingLeft={36}\n paddingRight={72}\n />\n <XStack position=\"absolute\" right={4} zIndex={10} alignItems=\"center\" gap=\"$1\">\n {(hasDraftSearchQuery || hasAppliedSearchQuery) && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$round\"\n padding={0}\n width={28}\n height={28}\n onPress={clearSearch}\n aria-label=\"Clear search\"\n >\n <Icon name=\"x\" size={14} color=\"$colorMuted\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$round\"\n padding={0}\n width={28}\n height={28}\n onPress={applySearch}\n disabled={!hasPendingSearchChanges}\n aria-label=\"Apply search\"\n opacity={hasPendingSearchChanges ? 1 : 0.3}\n >\n <Icon\n name=\"arrow-right\"\n size={16}\n color={hasPendingSearchChanges ? \"$primary\" : \"$colorMuted\"}\n />\n </Button>\n </XStack>\n </XStack>\n\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n width={isMobile ? \"100%\" : undefined}\n >\n <Button\n variant={isFilterPanelOpen || appliedFilters.length > 0 ? \"primary\" : \"ghost\"}\n size=\"sm\"\n borderWidth={1}\n borderColor={isFilterPanelOpen ? \"$primary\" : \"$borderColorMuted\"}\n borderRadius={isMobile ? \"$sm\" : \"$md\"}\n flex={isMobile ? 1 : undefined}\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 {!isMobile && t(\"Filter\")}\n {appliedFilters.length > 0 ? ` (${appliedFilters.length})` : \"\"}\n <Icon\n name={isFilterPanelOpen ? \"x\" : \"chevron-down\"}\n size={13}\n color={isFilterPanelOpen || appliedFilters.length > 0 ? \"#fff\" : \"$colorMuted\"}\n />\n {isMobile ? \"\" : ` (${appliedFilters.length})`}\n </Button>\n\n <MStack flex={isMobile ? 1 : undefined} width={isMobile ? undefined : 90}>\n <Popover\n placement=\"bottom-end\"\n open={isColumnsMenuOpen}\n onOpenChange={setIsColumnsMenuOpen}\n trigger={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor={isColumnsMenuOpen ? \"$primary\" : \"$borderColorMuted\"}\n borderRadius={isMobile ? \"$sm\" : \"$md\"}\n width={isMobile ? \"100%\" : undefined}\n >\n <Icon name=\"columns-3\" size={14} color=\"$color\" />\n {!isMobile && t(\"Columns\")}\n </Button>\n }\n content={\n <MStack gap=\"$sm\" minWidth={180}>\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 }\n />\n </MStack>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius={isMobile ? \"$sm\" : \"$md\"}\n flex={isMobile ? 1 : undefined}\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 {!isMobile && t(\"Reset\")}\n </Button>\n\n <Slot name=\"list-filters\" doctype={doctype} data={listFilterSlotData} />\n </XStack>\n </XStack>\n\n {/* INLINE FILTER PANEL */}\n {isFilterPanelOpen && (\n <MStack\n marginTop=\"$xs\"\n paddingTop=\"$sm\"\n borderTopWidth={1}\n borderColor=\"$borderColorMuted\"\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 <YStack paddingRight=\"$xs\" 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 const validOps = getValidOperators(fieldConfig?.type);\n const operatorOptions = FILTER_OPERATOR_OPTIONS.filter((op) =>\n validOps.includes(op.value)\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%\" : 160}\n onChange={(value) => {\n const nextField = coerceSelectValue(value) || row.field;\n const nextType = filterFieldMap[nextField]?.type;\n const validNextOps = getValidOperators(nextType);\n const nextOp = validNextOps.includes(row.operator)\n ? row.operator\n : validNextOps[0];\n\n updateFilterRow(row.id, {\n field: nextField,\n operator: nextOp,\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={operatorOptions}\n width={isMobile ? \"100%\" : 130}\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%\" : 180}\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) => updateFilterRow(row.id, { value })}\n width={isMobile ? \"100%\" : 180}\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 </YStack>\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 </MStack>\n )}\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 {activeView === \"list\" && (\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 disabled={hasLockedSelection}\n opacity={hasLockedSelection ? 0.5 : 1}\n >\n {hasLockedSelection ? t(\"Cannot Delete Locked\") : 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 selectedRows={selectedRows as any}\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 filters={tableFilters}\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 filters={tableFilters}\n onNodeClick={handleRowClick}\n />\n )}\n\n {activeView === \"gantt\" && canGantt && ganttConfig && (\n <GanttView resource={doctype} config={ganttConfig} filters={tableFilters} />\n )}\n\n {(activeView as string) === \"calendar\" && canCalendar && calendarConfig && (\n <CalendarView resource={doctype} config={calendarConfig} filters={tableFilters} />\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 * 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\";\nimport { SYSTEM_FIELDS } from \"../components/table/tableUtils\";\n\nexport interface ListViewProps {\n doctype?: string;\n view?: \"list\" | \"kanban\" | \"tree\" | \"gantt\" | \"calendar\";\n}\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n [key: string]: unknown;\n}\n\n// We use the global SYSTEM_FIELDS, but we strictly ALLOW \"name\" to pass through\n// because for primary List Views, \"name\" (e.g. INV-0001) is the main human-readable identifier!\nconst LIST_SYSTEM_FIELDS = new Set(SYSTEM_FIELDS.filter((f) => f !== \"name\"));\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 as any).ui_meta?.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 const metaCalendar = uiMeta?.additional_views?.calendar as\n | {\n startField?: string;\n titleField?: 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 calendarStartField = useMemo(() => {\n return pickFirst(\n metaCalendar?.startField,\n schemaFields.date ? \"date\" : undefined,\n schemaFields.start_date ? \"start_date\" : undefined\n );\n }, [metaCalendar, schemaFields]);\n\n const calendarConfig = useMemo(() => {\n if (!calendarStartField) return undefined;\n return {\n startField: calendarStartField,\n titleField:\n pickFirst(\n metaCalendar?.titleField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.name ? \"name\" : undefined\n ) ?? \"name\",\n };\n }, [metaCalendar, schemaFields, calendarStartField]);\n\n const canCalendar = Boolean(calendarConfig);\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 canCalendar,\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 // Check if any selected row is locked (docstatus === 1 or 2)\n const hasLockedSelection = useMemo(() => {\n return selectedRows.some((row) => {\n const status = Number(row.docstatus);\n return status === 1 || status === 2;\n });\n }, [selectedRows]);\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 canCalendar={canCalendar}\n calendarConfig={calendarConfig}\n confirmBulkDelete={confirmBulkDelete}\n handleBulkDelete={handleBulkDelete}\n hasLockedSelection={hasLockedSelection}\n handleNew={handleNew}\n />\n );\n}\n\nexport default ListView;\n","import { XStack, Button, Card } from \"@framework-m/ui\";\nimport { Frm } from \"../../hooks/useFormController\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface FormToolbarProps {\n frm: Frm;\n submitLabel: string;\n docstatus?: number;\n}\n\nexport function FormToolbar({ frm, submitLabel, docstatus }: FormToolbarProps) {\n const { t } = useTranslation(\"desk\");\n const isLocked = frm.isLocked;\n\n return (\n <Card\n style={{ position: \"sticky\", bottom: 0 } as any}\n marginTop=\"$md\"\n zIndex={100}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n borderRadius=\"$md\"\n elevated\n >\n <XStack gap=\"$sm\" justifyContent=\"space-between\">\n {!isLocked ? (\n <>\n <Button\n variant=\"ghost\"\n size=\"md\"\n flex={1}\n onPress={() => frm.cancel()}\n disabled={frm.isSaving}\n >\n {t(\"Discard\")}\n </Button>\n <Button\n variant=\"primary\"\n size=\"md\"\n flex={1}\n onPress={() => frm.save()}\n disabled={frm.isSaving}\n >\n {submitLabel}\n </Button>\n </>\n ) : docstatus === 1 ? (\n <>\n <Button variant=\"danger\" size=\"md\" flex={1} disabled>\n {t(\"Cancel\")}\n </Button>\n <Button variant=\"primary\" size=\"md\" flex={1} disabled>\n {t(\"Correct / Amend\")}\n </Button>\n </>\n ) : docstatus === 2 ? (\n <Button variant=\"primary\" size=\"md\" flex={1} disabled>\n {t(\"Amend\")}\n </Button>\n ) : null}\n </XStack>\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 React from \"react\";\nimport {\n XStack,\n MStack,\n MText,\n Heading,\n Card,\n Button,\n Popover,\n YStack,\n Icon,\n} from \"@framework-m/ui\";\nimport { WorkflowActions } from \"../workflow/WorkflowActions\";\nimport { AlertBanner } from \"../feedback/AlertBanner\";\nimport { SubmittedBanner } from \"../feedback/SubmittedBanner\";\nimport { useTranslation } from \"../../hooks\";\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 submitLabel: string;\n onSave: () => void;\n onDiscard: () => void;\n isSaving: boolean;\n isLocked: boolean;\n docstatus?: number;\n showSystemInfo: boolean;\n setShowSystemInfo: (v: boolean) => void;\n openPrintPreview: () => void;\n downloadPrintPdf: () => void;\n isMobile?: boolean;\n onDelete?: () => void;\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 submitLabel,\n onSave,\n onDiscard,\n isSaving,\n isLocked,\n docstatus,\n showSystemInfo,\n setShowSystemInfo,\n openPrintPreview,\n downloadPrintPdf,\n isMobile = false,\n onDelete,\n}) => {\n const { t } = useTranslation(\"desk\");\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={onDiscard}\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 <XStack gap=\"$sm\" alignItems=\"center\">\n {/* Dynamic Buttons (Desktop Only) */}\n {!isMobile && (\n <XStack gap=\"$sm\" alignItems=\"center\" marginRight=\"$sm\">\n {!isLocked ? (\n <>\n <Button variant=\"ghost\" size=\"sm\" onPress={onDiscard} disabled={isSaving}>\n {t(\"Discard\")}\n </Button>\n <Button variant=\"primary\" size=\"sm\" onPress={onSave} disabled={isSaving}>\n {submitLabel}\n </Button>\n </>\n ) : docstatus === 1 ? (\n <>\n <Button variant=\"danger\" size=\"sm\" disabled>\n {t(\"Cancel\")}\n </Button>\n <Button variant=\"primary\" size=\"sm\" disabled>\n {t(\"Correct / Amend\")}\n </Button>\n </>\n ) : docstatus === 2 ? (\n <Button variant=\"primary\" size=\"sm\" disabled>\n {t(\"Amend\")}\n </Button>\n ) : null}\n </XStack>\n )}\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\n {/* More Options (...) Menu */}\n {isEditing && (\n <Popover\n placement=\"bottom-end\"\n trigger={\n <Button variant=\"ghost\" size=\"sm\" paddingHorizontal=\"$2\">\n <Icon name=\"more-vertical\" size={16} color=\"$color\" />\n </Button>\n }\n content={\n <YStack gap=\"$xs\" minWidth={180}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={openPrintPreview}\n >\n <Icon name=\"printer\" size={14} color=\"$colorMuted\" />\n <MText>{t(\"Print Preview\")}</MText>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={downloadPrintPdf}\n >\n <Icon name=\"download\" size={14} color=\"$colorMuted\" />\n <MText>{t(\"Download PDF\")}</MText>\n </Button>\n <MStack height={1} backgroundColor=\"$borderColorMuted\" marginVertical=\"$xs\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={() => setShowSystemInfo(!showSystemInfo)}\n >\n <Icon name=\"info\" size={14} color=\"$colorMuted\" />\n <MText>{showSystemInfo ? t(\"Hide System Info\") : t(\"System Info\")}</MText>\n </Button>\n {onDelete && (\n <>\n <MStack height={1} backgroundColor=\"$borderColorMuted\" marginVertical=\"$xs\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={onDelete}\n >\n <Icon name=\"trash-2\" size={14} color=\"$error\" />\n <MText color=\"$error\">{t(\"Delete\")}</MText>\n </Button>\n </>\n )}\n </YStack>\n }\n />\n )}\n </XStack>\n </XStack>\n\n {/* Validation Errors */}\n {frm.errors && frm.errors.length > 0 && (\n <Card\n marginBottom=\"$md\"\n backgroundColor=\"rgba(239, 68, 68, 0.1)\"\n borderColor=\"$error\"\n borderWidth={1}\n padding=\"$md\"\n borderRadius=\"$sm\"\n >\n <MStack gap=\"$xs\">\n {frm.errors.map((error: string, i: number) => (\n <MText\n key={`${error}-text-${i}`}\n color=\"$error\"\n fontSize=\"$sm\"\n fontWeight={i === 0 ? \"600\" : \"400\"}\n >\n {error}\n </MText>\n ))}\n </MStack>\n </Card>\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, Icon } from \"@framework-m/ui\";\nimport { SystemInfo } from \"../components/layout/SystemInfo\";\nimport { useRef, useState, useEffect, 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\";\nimport { useDelete } from \"@refinedev/core\";\nimport { useNavigate, useSearchParams, useBlocker } from \"react-router\";\nimport { ConfirmDialog } from \"../components/feedback\";\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, changeLanguage, language } = 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 const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n const [isDiscardConfirmOpen, setIsDiscardConfirmOpen] = useState(false);\n const [uiError, setUiError] = useState<string | null>(null);\n useFormKeyboard(formRef);\n\n const { uiMeta } = useUIMeta(doctype);\n\n const {\n handleTouchStart,\n handleTouchEnd,\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 const { mutateAsync: deleteMutate } = useDelete();\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n\n // --- Dirty State Tracking & Navigation Blocking ---\n const baselineDocRef = useRef<string | null>(null);\n const lastRecordRef = useRef<string | null>(null);\n const [isDirty, setIsDirty] = useState(false);\n const bypassBlockerRef = useRef(false);\n\n // Reset baseline state when id, doctype, or form query param changes\n const formParam = searchParams.get(\"form\");\n useEffect(() => {\n baselineDocRef.current = null;\n lastRecordRef.current = null;\n }, [id, doctype, formParam]);\n\n // 1. Establish baseline state\n useEffect(() => {\n if (record) {\n const recordStr = JSON.stringify(record);\n if (lastRecordRef.current !== recordStr) {\n lastRecordRef.current = recordStr;\n baselineDocRef.current = recordStr;\n }\n } else if (frm.doc && baselineDocRef.current === null) {\n // For new docs, establish baseline immediately since form parameters\n // are synchronously loaded inside useFormController.\n baselineDocRef.current = JSON.stringify(frm.doc);\n }\n }, [record, frm.doc]);\n\n // 2. Check for dirty state\n useEffect(() => {\n if (baselineDocRef.current && frm.doc && !frm.isSaving) {\n setIsDirty(JSON.stringify(frm.doc) !== baselineDocRef.current);\n }\n }, [frm.doc, frm.isSaving]);\n\n useEffect(() => {\n // 1. Global language switch via ?lng=hi\n const lng = searchParams.get(\"lng\");\n if (lng && changeLanguage && language !== lng) {\n changeLanguage(lng).catch(() => undefined);\n }\n }, [searchParams, changeLanguage, language]); // Removed queryParamsInitialized.current from dependencies\n\n // 4. Browser Native Blocker (Hard Refresh/Close)\n useEffect(() => {\n if (!isDirty || frm.isSaving) return;\n if (typeof window === \"undefined\" || !window.addEventListener) return;\n\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = \"\";\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }, [isDirty, frm.isSaving]);\n\n // 4.5. Client-Side Routing Blocker (Data Router Native)\n const blocker = useBlocker(({ currentLocation, nextLocation }) => {\n if (bypassBlockerRef.current) return false;\n if ((nextLocation.state as Record<string, unknown>)?.bypassBlocker) return false;\n return isDirty && !frm.isSaving && currentLocation.pathname !== nextLocation.pathname;\n });\n\n useEffect(() => {\n if (blocker.state === \"blocked\") {\n setIsDiscardConfirmOpen(true);\n }\n }, [blocker.state]);\n\n // Global Cmd/Ctrl + S shortcut to save the form safely across platforms\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.addEventListener) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"s\") {\n e.preventDefault(); // Prevent browser's native \"Save Page\" dialog\n if (!frm.isLocked && !frm.isSaving) {\n frm.save({ preventNavigation: !!uiMeta?.auto_save } as any);\n }\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [frm, uiMeta?.auto_save]);\n\n // 5. Debounced Auto-Save (Drafts and Standard DocTypes Only)\n useEffect(() => {\n if (\n uiMeta?.auto_save &&\n isEditing &&\n isDirty &&\n !frm.isSaving &&\n !frm.isLocked &&\n (!record || record.docstatus === 0 || record.docstatus === undefined)\n ) {\n const timer = setTimeout(() => {\n frm.save({ preventNavigation: true } as any);\n }, 1500); // Save 1.5 seconds after the user stops typing\n\n return () => clearTimeout(timer);\n }\n }, [\n uiMeta?.auto_save,\n isEditing,\n isDirty,\n frm.doc,\n frm.isSaving,\n frm.isLocked,\n record?.docstatus,\n frm,\n ]);\n\n const handleDelete = async () => {\n if (!id) return;\n bypassBlockerRef.current = true; // Bypass blocker\n setIsDirty(false);\n try {\n await deleteMutate({\n resource: doctype,\n id,\n });\n setIsDeleteConfirmOpen(false);\n navigate(`/app/${doctype}/list`, { state: { bypassBlocker: true } });\n } catch (err: any) {\n bypassBlockerRef.current = false;\n setIsDeleteConfirmOpen(false);\n setUiError(err.message || `Failed to delete ${doctype}.`);\n }\n };\n\n const handleDownloadPdf = async () => {\n setUiError(null);\n try {\n await downloadPrintPdf();\n } catch (err: any) {\n setUiError(err.message || `Failed to download PDF for ${doctype}.`);\n }\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=\"$0\"\n width=\"100%\"\n backgroundColor=\"$background\"\n onTouchStart={shell.isMobile ? (e: any) => handleTouchStart(e) : undefined}\n onTouchEnd={shell.isMobile ? (e: any) => handleTouchEnd(e) : undefined}\n paddingBottom=\"$0\"\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 submitLabel={submitLabel}\n onSave={() => frm.save({ preventNavigation: !!uiMeta?.auto_save } as any)}\n onDiscard={() => {\n if (isDirty) {\n setIsDiscardConfirmOpen(true);\n return;\n }\n bypassBlockerRef.current = true; // Bypass blocker\n setIsDirty(false);\n frm.cancel();\n }}\n isSaving={frm.isSaving}\n isLocked={frm.isLocked}\n docstatus={record?.docstatus}\n showSystemInfo={showSystemInfo}\n setShowSystemInfo={setShowSystemInfo}\n openPrintPreview={openPrintPreview}\n downloadPrintPdf={handleDownloadPdf}\n isMobile={shell.isMobile}\n onDelete={isEditing && !isSingleton ? () => setIsDeleteConfirmOpen(true) : undefined}\n />\n\n {/* Non-intrusive auto-save status indicator */}\n {uiMeta?.auto_save && isEditing && (\n <XStack\n paddingHorizontal={shell.isMobile ? \"$sm\" : \"$lg\"}\n paddingTop=\"$sm\"\n justifyContent=\"flex-end\"\n opacity={0.7}\n >\n <MText fontSize=\"$xs\" color=\"$colorMuted\" fontWeight=\"500\">\n {frm.isSaving ? t(\"Auto-saving...\") : isDirty ? t(\"Unsaved changes\") : t(\"Saved\")}\n </MText>\n </XStack>\n )}\n\n {uiError && (\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\">{uiError}</MText>\n </Card>\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 (1-column full width) */}\n <XStack\n width=\"100%\"\n gap=\"$lg\"\n alignItems=\"flex-start\"\n backgroundColor=\"$background\"\n minHeight={0}\n >\n {/* 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 {/* System/Audit Sidebar (Overlay for both Desktop & Mobile) */}\n {isEditing && showSystemInfo && (\n <MStack\n width={shell.isMobile ? \"80%\" : 320}\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 <MText fontWeight=\"600\" flex={1}>\n {t(\"System Info\")}\n </MText>\n <Button\n aria-label=\"Close system info\"\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setShowSystemInfo(false)}\n >\n <Icon name=\"x\" size={16} color=\"$colorMuted\" />\n </Button>\n </XStack>\n\n <SystemInfo id={id} record={record} />\n </MStack>\n )}\n </XStack>\n\n {shell.isMobile && (\n <>\n <FormToolbar frm={frm} submitLabel={submitLabel} docstatus={record?.docstatus} />\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={frm.doc} id={id} />\n </>\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title={t(\"Confirm Delete\")}\n message={t(\"Are you sure you want to delete this document? This action cannot be undone.\")}\n confirmLabel={t(\"Delete\")}\n cancelLabel={t(\"Cancel\")}\n destructive\n onConfirm={() => {\n handleDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n\n <ConfirmDialog\n open={isDiscardConfirmOpen}\n title={t(\"Unsaved Changes\")}\n message={t(\"You have unsaved changes. Are you sure you want to discard them?\")}\n confirmLabel={t(\"Discard\")}\n cancelLabel={t(\"Cancel\")}\n destructive\n onConfirm={() => {\n setIsDiscardConfirmOpen(false);\n bypassBlockerRef.current = true;\n setIsDirty(false);\n if (blocker.state === \"blocked\") {\n blocker.proceed();\n } else {\n frm.cancel();\n }\n }}\n onCancel={() => {\n setIsDiscardConfirmOpen(false);\n if (blocker.state === \"blocked\") {\n blocker.reset();\n }\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 {\n YStack,\n XStack,\n Card,\n Input,\n Button,\n Heading,\n Paragraph,\n useTheme,\n Icon,\n} 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\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 [isForgotPasswordMode, setIsForgotPasswordMode] = useState(false);\n const [isForgotPasswordLoading, setIsForgotPasswordLoading] = useState(false);\n const { theme, toggleTheme } = useTheme();\n const mfetch = useMFetch();\n\n const isLoginLoading = status === \"pending\";\n const isLoading = isLoginLoading || isForgotPasswordLoading;\n const [providers, setProviders] = useState<string[]>(resolveConfiguredProviders());\n const displayTitle = isForgotPasswordMode\n ? t(\"Reset Password\")\n : title === \"Welcome back\"\n ? t(\"Welcome back\")\n : title;\n const displaySubtitle = isForgotPasswordMode\n ? t(\"Enter your email to receive a reset link\")\n : t(\"Sign in to your account\");\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 handleForgotPasswordSubmit = async () => {\n if (!email) {\n setError(t(\"Please enter your email address.\"));\n return;\n }\n\n setIsForgotPasswordLoading(true);\n try {\n const response = await mfetch(\"/api/v1/auth/forgot-password\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email }),\n });\n\n if (response.ok) {\n setInfoMessage(\n t(\"If an account exists with this email, a password reset link has been sent.\")\n );\n setIsForgotPasswordMode(false);\n } else {\n const data = await response.json().catch(() => ({}));\n setError(data.message || data.detail || t(\"Failed to send reset link.\"));\n }\n } catch (err: any) {\n setError(err.message || t(\"An error occurred. Please try again.\"));\n } finally {\n setIsForgotPasswordLoading(false);\n }\n };\n\n const handleSubmit = (e?: any) => {\n e?.preventDefault();\n if (isLoading) return;\n setError(null);\n setInfoMessage(null);\n\n if (isForgotPasswordMode) {\n handleForgotPasswordSubmit();\n return;\n }\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 <Icon name={theme === \"dark\" ? \"sun\" : \"moon\"} size={20} />\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 {displaySubtitle}\n </Paragraph>\n </YStack>\n </YStack>\n\n {!isForgotPasswordMode && 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 {!isForgotPasswordMode && (\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n {t(\"Password\")}\n </Paragraph>\n <XStack position=\"relative\" alignItems=\"center\" width=\"100%\">\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 paddingRight={44}\n />\n <XStack position=\"absolute\" right={6} zIndex={10}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setShowPassword((value) => !value)}\n disabled={isLoading}\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n borderRadius=\"$round\"\n padding={0}\n width={32}\n height={32}\n >\n <Icon name={showPassword ? \"eye-off\" : \"eye\"} size={16} color=\"$colorMuted\" />\n </Button>\n </XStack>\n </XStack>\n </YStack>\n )}\n\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={isLoading}\n disabled={isLoading}\n size=\"lg\"\n onPress={() => handleSubmit()}\n >\n {isForgotPasswordMode\n ? isForgotPasswordLoading\n ? t(\"Sending...\")\n : t(\"Send Reset Link\")\n : isLoginLoading\n ? t(\"Signing in...\")\n : t(\"Sign In\")}\n </Button>\n </YStack>\n <YStack marginTop=\"$xl\" alignItems=\"center\">\n {isForgotPasswordMode ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isLoading}\n onPress={() => {\n setError(null);\n setInfoMessage(null);\n setIsForgotPasswordMode(false);\n }}\n >\n {t(\"Back to sign in\")}\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isLoading}\n onPress={() => {\n setError(null);\n setInfoMessage(null);\n setIsForgotPasswordMode(true);\n }}\n >\n {t(\"Forgot password?\")}\n </Button>\n )}\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 maxWidth={280}>\n <YStack padding=\"$md\" gap=\"$xs\">\n <Paragraph fontWeight=\"bold\" size=\"$sm\" numberOfLines={1}>\n {identity?.name || \"Anonymous\"}\n </Paragraph>\n <Paragraph size=\"$xs\" color=\"$colorMuted\" numberOfLines={1}>\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 placement={isRtl ? \"top-start\" : \"top-end\"}\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 ? \"left-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=\"$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 tabIndex={0}\n role=\"menuitem\"\n onKeyDown={(e: any) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (hasChildren) toggleNode(node.name);\n else if (node.route) 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 tabIndex={0}\n role=\"button\"\n onKeyDown={(e: any) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n 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 }}\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, Icon } 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 <Icon name={theme === \"dark\" ? \"sun\" : \"moon\"} size={20} />\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: (() => {\n const config = (globalThis as unknown as { __FRAMEWORK_CONFIG__?: { basename?: string } })\n .__FRAMEWORK_CONFIG__;\n const prefix = config?.basename ? config.basename.replace(/\\/$/, \"\") : \"\";\n return `${prefix}/locales/{{lng}}/{{ns}}.json`;\n })(),\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 createBrowserRouter,\n RouterProvider,\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 paddingHorizontal={isMobile ? \"$md\" : \"$lg\"}\n paddingVertical={isMobile ? \"$lg\" : \"$lg\"}\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\ninterface ShellRoutesContextType {\n title: string;\n loginPage?: ReactNode;\n children?: ReactNode;\n isMobile: boolean;\n publicPluginRoutes: React.ReactElement[];\n authenticatedPluginRoutes: React.ReactElement[];\n hasPluginRootRoute: boolean;\n}\n\nconst ShellRoutesContext = React.createContext<ShellRoutesContextType | null>(null);\n\nconst ShellRoutes = () => {\n const ctx = React.useContext(ShellRoutesContext);\n if (!ctx) return null;\n\n const {\n title,\n loginPage,\n children,\n isMobile,\n publicPluginRoutes,\n authenticatedPluginRoutes,\n hasPluginRootRoute,\n } = ctx;\n\n return (\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 && <Route path=\"/\" element={<DefaultLandingPage title={title} />} />}\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=\"calendar\" element={<ListView view=\"calendar\" />} />\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 );\n};\n\nconst ShellApp = () => {\n return (\n <Refine\n dataProvider={frameworkMDataProvider}\n authProvider={authProvider}\n routerProvider={routerProvider}\n liveProvider={liveProvider}\n options={{\n syncWithLocation: true,\n warnWhenUnsavedChanges: false, // Turned off so we can use our custom `useBlocker` Modals\n }}\n >\n <SystemConfigProvider>\n <ShellRoutes />\n </SystemConfigProvider>\n </Refine>\n );\n};\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 const router = useMemo(\n () =>\n createBrowserRouter(\n [\n {\n path: \"*\",\n element: <ShellApp />,\n },\n ],\n { basename: BASENAME }\n ),\n []\n );\n\n return (\n <ShellRoutesContext.Provider\n value={{\n title,\n loginPage,\n children,\n isMobile,\n publicPluginRoutes,\n authenticatedPluginRoutes,\n hasPluginRootRoute,\n }}\n >\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 <RouterProvider router={router} />\n </ShellProvider>\n </QueryClientProvider>\n </React.Suspense>\n </MProvider>\n </ThemeProvider>\n </PluginRegistryProvider>\n </I18nextProvider>\n </ShellRoutesContext.Provider>\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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"}
|
|
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/uiMetaUtils.ts","../src/hooks/useUIMeta.ts","../src/components/layout/TabContainer.tsx","../src/components/layout/SectionField.tsx","../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/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/FormBodyLayout.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/table/tableUtils.ts","../src/components/form/fields/ListField.tsx","../src/components/form/fields/MultiSelectField.tsx","../src/components/form/fields/TagInputField.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/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/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/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/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 interface SwitchableUser {\n id: string;\n email?: string;\n name?: string;\n}\n\nexport interface FrameworkMAuthProvider extends AuthProvider {\n getSwitchableProfiles: () => Promise<SwitchableUser[]>;\n switchProfile: (\n userId: string\n ) => Promise<{ success: boolean; redirectTo?: string; error?: Error }>;\n removeProfile: (userId: string) => Promise<{\n success: boolean;\n sessionTerminated: boolean;\n redirectTo?: string;\n error?: Error;\n }>;\n}\n\nexport const authProvider: FrameworkMAuthProvider = {\n /**\n * Login with email and password\n */\n login: async ({ email, password }: { email: string; password: string }) => {\n try {\n const searchParams = new URLSearchParams(globalThis.location?.search ?? \"\");\n const isAddAccount = searchParams.get(\"add_account\") === \"true\";\n const loginUrl = isAddAccount\n ? `${API_URL}/auth/login?add_account=true`\n : `${API_URL}/auth/login`;\n\n const response = await fetchWithCredentials(loginUrl, {\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 const searchParams = new URLSearchParams(globalThis.location?.search ?? \"\");\n const isAddAccount = searchParams.get(\"add_account\") === \"true\";\n const isLoginPage = globalThis.location?.pathname === \"/login\";\n if (isAddAccount && isLoginPage) {\n return { authenticated: false };\n }\n\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 * Get switchable profiles\n */\n getSwitchableProfiles: async (): Promise<SwitchableUser[]> => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/switchable-users`, {\n credentials: \"include\",\n });\n if (response.ok) {\n return (await response.json()) as SwitchableUser[];\n }\n return [];\n } catch {\n return [];\n }\n },\n\n /**\n * Switch the active profile\n */\n switchProfile: async (userId: string) => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/switch-profile`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ user_id: userId }),\n });\n\n if (response.ok) {\n return {\n success: true,\n redirectTo: \"/app/dashboard\",\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Failed to switch profile\",\n }));\n return {\n success: false,\n error: new Error(error.detail || \"Failed to switch profile\"),\n };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err : new Error(\"Network error\"),\n };\n }\n },\n\n /**\n * Remove a switchable profile\n */\n removeProfile: async (userId: string) => {\n try {\n const response = await fetchWithCredentials(`${API_URL}/auth/remove-profile`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ user_id: userId }),\n });\n\n if (response.ok) {\n const body = await response.json();\n return {\n success: true,\n sessionTerminated: !!body.session_terminated,\n redirectTo: body.redirectTo,\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Failed to remove profile\",\n }));\n return {\n success: false,\n sessionTerminated: false,\n error: new Error(error.detail || \"Failed to remove profile\"),\n };\n } catch (err) {\n return {\n success: false,\n sessionTerminated: false,\n error: err instanceof Error ? err : new Error(\"Network error\"),\n };\n }\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 enable_profile_switcher?: boolean;\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 * 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 auto_save?: boolean;\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","/**\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 * 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, useRef } from \"react\";\nimport { useParams, useNavigate, useSearchParams } from \"react-router\";\nimport { useOne, useCreate, useUpdate, HttpError } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"./useDocTypeMeta\";\nimport { useWorkflowActions } from \"./useWorkflowActions\";\nimport { useRouteTraversal } from \"./useRouteTraversal\";\n\nexport interface ValidationErrorDetail {\n dataPath: string;\n message: string;\n keyword: string;\n}\n\nexport interface ValidationError {\n details: ValidationErrorDetail[];\n}\n\nexport interface Frm<T = Record<string, unknown>> {\n doc: T;\n setDoc: (data: Partial<T> | ((prev: T) => T)) => void;\n save: (options?: { preventNavigation?: boolean }) => Promise<void>;\n cancel: () => void;\n isEditing: boolean;\n isSaving: boolean;\n isLocked: boolean;\n errors: string[];\n notices: string[];\n validationError?: ValidationError | null;\n workflow?: unknown;\n refetch: () => Promise<void>;\n}\n\nexport interface UseFormControllerProps {\n doctype?: string;\n id?: string;\n}\n\ninterface CustomHttpError extends HttpError {\n validation_errors?: Record<string, unknown>;\n response?: {\n data?: {\n validation_errors?: Record<string, unknown>;\n };\n validation_errors?: Record<string, unknown>;\n };\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, meta } = useDocTypeMeta(doctype);\n const isEditing = !!id;\n\n const queryResult = useOne<Record<string, unknown>>({\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 [searchParams] = useSearchParams();\n const formParam = searchParams.get(\"form\");\n const lastAppliedFormParam = useRef<string | null>(formParam);\n\n const prevIdRef = useRef(id);\n const prevDoctypeRef = useRef(doctype);\n\n const [formData, setFormData] = useState<Record<string, unknown>>(() => {\n if (!isEditing && formParam) {\n try {\n return JSON.parse(formParam);\n } catch (e) {\n console.error(\"Failed to parse form query parameter:\", e);\n }\n }\n return {};\n });\n const [errors, setErrors] = useState<string[]>([]);\n const [notices] = useState<string[]>([]);\n const [validationError, setValidationError] = useState<ValidationError | null>(null);\n\n useEffect(() => {\n const routeChanged = prevIdRef.current !== id || prevDoctypeRef.current !== doctype;\n const formParamChanged = formParam !== lastAppliedFormParam.current;\n\n if (routeChanged || formParamChanged) {\n prevIdRef.current = id;\n prevDoctypeRef.current = doctype;\n lastAppliedFormParam.current = formParam;\n\n let initialData = {};\n if (!isEditing && formParam) {\n try {\n initialData = JSON.parse(formParam);\n } catch (e) {\n console.error(\"Failed to parse form query parameter:\", e);\n }\n }\n setFormData(initialData);\n setErrors([]);\n setValidationError(null);\n }\n }, [id, doctype, isEditing, formParam]);\n\n const record = queryResult?.result ?? queryResult?.query?.data?.data;\n const currentDoc =\n Object.keys(formData).length > 0 || !queryResult?.query?.isSuccess ? formData : (record ?? {});\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 const resolveEditRoute = useRouteTraversal(\"resolveEditRoute\");\n const resolveDetailRoute = useRouteTraversal(\"resolveDetailRoute\");\n\n const handleSave = useCallback(\n async (saveOptions?: { preventNavigation?: boolean }) => {\n try {\n // Changed to _is_new to satisfy the lint rule for unused variables\n const { _is_new, ...values } = (currentDoc || {}) as Record<string, unknown>;\n const options = {\n onSuccess: (data: unknown) => {\n setFormData({});\n\n const isSingleton = id === \"singleton\" || meta?.is_singleton;\n if (!isEditing && !isSingleton) {\n const res = data as\n | { data?: { id?: string | number }; id?: string | number }\n | null\n | undefined;\n const newId = res?.data?.id ?? res?.id;\n if (newId && saveOptions?.preventNavigation) {\n // After auto_save of a new form, transition to the edit page of the newly created record.\n const customPath = resolveEditRoute\n ? resolveEditRoute(doctype, newId)\n : resolveDetailRoute\n ? resolveDetailRoute(doctype, newId)\n : null;\n navigate(\n typeof customPath === \"string\" ? customPath : `/app/${doctype}/edit/${newId}`,\n { replace: true }\n );\n } else {\n // Standard manual save or fallback redirects back to list view\n if (typeof window !== \"undefined\" && window.location.hash === \"#_editing\") {\n const cleanUrl = window.location.pathname + window.location.search;\n window.history.replaceState(null, \"\", cleanUrl);\n }\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n }\n } else if (!saveOptions?.preventNavigation && !isSingleton) {\n if (typeof window !== \"undefined\" && window.location.hash === \"#_editing\") {\n const cleanUrl = window.location.pathname + window.location.search;\n window.history.replaceState(null, \"\", cleanUrl);\n }\n const customPath = resolveListRoute ? resolveListRoute(doctype) : null;\n navigate(typeof customPath === \"string\" ? customPath : `/app/${doctype}/list`);\n }\n },\n onError: (err: CustomHttpError) => {\n const vErrors =\n err?.validation_errors ||\n err?.response?.data?.validation_errors ||\n err?.response?.validation_errors;\n\n if (vErrors && typeof vErrors === \"object\") {\n const details = Object.entries(vErrors).map(([field, msg]) => ({\n dataPath: field === \"base\" ? \"\" : `.${field}`,\n message: String(msg),\n keyword: \"custom\",\n }));\n setValidationError({ details });\n setErrors([]);\n } else {\n setValidationError(null);\n setErrors([err?.message || \"An error occurred during save.\"]);\n }\n },\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 [\n doctype,\n id,\n isEditing,\n currentDoc,\n navigate,\n resolveListRoute,\n updateMutation,\n createMutation,\n meta?.is_singleton,\n ]\n );\n\n const handleCancel = useCallback(() => {\n if (typeof window !== \"undefined\" && window.location.hash === \"#_editing\") {\n const cleanUrl = window.location.pathname + window.location.search;\n window.history.replaceState(null, \"\", cleanUrl);\n }\n const isSingleton = id === \"singleton\" || meta?.is_singleton;\n if (isSingleton) {\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, meta?.is_singleton]);\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 setFormData((prev) => update(prev));\n } else {\n setFormData((prev) => ({ ...prev, ...update }));\n }\n setErrors([]);\n setValidationError(null);\n },\n save: handleSave,\n cancel: handleCancel,\n isEditing,\n isSaving,\n isLocked,\n errors,\n validationError,\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 validationError,\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","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, useEffect } from \"react\";\nimport { useSearchParams } from \"react-router\";\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 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 [searchParams, setSearchParams] = useSearchParams();\n\n // 1. Read Truth from URL\n const appliedSearchQuery = searchParams.get(\"search\") || \"\";\n const asOfFilter = searchParams.get(\"as_of\") || undefined;\n\n const appliedFilterRows = useMemo<FilterRow[]>(() => {\n const filtersParam = searchParams.get(\"filters\");\n if (!filtersParam) return [];\n try {\n const parsed = JSON.parse(filtersParam);\n if (Array.isArray(parsed)) {\n return parsed.filter((r) => r.id && r.field && r.operator);\n }\n } catch {\n // ignore parse errors\n }\n return [];\n }, [searchParams]);\n\n // 2. Local \"Draft\" State\n const [searchQuery, setSearchQuery] = useState(appliedSearchQuery);\n const [filterRows, setFilterRows] = useState<FilterRow[]>(appliedFilterRows);\n\n useEffect(() => {\n setSearchQuery(appliedSearchQuery);\n setFilterRows(appliedFilterRows);\n }, [appliedSearchQuery, appliedFilterRows]);\n\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 = Math.random().toString(36).substring(2, 9);\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 setSearchParams((prev) => {\n const trimmed = searchQuery.trim();\n if (trimmed) {\n prev.set(\"search\", trimmed);\n } else {\n prev.delete(\"search\");\n }\n return prev;\n });\n }, [searchQuery, setSearchParams]);\n\n const clearSearch = useCallback(() => {\n setSearchQuery(\"\");\n setSearchParams((prev) => {\n prev.delete(\"search\");\n return prev;\n });\n }, [setSearchParams]);\n\n const setAsOfFilter = useCallback(\n (val: string | undefined) => {\n setSearchParams((prev) => {\n if (val) {\n prev.set(\"as_of\", val);\n } else {\n prev.delete(\"as_of\");\n }\n return prev;\n });\n },\n [setSearchParams]\n );\n\n const applyFilters = useCallback(() => {\n setSearchParams((prev) => {\n const validFilters = filterRows.filter((r) => r.field && r.value !== \"\");\n if (validFilters.length > 0) {\n prev.set(\"filters\", serializeFilterRows(validFilters));\n } else {\n prev.delete(\"filters\");\n }\n return prev;\n });\n }, [filterRows, setSearchParams]);\n\n const clearAppliedFilters = useCallback(() => {\n setFilterRows([]);\n setSearchParams((prev) => {\n prev.delete(\"filters\");\n return prev;\n });\n }, [setSearchParams]);\n\n const removeAppliedFilterRow = useCallback(\n (id: string) => {\n setSearchParams((prev) => {\n const updated = appliedFilterRows.filter((r) => r.id !== id);\n if (updated.length > 0) {\n prev.set(\"filters\", serializeFilterRows(updated));\n } else {\n prev.delete(\"filters\");\n }\n return prev;\n });\n },\n [appliedFilterRows, setSearchParams]\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 throw err instanceof Error ? err : new Error(\"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\" | \"calendar\";\n\nexport interface UseListActionsProps {\n doctype: string;\n propView?: ListViewMode;\n canKanban: boolean;\n canTree: boolean;\n canGantt: boolean;\n canCalendar: 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 canCalendar,\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(\"/calendar\")) return \"calendar\";\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 if (requested === \"calendar\" && !canCalendar) return \"list\";\n return requested as ListViewMode;\n }, [propView, pathView, canKanban, canTree, canGantt, canCalendar]);\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 { 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\n const fieldMeta = meta.properties[key];\n if (fieldMeta) {\n if (fieldMeta.ui_meta?.hidden === true) continue;\n properties[key] = fieldMeta;\n }\n }\n return { ...meta, properties };\n}\n\nfunction buildFullFilteredSchema(meta: any): any {\n const properties: Record<string, unknown> = {};\n for (const [key, fieldMeta] of Object.entries(meta.properties || {})) {\n const normalizedKey = key.toLowerCase().trim();\n if (AUDIT_FIELDS.includes(normalizedKey)) continue;\n if ((fieldMeta as any).ui_meta?.hidden === true) continue;\n\n properties[key] = fieldMeta;\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 error={frm.validationError}\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 error={frm.validationError}\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 error={frm.validationError}\n onSubmit={() => frm.save()}\n hideSubmitButton\n readonly={frm.isLocked}\n />\n );\n}\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 { useDocTypeMeta } from \"../../hooks/useDocTypeMeta\";\nimport { useUIMeta } from \"../../hooks/useUIMeta\";\nimport { FormBodyLayout } from \"./FormBodyLayout\";\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 { uiMeta } = useUIMeta(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, mfetch]);\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 frmShim = {\n doc: formData,\n setDoc: setFormData,\n save: handleSubmit,\n isLocked: isSaving,\n };\n\n return (\n <YStack gap=\"$md\">\n {saveError && (\n <MText color=\"$error\" role=\"alert\">\n {saveError}\n </MText>\n )}\n {schema && <FormBodyLayout meta={schema} uiMeta={uiMeta} frm={frmShim as any} />}\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 {\n Input,\n YStack,\n MText,\n Button,\n Paragraph,\n XStack,\n Card,\n Drawer,\n Icon,\n} from \"@framework-m/ui\";\nimport { useGo } from \"@refinedev/core\";\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 add_new: false or x-quick-entry: false in the JSON Schema property\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 props?.add_new ??\n fieldSchema?.add_new ??\n fieldSchema?.ui_meta?.add_new;\n // Default enabled — only disable when explicitly false\n return flag !== false;\n }, [props, fieldSchema, schema]);\n\n // Support for custom search filtering from Python schema\n const linkFilters = useMemo(() => {\n const filters =\n props?.link_filters || fieldSchema?.link_filters || fieldSchema?.ui_meta?.link_filters;\n return typeof filters === \"object\" && filters !== null ? filters : null;\n }, [props, fieldSchema]);\n\n const mfetch = useMFetch();\n const go = useGo();\n\n // State for hydration status\n const [isHydrating, setIsHydrating] = useState(false);\n\n // inputValue is what the user types. displayValue is the hydrated label.\n const [inputValue, setInputValue] = useState(\"\");\n const [displayValue, setDisplayValue] = useState(\"\");\n // Tracks the last 'value' (ID) for which we successfully hydrated a label.\n // This prevents re-hydrating if the value hasn't changed.\n const lastHydratedValue = useRef<string | null>(null);\n\n // On-demand fetch to swap the UUID for the human-readable title\n const handleHydrate = useCallback(\n async (e?: any) => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n if (!value || !linkedDoctype) return;\n\n setIsHydrating(true);\n try {\n const response = await mfetch(`${API_URL}/${linkedDoctype}/${value}`, {\n credentials: \"include\",\n });\n if (response.ok) {\n const data = await response.json();\n const label = data?.title || data?.name || data?.id || String(value);\n setDisplayValue(label); // Set the display value\n lastHydratedValue.current = value; // Mark this value as hydrated\n }\n } catch {\n // Ignore network errors\n // Fallback to raw ID if hydration fails, or keep displayValue empty\n setDisplayValue(String(value));\n } finally {\n // This finally block is part of handleHydrate\n setIsHydrating(false);\n }\n },\n [value, linkedDoctype, mfetch]\n );\n\n // Effect to trigger hydration when 'value' changes externally (e.g., from URL params or parent form)\n useEffect(() => {\n if (value && linkedDoctype) {\n // If the current 'value' is different from the last one we hydrated,\n // then trigger hydration.\n if (value !== lastHydratedValue.current) {\n // Clear inputValue and displayValue to show loading/raw ID while hydrating\n setInputValue(\"\");\n setDisplayValue(\"\");\n // Only trigger if not already hydrating to prevent multiple calls\n if (!isHydrating) {\n handleHydrate();\n }\n }\n } else if (!value) {\n // If value becomes null/undefined, clear both input and display, and reset last hydrated.\n setInputValue(\"\");\n setDisplayValue(\"\");\n lastHydratedValue.current = null;\n }\n }, [value, linkedDoctype, handleHydrate, isHydrating]);\n\n // Effect to handle initial hydration if value is present on mount\n useEffect(() => {\n // This runs once on mount if 'value' is already set (e.g., from URL params)\n // and hasn't been hydrated yet.\n if (value && linkedDoctype && !isHydrating && !lastHydratedValue.current) {\n handleHydrate();\n }\n }, [value, linkedDoctype, isHydrating, handleHydrate]);\n\n // Determine the value to show in the input field\n const inputDisplayValue = useMemo(() => {\n // Prioritize user's input, then hydrated label, then raw ID if hydration is pending\n if (inputValue) return inputValue;\n if (displayValue) return displayValue;\n if (value && !isHydrating) return String(value); // Show raw ID if not hydrated yet\n return \"\";\n }, [inputValue, displayValue, value, isHydrating]);\n\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 const debouncedSearch = useDebounce(inputValue, 300);\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 if (linkFilters) {\n Object.entries(linkFilters).forEach(([key, val]) => {\n params.append(key, String(val));\n });\n }\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?.data || data?.items || data;\n const itemsArray = Array.isArray(items) ? items : [];\n setSearchResults(\n itemsArray.map((item: any) => ({\n value: String(item.id),\n label: item.title || item.name || 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 lastHydratedValue.current = option.value; // Mark as hydrated\n setInputValue(option.label); // Set user input to selected label\n setDisplayValue(option.label); // Also set display value\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 lastHydratedValue.current = newId; // Mark as hydrated\n setInputValue(newLabel); // Set user input to new label\n setDisplayValue(newLabel); // Also set display value\n onChange(newId);\n setIsDrawerOpen(false);\n },\n [onChange]\n );\n\n // Determine if the input should be disabled\n const isInputDisabled = disabled || (isDynamicLink && !linkedDoctype);\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={inputDisplayValue}\n disabled={isInputDisabled}\n placeholder={resolvedPlaceholder}\n onChangeText={(text: string) => {\n setInputValue(text);\n setDisplayValue(\"\"); // Clear display value if user starts typing\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 || (isHydrating && !value)} // Show error if hydration fails and no value\n paddingRight={value ? 88 : 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 <Icon name=\"search\" size={15} />\n </Paragraph>\n )}\n </XStack>\n {value && (\n <XStack position=\"absolute\" right={8} top={0} bottom={0} alignItems=\"center\" gap=\"$1\">\n {!disabled && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={handleHydrate}\n disabled={isHydrating || isInputDisabled}\n title=\"Fetch record name\"\n >\n <Icon\n name=\"refresh-cw\"\n size={14}\n color={isHydrating ? \"$primary\" : \"$colorMuted\"}\n />\n </Button>\n )}\n {!disabled && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={(e: any) => {\n e.preventDefault();\n e.stopPropagation();\n go({ to: `/app/${linkedDoctype}/detail/${value}` });\n }}\n title={`Open ${linkedDoctype}`}\n >\n <Icon name=\"external-link\" size={14} color=\"$colorMuted\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$100\"\n padding={0}\n width={24}\n height={24}\n onPress={() => {\n // Clear button\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 const ss = pad(date.getSeconds());\n return `${yyyy}-${mm}-${dd}T${hh}:${min}:${ss}`;\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 { useEffect, useMemo, useState } from \"react\";\nimport { connectField } from \"uniforms\";\nimport { Select, YStack, MText, Paragraph } from \"@framework-m/ui\";\nimport { useMFetch } from \"../../../hooks/useMFetch\";\n\n/**\n * SelectField component.\n *\n * UIMeta integration (3.1 — Pydantic Enum Leveraging):\n * -------------------------------------------------------\n * Option sources (in priority order):\n * 1. Remote API (`ui_meta.source_url`)\n * 2. `props.options` — from uniforms bridge (schema.enum)\n * 3. `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 * 4. `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 options: bridgeOptions,\n allowedValues,\n } = props;\n\n const rawField: Record<string, any> = props.field ?? {};\n const uiMeta = rawField.ui_meta;\n const mfetch = useMFetch();\n\n const uiMetaOptions: Array<{ value: string; label: string }> | undefined = Array.isArray(\n uiMeta?.options\n )\n ? uiMeta.options\n : undefined;\n\n const [remoteOptions, setRemoteOptions] = useState<Array<{ value: string; label: string }>>([]);\n\n useEffect(() => {\n const sourceUrl = uiMeta?.source_url;\n if (!sourceUrl) return;\n\n mfetch(sourceUrl)\n .then((r) => r.json())\n .then((data) => {\n const valueKey = uiMeta?.source_map?.value || \"items\";\n const items = data?.[valueKey] ?? [];\n setRemoteOptions(\n items.map((r: any) => {\n const val = typeof r === \"string\" ? r : r.value || r.id || r.name || String(r);\n const lab = typeof r === \"string\" ? r : r.label || r.name || val;\n return { value: String(val), label: String(lab) };\n })\n );\n })\n .catch((err) => console.warn(\"[SelectField] Failed to load remote options\", err));\n }, [uiMeta?.source_url, uiMeta?.source_map?.value]);\n\n const enumOptions = useMemo(() => {\n if (remoteOptions.length > 0) {\n return remoteOptions;\n }\n\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 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 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 }, [remoteOptions, 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","export const SYSTEM_FIELDS = [\n \"id\",\n \"name\",\n \"creation\",\n \"modified\",\n \"modified_by\",\n \"owner\",\n \"deleted_at\",\n \"docstatus\",\n \"idx\",\n \"parent\",\n \"parentfield\",\n \"parent_value\",\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","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\";\nimport { SYSTEM_FIELDS } from \"../../table/tableUtils\";\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 // Filter out any columns that don't actually exist in the schema to prevent Uniforms from crashing\n // (e.g., if a developer misspells a column name in the grid_columns metadata)\n const validGridColumns = gridColumns.filter((col: string) => !!rowSchema?.properties?.[col]);\n\n const modalProperties = uniqueProps.filter(\n (col: string) => !SYSTEM_FIELDS.includes(col.toLowerCase()) && !!rowSchema?.properties?.[col]\n );\n\n const getColumnLayout = useCallback(\n (col: string) => {\n const type = getColType(col);\n if (type === \"boolean\") return { width: 80, flexShrink: 0 };\n return { flex: 1, flexBasis: 0, minWidth: 120 };\n },\n [rowSchema]\n );\n\n const tableMinWidth = useMemo(() => {\n return validGridColumns.reduce(\n (sum: number, col: string) => sum + (getColType(col) === \"boolean\" ? 80 : 150),\n 160\n );\n }, [validGridColumns, rowSchema]);\n\n return (\n <YStack gap=\"$2\" marginTop=\"$4\" marginBottom=\"$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 {modalProperties.length === 0 && (\n <MText color=\"$colorMuted\">{t(\"No editable properties found in schema.\")}</MText>\n )}\n {modalProperties.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\n justifyContent=\"space-between\"\n alignItems=\"center\"\n paddingHorizontal=\"$1\"\n paddingBottom=\"$2\"\n >\n <MText fontSize=\"$4\" fontWeight=\"600\">\n {label} {required && <MText color=\"$error\">*</MText>}\n </MText>\n <Button\n size=\"sm\"\n onPress={handleAdd}\n disabled={disabled}\n variant=\"ghost\"\n backgroundColor=\"transparent\"\n >\n {t(\"+ Add Row\")}\n </Button>\n </XStack>\n\n {/* Spreadsheet Grid Container */}\n <YStack\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderRadius=\"$3\"\n overflowX=\"auto\"\n backgroundColor=\"$background\"\n style={{ borderCollapse: \"collapse\", borderSpacing: 0 } as any}\n >\n {/* Header Row */}\n <XStack\n backgroundColor=\"$backgroundStrong\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColor\"\n minWidth={tableMinWidth}\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 {validGridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n {...getColumnLayout(col)}\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 {/* Action column spacer */}\n </XStack>\n </XStack>\n\n {/* Data Rows */}\n {rows.length === 0 ? (\n <YStack alignItems=\"center\" justifyContent=\"center\" padding=\"$6\">\n <MText color=\"$colorMuted\">{t(\"No data\")}</MText>\n </YStack>\n ) : (\n pageRows.map((_item: any, relativeIndex: number) => {\n const index = pageStart + relativeIndex;\n return (\n <YStack key={index}>\n {/* Data Row */}\n <XStack\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={tableMinWidth}\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 {validGridColumns.map((col: string) => {\n const type = getColType(col);\n const isNumeric = type === \"number\" || type === \"integer\";\n return (\n <XStack\n key={col}\n {...getColumnLayout(col)}\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 </YStack>\n );\n })\n )}\n </YStack>\n\n {/* Pagination */}\n {rows.length > pageSize && (\n <XStack\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n paddingHorizontal=\"$1\"\n flexWrap=\"wrap\"\n gap=\"$2\"\n marginTop=\"$1\"\n >\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 <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 )}\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\";\nimport { useMFetch } from \"../../../hooks/useMFetch\";\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 const mfetch = useMFetch();\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 mfetch(sourceUrl)\n .then((r) => r.json())\n .then((data) => {\n const valueKey = uiMeta?.source_map?.value || \"items\";\n const items = data?.[valueKey] ?? [];\n setRemoteOptions(\n items.map((r: any) => {\n const val = typeof r === \"string\" ? r : r.value || r.id || r.name || 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 { useState, useCallback, KeyboardEvent } from \"react\";\nimport { FieldProps } from \"uniforms\";\nimport { Input, XStack, YStack, MText, Button, Icon, Paragraph } from \"@framework-m/ui\";\n\ninterface TagInputFieldProps {\n placeholder?: string;\n compact?: boolean;\n /**\n * Optional key to use if the value is an array of objects instead of strings.\n * E.g., if value is `[{ id: \"tag1\" }, { id: \"tag2\" }]`, set `valueKey=\"id\"`.\n * If not provided, assumes value is `string[]`.\n */\n valueKey?: string;\n // FieldProps already provides: name, label, value, onChange, field, required, error, showInlineError\n}\n\n// The actual value type from Uniforms can be string[] or Record<string, any>[]\n// We use `any[]` to accommodate both and handle the specific logic internally.\ntype TagInputFieldCombinedProps = TagInputFieldProps & FieldProps<any[] | string[], any>;\n\n// Combine with Uniforms' FieldProps.\n/**\n * A custom Uniforms field component for managing a list of strings as tags.\n * It reads `ui_meta.placeholder` from the field schema. Uses MText and Button for tags.\n * Can be configured to work with an array of strings or an array of objects.\n */\n// TODO: For future custom options (e.g., maxTags, allowSpaces), define them in the JSON schema's\n// `json_schema_extra` (or `uniforms` property) for this field. The TagInputField component\n// should then consume these properties from the `field.ui_meta` or `schema.uniforms` props.\n// This ensures schema-driven UI configuration and avoids hardcoding.\nexport function TagInputField(props: TagInputFieldCombinedProps) {\n const {\n name,\n placeholder,\n label, // from FieldProps\n value = [], // value can be string[] or Record<string, any>[]\n onChange,\n field, // from FieldProps\n compact, // from FieldProps\n required, // from FieldProps\n error, // from FieldProps\n showInlineError, // from FieldProps\n valueKey, // New prop for object-based tags\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n\n // Helper to get the display string from a tag value (string or object)\n const getTagDisplayValue = useCallback(\n (tag: any): string => {\n if (valueKey && typeof tag === \"object\" && tag !== null && tag[valueKey] !== undefined) {\n return String(tag[valueKey]);\n }\n return String(tag); // Assume it's already a string or can be stringified\n },\n [valueKey]\n );\n\n // Helper to create a new tag value (string or object) from an input string\n const createNewTagValue = useCallback(\n (inputString: string): any => {\n if (valueKey) {\n return { [valueKey]: inputString };\n }\n return inputString;\n },\n [valueKey]\n );\n\n // Helper to compare a display string with a tag value (string or object)\n const compareTagWithDisplay = useCallback(\n (tag: any, displayString: string): boolean => {\n if (valueKey && typeof tag === \"object\" && tag !== null && tag[valueKey] !== undefined) {\n return String(tag[valueKey]) === displayString;\n }\n return String(tag) === displayString;\n },\n [valueKey]\n );\n\n const handleAddTag = useCallback(() => {\n const trimmedValue = inputValue.trim();\n if (trimmedValue) {\n // Check if tag already exists (case-insensitive for display value)\n const exists = value.some((tag) => compareTagWithDisplay(tag, trimmedValue));\n if (!exists) {\n const newTag = createNewTagValue(trimmedValue);\n onChange([...value, newTag]);\n }\n // Clear input regardless of whether tag was added or was a duplicate\n setInputValue(\"\");\n }\n }, [inputValue, value, onChange, createNewTagValue, compareTagWithDisplay]);\n\n const handleRemoveTag = useCallback(\n (tagToRemoveDisplay: string) => {\n const newValue = value.filter((tag) => !compareTagWithDisplay(tag, tagToRemoveDisplay));\n onChange(newValue);\n },\n [value, onChange, compareTagWithDisplay]\n );\n\n const rawField: Record<string, any> = field ?? {};\n const uiMeta: Record<string, any> = rawField.ui_meta ?? {};\n\n // Resolve label: direct prop > ui_meta.label > field.label > name\n const resolvedLabel = label ?? uiMeta.label ?? (rawField as Record<string, any>).label ?? name;\n\n // Resolve placeholder: explicit prop > ui_meta.placeholder > default\n const resolvedPlaceholder = placeholder ?? uiMeta.placeholder ?? `Add ${resolvedLabel}`;\n\n // Hint text (brief helper text below the field)\n const hint: string | undefined = uiMeta.hint;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\" || event.key === \"Tab\") {\n event.preventDefault(); // Prevent form submission or tab navigation\n handleAddTag();\n } else if (event.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n // Remove last tag if input is empty and backspace is pressed\n const lastTagDisplay = getTagDisplayValue(value[value.length - 1]);\n handleRemoveTag(lastTagDisplay);\n }\n },\n [handleAddTag, handleRemoveTag, inputValue, value, getTagDisplayValue]\n );\n\n return (\n <YStack\n gap=\"$1\" // Aligned with TextField\n marginBottom={compact ? 0 : \"$2\"} // Aligned with TextField\n flex={compact ? 1 : undefined} // Aligned with TextField\n minWidth={compact ? 50 : \"100%\"} // Aligned with TextField\n alignSelf=\"stretch\" // Aligned with TextField\n role=\"group\"\n aria-labelledby={`${name}-label`}\n >\n {resolvedLabel &&\n !compact && ( // Conditional label rendering\n <MText id={`${name}-label`} fontWeight=\"600\" size=\"sm\" color=\"$colorMuted\">\n {resolvedLabel} {required && <MText color=\"$error\">*</MText>}\n </MText>\n )}\n <XStack flexWrap=\"wrap\" gap=\"$2\">\n {value.map((tag: any, index: number) => {\n const displayTag = getTagDisplayValue(tag);\n return (\n <Button\n key={`${displayTag}-${index}`} // Use index in key for uniqueness if tags can be identical (e.g., two tags with value \"A\")\n size=\"sm\" // Corrected: Valid size for Button\n variant=\"default\" // Corrected: Use a supported variant like 'default'\n borderRadius=\"$6\"\n paddingHorizontal=\"$3\"\n paddingVertical=\"$1\"\n backgroundColor=\"$blue1\"\n borderColor=\"$blue8\"\n color=\"$blue10\"\n onPress={() => handleRemoveTag(displayTag)}\n aria-label={`Remove ${displayTag}`}\n >\n <MText fontSize=\"$3\" color=\"$blue10\">\n {displayTag}\n </MText>\n <Icon name=\"x\" size={12} color=\"$blue10\" marginLeft=\"$1\" />\n </Button>\n );\n })}\n </XStack>\n <XStack gap=\"$2\" alignItems=\"center\">\n {\" \"}\n {/* This XStack is now just for the input, but can be removed if not needed for other elements */}\n <Input\n flex={1}\n value={inputValue}\n onChangeText={setInputValue}\n onKeyPress={handleKeyDown}\n onBlur={handleAddTag} // Add tag on blur if input has value\n placeholder={resolvedPlaceholder}\n aria-label={`Add new ${resolvedLabel}`}\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 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 />\n <Button\n onPress={handleAddTag}\n disabled={!inputValue.trim()}\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Add ${resolvedLabel}`}\n >\n <Icon name=\"plus\" size={16} />\n </Button>\n </XStack>\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 {typeof error === \"string\" ? error : (error as { message?: string })?.message}\n </Paragraph>\n )}\n </YStack>\n );\n}\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 { TagInputField } from \"./TagInputField\"; // Import the new TagInputField\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 const explicitWidget =\n rawField.ui_widget || rawField.ui_meta?.ui_widget || rawField.ui_meta?.widget;\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 // Check for custom input_widget for Array of strings or objects (e.g., tag_input)\n // If the array items are objects, ui_meta.value_key should specify which property\n // to use as the tag value (e.g., \"name\" for [{name: \"Tag1\"}, {name: \"Tag2\"}]).\n // If ui_meta.value_key is not provided, TagInputField assumes an array of strings.\n if (rawField.ui_meta?.input_widget === \"tag_input\") {\n return (\n <TagInputField\n {...props}\n placeholder={rawField.ui_meta?.placeholder}\n valueKey={rawField.ui_meta?.value_key}\n />\n );\n }\n\n // ui_widget can be set directly on the field's json_schema_extra\n // or merged into ui_meta by enrich_schema\n if (explicitWidget === \"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 (explicitWidget === \"select\" || 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 explicitWidget === \"datetime\" ||\n explicitWidget === \"datetime-local\" ||\n props.fieldType === Date ||\n rawFormat === \"date-time\" ||\n fieldName === \"creation\" ||\n fieldName === \"modified\"\n ) {\n return <Text {...props} type=\"datetime-local\" step={1} />;\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 (explicitWidget === \"date\" || 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. Numbers (Integers & Floats)\n if (props.fieldType === Number) {\n const isInteger =\n rawField.type === \"integer\" ||\n (Array.isArray(rawField.type) && rawField.type.includes(\"integer\"));\n return <Text {...props} type=\"number\" step={isInteger ? 1 : \"any\"} />;\n }\n\n // 9. Default: String / 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: false,\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 /** External validation error object to display */\n error?: any;\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 error,\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 error={error}\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","/**\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 /** Current selected rows (used to sync clears from parent) */\n selectedRows?: TData[];\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 selectedRows,\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 // Sync external clears (if parent sets selectedRows to empty, reset internal checkboxes)\n useEffect(() => {\n if (selectedRows && selectedRows.length === 0) {\n setRowSelection((prev) => (Object.keys(prev).length > 0 ? {} : prev));\n }\n }, [selectedRows]);\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: 36,\n header: ({ table }) => (\n <Input\n type=\"checkbox\"\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler() as any}\n style={{\n width: 14,\n height: 14,\n minWidth: 14,\n minHeight: 14,\n padding: 0,\n margin: 0,\n cursor: \"pointer\",\n accentColor: \"#8b5cf6\",\n }}\n />\n ),\n cell: ({ row }) => (\n <Input\n type=\"checkbox\"\n size=\"sm\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler() as any}\n onClick={(e: any) => e.stopPropagation()}\n style={{\n width: 14,\n height: 14,\n minWidth: 14,\n minHeight: 14,\n padding: 0,\n margin: 0,\n cursor: \"pointer\",\n accentColor: \"#8b5cf6\",\n }}\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 <YStack flex={1} overflowX=\"auto\" overflowY=\"hidden\">\n {/* Table Header */}\n <YStack\n borderBottomWidth={1}\n borderColor={borderColor as any}\n backgroundColor=\"$backgroundSecondary\"\n role=\"rowgroup\"\n marginBottom=\"$xs\"\n minWidth=\"fit-content\"\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <XStack key={headerGroup.id} width=\"100%\" minWidth=\"fit-content\" role=\"row\">\n {headerGroup.headers.map((header) => {\n const width =\n header.column.id === \"select\"\n ? 36\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 alignItems=\"stretch\"\n justifyContent=\"space-between\"\n minHeight={36}\n role=\"columnheader\"\n borderRightWidth={1}\n borderColor=\"transparent\"\n hoverStyle={{ borderColor: borderColor as any }}\n >\n <XStack\n gap=\"$xs\"\n alignItems=\"center\"\n flex={1}\n minWidth={0}\n paddingVertical={6}\n paddingHorizontal={8}\n cursor={header.column.getCanSort() ? \"pointer\" : \"default\"}\n onPress={\n header.column.getCanSort()\n ? header.column.getToggleSortingHandler()\n : undefined\n }\n >\n <MText fontWeight=\"700\" fontSize=\"$sm\" numberOfLines={1}>\n {flexRender(header.column.columnDef.header, header.getContext())}\n </MText>\n {header.column.getIsSorted() && (\n <Icon\n name={\n header.column.getIsSorted() === \"asc\" ? \"chevron-up\" : \"chevron-down\"\n }\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={16}\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 onPress={(e: any) => e.stopPropagation()}\n onClick={(e: any) => e.stopPropagation()}\n hoverStyle={{ backgroundColor: \"rgba(0,0,0,0.05)\" }}\n >\n <YStack\n width={2}\n height=\"50%\"\n borderRadius=\"$round\"\n backgroundColor=\"$primary\"\n opacity={0.3}\n />\n </XStack>\n ) : null}\n </XStack>\n );\n })}\n </XStack>\n ))}\n </YStack>\n\n {/* Table Body */}\n <YStack\n role=\"rowgroup\"\n flex={1}\n minHeight={0}\n minWidth=\"fit-content\"\n style={{ overflowY: \"auto\" } as any}\n >\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 minWidth=\"fit-content\"\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: 36, 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 paddingVertical={4}\n paddingHorizontal={8}\n alignItems=\"center\"\n minHeight={32}\n role=\"cell\"\n >\n <MText fontSize=\"$sm\" numberOfLines={1}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </MText>\n </XStack>\n );\n })}\n </XStack>\n ))\n )}\n </YStack>\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 $sm={{ flexDirection: \"column-reverse\" }}\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 $sm={{\n width: \"100%\",\n height: 64,\n flexDirection: \"row\",\n borderRightWidth: 0,\n borderTopWidth: 1,\n justifyContent: \"space-between\",\n paddingTop: 0,\n paddingBottom: 0,\n paddingHorizontal: \"$lg\",\n }}\n >\n <Skeleton variant=\"avatar\" width={32} height={32} opacity={0.5} />\n <YStack\n gap=\"$lg\"\n marginTop=\"$xl\"\n opacity={0.2}\n $sm={{\n flexDirection: \"row\",\n marginTop: 0,\n }}\n >\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, type CrudFilters } 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 filters?: CrudFilters;\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, filters }: 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 filters,\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=\"stretch\"\n flex={1}\n width=\"100%\"\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, type CrudFilters } 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 /** Additional filters */\n filters?: CrudFilters;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Format date as local YYYY-MM-DD\n */\nfunction formatLocalDate(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\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, filters }: 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 // View and Date state\n const [viewMode, setViewMode] = useState<\"month\" | \"week\" | \"day\">(\"month\");\n const [currentDate, setCurrentDate] = useState(new Date());\n\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n const date = currentDate.getDate();\n const dayOfWeek = currentDate.getDay();\n\n // Calculate exact bounds for the API query\n const { startDate, endDate } = useMemo(() => {\n let start: Date, end: Date;\n if (viewMode === \"month\") {\n start = new Date(year, month, 1);\n end = new Date(year, month + 1, 0);\n } else if (viewMode === \"week\") {\n start = new Date(year, month, date - dayOfWeek);\n end = new Date(year, month, date + (6 - dayOfWeek));\n } else {\n start = new Date(year, month, date);\n end = new Date(year, month, date);\n }\n start.setHours(0, 0, 0, 0);\n end.setHours(23, 59, 59, 999);\n return { startDate: start, endDate: end };\n }, [year, month, date, dayOfWeek, viewMode]);\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n ...(filters || []),\n { field: startField, operator: \"gte\", value: startDate.toISOString() },\n { field: startField, operator: \"lte\", value: endDate.toISOString() },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Generate the specific days to display on the grid\n const displayedDays = useMemo(() => {\n const days: Date[] = [];\n const current = new Date(startDate);\n current.setHours(0, 0, 0, 0);\n const end = new Date(endDate);\n end.setHours(0, 0, 0, 0);\n\n while (current <= end) {\n days.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return days;\n }, [startDate, endDate]);\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 rawDate = event[startField];\n if (!rawDate) continue;\n\n const dateObj = new Date(String(rawDate));\n const dateStr = isNaN(dateObj.getTime())\n ? String(rawDate).split(\"T\")[0]\n : formatLocalDate(dateObj);\n\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 prev = () => {\n if (viewMode === \"month\") setCurrentDate(new Date(year, month - 1, date));\n else if (viewMode === \"week\") setCurrentDate(new Date(year, month, date - 7));\n else setCurrentDate(new Date(year, month, date - 1));\n };\n const next = () => {\n if (viewMode === \"month\") setCurrentDate(new Date(year, month + 1, date));\n else if (viewMode === \"week\") setCurrentDate(new Date(year, month, date + 7));\n else setCurrentDate(new Date(year, month, date + 1));\n };\n const today = () => setCurrentDate(new Date());\n\n // Dynamic Header Title\n const headerTitle = useMemo(() => {\n if (viewMode === \"month\") {\n return currentDate.toLocaleString(\"default\", { month: \"long\", year: \"numeric\" });\n }\n if (viewMode === \"day\") {\n return currentDate.toLocaleString(\"default\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n }\n const startStr = startDate.toLocaleString(\"default\", { month: \"short\", day: \"numeric\" });\n const endStr = endDate.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n return `${startStr} - ${endStr}`;\n }, [currentDate, startDate, endDate, viewMode]);\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n const firstDayOffset = viewMode === \"month\" ? new Date(year, month, 1).getDay() : 0;\n const colWidth = viewMode === \"day\" ? \"100%\" : `${100 / 7}%`;\n const maxEventsShown = viewMode === \"month\" ? 3 : 10;\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\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom=\"$md\"\n flexWrap=\"wrap\"\n gap=\"$sm\"\n >\n <XStack gap=\"$sm\">\n <Button size=\"sm\" variant=\"ghost\" onPress={prev}>\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={next}>\n {t(\"Next \\u2192\")}\n </Button>\n </XStack>\n\n <Heading size=\"$sm\" margin={0}>\n {headerTitle}\n </Heading>\n\n <XStack\n gap={0}\n backgroundColor=\"$backgroundSecondary\"\n borderRadius=\"$sm\"\n overflow=\"hidden\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n >\n <Button\n size=\"sm\"\n variant={viewMode === \"month\" ? \"primary\" : \"ghost\"}\n borderRadius={0}\n borderWidth={0}\n onPress={() => setViewMode(\"month\")}\n >\n {t(\"Month\")}\n </Button>\n <Button\n size=\"sm\"\n variant={viewMode === \"week\" ? \"primary\" : \"ghost\"}\n borderRadius={0}\n borderWidth={0}\n onPress={() => setViewMode(\"week\")}\n >\n {t(\"Week\")}\n </Button>\n <Button\n size=\"sm\"\n variant={viewMode === \"day\" ? \"primary\" : \"ghost\"}\n borderRadius={0}\n borderWidth={0}\n onPress={() => setViewMode(\"day\")}\n >\n {t(\"Day\")}\n </Button>\n </XStack>\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 {viewMode !== \"day\" &&\n weekDays.map((day) => (\n <YStack\n key={day}\n width={colWidth}\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 {viewMode === \"month\" &&\n Array.from({ length: firstDayOffset }).map((_, i) => (\n <YStack\n key={`empty-${i}`}\n width={colWidth}\n backgroundColor=\"rgba(0,0,0,0.02)\"\n minHeight={80}\n />\n ))}\n\n {/* Days */}\n {displayedDays.map((day) => {\n const dateStr = formatLocalDate(day);\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === formatLocalDate(new Date());\n\n return (\n <YStack\n key={dateStr}\n width={colWidth}\n backgroundColor=\"$background\"\n minHeight={viewMode === \"month\" ? 80 : 200}\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, maxEventsShown).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 > maxEventsShown && (\n <MText fontSize={10} color=\"$colorMuted\">\n +{events.length - maxEventsShown} {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, type CrudFilters } 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 /** Additional filters */\n filters?: CrudFilters;\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 const now = new Date();\n let minDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n let maxDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());\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())) {\n const s = new Date(start.getFullYear(), start.getMonth(), start.getDate());\n if (s < minDate) minDate = s;\n }\n if (!isNaN(end.getTime())) {\n const e = new Date(end.getFullYear(), end.getMonth(), end.getDate());\n if (e > maxDate) maxDate = e;\n }\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 const s = new Date(start.getFullYear(), start.getMonth(), start.getDate());\n const e = new Date(end.getFullYear(), end.getMonth(), end.getDate());\n return Math.round((e.getTime() - s.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, filters }: 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 filters,\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 // Generate month spans\n const monthSpans = useMemo(() => {\n const spans: { label: string; colSpan: number }[] = [];\n if (dayHeaders.length === 0) return spans;\n\n let currentMonth = dayHeaders[0].getMonth();\n let currentYear = dayHeaders[0].getFullYear();\n let spanCount = 0;\n\n for (const day of dayHeaders) {\n if (day.getMonth() === currentMonth && day.getFullYear() === currentYear) {\n spanCount++;\n } else {\n const date = new Date(currentYear, currentMonth, 1);\n spans.push({\n label: date.toLocaleString(\"default\", { month: \"short\", year: \"numeric\" }),\n colSpan: spanCount,\n });\n currentMonth = day.getMonth();\n currentYear = day.getFullYear();\n spanCount = 1;\n }\n }\n if (spanCount > 0) {\n const date = new Date(currentYear, currentMonth, 1);\n spans.push({\n label: date.toLocaleString(\"default\", { month: \"short\", year: \"numeric\" }),\n colSpan: spanCount,\n });\n }\n return spans;\n }, [dayHeaders]);\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\" flex={1} width=\"100%\">\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={54}\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 {/* Month Headers */}\n <XStack\n height={24}\n backgroundColor=\"$backgroundSecondary\"\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n >\n {monthSpans.map((span, i) => (\n <YStack\n key={i}\n width={span.colSpan * dayWidth}\n flexShrink={0}\n borderRightWidth={1}\n borderColor=\"$borderColor\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <MText fontSize={11} fontWeight=\"600\">\n {span.label}\n </MText>\n </YStack>\n ))}\n </XStack>\n {/* Day Headers */}\n <XStack height={30} 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 — 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, useMemo, type KeyboardEvent } from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\nimport { YStack, XStack, Button, Input, MText } from \"@framework-m/ui\";\nimport { useComponentOverride } from \"../hooks\";\nimport { useTranslation } from \"../hooks\";\nimport { useList, useUpdate, useCreate, useGo, type CrudFilters } from \"@refinedev/core\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n filters?: CrudFilters;\n onNodeClick?: (row: any) => void;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\ninterface TreeNode {\n id: string;\n name: string;\n label: string;\n children: TreeNode[];\n raw: any;\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 onRename,\n onAddChild,\n dragNodeId,\n onDragStart,\n onDrop,\n onNodeClick,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n onRename: (node: TreeNode, newLabel: string) => void;\n onAddChild: (node: TreeNode) => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetNode: TreeNode | null) => void;\n onNodeClick?: (row: any) => void;\n}>) {\n const { t } = useTranslation(\"desk\");\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n onRename(node, newLabel);\n },\n [node, onRename]\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);\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\n flex={1}\n fontSize=\"$sm\"\n lineHeight={1.4}\n cursor={onNodeClick ? \"pointer\" : \"default\"}\n hoverStyle={onNodeClick ? { color: \"$primary\" } : undefined}\n onPress={(e: any) => {\n e.stopPropagation();\n onNodeClick?.(node.raw);\n }}\n >\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 onAddChild(node);\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 {/* 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 onRename={onRename}\n onAddChild={onAddChild}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n onNodeClick={onNodeClick}\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({\n resource,\n config,\n schema,\n filters,\n onNodeClick,\n}: Readonly<TreeViewProps>) {\n const { t } = useTranslation(\"desk\");\n const titleField = (config as any)?.titleField || \"title\";\n const parentField = (config as any)?.parentField || \"parent_value\";\n\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n const go = useGo();\n\n let orderField = \"name\";\n if (config.orderField) {\n orderField = config.orderField;\n } else if (schema?.properties && \"lft\" in (schema.properties as Record<string, any>)) {\n orderField = \"lft\";\n }\n\n const { result, query } = useList<any>({\n resource,\n pagination: { pageSize: 1000 },\n sorters: [{ field: orderField, order: \"asc\" }],\n filters,\n });\n\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n const isError = query?.isError ?? false;\n const refetch = query?.refetch ?? (() => {});\n\n const { mutate: updateItem } = useUpdate();\n const { mutate: createItem } = useCreate();\n\n const tree = useMemo(() => {\n const nodeMap = new Map<string, TreeNode>();\n const roots: TreeNode[] = [];\n\n // Pass 1: Map items to tree nodes\n items.forEach((item: any) => {\n nodeMap.set(item.id, {\n id: item.id,\n name: item.name,\n label: String(item[titleField] || item.name || \"Untitled\"),\n children: [],\n raw: item,\n });\n });\n\n // Pass 2: Reconstruct Hierarchy\n items.forEach((item: any) => {\n const node = nodeMap.get(item.id)!;\n const parentId = item[parentField];\n if (parentId && nodeMap.has(parentId)) {\n nodeMap.get(parentId)!.children.push(node);\n } else {\n roots.push(node);\n }\n });\n\n return roots;\n }, [items, titleField]);\n\n const handleDrop = useCallback(\n (targetNode: TreeNode | null) => {\n if (!dragNodeId || dragNodeId === targetNode?.id) {\n setDragNodeId(null);\n return;\n }\n updateItem(\n {\n resource,\n id: dragNodeId,\n values: { [parentField]: targetNode ? targetNode.id : null },\n },\n { onSuccess: () => refetch() }\n );\n setDragNodeId(null);\n },\n [dragNodeId, resource, updateItem, refetch]\n );\n\n const handleAddRoot = useCallback(\n (label: string) => {\n setAddingRoot(false);\n if (label.trim()) {\n createItem(\n { resource, values: { [titleField]: label, [parentField]: null } },\n { onSuccess: () => refetch() }\n );\n }\n },\n [createItem, resource, titleField, refetch]\n );\n\n const handleRename = useCallback(\n (node: TreeNode, newLabel: string) => {\n updateItem(\n { resource, id: node.id, values: { [titleField]: newLabel } },\n { onSuccess: () => refetch() }\n );\n },\n [updateItem, resource, titleField, refetch]\n );\n\n const handleAddChild = useCallback(\n (node: TreeNode) => {\n const formStr = JSON.stringify({ [parentField]: node.id });\n go({\n to: `/app/${resource}/new`,\n query: { form: formStr },\n });\n },\n [go, resource, parentField]\n );\n\n if (isLoading) {\n return (\n <YStack padding=\"$lg\">\n <MText color=\"$colorMuted\">{t(\"Loading tree...\")}</MText>\n </YStack>\n );\n }\n\n if (isError) {\n return (\n <YStack padding=\"$xl\" alignItems=\"center\">\n <MText color=\"$error\">{t(\"Failed to load tree\")}</MText>\n <Button variant=\"ghost\" onPress={() => void refetch()} marginTop=\"$sm\">\n {t(\"Retry\")}\n </Button>\n </YStack>\n );\n }\n\n return (\n <YStack padding=\"$md\" flex={1} width=\"100%\">\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 refetch()} 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);\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 {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 {tree.map((node) => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n onRename={handleRename}\n onAddChild={handleAddChild}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={handleDrop}\n onNodeClick={onNodeClick}\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 YStack,\n Popover,\n} from \"@framework-m/ui\";\nimport { TableSkeleton } from \"../layout/ShellSkeleton\";\nimport { Slot } from \"../../plugins\";\nimport { GanttView, KanbanView, TreeView, CalendarView } from \"../../views\";\nimport { ConfirmDialog } from \"../feedback\";\nimport { AutoTable } from \"../table\";\nimport type { FilterFieldDefinition, FilterRow, FilterValueKind } 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\nfunction getValidOperators(type: FilterValueKind | undefined): FilterOperator[] {\n switch (type) {\n case \"number\":\n return [\"eq\", \"gt\", \"lt\", \"in\"];\n case \"date\":\n case \"datetime\":\n return [\"eq\", \"gt\", \"lt\"];\n case \"boolean\":\n return [\"eq\"];\n case \"select\":\n return [\"eq\", \"in\"];\n case \"text\":\n default:\n return [\"eq\", \"like\", \"in\"];\n }\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 canCalendar: boolean;\n calendarConfig: any;\n confirmBulkDelete: () => Promise<void>;\n handleBulkDelete: () => Promise<void>;\n hasLockedSelection?: boolean;\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 canCalendar,\n calendarConfig,\n confirmBulkDelete,\n handleBulkDelete,\n hasLockedSelection,\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 const availableViews = [\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 { key: \"gantt\", label: t(\"Gantt\"), enabled: canGantt },\n { key: \"calendar\", label: t(\"Calendar\"), enabled: canCalendar },\n ].filter((v) => v.enabled);\n\n const actionButtons = (\n <>\n {availableViews.length > 1 && (\n <Select\n value={activeView}\n onValueChange={(val: string) => setActiveView(val as ListViewMode)}\n options={availableViews.map((v) => ({ label: v.label, value: v.key }))}\n size=\"sm\"\n width={isMobile ? 105 : 120}\n placement=\"bottom-end\"\n />\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n borderRadius=\"$sm\"\n onPress={handleNew}\n paddingHorizontal={isMobile ? \"$sm\" : \"$md\"}\n >\n <Icon name=\"plus\" size={14} color=\"#fff\" strokeWidth={2.4} />\n {t(\"New\")}\n </Button>\n </>\n );\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\n justifyContent=\"space-between\"\n alignItems={isMobile ? \"flex-start\" : \"center\"}\n gap=\"$md\"\n flexDirection={isMobile ? \"column\" : \"row\"}\n >\n <XStack\n gap=\"$sm\"\n flex={1}\n minWidth={0}\n width=\"100%\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n overflow=\"visible\"\n >\n <YStack flex={1} minWidth={0} flexShrink={1}>\n <Heading size=\"$sm\" margin={0} color=\"$color\" numberOfLines={1}>\n {title}\n </Heading>\n </YStack>\n {isMobile && (\n <XStack gap=\"$xs\" alignItems=\"center\" flexShrink={0}>\n {actionButtons}\n </XStack>\n )}\n </XStack>\n\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n justifyContent={isMobile ? \"flex-start\" : \"flex-end\"}\n width={isMobile ? \"100%\" : undefined}\n >\n <Slot name=\"list-header-actions\" doctype={doctype} />\n {!isMobile && actionButtons}\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 <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 position=\"relative\"\n alignItems=\"center\"\n flex={1}\n width={isMobile ? \"100%\" : undefined}\n >\n <XStack position=\"absolute\" left={10} zIndex={10} pointerEvents=\"none\">\n <Icon name=\"search\" size={16} color=\"$colorMuted\" />\n </XStack>\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={0}\n borderRadius=\"$sm\"\n paddingLeft={36}\n paddingRight={72}\n />\n <XStack position=\"absolute\" right={4} zIndex={10} alignItems=\"center\" gap=\"$1\">\n {(hasDraftSearchQuery || hasAppliedSearchQuery) && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$round\"\n padding={0}\n width={28}\n height={28}\n onPress={clearSearch}\n aria-label=\"Clear search\"\n >\n <Icon name=\"x\" size={14} color=\"$colorMuted\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"$round\"\n padding={0}\n width={28}\n height={28}\n onPress={applySearch}\n disabled={!hasPendingSearchChanges}\n aria-label=\"Apply search\"\n opacity={hasPendingSearchChanges ? 1 : 0.3}\n >\n <Icon\n name=\"arrow-right\"\n size={16}\n color={hasPendingSearchChanges ? \"$primary\" : \"$colorMuted\"}\n />\n </Button>\n </XStack>\n </XStack>\n\n <XStack\n gap=\"$sm\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n width={isMobile ? \"100%\" : undefined}\n >\n <Button\n variant={isFilterPanelOpen || appliedFilters.length > 0 ? \"primary\" : \"ghost\"}\n size=\"sm\"\n borderWidth={1}\n borderColor={isFilterPanelOpen ? \"$primary\" : \"$borderColorMuted\"}\n borderRadius={isMobile ? \"$sm\" : \"$md\"}\n flex={isMobile ? 1 : undefined}\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 {!isMobile && t(\"Filter\")}\n {appliedFilters.length > 0 ? ` (${appliedFilters.length})` : \"\"}\n <Icon\n name={isFilterPanelOpen ? \"x\" : \"chevron-down\"}\n size={13}\n color={isFilterPanelOpen || appliedFilters.length > 0 ? \"#fff\" : \"$colorMuted\"}\n />\n {isMobile ? \"\" : ` (${appliedFilters.length})`}\n </Button>\n\n <MStack flex={isMobile ? 1 : undefined} width={isMobile ? undefined : 90}>\n <Popover\n placement=\"bottom-end\"\n open={isColumnsMenuOpen}\n onOpenChange={setIsColumnsMenuOpen}\n trigger={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor={isColumnsMenuOpen ? \"$primary\" : \"$borderColorMuted\"}\n borderRadius={isMobile ? \"$sm\" : \"$md\"}\n width={isMobile ? \"100%\" : undefined}\n >\n <Icon name=\"columns-3\" size={14} color=\"$color\" />\n {!isMobile && t(\"Columns\")}\n </Button>\n }\n content={\n <MStack gap=\"$sm\" minWidth={180}>\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 }\n />\n </MStack>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderWidth={1}\n borderColor=\"$borderColorMuted\"\n borderRadius={isMobile ? \"$sm\" : \"$md\"}\n flex={isMobile ? 1 : undefined}\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 {!isMobile && t(\"Reset\")}\n </Button>\n\n <Slot name=\"list-filters\" doctype={doctype} data={listFilterSlotData} />\n </XStack>\n </XStack>\n\n {/* INLINE FILTER PANEL */}\n {isFilterPanelOpen && (\n <MStack\n marginTop=\"$xs\"\n paddingTop=\"$sm\"\n borderTopWidth={1}\n borderColor=\"$borderColorMuted\"\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 <YStack paddingRight=\"$xs\" 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 const validOps = getValidOperators(fieldConfig?.type);\n const operatorOptions = FILTER_OPERATOR_OPTIONS.filter((op) =>\n validOps.includes(op.value)\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%\" : 160}\n onChange={(value) => {\n const nextField = coerceSelectValue(value) || row.field;\n const nextType = filterFieldMap[nextField]?.type;\n const validNextOps = getValidOperators(nextType);\n const nextOp = validNextOps.includes(row.operator)\n ? row.operator\n : validNextOps[0];\n\n updateFilterRow(row.id, {\n field: nextField,\n operator: nextOp,\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={operatorOptions}\n width={isMobile ? \"100%\" : 130}\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%\" : 180}\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) => updateFilterRow(row.id, { value })}\n width={isMobile ? \"100%\" : 180}\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 </YStack>\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 </MStack>\n )}\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 {activeView === \"list\" && (\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 disabled={hasLockedSelection}\n opacity={hasLockedSelection ? 0.5 : 1}\n >\n {hasLockedSelection ? t(\"Cannot Delete Locked\") : 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 selectedRows={selectedRows as any}\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 filters={tableFilters}\n />\n )}\n\n {activeView === \"tree\" && canTree && detectedParentField && (\n <TreeView\n resource={doctype}\n schema={schema}\n config={{\n parentField: detectedParentField,\n labelField: detectedLabelField,\n allowReparent: true,\n allowAddChild: true,\n allowRename: true,\n }}\n filters={tableFilters}\n onNodeClick={handleRowClick}\n />\n )}\n\n {activeView === \"gantt\" && canGantt && ganttConfig && (\n <GanttView resource={doctype} config={ganttConfig} filters={tableFilters} />\n )}\n\n {(activeView as string) === \"calendar\" && canCalendar && calendarConfig && (\n <CalendarView resource={doctype} config={calendarConfig} filters={tableFilters} />\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 * 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\";\nimport { SYSTEM_FIELDS } from \"../components/table/tableUtils\";\n\nexport interface ListViewProps {\n doctype?: string;\n view?: \"list\" | \"kanban\" | \"tree\" | \"gantt\" | \"calendar\";\n}\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n [key: string]: unknown;\n}\n\n// We use the global SYSTEM_FIELDS, but we strictly ALLOW \"name\" to pass through\n// because for primary List Views, \"name\" (e.g. INV-0001) is the main human-readable identifier!\nconst LIST_SYSTEM_FIELDS = new Set(SYSTEM_FIELDS.filter((f) => f !== \"name\"));\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 as any).ui_meta?.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 const metaCalendar = uiMeta?.additional_views?.calendar as\n | {\n startField?: string;\n titleField?: 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 calendarStartField = useMemo(() => {\n return pickFirst(\n metaCalendar?.startField,\n schemaFields.date ? \"date\" : undefined,\n schemaFields.start_date ? \"start_date\" : undefined\n );\n }, [metaCalendar, schemaFields]);\n\n const calendarConfig = useMemo(() => {\n if (!calendarStartField) return undefined;\n return {\n startField: calendarStartField,\n titleField:\n pickFirst(\n metaCalendar?.titleField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.name ? \"name\" : undefined\n ) ?? \"name\",\n };\n }, [metaCalendar, schemaFields, calendarStartField]);\n\n const canCalendar = Boolean(calendarConfig);\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 canCalendar,\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 // Check if any selected row is locked (docstatus === 1 or 2)\n const hasLockedSelection = useMemo(() => {\n return selectedRows.some((row) => {\n const status = Number(row.docstatus);\n return status === 1 || status === 2;\n });\n }, [selectedRows]);\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 canCalendar={canCalendar}\n calendarConfig={calendarConfig}\n confirmBulkDelete={confirmBulkDelete}\n handleBulkDelete={handleBulkDelete}\n hasLockedSelection={hasLockedSelection}\n handleNew={handleNew}\n />\n );\n}\n\nexport default ListView;\n","import { XStack, Button, Card } from \"@framework-m/ui\";\nimport { Frm } from \"../../hooks/useFormController\";\nimport { useTranslation } from \"../../hooks\";\n\nexport interface FormToolbarProps {\n frm: Frm;\n submitLabel: string;\n docstatus?: number;\n}\n\nexport function FormToolbar({ frm, submitLabel, docstatus }: FormToolbarProps) {\n const { t } = useTranslation(\"desk\");\n const isLocked = frm.isLocked;\n\n return (\n <Card\n style={{ position: \"sticky\", bottom: 0 } as any}\n marginTop=\"$md\"\n zIndex={100}\n padding=\"$sm\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n backgroundColor=\"$background\"\n borderRadius=\"$md\"\n elevated\n >\n <XStack gap=\"$sm\" justifyContent=\"space-between\">\n {!isLocked ? (\n <>\n <Button\n variant=\"ghost\"\n size=\"md\"\n flex={1}\n onPress={() => frm.cancel()}\n disabled={frm.isSaving}\n >\n {t(\"Discard\")}\n </Button>\n <Button\n variant=\"primary\"\n size=\"md\"\n flex={1}\n onPress={() => frm.save()}\n disabled={frm.isSaving}\n >\n {submitLabel}\n </Button>\n </>\n ) : docstatus === 1 ? (\n <>\n <Button variant=\"danger\" size=\"md\" flex={1} disabled>\n {t(\"Cancel\")}\n </Button>\n <Button variant=\"primary\" size=\"md\" flex={1} disabled>\n {t(\"Correct / Amend\")}\n </Button>\n </>\n ) : docstatus === 2 ? (\n <Button variant=\"primary\" size=\"md\" flex={1} disabled>\n {t(\"Amend\")}\n </Button>\n ) : null}\n </XStack>\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 React from \"react\";\nimport {\n XStack,\n MStack,\n MText,\n Heading,\n Card,\n Button,\n Popover,\n YStack,\n Icon,\n} from \"@framework-m/ui\";\nimport { WorkflowActions } from \"../workflow/WorkflowActions\";\nimport { AlertBanner } from \"../feedback/AlertBanner\";\nimport { SubmittedBanner } from \"../feedback/SubmittedBanner\";\nimport { useTranslation } from \"../../hooks\";\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 submitLabel: string;\n onSave: () => void;\n onDiscard: () => void;\n isSaving: boolean;\n isLocked: boolean;\n docstatus?: number;\n showSystemInfo: boolean;\n setShowSystemInfo: (v: boolean) => void;\n openPrintPreview: () => void;\n downloadPrintPdf: () => void;\n isMobile?: boolean;\n onDelete?: () => void;\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 submitLabel,\n onSave,\n onDiscard,\n isSaving,\n isLocked,\n docstatus,\n showSystemInfo,\n setShowSystemInfo,\n openPrintPreview,\n downloadPrintPdf,\n isMobile = false,\n onDelete,\n}) => {\n const { t } = useTranslation(\"desk\");\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={onDiscard}\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 <XStack gap=\"$sm\" alignItems=\"center\">\n {/* Dynamic Buttons (Desktop Only) */}\n {!isMobile && (\n <XStack gap=\"$sm\" alignItems=\"center\" marginRight=\"$sm\">\n {!isLocked ? (\n <>\n <Button variant=\"ghost\" size=\"sm\" onPress={onDiscard} disabled={isSaving}>\n {t(\"Discard\")}\n </Button>\n <Button variant=\"primary\" size=\"sm\" onPress={onSave} disabled={isSaving}>\n {submitLabel}\n </Button>\n </>\n ) : docstatus === 1 ? (\n <>\n <Button variant=\"danger\" size=\"sm\" disabled>\n {t(\"Cancel\")}\n </Button>\n <Button variant=\"primary\" size=\"sm\" disabled>\n {t(\"Correct / Amend\")}\n </Button>\n </>\n ) : docstatus === 2 ? (\n <Button variant=\"primary\" size=\"sm\" disabled>\n {t(\"Amend\")}\n </Button>\n ) : null}\n </XStack>\n )}\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\n {/* More Options (...) Menu */}\n {isEditing && (\n <Popover\n placement=\"bottom-end\"\n trigger={\n <Button variant=\"ghost\" size=\"sm\" paddingHorizontal=\"$2\">\n <Icon name=\"more-vertical\" size={16} color=\"$color\" />\n </Button>\n }\n content={\n <YStack gap=\"$xs\" minWidth={180}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={openPrintPreview}\n >\n <Icon name=\"printer\" size={14} color=\"$colorMuted\" />\n <MText>{t(\"Print Preview\")}</MText>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={downloadPrintPdf}\n >\n <Icon name=\"download\" size={14} color=\"$colorMuted\" />\n <MText>{t(\"Download PDF\")}</MText>\n </Button>\n <MStack height={1} backgroundColor=\"$borderColorMuted\" marginVertical=\"$xs\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={() => setShowSystemInfo(!showSystemInfo)}\n >\n <Icon name=\"info\" size={14} color=\"$colorMuted\" />\n <MText>{showSystemInfo ? t(\"Hide System Info\") : t(\"System Info\")}</MText>\n </Button>\n {onDelete && (\n <>\n <MStack height={1} backgroundColor=\"$borderColorMuted\" marginVertical=\"$xs\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n justifyContent=\"flex-start\"\n onPress={onDelete}\n >\n <Icon name=\"trash-2\" size={14} color=\"$error\" />\n <MText color=\"$error\">{t(\"Delete\")}</MText>\n </Button>\n </>\n )}\n </YStack>\n }\n />\n )}\n </XStack>\n </XStack>\n\n {/* Validation Errors */}\n {frm.errors && frm.errors.length > 0 && (\n <Card\n marginBottom=\"$md\"\n backgroundColor=\"rgba(239, 68, 68, 0.1)\"\n borderColor=\"$error\"\n borderWidth={1}\n padding=\"$md\"\n borderRadius=\"$sm\"\n >\n <MStack gap=\"$xs\">\n {frm.errors.map((error: string, i: number) => (\n <MText\n key={`${error}-text-${i}`}\n color=\"$error\"\n fontSize=\"$sm\"\n fontWeight={i === 0 ? \"600\" : \"400\"}\n >\n {error}\n </MText>\n ))}\n </MStack>\n </Card>\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, Icon } from \"@framework-m/ui\";\nimport { SystemInfo } from \"../components/layout/SystemInfo\";\nimport { useRef, useState, useEffect, 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\";\nimport { useDelete } from \"@refinedev/core\";\nimport { useNavigate, useSearchParams, useBlocker } from \"react-router\";\nimport { ConfirmDialog } from \"../components/feedback\";\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, changeLanguage, language } = 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 const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n const [isDiscardConfirmOpen, setIsDiscardConfirmOpen] = useState(false);\n const [uiError, setUiError] = useState<string | null>(null);\n useFormKeyboard(formRef);\n\n const { uiMeta } = useUIMeta(doctype);\n\n const {\n handleTouchStart,\n handleTouchEnd,\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 const { mutateAsync: deleteMutate } = useDelete();\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n\n // --- Dirty State Tracking & Navigation Blocking ---\n const baselineDocRef = useRef<string | null>(null);\n const lastRecordRef = useRef<string | null>(null);\n const [isDirty, setIsDirty] = useState(false);\n const bypassBlockerRef = useRef(false);\n\n // Reset baseline state when id, doctype, or form query param changes\n const formParam = searchParams.get(\"form\");\n useEffect(() => {\n baselineDocRef.current = null;\n lastRecordRef.current = null;\n }, [id, doctype, formParam]);\n\n // 1. Establish baseline state\n useEffect(() => {\n if (record) {\n const recordStr = JSON.stringify(record);\n if (lastRecordRef.current !== recordStr) {\n lastRecordRef.current = recordStr;\n baselineDocRef.current = recordStr;\n }\n } else if (frm.doc && baselineDocRef.current === null) {\n // For new docs, establish baseline immediately since form parameters\n // are synchronously loaded inside useFormController.\n baselineDocRef.current = JSON.stringify(frm.doc);\n }\n }, [record, frm.doc]);\n\n // 2. Check for dirty state\n useEffect(() => {\n if (baselineDocRef.current && frm.doc && !frm.isSaving) {\n setIsDirty(JSON.stringify(frm.doc) !== baselineDocRef.current);\n }\n }, [frm.doc, frm.isSaving]);\n\n useEffect(() => {\n // 1. Global language switch via ?lng=hi\n const lng = searchParams.get(\"lng\");\n if (lng && changeLanguage && language !== lng) {\n changeLanguage(lng).catch(() => undefined);\n }\n }, [searchParams, changeLanguage, language]); // Removed queryParamsInitialized.current from dependencies\n\n // 4. Browser Native Blocker (Hard Refresh/Close)\n useEffect(() => {\n if (!isDirty || frm.isSaving) return;\n if (typeof window === \"undefined\" || !window.addEventListener) return;\n\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = \"\";\n };\n\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }, [isDirty, frm.isSaving]);\n\n // 4.5. Client-Side Routing Blocker (Data Router Native)\n const blocker = useBlocker(({ currentLocation, nextLocation }) => {\n if (bypassBlockerRef.current) return false;\n if ((nextLocation.state as Record<string, unknown>)?.bypassBlocker) return false;\n return isDirty && !frm.isSaving && currentLocation.pathname !== nextLocation.pathname;\n });\n\n useEffect(() => {\n if (blocker.state === \"blocked\") {\n setIsDiscardConfirmOpen(true);\n }\n }, [blocker.state]);\n\n // Global Cmd/Ctrl + S shortcut to save the form safely across platforms\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.addEventListener) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"s\") {\n e.preventDefault(); // Prevent browser's native \"Save Page\" dialog\n if (!frm.isLocked && !frm.isSaving) {\n frm.save({ preventNavigation: !!uiMeta?.auto_save } as any);\n }\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [frm, uiMeta?.auto_save]);\n\n // 5. Debounced Auto-Save (Drafts and Standard DocTypes Only)\n useEffect(() => {\n if (\n uiMeta?.auto_save &&\n isEditing &&\n isDirty &&\n !frm.isSaving &&\n !frm.isLocked &&\n (!record || record.docstatus === 0 || record.docstatus === undefined)\n ) {\n const timer = setTimeout(() => {\n frm.save({ preventNavigation: true } as any);\n }, 1500); // Save 1.5 seconds after the user stops typing\n\n return () => clearTimeout(timer);\n }\n }, [\n uiMeta?.auto_save,\n isEditing,\n isDirty,\n frm.doc,\n frm.isSaving,\n frm.isLocked,\n record?.docstatus,\n frm,\n ]);\n\n const handleDelete = async () => {\n if (!id) return;\n bypassBlockerRef.current = true; // Bypass blocker\n setIsDirty(false);\n try {\n await deleteMutate({\n resource: doctype,\n id,\n });\n setIsDeleteConfirmOpen(false);\n navigate(`/app/${doctype}/list`, { state: { bypassBlocker: true } });\n } catch (err: any) {\n bypassBlockerRef.current = false;\n setIsDeleteConfirmOpen(false);\n setUiError(err.message || `Failed to delete ${doctype}.`);\n }\n };\n\n const handleDownloadPdf = async () => {\n setUiError(null);\n try {\n await downloadPrintPdf();\n } catch (err: any) {\n setUiError(err.message || `Failed to download PDF for ${doctype}.`);\n }\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=\"$0\"\n width=\"100%\"\n backgroundColor=\"$background\"\n onTouchStart={shell.isMobile ? (e: any) => handleTouchStart(e) : undefined}\n onTouchEnd={shell.isMobile ? (e: any) => handleTouchEnd(e) : undefined}\n paddingBottom=\"$0\"\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 submitLabel={submitLabel}\n onSave={() => frm.save({ preventNavigation: !!uiMeta?.auto_save } as any)}\n onDiscard={() => {\n if (isDirty) {\n setIsDiscardConfirmOpen(true);\n return;\n }\n bypassBlockerRef.current = true; // Bypass blocker\n setIsDirty(false);\n frm.cancel();\n }}\n isSaving={frm.isSaving}\n isLocked={frm.isLocked}\n docstatus={record?.docstatus}\n showSystemInfo={showSystemInfo}\n setShowSystemInfo={setShowSystemInfo}\n openPrintPreview={openPrintPreview}\n downloadPrintPdf={handleDownloadPdf}\n isMobile={shell.isMobile}\n onDelete={isEditing && !isSingleton ? () => setIsDeleteConfirmOpen(true) : undefined}\n />\n\n {/* Non-intrusive auto-save status indicator */}\n {uiMeta?.auto_save && isEditing && (\n <XStack\n paddingHorizontal={shell.isMobile ? \"$sm\" : \"$lg\"}\n paddingTop=\"$sm\"\n justifyContent=\"flex-end\"\n opacity={0.7}\n >\n <MText fontSize=\"$xs\" color=\"$colorMuted\" fontWeight=\"500\">\n {frm.isSaving ? t(\"Auto-saving...\") : isDirty ? t(\"Unsaved changes\") : t(\"Saved\")}\n </MText>\n </XStack>\n )}\n\n {uiError && (\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\">{uiError}</MText>\n </Card>\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 (1-column full width) */}\n <XStack\n width=\"100%\"\n gap=\"$lg\"\n alignItems=\"flex-start\"\n backgroundColor=\"$background\"\n minHeight={0}\n >\n {/* 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 {/* System/Audit Sidebar (Overlay for both Desktop & Mobile) */}\n {isEditing && showSystemInfo && (\n <MStack\n width={shell.isMobile ? \"80%\" : 320}\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 <MText fontWeight=\"600\" flex={1}>\n {t(\"System Info\")}\n </MText>\n <Button\n aria-label=\"Close system info\"\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => setShowSystemInfo(false)}\n >\n <Icon name=\"x\" size={16} color=\"$colorMuted\" />\n </Button>\n </XStack>\n\n <SystemInfo id={id} record={record} />\n </MStack>\n )}\n </XStack>\n\n {shell.isMobile && (\n <>\n <FormToolbar frm={frm} submitLabel={submitLabel} docstatus={record?.docstatus} />\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={frm.doc} id={id} />\n </>\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title={t(\"Confirm Delete\")}\n message={t(\"Are you sure you want to delete this document? This action cannot be undone.\")}\n confirmLabel={t(\"Delete\")}\n cancelLabel={t(\"Cancel\")}\n destructive\n onConfirm={() => {\n handleDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n\n <ConfirmDialog\n open={isDiscardConfirmOpen}\n title={t(\"Unsaved Changes\")}\n message={t(\"You have unsaved changes. Are you sure you want to discard them?\")}\n confirmLabel={t(\"Discard\")}\n cancelLabel={t(\"Cancel\")}\n destructive\n onConfirm={() => {\n setIsDiscardConfirmOpen(false);\n bypassBlockerRef.current = true;\n setIsDirty(false);\n if (blocker.state === \"blocked\") {\n blocker.proceed();\n } else {\n frm.cancel();\n }\n }}\n onCancel={() => {\n setIsDiscardConfirmOpen(false);\n if (blocker.state === \"blocked\") {\n blocker.reset();\n }\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 {\n YStack,\n XStack,\n Card,\n Input,\n Button,\n Heading,\n Paragraph,\n useTheme,\n Icon,\n} 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\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 [isForgotPasswordMode, setIsForgotPasswordMode] = useState(false);\n const [isForgotPasswordLoading, setIsForgotPasswordLoading] = useState(false);\n const { theme, toggleTheme } = useTheme();\n const mfetch = useMFetch();\n\n const isLoginLoading = status === \"pending\";\n const isLoading = isLoginLoading || isForgotPasswordLoading;\n const [providers, setProviders] = useState<string[]>(resolveConfiguredProviders());\n const displayTitle = isForgotPasswordMode\n ? t(\"Reset Password\")\n : title === \"Welcome back\"\n ? t(\"Welcome back\")\n : title;\n const displaySubtitle = isForgotPasswordMode\n ? t(\"Enter your email to receive a reset link\")\n : t(\"Sign in to your account\");\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 handleForgotPasswordSubmit = async () => {\n if (!email) {\n setError(t(\"Please enter your email address.\"));\n return;\n }\n\n setIsForgotPasswordLoading(true);\n try {\n const response = await mfetch(\"/api/v1/auth/forgot-password\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email }),\n });\n\n if (response.ok) {\n setInfoMessage(\n t(\"If an account exists with this email, a password reset link has been sent.\")\n );\n setIsForgotPasswordMode(false);\n } else {\n const data = await response.json().catch(() => ({}));\n setError(data.message || data.detail || t(\"Failed to send reset link.\"));\n }\n } catch (err: any) {\n setError(err.message || t(\"An error occurred. Please try again.\"));\n } finally {\n setIsForgotPasswordLoading(false);\n }\n };\n\n const handleSubmit = (e?: any) => {\n e?.preventDefault();\n if (isLoading) return;\n setError(null);\n setInfoMessage(null);\n\n if (isForgotPasswordMode) {\n handleForgotPasswordSubmit();\n return;\n }\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 <Icon name={theme === \"dark\" ? \"sun\" : \"moon\"} size={20} />\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 {displaySubtitle}\n </Paragraph>\n </YStack>\n </YStack>\n\n {!isForgotPasswordMode && providers.length > 0 && (\n <YStack gap=\"$sm\" marginBottom=\"$lg\">\n {providers.map((provider) => (\n <Button\n key={provider}\n variant=\"default\"\n onClick={() => {\n const searchParams = new URLSearchParams(globalThis.location?.search ?? \"\");\n const isAddAccount = searchParams.get(\"add_account\") === \"true\";\n const startUrl = isAddAccount\n ? `/api/v1/auth/oauth/${provider}/start?add_account=true`\n : `/api/v1/auth/oauth/${provider}/start`;\n globalThis.location.href = startUrl;\n }}\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 {!isForgotPasswordMode && (\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n {t(\"Password\")}\n </Paragraph>\n <XStack position=\"relative\" alignItems=\"center\" width=\"100%\">\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 paddingRight={44}\n />\n <XStack position=\"absolute\" right={6} zIndex={10}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => setShowPassword((value) => !value)}\n disabled={isLoading}\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n borderRadius=\"$round\"\n padding={0}\n width={32}\n height={32}\n >\n <Icon name={showPassword ? \"eye-off\" : \"eye\"} size={16} color=\"$colorMuted\" />\n </Button>\n </XStack>\n </XStack>\n </YStack>\n )}\n\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={isLoading}\n disabled={isLoading}\n size=\"lg\"\n onPress={() => handleSubmit()}\n >\n {isForgotPasswordMode\n ? isForgotPasswordLoading\n ? t(\"Sending...\")\n : t(\"Send Reset Link\")\n : isLoginLoading\n ? t(\"Signing in...\")\n : t(\"Sign In\")}\n </Button>\n </YStack>\n <YStack marginTop=\"$xl\" alignItems=\"center\">\n {isForgotPasswordMode ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isLoading}\n onPress={() => {\n setError(null);\n setInfoMessage(null);\n setIsForgotPasswordMode(false);\n }}\n >\n {t(\"Back to sign in\")}\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={isLoading}\n onPress={() => {\n setError(null);\n setInfoMessage(null);\n setIsForgotPasswordMode(true);\n }}\n >\n {t(\"Forgot password?\")}\n </Button>\n )}\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 { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useTranslation } from \"../../../hooks\";\nimport { useSystemConfig } from \"../../../providers/SystemConfigProvider\";\nimport { fetchWithCredentials } from \"../../../api\";\nimport { API_URL } from \"../../../constants\";\nimport { authProvider } from \"../../../auth\";\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 queryClient = useQueryClient();\n const { theme, setTheme } = useTheme();\n const { supportedLocales, config } = useSystemConfig();\n\n const { data: switchableProfiles = [] } = useQuery({\n queryKey: [\"switchable-profiles\"],\n queryFn: () => authProvider.getSwitchableProfiles(),\n enabled: !!identity && config?.enable_profile_switcher === true,\n });\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 maxWidth={280}>\n {switchableProfiles.length === 0 ? (\n <YStack padding=\"$md\" gap=\"$xs\">\n <Paragraph fontWeight=\"bold\" size=\"$sm\" numberOfLines={1}>\n {identity?.name || \"Anonymous\"}\n </Paragraph>\n <Paragraph size=\"$xs\" color=\"$colorMuted\" numberOfLines={1}>\n {identity?.email || \"Not signed in\"}\n </Paragraph>\n </YStack>\n ) : (\n <YStack padding=\"$xs\" gap=\"$xs\">\n <Paragraph size=\"$xs\" color=\"$colorMuted\" paddingHorizontal={8} paddingVertical={4}>\n {t(\"Accounts\")}\n </Paragraph>\n {switchableProfiles.map((profile) => {\n const isActive = profile.id === identity?.id;\n const initials = profile.name\n ? profile.name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .substring(0, 2)\n .toUpperCase()\n : \"\";\n\n return (\n <XStack\n key={profile.id}\n padding={8}\n borderRadius=\"$sm\"\n hoverStyle={!isActive ? { backgroundColor: \"$backgroundHover\" } : undefined}\n cursor={!isActive ? \"pointer\" : \"default\"}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"$sm\"\n onPress={\n !isActive\n ? async () => {\n const res = await authProvider.switchProfile(profile.id);\n if (res.success) {\n window.location.href = res.redirectTo || \"/app/dashboard\";\n }\n }\n : undefined\n }\n >\n <XStack gap=\"$sm\" alignItems=\"center\" flex={1}>\n <Avatar\n fallback={initials || <Icon name=\"user\" size={14} color=\"$colorMuted\" />}\n size={24}\n circular\n />\n <YStack flex={1} minWidth={0}>\n <Paragraph\n size=\"$sm\"\n fontWeight={isActive ? \"bold\" : \"normal\"}\n numberOfLines={1}\n >\n {profile.name || profile.email}\n </Paragraph>\n {profile.name && (\n <Paragraph size=\"$xs\" color=\"$colorMuted\" numberOfLines={1}>\n {profile.email}\n </Paragraph>\n )}\n </YStack>\n </XStack>\n <XStack gap=\"$xs\" alignItems=\"center\">\n {isActive ? <Icon name=\"check\" size={16} color=\"var(--color-primary)\" /> : null}\n <Button\n className=\"remove-profile-btn\"\n variant=\"ghost\"\n size=\"sm\"\n padding={0}\n width={24}\n height={24}\n style={{ minWidth: 24 }}\n onPress={async (e) => {\n e.stopPropagation();\n const res = await authProvider.removeProfile(profile.id);\n if (res.success) {\n if (res.sessionTerminated) {\n window.location.href = res.redirectTo || \"/login\";\n } else if (isActive) {\n window.location.href = res.redirectTo || \"/app/dashboard\";\n } else {\n queryClient.invalidateQueries({ queryKey: [\"switchable-profiles\"] });\n }\n }\n }}\n aria-label={`Remove profile ${profile.name || profile.email}`}\n >\n <Icon name=\"x\" size={14} color=\"$colorMuted\" />\n </Button>\n </XStack>\n </XStack>\n );\n })}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => {\n const to = encodeURIComponent(window.location.pathname + window.location.search);\n window.location.href = `/login?add_account=true&to=${to}`;\n }}\n style={{ justifyContent: \"flex-start\", paddingHorizontal: 8 }}\n >\n <Icon name=\"plus\" size={16} />\n <MText size=\"$sm\">{t(\"Add Account\")}</MText>\n </Button>\n </YStack>\n )}\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 placement={isRtl ? \"top-start\" : \"top-end\"}\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 ? \"left-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=\"$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 tabIndex={0}\n role=\"menuitem\"\n onKeyDown={(e: any) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (hasChildren) toggleNode(node.name);\n else if (node.route) 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 tabIndex={0}\n role=\"button\"\n onKeyDown={(e: any) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n 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 }}\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, Icon } 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 <Icon name={theme === \"dark\" ? \"sun\" : \"moon\"} size={20} />\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: (() => {\n const config = (globalThis as unknown as { __FRAMEWORK_CONFIG__?: { basename?: string } })\n .__FRAMEWORK_CONFIG__;\n const prefix = config?.basename ? config.basename.replace(/\\/$/, \"\") : \"\";\n return `${prefix}/locales/{{lng}}/{{ns}}.json`;\n })(),\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 createBrowserRouter,\n RouterProvider,\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 paddingHorizontal={isMobile ? \"$md\" : \"$lg\"}\n paddingVertical={isMobile ? \"$lg\" : \"$lg\"}\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\ninterface ShellRoutesContextType {\n title: string;\n loginPage?: ReactNode;\n children?: ReactNode;\n isMobile: boolean;\n publicPluginRoutes: React.ReactElement[];\n authenticatedPluginRoutes: React.ReactElement[];\n hasPluginRootRoute: boolean;\n}\n\nconst ShellRoutesContext = React.createContext<ShellRoutesContextType | null>(null);\n\nconst ShellRoutes = () => {\n const ctx = React.useContext(ShellRoutesContext);\n if (!ctx) return null;\n\n const {\n title,\n loginPage,\n children,\n isMobile,\n publicPluginRoutes,\n authenticatedPluginRoutes,\n hasPluginRootRoute,\n } = ctx;\n\n return (\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 && <Route path=\"/\" element={<DefaultLandingPage title={title} />} />}\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=\"calendar\" element={<ListView view=\"calendar\" />} />\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 );\n};\n\nconst ShellApp = () => {\n return (\n <Refine\n dataProvider={frameworkMDataProvider}\n authProvider={authProvider}\n routerProvider={routerProvider}\n liveProvider={liveProvider}\n options={{\n syncWithLocation: true,\n warnWhenUnsavedChanges: false, // Turned off so we can use our custom `useBlocker` Modals\n }}\n >\n <SystemConfigProvider>\n <ShellRoutes />\n </SystemConfigProvider>\n </Refine>\n );\n};\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 const router = useMemo(\n () =>\n createBrowserRouter(\n [\n {\n path: \"*\",\n element: <ShellApp />,\n },\n ],\n { basename: BASENAME }\n ),\n []\n );\n\n return (\n <ShellRoutesContext.Provider\n value={{\n title,\n loginPage,\n children,\n isMobile,\n publicPluginRoutes,\n authenticatedPluginRoutes,\n hasPluginRootRoute,\n }}\n >\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 <RouterProvider router={router} />\n </ShellProvider>\n </QueryClientProvider>\n </React.Suspense>\n </MProvider>\n </ThemeProvider>\n </PluginRegistryProvider>\n </I18nextProvider>\n </ShellRoutesContext.Provider>\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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"}
|