@pilotiq/pilotiq 0.6.2 → 0.7.1

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 (197) hide show
  1. package/.turbo/turbo-build.log +6 -2
  2. package/CHANGELOG.md +614 -0
  3. package/CLAUDE.md +6 -5
  4. package/dist/Column.d.ts +35 -0
  5. package/dist/Column.d.ts.map +1 -1
  6. package/dist/Column.js +41 -0
  7. package/dist/Column.js.map +1 -1
  8. package/dist/Page.d.ts +13 -4
  9. package/dist/Page.d.ts.map +1 -1
  10. package/dist/Page.js +9 -2
  11. package/dist/Page.js.map +1 -1
  12. package/dist/Pilotiq.d.ts +84 -0
  13. package/dist/Pilotiq.d.ts.map +1 -1
  14. package/dist/Pilotiq.js +66 -0
  15. package/dist/Pilotiq.js.map +1 -1
  16. package/dist/Resource.d.ts +26 -0
  17. package/dist/Resource.d.ts.map +1 -1
  18. package/dist/Resource.js +9 -0
  19. package/dist/Resource.js.map +1 -1
  20. package/dist/actions/exportFactory.js +1 -1
  21. package/dist/actions/exportFactory.js.map +1 -1
  22. package/dist/columns/SelectColumn.d.ts +32 -5
  23. package/dist/columns/SelectColumn.d.ts.map +1 -1
  24. package/dist/columns/SelectColumn.js +37 -7
  25. package/dist/columns/SelectColumn.js.map +1 -1
  26. package/dist/defaultPages.d.ts.map +1 -1
  27. package/dist/defaultPages.js +3 -0
  28. package/dist/defaultPages.js.map +1 -1
  29. package/dist/elements/Form.d.ts +17 -0
  30. package/dist/elements/Form.d.ts.map +1 -1
  31. package/dist/elements/Form.js +17 -0
  32. package/dist/elements/Form.js.map +1 -1
  33. package/dist/elements/Table.d.ts +26 -0
  34. package/dist/elements/Table.d.ts.map +1 -1
  35. package/dist/elements/Table.js +15 -1
  36. package/dist/elements/Table.js.map +1 -1
  37. package/dist/elements/TableGroup.d.ts +84 -0
  38. package/dist/elements/TableGroup.d.ts.map +1 -1
  39. package/dist/elements/TableGroup.js +103 -0
  40. package/dist/elements/TableGroup.js.map +1 -1
  41. package/dist/elements/dispatchForm.d.ts.map +1 -1
  42. package/dist/elements/dispatchForm.js +36 -6
  43. package/dist/elements/dispatchForm.js.map +1 -1
  44. package/dist/elements/dispatchTable.d.ts +12 -0
  45. package/dist/elements/dispatchTable.d.ts.map +1 -1
  46. package/dist/elements/dispatchTable.js +103 -28
  47. package/dist/elements/dispatchTable.js.map +1 -1
  48. package/dist/fields/Field.d.ts +7 -2
  49. package/dist/fields/Field.d.ts.map +1 -1
  50. package/dist/fields/Field.js +8 -3
  51. package/dist/fields/Field.js.map +1 -1
  52. package/dist/fields/RepeaterField.d.ts +65 -0
  53. package/dist/fields/RepeaterField.d.ts.map +1 -1
  54. package/dist/fields/RepeaterField.js +48 -0
  55. package/dist/fields/RepeaterField.js.map +1 -1
  56. package/dist/orm/modelDefaults.d.ts.map +1 -1
  57. package/dist/orm/modelDefaults.js +19 -0
  58. package/dist/orm/modelDefaults.js.map +1 -1
  59. package/dist/pageData.d.ts +20 -0
  60. package/dist/pageData.d.ts.map +1 -1
  61. package/dist/pageData.js +242 -34
  62. package/dist/pageData.js.map +1 -1
  63. package/dist/react/AppShell.d.ts +17 -1
  64. package/dist/react/AppShell.d.ts.map +1 -1
  65. package/dist/react/AppShell.js +34 -3
  66. package/dist/react/AppShell.js.map +1 -1
  67. package/dist/react/PendingSuggestionApplierRegistry.d.ts +34 -0
  68. package/dist/react/PendingSuggestionApplierRegistry.d.ts.map +1 -0
  69. package/dist/react/PendingSuggestionApplierRegistry.js +51 -0
  70. package/dist/react/PendingSuggestionApplierRegistry.js.map +1 -0
  71. package/dist/react/PendingSuggestionOverlayRegistry.d.ts +46 -0
  72. package/dist/react/PendingSuggestionOverlayRegistry.d.ts.map +1 -0
  73. package/dist/react/PendingSuggestionOverlayRegistry.js +16 -0
  74. package/dist/react/PendingSuggestionOverlayRegistry.js.map +1 -0
  75. package/dist/react/PendingSuggestionsContext.d.ts +153 -0
  76. package/dist/react/PendingSuggestionsContext.d.ts.map +1 -0
  77. package/dist/react/PendingSuggestionsContext.js +46 -0
  78. package/dist/react/PendingSuggestionsContext.js.map +1 -0
  79. package/dist/react/SchemaRenderer.d.ts.map +1 -1
  80. package/dist/react/SchemaRenderer.js +312 -39
  81. package/dist/react/SchemaRenderer.js.map +1 -1
  82. package/dist/react/cells/EditableCell.d.ts +8 -0
  83. package/dist/react/cells/EditableCell.d.ts.map +1 -1
  84. package/dist/react/cells/EditableCell.js +6 -2
  85. package/dist/react/cells/EditableCell.js.map +1 -1
  86. package/dist/react/fields/CheckboxListInput.d.ts.map +1 -1
  87. package/dist/react/fields/CheckboxListInput.js +29 -2
  88. package/dist/react/fields/CheckboxListInput.js.map +1 -1
  89. package/dist/react/fields/ColorInput.d.ts.map +1 -1
  90. package/dist/react/fields/ColorInput.js +28 -2
  91. package/dist/react/fields/ColorInput.js.map +1 -1
  92. package/dist/react/fields/DateTimeInput.d.ts.map +1 -1
  93. package/dist/react/fields/DateTimeInput.js +28 -2
  94. package/dist/react/fields/DateTimeInput.js.map +1 -1
  95. package/dist/react/fields/FieldShell.d.ts.map +1 -1
  96. package/dist/react/fields/FieldShell.js +161 -3
  97. package/dist/react/fields/FieldShell.js.map +1 -1
  98. package/dist/react/fields/FileUploadInput.d.ts.map +1 -1
  99. package/dist/react/fields/FileUploadInput.js +27 -2
  100. package/dist/react/fields/FileUploadInput.js.map +1 -1
  101. package/dist/react/fields/KeyValueInput.d.ts.map +1 -1
  102. package/dist/react/fields/KeyValueInput.js +33 -2
  103. package/dist/react/fields/KeyValueInput.js.map +1 -1
  104. package/dist/react/fields/RadioInput.d.ts.map +1 -1
  105. package/dist/react/fields/RadioInput.js +28 -2
  106. package/dist/react/fields/RadioInput.js.map +1 -1
  107. package/dist/react/fields/SelectFieldInput.d.ts.map +1 -1
  108. package/dist/react/fields/SelectFieldInput.js +31 -2
  109. package/dist/react/fields/SelectFieldInput.js.map +1 -1
  110. package/dist/react/fields/SliderInput.d.ts.map +1 -1
  111. package/dist/react/fields/SliderInput.js +26 -2
  112. package/dist/react/fields/SliderInput.js.map +1 -1
  113. package/dist/react/fields/TagsInput.d.ts.map +1 -1
  114. package/dist/react/fields/TagsInput.js +26 -2
  115. package/dist/react/fields/TagsInput.js.map +1 -1
  116. package/dist/react/fields/ToggleFieldInput.d.ts.map +1 -1
  117. package/dist/react/fields/ToggleFieldInput.js +29 -2
  118. package/dist/react/fields/ToggleFieldInput.js.map +1 -1
  119. package/dist/react/index.d.ts +3 -0
  120. package/dist/react/index.d.ts.map +1 -1
  121. package/dist/react/index.js +3 -0
  122. package/dist/react/index.js.map +1 -1
  123. package/dist/routes.d.ts.map +1 -1
  124. package/dist/routes.js +55 -2
  125. package/dist/routes.js.map +1 -1
  126. package/dist/schema/Section.d.ts +16 -0
  127. package/dist/schema/Section.d.ts.map +1 -1
  128. package/dist/schema/Section.js +16 -0
  129. package/dist/schema/Section.js.map +1 -1
  130. package/dist/schema/Wizard.d.ts +45 -0
  131. package/dist/schema/Wizard.d.ts.map +1 -1
  132. package/dist/schema/Wizard.js +50 -0
  133. package/dist/schema/Wizard.js.map +1 -1
  134. package/dist/schema/resolveSchema.d.ts +8 -0
  135. package/dist/schema/resolveSchema.d.ts.map +1 -1
  136. package/dist/schema/resolveSchema.js +70 -1
  137. package/dist/schema/resolveSchema.js.map +1 -1
  138. package/dist/sessionFilters.d.ts.map +1 -1
  139. package/dist/sessionFilters.js +12 -1
  140. package/dist/sessionFilters.js.map +1 -1
  141. package/dist/styles/file-upload.css +13 -0
  142. package/dist/vite.d.ts.map +1 -1
  143. package/dist/vite.js +19 -12
  144. package/dist/vite.js.map +1 -1
  145. package/package.json +6 -4
  146. package/src/Column.test.ts +36 -0
  147. package/src/Column.ts +54 -0
  148. package/src/Page.ts +13 -4
  149. package/src/Pilotiq.ts +109 -0
  150. package/src/Resource.ts +29 -0
  151. package/src/actions/exportFactory.ts +1 -1
  152. package/src/columns/SelectColumn.ts +46 -8
  153. package/src/columns/editableColumns.test.ts +45 -0
  154. package/src/defaultPages.ts +3 -0
  155. package/src/elements/Form.ts +19 -0
  156. package/src/elements/Table.ts +35 -1
  157. package/src/elements/TableGroup.test.ts +111 -0
  158. package/src/elements/TableGroup.ts +135 -0
  159. package/src/elements/dispatchForm.ts +34 -7
  160. package/src/elements/dispatchTable.test.ts +267 -0
  161. package/src/elements/dispatchTable.ts +111 -32
  162. package/src/fields/Field.test.ts +15 -0
  163. package/src/fields/Field.ts +8 -3
  164. package/src/fields/RepeaterField.ts +104 -0
  165. package/src/fields/RepeaterRelationship.test.ts +173 -0
  166. package/src/nestedRelationManagerData.test.ts +21 -0
  167. package/src/orm/modelDefaults.ts +21 -0
  168. package/src/pageData.ts +267 -47
  169. package/src/react/AppShell.tsx +55 -4
  170. package/src/react/PendingSuggestionApplierRegistry.ts +80 -0
  171. package/src/react/PendingSuggestionOverlayRegistry.ts +54 -0
  172. package/src/react/PendingSuggestionsContext.tsx +172 -0
  173. package/src/react/SchemaRenderer.tsx +504 -95
  174. package/src/react/cells/EditableCell.tsx +11 -2
  175. package/src/react/fields/CheckboxListInput.tsx +23 -2
  176. package/src/react/fields/ColorInput.tsx +22 -2
  177. package/src/react/fields/DateTimeInput.tsx +22 -2
  178. package/src/react/fields/FieldShell.tsx +167 -3
  179. package/src/react/fields/FileUploadInput.tsx +21 -2
  180. package/src/react/fields/KeyValueInput.tsx +32 -2
  181. package/src/react/fields/RadioInput.tsx +23 -2
  182. package/src/react/fields/SelectFieldInput.tsx +25 -2
  183. package/src/react/fields/SliderInput.tsx +20 -2
  184. package/src/react/fields/TagsInput.tsx +20 -2
  185. package/src/react/fields/ToggleFieldInput.tsx +23 -2
  186. package/src/react/index.ts +18 -0
  187. package/src/relationManagerData.test.ts +451 -2
  188. package/src/routes.ts +58 -2
  189. package/src/schema/Section.ts +17 -0
  190. package/src/schema/Wizard.ts +67 -0
  191. package/src/schema/containers.test.ts +90 -0
  192. package/src/schema/resolveSchema.test.ts +50 -0
  193. package/src/schema/resolveSchema.ts +79 -1
  194. package/src/sessionFilters.test.ts +23 -0
  195. package/src/sessionFilters.ts +11 -1
  196. package/src/styles/file-upload.css +13 -0
  197. package/src/vite.ts +19 -12
package/dist/vite.js CHANGED
@@ -133,7 +133,7 @@ export const route: RouteSync = (pageContext) => {
133
133
  const parts = pageContext.urlPathname.split('/').filter(Boolean)
134
134
  if (parts.length !== 1) return false
135
135
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
136
- return { routeParams: { basePath: parts[0] } }
136
+ return { routeParams: { basePath: parts[0]! } }
137
137
  }
138
138
  `);
139
139
  writeIfChanged(path.join(outDir, 'dashboard', '+data.ts'), dataStub);
@@ -181,7 +181,7 @@ export const route: RouteSync = (pageContext) => {
181
181
  // Don't match built-in slugs (theme editor, etc.)
182
182
  if (parts[1 + off] === 'theme') return false
183
183
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
184
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]! } }
184
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]! } }
185
185
  }
186
186
  `);
187
187
  writeIfChanged(path.join(outDir, 'slug', '+data.ts'), dataStub);
@@ -206,7 +206,7 @@ export const route: RouteSync = (pageContext) => {
206
206
  const off = clusterOffset(parts)
207
207
  if (parts.length !== 3 + off || parts[2 + off] !== 'create') return false
208
208
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
209
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]! } }
209
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]! } }
210
210
  }
211
211
  `);
212
212
  writeIfChanged(path.join(outDir, 'resource-create', '+data.ts'), dataStub);
@@ -221,7 +221,7 @@ export const route: RouteSync = (pageContext) => {
221
221
  const off = clusterOffset(parts)
222
222
  if (parts.length !== 4 + off || parts[3 + off] !== 'edit') return false
223
223
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
224
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]!, id: parts[2 + off]! } }
224
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]!, id: parts[2 + off]! } }
225
225
  }
226
226
  `);
227
227
  writeIfChanged(path.join(outDir, 'resource-edit', '+data.ts'), dataStub);
@@ -253,7 +253,7 @@ export const route: RouteSync = (pageContext) => {
253
253
  if (parts[2 + off] === 'create') return false
254
254
  if (parts[1 + off] === 'theme') return false
255
255
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
256
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]!, id: parts[2 + off]! } }
256
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]!, id: parts[2 + off]! } }
257
257
  }
258
258
  `);
259
259
  writeIfChanged(path.join(outDir, 'resource-view', '+data.ts'), dataStub);
@@ -280,7 +280,7 @@ export const route: RouteSync = (pageContext) => {
280
280
  if (parts.length !== 4 + off) return false
281
281
  if (parts[3 + off] === 'edit') return false
282
282
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
283
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]! } }
283
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]! } }
284
284
  }
285
285
  `);
286
286
  writeIfChanged(path.join(outDir, 'relation-list', '+data.ts'), dataStub);
@@ -295,7 +295,7 @@ export const route: RouteSync = (pageContext) => {
295
295
  const off = clusterOffset(parts)
296
296
  if (parts.length !== 5 + off || parts[4 + off] !== 'create') return false
297
297
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
298
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]! } }
298
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]! } }
299
299
  }
300
300
  `);
301
301
  writeIfChanged(path.join(outDir, 'relation-create', '+data.ts'), dataStub);
@@ -311,7 +311,7 @@ export const route: RouteSync = (pageContext) => {
311
311
  if (parts.length !== 5 + off) return false
312
312
  if (parts[4 + off] === 'create') return false
313
313
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
314
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]!, childId: parts[4 + off]! } }
314
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]!, childId: parts[4 + off]! } }
315
315
  }
316
316
  `);
317
317
  writeIfChanged(path.join(outDir, 'relation-view', '+data.ts'), dataStub);
@@ -326,7 +326,7 @@ export const route: RouteSync = (pageContext) => {
326
326
  const off = clusterOffset(parts)
327
327
  if (parts.length !== 6 + off || parts[5 + off] !== 'edit') return false
328
328
  if (import.meta.env.SSR && !PilotiqRegistry.findByPath('/' + parts[0])) return false
329
- return { routeParams: { basePath: parts[0], slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]!, childId: parts[4 + off]! } }
329
+ return { routeParams: { basePath: parts[0]!, slug: parts[1 + off]!, id: parts[2 + off]!, relationship: parts[3 + off]!, childId: parts[4 + off]! } }
330
330
  }
331
331
  `);
332
332
  writeIfChanged(path.join(outDir, 'relation-edit', '+data.ts'), dataStub);
@@ -449,7 +449,7 @@ export const route: RouteSync = (pageContext) => {
449
449
  // Only match if themeEditor is enabled
450
450
  if (!panel.getConfig().themeEditor) return false
451
451
  }
452
- return { routeParams: { basePath: parts[0] } }
452
+ return { routeParams: { basePath: parts[0]! } }
453
453
  }
454
454
  `);
455
455
  writeIfChanged(path.join(outDir, 'theme', '+data.ts'), dataStub);
@@ -572,6 +572,7 @@ export function clusterOffset(parts: string[]): number {
572
572
  lines.push('const _all: Record<string, unknown> = {}');
573
573
  lines.push('const _clusters: Record<string, string[]> = {}');
574
574
  lines.push('const _rightPanels: Record<string, unknown> = {}');
575
+ lines.push('const _layoutProviders: unknown[] = []');
575
576
  lines.push('function _add(c: any) { if (typeof c === \'function\' && c.name) _all[c.name] = c }');
576
577
  lines.push('function _walk(p: any) {');
577
578
  lines.push(' const cfg = p?.getConfig?.()');
@@ -583,6 +584,11 @@ export function clusterOffset(parts: string[]): number {
583
584
  lines.push(' if (_c && typeof _c.id === \'string\' && _c.render) _rightPanels[_c.id] = _c.render');
584
585
  lines.push(' }');
585
586
  lines.push(' }');
587
+ lines.push(' if (Array.isArray(cfg?.layoutProviders)) {');
588
+ lines.push(' for (const _C of cfg.layoutProviders) {');
589
+ lines.push(' if (typeof _C === \'function\') _layoutProviders.push(_C)');
590
+ lines.push(' }');
591
+ lines.push(' }');
586
592
  lines.push(' if (cfg?.path && Array.isArray(cfg?.clusters)) {');
587
593
  lines.push(' const slugs = cfg.clusters.map((C: any) => (typeof C?.getSlug === \'function\' ? C.getSlug() : \'\')).filter(Boolean)');
588
594
  lines.push(' if (slugs.length > 0) _clusters[cfg.path] = slugs');
@@ -593,6 +599,7 @@ export function clusterOffset(parts: string[]): number {
593
599
  lines.push('export const componentRegistry: Record<string, unknown> = _all');
594
600
  lines.push('export const clusterSlugsByBasePath: Record<string, string[]> = _clusters');
595
601
  lines.push('export const rightPanelRegistry: Record<string, unknown> = _rightPanels');
602
+ lines.push('export const layoutProviderRegistry: unknown[] = _layoutProviders');
596
603
  lines.push('');
597
604
  writeIfChanged(path.join(outDir, '_components.ts'), lines.join('\n'));
598
605
  }
@@ -606,7 +613,7 @@ function writeLayoutWithManifest(pagesRoot) {
606
613
  import { usePageContext } from 'vike-react/usePageContext'
607
614
  import { AppShell, ThemeProvider, generateThemeCSS, NavigateProvider } from '@pilotiq/pilotiq/react'
608
615
  import { navigate as vikeNavigate } from 'vike/client/router'
609
- import { componentRegistry, rightPanelRegistry } from './_components.js'
616
+ import { componentRegistry, rightPanelRegistry, layoutProviderRegistry } from './_components.js'
610
617
  import type { ReactNode } from 'react'
611
618
 
612
619
  // Wrap vike's async navigate so the NavigateProvider's fire-and-forget
@@ -629,7 +636,7 @@ export default function PilotiqLayout({ children }: { children: ReactNode }) {
629
636
  <NavigateProvider navigate={navigate}>
630
637
  <ThemeProvider theme={panel.theme}>
631
638
  {themeCss && <style dangerouslySetInnerHTML={{ __html: themeCss }} />}
632
- <AppShell panel={panel} basePath={basePath} layout={layout} notifications={notifications} currentPath={currentPath} componentRegistry={componentRegistry as any} rightPanelRegistry={rightPanelRegistry as any}>
639
+ <AppShell panel={panel} basePath={basePath} layout={layout} notifications={notifications} currentPath={currentPath} componentRegistry={componentRegistry as any} rightPanelRegistry={rightPanelRegistry as any} layoutProviderRegistry={layoutProviderRegistry as any}>
633
640
  {children}
634
641
  </AppShell>
635
642
  </ThemeProvider>
package/dist/vite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pilotiq/pilotiq",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
4
4
  "description": "View-based admin panel for RudderJS",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -57,7 +57,8 @@
57
57
  "./richtext": {
58
58
  "import": "./dist/richtext/index.js",
59
59
  "types": "./dist/richtext/index.d.ts"
60
- }
60
+ },
61
+ "./styles/file-upload.css": "./dist/styles/file-upload.css"
61
62
  },
62
63
  "dependencies": {
63
64
  "jiti": "^2.6.0",
@@ -97,8 +98,9 @@
97
98
  "vite": "^7"
98
99
  },
99
100
  "scripts": {
100
- "build": "tsc -p tsconfig.build.json",
101
- "dev": "tsc -p tsconfig.build.json --watch",
101
+ "build": "tsc -p tsconfig.build.json && pnpm run copy-assets",
102
+ "dev": "tsc -p tsconfig.build.json --watch & pnpm run copy-assets; wait",
103
+ "copy-assets": "mkdir -p dist/styles && cp -R src/styles/*.css dist/styles/",
102
104
  "typecheck": "tsc --noEmit",
103
105
  "clean": "rm -rf dist",
104
106
  "test": "tsc -p tsconfig.test.json && node --test \"dist-test/**/*.test.js\"; EXIT=$?; rm -rf dist-test; exit $EXIT"
@@ -160,4 +160,40 @@ describe('Column', () => {
160
160
  assert.equal((meta as Record<string, unknown>)['afterStateUpdated'], undefined)
161
161
  })
162
162
  })
163
+
164
+ describe('toggleable() user-visibility chrome', () => {
165
+ it('isToggleable + getToggleableConfig default to false / undefined', () => {
166
+ const col = Column.make('email')
167
+ assert.equal(col.isToggleable(), false)
168
+ assert.equal(col.getToggleableConfig(), undefined)
169
+ })
170
+
171
+ it('bare toggleable() opts in with defaults (visible by default)', () => {
172
+ const col = Column.make('email').toggleable()
173
+ assert.equal(col.isToggleable(), true)
174
+ assert.deepEqual(col.getToggleableConfig(), {})
175
+ const meta = col.toMeta() as Record<string, unknown>
176
+ assert.deepEqual(meta['toggleable'], {})
177
+ })
178
+
179
+ it('toggleable({ initiallyHidden: true }) starts off-screen', () => {
180
+ const col = Column.make('internalId').toggleable({ initiallyHidden: true })
181
+ const cfg = col.getToggleableConfig()
182
+ assert.equal(cfg?.initiallyHidden, true)
183
+ const meta = col.toMeta() as Record<string, unknown>
184
+ assert.deepEqual(meta['toggleable'], { initiallyHidden: true })
185
+ })
186
+
187
+ it('toggleable(false) explicitly opts back out', () => {
188
+ const col = Column.make('email').toggleable().toggleable(false)
189
+ assert.equal(col.isToggleable(), false)
190
+ const meta = col.toMeta() as Record<string, unknown>
191
+ assert.equal(meta['toggleable'], undefined)
192
+ })
193
+
194
+ it('omits the meta key when not opted in (sparse wire shape)', () => {
195
+ const meta = Column.make('plain').toMeta() as Record<string, unknown>
196
+ assert.equal('toggleable' in meta, false)
197
+ })
198
+ })
163
199
  })
package/src/Column.ts CHANGED
@@ -79,6 +79,14 @@ export type FormatStateHandler = (value: unknown, record: Record<string, unknown
79
79
  * server-side inside `loadTableRecords`. */
80
80
  export type ColumnRecordUrlHandler = (record: Record<string, unknown>) => string | undefined
81
81
 
82
+ /** Configuration for `Column.toggleable(...)`. The user can show / hide the
83
+ * column from a per-table dropdown; preference persists to localStorage so
84
+ * it survives reloads + SPA navs. `initiallyHidden` flips the default state
85
+ * so the column starts off-screen and the user opts in. */
86
+ export interface ColumnToggleableConfig {
87
+ initiallyHidden?: boolean
88
+ }
89
+
82
90
  export interface ColumnMeta extends ElementMeta {
83
91
  type: 'column'
84
92
  name: string
@@ -103,6 +111,10 @@ export interface ColumnMeta extends ElementMeta {
103
111
  * computed values for each summarizer land on the table meta under
104
112
  * `summaries[columnName]` (`SummaryResult[]`), not on the column. */
105
113
  summaries?: SummarizerMeta[]
114
+ /** True when the user can show / hide this column from the toolbar's
115
+ * "Columns" dropdown. `initiallyHidden` flips the default state so
116
+ * the column starts off until the user opts in. */
117
+ toggleable?: { initiallyHidden?: true }
106
118
  /** Render array values one-per-line (each item separated by `<br>`).
107
119
  * Composes with `bulleted()` — when both are set, `bulleted()` wins
108
120
  * and the renderer mounts a `<ul>` with bullet markers instead. */
@@ -222,6 +234,11 @@ export class Column extends Element {
222
234
  protected _richText?: ColumnRichTextKind
223
235
  protected _sanitize: boolean | SanitizeConfig = true
224
236
 
237
+ // User-toggleable column visibility — `Table.toggleColumns()` opt-in
238
+ // chrome reads this and stamps the toolbar dropdown. State persists
239
+ // per-table to localStorage so the user's choice sticks across loads.
240
+ protected _toggleable: false | ColumnToggleableConfig = false
241
+
225
242
  // ─── Editable cell columns (TextInput / Toggle / Select) ───
226
243
  // Per-cell PATCH validators — same shape as Field validators. Only
227
244
  // consulted when the column is editable (the route handler reads
@@ -249,6 +266,40 @@ export class Column extends Element {
249
266
  sortable(v = true): this { this._sortable = v; return this }
250
267
  searchable(v = true): this { this._searchable = v; return this }
251
268
 
269
+ /**
270
+ * Let the user show / hide this column from the table toolbar's
271
+ * "Columns" dropdown. Preference persists per-table to localStorage
272
+ * under `pilotiq.table.<currentPath>.columns.<col>` so the choice
273
+ * sticks across reloads + SPA navigations.
274
+ *
275
+ * Pass `{ initiallyHidden: true }` to start the column off-screen —
276
+ * useful for technical / debug columns the user opts into.
277
+ *
278
+ * Column.make('email').toggleable()
279
+ * Column.make('internalId').toggleable({ initiallyHidden: true })
280
+ * Column.make('name').toggleable(false) // explicit opt-out
281
+ *
282
+ * Any non-toggleable column always renders. Hidden state is purely
283
+ * presentational — the column's data still loads from the server (so
284
+ * sorts / filters that reference it keep working, and a re-toggle
285
+ * shows fresh values without a roundtrip).
286
+ */
287
+ toggleable(opts: boolean | ColumnToggleableConfig = true): this {
288
+ if (opts === false) {
289
+ this._toggleable = false
290
+ } else if (opts === true) {
291
+ this._toggleable = {}
292
+ } else {
293
+ this._toggleable = { ...opts }
294
+ }
295
+ return this
296
+ }
297
+
298
+ isToggleable(): boolean { return this._toggleable !== false }
299
+ getToggleableConfig(): ColumnToggleableConfig | undefined {
300
+ return this._toggleable === false ? undefined : this._toggleable
301
+ }
302
+
252
303
  // ─── Layout ───────────────────────────────────────────
253
304
 
254
305
  alignment(a: ColumnAlignment): this { this._alignment = a; return this }
@@ -631,6 +682,9 @@ export class Column extends Element {
631
682
  if (this._format !== undefined) meta.format = this._format
632
683
  if (this._formatState !== undefined) meta.hasFormatter = true
633
684
  if (this._summarizers.length > 0) meta.summaries = this._summarizers.map(s => s.toMeta())
685
+ if (this._toggleable !== false) {
686
+ meta.toggleable = this._toggleable.initiallyHidden ? { initiallyHidden: true } : {}
687
+ }
634
688
  if (this._listWithLineBreaks) meta.listWithLineBreaks = true
635
689
  if (this._bulleted) meta.bulleted = true
636
690
  if (this._copyMessage !== undefined) meta.copyMessage = this._copyMessage
package/src/Page.ts CHANGED
@@ -7,9 +7,11 @@ import { type IconValue, serializeIcon } from './icons/types.js'
7
7
  /**
8
8
  * Discriminator the framework uses for default rendering, route generation,
9
9
  * and breadcrumbs. `'custom'` is for standalone Pages that don't belong to
10
- * a Resource. The other modes correspond to the four resource page roles.
10
+ * a Resource. `'record'` is for record-scoped sub-pages declared under a
11
+ * Resource's `pages().record` map. The other four modes correspond to the
12
+ * standard resource page roles.
11
13
  */
12
- export type PageMode = 'list' | 'create' | 'edit' | 'view' | 'custom'
14
+ export type PageMode = 'list' | 'create' | 'edit' | 'view' | 'record' | 'custom'
13
15
 
14
16
  export interface PageMeta {
15
17
  slug: string
@@ -108,8 +110,15 @@ export class Page {
108
110
  /** Plan #10: authorization. Custom pages get a single `canAccess` gate
109
111
  * (no per-record predicates — pages are too freeform to assume a
110
112
  * record concept). Resource-bound default page subclasses can still
111
- * read their owning resource's predicates via `getResource()`. */
112
- static async canAccess(_user: unknown): Promise<boolean> { return true }
113
+ * read their owning resource's predicates via `getResource()`.
114
+ *
115
+ * Record sub-pages (declared under `ResourcePages.record`) receive
116
+ * the loaded parent record as the second argument so subclasses can
117
+ * gate on record state in addition to user. The parameter is
118
+ * optional so existing custom-page subclasses with `canAccess(user)`
119
+ * keep type-checking. Record-aware sub-pages typically override as
120
+ * `canAccess(user, record)`. */
121
+ static async canAccess(_user: unknown, _record?: unknown): Promise<boolean> { return true }
113
122
 
114
123
  /**
115
124
  * Optional back-reference to the owning Resource. Auto-generated default
package/src/Pilotiq.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type * as React from 'react'
1
2
  import type { Router } from '@rudderjs/router'
2
3
  import type { ResourceClass } from './Resource.js'
3
4
  import type { GlobalClass } from './Global.js'
@@ -228,10 +229,46 @@ export interface PilotiqConfig {
228
229
  * absent and the chrome doesn't mount.
229
230
  */
230
231
  rightPanels?: RightPanelContribution[]
232
+ /**
233
+ * Layout-level provider components registered via
234
+ * `Pilotiq.layoutProvider(C)` / `Pilotiq.layoutProviders([…])`. Plugins
235
+ * register React providers (e.g. an AI chat queue context, a tenant
236
+ * theme switcher) that wrap the panel's `<AppShell>` children — so
237
+ * the providers are in scope for every page in the panel, not just
238
+ * specific component slots. Order matters: the first registered
239
+ * provider sits closest to the root (outermost wrap); the last sits
240
+ * closest to the page tree (innermost wrap).
241
+ */
242
+ layoutProviders?: LayoutProviderComponent[]
243
+ /**
244
+ * AI suggestion mode — controls what happens when an AI agent calls a
245
+ * write tool against a form field.
246
+ *
247
+ * - `'auto'` (default): the write applies immediately to the form state.
248
+ * Existing behavior — agents take effect as soon as the tool returns.
249
+ * - `'review'`: the write is staged as a `PendingSuggestion` and the
250
+ * field shows an inline diff (text fields) or current → suggested
251
+ * comparison (other types) with Approve / Reject buttons. Approve
252
+ * runs the field's registered applier; Reject discards.
253
+ *
254
+ * VS Code-style review flow. Plan: `docs/plans/ai-review-mode.md`.
255
+ */
256
+ aiSuggestionsMode?: 'auto' | 'review'
231
257
  /** @internal Runtime theme overrides from DB. */
232
258
  _themeOverrides?: Partial<ThemeConfig>
233
259
  }
234
260
 
261
+ /**
262
+ * Shape a layout-provider component must implement. Receives the
263
+ * standard layout context (`basePath`, panel children) so providers can
264
+ * thread panel-aware values into their context — e.g. an AI chat
265
+ * provider needs `basePath` to know where to POST chat requests.
266
+ */
267
+ export type LayoutProviderComponent = React.ComponentType<{
268
+ children: React.ReactNode
269
+ basePath?: string
270
+ }>
271
+
235
272
  export class Pilotiq {
236
273
  private config: PilotiqConfig
237
274
  private installedPlugins: PilotiqPlugin[] = []
@@ -688,6 +725,78 @@ export class Pilotiq {
688
725
  return this.config.rightPanels ?? []
689
726
  }
690
727
 
728
+ /**
729
+ * Register a component that wraps the panel's `<AppShell>` children at
730
+ * the layout root. Plugins use this to mount React providers (AI chat
731
+ * queue context, tenant theme switcher, feature-flag overlay, …) so
732
+ * they're in scope for every page in the panel without consumers
733
+ * having to manually wrap their `+Layout.tsx`.
734
+ *
735
+ * Adapter packages typically call this from inside their plugin's
736
+ * `register(panel)` so consumers wire everything via `.plugins([…])`.
737
+ *
738
+ * Provider components receive `{ children, basePath? }` props.
739
+ * Registration order is preservation order: the first registered
740
+ * provider sits OUTERMOST (closest to the layout root); the last sits
741
+ * INNERMOST (closest to the page tree). When two providers depend on
742
+ * each other, register the producer first.
743
+ *
744
+ * @example
745
+ * ```ts
746
+ * // In a plugin's register(panel):
747
+ * panel.layoutProvider(({ children, basePath }) =>
748
+ * <AiUiProvider panelPath={basePath}>{children}</AiUiProvider>
749
+ * )
750
+ * ```
751
+ *
752
+ * @throws when `provider` isn't a function (component).
753
+ */
754
+ layoutProvider(provider: LayoutProviderComponent): this {
755
+ if (typeof provider !== 'function') {
756
+ throw new Error(
757
+ `[Pilotiq] layoutProvider: expected a React component, got ${typeof provider}.`,
758
+ )
759
+ }
760
+ const existing = this.config.layoutProviders ?? []
761
+ this.config.layoutProviders = [...existing, provider]
762
+ return this
763
+ }
764
+
765
+ /**
766
+ * Bulk variant of {@link layoutProvider}. Registers each provider in
767
+ * array order.
768
+ */
769
+ layoutProviders(list: LayoutProviderComponent[]): this {
770
+ for (const c of list) this.layoutProvider(c)
771
+ return this
772
+ }
773
+
774
+ /** @internal — read by the Vite plugin's `_components.ts` emitter. */
775
+ getLayoutProviders(): readonly LayoutProviderComponent[] {
776
+ return this.config.layoutProviders ?? []
777
+ }
778
+
779
+ /**
780
+ * Set the panel-wide AI suggestion mode.
781
+ *
782
+ * - `'auto'` (default) — agent writes apply immediately.
783
+ * - `'review'` — agent writes stage as `PendingSuggestion`s; the user
784
+ * approves/rejects via inline diff (text) or value-comparison panel
785
+ * (non-text). Reuses the Phase 8.5 applier registry on approve.
786
+ *
787
+ * Plan: `docs/plans/ai-review-mode.md`.
788
+ */
789
+ aiSuggestionsMode(mode: 'auto' | 'review'): this {
790
+ this.config.aiSuggestionsMode = mode
791
+ return this
792
+ }
793
+
794
+ /** @internal — read by `panelInfo()` and stamped onto the wire shape so
795
+ * the AI client tool knows which branch (apply vs queue) to take. */
796
+ getAiSuggestionsMode(): 'auto' | 'review' {
797
+ return this.config.aiSuggestionsMode ?? 'auto'
798
+ }
799
+
691
800
  /** @internal */
692
801
  enableThemeEditor(): void {
693
802
  this.config.themeEditor = true
package/src/Resource.ts CHANGED
@@ -16,6 +16,25 @@ export interface ResourcePages {
16
16
  create?: typeof Page
17
17
  edit?: typeof Page
18
18
  view?: typeof Page
19
+ /**
20
+ * Record-scoped custom sub-pages. Each entry is a `Page` subclass
21
+ * mounted at `${resourceBase}/${slug}/:id/${subPageSlug}`. Tabs show
22
+ * up in the `RelationTabs` sub-nav strip between the `__edit` tab
23
+ * and the relation-manager tabs.
24
+ *
25
+ * Sub-page slugs are validated at panel boot:
26
+ * - Must match `[A-Za-z0-9_-]+`.
27
+ * - Must not collide with reserved tokens (`edit`, `delete`,
28
+ * `restore`, `force-delete`, `_form`, `_action`, `_search`,
29
+ * `_uploads`, `_attach`, `_detach`, `_bulk-detach`, `create`).
30
+ * - Must not collide with any `RelationManager.relationship` on
31
+ * the same resource.
32
+ *
33
+ * Each sub-page receives the loaded record in `ctx.record` and runs
34
+ * its own `Page.canAccess(user, record)` gate after the parent
35
+ * resource's `canAccess` + `canView` predicates have passed.
36
+ */
37
+ record?: Record<string, typeof Page>
19
38
  }
20
39
 
21
40
  /** Pill color tokens for `navigationBadgeColor`. Matches the shared color
@@ -406,6 +425,16 @@ export abstract class Resource {
406
425
  return { ...defaults, ...overrides }
407
426
  }
408
427
 
428
+ /**
429
+ * Sugar over `resolvePages().record ?? {}` for callers that only need
430
+ * the record-scoped sub-pages (route registration, tab insertion, boot
431
+ * validation). Returns an empty object when no record sub-pages are
432
+ * declared so callers can iterate without a defensive null check.
433
+ */
434
+ static getRecordPages(): Record<string, typeof Page> {
435
+ return this.resolvePages().record ?? {}
436
+ }
437
+
409
438
  /**
410
439
  * Plan #11 — relation managers mounted under this resource's edit /
411
440
  * view pages. Each entry is a `RelationManager` subclass; routes are
@@ -157,7 +157,7 @@ function buildTableCtxFromQuery(
157
157
 
158
158
  const tableFilters = table.getFilters?.() ?? []
159
159
  const filterValues: Record<string, string> = {}
160
- const reserved = new Set(['search', 'sort', 'page', 'perPage', 'group'])
160
+ const reserved = new Set(['search', 'sort', 'page', 'perPage', 'group', 'groupKey'])
161
161
  for (const f of tableFilters) {
162
162
  const name = f.name as string
163
163
  if (reserved.has(name)) continue