@pilotiq/pilotiq 0.24.1 → 0.24.3
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/CHANGELOG.md +57 -0
- package/boost/guidelines.md +571 -0
- package/boost/skills/pilotiq-actions/SKILL.md +49 -0
- package/boost/skills/pilotiq-actions/rules/dispatch-modes.md +177 -0
- package/boost/skills/pilotiq-actions/rules/factories.md +130 -0
- package/boost/skills/pilotiq-actions/rules/visibility-and-authorization.md +125 -0
- package/boost/skills/pilotiq-fields/SKILL.md +47 -0
- package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
- package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
- package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
- package/boost/skills/pilotiq-relations/SKILL.md +47 -0
- package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
- package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
- package/boost/skills/pilotiq-resource/SKILL.md +61 -0
- package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
- package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
- package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
- package/dist/Pilotiq.d.ts +31 -0
- package/dist/Pilotiq.d.ts.map +1 -1
- package/dist/Pilotiq.js +3 -1
- package/dist/Pilotiq.js.map +1 -1
- package/dist/PilotiqRegistry.d.ts +13 -0
- package/dist/PilotiqRegistry.d.ts.map +1 -1
- package/dist/PilotiqRegistry.js +15 -0
- package/dist/PilotiqRegistry.js.map +1 -1
- package/dist/pageData/misc.d.ts.map +1 -1
- package/dist/pageData/misc.js +6 -0
- package/dist/pageData/misc.js.map +1 -1
- package/dist/pageData/navigation.d.ts +1 -0
- package/dist/pageData/navigation.d.ts.map +1 -1
- package/dist/pageData/navigation.js +3 -0
- package/dist/pageData/navigation.js.map +1 -1
- package/dist/pageData/relationPages.d.ts.map +1 -1
- package/dist/pageData/relationPages.js +3 -0
- package/dist/pageData/relationPages.js.map +1 -1
- package/dist/pageData/resourcePages.d.ts.map +1 -1
- package/dist/pageData/resourcePages.js +8 -0
- package/dist/pageData/resourcePages.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.map +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/widgets/StatsOverviewRenderer.d.ts.map +1 -1
- package/dist/react/widgets/StatsOverviewRenderer.js +32 -18
- package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -1
- package/dist/routes/relations.d.ts.map +1 -1
- package/dist/routes/relations.js +25 -18
- package/dist/routes/relations.js.map +1 -1
- package/dist/routes/resources.js.map +1 -1
- package/package.json +10 -5
- package/.turbo/turbo-build.log +0 -8
- package/CLAUDE.md +0 -265
- package/src/Cluster.test.ts +0 -283
- package/src/Cluster.ts +0 -83
- package/src/Column.test.ts +0 -199
- package/src/Column.ts +0 -710
- package/src/Global.test.ts +0 -367
- package/src/Global.ts +0 -169
- package/src/Page.test.ts +0 -114
- package/src/Page.ts +0 -208
- package/src/Pilotiq.perf.test.ts +0 -252
- package/src/Pilotiq.test.ts +0 -129
- package/src/Pilotiq.ts +0 -1158
- package/src/PilotiqRegistry.ts +0 -36
- package/src/PilotiqServiceProvider.ts +0 -121
- package/src/RelationManager.test.ts +0 -400
- package/src/RelationManager.ts +0 -527
- package/src/RenderHook.test.ts +0 -252
- package/src/RenderHook.ts +0 -242
- package/src/Resource.test.ts +0 -284
- package/src/Resource.ts +0 -526
- package/src/RightPanel.test.ts +0 -202
- package/src/RightPanel.ts +0 -132
- package/src/Tab.test.ts +0 -91
- package/src/Tab.ts +0 -156
- package/src/UserMenuItem.ts +0 -145
- package/src/actions/Action.test.ts +0 -2526
- package/src/actions/Action.ts +0 -1515
- package/src/actions/ActionGroup.test.ts +0 -112
- package/src/actions/ActionGroup.ts +0 -173
- package/src/actions/attachFactory.ts +0 -172
- package/src/actions/bulkFactories.ts +0 -168
- package/src/actions/crudFactories.ts +0 -220
- package/src/actions/exportFactory.ts +0 -225
- package/src/actions/factoryHelpers.ts +0 -177
- package/src/actions/importFactory.ts +0 -243
- package/src/actions/index.ts +0 -17
- package/src/actions/m2mFactories.ts +0 -193
- package/src/actions/relationFactories.ts +0 -372
- package/src/applyPageHooks.test.ts +0 -463
- package/src/applyPageHooks.ts +0 -330
- package/src/authorization.test.ts +0 -483
- package/src/breadcrumbs.test.ts +0 -238
- package/src/cells/coerce.test.ts +0 -85
- package/src/cells/coerce.ts +0 -84
- package/src/clusterPaths.ts +0 -35
- package/src/columns/BadgeColumn.test.ts +0 -54
- package/src/columns/BadgeColumn.ts +0 -32
- package/src/columns/BooleanColumn.test.ts +0 -41
- package/src/columns/BooleanColumn.ts +0 -18
- package/src/columns/ColorColumn.test.ts +0 -37
- package/src/columns/ColorColumn.ts +0 -38
- package/src/columns/IconColumn.test.ts +0 -54
- package/src/columns/IconColumn.ts +0 -37
- package/src/columns/ImageColumn.test.ts +0 -41
- package/src/columns/ImageColumn.ts +0 -28
- package/src/columns/SelectColumn.ts +0 -98
- package/src/columns/TextColumn.test.ts +0 -190
- package/src/columns/TextColumn.ts +0 -20
- package/src/columns/TextInputColumn.ts +0 -68
- package/src/columns/ToggleColumn.ts +0 -46
- package/src/columns/editableColumns.test.ts +0 -238
- package/src/columns/index.ts +0 -9
- package/src/defaultGlobalPages.ts +0 -95
- package/src/defaultPages.test.ts +0 -634
- package/src/defaultPages.ts +0 -617
- package/src/defaultViewPage.test.ts +0 -147
- package/src/elements/Form.test.ts +0 -223
- package/src/elements/Form.ts +0 -416
- package/src/elements/ListTabs.ts +0 -28
- package/src/elements/Table.test.ts +0 -422
- package/src/elements/Table.ts +0 -850
- package/src/elements/TableGroup.test.ts +0 -260
- package/src/elements/TableGroup.ts +0 -334
- package/src/elements/dispatchAction.test.ts +0 -463
- package/src/elements/dispatchAction.ts +0 -355
- package/src/elements/dispatchForm.test.ts +0 -477
- package/src/elements/dispatchForm.ts +0 -1993
- package/src/elements/dispatchTable.test.ts +0 -1514
- package/src/elements/dispatchTable.ts +0 -745
- package/src/elements/index.ts +0 -21
- package/src/entries/BadgeEntry.ts +0 -39
- package/src/entries/CodeEntry.test.ts +0 -40
- package/src/entries/CodeEntry.ts +0 -52
- package/src/entries/ColorEntry.ts +0 -63
- package/src/entries/ComponentEntry.test.ts +0 -173
- package/src/entries/ComponentEntry.ts +0 -95
- package/src/entries/Entry.ts +0 -304
- package/src/entries/IconEntry.ts +0 -49
- package/src/entries/ImageEntry.ts +0 -61
- package/src/entries/KeyValueEntry.ts +0 -47
- package/src/entries/RepeatableEntry.test.ts +0 -239
- package/src/entries/RepeatableEntry.ts +0 -173
- package/src/entries/TextEntry.test.ts +0 -394
- package/src/entries/TextEntry.ts +0 -60
- package/src/entries/index.ts +0 -12
- package/src/entries/leaves.test.ts +0 -306
- package/src/entries/registry.ts +0 -54
- package/src/fields/BuilderField.test.ts +0 -1188
- package/src/fields/BuilderField.ts +0 -605
- package/src/fields/BuilderRelationship.test.ts +0 -811
- package/src/fields/CheckboxField.test.ts +0 -44
- package/src/fields/CheckboxField.ts +0 -27
- package/src/fields/CheckboxListField.test.ts +0 -99
- package/src/fields/CheckboxListField.ts +0 -66
- package/src/fields/ColorPickerField.test.ts +0 -33
- package/src/fields/ColorPickerField.ts +0 -25
- package/src/fields/DateField.ts +0 -54
- package/src/fields/DateTimeField.test.ts +0 -55
- package/src/fields/EmailField.ts +0 -16
- package/src/fields/Field.test.ts +0 -654
- package/src/fields/Field.ts +0 -817
- package/src/fields/FileUploadField.test.ts +0 -143
- package/src/fields/FileUploadField.ts +0 -159
- package/src/fields/HiddenField.test.ts +0 -27
- package/src/fields/HiddenField.ts +0 -28
- package/src/fields/KeyValueField.test.ts +0 -105
- package/src/fields/KeyValueField.ts +0 -55
- package/src/fields/MarkdownField.test.ts +0 -167
- package/src/fields/MarkdownField.ts +0 -162
- package/src/fields/NumberField.ts +0 -33
- package/src/fields/RadioField.test.ts +0 -94
- package/src/fields/RadioField.ts +0 -67
- package/src/fields/RepeaterField.test.ts +0 -1806
- package/src/fields/RepeaterField.ts +0 -939
- package/src/fields/RepeaterRelationship.test.ts +0 -1923
- package/src/fields/RepeaterSimple.test.ts +0 -248
- package/src/fields/RowButton.test.ts +0 -219
- package/src/fields/RowButton.ts +0 -135
- package/src/fields/SelectField.test.ts +0 -192
- package/src/fields/SelectField.ts +0 -235
- package/src/fields/SliderField.test.ts +0 -50
- package/src/fields/SliderField.ts +0 -53
- package/src/fields/SlugField.ts +0 -24
- package/src/fields/TagsInputField.test.ts +0 -154
- package/src/fields/TagsInputField.ts +0 -133
- package/src/fields/TextField.test.ts +0 -213
- package/src/fields/TextField.ts +0 -177
- package/src/fields/TextareaField.test.ts +0 -58
- package/src/fields/TextareaField.ts +0 -59
- package/src/fields/ToggleButtonsField.test.ts +0 -106
- package/src/fields/ToggleButtonsField.ts +0 -59
- package/src/fields/ToggleField.ts +0 -16
- package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
- package/src/fields/optionsResolver.ts +0 -95
- package/src/fields/resolveField.ts +0 -28
- package/src/filters/BooleanFilter.ts +0 -35
- package/src/filters/DateRangeFilter.test.ts +0 -194
- package/src/filters/DateRangeFilter.ts +0 -148
- package/src/filters/Filter.test.ts +0 -268
- package/src/filters/Filter.ts +0 -184
- package/src/filters/FormFilter.test.ts +0 -238
- package/src/filters/FormFilter.ts +0 -215
- package/src/filters/MultiSelectFilter.test.ts +0 -119
- package/src/filters/MultiSelectFilter.ts +0 -78
- package/src/filters/QueryBuilderFilter.test.ts +0 -662
- package/src/filters/QueryBuilderFilter.ts +0 -398
- package/src/filters/SelectFilter.ts +0 -46
- package/src/filters/TernaryFilter.test.ts +0 -160
- package/src/filters/TernaryFilter.ts +0 -72
- package/src/filters/TrashedFilter.test.ts +0 -149
- package/src/filters/TrashedFilter.ts +0 -55
- package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
- package/src/filters/queryBuilder/Constraint.ts +0 -115
- package/src/filters/queryBuilder/DateConstraint.ts +0 -69
- package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
- package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
- package/src/filters/queryBuilder/TextConstraint.ts +0 -64
- package/src/filters/queryBuilder/index.ts +0 -12
- package/src/icons/index.ts +0 -2
- package/src/icons/lucide.ts +0 -204
- package/src/icons/registry.test.ts +0 -56
- package/src/icons/registry.ts +0 -41
- package/src/icons/types.ts +0 -47
- package/src/index.ts +0 -525
- package/src/io/csv.test.ts +0 -142
- package/src/io/csv.ts +0 -170
- package/src/nestedRelationManagerData.test.ts +0 -547
- package/src/notifications/Notification.test.ts +0 -210
- package/src/notifications/Notification.ts +0 -354
- package/src/notifications/broadcast.test.ts +0 -110
- package/src/notifications/broadcast.ts +0 -95
- package/src/notifications/database.test.ts +0 -383
- package/src/notifications/database.ts +0 -398
- package/src/notifications/databaseNotifications.test.ts +0 -187
- package/src/notifications/dispatchNotificationAction.test.ts +0 -341
- package/src/notifications/dispatchNotificationAction.ts +0 -142
- package/src/notifications/flash.test.ts +0 -89
- package/src/notifications/flash.ts +0 -71
- package/src/notifications/index.ts +0 -45
- package/src/notifications/registerBroadcastAuth.test.ts +0 -134
- package/src/notifications/registerBroadcastAuth.ts +0 -100
- package/src/notifications/resolveSavedNotification.test.ts +0 -82
- package/src/notifications/resolveSavedNotification.ts +0 -59
- package/src/notifications/types.ts +0 -93
- package/src/orm/m2mAccessor.ts +0 -66
- package/src/orm/modelDefaults.test.ts +0 -633
- package/src/orm/modelDefaults.ts +0 -666
- package/src/pageData/breadcrumbs.ts +0 -288
- package/src/pageData/forms.ts +0 -578
- package/src/pageData/helpers.ts +0 -857
- package/src/pageData/misc.ts +0 -347
- package/src/pageData/navigation.ts +0 -842
- package/src/pageData/relationPages.ts +0 -1248
- package/src/pageData/relationTabs.ts +0 -286
- package/src/pageData/resourcePages.ts +0 -609
- package/src/pageData.test.ts +0 -1545
- package/src/pageData.ts +0 -341
- package/src/plugins/index.ts +0 -8
- package/src/plugins/themeEditor.test.ts +0 -36
- package/src/plugins/themeEditor.ts +0 -45
- package/src/react/AppShell.tsx +0 -251
- package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
- package/src/react/CollabRoomContext.ts +0 -98
- package/src/react/CollabTextRendererRegistry.ts +0 -102
- package/src/react/CommandPalette.tsx +0 -375
- package/src/react/CurrentUserContext.tsx +0 -50
- package/src/react/CustomPageWrapperGate.tsx +0 -69
- package/src/react/CustomPageWrapperRegistry.ts +0 -45
- package/src/react/FieldFocusReporterRegistry.ts +0 -37
- package/src/react/FieldLabelSlotRegistry.ts +0 -30
- package/src/react/FieldPresenceRegistry.ts +0 -46
- package/src/react/FormCollabBindingRegistry.ts +0 -242
- package/src/react/FormStateContext.tsx +0 -591
- package/src/react/HeadHooks.tsx +0 -126
- package/src/react/MarkdownEditorRegistry.test.ts +0 -38
- package/src/react/MarkdownEditorRegistry.ts +0 -107
- package/src/react/NotificationActionStrip.tsx +0 -263
- package/src/react/NotificationBell.tsx +0 -426
- package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
- package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
- package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
- package/src/react/PendingSuggestionsContext.tsx +0 -172
- package/src/react/RecordWrapperGate.tsx +0 -58
- package/src/react/RecordWrapperRegistry.ts +0 -39
- package/src/react/RenderHookSlot.tsx +0 -32
- package/src/react/RightSidebar.tsx +0 -257
- package/src/react/RightSidebarContext.tsx +0 -234
- package/src/react/RightSidebarTrigger.tsx +0 -53
- package/src/react/RowCoordsContext.tsx +0 -23
- package/src/react/SchemaRenderer.tsx +0 -549
- package/src/react/SearchTrigger.tsx +0 -46
- package/src/react/ThemeProvider.tsx +0 -93
- package/src/react/ThemeSettingsPage.tsx +0 -579
- package/src/react/ThemeToggle.tsx +0 -20
- package/src/react/Toaster.tsx +0 -158
- package/src/react/UserMenu.tsx +0 -196
- package/src/react/WidgetDataContext.tsx +0 -157
- package/src/react/cells/EditableCell.tsx +0 -389
- package/src/react/component-slots.test.ts +0 -103
- package/src/react/component-slots.ts +0 -116
- package/src/react/fieldJsHandler.test.ts +0 -166
- package/src/react/fieldJsHandler.ts +0 -79
- package/src/react/fields/BuilderInput.tsx +0 -1078
- package/src/react/fields/CheckboxInput.tsx +0 -39
- package/src/react/fields/CheckboxListInput.tsx +0 -102
- package/src/react/fields/ColorInput.tsx +0 -71
- package/src/react/fields/DateFieldInput.tsx +0 -70
- package/src/react/fields/DateTimeInput.tsx +0 -62
- package/src/react/fields/FieldShell.tsx +0 -348
- package/src/react/fields/FileUploadInput.tsx +0 -639
- package/src/react/fields/HiddenInput.tsx +0 -17
- package/src/react/fields/KeyValueInput.tsx +0 -230
- package/src/react/fields/MarkdownInput.tsx +0 -560
- package/src/react/fields/RadioInput.tsx +0 -81
- package/src/react/fields/RepeaterInput.test.ts +0 -116
- package/src/react/fields/RepeaterInput.tsx +0 -1420
- package/src/react/fields/SelectFieldInput.tsx +0 -280
- package/src/react/fields/SliderInput.tsx +0 -81
- package/src/react/fields/TagsInput.tsx +0 -283
- package/src/react/fields/TextLikeInput.tsx +0 -256
- package/src/react/fields/ToggleButtonsInput.tsx +0 -60
- package/src/react/fields/ToggleFieldInput.tsx +0 -56
- package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
- package/src/react/fields/relationshipRenameDispatch.ts +0 -97
- package/src/react/fields/repeaterReconcile.test.ts +0 -114
- package/src/react/fields/repeaterReconcile.ts +0 -104
- package/src/react/fields/rowChromeButton.tsx +0 -336
- package/src/react/fields/rowState.ts +0 -106
- package/src/react/fields/syncRowGates.test.ts +0 -202
- package/src/react/fields/syncRowGates.ts +0 -66
- package/src/react/fields/textInputControls.tsx +0 -238
- package/src/react/fields/useRowReorderDnd.ts +0 -78
- package/src/react/formStateHelpers.test.ts +0 -508
- package/src/react/formStateHelpers.ts +0 -381
- package/src/react/hooks/use-mobile.ts +0 -19
- package/src/react/icon-context.tsx +0 -60
- package/src/react/index.ts +0 -194
- package/src/react/layouts/SidebarLayout.tsx +0 -250
- package/src/react/layouts/TopbarLayout.tsx +0 -258
- package/src/react/navigate.tsx +0 -37
- package/src/react/onProviderSynced.test.ts +0 -90
- package/src/react/parseRecordEditUrl.test.ts +0 -122
- package/src/react/parseRecordEditUrl.ts +0 -94
- package/src/react/persistedState.ts +0 -40
- package/src/react/registry.ts +0 -48
- package/src/react/right-panel-registry.tsx +0 -47
- package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
- package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
- package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
- package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
- package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
- package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
- package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
- package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
- package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
- package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
- package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
- package/src/react/schemaRenderer/action/buttons.tsx +0 -99
- package/src/react/schemaRenderer/action/helpers.ts +0 -140
- package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
- package/src/react/schemaRenderer/columnFormat.ts +0 -65
- package/src/react/schemaRenderer/constants.ts +0 -50
- package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
- package/src/react/schemaRenderer/form/renderField.tsx +0 -511
- package/src/react/schemaRenderer/helpers.tsx +0 -81
- package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
- package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
- package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
- package/src/react/schemaRenderer/table/filters.tsx +0 -1233
- package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
- package/src/react/schemaRenderer/table/links.tsx +0 -112
- package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
- package/src/react/schemaRenderer/table/url.tsx +0 -143
- package/src/react/theme-preview/apply.ts +0 -99
- package/src/react/theme-preview/build-html.ts +0 -436
- package/src/react/ui/button.tsx +0 -51
- package/src/react/ui/calendar.tsx +0 -67
- package/src/react/ui/checkbox.tsx +0 -29
- package/src/react/ui/dialog.tsx +0 -108
- package/src/react/ui/dropdown-menu.tsx +0 -97
- package/src/react/ui/input.tsx +0 -20
- package/src/react/ui/label.tsx +0 -21
- package/src/react/ui/popover.tsx +0 -50
- package/src/react/ui/select.tsx +0 -169
- package/src/react/ui/separator.tsx +0 -25
- package/src/react/ui/sheet.tsx +0 -136
- package/src/react/ui/sidebar.tsx +0 -723
- package/src/react/ui/skeleton.tsx +0 -13
- package/src/react/ui/slider.tsx +0 -34
- package/src/react/ui/switch.tsx +0 -28
- package/src/react/ui/table.tsx +0 -105
- package/src/react/ui/tabs.tsx +0 -63
- package/src/react/ui/textarea.tsx +0 -18
- package/src/react/ui/tooltip.tsx +0 -64
- package/src/react/useResizableWidth.ts +0 -139
- package/src/react/utils.ts +0 -6
- package/src/react/widgetRegistry.test.ts +0 -43
- package/src/react/widgetRegistry.ts +0 -50
- package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
- package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
- package/src/react/widgets/ViewRenderer.tsx +0 -71
- package/src/relationManagerData.test.ts +0 -1595
- package/src/richtext/index.ts +0 -8
- package/src/richtext/registry.ts +0 -89
- package/src/routes/globals.ts +0 -148
- package/src/routes/guard.test.ts +0 -325
- package/src/routes/helpers.ts +0 -704
- package/src/routes/pages.ts +0 -175
- package/src/routes/panel.ts +0 -204
- package/src/routes/relations.ts +0 -1243
- package/src/routes/resources.ts +0 -781
- package/src/routes/theme.ts +0 -91
- package/src/routes-nested-relations.test.ts +0 -676
- package/src/routes-relations.test.ts +0 -972
- package/src/routes.test.ts +0 -2027
- package/src/routes.ts +0 -303
- package/src/schema/Alert.test.ts +0 -109
- package/src/schema/Alert.ts +0 -131
- package/src/schema/Block.ts +0 -169
- package/src/schema/Breadcrumbs.ts +0 -40
- package/src/schema/Card.ts +0 -35
- package/src/schema/Divider.ts +0 -20
- package/src/schema/Element.ts +0 -219
- package/src/schema/EmptyState.test.ts +0 -37
- package/src/schema/EmptyState.ts +0 -63
- package/src/schema/Fieldset.ts +0 -43
- package/src/schema/Grid.ts +0 -43
- package/src/schema/Group.ts +0 -30
- package/src/schema/Heading.ts +0 -39
- package/src/schema/Html.ts +0 -67
- package/src/schema/Icon.ts +0 -54
- package/src/schema/Image.ts +0 -57
- package/src/schema/LinkTag.ts +0 -41
- package/src/schema/Markdown.ts +0 -85
- package/src/schema/MetaTag.ts +0 -41
- package/src/schema/RelationTabs.ts +0 -71
- package/src/schema/ScriptTag.ts +0 -55
- package/src/schema/Section.ts +0 -160
- package/src/schema/ServerDataElement.test.ts +0 -140
- package/src/schema/ServerDataElement.ts +0 -156
- package/src/schema/SlotComponent.test.ts +0 -77
- package/src/schema/SlotComponent.ts +0 -71
- package/src/schema/Split.ts +0 -50
- package/src/schema/Stat.test.ts +0 -118
- package/src/schema/Stat.ts +0 -154
- package/src/schema/StatsOverview.test.ts +0 -141
- package/src/schema/StatsOverview.ts +0 -119
- package/src/schema/StyleTag.ts +0 -35
- package/src/schema/TableWidget.test.ts +0 -297
- package/src/schema/TableWidget.ts +0 -289
- package/src/schema/Tabs.ts +0 -79
- package/src/schema/Text.ts +0 -58
- package/src/schema/UnorderedList.ts +0 -49
- package/src/schema/View.test.ts +0 -111
- package/src/schema/View.ts +0 -127
- package/src/schema/Wizard.ts +0 -220
- package/src/schema/containers.test.ts +0 -564
- package/src/schema/headTags.test.ts +0 -134
- package/src/schema/index.ts +0 -40
- package/src/schema/primes.test.ts +0 -269
- package/src/schema/resolveSchema.test.ts +0 -379
- package/src/schema/resolveSchema.ts +0 -917
- package/src/schema/sanitize.ts +0 -58
- package/src/search.test.ts +0 -446
- package/src/search.ts +0 -178
- package/src/sessionFilters.test.ts +0 -375
- package/src/sessionFilters.ts +0 -143
- package/src/slot-components/index.ts +0 -10
- package/src/slot-components/registry.ts +0 -56
- package/src/styles/file-upload.css +0 -13
- package/src/summarizers/Summarizer.test.ts +0 -84
- package/src/summarizers/Summarizer.ts +0 -123
- package/src/summarizers/index.ts +0 -11
- package/src/theme/base-colors.ts +0 -68
- package/src/theme/chart-colors.ts +0 -50
- package/src/theme/colors.ts +0 -447
- package/src/theme/generate-css.test.ts +0 -139
- package/src/theme/generate-css.ts +0 -44
- package/src/theme/generate-scale.test.ts +0 -106
- package/src/theme/generate-scale.ts +0 -97
- package/src/theme/icon-map.ts +0 -42
- package/src/theme/index.ts +0 -34
- package/src/theme/migrate.test.ts +0 -178
- package/src/theme/migrate.ts +0 -81
- package/src/theme/presets.ts +0 -135
- package/src/theme/radius.ts +0 -18
- package/src/theme/resolve.test.ts +0 -238
- package/src/theme/resolve.ts +0 -96
- package/src/theme/spacing.ts +0 -18
- package/src/theme/storage.test.ts +0 -126
- package/src/theme/storage.ts +0 -106
- package/src/theme/theme-colors.ts +0 -88
- package/src/theme/types.ts +0 -125
- package/src/uploads/UploadAdapter.ts +0 -35
- package/src/uploads/index.ts +0 -2
- package/src/uploads/localUpload.test.ts +0 -70
- package/src/uploads/localUpload.ts +0 -84
- package/src/validation/Validator.ts +0 -49
- package/src/validation/index.ts +0 -28
- package/src/validation/rules.ts +0 -78
- package/src/validation/runValidators.ts +0 -435
- package/src/validation/uniqueValidator.test.ts +0 -196
- package/src/validation/uniqueValidator.ts +0 -133
- package/src/validation/validators.test.ts +0 -268
- package/src/vite.test.ts +0 -184
- package/src/vite.ts +0 -787
- package/src/widgets/index.ts +0 -10
- package/src/widgets/registry.ts +0 -45
- package/src/widgets.test.ts +0 -592
- package/tsconfig.build.json +0 -11
- package/tsconfig.json +0 -4
- package/tsconfig.test.json +0 -10
- package/views/react/Dashboard.tsx +0 -27
- package/views/react/Resources/Form.tsx +0 -102
- package/views/react/Resources/Index.tsx +0 -49
|
@@ -1,605 +0,0 @@
|
|
|
1
|
-
import { type ElementMeta } from '../schema/Element.js'
|
|
2
|
-
import { Block, type BlockMeta } from '../schema/Block.js'
|
|
3
|
-
import { Field, type FieldMeta } from './Field.js'
|
|
4
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
5
|
-
import type { Action, ActionMeta } from '../actions/Action.js'
|
|
6
|
-
import type { ModelLike } from '../orm/modelDefaults.js'
|
|
7
|
-
import {
|
|
8
|
-
RowButton,
|
|
9
|
-
type RowButtonKind,
|
|
10
|
-
type RowButtonsMeta,
|
|
11
|
-
} from './RowButton.js'
|
|
12
|
-
import {
|
|
13
|
-
serializeRowButtons,
|
|
14
|
-
normalizeGridConfig,
|
|
15
|
-
type RepeaterGridConfig,
|
|
16
|
-
type RepeaterItemCanRule,
|
|
17
|
-
type RepeaterItemHiddenRule,
|
|
18
|
-
} from './RepeaterField.js'
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Configuration for `Builder.relationship(...)`. Heterogeneous-row sibling
|
|
22
|
-
* of `RepeaterRelationshipConfig`.
|
|
23
|
-
*
|
|
24
|
-
* `name` matches a key on the parent model's `static relations` map. The
|
|
25
|
-
* child model carries a discriminator column (default `type`, holds the
|
|
26
|
-
* block name) and a JSON payload column (default `data`, holds the
|
|
27
|
-
* per-block inner-schema values verbatim) — plus the standard FK + PK,
|
|
28
|
-
* and an optional `sort` column when `orderColumn` is set.
|
|
29
|
-
*
|
|
30
|
-
* Two relation modes are supported:
|
|
31
|
-
*
|
|
32
|
-
* - `hasMany` — single foreign key on the child. `model` + `foreignKey`
|
|
33
|
-
* overrides exist for ORMs that don't follow the
|
|
34
|
-
* convention; both default to discovery via
|
|
35
|
-
* `parent.relations[name]` at submit time.
|
|
36
|
-
* - `morphMany` — polymorphic owner side. The child carries
|
|
37
|
-
* `<morphName>Id` + `<morphName>Type` columns (the
|
|
38
|
-
* morph stamp). Resolved entirely off the parent's
|
|
39
|
-
* `relations[name]` morph descriptor — no `foreignKey`
|
|
40
|
-
* override; the column names are driven by `morphName`.
|
|
41
|
-
* `morphOne` collapses into the same branch.
|
|
42
|
-
*
|
|
43
|
-
* `typeColumn` + `dataColumn` default to `'type'` and `'data'` — same as
|
|
44
|
-
* Filament.
|
|
45
|
-
*/
|
|
46
|
-
export interface BuilderRelationshipConfig {
|
|
47
|
-
/** Relationship key on the parent (e.g. `'blocks'`). */
|
|
48
|
-
name: string
|
|
49
|
-
/** Override the child model. Defaults to `parent.relations[name].model()`. */
|
|
50
|
-
model?: ModelLike
|
|
51
|
-
/** Override the FK column on the child. Defaults to `parent.relations[name].foreignKey`. */
|
|
52
|
-
foreignKey?: string
|
|
53
|
-
/** Discriminator column on the child holding the block name. Default `'type'`. */
|
|
54
|
-
typeColumn?: string
|
|
55
|
-
/** JSON payload column on the child holding the per-block fields. Default `'data'`. */
|
|
56
|
-
dataColumn?: string
|
|
57
|
-
/** Optional integer column on the child to receive the row index. */
|
|
58
|
-
orderColumn?: string
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Public meta — `model` + `foreignKey` are server-only and stay private. */
|
|
62
|
-
export interface BuilderRelationshipMeta {
|
|
63
|
-
name: string
|
|
64
|
-
typeColumn?: string
|
|
65
|
-
dataColumn?: string
|
|
66
|
-
orderColumn?: string
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Function evaluated once per row at meta-build to derive a human-readable
|
|
71
|
-
* label for the collapsed-row header. Receives the row's raw `data` body
|
|
72
|
-
* and the row's resolved `type`. Errors are swallowed and the renderer
|
|
73
|
-
* falls back to the block's label + row index.
|
|
74
|
-
*/
|
|
75
|
-
export type BuilderItemLabel = (
|
|
76
|
-
data: Record<string, unknown>,
|
|
77
|
-
blockName: string,
|
|
78
|
-
) => string
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Per-row visibility rule. Same shape as `Repeater.itemHidden(rule)`:
|
|
82
|
-
* either a literal `boolean` or a callback receiving a row-scoped
|
|
83
|
-
* `LayoutContext` (`row.blockType` exposes the block name). Truthy
|
|
84
|
-
* hides the row; the renderer keeps inputs mounted via `display: none`
|
|
85
|
-
* so values + `__id` round-trip on submit.
|
|
86
|
-
*
|
|
87
|
-
* Throwing → row stays visible (fail-closed-as-visible — same posture as
|
|
88
|
-
* Repeater).
|
|
89
|
-
*/
|
|
90
|
-
export type BuilderItemHiddenRule = RepeaterItemHiddenRule
|
|
91
|
-
|
|
92
|
-
export type BuilderItemCanRule = RepeaterItemCanRule
|
|
93
|
-
|
|
94
|
-
/** Position of the `Add block` button under the field's row stack. */
|
|
95
|
-
export type BuilderAddActionAlignment = 'start' | 'center' | 'end'
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Resolved per-row metadata. `id` mirrors Repeater's stable id round-trip;
|
|
99
|
-
* `type` carries the block discriminator so the renderer knows which
|
|
100
|
-
* picker option produced this row. `children` is the row's resolved
|
|
101
|
-
* inner schema (the matching block's `schema()` resolved against
|
|
102
|
-
* row-scoped values). `unknownType` is set when the row's submitted
|
|
103
|
-
* `type` doesn't match any registered block — the renderer falls back
|
|
104
|
-
* to a "missing block" placeholder; values still round-trip.
|
|
105
|
-
*/
|
|
106
|
-
export interface BuilderRowMeta {
|
|
107
|
-
id: string
|
|
108
|
-
type: string
|
|
109
|
-
children: ElementMeta[]
|
|
110
|
-
itemLabel?: string
|
|
111
|
-
hidden?: boolean
|
|
112
|
-
unknownType?: boolean
|
|
113
|
-
/**
|
|
114
|
-
* Resolved per-row action metas for `extraItemActions(...)`. Same shape
|
|
115
|
-
* as `RepeaterRowMeta.extraActions` — see RepeaterField for the row
|
|
116
|
-
* dispatch contract. Field-level only in v1; per-block actions stay
|
|
117
|
-
* deferred to a future polish (`Block.extraItemActions(...)`).
|
|
118
|
-
*/
|
|
119
|
-
extraActions?: ActionMeta[]
|
|
120
|
-
/**
|
|
121
|
-
* Per-row capability flags. Stamped only when the corresponding
|
|
122
|
-
* `itemCan*(rule)` resolved falsy for this row. The renderer reads
|
|
123
|
-
* these and skips the matching button. See `RepeaterRowMeta.canDelete`
|
|
124
|
-
* for the full contract — semantics are identical (`row.blockType` is
|
|
125
|
-
* available to the predicate as `ctx.row.blockType`).
|
|
126
|
-
*/
|
|
127
|
-
canDelete?: false
|
|
128
|
-
canClone?: false
|
|
129
|
-
canReorder?: false
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export interface BuilderFieldMeta extends FieldMeta {
|
|
133
|
-
fieldType: 'builder'
|
|
134
|
-
rows: BuilderRowMeta[]
|
|
135
|
-
/** Picker entries — every block registered via `.blocks([…])`. */
|
|
136
|
-
blocks: BlockMeta[]
|
|
137
|
-
/**
|
|
138
|
-
* Set when `Builder.relationship(...)` is configured. Tells diagnostics
|
|
139
|
-
* + future UI hooks that submitted rows persist as child records on a
|
|
140
|
-
* `HasMany` relation; behavior is otherwise server-side. The serialized
|
|
141
|
-
* shape carries only `{ name, typeColumn?, dataColumn?, orderColumn? }`
|
|
142
|
-
* — `model` and `foreignKey` are server-only.
|
|
143
|
-
*/
|
|
144
|
-
relationship?: BuilderRelationshipMeta
|
|
145
|
-
minItems?: number
|
|
146
|
-
maxItems?: number
|
|
147
|
-
defaultBlock?: string
|
|
148
|
-
reorderable?: boolean
|
|
149
|
-
reorderableWithButtons?: boolean
|
|
150
|
-
collapsible?: boolean
|
|
151
|
-
defaultCollapsed?: boolean
|
|
152
|
-
/**
|
|
153
|
-
* Set when `Builder.accordion()` is configured. The renderer replaces
|
|
154
|
-
* the per-row collapsed map with a single "open row id" slot — picking
|
|
155
|
-
* row N collapses every other row. Implies `collapsible: true`. See
|
|
156
|
-
* `RepeaterFieldMeta.accordion` for the shared semantics.
|
|
157
|
-
*/
|
|
158
|
-
accordion?: boolean
|
|
159
|
-
cloneable?: boolean
|
|
160
|
-
addable?: boolean
|
|
161
|
-
deletable?: boolean
|
|
162
|
-
/**
|
|
163
|
-
* Set when `Builder.addBetween()` is configured. The renderer mounts a
|
|
164
|
-
* thin "+" insertion zone above each row (and at the very top) — clicking
|
|
165
|
-
* it opens a compact picker that inserts the picked block at that
|
|
166
|
-
* index. The bottom `Add block` button stays — `addBetween` is additive,
|
|
167
|
-
* not a replacement. Respects `addable === false` and the field-level
|
|
168
|
-
* `maxItems` cap; per-block `Block.maxItems` already filters the picker.
|
|
169
|
-
*/
|
|
170
|
-
addBetween?: boolean
|
|
171
|
-
addActionLabel?: string
|
|
172
|
-
addActionAlignment?: BuilderAddActionAlignment
|
|
173
|
-
blockPickerColumns?: number
|
|
174
|
-
blockNumbers?: boolean
|
|
175
|
-
blockIcons?: boolean
|
|
176
|
-
itemNumbers?: boolean
|
|
177
|
-
/**
|
|
178
|
-
* Set when `Builder.grid(...)` is configured. Lays the ROWS themselves
|
|
179
|
-
* in an n-column grid — distinct from a Block's inner `Block.columns(n)`,
|
|
180
|
-
* which grids fields *inside* a single row. Accepts the scalar form
|
|
181
|
-
* (`grid(2)`) or a responsive object (`grid({ default: 1, md: 2 })`) —
|
|
182
|
-
* see `RepeaterFieldMeta.grid` for the shared semantics.
|
|
183
|
-
*/
|
|
184
|
-
grid?: RepeaterGridConfig
|
|
185
|
-
/**
|
|
186
|
-
* Per-slot chrome overrides for the seven built-in row buttons. Same
|
|
187
|
-
* shape as `RepeaterFieldMeta.buttons`; see `RowButton` for the
|
|
188
|
-
* customizer. Authors set these via `.addAction(RowButton.make()…)` etc.
|
|
189
|
-
*/
|
|
190
|
-
buttons?: RowButtonsMeta
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Heterogeneous-row Repeater. The author registers N block-types via
|
|
195
|
-
* `.blocks([Block.make('heading').schema([…]), …])`; the rendered form
|
|
196
|
-
* lets the end user pick from those types when adding rows.
|
|
197
|
-
*
|
|
198
|
-
* Storage on the parent record is `[{ __id, type, data: {…} }, …]` — a
|
|
199
|
-
* `{ type, data }` envelope per row. JSON-friendly, collision-free with
|
|
200
|
-
* any inner field name, mirrors Filament. See `docs/plans/builder-field.md`
|
|
201
|
-
* for the wire-format details.
|
|
202
|
-
*/
|
|
203
|
-
export class BuilderField extends Field {
|
|
204
|
-
private _blocks: Block[] = []
|
|
205
|
-
private _blocksByName: Map<string, Block> = new Map()
|
|
206
|
-
private _minItems?: number
|
|
207
|
-
private _maxItems?: number
|
|
208
|
-
private _defaultBlock?: string
|
|
209
|
-
private _reorderable = false
|
|
210
|
-
private _reorderableWithButtons = false
|
|
211
|
-
private _collapsible = false
|
|
212
|
-
private _defaultCollapsed = false
|
|
213
|
-
private _accordion = false
|
|
214
|
-
private _cloneable = false
|
|
215
|
-
private _addable = true
|
|
216
|
-
private _deletable = true
|
|
217
|
-
private _addBetween = false
|
|
218
|
-
private _itemNumbers = false
|
|
219
|
-
private _blockNumbers = false
|
|
220
|
-
private _blockIcons = true
|
|
221
|
-
private _blockPickerColumns?: number
|
|
222
|
-
private _addActionLabel?: string
|
|
223
|
-
private _addActionAlignment: BuilderAddActionAlignment = 'start'
|
|
224
|
-
private _itemLabel?: BuilderItemLabel
|
|
225
|
-
private _itemHidden?: BuilderItemHiddenRule
|
|
226
|
-
private _itemCanDelete?: BuilderItemCanRule
|
|
227
|
-
private _itemCanClone?: BuilderItemCanRule
|
|
228
|
-
private _itemCanReorder?: BuilderItemCanRule
|
|
229
|
-
private _extraItemActions: Action[] = []
|
|
230
|
-
private _grid?: RepeaterGridConfig
|
|
231
|
-
private _buttons: { [K in RowButtonKind]?: RowButton } = {}
|
|
232
|
-
private _relationship?: BuilderRelationshipConfig
|
|
233
|
-
|
|
234
|
-
private constructor(name: string) {
|
|
235
|
-
super(name, 'builder')
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
static make(name: string): BuilderField {
|
|
239
|
-
return new BuilderField(name)
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/** Register the block types the user can pick from. Order = picker order. */
|
|
243
|
-
blocks(blocks: Block[]): this {
|
|
244
|
-
this._blocks = blocks
|
|
245
|
-
this._blocksByName = new Map(blocks.map(b => [b.name, b]))
|
|
246
|
-
return this
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** Validator + client gate. */
|
|
250
|
-
minItems(n: number): this { this._minItems = n; return this }
|
|
251
|
-
maxItems(n: number): this { this._maxItems = n; return this }
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Block name auto-selected when adding a row without explicitly opening
|
|
255
|
-
* the picker (e.g. when there's only one block type, or for "quick add"
|
|
256
|
-
* UX). Defaults to undefined → picker always opens.
|
|
257
|
-
*/
|
|
258
|
-
defaultBlock(name: string): this { this._defaultBlock = name; return this }
|
|
259
|
-
|
|
260
|
-
reorderable(value: boolean = true): this { this._reorderable = value; return this }
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Force button-only reorder (Up / Down arrows on each row). When `false`
|
|
264
|
-
* (default), reorderable rows use HTML5 drag-and-drop with the buttons
|
|
265
|
-
* as a keyboard fallback. Mirrors Filament's
|
|
266
|
-
* `reorderableWithButtons(bool)`.
|
|
267
|
-
*/
|
|
268
|
-
reorderableWithButtons(value: boolean = true): this {
|
|
269
|
-
this._reorderableWithButtons = value
|
|
270
|
-
return this
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
collapsible(value: boolean = true): this { this._collapsible = value; return this }
|
|
274
|
-
collapsed(value: boolean = true): this { this._defaultCollapsed = value; return this }
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Accordion mode: only one row open at a time. Picking a different row
|
|
278
|
-
* collapses the currently-open one. Pair with `collapsed()` to start
|
|
279
|
-
* with every row collapsed (default is "first row open"). Auto-arms
|
|
280
|
-
* `collapsible()` since the accordion ergonomic is meaningless on a
|
|
281
|
-
* non-collapsible builder. Mirrors `RepeaterField.accordion()`.
|
|
282
|
-
*/
|
|
283
|
-
accordion(value: boolean = true): this {
|
|
284
|
-
this._accordion = value
|
|
285
|
-
if (value) this._collapsible = true
|
|
286
|
-
return this
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
cloneable(value: boolean = true): this { this._cloneable = value; return this }
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Hide the `Add block` button. `maxItems` is the validator gate; this is
|
|
293
|
-
* the separate UX gate (e.g. read-only on a published record). Default `true`.
|
|
294
|
-
*/
|
|
295
|
-
addable(value: boolean = true): this { this._addable = value; return this }
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Hide the per-row delete button. `minItems` is the validator gate; this
|
|
299
|
-
* is the UX gate. Default `true`.
|
|
300
|
-
*/
|
|
301
|
-
deletable(value: boolean = true): this { this._deletable = value; return this }
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Mount inline `+ Insert` zones above each row (and at the very top)
|
|
305
|
-
* so the user can insert a new block between existing rows without
|
|
306
|
-
* scrolling to the field's bottom `Add block` button. Mirrors
|
|
307
|
-
* Filament's `addBetweenAction()` affordance. Additive — the bottom
|
|
308
|
-
* `Add block` button stays. Respects `addable === false` and
|
|
309
|
-
* `maxItems`; per-block `Block.maxItems` already filters the picker.
|
|
310
|
-
*/
|
|
311
|
-
addBetween(value: boolean = true): this { this._addBetween = value; return this }
|
|
312
|
-
|
|
313
|
-
/** Position of the `Add block` button. */
|
|
314
|
-
addActionAlignment(a: BuilderAddActionAlignment): this {
|
|
315
|
-
this._addActionAlignment = a
|
|
316
|
-
return this
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
addActionLabel(label: string): this { this._addActionLabel = label; return this }
|
|
320
|
-
|
|
321
|
-
/** Grid column count for the picker dropdown. Default 1. */
|
|
322
|
-
blockPickerColumns(n: number): this { this._blockPickerColumns = n; return this }
|
|
323
|
-
|
|
324
|
-
/** Show 1-based numbering on each row's header. */
|
|
325
|
-
blockNumbers(value: boolean = true): this { this._blockNumbers = value; return this }
|
|
326
|
-
|
|
327
|
-
/** Show the block's icon in each row's header. Default `true`. */
|
|
328
|
-
blockIcons(value: boolean = true): this { this._blockIcons = value; return this }
|
|
329
|
-
|
|
330
|
-
/** Alias of `blockNumbers` for users coming from Repeater (parity flag). */
|
|
331
|
-
itemNumbers(value: boolean = true): this { this._itemNumbers = value; return this }
|
|
332
|
-
|
|
333
|
-
itemLabel(fn: BuilderItemLabel): this { this._itemLabel = fn; return this }
|
|
334
|
-
|
|
335
|
-
itemHidden(rule: BuilderItemHiddenRule): this { this._itemHidden = rule; return this }
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Per-row gate for the trash button. Mirrors `Repeater.itemCanDelete`.
|
|
339
|
-
* Predicate sees a row-scoped `LayoutContext` with `ctx.row.blockType`
|
|
340
|
-
* exposing the row's block name so a single rule can branch by block.
|
|
341
|
-
* Throwing → button stays visible + warn (fail-open, same posture as
|
|
342
|
-
* `itemHidden`). Presentation only — gate the parent form's lifecycle
|
|
343
|
-
* hooks for real authorization.
|
|
344
|
-
*/
|
|
345
|
-
itemCanDelete(rule: BuilderItemCanRule): this { this._itemCanDelete = rule; return this }
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Per-row gate for the clone (`Duplicate row`) button. Mirrors
|
|
349
|
-
* `Repeater.itemCanClone`. No-op when `cloneable()` is off field-wide.
|
|
350
|
-
*/
|
|
351
|
-
itemCanClone(rule: BuilderItemCanRule): this { this._itemCanClone = rule; return this }
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Per-row gate for the reorder controls (drag grip + Up / Down arrows).
|
|
355
|
-
* Mirrors `Repeater.itemCanReorder`. No-op when `reorderable()` is off
|
|
356
|
-
* field-wide. Drag targeting is unaffected — non-pinned rows can still
|
|
357
|
-
* drop at the pinned row's slot; pin both sides to keep a pair adjacent.
|
|
358
|
-
*/
|
|
359
|
-
itemCanReorder(rule: BuilderItemCanRule): this { this._itemCanReorder = rule; return this }
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Per-row action buttons rendered alongside clone/delete in each row's
|
|
363
|
-
* header. Field-level only in v1 — applies to every block. Per-block
|
|
364
|
-
* variants (`Block.extraItemActions(...)`) deferred. See
|
|
365
|
-
* `RepeaterField.extraItemActions` for the dispatch contract; the only
|
|
366
|
-
* Builder-specific note is that `ctx.row` exposes `blockType` so a
|
|
367
|
-
* single handler can branch by block.
|
|
368
|
-
*/
|
|
369
|
-
extraItemActions(actions: Action[]): this {
|
|
370
|
-
this._extraItemActions = actions
|
|
371
|
-
return this
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Lay the ROWS themselves in an n-column grid. Distinct from
|
|
376
|
-
* `Block.columns(n)`, which grids fields *inside* a single block's
|
|
377
|
-
* body. Accepts the scalar form (`grid(2)`) or a responsive object
|
|
378
|
-
* (`grid({ default: 1, md: 2 })`). See `RepeaterField.grid()` for
|
|
379
|
-
* the shared semantics — same renderer behavior, same drag-indicator
|
|
380
|
-
* caveat.
|
|
381
|
-
*/
|
|
382
|
-
grid(config: RepeaterGridConfig): this {
|
|
383
|
-
const normalized = normalizeGridConfig(config)
|
|
384
|
-
if (normalized === undefined) delete this._grid
|
|
385
|
-
else this._grid = normalized
|
|
386
|
-
return this
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Persist rows to a `HasMany` (or `MorphMany` / `MorphOne`) relation on
|
|
391
|
-
* the parent record instead of serializing them to a JSON column. Each
|
|
392
|
-
* row maps to a real child record carrying a `type` discriminator + a
|
|
393
|
-
* JSON `data` payload (column names configurable). Submit creates /
|
|
394
|
-
* updates / deletes children against the relation transparently.
|
|
395
|
-
*
|
|
396
|
-
* For `morphMany`, the child also carries `<morphName>Id` +
|
|
397
|
-
* `<morphName>Type` columns; the framework stamps both on every create
|
|
398
|
-
* (and refuses to overwrite them on update) so a tampered POST body
|
|
399
|
-
* can't reassign a row to a different polymorphic parent. The morph
|
|
400
|
-
* shape is read off the parent's `static relations[name]` descriptor —
|
|
401
|
-
* no `foreignKey` override applies.
|
|
402
|
-
*
|
|
403
|
-
* Pass either the relationship name as a string (the common case —
|
|
404
|
-
* `model` + `foreignKey` are auto-discovered from the parent's
|
|
405
|
-
* `static relations` map; `typeColumn` / `dataColumn` default to
|
|
406
|
-
* `'type'` / `'data'`) or an object form for explicit overrides.
|
|
407
|
-
*
|
|
408
|
-
* Mutually exclusive with `dehydrated(false)` — the field's whole purpose
|
|
409
|
-
* is to write data, so silently dropping it would be confusing.
|
|
410
|
-
* Validators run unchanged.
|
|
411
|
-
*/
|
|
412
|
-
relationship(arg: string | BuilderRelationshipConfig): this {
|
|
413
|
-
if (this.isDehydrated() === false) {
|
|
414
|
-
throw new Error(
|
|
415
|
-
`[Pilotiq] Builder "${this.name}": relationship() is incompatible with dehydrated(false) — the field's purpose is to persist data.`,
|
|
416
|
-
)
|
|
417
|
-
}
|
|
418
|
-
this._relationship = typeof arg === 'string' ? { name: arg } : { ...arg }
|
|
419
|
-
return this
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
/**
|
|
423
|
-
* Sugar over `.relationship({ ..., orderColumn: col })`. Sets the order
|
|
424
|
-
* column on an already-configured relationship; throws when
|
|
425
|
-
* `relationship()` hasn't been called first so misconfiguration surfaces
|
|
426
|
-
* eagerly.
|
|
427
|
-
*/
|
|
428
|
-
orderColumn(col: string): this {
|
|
429
|
-
if (!this._relationship) {
|
|
430
|
-
throw new Error(
|
|
431
|
-
`[Pilotiq] Builder "${this.name}": orderColumn() requires relationship() to be configured first.`,
|
|
432
|
-
)
|
|
433
|
-
}
|
|
434
|
-
this._relationship.orderColumn = col
|
|
435
|
-
return this
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Customize the bottom Add button's chrome. Equivalent to
|
|
440
|
-
* `addActionLabel()` plus icon / color / tooltip overrides; the
|
|
441
|
-
* customizer wins when both are set (it ships under `meta.buttons.add`
|
|
442
|
-
* which the renderer reads after `addActionLabel`).
|
|
443
|
-
*/
|
|
444
|
-
addAction(b: RowButton): this { this._buttons.add = b; return this }
|
|
445
|
-
|
|
446
|
-
/** Customize the per-row clone button. */
|
|
447
|
-
cloneAction(b: RowButton): this { this._buttons.clone = b; return this }
|
|
448
|
-
|
|
449
|
-
/** Customize the per-row trash button. */
|
|
450
|
-
deleteAction(b: RowButton): this { this._buttons.delete = b; return this }
|
|
451
|
-
|
|
452
|
-
/** Customize the per-row Up arrow. */
|
|
453
|
-
moveUpAction(b: RowButton): this { this._buttons.moveUp = b; return this }
|
|
454
|
-
|
|
455
|
-
/** Customize the per-row Down arrow. */
|
|
456
|
-
moveDownAction(b: RowButton): this { this._buttons.moveDown = b; return this }
|
|
457
|
-
|
|
458
|
-
/**
|
|
459
|
-
* Customize the drag-grip handle (label → aria-label, tooltip → title,
|
|
460
|
-
* icon swaps the glyph, color re-tones the handle). The grip isn't a
|
|
461
|
-
* real `<button>` so click semantics don't apply.
|
|
462
|
-
*/
|
|
463
|
-
reorderAction(b: RowButton): this { this._buttons.reorder = b; return this }
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* Customize the per-row collapse chevron. Applies to BOTH states by
|
|
467
|
-
* default — the open chevron and the collapsed chevron share the
|
|
468
|
-
* override unless `expandAction(...)` is also set, in which case
|
|
469
|
-
* `collapseAction` covers only the open state and `expandAction`
|
|
470
|
-
* covers the collapsed state. Mirrors `RepeaterField.collapseAction`.
|
|
471
|
-
*/
|
|
472
|
-
collapseAction(b: RowButton): this { this._buttons.collapse = b; return this }
|
|
473
|
-
|
|
474
|
-
/**
|
|
475
|
-
* Customize the per-row chevron when the row is currently *collapsed*.
|
|
476
|
-
* Sibling of `collapseAction` for the closed-state glyph. Mirrors
|
|
477
|
-
* `RepeaterField.expandAction`.
|
|
478
|
-
*/
|
|
479
|
-
expandAction(b: RowButton): this { this._buttons.expand = b; return this }
|
|
480
|
-
|
|
481
|
-
/**
|
|
482
|
-
* Mount an "Expand all" button in the field header. Opt-in: calling
|
|
483
|
-
* without args shows the button with default chrome; pass a
|
|
484
|
-
* `RowButton` to override icon / label / tooltip / color. Auto-arms
|
|
485
|
-
* `collapsible()`. In `accordion()` mode the button opens the first
|
|
486
|
-
* visible row. Mirrors `RepeaterField.expandAllAction`.
|
|
487
|
-
*/
|
|
488
|
-
expandAllAction(button?: RowButton): this {
|
|
489
|
-
this._buttons.expandAll = button ?? RowButton.make()
|
|
490
|
-
this._collapsible = true
|
|
491
|
-
return this
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/**
|
|
495
|
-
* Mount a "Collapse all" button in the field header. Opt-in (calling
|
|
496
|
-
* enables; pass a `RowButton` to customize). Auto-arms `collapsible()`.
|
|
497
|
-
* Mirrors `RepeaterField.collapseAllAction`.
|
|
498
|
-
*/
|
|
499
|
-
collapseAllAction(button?: RowButton): this {
|
|
500
|
-
this._buttons.collapseAll = button ?? RowButton.make()
|
|
501
|
-
this._collapsible = true
|
|
502
|
-
return this
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
// ─── Read-only access ────────────────────────────────
|
|
506
|
-
|
|
507
|
-
override getChildren(): undefined {
|
|
508
|
-
// Builder rows are addressed per-row via `getBlocks()` + dotted paths.
|
|
509
|
-
// Never return them as flat children — the parent walkers must stop
|
|
510
|
-
// at the Builder boundary, just like RepeaterField.
|
|
511
|
-
return undefined
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
getBlocks(): Block[] { return this._blocks }
|
|
515
|
-
getBlock(name: string): Block | undefined { return this._blocksByName.get(name) }
|
|
516
|
-
getMinItems(): number | undefined { return this._minItems }
|
|
517
|
-
getMaxItems(): number | undefined { return this._maxItems }
|
|
518
|
-
getDefaultBlock(): string | undefined { return this._defaultBlock }
|
|
519
|
-
isReorderable(): boolean { return this._reorderable }
|
|
520
|
-
isReorderableWithButtons(): boolean { return this._reorderableWithButtons }
|
|
521
|
-
isCollapsible(): boolean { return this._collapsible }
|
|
522
|
-
isDefaultCollapsed(): boolean { return this._defaultCollapsed }
|
|
523
|
-
isAccordion(): boolean { return this._accordion }
|
|
524
|
-
isCloneable(): boolean { return this._cloneable }
|
|
525
|
-
isAddable(): boolean { return this._addable }
|
|
526
|
-
isDeletable(): boolean { return this._deletable }
|
|
527
|
-
isAddBetween(): boolean { return this._addBetween }
|
|
528
|
-
showsBlockNumbers(): boolean { return this._blockNumbers || this._itemNumbers }
|
|
529
|
-
showsBlockIcons(): boolean { return this._blockIcons }
|
|
530
|
-
getBlockPickerColumns(): number | undefined { return this._blockPickerColumns }
|
|
531
|
-
getAddActionLabel(): string | undefined { return this._addActionLabel }
|
|
532
|
-
getAddActionAlignment(): BuilderAddActionAlignment { return this._addActionAlignment }
|
|
533
|
-
getItemLabel(): BuilderItemLabel | undefined { return this._itemLabel }
|
|
534
|
-
getItemHidden(): BuilderItemHiddenRule | undefined { return this._itemHidden }
|
|
535
|
-
getItemCanDelete(): BuilderItemCanRule | undefined { return this._itemCanDelete }
|
|
536
|
-
getItemCanClone(): BuilderItemCanRule | undefined { return this._itemCanClone }
|
|
537
|
-
getItemCanReorder(): BuilderItemCanRule | undefined { return this._itemCanReorder }
|
|
538
|
-
getExtraItemActions(): Action[] { return this._extraItemActions }
|
|
539
|
-
getGrid(): RepeaterGridConfig | undefined { return this._grid }
|
|
540
|
-
/** Resolved relationship config (`undefined` when not configured). */
|
|
541
|
-
getRelationship(): BuilderRelationshipConfig | undefined { return this._relationship }
|
|
542
|
-
isRelationship(): boolean { return this._relationship !== undefined }
|
|
543
|
-
/** The configured customizer for a given slot, or `undefined`. */
|
|
544
|
-
getButton(kind: RowButtonKind): RowButton | undefined { return this._buttons[kind] }
|
|
545
|
-
|
|
546
|
-
// ─── Meta ────────────────────────────────────────────
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* Bare meta — `rows` and per-row resolved children are populated by
|
|
550
|
-
* `resolveBuilderRows` in `schema/resolveSchema.ts`. The `blocks` array
|
|
551
|
-
* (picker entries) ships unconditionally; the picker UI needs it before
|
|
552
|
-
* the user has added any rows.
|
|
553
|
-
*/
|
|
554
|
-
override toMeta(ctx?: RenderContext): BuilderFieldMeta {
|
|
555
|
-
const base = this.buildMeta(ctx)
|
|
556
|
-
const meta: BuilderFieldMeta = {
|
|
557
|
-
...base,
|
|
558
|
-
fieldType: 'builder',
|
|
559
|
-
rows: [],
|
|
560
|
-
blocks: this._blocks.map(b => b.toMeta()),
|
|
561
|
-
}
|
|
562
|
-
if (this._minItems !== undefined) meta.minItems = this._minItems
|
|
563
|
-
if (this._maxItems !== undefined) meta.maxItems = this._maxItems
|
|
564
|
-
if (this._defaultBlock !== undefined) meta.defaultBlock = this._defaultBlock
|
|
565
|
-
if (this._reorderable) meta.reorderable = true
|
|
566
|
-
if (this._reorderableWithButtons) meta.reorderableWithButtons = true
|
|
567
|
-
if (this._collapsible) meta.collapsible = true
|
|
568
|
-
if (this._defaultCollapsed) meta.defaultCollapsed = true
|
|
569
|
-
if (this._accordion) meta.accordion = true
|
|
570
|
-
if (this._cloneable) meta.cloneable = true
|
|
571
|
-
if (this._addable === false) meta.addable = false
|
|
572
|
-
if (this._deletable === false) meta.deletable = false
|
|
573
|
-
if (this._addBetween) meta.addBetween = true
|
|
574
|
-
if (this._blockNumbers) meta.blockNumbers = true
|
|
575
|
-
if (this._blockIcons === false) meta.blockIcons = false
|
|
576
|
-
if (this._itemNumbers) meta.itemNumbers = true
|
|
577
|
-
if (this._blockPickerColumns !== undefined) meta.blockPickerColumns = this._blockPickerColumns
|
|
578
|
-
if (this._addActionLabel !== undefined) meta.addActionLabel = this._addActionLabel
|
|
579
|
-
if (this._addActionAlignment !== 'start') meta.addActionAlignment = this._addActionAlignment
|
|
580
|
-
if (this._grid !== undefined) meta.grid = this._grid
|
|
581
|
-
if (this._relationship !== undefined) {
|
|
582
|
-
const r: BuilderRelationshipMeta = { name: this._relationship.name }
|
|
583
|
-
if (this._relationship.typeColumn !== undefined) r.typeColumn = this._relationship.typeColumn
|
|
584
|
-
if (this._relationship.dataColumn !== undefined) r.dataColumn = this._relationship.dataColumn
|
|
585
|
-
if (this._relationship.orderColumn !== undefined) r.orderColumn = this._relationship.orderColumn
|
|
586
|
-
meta.relationship = r
|
|
587
|
-
}
|
|
588
|
-
const buttons = serializeRowButtons(this._buttons)
|
|
589
|
-
if (buttons !== undefined) meta.buttons = buttons
|
|
590
|
-
return meta
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
export const Builder = BuilderField
|
|
595
|
-
|
|
596
|
-
/**
|
|
597
|
-
* Structural Builder check — Vite's SSR module cache can load this
|
|
598
|
-
* package via two paths during a single dev session, so `instanceof
|
|
599
|
-
* BuilderField` can silently return false across module copies. The
|
|
600
|
-
* structural check matches `getType() === 'field'` (Field's discriminator)
|
|
601
|
-
* + `fieldType === 'builder'`. Same posture as `isRepeaterField`.
|
|
602
|
-
*/
|
|
603
|
-
export function isBuilderField(el: { getType(): string; fieldType?: string }): boolean {
|
|
604
|
-
return el.getType() === 'field' && el['fieldType'] === 'builder'
|
|
605
|
-
}
|