@pilotiq/pilotiq 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +142 -0
- package/CLAUDE.md +59 -3
- package/dist/Pilotiq.d.ts +83 -0
- package/dist/Pilotiq.d.ts.map +1 -1
- package/dist/Pilotiq.js +39 -0
- package/dist/Pilotiq.js.map +1 -1
- package/dist/actions/Action.d.ts +27 -99
- package/dist/actions/Action.d.ts.map +1 -1
- package/dist/actions/Action.js +52 -754
- package/dist/actions/Action.js.map +1 -1
- package/dist/actions/bulkFactories.d.ts +46 -0
- package/dist/actions/bulkFactories.d.ts.map +1 -0
- package/dist/actions/bulkFactories.js +144 -0
- package/dist/actions/bulkFactories.js.map +1 -0
- package/dist/actions/crudFactories.d.ts +94 -0
- package/dist/actions/crudFactories.d.ts.map +1 -0
- package/dist/actions/crudFactories.js +209 -0
- package/dist/actions/crudFactories.js.map +1 -0
- package/dist/actions/factoryHelpers.d.ts +108 -0
- package/dist/actions/factoryHelpers.d.ts.map +1 -0
- package/dist/actions/factoryHelpers.js +138 -0
- package/dist/actions/factoryHelpers.js.map +1 -0
- package/dist/actions/m2mFactories.d.ts +47 -0
- package/dist/actions/m2mFactories.d.ts.map +1 -0
- package/dist/actions/m2mFactories.js +173 -0
- package/dist/actions/m2mFactories.js.map +1 -0
- package/dist/actions/relationFactories.d.ts +93 -0
- package/dist/actions/relationFactories.d.ts.map +1 -0
- package/dist/actions/relationFactories.js +321 -0
- package/dist/actions/relationFactories.js.map +1 -0
- package/dist/elements/dispatchForm.js +1 -1
- package/dist/elements/dispatchForm.js.map +1 -1
- package/dist/elements/dispatchTable.js +1 -1
- package/dist/elements/dispatchTable.js.map +1 -1
- package/dist/fields/Field.d.ts +31 -0
- package/dist/fields/Field.d.ts.map +1 -1
- package/dist/fields/Field.js +25 -0
- package/dist/fields/Field.js.map +1 -1
- package/dist/pageData/breadcrumbs.d.ts +42 -0
- package/dist/pageData/breadcrumbs.d.ts.map +1 -0
- package/dist/pageData/breadcrumbs.js +172 -0
- package/dist/pageData/breadcrumbs.js.map +1 -0
- package/dist/pageData/forms.d.ts +137 -0
- package/dist/pageData/forms.d.ts.map +1 -0
- package/dist/pageData/forms.js +427 -0
- package/dist/pageData/forms.js.map +1 -0
- package/dist/pageData/helpers.d.ts +239 -0
- package/dist/pageData/helpers.d.ts.map +1 -0
- package/dist/pageData/helpers.js +703 -0
- package/dist/pageData/helpers.js.map +1 -0
- package/dist/pageData/misc.d.ts +76 -0
- package/dist/pageData/misc.d.ts.map +1 -0
- package/dist/pageData/misc.js +263 -0
- package/dist/pageData/misc.js.map +1 -0
- package/dist/pageData/navigation.d.ts +292 -0
- package/dist/pageData/navigation.d.ts.map +1 -0
- package/dist/pageData/navigation.js +591 -0
- package/dist/pageData/navigation.js.map +1 -0
- package/dist/pageData/relationPages.d.ts +172 -0
- package/dist/pageData/relationPages.d.ts.map +1 -0
- package/dist/pageData/relationPages.js +867 -0
- package/dist/pageData/relationPages.js.map +1 -0
- package/dist/pageData/relationTabs.d.ts +65 -0
- package/dist/pageData/relationTabs.d.ts.map +1 -0
- package/dist/pageData/relationTabs.js +258 -0
- package/dist/pageData/relationTabs.js.map +1 -0
- package/dist/pageData/resourcePages.d.ts +48 -0
- package/dist/pageData/resourcePages.d.ts.map +1 -0
- package/dist/pageData/resourcePages.js +504 -0
- package/dist/pageData/resourcePages.js.map +1 -0
- package/dist/pageData.d.ts +12 -792
- package/dist/pageData.d.ts.map +1 -1
- package/dist/pageData.js +24 -3797
- package/dist/pageData.js.map +1 -1
- package/dist/react/AppShell.d.ts +8 -0
- package/dist/react/AppShell.d.ts.map +1 -1
- package/dist/react/AppShell.js +11 -1
- package/dist/react/AppShell.js.map +1 -1
- package/dist/react/CollabExtensionFactoryRegistry.d.ts +47 -0
- package/dist/react/CollabExtensionFactoryRegistry.d.ts.map +1 -0
- package/dist/react/CollabExtensionFactoryRegistry.js +14 -0
- package/dist/react/CollabExtensionFactoryRegistry.js.map +1 -0
- package/dist/react/CollabRoomContext.d.ts +37 -0
- package/dist/react/CollabRoomContext.d.ts.map +1 -0
- package/dist/react/CollabRoomContext.js +12 -0
- package/dist/react/CollabRoomContext.js.map +1 -0
- package/dist/react/FormCollabBindingRegistry.d.ts +62 -0
- package/dist/react/FormCollabBindingRegistry.d.ts.map +1 -0
- package/dist/react/FormCollabBindingRegistry.js +14 -0
- package/dist/react/FormCollabBindingRegistry.js.map +1 -0
- package/dist/react/RecordWrapperGate.d.ts +25 -0
- package/dist/react/RecordWrapperGate.d.ts.map +1 -0
- package/dist/react/RecordWrapperGate.js +30 -0
- package/dist/react/RecordWrapperGate.js.map +1 -0
- package/dist/react/RecordWrapperRegistry.d.ts +31 -0
- package/dist/react/RecordWrapperRegistry.d.ts.map +1 -0
- package/dist/react/RecordWrapperRegistry.js +15 -0
- package/dist/react/RecordWrapperRegistry.js.map +1 -0
- package/dist/react/SchemaRenderer.d.ts +17 -23
- package/dist/react/SchemaRenderer.d.ts.map +1 -1
- package/dist/react/SchemaRenderer.js +71 -3647
- package/dist/react/SchemaRenderer.js.map +1 -1
- package/dist/react/component-slots.d.ts +103 -0
- package/dist/react/component-slots.d.ts.map +1 -0
- package/dist/react/component-slots.js +18 -0
- package/dist/react/component-slots.js.map +1 -0
- package/dist/react/fields/BuilderInput.d.ts.map +1 -1
- package/dist/react/fields/BuilderInput.js +21 -117
- package/dist/react/fields/BuilderInput.js.map +1 -1
- package/dist/react/fields/MarkdownInput.d.ts.map +1 -1
- package/dist/react/fields/MarkdownInput.js +1 -3
- package/dist/react/fields/MarkdownInput.js.map +1 -1
- package/dist/react/fields/RepeaterInput.d.ts.map +1 -1
- package/dist/react/fields/RepeaterInput.js +22 -127
- package/dist/react/fields/RepeaterInput.js.map +1 -1
- package/dist/react/fields/rowState.d.ts +40 -0
- package/dist/react/fields/rowState.d.ts.map +1 -0
- package/dist/react/fields/rowState.js +60 -0
- package/dist/react/fields/rowState.js.map +1 -0
- package/dist/react/fields/useRowReorderDnd.d.ts +28 -0
- package/dist/react/fields/useRowReorderDnd.d.ts.map +1 -0
- package/dist/react/fields/useRowReorderDnd.js +51 -0
- package/dist/react/fields/useRowReorderDnd.js.map +1 -0
- package/dist/react/index.d.ts +9 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +8 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/layouts/SidebarLayout.d.ts +1 -1
- package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/react/layouts/SidebarLayout.js +10 -2
- package/dist/react/layouts/SidebarLayout.js.map +1 -1
- package/dist/react/layouts/TopbarLayout.d.ts +1 -1
- package/dist/react/layouts/TopbarLayout.d.ts.map +1 -1
- package/dist/react/layouts/TopbarLayout.js +19 -11
- package/dist/react/layouts/TopbarLayout.js.map +1 -1
- package/dist/react/parseRecordEditUrl.d.ts +29 -0
- package/dist/react/parseRecordEditUrl.d.ts.map +1 -0
- package/dist/react/parseRecordEditUrl.js +25 -0
- package/dist/react/parseRecordEditUrl.js.map +1 -0
- package/dist/react/persistedState.d.ts +19 -0
- package/dist/react/persistedState.d.ts.map +1 -0
- package/dist/react/persistedState.js +51 -0
- package/dist/react/persistedState.js.map +1 -0
- package/dist/react/schemaRenderer/AlertRenderer.d.ts +12 -0
- package/dist/react/schemaRenderer/AlertRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/AlertRenderer.js +61 -0
- package/dist/react/schemaRenderer/AlertRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/EntryRenderer.d.ts +13 -0
- package/dist/react/schemaRenderer/EntryRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/EntryRenderer.js +277 -0
- package/dist/react/schemaRenderer/EntryRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/SectionRenderer.d.ts +16 -0
- package/dist/react/schemaRenderer/SectionRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/SectionRenderer.js +62 -0
- package/dist/react/schemaRenderer/SectionRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/SimpleElements.d.ts +25 -0
- package/dist/react/schemaRenderer/SimpleElements.d.ts.map +1 -0
- package/dist/react/schemaRenderer/SimpleElements.js +147 -0
- package/dist/react/schemaRenderer/SimpleElements.js.map +1 -0
- package/dist/react/schemaRenderer/TabsRenderer.d.ts +17 -0
- package/dist/react/schemaRenderer/TabsRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/TabsRenderer.js +31 -0
- package/dist/react/schemaRenderer/TabsRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/WizardRenderer.d.ts +34 -0
- package/dist/react/schemaRenderer/WizardRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/WizardRenderer.js +208 -0
- package/dist/react/schemaRenderer/WizardRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts +21 -0
- package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/ActionGroupTrigger.js +82 -0
- package/dist/react/schemaRenderer/action/ActionGroupTrigger.js.map +1 -0
- package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts +30 -0
- package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/ActionModalDialog.js +182 -0
- package/dist/react/schemaRenderer/action/ActionModalDialog.js.map +1 -0
- package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts +17 -0
- package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/ConfirmActionDialog.js +19 -0
- package/dist/react/schemaRenderer/action/ConfirmActionDialog.js.map +1 -0
- package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts +16 -0
- package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/HandlerActionButton.js +16 -0
- package/dist/react/schemaRenderer/action/HandlerActionButton.js.map +1 -0
- package/dist/react/schemaRenderer/action/MethodActionButton.d.ts +22 -0
- package/dist/react/schemaRenderer/action/MethodActionButton.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/MethodActionButton.js +26 -0
- package/dist/react/schemaRenderer/action/MethodActionButton.js.map +1 -0
- package/dist/react/schemaRenderer/action/buttons.d.ts +18 -0
- package/dist/react/schemaRenderer/action/buttons.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/buttons.js +74 -0
- package/dist/react/schemaRenderer/action/buttons.js.map +1 -0
- package/dist/react/schemaRenderer/action/helpers.d.ts +26 -0
- package/dist/react/schemaRenderer/action/helpers.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/helpers.js +126 -0
- package/dist/react/schemaRenderer/action/helpers.js.map +1 -0
- package/dist/react/schemaRenderer/action/renderAction.d.ts +21 -0
- package/dist/react/schemaRenderer/action/renderAction.d.ts.map +1 -0
- package/dist/react/schemaRenderer/action/renderAction.js +102 -0
- package/dist/react/schemaRenderer/action/renderAction.js.map +1 -0
- package/dist/react/schemaRenderer/columnFormat.d.ts +10 -0
- package/dist/react/schemaRenderer/columnFormat.d.ts.map +1 -0
- package/dist/react/schemaRenderer/columnFormat.js +76 -0
- package/dist/react/schemaRenderer/columnFormat.js.map +1 -0
- package/dist/react/schemaRenderer/constants.d.ts +8 -0
- package/dist/react/schemaRenderer/constants.d.ts.map +1 -0
- package/dist/react/schemaRenderer/constants.js +45 -0
- package/dist/react/schemaRenderer/constants.js.map +1 -0
- package/dist/react/schemaRenderer/form/FormRenderer.d.ts +29 -0
- package/dist/react/schemaRenderer/form/FormRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/form/FormRenderer.js +152 -0
- package/dist/react/schemaRenderer/form/FormRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/form/renderField.d.ts +6 -0
- package/dist/react/schemaRenderer/form/renderField.d.ts.map +1 -0
- package/dist/react/schemaRenderer/form/renderField.js +239 -0
- package/dist/react/schemaRenderer/form/renderField.js.map +1 -0
- package/dist/react/schemaRenderer/helpers.d.ts +32 -0
- package/dist/react/schemaRenderer/helpers.d.ts.map +1 -0
- package/dist/react/schemaRenderer/helpers.js +52 -0
- package/dist/react/schemaRenderer/helpers.js.map +1 -0
- package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts +60 -0
- package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/CardsLayoutBody.js +189 -0
- package/dist/react/schemaRenderer/table/CardsLayoutBody.js.map +1 -0
- package/dist/react/schemaRenderer/table/TableRenderer.d.ts +29 -0
- package/dist/react/schemaRenderer/table/TableRenderer.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/TableRenderer.js +85 -0
- package/dist/react/schemaRenderer/table/TableRenderer.js.map +1 -0
- package/dist/react/schemaRenderer/table/TableRendererBody.d.ts +18 -0
- package/dist/react/schemaRenderer/table/TableRendererBody.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/TableRendererBody.js +555 -0
- package/dist/react/schemaRenderer/table/TableRendererBody.js.map +1 -0
- package/dist/react/schemaRenderer/table/filters.d.ts +263 -0
- package/dist/react/schemaRenderer/table/filters.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/filters.js +497 -0
- package/dist/react/schemaRenderer/table/filters.js.map +1 -0
- package/dist/react/schemaRenderer/table/formatCell.d.ts +11 -0
- package/dist/react/schemaRenderer/table/formatCell.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/formatCell.js +172 -0
- package/dist/react/schemaRenderer/table/formatCell.js.map +1 -0
- package/dist/react/schemaRenderer/table/links.d.ts +42 -0
- package/dist/react/schemaRenderer/table/links.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/links.js +55 -0
- package/dist/react/schemaRenderer/table/links.js.map +1 -0
- package/dist/react/schemaRenderer/table/renderRowActions.d.ts +13 -0
- package/dist/react/schemaRenderer/table/renderRowActions.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/renderRowActions.js +25 -0
- package/dist/react/schemaRenderer/table/renderRowActions.js.map +1 -0
- package/dist/react/schemaRenderer/table/url.d.ts +41 -0
- package/dist/react/schemaRenderer/table/url.d.ts.map +1 -0
- package/dist/react/schemaRenderer/table/url.js +114 -0
- package/dist/react/schemaRenderer/table/url.js.map +1 -0
- package/dist/routes/globals.d.ts +13 -0
- package/dist/routes/globals.d.ts.map +1 -0
- package/dist/routes/globals.js +131 -0
- package/dist/routes/globals.js.map +1 -0
- package/dist/routes/helpers.d.ts +217 -0
- package/dist/routes/helpers.d.ts.map +1 -0
- package/dist/routes/helpers.js +498 -0
- package/dist/routes/helpers.js.map +1 -0
- package/dist/routes/pages.d.ts +15 -0
- package/dist/routes/pages.d.ts.map +1 -0
- package/dist/routes/pages.js +145 -0
- package/dist/routes/pages.js.map +1 -0
- package/dist/routes/panel.d.ts +19 -0
- package/dist/routes/panel.d.ts.map +1 -0
- package/dist/routes/panel.js +191 -0
- package/dist/routes/panel.js.map +1 -0
- package/dist/routes/relations.d.ts +21 -0
- package/dist/routes/relations.d.ts.map +1 -0
- package/dist/routes/relations.js +1239 -0
- package/dist/routes/relations.js.map +1 -0
- package/dist/routes/resources.d.ts +28 -0
- package/dist/routes/resources.d.ts.map +1 -0
- package/dist/routes/resources.js +741 -0
- package/dist/routes/resources.js.map +1 -0
- package/dist/routes/theme.d.ts +12 -0
- package/dist/routes/theme.d.ts.map +1 -0
- package/dist/routes/theme.js +82 -0
- package/dist/routes/theme.js.map +1 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +64 -3078
- package/dist/routes.js.map +1 -1
- package/dist/vite.d.ts +1 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +26 -5
- package/dist/vite.js.map +1 -1
- package/package.json +2 -1
- package/src/Pilotiq.ts +95 -0
- package/src/actions/Action.ts +79 -723
- package/src/actions/bulkFactories.ts +168 -0
- package/src/actions/crudFactories.ts +220 -0
- package/src/actions/factoryHelpers.ts +177 -0
- package/src/actions/m2mFactories.ts +193 -0
- package/src/actions/relationFactories.ts +372 -0
- package/src/elements/dispatchForm.ts +1 -1
- package/src/elements/dispatchTable.ts +1 -1
- package/src/fields/Field.ts +39 -0
- package/src/pageData/breadcrumbs.ts +288 -0
- package/src/pageData/forms.ts +578 -0
- package/src/pageData/helpers.ts +764 -0
- package/src/pageData/misc.ts +347 -0
- package/src/pageData/navigation.ts +779 -0
- package/src/pageData/relationPages.ts +1246 -0
- package/src/pageData/relationTabs.ts +286 -0
- package/src/pageData/resourcePages.ts +593 -0
- package/src/pageData.ts +122 -4731
- package/src/react/AppShell.tsx +27 -1
- package/src/react/CollabExtensionFactoryRegistry.ts +55 -0
- package/src/react/CollabRoomContext.ts +42 -0
- package/src/react/FormCollabBindingRegistry.ts +72 -0
- package/src/react/RecordWrapperGate.tsx +40 -0
- package/src/react/RecordWrapperRegistry.ts +39 -0
- package/src/react/SchemaRenderer.tsx +230 -6479
- package/src/react/component-slots.test.ts +103 -0
- package/src/react/component-slots.ts +116 -0
- package/src/react/fields/BuilderInput.tsx +29 -117
- package/src/react/fields/MarkdownInput.tsx +0 -1
- package/src/react/fields/RepeaterInput.tsx +29 -130
- package/src/react/fields/rowState.ts +106 -0
- package/src/react/fields/useRowReorderDnd.ts +78 -0
- package/src/react/index.ts +38 -0
- package/src/react/layouts/SidebarLayout.tsx +39 -28
- package/src/react/layouts/TopbarLayout.tsx +70 -57
- package/src/react/parseRecordEditUrl.test.ts +75 -0
- package/src/react/parseRecordEditUrl.ts +55 -0
- package/src/react/persistedState.ts +40 -0
- package/src/react/schemaRenderer/AlertRenderer.tsx +112 -0
- package/src/react/schemaRenderer/EntryRenderer.tsx +501 -0
- package/src/react/schemaRenderer/SectionRenderer.tsx +120 -0
- package/src/react/schemaRenderer/SimpleElements.tsx +306 -0
- package/src/react/schemaRenderer/TabsRenderer.tsx +62 -0
- package/src/react/schemaRenderer/WizardRenderer.tsx +338 -0
- package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +177 -0
- package/src/react/schemaRenderer/action/ActionModalDialog.tsx +273 -0
- package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +61 -0
- package/src/react/schemaRenderer/action/HandlerActionButton.tsx +43 -0
- package/src/react/schemaRenderer/action/MethodActionButton.tsx +64 -0
- package/src/react/schemaRenderer/action/buttons.tsx +99 -0
- package/src/react/schemaRenderer/action/helpers.ts +140 -0
- package/src/react/schemaRenderer/action/renderAction.tsx +245 -0
- package/src/react/schemaRenderer/columnFormat.ts +65 -0
- package/src/react/schemaRenderer/constants.ts +50 -0
- package/src/react/schemaRenderer/form/FormRenderer.tsx +233 -0
- package/src/react/schemaRenderer/form/renderField.tsx +511 -0
- package/src/react/schemaRenderer/helpers.tsx +81 -0
- package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +308 -0
- package/src/react/schemaRenderer/table/TableRenderer.tsx +123 -0
- package/src/react/schemaRenderer/table/TableRendererBody.tsx +974 -0
- package/src/react/schemaRenderer/table/filters.tsx +1233 -0
- package/src/react/schemaRenderer/table/formatCell.tsx +264 -0
- package/src/react/schemaRenderer/table/links.tsx +112 -0
- package/src/react/schemaRenderer/table/renderRowActions.tsx +52 -0
- package/src/react/schemaRenderer/table/url.tsx +143 -0
- package/src/routes/globals.ts +154 -0
- package/src/routes/helpers.ts +668 -0
- package/src/routes/pages.ts +173 -0
- package/src/routes/panel.ts +204 -0
- package/src/routes/relations.ts +1219 -0
- package/src/routes/resources.ts +786 -0
- package/src/routes/theme.ts +109 -0
- package/src/routes.test.ts +1 -1
- package/src/routes.ts +64 -3176
- package/src/schema/TableWidget.test.ts +2 -2
- package/src/theme/migrate.test.ts +178 -0
- package/src/vite.test.ts +184 -0
- package/src/vite.ts +26 -4
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import type { Pilotiq } from '../Pilotiq.js'
|
|
2
|
+
import type { Page } from '../Page.js'
|
|
3
|
+
import { globalBasePath, pageBasePath } from '../clusterPaths.js'
|
|
4
|
+
import { Element } from '../schema/Element.js'
|
|
5
|
+
import { resolveSchema, type SchemaContext, type RenderContext } from '../schema/resolveSchema.js'
|
|
6
|
+
import { isServerDataElement, type ServerDataElement } from '../schema/ServerDataElement.js'
|
|
7
|
+
import { findForms } from '../elements/dispatchForm.js'
|
|
8
|
+
import { searchAllResources, type GlobalSearchResult } from '../search.js'
|
|
9
|
+
import { consumeFlashedNotifications } from '../notifications/flash.js'
|
|
10
|
+
import { serializeIcon } from '../icons/types.js'
|
|
11
|
+
import { pageHooksFor } from '../applyPageHooks.js'
|
|
12
|
+
import type { RenderHookMap } from '../RenderHook.js'
|
|
13
|
+
import {
|
|
14
|
+
customPageBreadcrumbs,
|
|
15
|
+
globalBreadcrumbs,
|
|
16
|
+
} from './breadcrumbs.js'
|
|
17
|
+
import {
|
|
18
|
+
applyFillPipeline,
|
|
19
|
+
callPageSchema,
|
|
20
|
+
resolveServerDataElements,
|
|
21
|
+
tagActionDispatch,
|
|
22
|
+
tagFormActions,
|
|
23
|
+
tagFormSubresourceUrls,
|
|
24
|
+
tagWidgetUrls,
|
|
25
|
+
uploadCtx,
|
|
26
|
+
userCtx,
|
|
27
|
+
} from './helpers.js'
|
|
28
|
+
import { applyRoleHooks, panelInfo, resolvePageHooks, type PanelInfoRoute } from './navigation.js'
|
|
29
|
+
|
|
30
|
+
// ─── Misc page builders ─────────────────────────────────────
|
|
31
|
+
//
|
|
32
|
+
// Global edit/view, custom page, widget polling, global search. All
|
|
33
|
+
// take a `Pilotiq` instance + a tag (slug / pageSlug / query) and
|
|
34
|
+
// return the wire-shape envelope for their respective routes.
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
export async function globalEditData(
|
|
40
|
+
pilotiq: Pilotiq,
|
|
41
|
+
slug: string,
|
|
42
|
+
prefill?: { values?: Record<string, unknown>; errors?: Record<string, string[]> },
|
|
43
|
+
req?: unknown,
|
|
44
|
+
): Promise<Record<string, unknown> | null> {
|
|
45
|
+
const cfg = pilotiq.getConfig()
|
|
46
|
+
const G = cfg.globals.find(g => g.getSlug() === slug)
|
|
47
|
+
if (!G) return null
|
|
48
|
+
const pages = G.resolvePages()
|
|
49
|
+
if (!pages.edit) return null
|
|
50
|
+
const PageClass = pages.edit
|
|
51
|
+
|
|
52
|
+
const editUrl = globalBasePath(cfg.path, G)
|
|
53
|
+
const user = await pilotiq.resolveUser(req)
|
|
54
|
+
const ctx: SchemaContext = uploadCtx(userCtx({ mode: 'edit', basePath: cfg.path }, user), cfg)
|
|
55
|
+
const elements = await callPageSchema(PageClass, ctx)
|
|
56
|
+
tagFormActions(elements, editUrl)
|
|
57
|
+
tagFormSubresourceUrls(elements, editUrl)
|
|
58
|
+
|
|
59
|
+
const form = findForms(elements)[0]
|
|
60
|
+
let record: unknown = undefined
|
|
61
|
+
if (form?.getLoadRecord()) {
|
|
62
|
+
try { record = await form.getLoadRecord()!('', { values: prefill?.values ?? {} }) } catch { /* ignore */ }
|
|
63
|
+
if (!prefill?.values && record != null) {
|
|
64
|
+
const values = await applyFillPipeline(form, record)
|
|
65
|
+
form.withValues(values)
|
|
66
|
+
} else if (prefill?.values) {
|
|
67
|
+
form.withValues(prefill.values)
|
|
68
|
+
}
|
|
69
|
+
if (prefill?.errors) form.withErrors(prefill.errors)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const breadcrumbs = globalBreadcrumbs(cfg, G)
|
|
73
|
+
if (breadcrumbs) elements.unshift(breadcrumbs)
|
|
74
|
+
|
|
75
|
+
const globalEditRoute: PanelInfoRoute = { global: G, page: PageClass }
|
|
76
|
+
const globalEditCtx = record !== undefined ? { ...ctx, record } : ctx
|
|
77
|
+
const [panel, schemaData] = await Promise.all([
|
|
78
|
+
panelInfo(pilotiq, req, globalEditRoute),
|
|
79
|
+
resolveSchema(elements, globalEditCtx).then(metas => applyRoleHooks(pilotiq, user, 'global-edit', metas, globalEditRoute)),
|
|
80
|
+
])
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
pageType: 'global',
|
|
84
|
+
panel,
|
|
85
|
+
page: PageClass.toMeta(),
|
|
86
|
+
global: { name: G.name, label: G.label, labelSingular: G.labelSingular, slug, icon: serializeIcon(G.icon, G.name) },
|
|
87
|
+
basePath: cfg.path,
|
|
88
|
+
layout: cfg.layout,
|
|
89
|
+
schemaData,
|
|
90
|
+
notifications: consumeFlashedNotifications(req),
|
|
91
|
+
...(prefill?.errors ? { hasErrors: true } : {}),
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function globalViewData(
|
|
96
|
+
pilotiq: Pilotiq,
|
|
97
|
+
slug: string,
|
|
98
|
+
req?: unknown,
|
|
99
|
+
): Promise<Record<string, unknown> | null> {
|
|
100
|
+
const cfg = pilotiq.getConfig()
|
|
101
|
+
const G = cfg.globals.find(g => g.getSlug() === slug)
|
|
102
|
+
if (!G) return null
|
|
103
|
+
const pages = G.resolvePages()
|
|
104
|
+
if (!pages.view) return null
|
|
105
|
+
const PageClass = pages.view
|
|
106
|
+
|
|
107
|
+
const user = await pilotiq.resolveUser(req)
|
|
108
|
+
const ctx: SchemaContext = uploadCtx(userCtx({ mode: 'view', basePath: cfg.path }, user), cfg)
|
|
109
|
+
const elements = await callPageSchema(PageClass, ctx)
|
|
110
|
+
|
|
111
|
+
const breadcrumbs = globalBreadcrumbs(cfg, G)
|
|
112
|
+
if (breadcrumbs) elements.unshift(breadcrumbs)
|
|
113
|
+
|
|
114
|
+
const globalViewRoute: PanelInfoRoute = { global: G, page: PageClass }
|
|
115
|
+
const [panel, schemaData] = await Promise.all([
|
|
116
|
+
panelInfo(pilotiq, req, globalViewRoute),
|
|
117
|
+
resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'global-view', metas, globalViewRoute)),
|
|
118
|
+
])
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
panel,
|
|
122
|
+
page: PageClass.toMeta(),
|
|
123
|
+
global: { name: G.name, label: G.label, labelSingular: G.labelSingular, slug, icon: serializeIcon(G.icon, G.name) },
|
|
124
|
+
basePath: cfg.path,
|
|
125
|
+
layout: cfg.layout,
|
|
126
|
+
schemaData,
|
|
127
|
+
notifications: consumeFlashedNotifications(req),
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export async function customPageData(
|
|
132
|
+
pilotiq: Pilotiq,
|
|
133
|
+
pageSlug: string,
|
|
134
|
+
req?: unknown,
|
|
135
|
+
): Promise<Record<string, unknown> | null> {
|
|
136
|
+
const cfg = pilotiq.getConfig()
|
|
137
|
+
const PageClass = cfg.pages.find(P => P.getSlug() === pageSlug)
|
|
138
|
+
if (!PageClass) return null
|
|
139
|
+
|
|
140
|
+
const pageUrl = pageBasePath(cfg.path, PageClass)
|
|
141
|
+
const user = await pilotiq.resolveUser(req)
|
|
142
|
+
const ctx: SchemaContext = uploadCtx(userCtx({}, user), cfg)
|
|
143
|
+
const elements = await callPageSchema(PageClass, ctx)
|
|
144
|
+
tagFormActions(elements, pageUrl)
|
|
145
|
+
tagFormSubresourceUrls(elements, pageUrl)
|
|
146
|
+
tagActionDispatch(elements, pageUrl)
|
|
147
|
+
// Page-scope polling URL (mirrors `${base}/${pageSlug}/_widget/:id`
|
|
148
|
+
// route registered in routes.ts).
|
|
149
|
+
tagWidgetUrls(elements, id => `${pageUrl}/_widget/${id}`)
|
|
150
|
+
const resolvedWidgets = await resolveServerDataElements(elements, ctx)
|
|
151
|
+
|
|
152
|
+
const breadcrumbs = customPageBreadcrumbs(cfg, PageClass)
|
|
153
|
+
if (breadcrumbs) elements.unshift(breadcrumbs)
|
|
154
|
+
|
|
155
|
+
const customRoute: PanelInfoRoute = { page: PageClass }
|
|
156
|
+
const [panel, schemaData] = await Promise.all([
|
|
157
|
+
panelInfo(pilotiq, req, customRoute),
|
|
158
|
+
resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'page', metas, customRoute)),
|
|
159
|
+
])
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
pageType: 'page',
|
|
163
|
+
panel,
|
|
164
|
+
page: PageClass.toMeta(),
|
|
165
|
+
schemaData,
|
|
166
|
+
_widgetData: resolvedWidgets,
|
|
167
|
+
basePath: cfg.path,
|
|
168
|
+
layout: cfg.layout,
|
|
169
|
+
notifications: consumeFlashedNotifications(req),
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ─── Plan #15 widget polling data builder ────────────────────
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Scopes the polling endpoint resolves against. Mirrors the
|
|
177
|
+
* form-state / wizard scope discriminator.
|
|
178
|
+
*
|
|
179
|
+
* panel: dashboard page (`POST {base}/_widget/:id`)
|
|
180
|
+
* page: custom page (`POST {base}/{pageSlug}/_widget/:id`)
|
|
181
|
+
* resource: list page (`POST {base}/{slug}/_widget/:id`) —
|
|
182
|
+
* resolves the resource's index `Page.schema()` so widgets
|
|
183
|
+
* from `Resource.headerSchema()` / `footerSchema()` are
|
|
184
|
+
* reachable. Auth runs `R.canAccess + R.canViewAny` in
|
|
185
|
+
* front of the per-widget visibility check.
|
|
186
|
+
*/
|
|
187
|
+
export type WidgetScope =
|
|
188
|
+
| { kind: 'panel' }
|
|
189
|
+
| { kind: 'page'; pageSlug: string }
|
|
190
|
+
| { kind: 'resource'; slug: string }
|
|
191
|
+
|
|
192
|
+
export interface WidgetRequest {
|
|
193
|
+
id: string
|
|
194
|
+
filter?: string
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export interface WidgetSuccess {
|
|
198
|
+
ok: true
|
|
199
|
+
data: unknown
|
|
200
|
+
timestamp: number
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export interface WidgetFailure {
|
|
204
|
+
ok: false
|
|
205
|
+
status: 403 | 404 | 500
|
|
206
|
+
error: string
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Plan #15 — re-resolve the active page's schema, find the widget by
|
|
211
|
+
* id, fail-closed via `evaluateVisibility`, then run
|
|
212
|
+
* `resolveServerData(ctx)` and return the payload.
|
|
213
|
+
*
|
|
214
|
+
* - 404 when the page or widget id doesn't exist.
|
|
215
|
+
* - 403 when the layout-level `visible(rule)` says the widget is
|
|
216
|
+
* hidden (server doesn't show data for hidden surfaces).
|
|
217
|
+
* - 500 when the hook itself throws.
|
|
218
|
+
*
|
|
219
|
+
* `body.filter` rides along on `RenderContext.filter` so per-chart
|
|
220
|
+
* filter dropdowns can re-fetch with the new filter value. Treated as
|
|
221
|
+
* an opaque string — widget hooks decode it however they want.
|
|
222
|
+
*/
|
|
223
|
+
export async function widgetData(
|
|
224
|
+
pilotiq: Pilotiq,
|
|
225
|
+
scope: WidgetScope,
|
|
226
|
+
body: WidgetRequest,
|
|
227
|
+
req?: unknown,
|
|
228
|
+
): Promise<WidgetSuccess | WidgetFailure> {
|
|
229
|
+
const cfg = pilotiq.getConfig()
|
|
230
|
+
const user = await pilotiq.resolveUser(req)
|
|
231
|
+
|
|
232
|
+
let elements: Element[]
|
|
233
|
+
let ctx: RenderContext
|
|
234
|
+
|
|
235
|
+
if (scope.kind === 'panel') {
|
|
236
|
+
if (!cfg.dashboardPage) return { ok: false, status: 404, error: 'No dashboard page registered' }
|
|
237
|
+
ctx = uploadCtx(userCtx({ basePath: cfg.path }, user), cfg)
|
|
238
|
+
elements = await callPageSchema(cfg.dashboardPage, ctx)
|
|
239
|
+
} else if (scope.kind === 'page') {
|
|
240
|
+
const P = cfg.pages.find(p => p.getSlug() === scope.pageSlug)
|
|
241
|
+
if (!P) return { ok: false, status: 404, error: 'Page not found' }
|
|
242
|
+
ctx = uploadCtx(userCtx({ basePath: cfg.path }, user), cfg)
|
|
243
|
+
elements = await callPageSchema(P, ctx)
|
|
244
|
+
} else {
|
|
245
|
+
// Resource-scope: re-resolve the list page's schema so widgets from
|
|
246
|
+
// `Resource.headerSchema()` / `footerSchema()` are reachable.
|
|
247
|
+
const R = cfg.resources.find(r => r.getSlug() === scope.slug)
|
|
248
|
+
if (!R) return { ok: false, status: 404, error: 'Resource not found' }
|
|
249
|
+
const pages = R.resolvePages()
|
|
250
|
+
if (!pages.index) return { ok: false, status: 404, error: 'Resource has no list page' }
|
|
251
|
+
ctx = uploadCtx(userCtx({ mode: 'table', basePath: cfg.path }, user), cfg)
|
|
252
|
+
elements = await callPageSchema(pages.index, ctx)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Stamp the request's filter onto the render context so widget hooks
|
|
256
|
+
// can branch on it. Opaque string — widgets decode their own format.
|
|
257
|
+
if (body.filter !== undefined) ctx = { ...ctx, filter: body.filter } as RenderContext
|
|
258
|
+
|
|
259
|
+
const widget = findWidgetById(elements, body.id)
|
|
260
|
+
if (!widget) return { ok: false, status: 404, error: `Widget "${body.id}" not found` }
|
|
261
|
+
|
|
262
|
+
// Layout-level visibility re-check — if the widget is hidden by a
|
|
263
|
+
// visible(rule), refuse to ship data. Same fail-closed posture as
|
|
264
|
+
// the schema resolver. (Parent-container `visible(false)` would
|
|
265
|
+
// already drop the widget from the schema tree at SSR time, so a
|
|
266
|
+
// direct hidden-widget probe here covers the visible-rule-only case.)
|
|
267
|
+
const layoutCtx: import('../schema/Element.js').LayoutContext = {}
|
|
268
|
+
if (user !== null && user !== undefined) layoutCtx.user = user
|
|
269
|
+
if (!await widget.evaluateVisibility(layoutCtx)) {
|
|
270
|
+
return { ok: false, status: 403, error: 'Widget hidden' }
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
const data = await widget.resolveServerData(ctx)
|
|
275
|
+
return { ok: true, data, timestamp: Date.now() }
|
|
276
|
+
} catch (err) {
|
|
277
|
+
return {
|
|
278
|
+
ok: false,
|
|
279
|
+
status: 500,
|
|
280
|
+
error: err instanceof Error ? err.message : 'Widget failed',
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** Walk the element tree looking for a server-data element with the
|
|
286
|
+
* given id. Same walker as `collectServerDataElements` but stops on
|
|
287
|
+
* first match. */
|
|
288
|
+
function findWidgetById(elements: ReadonlyArray<Element>, id: string): ServerDataElement | undefined {
|
|
289
|
+
let found: ServerDataElement | undefined
|
|
290
|
+
const walk = (els: ReadonlyArray<Element>): void => {
|
|
291
|
+
for (const el of els) {
|
|
292
|
+
if (found) return
|
|
293
|
+
if (isServerDataElement(el)) {
|
|
294
|
+
if (el.getId() === id) { found = el; return }
|
|
295
|
+
continue
|
|
296
|
+
}
|
|
297
|
+
const type = el.getType()
|
|
298
|
+
if (type === 'form' || type === 'repeater' || type === 'builder' || type === 'table' || type === 'tableWidget') continue
|
|
299
|
+
const children = el.getChildren()
|
|
300
|
+
if (children) walk(children)
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
walk(elements)
|
|
304
|
+
return found
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// ─── Plan #12 global search data builder ─────────────────────
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Resolve the user via `pilotiq.resolveUser(req)` and run the
|
|
311
|
+
* panel-wide search. Mirrors the formStateData/formWizardData
|
|
312
|
+
* shape so the `/_search` route handler stays a thin wrapper.
|
|
313
|
+
*
|
|
314
|
+
* Also resolves the `panels::global-search.results.before/.after`
|
|
315
|
+
* render hooks when the panel registered any — sparse, absent when
|
|
316
|
+
* neither slot has registered fns. Sent as a `RenderHookMap` so the
|
|
317
|
+
* client `<CommandPalette>` can mount `<RenderHookSlot>` above and
|
|
318
|
+
* below the result list (same pattern chrome slots use).
|
|
319
|
+
*/
|
|
320
|
+
export async function searchData(
|
|
321
|
+
pilotiq: Pilotiq,
|
|
322
|
+
query: string,
|
|
323
|
+
req?: unknown,
|
|
324
|
+
): Promise<{
|
|
325
|
+
ok: true
|
|
326
|
+
results: GlobalSearchResult[]
|
|
327
|
+
renderHooks?: RenderHookMap
|
|
328
|
+
}> {
|
|
329
|
+
const user = await pilotiq.resolveUser(req)
|
|
330
|
+
const results = await searchAllResources(pilotiq, query, user)
|
|
331
|
+
const cfg = pilotiq.getConfig()
|
|
332
|
+
const out: { ok: true; results: GlobalSearchResult[]; renderHooks?: RenderHookMap } = {
|
|
333
|
+
ok: true,
|
|
334
|
+
results,
|
|
335
|
+
}
|
|
336
|
+
if (cfg.renderHooks && cfg.renderHooks.length > 0) {
|
|
337
|
+
const hooks = await resolvePageHooks(
|
|
338
|
+
pilotiq,
|
|
339
|
+
user,
|
|
340
|
+
pageHooksFor('search'),
|
|
341
|
+
{ url: `${cfg.path}/_search` },
|
|
342
|
+
)
|
|
343
|
+
if (Object.keys(hooks).length > 0) out.renderHooks = hooks
|
|
344
|
+
}
|
|
345
|
+
return out
|
|
346
|
+
}
|
|
347
|
+
|