@framework-m/desk 0.4.2

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.
Files changed (121) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +153 -0
  3. package/dist/auth.d.ts +11 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/authConfig.d.ts +42 -0
  6. package/dist/authConfig.d.ts.map +1 -0
  7. package/dist/components/CommandPalette.d.ts +49 -0
  8. package/dist/components/CommandPalette.d.ts.map +1 -0
  9. package/dist/components/breadcrumb/index.d.ts +2 -0
  10. package/dist/components/breadcrumb/index.d.ts.map +1 -0
  11. package/dist/components/feedback/AlertBanner.d.ts +8 -0
  12. package/dist/components/feedback/AlertBanner.d.ts.map +1 -0
  13. package/dist/components/feedback/ConfirmDialog.d.ts +13 -0
  14. package/dist/components/feedback/ConfirmDialog.d.ts.map +1 -0
  15. package/dist/components/feedback/index.d.ts +5 -0
  16. package/dist/components/feedback/index.d.ts.map +1 -0
  17. package/dist/components/form/AutoForm.d.ts +61 -0
  18. package/dist/components/form/AutoForm.d.ts.map +1 -0
  19. package/dist/components/form/LinkWidget.d.ts +20 -0
  20. package/dist/components/form/LinkWidget.d.ts.map +1 -0
  21. package/dist/components/form/index.d.ts +10 -0
  22. package/dist/components/form/index.d.ts.map +1 -0
  23. package/dist/components/form/templates.d.ts +58 -0
  24. package/dist/components/form/templates.d.ts.map +1 -0
  25. package/dist/components/layout/index.d.ts +3 -0
  26. package/dist/components/layout/index.d.ts.map +1 -0
  27. package/dist/components/menu/index.d.ts +2 -0
  28. package/dist/components/menu/index.d.ts.map +1 -0
  29. package/dist/components/table/AutoTable.d.ts +47 -0
  30. package/dist/components/table/AutoTable.d.ts.map +1 -0
  31. package/dist/components/table/BulkActionsBar.d.ts +40 -0
  32. package/dist/components/table/BulkActionsBar.d.ts.map +1 -0
  33. package/dist/components/table/EditableCell.d.ts +54 -0
  34. package/dist/components/table/EditableCell.d.ts.map +1 -0
  35. package/dist/components/table/index.d.ts +12 -0
  36. package/dist/components/table/index.d.ts.map +1 -0
  37. package/dist/components/workflow/StateBadge.d.ts +29 -0
  38. package/dist/components/workflow/StateBadge.d.ts.map +1 -0
  39. package/dist/components/workflow/WorkflowActions.d.ts +37 -0
  40. package/dist/components/workflow/WorkflowActions.d.ts.map +1 -0
  41. package/dist/components/workflow/index.d.ts +10 -0
  42. package/dist/components/workflow/index.d.ts.map +1 -0
  43. package/dist/config/i18n.d.ts +3 -0
  44. package/dist/config/i18n.d.ts.map +1 -0
  45. package/dist/config/index.d.ts +13 -0
  46. package/dist/config/index.d.ts.map +1 -0
  47. package/dist/config/registry.d.ts +75 -0
  48. package/dist/config/registry.d.ts.map +1 -0
  49. package/dist/config/types.d.ts +130 -0
  50. package/dist/config/types.d.ts.map +1 -0
  51. package/dist/config/useConfig.d.ts +18 -0
  52. package/dist/config/useConfig.d.ts.map +1 -0
  53. package/dist/constants.d.ts +35 -0
  54. package/dist/constants.d.ts.map +1 -0
  55. package/dist/data.d.ts +6 -0
  56. package/dist/data.d.ts.map +1 -0
  57. package/dist/hooks/index.d.ts +21 -0
  58. package/dist/hooks/index.d.ts.map +1 -0
  59. package/dist/hooks/types.d.ts +113 -0
  60. package/dist/hooks/types.d.ts.map +1 -0
  61. package/dist/hooks/useBulkActions.d.ts +82 -0
  62. package/dist/hooks/useBulkActions.d.ts.map +1 -0
  63. package/dist/hooks/useCommandPalette.d.ts +33 -0
  64. package/dist/hooks/useCommandPalette.d.ts.map +1 -0
  65. package/dist/hooks/useDocTypeMeta.d.ts +48 -0
  66. package/dist/hooks/useDocTypeMeta.d.ts.map +1 -0
  67. package/dist/hooks/useDocTypes.d.ts +66 -0
  68. package/dist/hooks/useDocTypes.d.ts.map +1 -0
  69. package/dist/hooks/useInlineEdit.d.ts +64 -0
  70. package/dist/hooks/useInlineEdit.d.ts.map +1 -0
  71. package/dist/hooks/useTranslation.d.ts +36 -0
  72. package/dist/hooks/useTranslation.d.ts.map +1 -0
  73. package/dist/hooks/useUIMeta.d.ts +111 -0
  74. package/dist/hooks/useUIMeta.d.ts.map +1 -0
  75. package/dist/hooks/useWorkflowActions.d.ts +75 -0
  76. package/dist/hooks/useWorkflowActions.d.ts.map +1 -0
  77. package/dist/index.d.ts +68 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +5302 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/live.d.ts +21 -0
  82. package/dist/live.d.ts.map +1 -0
  83. package/dist/pages/FormView.d.ts +40 -0
  84. package/dist/pages/FormView.d.ts.map +1 -0
  85. package/dist/pages/ListView.d.ts +39 -0
  86. package/dist/pages/ListView.d.ts.map +1 -0
  87. package/dist/pages/LoginPage.d.ts +32 -0
  88. package/dist/pages/LoginPage.d.ts.map +1 -0
  89. package/dist/plugins/Slot.d.ts +27 -0
  90. package/dist/plugins/Slot.d.ts.map +1 -0
  91. package/dist/plugins/index.d.ts +14 -0
  92. package/dist/plugins/index.d.ts.map +1 -0
  93. package/dist/plugins/registry.d.ts +104 -0
  94. package/dist/plugins/registry.d.ts.map +1 -0
  95. package/dist/plugins/types.d.ts +130 -0
  96. package/dist/plugins/types.d.ts.map +1 -0
  97. package/dist/types.d.ts +51 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/views/CalendarView.d.ts +14 -0
  100. package/dist/views/CalendarView.d.ts.map +1 -0
  101. package/dist/views/GanttView.d.ts +14 -0
  102. package/dist/views/GanttView.d.ts.map +1 -0
  103. package/dist/views/KanbanView.d.ts +16 -0
  104. package/dist/views/KanbanView.d.ts.map +1 -0
  105. package/dist/views/TreeView.d.ts +15 -0
  106. package/dist/views/TreeView.d.ts.map +1 -0
  107. package/dist/views/index.d.ts +17 -0
  108. package/dist/views/index.d.ts.map +1 -0
  109. package/dist/views/registry.d.ts +32 -0
  110. package/dist/views/registry.d.ts.map +1 -0
  111. package/dist/views/types.d.ts +97 -0
  112. package/dist/views/types.d.ts.map +1 -0
  113. package/dist/workspace/WorkspaceSection.d.ts +16 -0
  114. package/dist/workspace/WorkspaceSection.d.ts.map +1 -0
  115. package/dist/workspace/index.d.ts +12 -0
  116. package/dist/workspace/index.d.ts.map +1 -0
  117. package/dist/workspace/types.d.ts +95 -0
  118. package/dist/workspace/types.d.ts.map +1 -0
  119. package/dist/workspace/useWorkspaces.d.ts +38 -0
  120. package/dist/workspace/useWorkspaces.d.ts.map +1 -0
  121. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/data.ts","../src/auth.ts","../src/live.ts","../src/components/form/templates.tsx","../src/components/form/AutoForm.tsx","../src/components/form/LinkWidget.tsx","../src/components/table/AutoTable.tsx","../src/components/table/EditableCell.tsx","../src/components/feedback/ConfirmDialog.tsx","../src/components/feedback/AlertBanner.tsx","../src/components/table/BulkActionsBar.tsx","../src/components/workflow/StateBadge.tsx","../src/hooks/useWorkflowActions.ts","../src/components/workflow/WorkflowActions.tsx","../src/plugins/registry.ts","../src/plugins/Slot.tsx","../src/components/CommandPalette.tsx","../src/components/menu/index.tsx","../src/components/breadcrumb/index.tsx","../src/components/layout/index.tsx","../src/hooks/useDocTypeMeta.ts","../src/hooks/useDocTypes.ts","../src/hooks/useInlineEdit.ts","../src/hooks/useBulkActions.ts","../src/hooks/useCommandPalette.ts","../src/hooks/useTranslation.ts","../src/hooks/useUIMeta.ts","../src/views/registry.ts","../src/views/KanbanView.tsx","../src/views/CalendarView.tsx","../src/views/GanttView.tsx","../src/views/TreeView.tsx","../src/config/registry.ts","../src/config/useConfig.ts","../src/workspace/WorkspaceSection.tsx","../src/pages/ListView.tsx","../src/pages/FormView.tsx","../src/pages/LoginPage.tsx","../src/authConfig.ts"],"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 metaBaseUrl?: string;\n wsBaseUrl?: 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\n/**\n * API endpoints - uses same-origin by default, configurable via window config\n */\nexport const API_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.apiBaseUrl) ||\n \"/api/v1\";\n\nexport const META_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.metaBaseUrl) ||\n \"/api/meta\";\n\nexport const WS_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.wsBaseUrl) ||\n \"/api/v1/stream\";\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 } from \"./constants\";\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(\n message: string,\n status: number,\n code?: string,\n details?: unknown,\n ) {\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\n ? resource.replace(/_/g, \" \")\n : \"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 (\n backendMessage &&\n !backendMessage.toLowerCase().includes(\"insufficient permission\")\n ) {\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; pageSize?: number } | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!pagination) return params;\n\n const current = 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 return JSON.stringify(value);\n}\n\n/**\n * Build filter params\n */\nfunction buildFilterParams(\n filters:\n | Array<{ field?: string; operator?: string; value?: unknown }>\n | 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 fetch(url, {\n ...options,\n credentials: \"include\", // Send cookies for auth\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 * 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 queryString = query ? `?${query}` : \"\";\n const url = `${API_URL}/${resource}${queryString}`;\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 = `${API_URL}/${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 = `${API_URL}/${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 = `${API_URL}/${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 = `${API_URL}/${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(\n id =>\n fetchWithCredentials(\n `${API_URL}/${resource}/${id}`,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n },\n ).catch(() => {}), // Ignore individual delete errors\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 <\n TData extends BaseRecord = BaseRecord,\n TQuery = unknown,\n TPayload = unknown,\n >(\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 * 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 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 fetch(`${API_URL}/auth/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\", // Required for cookies\n body: JSON.stringify({ email, password }),\n });\n\n if (response.ok) {\n return {\n success: true,\n redirectTo: \"/\",\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Invalid credentials\",\n }));\n\n const errorMessage =\n 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 fetch(`${API_URL}/auth/logout`, {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n // Ignore logout errors, redirect anyway\n }\n\n return {\n success: true,\n redirectTo: \"/login\",\n };\n },\n\n /**\n * Check if user is authenticated\n */\n check: async () => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n return { authenticated: true };\n }\n\n return { authenticated: false, redirectTo: \"/login\" };\n } catch {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<UserIdentity | null> => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } =\n 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 (\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\"\n ) {\n return null;\n }\n return {\n id: user.id,\n email: user.email,\n name: user.name || user.email,\n avatar: user.avatar,\n roles: user.roles || [],\n };\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get user permissions (roles)\n */\n getPermissions: async () => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } =\n 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 (\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\"\n ) {\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: any) => {\n // If 401 Unauthorized, logout and redirect\n if (error.status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n };\n }\n\n // For other errors, just return the error\n return { error };\n },\n};\n","/**\n * Framework M Live Provider for Refine\n *\n * WebSocket-based real-time updates provider.\n * Per checklist 6.1: Refine Live Provider Implementation.\n *\n * Features:\n * - Subscribe to resource changes via WebSocket\n * - Automatic UI updates on created/updated/deleted events\n * - Channel-based pub/sub\n */\n\nimport type { LiveProvider, LiveEvent } from \"@refinedev/core\";\nimport { WS_URL } from \"./constants\";\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(\n `[LiveProvider] WebSocket error on channel ${channel}:`,\n error,\n );\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 (\n params?.resource &&\n event.channel !== params.resource &&\n event.channel !== channelName\n ) {\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: {\n channel: string;\n type: string;\n payload: unknown;\n }) => {\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(\n \"/stream\",\n \"/live/publish\",\n );\n\n await fetch(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","/* eslint-disable react-refresh/only-export-components */\n/**\n * Custom RJSF Templates for Framework M\n *\n * Basic templates that can work without shadcn/ui being fully setup.\n * These provide a clean, functional form with native HTML elements.\n * Can be replaced with shadcn/ui components later.\n */\n\nimport type {\n FieldTemplateProps,\n ObjectFieldTemplateProps,\n ArrayFieldTemplateProps,\n BaseInputTemplateProps,\n WidgetProps,\n} from \"@rjsf/utils\";\nimport { isValidElement, useMemo, useState, type ReactNode } from \"react\";\n\ninterface ArrayTemplateItem {\n key: string;\n index: number;\n content: ReactNode;\n canMoveUp: boolean;\n canMoveDown: boolean;\n canRemove: boolean;\n onMove: (targetIndex: number) => void;\n onRemove: () => void;\n}\n\nfunction normalizeArrayItems(\n props: ArrayFieldTemplateProps,\n): ArrayTemplateItem[] {\n return props.items.map((rawItem, fallbackIndex) => {\n const item = rawItem as unknown as {\n key?: string;\n index?: number;\n children?: ReactNode;\n hasMoveUp?: boolean;\n hasMoveDown?: boolean;\n hasRemove?: boolean;\n onReorderClick?: (\n index: number,\n newIndex: number,\n ) => ((event?: { preventDefault?: () => void }) => void) | undefined;\n onDropIndexClick?: (\n index: number,\n ) => ((event?: { preventDefault?: () => void }) => void) | undefined;\n };\n\n const index = item.index ?? fallbackIndex;\n const content =\n item.children ?? (isValidElement(rawItem) ? rawItem : String(rawItem));\n\n return {\n key: item.key ?? String(index),\n index,\n content,\n canMoveUp: Boolean(item.hasMoveUp),\n canMoveDown: Boolean(item.hasMoveDown),\n canRemove: Boolean(item.hasRemove),\n onMove: targetIndex => {\n const handler = item.onReorderClick?.(index, targetIndex);\n if (handler) handler({ preventDefault: () => undefined });\n },\n onRemove: () => {\n const handler = item.onDropIndexClick?.(index);\n if (handler) handler({ preventDefault: () => undefined });\n },\n };\n });\n}\n\n/**\n * Field Template - wraps each field with label and error\n */\nexport function FieldTemplate(props: FieldTemplateProps) {\n const {\n id,\n label,\n required,\n description,\n errors,\n children,\n hidden,\n displayLabel,\n uiSchema,\n formData,\n } = props;\n\n const floatingLabel = Boolean(\n (uiSchema?.[\"ui:options\"] as { floatingLabel?: boolean } | undefined)\n ?.floatingLabel,\n );\n\n const hasValue =\n formData !== null && formData !== undefined && String(formData) !== \"\";\n\n if (hidden) return null;\n\n if (displayLabel && label && floatingLabel) {\n return (\n <div\n className={`form-field form-field-floating${hasValue ? \" is-active\" : \"\"}`}\n style={{ marginBottom: \"1rem\" }}\n >\n {children}\n <label htmlFor={id} className=\"form-floating-label\">\n {label}\n {required && <span style={{ color: \"red\" }}> *</span>}\n </label>\n {description && (\n <div\n style={{\n fontSize: \"0.875rem\",\n color: \"#666\",\n marginTop: \"0.25rem\",\n }}\n >\n {description}\n </div>\n )}\n {errors && (\n <div\n style={{ color: \"red\", fontSize: \"0.875rem\", marginTop: \"0.25rem\" }}\n >\n {errors}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"form-field\" style={{ marginBottom: \"1rem\" }}>\n {displayLabel && label && (\n <label\n htmlFor={id}\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n }}\n >\n {label}\n {required && <span style={{ color: \"red\" }}> *</span>}\n </label>\n )}\n {children}\n {description && (\n <div\n style={{ fontSize: \"0.875rem\", color: \"#666\", marginTop: \"0.25rem\" }}\n >\n {description}\n </div>\n )}\n {errors && (\n <div\n style={{ color: \"red\", fontSize: \"0.875rem\", marginTop: \"0.25rem\" }}\n >\n {errors}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Object Field Template - renders object properties\n */\nexport function ObjectFieldTemplate(props: ObjectFieldTemplateProps) {\n const { title, description, properties } = props;\n\n return (\n <div className=\"form-object\">\n {title && <h3 style={{ marginBottom: \"1rem\" }}>{title}</h3>}\n {description && (\n <div style={{ marginBottom: \"1rem\", color: \"#666\" }}>{description}</div>\n )}\n <div className=\"form-fields\">{properties.map(prop => prop.content)}</div>\n </div>\n );\n}\n\n/**\n * Array Field Template - renders array items with add/remove\n * Note: RJSF v6 items are ReactElements, not objects with properties\n */\nexport function ArrayFieldTemplate(props: ArrayFieldTemplateProps) {\n const { title, canAdd, onAddClick } = props;\n const extendedProps = props as ArrayFieldTemplateProps & {\n formContext?: {\n replaceArrayField?: (fieldName: string, value: unknown[]) => void;\n };\n name?: string;\n idSchema?: { $id?: string };\n };\n const [detailIndex, setDetailIndex] = useState<number | null>(null);\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n const [pasteText, setPasteText] = useState(\"\");\n const [pasteError, setPasteError] = useState<string | null>(null);\n\n const items = useMemo(() => normalizeArrayItems(props), [props]);\n\n const rawFormData = (props as { formData?: unknown }).formData;\n const rows = Array.isArray(rawFormData) ? rawFormData : [];\n const replaceArray = extendedProps.formContext?.replaceArrayField ?? null;\n const arrayFieldName =\n extendedProps.name ?? extendedProps.idSchema?.$id ?? \"items\";\n\n const applyPaste = () => {\n if (!replaceArray) {\n setPasteError(\n \"Paste requires controlled form data. This form does not expose an array updater.\",\n );\n return;\n }\n\n try {\n const parsed = JSON.parse(pasteText) as unknown;\n if (!Array.isArray(parsed)) {\n setPasteError(\"Pasted value must be a JSON array.\");\n return;\n }\n replaceArray(arrayFieldName, parsed);\n setPasteError(null);\n setPasteText(\"\");\n } catch {\n setPasteError(\n \"Invalid JSON. Paste a JSON array to replace the table rows.\",\n );\n }\n };\n\n return (\n <div className=\"form-array\" style={{ marginBottom: \"1rem\" }}>\n {title && <h4 style={{ marginBottom: \"0.5rem\" }}>{title}</h4>}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n marginBottom: \"0.75rem\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n void globalThis.navigator.clipboard?.writeText(\n JSON.stringify(rows, null, 2),\n );\n }}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"1px solid #d0d7de\",\n background: \"#fff\",\n }}\n >\n Copy Rows JSON\n </button>\n <button\n type=\"button\"\n onClick={() => setPasteText(value => (value ? \"\" : \"[]\"))}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"1px solid #d0d7de\",\n background: \"#fff\",\n }}\n >\n {pasteText ? \"Hide Paste\" : \"Paste Rows JSON\"}\n </button>\n </div>\n\n {pasteText && (\n <div style={{ marginBottom: \"0.75rem\" }}>\n <textarea\n value={pasteText}\n onChange={event => setPasteText(event.target.value)}\n rows={5}\n placeholder='Paste JSON array here, e.g. [{\"item_code\":\"X\"}]'\n style={{ width: \"100%\", marginBottom: \"0.5rem\" }}\n />\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button\n type=\"button\"\n onClick={applyPaste}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"#2563eb\",\n color: \"#fff\",\n }}\n >\n Apply Paste\n </button>\n {pasteError && (\n <span style={{ color: \"#dc2626\", fontSize: \"0.85rem\" }}>\n {pasteError}\n </span>\n )}\n </div>\n </div>\n )}\n\n <div className=\"form-array-items\">\n {items.map((item, index) => (\n <div\n key={item.key}\n style={{\n marginBottom: \"0.5rem\",\n padding: \"0.5rem\",\n border: \"1px solid #ddd\",\n borderRadius: \"4px\",\n }}\n >\n {dragIndex !== null && dragIndex !== index && (\n <button\n type=\"button\"\n onDragOver={event => event.preventDefault()}\n onDrop={() => {\n items[dragIndex]?.onMove(index);\n setDragIndex(null);\n }}\n style={{\n width: \"100%\",\n marginBottom: \"0.5rem\",\n border: \"1px dashed #94a3b8\",\n background: \"#f8fafc\",\n color: \"#334155\",\n borderRadius: \"4px\",\n padding: \"0.35rem\",\n }}\n >\n Drop row here\n </button>\n )}\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginBottom: \"0.5rem\",\n }}\n >\n <strong style={{ fontSize: \"0.85rem\" }}>Row {index + 1}</strong>\n <div style={{ display: \"flex\", gap: \"0.4rem\" }}>\n <button\n type=\"button\"\n draggable\n aria-label={`Drag row ${index + 1} to reorder`}\n onDragStart={() => setDragIndex(index)}\n >\n Drag\n </button>\n <button\n type=\"button\"\n disabled={!item.canMoveUp}\n onClick={() => item.onMove(index - 1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n disabled={!item.canMoveDown}\n onClick={() => item.onMove(index + 1)}\n >\n ↓\n </button>\n <button type=\"button\" onClick={() => setDetailIndex(index)}>\n Detail\n </button>\n <button\n type=\"button\"\n disabled={!item.canRemove}\n onClick={item.onRemove}\n >\n Remove\n </button>\n </div>\n </div>\n {detailIndex === index ? (\n <div style={{ color: \"#64748b\", fontSize: \"0.85rem\" }}>\n Row is open in detail mode.\n </div>\n ) : (\n item.content\n )}\n </div>\n ))}\n </div>\n {canAdd && (\n <button\n type=\"button\"\n onClick={onAddClick}\n style={{\n padding: \"0.5rem 1rem\",\n background: \"#4444ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Add Item\n </button>\n )}\n\n {detailIndex !== null && items[detailIndex] && (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1200,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Close detail panel\"\n style={{\n position: \"absolute\",\n inset: 0,\n border: \"none\",\n background: \"rgba(15, 23, 42, 0.45)\",\n padding: 0,\n }}\n onClick={() => setDetailIndex(null)}\n />\n\n <dialog\n open\n style={{\n width: \"min(960px, 100%)\",\n maxHeight: \"90vh\",\n overflow: \"auto\",\n background: \"#fff\",\n borderRadius: \"8px\",\n padding: \"1rem\",\n border: \"1px solid #d0d7de\",\n position: \"relative\",\n margin: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"0.75rem\",\n }}\n >\n <h4 style={{ margin: 0 }}>Row Detail - {detailIndex + 1}</h4>\n <button type=\"button\" onClick={() => setDetailIndex(null)}>\n Close\n </button>\n </div>\n {items[detailIndex].content}\n </dialog>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Base Input Template - standard input wrapper\n */\nexport function BaseInputTemplate(props: BaseInputTemplateProps) {\n const {\n id,\n type,\n value,\n disabled,\n readonly,\n required,\n onChange,\n onBlur,\n onFocus,\n placeholder,\n } = props;\n\n return (\n <input\n id={id}\n type={type || \"text\"}\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n required={required}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n onBlur={e => onBlur(id, e.target.value)}\n onFocus={e => onFocus(id, e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n }}\n />\n );\n}\n\n/**\n * Text Widget - for string fields\n */\nexport function TextWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, placeholder } = props;\n\n return (\n <input\n id={id}\n type=\"text\"\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n );\n}\n\n/**\n * Checkbox Widget - for boolean fields\n */\nexport function CheckboxWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, label } = props;\n\n return (\n <label style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <input\n id={id}\n type=\"checkbox\"\n checked={value ?? false}\n disabled={disabled || readonly}\n onChange={e => onChange(e.target.checked)}\n style={{ width: \"1rem\", height: \"1rem\" }}\n />\n {label}\n </label>\n );\n}\n\n/**\n * Select Widget - for enum fields\n */\nexport function SelectWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, options } = props;\n const enumOptions = options.enumOptions || [];\n\n return (\n <select\n id={id}\n value={value ?? \"\"}\n disabled={disabled || readonly}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select...</option>\n {enumOptions.map(opt => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\n/**\n * Date Widget - for date fields\n */\nexport function DateWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange } = props;\n\n return (\n <input\n id={id}\n type=\"date\"\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n );\n}\n\n/**\n * Textarea Widget - for long text fields\n */\nexport function TextareaWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, placeholder } = props;\n\n return (\n <textarea\n id={id}\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n rows={4}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n resize: \"vertical\",\n }}\n />\n );\n}\n\n/**\n * Custom widgets registry\n */\nexport const customWidgets = {\n TextWidget,\n CheckboxWidget,\n SelectWidget,\n DateWidget,\n TextareaWidget,\n};\n\n/**\n * Custom templates registry\n */\nexport const customTemplates = {\n FieldTemplate,\n ObjectFieldTemplate,\n ArrayFieldTemplate,\n BaseInputTemplate,\n};\n","/**\n * AutoForm Component\n *\n * Schema-driven form using RJSF that accepts JSON Schema from\n * /api/meta/{doctype} and renders form fields dynamically.\n *\n * Per checklist section 2.2:\n * - Accepts JSON Schema from GET /api/meta/{doctype}\n * - Generates form fields dynamically\n * - Maps schema types to components\n * - Exported as standalone component (\"Ejection Strategy\")\n */\n\nimport Form from \"@rjsf/core\";\nimport type { FormProps, IChangeEvent } from \"@rjsf/core\";\nimport type { RJSFSchema, UiSchema, ValidatorType } from \"@rjsf/utils\";\nimport validator from \"@rjsf/validator-ajv8\";\nimport { customTemplates, customWidgets } from \"./templates\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction replaceArrayFieldInData<T>(\n source: T | undefined,\n fieldName: string,\n value: unknown[],\n): T {\n const root = (\n source && typeof source === \"object\"\n ? { ...(source as Record<string, unknown>) }\n : {}\n ) as Record<string, unknown>;\n root[fieldName] = value;\n return root as T;\n}\n\nfunction normalizeNullablePropertySchema(property: JsonObject): JsonObject {\n const normalized: JsonObject = { ...property };\n\n const typeValue = normalized.type;\n if (Array.isArray(typeValue)) {\n const nonNullTypes = typeValue.filter(\n (t): t is string => typeof t === \"string\" && t !== \"null\",\n );\n if (nonNullTypes.length === 1) {\n normalized.type = nonNullTypes[0];\n }\n }\n\n const anyOfValue = normalized.anyOf;\n if (Array.isArray(anyOfValue)) {\n const nonNullSchemas = anyOfValue.filter(item => {\n if (!item || typeof item !== \"object\") return false;\n const schema = item as JsonObject;\n return schema.type !== \"null\";\n });\n\n if (nonNullSchemas.length === 1) {\n const nonNullSchema = nonNullSchemas[0] as JsonObject;\n const merged: JsonObject = {\n ...nonNullSchema,\n ...normalized,\n type: nonNullSchema.type ?? normalized.type,\n };\n delete merged.anyOf;\n return merged;\n }\n }\n\n return normalized;\n}\n\nfunction normalizeNullableObjectSchema(schema: RJSFSchema): RJSFSchema {\n if (!schema || typeof schema !== \"object\") return schema;\n\n const schemaObj = schema as JsonObject;\n const properties = schemaObj.properties;\n if (!properties || typeof properties !== \"object\") {\n return schema;\n }\n\n const normalizedProperties = Object.fromEntries(\n Object.entries(properties as Record<string, unknown>).map(\n ([key, value]) => {\n if (!value || typeof value !== \"object\") return [key, value];\n return [key, normalizeNullablePropertySchema(value as JsonObject)];\n },\n ),\n ) as NonNullable<RJSFSchema[\"properties\"]>;\n\n return {\n ...schema,\n properties: normalizedProperties,\n };\n}\n\n/**\n * AutoForm props\n */\nexport interface AutoFormProps<T = unknown> {\n /** JSON Schema for the form */\n schema: RJSFSchema;\n /** UI Schema for customizing form appearance */\n uiSchema?: UiSchema;\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: unknown[]) => void;\n /** Whether form is read-only */\n readonly?: boolean;\n /** Whether form is disabled */\n disabled?: boolean;\n /** Hide submit button */\n hideSubmitButton?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Additional className for the form */\n className?: string;\n /** Children to render (e.g., custom buttons) */\n children?: React.ReactNode;\n}\n\n/**\n * AutoForm Component\n *\n * A schema-driven form that accepts JSON Schema and renders fields automatically.\n * Uses RJSF with custom templates.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoForm } from \"../components/form\";\n *\n * function TaskForm() {\n * const { schema } = useDocTypeMeta(\"Task\");\n * const [data, setData] = useState({});\n *\n * if (!schema) return <Loading />;\n *\n * return (\n * <AutoForm\n * schema={schema}\n * formData={data}\n * onChange={setData}\n * onSubmit={(data) => saveTask(data)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoForm<T = unknown>({\n schema,\n uiSchema,\n formData,\n onChange,\n onSubmit,\n onError,\n readonly = false,\n disabled = false,\n hideSubmitButton = false,\n submitText = \"Submit\",\n className,\n children,\n}: Readonly<AutoFormProps<T>>) {\n const normalizedSchema = normalizeNullableObjectSchema(schema);\n\n // Handle form change\n const handleChange = (e: IChangeEvent<T>) => {\n if (onChange && e.formData !== undefined) {\n onChange(e.formData);\n }\n };\n\n // Handle form submit\n const handleSubmit = (e: IChangeEvent<T>) => {\n if (onSubmit && e.formData !== undefined) {\n onSubmit(e.formData);\n }\n };\n\n const formContext = {\n replaceArrayField: (fieldName: string, value: unknown[]) => {\n if (!onChange) return;\n onChange(replaceArrayFieldInData(formData, fieldName, value));\n },\n };\n\n // Build RJSF props\n const formProps: FormProps<T, RJSFSchema> = {\n schema: normalizedSchema,\n uiSchema: {\n ...uiSchema,\n \"ui:submitButtonOptions\": hideSubmitButton\n ? { norender: true }\n : { submitText },\n },\n formData,\n validator: validator as ValidatorType<T, RJSFSchema>,\n templates: customTemplates,\n widgets: customWidgets,\n formContext,\n readonly,\n disabled,\n onChange: handleChange,\n onSubmit: handleSubmit,\n onError,\n };\n\n return (\n <div className={className}>\n <Form {...formProps}>{children}</Form>\n </div>\n );\n}\n\nexport default AutoForm;\n","/**\n * LinkWidget - Async Search Combobox for Link Fields\n *\n * RJSF widget for \"Link\" type fields that fetches options from API.\n * Implements async search with debouncing.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { WidgetProps } from \"@rjsf/utils\";\nimport { API_URL } from \"../../constants\";\n\n/**\n * Debounce helper\n */\nfunction 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\ninterface LinkOption {\n value: string;\n label: string;\n}\n\n/**\n * LinkWidget - Combobox with async search\n *\n * Uses x-options from schema to determine the linked DocType.\n * Fetches options from /api/v1/{doctype}?q={search}\n *\n * @example\n * Schema:\n * ```json\n * {\n * \"type\": \"string\",\n * \"x-fieldtype\": \"Link\",\n * \"x-options\": \"Customer\"\n * }\n * ```\n */\nexport function LinkWidget(props: WidgetProps) {\n const {\n id,\n value,\n disabled,\n readonly,\n onChange,\n options,\n schema,\n placeholder,\n } = props;\n\n // Get linked DocType from schema options\n const linkedDoctype = (schema as Record<string, unknown>)?.[\"x-options\"] as string \n || (options as Record<string, unknown>)?.options as string \n || \"\";\n\n const [inputValue, setInputValue] = useState(value ?? \"\");\n const [searchResults, setSearchResults] = useState<LinkOption[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const debouncedSearch = useDebounce(inputValue, 300);\n\n // Fetch search results\n const fetchOptions = useCallback(async (search: string) => {\n if (!linkedDoctype) return;\n \n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (search) params.set(\"q\", search);\n params.set(\"limit\", \"20\");\n \n const response = await fetch(\n `${API_URL}/${linkedDoctype}?${params}`,\n { credentials: \"include\" }\n );\n \n if (response.ok) {\n const data = await response.json();\n const items = data.items || data;\n setSearchResults(\n items.map((item: Record<string, unknown>) => ({\n value: item.name || item.id,\n label: item.name || item.title || item.id,\n }))\n );\n }\n } catch (error) {\n console.error(\"Link search error:\", error);\n setSearchResults([]);\n } finally {\n setIsLoading(false);\n }\n }, [linkedDoctype]);\n\n // Fetch on debounced search change\n useEffect(() => {\n if (isOpen) {\n fetchOptions(debouncedSearch);\n }\n }, [debouncedSearch, isOpen, fetchOptions]);\n\n // Handle selection\n const handleSelect = (option: LinkOption) => {\n setInputValue(option.label);\n onChange(option.value);\n setIsOpen(false);\n };\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setIsOpen(true);\n \n // If cleared, clear the value\n if (!newValue) {\n onChange(undefined);\n }\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <input\n id={id}\n type=\"text\"\n value={inputValue}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder || `Search ${linkedDoctype}...`}\n onChange={handleInputChange}\n onFocus={() => {\n setIsOpen(true);\n fetchOptions(inputValue);\n }}\n onBlur={() => {\n // Delay close to allow click on option\n setTimeout(() => setIsOpen(false), 200);\n }}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n \n {/* Dropdown */}\n {isOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n zIndex: 1000,\n maxHeight: \"200px\",\n overflowY: \"auto\",\n background: \"white\",\n border: \"1px solid #ccc\",\n borderTop: \"none\",\n borderRadius: \"0 0 4px 4px\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n {isLoading ? (\n <div style={{ padding: \"0.5rem\", color: \"#666\" }}>Loading...</div>\n ) : searchResults.length === 0 ? (\n <div style={{ padding: \"0.5rem\", color: \"#666\" }}>No results</div>\n ) : (\n searchResults.map((option) => (\n <div\n key={option.value}\n onClick={() => handleSelect(option)}\n style={{\n padding: \"0.5rem\",\n cursor: \"pointer\",\n background: option.value === value ? \"#e6f2ff\" : \"white\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#f5f5f5\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \n option.value === value ? \"#e6f2ff\" : \"white\";\n }}\n >\n {option.label}\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default LinkWidget;\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 { useMemo, useState } from \"react\";\nimport { useList } from \"@refinedev/core\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type RowSelectionState,\n type PaginationState,\n} from \"@tanstack/react-table\";\nimport type { DocTypeSchema, JSONSchemaProperty } from \"../../hooks/types\";\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 /** Custom column definitions (overrides schema-generated) */\n columns?: ColumnDef<TData, unknown>[];\n /** Enable row selection */\n enableSelection?: boolean;\n /** Called when selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Called when row is clicked */\n onRowClick?: (row: TData) => void;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Generate column definitions from JSON Schema\n */\nfunction generateColumnsFromSchema<TData extends object>(\n schema: DocTypeSchema,\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 fields\n if (property[\"x-hidden\"]) continue;\n\n columns.push({\n id: key,\n accessorKey: key,\n header: property.title || key,\n cell: ({ getValue }) => {\n const value = getValue();\n\n // Format based on type\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (property.format === \"date\" || property.format === \"date-time\") {\n return new Date(value as string).toLocaleDateString();\n }\n return String(value);\n },\n enableSorting: true,\n });\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 columns: customColumns,\n enableSelection = false,\n onSelectionChange,\n onRowClick,\n className,\n}: Readonly<AutoTableProps<TData>>) {\n // State for table features\n const [sorting, setSorting] = useState<SortingState>([]);\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 20,\n });\n\n // Fetch data using Refine's useList\n const { result, query } = useList<TData>({\n resource,\n pagination: {\n pageSize: pagination.pageSize,\n mode: \"server\",\n },\n sorters:\n sorting.length > 0\n ? [{ field: sorting[0].id, order: sorting[0].desc ? \"desc\" : \"asc\" }]\n : undefined,\n });\n\n const tableData = result?.data ?? [];\n const totalCount = result?.total ?? 0;\n const isLoading = query?.isLoading ?? false;\n const queryError = query?.error as Error | null | undefined;\n\n const focusCell = (\n rowIndex: number,\n colIndex: number,\n tableElement: HTMLTableElement,\n ) => {\n const selector = `[data-cell-key=\"${rowIndex}:${colIndex}\"]`;\n const target = tableElement.querySelector<HTMLElement>(selector);\n target?.focus();\n };\n\n const handleCellKeyDown = (\n event: React.KeyboardEvent<HTMLTableCellElement>,\n rowIndex: number,\n colIndex: number,\n ) => {\n const tableElement = event.currentTarget.closest(\"table\");\n if (!tableElement) return;\n\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(rowIndex, colIndex + 1, tableElement);\n }\n\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(rowIndex, colIndex - 1, tableElement);\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusCell(rowIndex + 1, colIndex, tableElement);\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusCell(rowIndex - 1, colIndex, tableElement);\n }\n };\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);\n return [];\n }, [customColumns, schema]);\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 header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler()}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n onClick={e => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n };\n\n return [selectionColumn, ...columns];\n }, [columns, enableSelection]);\n\n // Create TanStack Table instance\n const table = useReactTable({\n data: tableData,\n columns: columnsWithSelection,\n pageCount: Math.ceil(totalCount / pagination.pageSize),\n state: {\n sorting,\n rowSelection,\n pagination,\n },\n // Use 'id' field (UUID) as row identifier, fallback to index\n getRowId: row => {\n const r = row as Record<string, unknown>;\n return String(r.id ?? r.name ?? \"\");\n },\n onSortingChange: setSorting,\n onRowSelectionChange: updater => {\n const newSelection =\n 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(\n key => newSelection[key],\n );\n const selectedRows = tableData.filter(row => {\n const r = row as Record<string, unknown>;\n const rowId = String(r.id ?? r.name ?? \"\");\n return selectedIds.includes(rowId);\n });\n onSelectionChange(selectedRows);\n }\n },\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableRowSelection: enableSelection,\n });\n\n if (isLoading) {\n return <div style={{ padding: \"1rem\" }}>Loading...</div>;\n }\n\n if (queryError) {\n return (\n <div\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n }}\n role=\"alert\"\n >\n {queryError.message || `Failed to load ${resource}.`}\n </div>\n );\n }\n\n return (\n <div className={className}>\n {/* Table */}\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n {table.getHeaderGroups().map(headerGroup => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map(header => (\n <th\n key={header.id}\n onClick={\n header.column.getCanSort()\n ? header.column.getToggleSortingHandler()\n : undefined\n }\n style={{\n padding: \"0.75rem\",\n textAlign: \"left\",\n borderBottom: \"2px solid #ddd\",\n cursor: header.column.getCanSort() ? \"pointer\" : \"default\",\n userSelect: \"none\",\n }}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getIsSorted() && (\n <span style={{ marginLeft: \"0.25rem\" }}>\n {header.column.getIsSorted() === \"asc\" ? \"↑\" : \"↓\"}\n </span>\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.map((row, rowIndex) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n style={{\n cursor: onRowClick ? \"pointer\" : \"default\",\n borderBottom: \"1px solid #eee\",\n }}\n >\n {row.getVisibleCells().map((cell, colIndex) => (\n <td\n key={cell.id}\n style={{ padding: \"0.75rem\" }}\n tabIndex={0}\n data-cell-key={`${rowIndex}:${colIndex}`}\n onKeyDown={event =>\n handleCellKeyDown(event, rowIndex, colIndex)\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Pagination */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: \"1rem\",\n padding: \"0.5rem 0\",\n }}\n >\n <div>\n Page {pagination.pageIndex + 1} of {table.getPageCount() || 1}\n {\" | \"}Total: {totalCount}\n </div>\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: table.getCanPreviousPage() ? \"pointer\" : \"not-allowed\",\n opacity: table.getCanPreviousPage() ? 1 : 0.5,\n }}\n >\n Previous\n </button>\n <button\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: table.getCanNextPage() ? \"pointer\" : \"not-allowed\",\n opacity: table.getCanNextPage() ? 1 : 0.5,\n }}\n >\n Next\n </button>\n </div>\n </div>\n </div>\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\";\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 <div\n onClick={handleClick}\n style={{\n padding: \"0.25rem 0.5rem\",\n cursor: disabled ? \"default\" : \"pointer\",\n borderRadius: \"4px\",\n minHeight: \"1.5rem\",\n transition: \"background-color 0.15s\",\n }}\n onMouseEnter={e => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = \"#f5f5f5\";\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n title={disabled ? undefined : \"Click to edit\"}\n >\n {renderValue\n ? renderValue(value)\n : type === \"checkbox\"\n ? value\n ? \"✓\"\n : \"✗\"\n : String(value ?? \"\")}\n </div>\n );\n }\n\n // Edit mode\n return (\n <div style={{ position: \"relative\" }}>\n {type === \"select\" ? (\n <select\n ref={inputRef as React.RefObject<HTMLSelectElement>}\n value={String(editValue ?? \"\")}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{\n width: \"100%\",\n padding: \"0.25rem 0.5rem\",\n border: error\n ? \"1px solid var(--color-error)\"\n : \"1px solid var(--color-primary)\",\n borderRadius: \"4px\",\n outline: \"none\",\n fontSize: \"inherit\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n >\n <option value=\"\">-</option>\n {options?.map(opt => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : type === \"checkbox\" ? (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type=\"checkbox\"\n checked={Boolean(editValue)}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\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}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{\n width: \"100%\",\n padding: \"0.25rem 0.5rem\",\n border: error\n ? \"1px solid var(--color-error)\"\n : \"1px solid var(--color-primary)\",\n borderRadius: \"4px\",\n outline: \"none\",\n fontSize: \"inherit\",\n boxSizing: \"border-box\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n )}\n\n {/* Error tooltip */}\n {error && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"0.25rem\",\n padding: \"0.25rem 0.5rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n fontSize: \"0.75rem\",\n whiteSpace: \"nowrap\",\n zIndex: 10,\n }}\n >\n {error}\n </div>\n )}\n\n {/* Saving indicator */}\n {isSaving && (\n <div\n style={{\n position: \"absolute\",\n right: \"0.25rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: \"0.75rem\",\n color: \"#1890ff\",\n }}\n >\n ...\n </div>\n )}\n </div>\n );\n}\n\nexport default EditableCell;\n","import { useEffect, useMemo } from \"react\";\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 <dialog\n open\n aria-labelledby={titleId}\n onCancel={event => {\n event.preventDefault();\n onCancel();\n }}\n style={{\n border: \"none\",\n padding: 0,\n background: \"transparent\",\n width: \"100%\",\n maxWidth: \"420px\",\n }}\n >\n <div\n style={{\n width: \"100%\",\n borderRadius: \"8px\",\n border: \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.2)\",\n padding: \"1rem\",\n }}\n >\n <h2\n id={titleId}\n style={{ margin: 0, marginBottom: \"0.5rem\", fontSize: \"1.1rem\" }}\n >\n {title}\n </h2>\n <p\n style={{\n margin: 0,\n marginBottom: \"1rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {message}\n </p>\n\n <div\n style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"0.5rem\" }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: \"0.5rem 0.9rem\",\n borderRadius: \"4px\",\n border: \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n cursor: \"pointer\",\n }}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n style={{\n padding: \"0.5rem 0.9rem\",\n borderRadius: \"4px\",\n border: \"none\",\n backgroundColor: destructive\n ? \"var(--color-error)\"\n : \"var(--color-primary)\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n\nexport default ConfirmDialog;\n","export interface AlertBannerProps {\n message: string;\n variant?: \"info\" | \"error\" | \"success\";\n onDismiss?: () => void;\n}\n\nconst styles: Record<\n NonNullable<AlertBannerProps[\"variant\"]>,\n { border: string; bg: string; text: string }\n> = {\n info: {\n border: \"var(--color-border)\",\n bg: \"var(--color-bg-secondary)\",\n text: \"var(--color-text)\",\n },\n error: {\n border: \"var(--color-error-border)\",\n bg: \"var(--color-error-bg)\",\n text: \"var(--color-error)\",\n },\n success: {\n border: \"var(--color-success-border, var(--color-border))\",\n bg: \"var(--color-success-bg, var(--color-bg-secondary))\",\n text: \"var(--color-success, var(--color-text))\",\n },\n};\n\nexport function AlertBanner({\n message,\n variant = \"info\",\n onDismiss,\n}: Readonly<AlertBannerProps>) {\n const palette = styles[variant];\n const content = (\n <>\n <span>{message}</span>\n {onDismiss && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: \"1rem\",\n lineHeight: 1,\n }}\n >\n ×\n </button>\n )}\n </>\n );\n\n const commonStyle = {\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: palette.bg,\n border: `1px solid ${palette.border}`,\n borderRadius: \"4px\",\n color: palette.text,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.5rem\",\n } as const;\n\n if (variant === \"error\") {\n return (\n <div role=\"alert\" style={commonStyle}>\n {content}\n </div>\n );\n }\n\n return <output style={commonStyle}>{content}</output>;\n}\n\nexport default AlertBanner;\n","/**\n * BulkActionsBar Component\n *\n * Toolbar for bulk actions when rows are selected.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { ConfirmDialog } from \"../feedback\";\n\n/**\n * BulkActionsBar props\n */\nexport interface BulkActionsBarProps {\n /** Number of selected items */\n selectedCount: number;\n /** Whether action is in progress */\n isLoading?: boolean;\n /** Handle bulk delete */\n onDelete?: () => void;\n /** Handle export as JSON */\n onExportJson?: () => void;\n /** Handle export as CSV */\n onExportCsv?: () => void;\n /** Handle bulk update */\n onBulkUpdate?: (field: string, value: unknown) => void;\n /** Available fields for bulk update */\n updateFields?: Array<{\n name: string;\n label: string;\n options?: Array<{ value: string; label: string }>;\n }>;\n /** Handle clear selection */\n onClear?: () => void;\n}\n\n/**\n * BulkActionsBar Component\n */\nexport function BulkActionsBar({\n selectedCount,\n isLoading = false,\n onDelete,\n onExportJson,\n onExportCsv,\n onBulkUpdate,\n updateFields = [],\n onClear,\n}: Readonly<BulkActionsBarProps>) {\n const [showUpdateMenu, setShowUpdateMenu] = useState(false);\n const [selectedField, setSelectedField] = useState(\"\");\n const [updateValue, setUpdateValue] = useState(\"\");\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Handle update submit\n const handleUpdate = useCallback(() => {\n if (selectedField && onBulkUpdate) {\n onBulkUpdate(selectedField, updateValue);\n setShowUpdateMenu(false);\n setSelectedField(\"\");\n setUpdateValue(\"\");\n }\n }, [selectedField, updateValue, onBulkUpdate]);\n\n // Handle delete with confirmation\n const handleDelete = useCallback(() => {\n setIsDeleteConfirmOpen(true);\n }, []);\n\n if (selectedCount === 0) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n marginBottom: \"1rem\",\n }}\n >\n {/* Selection count */}\n <span style={{ fontWeight: 500, color: \"var(--color-text)\" }}>\n {selectedCount} selected\n </span>\n\n {/* Actions */}\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n {/* Delete */}\n {onDelete && (\n <button\n onClick={handleDelete}\n disabled={isLoading}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-error)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: isLoading ? \"wait\" : \"pointer\",\n opacity: isLoading ? 0.6 : 1,\n }}\n >\n Delete\n </button>\n )}\n\n {/* Export JSON */}\n {onExportJson && (\n <button\n onClick={onExportJson}\n disabled={isLoading}\n style={buttonStyle}\n >\n Export JSON\n </button>\n )}\n\n {/* Export CSV */}\n {onExportCsv && (\n <button\n onClick={onExportCsv}\n disabled={isLoading}\n style={buttonStyle}\n >\n Export CSV\n </button>\n )}\n\n {/* Bulk Update */}\n {onBulkUpdate && updateFields.length > 0 && (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={() => setShowUpdateMenu(!showUpdateMenu)}\n disabled={isLoading}\n style={buttonStyle}\n >\n Update Field ▼\n </button>\n\n {/* Update dropdown */}\n {showUpdateMenu && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"0.25rem\",\n padding: \"1rem\",\n backgroundColor: \"white\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"4px\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n zIndex: 100,\n minWidth: \"200px\",\n }}\n >\n {/* Field select */}\n <select\n value={selectedField}\n onChange={e => setSelectedField(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select field...</option>\n {updateFields.map(f => (\n <option key={f.name} value={f.name}>\n {f.label}\n </option>\n ))}\n </select>\n\n {/* Value input */}\n {selectedField && (\n <>\n {updateFields.find(f => f.name === selectedField)\n ?.options ? (\n <select\n value={updateValue}\n onChange={e => setUpdateValue(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select value...</option>\n {updateFields\n .find(f => f.name === selectedField)\n ?.options?.map(o => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n type=\"text\"\n value={updateValue}\n onChange={e => setUpdateValue(e.target.value)}\n placeholder=\"New value\"\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n\n <button\n onClick={handleUpdate}\n disabled={!updateValue}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n backgroundColor: \"#1890ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: updateValue ? \"pointer\" : \"not-allowed\",\n opacity: updateValue ? 1 : 0.5,\n }}\n >\n Apply\n </button>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Spacer */}\n <div style={{ flex: 1 }} />\n\n {/* Clear selection */}\n {onClear && (\n <button\n onClick={onClear}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"transparent\",\n color: \"#666\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedCount} selected item(s)? This 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 </div>\n );\n}\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"0.5rem 1rem\",\n backgroundColor: \"#f5f5f5\",\n color: \"#333\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\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\";\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): { bg: string; text: string } {\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({\n state,\n docstatus,\n className,\n style,\n}: StateBadgeProps) {\n // Determine display state\n const displayState = state ?? (docstatus === 0 ? \"Draft\" : docstatus === 1 ? \"Submitted\" : docstatus === 2 ? \"Cancelled\" : undefined);\n \n if (!displayState) return null;\n\n const colors = getStateColor(displayState);\n\n return (\n <span\n className={className}\n style={{\n display: \"inline-block\",\n padding: \"0.25rem 0.75rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n textTransform: \"capitalize\",\n backgroundColor: colors.bg,\n color: colors.text,\n ...style,\n }}\n >\n {displayState}\n </span>\n );\n}\n\nexport default StateBadge;\n","/**\n * useWorkflowActions Hook\n *\n * Fetches available workflow transitions for a document and\n * provides methods to execute transitions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { API_URL } from \"../constants\";\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(\n doctype: string,\n id: string\n): Promise<WorkflowActionsResponse> {\n const response = await fetch(\n `${API_URL}/workflow/${doctype}/${id}/actions`,\n { credentials: \"include\" }\n );\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(\n doctype: string,\n id: string,\n action: string\n): Promise<void> {\n const response = await fetch(\n `${API_URL}/workflow/${doctype}/${id}/transition`,\n {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action }),\n }\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 {\n data,\n isLoading,\n error,\n refetch,\n } = useQuery<WorkflowActionsResponse, Error>({\n queryKey: [\"workflow-actions\", doctype, id],\n queryFn: () => fetchWorkflowActions(doctype, id!),\n enabled,\n staleTime: 30 * 1000, // 30 seconds\n });\n\n const executeAction = useCallback(\n async (actionName: string) => {\n if (!id) return;\n\n setIsExecuting(true);\n try {\n await executeTransition(doctype, id, actionName);\n \n // Invalidate queries to refresh state\n await queryClient.invalidateQueries({\n queryKey: [\"workflow-actions\", doctype, id],\n });\n // Also invalidate the document data\n await queryClient.invalidateQueries({\n queryKey: [doctype, id],\n });\n } finally {\n setIsExecuting(false);\n }\n },\n [doctype, id, queryClient]\n );\n\n return {\n state: data?.state,\n actions: data?.actions ?? [],\n isLoading,\n error: error ?? null,\n executeAction,\n isExecuting,\n refetch,\n };\n}\n","/**\n * WorkflowActions Component\n *\n * Renders action buttons for workflow transitions.\n * Per checklist 2.4: Render buttons like \"Submit\", \"Approve\", \"Reject\"\n */\n\nimport type { CSSProperties } from \"react\";\nimport { useWorkflowActions, type WorkflowAction } from \"../../hooks/useWorkflowActions\";\nimport { StateBadge } from \"./StateBadge\";\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): { bg: string; text: string; hover: string } {\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 {\n state,\n actions,\n isLoading,\n executeAction,\n isExecuting,\n } = 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 <div style={{ color: \"#666\" }}>Loading workflow...</div>;\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 <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n ...style,\n }}\n >\n {/* State Badge */}\n {showState && (\n <StateBadge\n state={state.current_state}\n docstatus={state.docstatus}\n />\n )}\n\n {/* Action Buttons */}\n {allowedActions.map((action) => {\n const colors = getActionColor(action.name);\n \n return (\n <button\n key={action.name}\n onClick={() => handleAction(action)}\n disabled={isExecuting}\n title={action.label}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: isExecuting ? \"not-allowed\" : \"pointer\",\n opacity: isExecuting ? 0.6 : 1,\n backgroundColor: colors.bg,\n color: colors.text,\n transition: \"background-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isExecuting) {\n e.currentTarget.style.backgroundColor = colors.hover;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = colors.bg;\n }}\n >\n {isExecuting ? \"...\" : action.label}\n </button>\n );\n })}\n\n {/* Show message if no actions available */}\n {allowedActions.length === 0 && !isLoading && (\n <span style={{ color: \"#666\", fontSize: \"0.875rem\" }}>\n No actions available\n </span>\n )}\n </div>\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 })\n .__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 = (\n 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(\n `Plugin \"${plugin.name}\" is already registered. Skipping.`,\n );\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 registration: SlotRegistration = {\n slot,\n component,\n ...options,\n };\n\n const existing = registry.slots.get(slot) ?? [];\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(\n slotName: string,\n doctype?: string,\n): 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(\n pageType: string,\n doctype: string,\n): 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({\n name,\n doctype,\n data,\n id,\n children,\n}: 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 (\n <Component\n key={`${name}-${index}`}\n doctype={doctype}\n data={data}\n id={id}\n />\n );\n })}\n </>\n );\n}\n\nexport default Slot;\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\";\n\n/**\n * Command types\n */\nexport type CommandType = \"doctype\" | \"document\" | \"command\";\n\n/**\n * Command item\n */\nexport interface CommandItem {\n /** Unique ID */\n id: string;\n /** Type of command */\n type: CommandType;\n /** Display label */\n label: string;\n /** Secondary text */\n description?: string;\n /** Icon (emoji) */\n icon?: string;\n /** DocType for document items */\n doctype?: string;\n /** Action to execute */\n action?: () => void;\n}\n\n/**\n * CommandPalette props\n */\nexport interface CommandPaletteProps {\n /** Whether palette is open */\n open: boolean;\n /** Close callback */\n onClose: () => void;\n}\n\n/**\n * Built-in commands\n */\nconst BUILTIN_COMMANDS: CommandItem[] = [\n {\n id: \"cmd-dashboard\",\n type: \"command\",\n label: \"Go to Dashboard\",\n icon: \"🏠\",\n description: \"Open the main dashboard\",\n },\n {\n id: \"cmd-settings\",\n type: \"command\",\n label: \"Settings\",\n icon: \"⚙️\",\n description: \"Open settings\",\n },\n {\n id: \"cmd-logout\",\n type: \"command\",\n label: \"Logout\",\n icon: \"🚪\",\n description: \"Sign out of your account\",\n },\n];\n\n/**\n * CommandPalette Component\n */\nexport function CommandPalette({ open, onClose }: CommandPaletteProps) {\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [doctypes, setDoctypes] = useState<CommandItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const go = useGo();\n\n // Fetch DocTypes for navigation\n useEffect(() => {\n async function fetchDoctypes() {\n try {\n const response = await fetch(`${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:\n query.length >= 2\n ? [{ field: \"q\", operator: \"contains\", value: query }]\n : [],\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 =>\n cmd.label.toLowerCase().includes(lowerQuery),\n ),\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 <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.7)\",\n zIndex: 1000,\n }}\n />\n\n {/* Palette */}\n <div\n style={{\n position: \"fixed\",\n top: \"15%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"100%\",\n maxWidth: \"500px\",\n backgroundColor: \"var(--color-bg)\",\n borderRadius: \"8px\",\n boxShadow: \"var(--shadow-md)\",\n border: \"1px solid var(--color-border)\",\n zIndex: 1001,\n overflow: \"hidden\",\n }}\n >\n {/* Search Input */}\n <div\n style={{\n padding: \"0.75rem\",\n borderBottom: \"1px solid var(--color-border)\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Search or type a command...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"none\",\n outline: \"none\",\n fontSize: \"1rem\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n </div>\n\n {/* Results */}\n <div style={{ maxHeight: \"300px\", overflow: \"auto\" }}>\n {filteredItems.length === 0 && query && (\n <div\n style={{\n padding: \"1rem\",\n color: \"var(--color-text-secondary)\",\n textAlign: \"center\",\n }}\n >\n No results found\n </div>\n )}\n\n {filteredItems.map((item, idx) => (\n <div\n key={item.id}\n onClick={() => executeCommand(item)}\n onMouseEnter={() => setSelectedIndex(idx)}\n style={{\n padding: \"0.75rem 1rem\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n backgroundColor:\n selectedIndex === idx\n ? \"var(--color-bg-secondary)\"\n : \"var(--color-bg)\",\n }}\n >\n <span style={{ fontSize: \"1.25rem\" }}>{item.icon}</span>\n <div style={{ flex: 1 }}>\n <div style={{ fontWeight: 500, color: \"var(--color-text)\" }}>\n {item.label}\n </div>\n {item.description && (\n <div\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n <span\n style={{\n fontSize: \"0.65rem\",\n padding: \"0.15rem 0.35rem\",\n backgroundColor: \"var(--color-bg-tertiary)\",\n borderRadius: \"3px\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {item.type}\n </span>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: \"0.5rem 1rem\",\n borderTop: \"1px solid #e0e0e0\",\n display: \"flex\",\n gap: \"1rem\",\n fontSize: \"0.75rem\",\n color: \"#666\",\n }}\n >\n <span>↑↓ Navigate</span>\n <span>↵ Select</span>\n <span>Esc Close</span>\n </div>\n </div>\n </>\n );\n}\n\nexport default CommandPalette;\n","import { useLogout, useMenu } from \"@refinedev/core\";\nimport { NavLink } from \"react-router\";\n\nexport const Menu = () => {\n const { mutate: logout } = useLogout();\n const { menuItems } = useMenu();\n\n return (\n <nav className=\"menu\">\n <ul>\n {menuItems.map((item) => (\n <li key={item.key}>\n <NavLink to={item.route ?? \"/\"}>{item.label}</NavLink>\n </li>\n ))}\n </ul>\n <button onClick={() => logout()}>Logout</button>\n </nav>\n );\n};\n","import { useBreadcrumb } from \"@refinedev/core\";\nimport { Link } from \"react-router\";\n\nexport const Breadcrumb = () => {\n const { breadcrumbs } = useBreadcrumb();\n\n return (\n <ul className=\"breadcrumb\">\n {breadcrumbs.map((breadcrumb) => {\n return (\n <li key={`breadcrumb-${breadcrumb.label}`}>\n {breadcrumb.href ? (\n <Link to={breadcrumb.href}>{breadcrumb.label}</Link>\n ) : (\n <span>{breadcrumb.label}</span>\n )}\n </li>\n );\n })}\n </ul>\n );\n};\n","import type { PropsWithChildren } from \"react\";\nimport { Breadcrumb } from \"../breadcrumb\";\nimport { Menu } from \"../menu\";\n\nexport const Layout: React.FC<PropsWithChildren> = ({ children }) => {\n return (\n <div className=\"layout\">\n <Menu />\n <div className=\"content\">\n <Breadcrumb />\n <div>{children}</div>\n </div>\n </div>\n );\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 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 fetch(`${META_URL}/${doctype}`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as {\n detail?: string;\n message?: string;\n error?: string;\n };\n\n const backendMessage =\n payload.message || payload.detail || response.statusText;\n\n throw new Error(\n `Failed to fetch metadata for ${doctype}: ${backendMessage}`,\n );\n }\n\n return response.json();\n}\n\n/**\n * Return type for useDocTypeMeta hook\n */\nexport interface UseDocTypeMetaResult {\n /** JSON Schema for the DocType */\n schema: DocTypeSchema | undefined;\n /** Layout configuration for form rendering */\n layout: LayoutConfig | undefined;\n /** Permissions for current user */\n permissions: DocTypePermissions | undefined;\n /** Workflow configuration if applicable */\n workflow: WorkflowConfig | undefined;\n /** Full metadata object */\n meta: DocTypeMeta | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch and cache DocType metadata\n *\n * @param doctype - Name of the DocType to fetch metadata for\n * @returns Metadata including schema, layout, permissions, and workflow\n *\n * @example\n * ```tsx\n * const { schema, layout, permissions, workflow } = useDocTypeMeta(\"Todo\");\n *\n * if (isLoading) return <Spinner />;\n * if (!permissions?.read) return <AccessDenied />;\n *\n * return <AutoForm schema={schema} layout={layout} />;\n * ```\n */\nexport function useDocTypeMeta(doctype: string): UseDocTypeMetaResult {\n const {\n data: meta,\n isLoading,\n error,\n refetch,\n } = useQuery<DocTypeMeta, Error>({\n queryKey: [\"doctype-meta\", doctype],\n queryFn: () => fetchDocTypeMeta(doctype),\n // Cache metadata aggressively - it rarely changes\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)\n // Only fetch when doctype is provided\n enabled: Boolean(doctype),\n });\n\n return {\n schema: meta?.schema,\n layout: meta?.layout,\n permissions: meta?.permissions,\n workflow: meta?.workflow,\n meta,\n isLoading,\n error: error ?? null,\n refetch,\n };\n}\n\n/**\n * Hook to prefetch DocType metadata\n *\n * Useful for preloading metadata before navigation\n */\nexport function usePrefetchDocTypeMeta() {\n // Using a dummy query to access the query system\n useQuery({\n queryKey: [\"prefetch-helper\"],\n queryFn: () => null,\n enabled: false,\n });\n\n return {\n prefetch: (doctype: string) => {\n // Access queryClient from context would be better,\n // but this works for simple prefetching\n fetchDocTypeMeta(doctype).catch(() => {\n // Silently fail prefetch\n });\n },\n };\n}\n","/**\n * useDocTypes Hook\n *\n * Fetches DocTypes from the backend API and converts them to Refine resources.\n * Used to dynamically populate the sidebar with available DocTypes.\n */\n\nimport { useState, useEffect } from \"react\";\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 api_resource: boolean;\n show_in_desk: boolean; // Whether to show in Desk UI\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 };\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 useDocTypes(): UseDocTypesResult {\n const [doctypes, setDocTypes] = useState<DocTypeMeta[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchDocTypes = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(\"/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 // Convert DocTypes to Refine resources\n const resources: RefineResource[] = doctypes\n .filter(dt => dt.api_resource && dt.show_in_desk) // Only visible DocTypes with CRUD APIs\n .map(dt => ({\n name: dt.name,\n list: `/app/${dt.name}/list`,\n create: `/app/${dt.name}/new`,\n edit: `/app/${dt.name}/edit/:id`,\n show: `/app/${dt.name}/detail/:id`,\n meta: {\n label: dt.label,\n canDelete: true,\n },\n }));\n\n return {\n doctypes,\n resources,\n isLoading,\n error,\n refetch: fetchDocTypes,\n };\n}\n\nexport default useDocTypes;\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(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 }, [editingCell, resource, updateMutation, onSaveSuccess, onError]);\n\n const isEditing = useCallback((rowId: string, field: string) => {\n return editingCell?.rowId === rowId && editingCell?.field === field;\n }, [editingCell]);\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(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 }, [resource, selectedIds, updateMutation, deselectAll, onSuccess, onError]);\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((fields: string[]) => {\n const header = fields.join(\",\");\n const rows = selectedItems.map((item) =>\n fields.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 }).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 }, [resource, selectedItems]);\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 * 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\";\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 columns?: 1 | 2 | 3;\n}\n\n/** A tab containing multiple form sections. */\nexport interface FormTab {\n label: string;\n sections: FormSection[];\n}\n\n/** Form view configuration: tabs and/or flat sections. */\nexport interface FormMeta {\n tabs?: FormTab[];\n sections?: FormSection[];\n}\n\n/** A single column in the list view. */\nexport interface ListColumn {\n field: string;\n label?: string;\n width?: number | string;\n sortable?: boolean;\n visible?: boolean;\n}\n\n/** List view configuration: columns, default sort, row styling. */\nexport interface ListMeta {\n columns: ListColumn[];\n defaultSort?: { field: string; direction: \"asc\" | \"desc\" };\n /** JMESPath expression for row color (e.g. \"status == 'Overdue'\") */\n rowColorExpr?: string;\n rowColorValue?: string;\n}\n\n/** Kanban column definition. */\nexport interface KanbanConfig {\n groupByField: string;\n cardTitleField: string;\n cardSubtitleField?: string;\n swimlaneField?: string;\n}\n\n/** Tree view definition. */\nexport interface TreeConfig {\n parentField: string;\n labelField: string;\n orderField?: string;\n}\n\n/** Calendar view definition. */\nexport interface CalendarConfig {\n startField: string;\n endField?: string;\n titleField: string;\n colorField?: string;\n}\n\n/** Additional (non-standard) views registered by plugins. */\nexport interface AdditionalViews {\n kanban?: KanbanConfig;\n tree?: TreeConfig;\n calendar?: CalendarConfig;\n /** Custom plugin-registered view namespaces (e.g. WMSMeta, MobileMeta) */\n [key: string]: unknown;\n}\n\n/**\n * Unified UI Metadata structure.\n *\n * A single object that all frontend views read from, replacing FormMeta/ListMeta.\n * The `/api/meta/:doctype` endpoint returns this as `ui_meta`.\n */\nexport interface UIMeta {\n doctype: string;\n form?: FormMeta;\n list?: ListMeta;\n additional_views?: AdditionalViews;\n}\n\nexport interface UseUIMetaResult {\n uiMeta: UIMeta | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** In-memory cache to avoid duplicate network requests. */\nconst uiMetaCache = new Map<string, UIMeta>();\n\nfunction 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/**\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>(\n () => uiMetaCache.get(cacheKey) ?? null,\n );\n const [isLoading, setIsLoading] = useState(!uiMetaCache.has(cacheKey));\n const [error, setError] = useState<string | null>(null);\n\n const fetchMeta = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (uiContext?.trim()) {\n params.set(\"ui_context\", uiContext.trim().toLowerCase());\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 fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch meta for ${doctype}: ${response.status}`,\n );\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 * 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","/**\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 { useList, useUpdate } from \"@refinedev/core\";\nimport type { ViewProps, KanbanConfig, KanbanColumn } from \"./types\";\n\nexport interface KanbanViewProps extends ViewProps {\n config: KanbanConfig;\n}\n\n/** Dragged item state */\ninterface DragState {\n item: KanbanItem;\n sourceColumn: string;\n}\n\ninterface KanbanItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/** Quick Edit modal — inline edit of a Kanban card */\nfunction QuickEditModal({\n item,\n resource,\n titleField,\n descField,\n groupField,\n columns,\n onClose,\n onSaved,\n}: {\n item: KanbanItem;\n resource: string;\n titleField: string;\n descField?: string;\n groupField: string;\n columns: KanbanColumn[];\n onClose: () => void;\n onSaved: () => void;\n}) {\n const [title, setTitle] = useState(String(item[titleField] ?? item.name));\n const [desc, setDesc] = useState(\n descField ? String(item[descField] ?? \"\") : \"\",\n );\n const [status, setStatus] = useState(\n String(item[groupField] ?? columns[0]?.id ?? \"\"),\n );\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 // Close on Escape\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose],\n );\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Edit ${String(item[titleField] ?? item.name)}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.45)\",\n }}\n onClick={onClose}\n onKeyDown={handleKeyDown}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: \"var(--color-bg)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"var(--radius-lg)\",\n padding: \"var(--spacing-lg)\",\n width: 420,\n maxWidth: \"90vw\",\n boxShadow: \"var(--shadow-lg)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"var(--spacing-md)\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: \"1rem\", fontWeight: 600 }}>\n Quick Edit\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"btn btn-ghost\"\n style={{ padding: \"0.25rem 0.5rem\", minHeight: \"unset\" }}\n >\n ✕\n </button>\n </div>\n\n {/* Title field */}\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {titleField}\n </label>\n <input\n value={title}\n onChange={e => setTitle(e.target.value)}\n style={{ width: \"100%\", marginBottom: \"var(--spacing-sm)\" }}\n autoFocus\n />\n\n {/* Status/Group field */}\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {groupField}\n </label>\n <select\n value={status}\n onChange={e => setStatus(e.target.value)}\n style={{ width: \"100%\", marginBottom: \"var(--spacing-sm)\" }}\n >\n {columns.map(col => (\n <option key={col.id} value={col.id}>\n {col.title}\n </option>\n ))}\n </select>\n\n {/* Description field (if configured) */}\n {descField && (\n <>\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {descField}\n </label>\n <textarea\n value={desc}\n onChange={e => setDesc(e.target.value)}\n rows={3}\n style={{\n width: \"100%\",\n marginBottom: \"var(--spacing-md)\",\n resize: \"vertical\",\n }}\n />\n </>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"var(--spacing-sm)\",\n justifyContent: \"flex-end\",\n }}\n >\n <button className=\"btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n className={`btn btn-primary${saving ? \" btn-loading\" : \"\"}`}\n onClick={handleSave}\n disabled={saving}\n >\n {saving ? \"\" : \"Save\"}\n </button>\n </div>\n </div>\n </div>\n );\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({ resource, config }: KanbanViewProps) {\n const groupField = config.groupField ?? \"status\";\n const titleField = config.titleField ?? \"name\";\n const descField = config.descriptionField;\n\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const [editingItem, setEditingItem] = useState<KanbanItem | null>(null);\n\n // Fetch all items (up to 200 for Kanban)\n const { result, query } = useList<KanbanItem>({\n resource,\n pagination: { pageSize: 200 },\n });\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n\n const { mutate: updateItem } = useUpdate();\n\n // Auto-discover columns from data if none configured\n const columns: KanbanColumn[] = useMemo(() => {\n if (config.columns && config.columns.length > 0) return config.columns;\n // Discover unique values from data\n const seen = new Set<string>();\n const discovered: KanbanColumn[] = [];\n const COLUMN_COLORS = [\n \"#e0e0e0\",\n \"#faad14\",\n \"#52c41a\",\n \"#ff4d4f\",\n \"#1890ff\",\n \"#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 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 }, [config.columns, items, groupField]);\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 <div\n style={{\n padding: \"var(--spacing-xl)\",\n textAlign: \"center\",\n color: \"var(--color-text-muted)\",\n }}\n >\n <div\n className=\"skeleton skeleton-heading\"\n style={{ margin: \"0 auto 1rem\", width: 200 }}\n />\n <div style={{ display: \"flex\", gap: \"1rem\", padding: \"1rem\" }}>\n {[1, 2, 3].map(i => (\n <div\n key={i}\n style={{\n flex: \"0 0 280px\",\n background: \"var(--color-bg-tertiary)\",\n borderRadius: \"var(--radius-lg)\",\n padding: \"1rem\",\n }}\n >\n <div\n className=\"skeleton skeleton-heading\"\n style={{ marginBottom: \"0.5rem\" }}\n />\n {[1, 2].map(j => (\n <div\n key={j}\n className=\"skeleton\"\n style={{\n height: 72,\n marginBottom: \"0.5rem\",\n borderRadius: \"var(--radius-md)\",\n }}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\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 <div\n role=\"region\"\n aria-label=\"Kanban board\"\n style={{\n display: \"flex\",\n gap: \"var(--spacing-md)\",\n padding: \"var(--spacing-md)\",\n overflowX: \"auto\",\n minHeight: 400,\n alignItems: \"flex-start\",\n }}\n >\n {columns.map(column => {\n const isOver = dragOverColumn === column.id;\n return (\n <div\n key={column.id}\n role=\"group\"\n aria-label={`${column.title} column`}\n onDragOver={e => {\n e.preventDefault();\n setDragOverColumn(column.id);\n }}\n onDragLeave={() => setDragOverColumn(null)}\n onDrop={() => handleDrop(column.id)}\n style={{\n flex: \"0 0 280px\",\n background: isOver\n ? \"var(--color-bg-tertiary)\"\n : \"var(--color-bg-secondary)\",\n borderRadius: \"var(--radius-lg)\",\n border: `2px solid ${isOver ? \"var(--color-primary)\" : \"transparent\"}`,\n display: \"flex\",\n flexDirection: \"column\",\n transition: \"border-color 0.15s ease, background 0.15s ease\",\n }}\n >\n {/* Column Header */}\n <div\n style={{\n padding: \"0.75rem 1rem\",\n borderBottom: `3px solid ${column.color ?? \"var(--color-primary)\"}`,\n fontWeight: 600,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n borderRadius: \"var(--radius-lg) var(--radius-lg) 0 0\",\n }}\n >\n <span style={{ color: \"var(--color-text)\" }}>\n {column.title}\n </span>\n <span\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-muted)\",\n background: \"var(--color-bg-tertiary)\",\n borderRadius: \"var(--radius-full, 9999px)\",\n padding: \"0.1rem 0.5rem\",\n fontWeight: 500,\n }}\n >\n {groupedItems[column.id]?.length ?? 0}\n </span>\n </div>\n\n {/* Cards */}\n <div\n style={{\n flex: 1,\n padding: \"var(--spacing-sm)\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--spacing-sm)\",\n minHeight: 80,\n }}\n >\n {groupedItems[column.id]?.map(item => {\n const isDragging = dragState?.item.id === item.id;\n return (\n <div\n key={item.id}\n draggable\n role=\"button\"\n tabIndex={0}\n aria-label={`${String(item[titleField] ?? item.name)} — drag to reorder, press Enter to edit`}\n onDragStart={() =>\n setDragState({ item, sourceColumn: column.id })\n }\n onDragEnd={() => setDragState(null)}\n onClick={() => setEditingItem(item)}\n onKeyDown={e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setEditingItem(item);\n }\n }}\n style={{\n padding: \"0.75rem\",\n background: \"var(--color-bg)\",\n borderRadius: \"var(--radius-md)\",\n boxShadow: \"var(--shadow-sm)\",\n cursor: \"grab\",\n opacity: isDragging ? 0.4 : 1,\n transform: isDragging ? \"scale(0.98)\" : undefined,\n transition:\n \"opacity 0.15s, box-shadow 0.15s, transform 0.15s\",\n border: \"1px solid var(--color-border)\",\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLDivElement).style.boxShadow =\n \"var(--shadow-md)\";\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLDivElement).style.boxShadow =\n \"var(--shadow-sm)\";\n }}\n >\n <div\n style={{\n fontWeight: 500,\n color: \"var(--color-text)\",\n fontSize: \"0.875rem\",\n marginBottom: descField ? \"0.25rem\" : 0,\n }}\n >\n {String(item[titleField] ?? item.name)}\n </div>\n {descField &&\n item[descField] !== undefined &&\n item[descField] !== null && (\n <div\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-muted)\",\n lineHeight: 1.4,\n }}\n >\n {String(item[descField]).slice(0, 80)}\n {String(item[descField]).length > 80 ? \"…\" : \"\"}\n </div>\n )}\n <div\n style={{\n marginTop: \"0.5rem\",\n fontSize: \"0.7rem\",\n color: \"var(--color-text-muted)\",\n textAlign: \"right\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n }}\n className=\"quick-edit-hint\"\n >\n Click to edit\n </div>\n </div>\n );\n })}\n\n {/* Empty column placeholder */}\n {groupedItems[column.id]?.length === 0 && (\n <div\n style={{\n padding: \"var(--spacing-lg)\",\n textAlign: \"center\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n border: \"2px dashed var(--color-border)\",\n borderRadius: \"var(--radius-md)\",\n }}\n >\n Drop here\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n}\n\nexport default KanbanView;\n","/**\n * Calendar View Component\n *\n * Calendar view for date-based DocTypes.\n * Per checklist 5.1: Calendar view.\n */\n\nimport { useState, useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, CalendarConfig } from \"./types\";\n\n/**\n * Calendar view props\n */\nexport interface CalendarViewProps extends ViewProps {\n /** Calendar configuration */\n config: CalendarConfig;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Get days in month\n */\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = [];\n const date = new Date(year, month, 1);\n \n while (date.getMonth() === month) {\n days.push(new Date(date));\n date.setDate(date.getDate() + 1);\n }\n \n return days;\n}\n\n/**\n * CalendarView Component\n */\nexport function CalendarView({ resource, config }: CalendarViewProps) {\n const startField = config.startField;\n const titleField = config.titleField;\n const go = useGo();\n\n // Current month state\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n\n // Fetch events for current month\n const startOfMonth = new Date(year, month, 1).toISOString();\n const endOfMonth = new Date(year, month + 1, 0).toISOString();\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n { field: startField, operator: \"gte\", value: startOfMonth },\n { field: startField, operator: \"lte\", value: endOfMonth },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Get days in current month\n const days = useMemo(() => getDaysInMonth(year, month), [year, month]);\n\n // Group events by day\n const eventsByDay = useMemo(() => {\n const groups: Record<string, CalendarEvent[]> = {};\n \n if (data?.data) {\n for (const event of data.data) {\n const dateStr = String(event[startField] ?? \"\").split(\"T\")[0];\n if (dateStr) {\n if (!groups[dateStr]) groups[dateStr] = [];\n groups[dateStr].push(event);\n }\n }\n }\n \n return groups;\n }, [data, startField]);\n\n // Navigation\n const prevMonth = () => setCurrentDate(new Date(year, month - 1));\n const nextMonth = () => setCurrentDate(new Date(year, month + 1));\n const today = () => setCurrentDate(new Date());\n\n // Format month name\n const monthName = currentDate.toLocaleString(\"default\", { month: \"long\", year: \"numeric\" });\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n // First day of month offset\n const firstDayOffset = new Date(year, month, 1).getDay();\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return <div style={{ padding: \"2rem\" }}>Loading...</div>;\n }\n\n return (\n <div style={{ padding: \"1rem\" }}>\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1rem\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button onClick={prevMonth} style={btnStyle}>← Prev</button>\n <button onClick={today} style={btnStyle}>Today</button>\n <button onClick={nextMonth} style={btnStyle}>Next →</button>\n </div>\n <h2 style={{ margin: 0 }}>{monthName}</h2>\n </div>\n\n {/* Calendar Grid */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n gap: \"1px\",\n backgroundColor: \"#e0e0e0\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Day Headers */}\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n padding: \"0.5rem\",\n backgroundColor: \"#f5f5f5\",\n fontWeight: 600,\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n }}\n >\n {day}\n </div>\n ))}\n\n {/* Empty cells for offset */}\n {Array.from({ length: firstDayOffset }).map((_, i) => (\n <div key={`empty-${i}`} style={{ backgroundColor: \"#fafafa\", minHeight: \"80px\" }} />\n ))}\n\n {/* Days */}\n {days.map((day) => {\n const dateStr = day.toISOString().split(\"T\")[0];\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === new Date().toISOString().split(\"T\")[0];\n\n return (\n <div\n key={dateStr}\n style={{\n backgroundColor: \"white\",\n minHeight: \"80px\",\n padding: \"0.25rem\",\n }}\n >\n <div\n style={{\n fontSize: \"0.75rem\",\n fontWeight: isToday ? 600 : 400,\n color: isToday ? \"#1890ff\" : \"#333\",\n marginBottom: \"0.25rem\",\n }}\n >\n {day.getDate()}\n </div>\n {events.slice(0, 3).map((event) => (\n <div\n key={event.id}\n onClick={() => go({ to: `/app/${resource}/detail/${event.id}` })}\n style={{\n fontSize: \"0.7rem\",\n padding: \"0.125rem 0.25rem\",\n backgroundColor: \"#e6f7ff\",\n borderRadius: \"2px\",\n marginBottom: \"0.125rem\",\n cursor: \"pointer\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {String(event[titleField] ?? event.name)}\n </div>\n ))}\n {events.length > 3 && (\n <div style={{ fontSize: \"0.65rem\", color: \"#666\" }}>\n +{events.length - 3} more\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst btnStyle: React.CSSProperties = {\n padding: \"0.25rem 0.5rem\",\n backgroundColor: \"#f5f5f5\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontSize: \"0.75rem\",\n};\n\nexport default CalendarView;\n","/**\n * Gantt View Component\n *\n * Gantt chart view for project management.\n * Per checklist 5.1: Gantt view.\n */\n\nimport { useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, GanttConfig } from \"./types\";\n\n/**\n * Gantt view props\n */\nexport interface GanttViewProps extends ViewProps {\n /** Gantt configuration */\n config: GanttConfig;\n}\n\n/**\n * Gantt task item\n */\ninterface GanttTask {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Calculate date range for Gantt\n */\nfunction getDateRange(tasks: GanttTask[], startField: string, endField: string) {\n let minDate = new Date();\n let maxDate = new Date();\n\n for (const task of tasks) {\n const start = new Date(String(task[startField] ?? \"\"));\n const end = new Date(String(task[endField] ?? \"\"));\n if (!isNaN(start.getTime()) && start < minDate) minDate = start;\n if (!isNaN(end.getTime()) && end > maxDate) maxDate = end;\n }\n\n // Add padding\n minDate.setDate(minDate.getDate() - 7);\n maxDate.setDate(maxDate.getDate() + 7);\n\n return { minDate, maxDate };\n}\n\n/**\n * Get days between two dates\n */\nfunction getDaysBetween(start: Date, end: Date): number {\n return Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n/**\n * GanttView Component\n */\nexport function GanttView({ resource, config }: GanttViewProps) {\n const nameField = config.nameField ?? \"name\";\n const startField = config.startField;\n const endField = config.endField;\n const progressField = config.progressField;\n const go = useGo();\n\n // Fetch tasks\n const { result: data, query } = useList<GanttTask>({\n resource,\n pagination: { pageSize: 100 },\n sorters: [{ field: startField, order: \"asc\" }],\n });\n\n // Calculate date range and tasks\n const { tasks, minDate, maxDate, totalDays } = useMemo(() => {\n const tasks = data?.data ?? [];\n if (tasks.length === 0) {\n return { tasks: [], minDate: new Date(), maxDate: new Date(), totalDays: 30 };\n }\n\n const { minDate, maxDate } = getDateRange(tasks, startField, endField);\n const totalDays = getDaysBetween(minDate, maxDate);\n\n return { tasks, minDate, maxDate, totalDays };\n }, [data, startField, endField]);\n\n // Generate day headers\n const dayHeaders = useMemo(() => {\n const headers: Date[] = [];\n const current = new Date(minDate);\n while (current <= maxDate) {\n headers.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return headers;\n }, [minDate, maxDate]);\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return <div style={{ padding: \"2rem\" }}>Loading...</div>;\n }\n\n if (tasks.length === 0) {\n return <div style={{ padding: \"2rem\", color: \"#666\" }}>No tasks to display</div>;\n }\n\n const rowHeight = 36;\n const dayWidth = 30;\n\n return (\n <div style={{ padding: \"1rem\", overflowX: \"auto\" }}>\n <div style={{ display: \"flex\", minWidth: totalDays * dayWidth + 200 }}>\n {/* Task Names Column */}\n <div style={{ width: \"200px\", flexShrink: 0, borderRight: \"1px solid #e0e0e0\" }}>\n {/* Header */}\n <div\n style={{\n height: \"40px\",\n padding: \"0.5rem\",\n fontWeight: 600,\n borderBottom: \"1px solid #e0e0e0\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n Task\n </div>\n {/* Task rows */}\n {tasks.map((task) => (\n <div\n key={task.id}\n onClick={() => go({ to: `/app/${resource}/detail/${task.id}` })}\n style={{\n height: `${rowHeight}px`,\n padding: \"0.5rem\",\n borderBottom: \"1px solid #f0f0f0\",\n cursor: \"pointer\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {String(task[nameField] ?? task.name)}\n </div>\n ))}\n </div>\n\n {/* Gantt Chart */}\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {/* Day Headers */}\n <div style={{ display: \"flex\", height: \"40px\", backgroundColor: \"#f5f5f5\" }}>\n {dayHeaders.map((day, i) => (\n <div\n key={i}\n style={{\n width: `${dayWidth}px`,\n flexShrink: 0,\n borderRight: \"1px solid #e0e0e0\",\n borderBottom: \"1px solid #e0e0e0\",\n fontSize: \"0.65rem\",\n textAlign: \"center\",\n padding: \"0.25rem\",\n }}\n >\n {day.getDate()}\n </div>\n ))}\n </div>\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 <div\n key={task.id}\n style={{\n height: `${rowHeight}px`,\n position: \"relative\",\n borderBottom: \"1px solid #f0f0f0\",\n }}\n >\n {/* Background grid */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n }}\n >\n {dayHeaders.map((_, i) => (\n <div\n key={i}\n style={{\n width: `${dayWidth}px`,\n flexShrink: 0,\n borderRight: \"1px solid #f0f0f0\",\n }}\n />\n ))}\n </div>\n\n {/* Task bar */}\n <div\n style={{\n position: \"absolute\",\n left: `${startOffset * dayWidth}px`,\n width: `${Math.max(duration, 1) * dayWidth}px`,\n top: \"4px\",\n height: `${rowHeight - 8}px`,\n backgroundColor: \"#e6f7ff\",\n border: \"1px solid #1890ff\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Progress fill */}\n {progressField && (\n <div\n style={{\n height: \"100%\",\n width: `${progress}%`,\n backgroundColor: \"#1890ff\",\n opacity: 0.3,\n }}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\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 {\n useState,\n useCallback,\n useRef,\n useEffect,\n type KeyboardEvent,\n} from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\ninterface TreeNode {\n id: string;\n label: string;\n data: Record<string, unknown>;\n children: TreeNode[];\n}\n\ninterface TreeState {\n tree: TreeNode[];\n loading: boolean;\n error: string | null;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nconst BASE_URL = import.meta.env?.VITE_BACKEND_URL ?? \"\";\n\nasync function fetchTree(doctype: string): Promise<TreeNode[]> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}`,\n );\n if (!res.ok) throw new Error(`Failed to fetch tree: ${res.status}`);\n const json = (await res.json()) as { tree: TreeNode[] };\n return json.tree;\n}\n\nasync function reparentNode(\n doctype: string,\n nodeId: string,\n newParent: string | null,\n): Promise<void> {\n await updateNode(doctype, nodeId, { parent: newParent });\n}\n\nasync function updateNode(\n doctype: string,\n nodeId: string,\n values: { parent?: string | null; label?: string },\n): Promise<void> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}/${encodeURIComponent(nodeId)}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(values),\n },\n );\n if (!res.ok) throw new Error(`Update failed: ${res.status}`);\n}\n\nasync function addChildNode(\n doctype: string,\n parentId: string | null,\n label: string,\n): Promise<void> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}/add-child`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ parent: parentId, label }),\n },\n );\n if (!res.ok) throw new Error(`Add child failed: ${res.status}`);\n}\n\n// ── Inline Rename Input ────────────────────────────────────────────────────\n\nfunction InlineInput({\n initialValue,\n onConfirm,\n onCancel,\n}: Readonly<{\n initialValue: string;\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}>) {\n const [value, setValue] = useState(initialValue);\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") onConfirm(value.trim() || initialValue);\n if (e.key === \"Escape\") onCancel();\n };\n\n return (\n <input\n ref={ref}\n value={value}\n onChange={e => setValue(e.target.value)}\n onBlur={() => onConfirm(value.trim() || initialValue)}\n onKeyDown={handleKeyDown}\n style={{\n fontSize: \"0.875rem\",\n padding: \"0.125rem 0.375rem\",\n border: \"1px solid var(--color-primary)\",\n borderRadius: \"var(--radius-sm)\",\n background: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n outline: \"none\",\n minWidth: 160,\n }}\n aria-label=\"Rename node\"\n />\n );\n}\n\n// ── Single Tree Node ───────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n doctype,\n onRefresh,\n dragNodeId,\n onDragStart,\n onDrop,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n doctype: string;\n onRefresh: () => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetId: string | null) => void;\n}>) {\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [addingChild, setAddingChild] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n async (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n try {\n await updateNode(doctype, node.id, { label: newLabel });\n onRefresh();\n } catch {\n // Silently revert on error\n }\n },\n [doctype, node.id, node.label, onRefresh],\n );\n\n const handleAddChild = useCallback(\n async (label: string) => {\n setAddingChild(false);\n if (!label.trim()) return;\n try {\n await addChildNode(doctype, node.id, label);\n setCollapsed(false);\n onRefresh();\n } catch {\n // Silently fail — UI remains consistent\n }\n },\n [doctype, node.id, onRefresh],\n );\n\n const hasChildren = node.children.length > 0;\n let toggleGlyph = \"•\";\n if (hasChildren) {\n toggleGlyph = collapsed ? \"▶\" : \"▼\";\n }\n\n return (\n <li\n role=\"treeitem\"\n aria-expanded={hasChildren ? !collapsed : undefined}\n style={{ listStyle: \"none\", margin: 0, padding: 0 }}\n >\n {/* Row */}\n <div\n draggable\n onDragStart={e => {\n e.stopPropagation();\n onDragStart(node.id);\n }}\n onDragEnd={() => setIsDropTarget(false)}\n onDragOver={e => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(true);\n }}\n onDragLeave={() => setIsDropTarget(false)}\n onDrop={e => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(false);\n onDrop(node.id);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n padding: \"0.3rem 0.5rem\",\n paddingLeft: `${0.5 + depth * 1.25}rem`,\n borderRadius: \"var(--radius-md)\",\n cursor: \"grab\",\n opacity: isDragging ? 0.4 : 1,\n background: isDropTarget ? \"rgba(139, 92, 246, 0.1)\" : \"transparent\",\n border: isDropTarget\n ? \"1px dashed var(--color-primary)\"\n : \"1px solid transparent\",\n transition: \"background 0.15s, border-color 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"var(--color-bg-secondary)\";\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 onClick={e => {\n e.stopPropagation();\n setCollapsed(c => !c);\n }}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n width: \"1rem\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n flexShrink: 0,\n minHeight: \"unset\",\n }}\n >\n {toggleGlyph}\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 <span\n onDoubleClick={() => setRenaming(true)}\n title=\"Double-click to rename\"\n style={{\n flex: 1,\n fontSize: \"0.875rem\",\n color: \"var(--color-text)\",\n lineHeight: 1.4,\n }}\n >\n {node.label}\n </span>\n )}\n\n {/* Action buttons — shown on hover via CSS */}\n <div\n className=\"tree-node-actions\"\n style={{\n display: \"flex\",\n gap: \"0.25rem\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation();\n setAddingChild(true);\n setCollapsed(false);\n }}\n title=\"Add child\"\n aria-label={`Add child to ${node.label}`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--color-primary)\",\n fontSize: \"0.8rem\",\n padding: \"0 0.25rem\",\n borderRadius: \"var(--radius-sm)\",\n minHeight: \"unset\",\n }}\n >\n +\n </button>\n <button\n onClick={e => {\n e.stopPropagation();\n setRenaming(true);\n }}\n title=\"Rename\"\n aria-label={`Rename ${node.label}`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n padding: \"0 0.25rem\",\n borderRadius: \"var(--radius-sm)\",\n minHeight: \"unset\",\n }}\n >\n ✎\n </button>\n </div>\n </div>\n\n {/* Inline Add Child input */}\n {addingChild && (\n <div\n style={{\n paddingLeft: `${0.5 + (depth + 1) * 1.25}rem`,\n paddingTop: \"0.25rem\",\n paddingBottom: \"0.25rem\",\n }}\n >\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddChild}\n onCancel={() => setAddingChild(false)}\n />\n </div>\n )}\n\n {/* Children */}\n {!collapsed && hasChildren && (\n <ul role=\"group\" style={{ margin: 0, padding: 0 }}>\n {node.children.map(child => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n doctype={doctype}\n onRefresh={onRefresh}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n />\n ))}\n </ul>\n )}\n </li>\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({ resource }: Readonly<TreeViewProps>) {\n const [state, setState] = useState<TreeState>({\n tree: [],\n loading: true,\n error: null,\n });\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n\n const load = useCallback(async () => {\n setState(s => ({ ...s, loading: true, error: null }));\n try {\n const tree = await fetchTree(resource);\n setState({ tree, loading: false, error: null });\n } catch (err) {\n setState({\n tree: [],\n loading: false,\n error: err instanceof Error ? err.message : \"Failed to load tree\",\n });\n }\n }, [resource]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleDrop = useCallback(\n async (targetId: string | null) => {\n if (!dragNodeId || dragNodeId === targetId) {\n setDragNodeId(null);\n return;\n }\n try {\n await reparentNode(resource, dragNodeId, targetId);\n void load();\n } catch {\n /* silent */\n }\n setDragNodeId(null);\n },\n [dragNodeId, resource, load],\n );\n\n const handleAddRoot = useCallback(\n async (label: string) => {\n setAddingRoot(false);\n if (!label.trim()) return;\n try {\n await addChildNode(resource, null, label);\n void load();\n } catch {\n /* silent */\n }\n },\n [resource, load],\n );\n\n if (state.loading) {\n return (\n <div style={{ padding: \"var(--spacing-lg)\" }}>\n {[1, 2, 3, 4].map(i => (\n <div\n key={i}\n className=\"skeleton skeleton-text\"\n style={{ width: `${60 + i * 10}%`, marginBottom: \"0.5rem\" }}\n />\n ))}\n </div>\n );\n }\n\n if (state.error) {\n return (\n <div\n style={{\n padding: \"var(--spacing-xl)\",\n textAlign: \"center\",\n color: \"var(--color-error)\",\n }}\n >\n {state.error}\n <br />\n <button className=\"btn btn-ghost\" onClick={() => void load()}>\n Retry\n </button>\n </div>\n );\n }\n\n return (\n <div style={{ padding: \"var(--spacing-md)\" }}>\n {/* Toolbar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"var(--spacing-sm)\",\n marginBottom: \"var(--spacing-sm)\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n fontSize: \"0.875rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {resource}\n </span>\n <button\n className=\"btn\"\n onClick={() => setAddingRoot(true)}\n style={{ fontSize: \"0.75rem\", padding: \"0.25rem 0.75rem\" }}\n >\n + Add Root Node\n </button>\n <button\n className=\"btn btn-ghost\"\n onClick={() => void load()}\n style={{ fontSize: \"0.75rem\", padding: \"0.25rem 0.5rem\" }}\n aria-label=\"Refresh tree\"\n >\n ↺\n </button>\n </div>\n\n {/* Inline add root node */}\n {addingRoot && (\n <div style={{ marginBottom: \"var(--spacing-sm)\" }}>\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddRoot}\n onCancel={() => setAddingRoot(false)}\n />\n </div>\n )}\n\n {/* Drop zone for reparenting to root */}\n {dragNodeId && (\n <div\n onDragOver={e => e.preventDefault()}\n onDrop={() => {\n handleDrop(null).catch(() => undefined);\n }}\n style={{\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"2px dashed var(--color-primary)\",\n borderRadius: \"var(--radius-md)\",\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n color: \"var(--color-primary)\",\n }}\n >\n Drop here to make root-level\n </div>\n )}\n\n {/* Tree */}\n {state.tree.length === 0 ? (\n <div className=\"table-empty-state\">\n <span\n className=\"icon\"\n style={{ fontSize: \"2rem\", marginBottom: \"0.5rem\" }}\n >\n 🌳\n </span>\n <div>No items yet. Click \"+ Add Root Node\" to get started.</div>\n </div>\n ) : (\n <ul\n role=\"tree\"\n aria-label={`${resource} tree`}\n style={{ margin: 0, padding: 0 }}\n >\n {state.tree.map(node => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n doctype={resource}\n onRefresh={() => void load()}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={targetId => void handleDrop(targetId)}\n />\n ))}\n </ul>\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 </div>\n );\n}\n\nexport default TreeView;\n","/**\n * Configuration Registry\n *\n * Stores and retrieves Level 1 customization configs.\n * No build step required - configs loaded at runtime.\n */\n\nimport type {\n DocTypeConfig,\n FormConfig,\n ListConfig,\n FieldConfig,\n ClientScript,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown })\n .__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 = (\n 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 configLogger = {\n debug(message: string): void {\n if (isDebugEnabled()) {\n console.debug(`[ConfigRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[ConfigRegistry] ${message}`, error);\n },\n};\n\n/**\n * Configuration store\n */\nconst configStore: Map<string, DocTypeConfig> = new Map();\nconst clientScripts: Map<string, ClientScript[]> = new Map();\n\n/**\n * Register a DocType configuration\n *\n * @param config - DocType configuration\n *\n * @example\n * ```typescript\n * registerConfig({\n * doctype: \"Depot\",\n * form: {\n * fields: {\n * capacity: { label: \"Max Capacity (MT)\" },\n * internal_code: { hidden: true }\n * },\n * sections: [\n * { title: \"Location\", fields: [\"location\", \"region\"] }\n * ]\n * },\n * list: {\n * columns: [\"name\", \"location\", \"capacity\"],\n * defaultSort: { field: \"capacity\", order: \"desc\" }\n * }\n * });\n * ```\n */\nexport function registerConfig(config: DocTypeConfig): void {\n const existing = configStore.get(config.doctype);\n\n if (existing) {\n // Merge configs (deep merge for nested objects)\n configStore.set(config.doctype, mergeConfigs(existing, config));\n } else {\n configStore.set(config.doctype, config);\n }\n}\n\n/**\n * Merge two configs (later config wins for conflicts)\n */\nfunction mergeConfigs(\n base: DocTypeConfig,\n override: DocTypeConfig,\n): DocTypeConfig {\n return {\n doctype: override.doctype,\n form: mergeFormConfigs(base.form, override.form),\n list: mergeListConfigs(base.list, override.list),\n };\n}\n\nfunction mergeFormConfigs(\n base?: FormConfig,\n override?: FormConfig,\n): FormConfig | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n\n return {\n ...base,\n ...override,\n fields: {\n ...base.fields,\n ...override.fields,\n },\n sections: override.sections ?? base.sections,\n };\n}\n\nfunction mergeListConfigs(\n base?: ListConfig,\n override?: ListConfig,\n): ListConfig | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n\n return {\n ...base,\n ...override,\n };\n}\n\n/**\n * Get configuration for a DocType\n */\nexport function getConfig(doctype: string): DocTypeConfig | undefined {\n return configStore.get(doctype);\n}\n\n/**\n * Get form configuration for a DocType\n */\nexport function getFormConfig(doctype: string): FormConfig | undefined {\n return configStore.get(doctype)?.form;\n}\n\n/**\n * Get list configuration for a DocType\n */\nexport function getListConfig(doctype: string): ListConfig | undefined {\n return configStore.get(doctype)?.list;\n}\n\n/**\n * Get field configuration override\n */\nexport function getFieldConfig(\n doctype: string,\n fieldName: string,\n): FieldConfig | undefined {\n return configStore.get(doctype)?.form?.fields?.[fieldName];\n}\n\n/**\n * Register a client script\n *\n * @param script - Client script definition\n *\n * @example\n * ```typescript\n * registerClientScript({\n * doctype: \"Sales Invoice\",\n * event: \"onLoad\",\n * handler: (ctx) => {\n * if (ctx.doc.status === \"Draft\") {\n * ctx.setHidden(\"cancel_reason\", true);\n * }\n * }\n * });\n * ```\n */\nexport function registerClientScript(script: ClientScript): void {\n const key = `${script.doctype}:${script.event}`;\n const existing = clientScripts.get(key) ?? [];\n existing.push(script);\n clientScripts.set(key, existing);\n}\n\n/**\n * Get client scripts for a DocType and event\n */\nexport function getClientScripts(\n doctype: string,\n event: ClientScript[\"event\"],\n): ClientScript[] {\n const key = `${doctype}:${event}`;\n return clientScripts.get(key) ?? [];\n}\n\n/**\n * Load configuration from URL (fetches JSON)\n */\nexport async function loadConfigFromUrl(url: string): Promise<void> {\n try {\n configLogger.debug(`Loading config from ${url}`);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load config: ${response.statusText}`);\n }\n const config: DocTypeConfig = await response.json();\n registerConfig(config);\n } catch (error) {\n configLogger.error(`Failed to load config from ${url}`, error);\n }\n}\n\n/**\n * Clear all configurations (for testing)\n */\nexport function clearConfigs(): void {\n configStore.clear();\n clientScripts.clear();\n}\n","/**\n * useConfig Hook\n *\n * Hook for accessing DocType configuration in components.\n */\n\nimport { useMemo } from \"react\";\nimport {\n getConfig,\n getFormConfig,\n getListConfig,\n getFieldConfig,\n} from \"./registry\";\nimport type { DocTypeConfig, FormConfig, ListConfig, FieldConfig } from \"./types\";\n\n/**\n * Hook to get complete DocType configuration\n */\nexport function useConfig(doctype: string): DocTypeConfig | undefined {\n return useMemo(() => getConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get form configuration\n */\nexport function useFormConfig(doctype: string): FormConfig | undefined {\n return useMemo(() => getFormConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get list configuration\n */\nexport function useListConfig(doctype: string): ListConfig | undefined {\n return useMemo(() => getListConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get field configuration override\n */\nexport function useFieldConfig(\n doctype: string,\n fieldName: string\n): FieldConfig | undefined {\n return useMemo(\n () => getFieldConfig(doctype, fieldName),\n [doctype, fieldName]\n );\n}\n","/**\n * Workspace Sidebar Section Component\n *\n * Renders a workspace in the sidebar.\n * Per checklist 6.4: Desk Workspace Configuration.\n */\n\nimport { useState } from \"react\";\nimport { useGo } from \"@refinedev/core\";\nimport type { DeskWorkspace, WorkspaceItem } from \"./types\";\n\n/**\n * WorkspaceSection props\n */\nexport interface WorkspaceSectionProps {\n /** Workspace to render */\n workspace: DeskWorkspace;\n /** Whether collapsed */\n collapsed?: boolean;\n}\n\n/**\n * WorkspaceSection Component\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 // Charts are not clickable, they're rendered as widgets\n };\n\n return (\n <div style={{ marginBottom: \"0.5rem\" }}>\n {/* Workspace Header */}\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: collapsed ? \"0.5rem\" : \"0.5rem 1rem\",\n background: \"none\",\n border: \"none\",\n color: \"rgba(255,255,255,0.7)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n fontSize: \"0.875rem\",\n }}\n >\n <span>{workspace.icon}</span>\n {!collapsed && (\n <>\n <span style={{ flex: 1 }}>{workspace.label}</span>\n <span style={{ fontSize: \"0.65rem\" }}>\n {isExpanded ? \"▼\" : \"▶\"}\n </span>\n </>\n )}\n </button>\n\n {/* Workspace Items */}\n {isExpanded && !collapsed && (\n <div style={{ paddingLeft: \"1rem\" }}>\n {workspace.items\n .filter((item) => item.type !== \"chart\")\n .map((item, idx) => (\n <button\n key={`${item.type}-${idx}`}\n onClick={() => handleItemClick(item)}\n style={{\n width: \"100%\",\n padding: \"0.375rem 0.75rem\",\n background: \"none\",\n border: \"none\",\n color: \"rgba(255,255,255,0.6)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontSize: \"0.8rem\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n }}\n >\n {\"icon\" in item && item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n {item.type === \"link\" && item.newTab && (\n <span style={{ fontSize: \"0.6rem\", opacity: 0.5 }}>↗</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default WorkspaceSection;\n","/**\n * ListView Page Component\n *\n * Generic list view for any DocType.\n * Per checklist 3.1: Route /app/{doctype}/list\n *\n * Features:\n * - Fetches metadata for column generation\n * - Renders AutoTable\n * - New button\n * - Search and filters\n * - Bulk actions\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useParams, useNavigate, useLocation } from \"react-router\";\nimport { useDeleteMany, useGetIdentity, useInvalidate } from \"@refinedev/core\";\nimport { useDocTypeMeta, useUIMeta } from \"../hooks\";\nimport { AutoTable } from \"../components/table\";\nimport { ConfirmDialog } from \"../components/feedback\";\nimport { Slot } from \"../plugins\";\nimport { KanbanView, TreeView } from \"../views\";\n\n/**\n * ListView props\n */\nexport interface ListViewProps {\n /** DocType name (overrides route param) */\n doctype?: string;\n /** View override used by explicit routes (/kanban, /tree) */\n view?: \"list\" | \"kanban\" | \"tree\";\n}\n\ntype ViewMode = \"list\" | \"kanban\" | \"tree\";\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n anyOf?: Array<Record<string, unknown>>;\n allOf?: Array<Record<string, unknown>>;\n oneOf?: Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\nfunction toSchemaFields(schema: unknown): Record<string, SchemaField> {\n if (!schema || typeof schema !== \"object\") return {};\n const properties = (schema as { properties?: unknown }).properties;\n if (!properties || typeof properties !== \"object\") return {};\n return properties as Record<string, SchemaField>;\n}\n\nfunction getStringEnums(field: SchemaField | undefined): string[] {\n if (!field?.enum || !Array.isArray(field.enum)) return [];\n return field.enum.filter((v): v is string => typeof v === \"string\");\n}\n\nfunction isSelectOrLinkField(field: SchemaField | undefined): boolean {\n if (!field) return false;\n if (Array.isArray(field.enum) && field.enum.length > 0) return true;\n\n const format = String(field.format ?? \"\").toLowerCase();\n if (format.includes(\"link\") || format.includes(\"reference\")) return true;\n\n const rawFieldType = field[\"x-fieldtype\"];\n const fieldType =\n typeof rawFieldType === \"string\" ? rawFieldType.toLowerCase() : \"\";\n if (fieldType === \"link\" || fieldType === \"select\") return true;\n\n const ref = String(field.$ref ?? \"\").toLowerCase();\n if (ref.includes(\"link\") || ref.includes(\"doctype\")) return true;\n\n return false;\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\n/**\n * ListView Component\n *\n * Renders a list view for any DocType with search, filters, and bulk actions.\n *\n * @example\n * ```tsx\n * // In routes\n * <Route path=\"/app/:doctype/list\" element={<ListView />} />\n *\n * // Or with explicit doctype\n * <ListView doctype=\"Task\" />\n * ```\n */\nexport function ListView({\n doctype: propDoctype,\n view: propView,\n}: Readonly<ListViewProps>) {\n const params = useParams<{ doctype: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const { data: identity } = useGetIdentity<{ id?: string }>();\n\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const isAuthenticated =\n Boolean(identity?.id) &&\n String(identity?.id ?? \"\").toLowerCase() !== \"guest\";\n\n // Fetch metadata\n const {\n schema,\n isLoading: metaLoading,\n error: metaError,\n } = useDocTypeMeta(doctype);\n const { uiMeta } = useUIMeta(doctype);\n\n // Search state\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [uiError, setUiError] = useState<string | null>(null);\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Selected rows for bulk actions\n const [selectedRows, setSelectedRows] = useState<Record<string, unknown>[]>(\n [],\n );\n\n const schemaFields = useMemo(() => toSchemaFields(schema), [schema]);\n\n const pathView = useMemo<ViewMode | undefined>(() => {\n if (location.pathname.endsWith(\"/kanban\")) return \"kanban\";\n if (location.pathname.endsWith(\"/tree\")) return \"tree\";\n if (location.pathname.endsWith(\"/list\")) return \"list\";\n return undefined;\n }, [location.pathname]);\n\n const detectedParentField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as\n | { parentField?: string }\n | undefined;\n if (fromMeta?.parentField) return fromMeta.parentField;\n\n if (schemaFields.parent_doctype) return \"parent_doctype\";\n if (schemaFields.parent) return \"parent\";\n\n const parentLike = Object.keys(schemaFields).find(\n key => key.startsWith(\"parent_\") || key.endsWith(\"_parent\"),\n );\n return parentLike;\n }, [uiMeta, schemaFields]);\n\n const detectedLabelField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as\n | { labelField?: string }\n | 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 groupFieldCandidates = useMemo(() => {\n return Object.entries(schemaFields)\n .filter(([, field]) => isSelectOrLinkField(field))\n .map(([name]) => name);\n }, [schemaFields]);\n\n const metaKanban = uiMeta?.additional_views?.kanban as\n | {\n groupByField?: string;\n cardTitleField?: string;\n cardSubtitleField?: string;\n }\n | undefined;\n\n const kanbanGroupField = useMemo(() => {\n const preferred = pickFirst(\n metaKanban?.groupByField,\n schemaFields.status ? \"status\" : undefined,\n schemaFields.workflow_state ? \"workflow_state\" : undefined,\n groupFieldCandidates[0],\n );\n return preferred;\n }, [metaKanban, schemaFields, groupFieldCandidates]);\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:\n 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 canKanban = Boolean(kanbanGroupField);\n const canTree = Boolean(detectedParentField);\n\n const activeView: ViewMode = useMemo(() => {\n const requested = propView ?? pathView ?? \"list\";\n if (requested === \"kanban\" && !canKanban) return \"list\";\n if (requested === \"tree\" && !canTree) return \"list\";\n return requested;\n }, [propView, pathView, canKanban, canTree]);\n\n const setActiveView = useCallback(\n (view: ViewMode) => {\n const target = view === \"list\" ? \"list\" : view;\n navigate(`/app/${doctype}/${target}`);\n },\n [navigate, doctype],\n );\n\n // Handle row click - navigate to detail view\n const handleRowClick = useCallback(\n (row: Record<string, unknown>) => {\n // Prefer id (UUID) as backend routes expect UUID, not name\n const id = row.id ?? row.name;\n if (\n typeof id === \"string\" ||\n typeof id === \"number\" ||\n typeof id === \"bigint\"\n ) {\n navigate(`/app/${doctype}/detail/${id}`);\n }\n },\n [navigate, doctype],\n );\n\n // Handle \"New\" button\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 // Delete mutation for bulk delete\n const deleteMutation = useDeleteMany();\n const invalidate = useInvalidate();\n\n // Handle bulk delete\n const handleBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) return;\n\n setIsDeleteConfirmOpen(true);\n }, [selectedRows]);\n\n const confirmBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) {\n setIsDeleteConfirmOpen(false);\n return;\n }\n\n // Extract IDs (prefer UUID 'id' field)\n const ids = selectedRows.map(row => String(row.id ?? row.name));\n\n deleteMutation.mutate(\n { resource: doctype, ids },\n {\n onSuccess: () => {\n setUiError(null);\n setSelectedRows([]);\n setIsDeleteConfirmOpen(false);\n // Invalidate list to refresh data\n invalidate({ resource: doctype, invalidates: [\"list\"] });\n },\n onError: err => {\n setUiError(err.message || \"Delete failed.\");\n setIsDeleteConfirmOpen(false);\n },\n },\n );\n }, [selectedRows, doctype, deleteMutation, invalidate]);\n\n // Format title\n const title = useMemo(() => {\n return doctype.replaceAll(\"_\", \" \");\n }, [doctype]);\n\n // Loading state\n if (metaLoading) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-text-secondary)\" }}>\n Loading {doctype}...\n </div>\n </div>\n );\n }\n\n // Error state\n if (metaError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-error)\" }}>\n Error loading {doctype}: {metaError.message}\n </div>\n </div>\n );\n }\n\n return (\n <div\n style={{\n padding: \"1.5rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1.5rem\",\n }}\n >\n <h1\n style={{ margin: 0, fontSize: \"1.5rem\", color: \"var(--color-text)\" }}\n >\n {title}\n </h1>\n\n <div style={{ display: \"flex\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <div\n role=\"tablist\"\n aria-label=\"View switcher\"\n style={{ display: \"flex\", gap: \"0.25rem\", marginRight: \"0.5rem\" }}\n >\n {(\n [\n { key: \"list\", label: \"List\", enabled: true },\n { key: \"kanban\", label: \"Kanban\", enabled: canKanban },\n { key: \"tree\", label: \"Tree\", enabled: canTree },\n ] as const\n ).map(view => (\n <button\n key={view.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeView === view.key}\n disabled={!view.enabled}\n onClick={() => setActiveView(view.key)}\n style={{\n padding: \"0.45rem 0.7rem\",\n borderRadius: \"999px\",\n border: \"1px solid var(--color-border)\",\n background:\n activeView === view.key\n ? \"var(--color-primary)\"\n : \"var(--color-bg-secondary)\",\n color:\n activeView === view.key ? \"white\" : \"var(--color-text)\",\n cursor: view.enabled ? \"pointer\" : \"not-allowed\",\n opacity: view.enabled ? 1 : 0.5,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n }}\n >\n {view.label}\n </button>\n ))}\n </div>\n\n {/* Plugin slot for custom header actions */}\n <Slot name=\"list-header-actions\" doctype={doctype} />\n\n {activeView === \"list\" && (\n <button\n onClick={handleNew}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-primary)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontWeight: 500,\n }}\n >\n + New\n </button>\n )}\n </div>\n </div>\n\n {/* Action Errors */}\n {uiError && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n }}\n role=\"alert\"\n >\n {uiError}\n </div>\n )}\n\n {activeView === \"list\" && (\n <>\n {/* Search and Filters */}\n <div\n style={{\n display: \"flex\",\n gap: \"1rem\",\n marginBottom: \"1rem\",\n alignItems: \"center\",\n }}\n >\n {/* Search box */}\n <input\n type=\"search\"\n placeholder={`Search ${title}...`}\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n width: \"300px\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n\n {/* Plugin slot for custom filters */}\n <Slot name=\"list-filters\" doctype={doctype} />\n\n {/* Bulk actions (show when rows selected) */}\n {selectedRows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n gap: \"0.5rem\",\n marginLeft: \"auto\",\n alignItems: \"center\",\n }}\n >\n <span style={{ color: \"var(--color-text-secondary)\" }}>\n {selectedRows.length} selected\n </span>\n <button\n onClick={handleBulkDelete}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-error)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Delete\n </button>\n <button\n onClick={() => setSelectedRows([])}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n </div>\n )}\n </div>\n\n {/* Plugin slot for above table */}\n <Slot name=\"list-above-table\" doctype={doctype} />\n\n {/* Table */}\n <AutoTable\n resource={doctype}\n schema={schema}\n enableSelection\n onSelectionChange={setSelectedRows}\n onRowClick={handleRowClick}\n />\n\n {/* Plugin slot for below table */}\n <Slot name=\"list-below-table\" doctype={doctype} />\n </>\n )}\n\n {activeView === \"kanban\" && canKanban && kanbanGroupField && (\n <KanbanView\n resource={doctype}\n config={{\n groupField: kanbanGroupField,\n columns: kanbanColumns,\n titleField: kanbanTitleField,\n descriptionField: kanbanDescriptionField,\n }}\n />\n )}\n\n {activeView === \"tree\" && canTree && detectedParentField && (\n <TreeView\n resource={doctype}\n config={{\n parentField: detectedParentField,\n labelField: detectedLabelField,\n allowReparent: true,\n allowAddChild: true,\n allowRename: true,\n }}\n />\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedRows.length} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n confirmBulkDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </div>\n );\n}\n\nexport default ListView;\n","/**\n * FormView Page Component\n *\n * Generic form view for any DocType (create/edit).\n * Per checklist 3.2:\n * - Route Create: `/app/{doctype}/new`\n * - Route Edit: `/app/{doctype}/detail/{id}`\n *\n * Features:\n * - Fetches metadata\n * - Fetches document (if editing)\n * - Renders AutoForm\n * - Renders Workflow Actions\n * - Save/Submit/Cancel buttons\n * - Shows validation errors\n */\n\nimport { useState, useCallback, useEffect } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport { useOne, useCreate, useUpdate, useApiUrl } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"../hooks\";\nimport { useWorkflowActions } from \"../hooks/useWorkflowActions\";\nimport { AutoForm } from \"../components/form\";\nimport { WorkflowActions } from \"../components/workflow\";\nimport { AlertBanner } from \"../components/feedback\";\nimport { Slot } from \"../plugins\";\nimport { getClientScripts } from \"../config\";\n\n/**\n * FormView props\n */\nexport interface FormViewProps {\n /** DocType name (overrides route param) */\n doctype?: string;\n /** Document ID (overrides route param) */\n id?: string;\n}\n\n/**\n * FormView Component\n *\n * Renders a form for creating or editing any DocType.\n *\n * @example\n * ```tsx\n * // In routes\n * <Route path=\"/app/:doctype/new\" element={<FormView />} />\n * <Route path=\"/app/:doctype/detail/:id\" element={<FormView />} />\n * ```\n */\nexport function FormView({\n doctype: propDoctype,\n id: propId,\n}: Readonly<FormViewProps>) {\n const params = useParams<{ doctype: string; id: string }>();\n const navigate = useNavigate();\n\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const id = propId ?? params.id;\n const isEditing = !!id;\n const apiUrl = useApiUrl();\n\n const getApiOrigin = useCallback((rawApiUrl: string): string => {\n const trimmed = rawApiUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's API URL is often /api/v1; print endpoint is an absolute\n // backend route under /api/v1/print, so strip trailing /api/v1 if present.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n }, []);\n\n // Fetch metadata\n const {\n schema,\n isLoading: metaLoading,\n error: metaError,\n } = useDocTypeMeta(doctype);\n\n // Fetch document if editing\n const { result: existingDoc, query } = useOne({\n resource: doctype,\n id: id ?? \"\",\n queryOptions: { enabled: isEditing },\n });\n const docError = query?.error as Error | null | undefined;\n\n // Mutations\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n\n // Workflow actions\n const { state: workflowState } = useWorkflowActions(doctype, id, {\n enabled: isEditing,\n });\n\n // Form data state\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [errors, setErrors] = useState<string[]>([]);\n const [notices, setNotices] = useState<string[]>([]);\n const [printFormatName, setPrintFormatName] = useState(\"\");\n\n const addError = useCallback((message: string) => {\n setErrors(prev => [...prev, message]);\n }, []);\n\n const addNotice = useCallback((message: string) => {\n setNotices(prev => [...prev, message]);\n }, []);\n\n const dismissNotice = useCallback((index: number) => {\n setNotices(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n // Initialize form with existing doc\n useEffect(() => {\n if (existingDoc && Object.keys(formData).length === 0) {\n setFormData(existingDoc as Record<string, unknown>);\n }\n }, [existingDoc, formData]);\n\n // Run onLoad client scripts\n useEffect(() => {\n const scripts = getClientScripts(doctype, \"onLoad\");\n for (const script of scripts) {\n try {\n script.handler({\n doc: formData,\n setValue: (field, value) =>\n setFormData(prev => ({ ...prev, [field]: value })),\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: (message, type) => {\n if (type === \"error\") {\n addError(message);\n return;\n }\n addNotice(message);\n },\n user: { id: \"\", email: \"\", roles: [] },\n });\n } catch (err) {\n console.error(\"Client script error:\", err);\n }\n }\n }, [addError, addNotice, doctype, formData]);\n\n // Handle form change\n const handleChange = useCallback((data: unknown) => {\n setFormData(data as Record<string, unknown>);\n setErrors([]);\n setNotices([]);\n }, []);\n\n // Handle save\n const handleSave = useCallback(async () => {\n // Run validate scripts\n const validateScripts = getClientScripts(doctype, \"validate\");\n for (const script of validateScripts) {\n try {\n script.handler({\n doc: formData,\n setValue: (field, value) =>\n setFormData(prev => ({ ...prev, [field]: value })),\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: addError,\n user: { id: \"\", email: \"\", roles: [] },\n });\n } catch (err) {\n setErrors([(err as Error).message]);\n return;\n }\n }\n\n try {\n if (isEditing) {\n updateMutation.mutate(\n { resource: doctype, id: id ?? \"\", values: formData },\n {\n onSuccess: () => {\n // Run afterSave scripts\n const afterScripts = getClientScripts(doctype, \"afterSave\");\n for (const script of afterScripts) {\n script.handler({\n doc: formData,\n setValue: () => {},\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: addNotice,\n user: { id: \"\", email: \"\", roles: [] },\n });\n }\n // Navigate to list page after successful update\n navigate(`/app/${doctype}/list`);\n },\n onError: err => setErrors([err.message]),\n },\n );\n } else {\n createMutation.mutate(\n { resource: doctype, values: formData },\n {\n onSuccess: () => {\n // Navigate to list page after successful create\n navigate(`/app/${doctype}/list`);\n },\n onError: err => setErrors([err.message]),\n },\n );\n }\n } catch (err) {\n setErrors([(err as Error).message]);\n }\n }, [\n doctype,\n id,\n isEditing,\n formData,\n addError,\n addNotice,\n createMutation,\n updateMutation,\n navigate,\n ]);\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n navigate(`/app/${doctype}/list`);\n }, [navigate, doctype]);\n\n const openPrintPreview = useCallback(() => {\n if (!id) return;\n\n const base = getApiOrigin(apiUrl);\n const params = new URLSearchParams({ format: \"html\" });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n\n const url = `${base}/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n globalThis.open(url, \"_blank\", \"noopener,noreferrer\");\n }, [apiUrl, doctype, getApiOrigin, id, printFormatName]);\n\n const downloadPrintPdf = useCallback(async () => {\n if (!id) return;\n\n const base = getApiOrigin(apiUrl);\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\n const url = `${base}/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n\n try {\n const response = await fetch(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 ||\n payload.error ||\n `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(\n \"PDF generation unavailable. Please ensure PDF service is running.\",\n );\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 setErrors([\n err instanceof Error ? err.message : \"Failed to download PDF\",\n ]);\n }\n }, [apiUrl, doctype, getApiOrigin, id, printFormatName]);\n\n // Format title\n const docNameValue = formData.name;\n const displayName =\n typeof docNameValue === \"string\" || typeof docNameValue === \"number\"\n ? String(docNameValue)\n : (id ?? \"\");\n\n const title = isEditing\n ? `Edit ${doctype.replaceAll(\"_\", \" \")}: ${displayName}`\n : `New ${doctype.replaceAll(\"_\", \" \")}`;\n\n // Loading state\n if (metaLoading || (isEditing && query?.isLoading)) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-text-secondary)\" }}>Loading...</div>\n </div>\n );\n }\n\n // Error state\n if (metaError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-error)\" }}>\n Error: {metaError.message}\n </div>\n </div>\n );\n }\n\n if (isEditing && docError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div\n style={{\n color: \"var(--color-error)\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n padding: \"0.75rem 1rem\",\n borderRadius: \"4px\",\n }}\n role=\"alert\"\n >\n {docError.message || `Failed to load ${doctype}.`}\n </div>\n </div>\n );\n }\n\n const isSaving =\n createMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n let submitLabel = \"Create\";\n if (isSaving) {\n submitLabel = \"Saving...\";\n } else if (isEditing) {\n submitLabel = \"Save\";\n }\n\n return (\n <div\n style={{\n padding: \"1.5rem\",\n maxWidth: \"900px\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1.5rem\",\n }}\n >\n <h1\n style={{ margin: 0, fontSize: \"1.5rem\", color: \"var(--color-text)\" }}\n >\n {title}\n </h1>\n\n {/* Workflow Actions */}\n {isEditing && workflowState && (\n <WorkflowActions\n doctype={doctype}\n id={id}\n showState\n onActionComplete={() => query?.refetch?.()}\n />\n )}\n </div>\n\n {/* Plugin slot for form header */}\n <Slot name=\"form-header\" doctype={doctype} data={formData} id={id} />\n\n {/* Validation Errors */}\n {errors.length > 0 && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n }}\n >\n {errors.map((error, i) => (\n <div key={`${error}-${i}`} style={{ color: \"var(--color-error)\" }}>\n {error}\n </div>\n ))}\n </div>\n )}\n\n {notices.length > 0 && (\n <div style={{ marginBottom: \"1rem\" }}>\n {notices.map((notice, index) => (\n <AlertBanner\n key={`${notice}-${index}`}\n message={notice}\n variant=\"info\"\n onDismiss={() => dismissNotice(index)}\n />\n ))}\n </div>\n )}\n\n {/* Form */}\n {schema && (\n <AutoForm\n schema={schema as unknown as import(\"@rjsf/utils\").RJSFSchema}\n formData={formData}\n onChange={handleChange}\n onSubmit={handleSave}\n hideSubmitButton\n />\n )}\n\n {/* Plugin slot for form footer */}\n <Slot name=\"form-footer\" doctype={doctype} data={formData} id={id} />\n\n {/* Actions */}\n <div\n style={{\n marginTop: \"1.5rem\",\n paddingTop: \"1rem\",\n borderTop: \"1px solid var(--color-border)\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n }}\n >\n <button\n onClick={handleSave}\n disabled={isSaving}\n style={{\n padding: \"0.75rem 1.5rem\",\n backgroundColor: \"var(--color-primary)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: isSaving ? \"wait\" : \"pointer\",\n fontWeight: 500,\n opacity: isSaving ? 0.6 : 1,\n }}\n >\n {submitLabel}\n </button>\n\n <button\n onClick={handleCancel}\n style={{\n padding: \"0.75rem 1.5rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n\n {isEditing && (\n <>\n <input\n value={printFormatName}\n onChange={event => setPrintFormatName(event.target.value)}\n placeholder=\"Print format (optional)\"\n style={{ minWidth: \"200px\" }}\n />\n <button\n onClick={openPrintPreview}\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Print Preview\n </button>\n <button\n onClick={downloadPrintPdf}\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Download PDF\n </button>\n </>\n )}\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={formData} id={id} />\n </div>\n </div>\n );\n}\n\nexport default FormView;\n","/**\n * Login Page Component\n *\n * Login page for Indie/BFF mode (cookie auth).\n * Per checklist 4.4: Route /login with useLogin hook.\n * Supports OAuth social login when providers are configured.\n */\n\nimport { useState, type FormEvent } from \"react\";\nimport { useLogin } from \"@refinedev/core\";\n\n// OAuth provider display config\nconst OAUTH_PROVIDERS: Record<\n string,\n { label: string; bgColor: string; textColor: string; icon: string }\n> = {\n google: {\n label: \"Continue with Google\",\n bgColor: \"#fff\",\n textColor: \"#333\",\n icon: \"G\",\n },\n github: {\n label: \"Continue with GitHub\",\n bgColor: \"#24292e\",\n textColor: \"#fff\",\n icon: \"GH\",\n },\n microsoft: {\n label: \"Continue with Microsoft\",\n bgColor: \"#0078d4\",\n textColor: \"#fff\",\n icon: \"MS\",\n },\n};\n\nfunction getProviderUiConfig(provider: string): {\n label: string;\n bgColor: string;\n textColor: string;\n icon: string;\n border: string;\n} {\n const known = OAUTH_PROVIDERS[provider];\n if (known) {\n return {\n ...known,\n border: provider === \"google\" ? \"1px solid #ccc\" : \"none\",\n };\n }\n\n return {\n label: `Continue with ${provider}`,\n bgColor: \"#f5f5f5\",\n textColor: \"#333\",\n icon: \"ID\",\n border: \"1px solid #ddd\",\n };\n}\n\nfunction 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 };\n\n const rawProviders =\n configGlobal.__FRAMEWORK_CONFIG__?.auth?.oauth?.providers;\n\n if (Array.isArray(rawProviders)) {\n return rawProviders.filter(\n (provider): provider is string => typeof provider === \"string\",\n );\n }\n\n if (rawProviders && typeof rawProviders === \"object\") {\n return Object.keys(rawProviders);\n }\n\n return [];\n}\n\n/**\n * LoginPage props\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 * Simple login form using Refine's useLogin hook.\n * For Indie/BFF cookie-based authentication.\n *\n * @example\n * ```tsx\n * <Route path=\"/login\" element={<LoginPage />} />\n * ```\n */\nexport function LoginPage({\n title = \"Sign In\",\n logo,\n redirectTo,\n}: Readonly<LoginPageProps>) {\n const { mutate: login, status } = useLogin();\n const [error, setError] = useState<string | null>(null);\n\n const isLoading = status === \"pending\";\n\n // Detect configured OAuth providers from server-injected config\n const configuredProviders = resolveConfiguredProviders();\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setError(null);\n\n const formData = new FormData(e.currentTarget);\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n\n login(\n { email, password, redirectTo },\n {\n onSuccess: result => {\n if (result && \"success\" in result && result.success === false) {\n const message =\n result.error?.message ||\n \"Login failed. Please check your credentials.\";\n setError(message);\n }\n },\n onError: err => {\n setError(err.message || \"Login failed. Please try again.\");\n },\n },\n );\n };\n\n const handleOAuthLogin = (provider: string) => {\n globalThis.location.href = `/api/v1/auth/oauth/${provider}/start`;\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <div\n style={{\n width: \"100%\",\n maxWidth: \"400px\",\n padding: \"2rem\",\n backgroundColor: \"white\",\n borderRadius: \"8px\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n {/* Logo */}\n {logo && (\n <div style={{ textAlign: \"center\", marginBottom: \"1.5rem\" }}>\n {typeof logo === \"string\" ? (\n <img src={logo} alt=\"Logo\" style={{ maxHeight: \"48px\" }} />\n ) : (\n logo\n )}\n </div>\n )}\n\n {/* Title */}\n <h1\n style={{\n margin: \"0 0 1.5rem\",\n fontSize: \"1.5rem\",\n textAlign: \"center\",\n color: \"#333\",\n }}\n >\n {title}\n </h1>\n\n {/* OAuth Social Login Buttons */}\n {configuredProviders.length > 0 && (\n <div style={{ marginBottom: \"1.5rem\" }}>\n {configuredProviders.map(provider => {\n const cfg = getProviderUiConfig(provider);\n return (\n <button\n key={provider}\n type=\"button\"\n id={`oauth-btn-${provider}`}\n onClick={() => handleOAuthLogin(provider)}\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n marginBottom: \"0.5rem\",\n backgroundColor: cfg.bgColor,\n color: cfg.textColor,\n border: cfg.border,\n borderRadius: \"4px\",\n fontSize: \"0.95rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.5rem\",\n }}\n >\n <span style={{ fontWeight: 700, opacity: 0.8 }}>\n {cfg.icon}\n </span>\n {cfg.label}\n </button>\n );\n })}\n\n {/* Divider */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n marginTop: \"1rem\",\n marginBottom: \"0.5rem\",\n }}\n >\n <div\n style={{ flex: 1, height: \"1px\", backgroundColor: \"#e0e0e0\" }}\n />\n <span style={{ color: \"#999\", fontSize: \"0.85rem\" }}>or</span>\n <div\n style={{ flex: 1, height: \"1px\", backgroundColor: \"#e0e0e0\" }}\n />\n </div>\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem\",\n backgroundColor: \"#fff2f0\",\n border: \"1px solid #ffccc7\",\n borderRadius: \"4px\",\n color: \"#ff4d4f\",\n fontSize: \"0.875rem\",\n }}\n >\n {error}\n </div>\n )}\n\n {/* Login Form */}\n <form onSubmit={handleSubmit}>\n <div style={{ marginBottom: \"1rem\" }}>\n <label\n htmlFor=\"email\"\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n color: \"#333\",\n }}\n >\n Email\n </label>\n <input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n\n <div style={{ marginBottom: \"1.5rem\" }}>\n <label\n htmlFor=\"password\"\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n color: \"#333\",\n }}\n >\n Password\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n required\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n backgroundColor: \"#1890ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n fontWeight: 500,\n cursor: isLoading ? \"wait\" : \"pointer\",\n opacity: isLoading ? 0.6 : 1,\n }}\n >\n {isLoading ? \"Signing in...\" : \"Sign In\"}\n </button>\n </form>\n\n {/* Footer */}\n <div\n style={{\n marginTop: \"1.5rem\",\n textAlign: \"center\",\n fontSize: \"0.875rem\",\n color: \"#666\",\n }}\n >\n <a\n href=\"/forgot-password\"\n style={{ color: \"#1890ff\", textDecoration: \"none\" }}\n >\n Forgot password?\n </a>\n </div>\n </div>\n </div>\n );\n}\n\nexport default LoginPage;\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 } }).__FRAMEWORK_CONFIG__?.auth;\n \n return {\n authStrategy: config?.authStrategy ?? \"cookie\",\n loginUrl: config?.loginUrl ?? \"/login\",\n oidcConfig: config?.oidcConfig,\n };\n}\n"],"names":["API_URL","_a","META_URL","WS_URL","FrameworkApiError","message","status","code","details","__publicField","buildActionPermissionMessage","action","resource","backendMessage","normalizedResource","base","buildPaginationParams","pagination","params","current","pageSize","buildSortingParams","sorters","sorter","order","filterValueToString","value","buildFilterParams","filters","filter","op","valueStr","buildQueryString","searchParams","key","fetchWithCredentials","url","options","context","response","payload","frameworkMDataProvider","query","queryString","id","variables","ids","method","headers","fullUrl","authProvider","email","password","error","user","identityId","identityName","identityEmail","connections","subscriptions","getConnection","channel","ws","wsUrl","event","data","callbacks","callback","err","maybeCloseConnection","liveProvider","types","channelName","filteredCallback","unsubscribeFn","type","apiUrl","closeAllConnections","normalizeArrayItems","props","rawItem","fallbackIndex","item","index","content","isValidElement","targetIndex","handler","FieldTemplate","label","required","description","errors","children","hidden","displayLabel","uiSchema","formData","floatingLabel","hasValue","jsxs","jsx","ObjectFieldTemplate","title","properties","prop","ArrayFieldTemplate","canAdd","onAddClick","extendedProps","detailIndex","setDetailIndex","useState","dragIndex","setDragIndex","pasteText","setPasteText","pasteError","setPasteError","items","useMemo","rawFormData","rows","replaceArray","arrayFieldName","_b","parsed","BaseInputTemplate","disabled","readonly","onChange","onBlur","onFocus","placeholder","e","TextWidget","CheckboxWidget","SelectWidget","enumOptions","opt","DateWidget","TextareaWidget","customWidgets","customTemplates","replaceArrayFieldInData","source","fieldName","root","normalizeNullablePropertySchema","property","normalized","typeValue","nonNullTypes","t","anyOfValue","nonNullSchemas","nonNullSchema","merged","normalizeNullableObjectSchema","schema","normalizedProperties","AutoForm","onSubmit","onError","hideSubmitButton","submitText","className","normalizedSchema","handleChange","handleSubmit","formContext","formProps","validator","Form","useDebounce","delay","debouncedValue","setDebouncedValue","useEffect","timer","LinkWidget","linkedDoctype","inputValue","setInputValue","searchResults","setSearchResults","isOpen","setIsOpen","isLoading","setIsLoading","debouncedSearch","fetchOptions","useCallback","search","handleSelect","option","handleInputChange","newValue","generateColumnsFromSchema","columns","getValue","AutoTable","customColumns","enableSelection","onSelectionChange","onRowClick","sorting","setSorting","rowSelection","setRowSelection","setPagination","result","useList","tableData","totalCount","queryError","focusCell","rowIndex","colIndex","tableElement","selector","target","handleCellKeyDown","columnsWithSelection","table","row","useReactTable","r","updater","newSelection","selectedIds","selectedRows","rowId","getCoreRowModel","getSortedRowModel","getPaginationRowModel","headerGroup","header","flexRender","cell","EditableCell","field","onSaveSuccess","renderValue","isEditing","setIsEditing","editValue","setEditValue","setError","inputRef","useRef","updateMutation","useUpdate","handleClick","handleCancel","handleBlur","handleKeyDown","isSaving","ConfirmDialog","open","confirmLabel","cancelLabel","destructive","onConfirm","onCancel","titleId","styles","AlertBanner","variant","onDismiss","palette","Fragment","commonStyle","BulkActionsBar","selectedCount","onDelete","onExportJson","onExportCsv","onBulkUpdate","updateFields","onClear","showUpdateMenu","setShowUpdateMenu","selectedField","setSelectedField","updateValue","setUpdateValue","isDeleteConfirmOpen","setIsDeleteConfirmOpen","handleUpdate","handleDelete","buttonStyle","f","_c","o","STATE_COLORS","getStateColor","state","normalizedState","StateBadge","docstatus","style","displayState","colors","fetchWorkflowActions","doctype","executeTransition","useWorkflowActions","queryClient","useQueryClient","isExecuting","setIsExecuting","enabled","refetch","useQuery","executeAction","actionName","ACTION_COLORS","getActionColor","WorkflowActions","showState","onActionComplete","actions","handleAction","allowedActions","a","registry","getSlotComponents","slotName","slots","s","getResources","Slot","name","slotRegistrations","registration","Component","BUILTIN_COMMANDS","CommandPalette","onClose","setQuery","selectedIndex","setSelectedIndex","doctypes","setDoctypes","go","useGo","fetchDoctypes","dt","documentItems","doc","d","newCommands","searchTerm","filteredItems","lowerQuery","cmd","executeCommand","i","idx","Menu","logout","useLogout","menuItems","useMenu","NavLink","Breadcrumb","breadcrumbs","useBreadcrumb","breadcrumb","Link","Layout","fetchDocTypeMeta","useDocTypeMeta","meta","usePrefetchDocTypeMeta","useDocTypes","setDocTypes","fetchDocTypes","resources","useInlineEdit","editingCell","setEditingCell","startEdit","cancelEdit","saveEdit","resolve","reject","errorMsg","useBulkActions","onSuccess","setSelectedIds","deleteMutation","useDeleteMany","useUpdateMany","selectedItems","isAllSelected","isSomeSelected","selectRow","prev","deselectRow","next","toggleRow","selectAll","deselectAll","toggleAll","isSelected","bulkDelete","bulkUpdate","values","exportAsJson","blob","exportAsCsv","fields","val","str","csv","useCommandPalette","close","toggle","useTranslation","namespace","i18n","ready","useI18nTranslation","lng","uiMetaCache","resolveMetaBaseUrl","baseUrl","trimmed","useUIMeta","uiContext","cacheKey","uiMeta","setUiMeta","fetchMeta","viewRegistry","doctypeViews","registerView","getViewComponent","getRegisteredViews","getViewRegistration","setDocTypeViews","views","getDocTypeViews","isViewAvailable","viewType","QuickEditModal","titleField","descField","groupField","onSaved","setTitle","desc","setDesc","setStatus","saving","setSaving","updateItem","handleSave","col","KanbanView","config","dragState","setDragState","dragOverColumn","setDragOverColumn","editingItem","setEditingItem","seen","discovered","COLUMN_COLORS","groupedItems","groups","first","handleDrop","targetColumnId","j","column","isOver","isDragging","getDaysInMonth","year","month","days","date","CalendarView","startField","currentDate","setCurrentDate","startOfMonth","endOfMonth","eventsByDay","dateStr","prevMonth","nextMonth","today","monthName","weekDays","firstDayOffset","btnStyle","day","_","events","isToday","getDateRange","tasks","endField","minDate","maxDate","task","start","end","getDaysBetween","GanttView","nameField","progressField","totalDays","dayHeaders","rowHeight","dayWidth","taskStart","taskEnd","startOffset","duration","progress","BASE_URL","__vite_import_meta_env__","fetchTree","res","reparentNode","nodeId","newParent","updateNode","addChildNode","parentId","InlineInput","initialValue","setValue","ref","TreeNodeRow","node","depth","onRefresh","dragNodeId","onDragStart","onDrop","collapsed","setCollapsed","renaming","setRenaming","addingChild","setAddingChild","isDropTarget","setIsDropTarget","handleRename","newLabel","handleAddChild","hasChildren","toggleGlyph","c","child","TreeView","setState","setDragNodeId","addingRoot","setAddingRoot","load","tree","targetId","handleAddRoot","isDebugEnabled","globalFlag","processRef","envFlag","configLogger","configStore","clientScripts","registerConfig","existing","mergeConfigs","override","mergeFormConfigs","mergeListConfigs","getConfig","getFormConfig","getListConfig","getFieldConfig","registerClientScript","script","getClientScripts","loadConfigFromUrl","clearConfigs","useConfig","useFormConfig","useListConfig","useFieldConfig","WorkspaceSection","workspace","isExpanded","setIsExpanded","handleItemClick","toSchemaFields","getStringEnums","v","isSelectOrLinkField","format","rawFieldType","fieldType","pickFirst","ListView","propDoctype","propView","useParams","navigate","useNavigate","location","useLocation","identity","useGetIdentity","isAuthenticated","metaLoading","metaError","searchQuery","setSearchQuery","uiError","setUiError","setSelectedRows","schemaFields","pathView","detectedParentField","fromMeta","detectedLabelField","groupFieldCandidates","metaKanban","kanbanGroupField","kanbanColumns","kanbanTitleField","kanbanDescriptionField","canKanban","canTree","activeView","requested","setActiveView","view","handleRowClick","handleNew","invalidate","useInvalidate","handleBulkDelete","confirmBulkDelete","FormView","propId","useApiUrl","getApiOrigin","rawApiUrl","existingDoc","useOne","docError","createMutation","useCreate","workflowState","setFormData","setErrors","notices","setNotices","printFormatName","setPrintFormatName","addError","addNotice","dismissNotice","scripts","validateScripts","afterScripts","openPrintPreview","downloadPrintPdf","downloadUrl","anchor","docNameValue","displayName","submitLabel","notice","OAUTH_PROVIDERS","getProviderUiConfig","provider","known","resolveConfiguredProviders","rawProviders","LoginPage","logo","redirectTo","login","useLogin","configuredProviders","handleOAuthLogin","cfg","getAuthConfig"],"mappings":"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"}