@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
package/src/elements/index.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
Form,
|
|
3
|
-
type FormMethod,
|
|
4
|
-
type FormMeta,
|
|
5
|
-
type FormContext,
|
|
6
|
-
type SaveHandler,
|
|
7
|
-
type MutateDataHandler,
|
|
8
|
-
type LifecycleHandler,
|
|
9
|
-
type AfterSaveHandler,
|
|
10
|
-
type RedirectHandler,
|
|
11
|
-
type LoadRecordHandler,
|
|
12
|
-
type FillFromRecordHandler,
|
|
13
|
-
} from './Form.js'
|
|
14
|
-
|
|
15
|
-
export {
|
|
16
|
-
Table,
|
|
17
|
-
type TableMeta,
|
|
18
|
-
type TableContext,
|
|
19
|
-
type TableQueryHandler,
|
|
20
|
-
type SortDirection,
|
|
21
|
-
} from './Table.js'
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
import type { BadgeColor } from '../columns/BadgeColumn.js'
|
|
3
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Read-only sibling of `BadgeColumn`. Renders the resolved state value as
|
|
7
|
-
* a colored pill. Pair with `.colors({ value: BadgeColor })` to map each
|
|
8
|
-
* value to a preset; unknown values fall back to `gray`.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* BadgeEntry.make('status').colors({ draft: 'gray', published: 'success', archived: 'warning' })
|
|
12
|
-
*/
|
|
13
|
-
export class BadgeEntry extends Entry {
|
|
14
|
-
private _colors: Record<string, BadgeColor> = {}
|
|
15
|
-
|
|
16
|
-
private constructor(name: string) {
|
|
17
|
-
super(name)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
static make(name: string): BadgeEntry {
|
|
21
|
-
return new BadgeEntry(name)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** value→color preset map. Unknown values render as `gray`. */
|
|
25
|
-
colors(map: Record<string, BadgeColor>): this {
|
|
26
|
-
this._colors = { ...this._colors, ...map }
|
|
27
|
-
return this
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
protected override getEntryType(): string { return 'badge' }
|
|
31
|
-
|
|
32
|
-
override async toMeta(ctx?: RenderContext): Promise<EntryMeta> {
|
|
33
|
-
const meta = await Promise.resolve(super.toMeta(ctx)) as EntryMeta & { colors?: Record<string, BadgeColor> }
|
|
34
|
-
if (Object.keys(this._colors).length > 0) {
|
|
35
|
-
meta.colors = this._colors
|
|
36
|
-
}
|
|
37
|
-
return meta
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { CodeEntry } from './CodeEntry.js'
|
|
5
|
-
|
|
6
|
-
describe('CodeEntry', () => {
|
|
7
|
-
it('emits entryType:code and resolves value from record[name]', () => {
|
|
8
|
-
const meta = CodeEntry.make('payload').toMeta({
|
|
9
|
-
record: { payload: '{"a":1}' },
|
|
10
|
-
})
|
|
11
|
-
assert.equal(meta.entryType, 'code')
|
|
12
|
-
assert.equal(meta.value, '{"a":1}')
|
|
13
|
-
assert.equal('language' in meta, false)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
it('emits language hint when set', () => {
|
|
17
|
-
const meta = CodeEntry.make('payload').language('json').toMeta({
|
|
18
|
-
record: { payload: '{}' },
|
|
19
|
-
})
|
|
20
|
-
assert.equal(meta.language, 'json')
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('inherits copyable / tooltip from base Entry', () => {
|
|
24
|
-
const meta = CodeEntry.make('snippet')
|
|
25
|
-
.language('ts')
|
|
26
|
-
.copyable()
|
|
27
|
-
.tooltip('Latest payload')
|
|
28
|
-
.toMeta({ record: { snippet: 'const x = 1' } })
|
|
29
|
-
assert.equal(meta.tooltip, 'Latest payload')
|
|
30
|
-
assert.deepEqual(meta.copyable, {})
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('supports formatStateUsing for object → string conversion', () => {
|
|
34
|
-
const meta = CodeEntry.make('config')
|
|
35
|
-
.language('json')
|
|
36
|
-
.formatStateUsing(v => JSON.stringify(v, null, 2))
|
|
37
|
-
.toMeta({ record: { config: { a: 1 } } })
|
|
38
|
-
assert.equal(meta._formatted, '{\n "a": 1\n}')
|
|
39
|
-
})
|
|
40
|
-
})
|
package/src/entries/CodeEntry.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
|
|
3
|
-
export interface CodeEntryMeta extends EntryMeta {
|
|
4
|
-
language?: string
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Read-only sibling of `CodeEditorField` — renders the resolved value as
|
|
9
|
-
* `<pre><code>` with a monospace font. Pairs with `Resource.detail()` for
|
|
10
|
-
* showing user-supplied code, JSON blobs, or config snippets.
|
|
11
|
-
*
|
|
12
|
-
* v1 ships **without bundled syntax highlighting** to keep the core
|
|
13
|
-
* package small. Pass a `language()` hint and a consumer can register a
|
|
14
|
-
* highlighter via the existing rich-text renderer registry pattern (or
|
|
15
|
-
* the upcoming `@pilotiq/codemirror` adapter's read-only mode); without
|
|
16
|
-
* a registered highlighter the entry renders plain monospaced text.
|
|
17
|
-
*
|
|
18
|
-
* CodeEntry.make('payload').language('json').copyable()
|
|
19
|
-
*
|
|
20
|
-
* Honors all the inherited chrome (`color / size / weight / tooltip /
|
|
21
|
-
* copyable`), though `weight` is rarely useful on code blocks.
|
|
22
|
-
*
|
|
23
|
-
* For PHP arrays / JS objects, set `formatStateUsing(JSON.stringify)`
|
|
24
|
-
* to control the wire shape — entries don't auto-stringify objects.
|
|
25
|
-
*/
|
|
26
|
-
export class CodeEntry extends Entry {
|
|
27
|
-
private _language?: string
|
|
28
|
-
|
|
29
|
-
private constructor(name: string) {
|
|
30
|
-
super(name)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
static make(name: string): CodeEntry {
|
|
34
|
-
return new CodeEntry(name)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Language hint passed through to the meta (`'json' | 'ts' | 'html' |
|
|
39
|
-
* …`). Plays the same role as `CodeEditorField.language()` — opaque to
|
|
40
|
-
* the framework, consumed by an optional highlighter registered by
|
|
41
|
-
* the consumer.
|
|
42
|
-
*/
|
|
43
|
-
language(id: string): this { this._language = id; return this }
|
|
44
|
-
|
|
45
|
-
protected override getEntryType(): string { return 'code' }
|
|
46
|
-
|
|
47
|
-
override toMeta(ctx?: Parameters<Entry['toMeta']>[0]): CodeEntryMeta {
|
|
48
|
-
const meta = super.toMeta(ctx) as CodeEntryMeta
|
|
49
|
-
if (this._language !== undefined) meta.language = this._language
|
|
50
|
-
return meta
|
|
51
|
-
}
|
|
52
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
export type ColorEntryShape = 'square' | 'rounded' | 'circle'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Read-only swatch entry — sibling of `ColorPickerField`. The state value
|
|
8
|
-
* is a CSS color string (`#aabbcc`, `rgb(…)`, `oklch(…)`, …) rendered as
|
|
9
|
-
* a colored chip. The raw value is shown beside the chip by default; toggle
|
|
10
|
-
* with `.copyable()` for click-to-copy on the value text.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ColorEntry.make('brandColor').dimensions(24).circle()
|
|
14
|
-
*/
|
|
15
|
-
export class ColorEntry extends Entry {
|
|
16
|
-
private _width = 24
|
|
17
|
-
private _height = 24
|
|
18
|
-
private _shape: ColorEntryShape = 'rounded'
|
|
19
|
-
private _showValue = true
|
|
20
|
-
|
|
21
|
-
private constructor(name: string) {
|
|
22
|
-
super(name)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
static make(name: string): ColorEntry {
|
|
26
|
-
return new ColorEntry(name)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
width(px: number): this { this._width = px; return this }
|
|
30
|
-
height(px: number): this { this._height = px; return this }
|
|
31
|
-
|
|
32
|
-
/** Square sugar — sets width and height to the same pixel value. */
|
|
33
|
-
dimensions(px: number): this {
|
|
34
|
-
this._width = px
|
|
35
|
-
this._height = px
|
|
36
|
-
return this
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
square(): this { this._shape = 'square'; return this }
|
|
40
|
-
rounded(): this { this._shape = 'rounded'; return this }
|
|
41
|
-
circle(): this { this._shape = 'circle'; return this }
|
|
42
|
-
|
|
43
|
-
/** Hide the raw color string next to the swatch (chip only). */
|
|
44
|
-
hideValue(v = true): this { this._showValue = !v; return this }
|
|
45
|
-
|
|
46
|
-
protected override getEntryType(): string { return 'color' }
|
|
47
|
-
|
|
48
|
-
override async toMeta(ctx?: RenderContext): Promise<EntryMeta> {
|
|
49
|
-
const meta = await Promise.resolve(super.toMeta(ctx)) as EntryMeta & {
|
|
50
|
-
colorWidth?: number
|
|
51
|
-
colorHeight?: number
|
|
52
|
-
colorSize?: number
|
|
53
|
-
colorShape?: ColorEntryShape
|
|
54
|
-
showValue?: boolean
|
|
55
|
-
}
|
|
56
|
-
meta.colorWidth = this._width
|
|
57
|
-
meta.colorHeight = this._height
|
|
58
|
-
meta.colorShape = this._shape
|
|
59
|
-
if (this._width === this._height) meta.colorSize = this._width
|
|
60
|
-
if (!this._showValue) meta.showValue = false
|
|
61
|
-
return meta
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { resolveSchema, _resetResolverRegistry } from '../schema/resolveSchema.js'
|
|
5
|
-
import { ComponentEntry } from './ComponentEntry.js'
|
|
6
|
-
import type { EntryMeta } from './Entry.js'
|
|
7
|
-
|
|
8
|
-
beforeEach(() => _resetResolverRegistry())
|
|
9
|
-
|
|
10
|
-
describe('ComponentEntry — wire shape', () => {
|
|
11
|
-
it('serializes with entryType=component', async () => {
|
|
12
|
-
const out = await resolveSchema(
|
|
13
|
-
[ComponentEntry.make('location').component('CoordinatesMap')],
|
|
14
|
-
{ record: { location: { lat: 51.5, lng: -0.13 } } },
|
|
15
|
-
)
|
|
16
|
-
const m = out[0] as EntryMeta & { component?: string }
|
|
17
|
-
assert.equal(m.entryType, 'component')
|
|
18
|
-
assert.equal(m.component, 'CoordinatesMap')
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('passes the resolved value through unchanged', async () => {
|
|
22
|
-
const out = await resolveSchema(
|
|
23
|
-
[ComponentEntry.make('location').component('CoordinatesMap')],
|
|
24
|
-
{ record: { location: { lat: 51.5, lng: -0.13 } } },
|
|
25
|
-
)
|
|
26
|
-
const m = out[0] as EntryMeta
|
|
27
|
-
assert.deepEqual(m.value, { lat: 51.5, lng: -0.13 })
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it('value is undefined when record is missing the attribute', async () => {
|
|
31
|
-
const out = await resolveSchema(
|
|
32
|
-
[ComponentEntry.make('coords').component('Map')],
|
|
33
|
-
{ record: { other: 1 } },
|
|
34
|
-
)
|
|
35
|
-
assert.equal((out[0] as EntryMeta).value, undefined)
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
describe('ComponentEntry — fluent vs subclass', () => {
|
|
40
|
-
class CoordinatesMap extends ComponentEntry {
|
|
41
|
-
static override componentName = 'CoordinatesMap'
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
it('subclass form picks up static componentName', async () => {
|
|
45
|
-
const out = await resolveSchema(
|
|
46
|
-
[CoordinatesMap.make('location')],
|
|
47
|
-
{ record: { location: { lat: 1, lng: 2 } } },
|
|
48
|
-
)
|
|
49
|
-
const m = out[0] as EntryMeta & { component?: string }
|
|
50
|
-
assert.equal(m.component, 'CoordinatesMap')
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('instance .component() overrides the static', async () => {
|
|
54
|
-
const out = await resolveSchema(
|
|
55
|
-
[CoordinatesMap.make('location').component('OtherMap')],
|
|
56
|
-
{ record: { location: { lat: 1, lng: 2 } } },
|
|
57
|
-
)
|
|
58
|
-
assert.equal((out[0] as EntryMeta & { component?: string }).component, 'OtherMap')
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('falls back to entry name when no static + no instance setter', async () => {
|
|
62
|
-
const out = await resolveSchema(
|
|
63
|
-
[ComponentEntry.make('location')],
|
|
64
|
-
{ record: { location: 'x' } },
|
|
65
|
-
)
|
|
66
|
-
assert.equal((out[0] as EntryMeta & { component?: string }).component, 'location')
|
|
67
|
-
})
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
describe('ComponentEntry — inherits Entry surface', () => {
|
|
71
|
-
it('label / helperText / tooltip / inlineLabel', async () => {
|
|
72
|
-
const out = await resolveSchema(
|
|
73
|
-
[
|
|
74
|
-
ComponentEntry.make('location')
|
|
75
|
-
.component('Map')
|
|
76
|
-
.label('Where')
|
|
77
|
-
.helperText('lat/lng pair')
|
|
78
|
-
.tooltip('Stored as a JSON object')
|
|
79
|
-
.inlineLabel(),
|
|
80
|
-
],
|
|
81
|
-
{ record: { location: 'x' } },
|
|
82
|
-
)
|
|
83
|
-
const m = out[0] as EntryMeta
|
|
84
|
-
assert.equal(m.label, 'Where')
|
|
85
|
-
assert.equal(m.helperText, 'lat/lng pair')
|
|
86
|
-
assert.equal(m.tooltip, 'Stored as a JSON object')
|
|
87
|
-
assert.equal(m.inlineLabel, true)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('honors state(path) for nested values', async () => {
|
|
91
|
-
const out = await resolveSchema(
|
|
92
|
-
[ComponentEntry.make('mapData').component('Map').state('venue.coords')],
|
|
93
|
-
{ record: { venue: { coords: { lat: 5, lng: 9 } } } },
|
|
94
|
-
)
|
|
95
|
-
assert.deepEqual((out[0] as EntryMeta).value, { lat: 5, lng: 9 })
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it('honors state(fn) for computed values', async () => {
|
|
99
|
-
const out = await resolveSchema(
|
|
100
|
-
[
|
|
101
|
-
ComponentEntry.make('mapData').component('Map').state((r) => ({
|
|
102
|
-
lat: (r as { lat: number }).lat,
|
|
103
|
-
lng: (r as { lng: number }).lng,
|
|
104
|
-
label: (r as { name: string }).name,
|
|
105
|
-
})),
|
|
106
|
-
],
|
|
107
|
-
{ record: { lat: 1, lng: 2, name: 'HQ' } },
|
|
108
|
-
)
|
|
109
|
-
assert.deepEqual((out[0] as EntryMeta).value, { lat: 1, lng: 2, label: 'HQ' })
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
it('formatStateUsing still stamps _formatted', async () => {
|
|
113
|
-
const out = await resolveSchema(
|
|
114
|
-
[
|
|
115
|
-
ComponentEntry.make('coords')
|
|
116
|
-
.component('Map')
|
|
117
|
-
.formatStateUsing((v) => `(${(v as { lat: number }).lat},${(v as { lng: number }).lng})`),
|
|
118
|
-
],
|
|
119
|
-
{ record: { coords: { lat: 1, lng: 2 } } },
|
|
120
|
-
)
|
|
121
|
-
assert.equal((out[0] as EntryMeta)._formatted, '(1,2)')
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('honors visible(false) — drops the entry', async () => {
|
|
125
|
-
const out = await resolveSchema(
|
|
126
|
-
[ComponentEntry.make('coords').component('Map').visible(false)],
|
|
127
|
-
{ record: { coords: 'x' } },
|
|
128
|
-
)
|
|
129
|
-
assert.equal(out.length, 0)
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
it('honors columnSpan() under a parent grid', async () => {
|
|
133
|
-
const out = await resolveSchema(
|
|
134
|
-
[ComponentEntry.make('coords').component('Map').columnSpan(3)],
|
|
135
|
-
{ record: { coords: 'x' } },
|
|
136
|
-
)
|
|
137
|
-
assert.deepEqual((out[0] as EntryMeta)._layout, { columnSpan: 3 })
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
describe('ComponentEntry — registry', () => {
|
|
142
|
-
it('register + lookup round-trip', async () => {
|
|
143
|
-
const { registerEntryComponents, getEntryComponent, _resetEntryRegistryForTests } =
|
|
144
|
-
await import('./registry.js')
|
|
145
|
-
_resetEntryRegistryForTests()
|
|
146
|
-
const Stub = () => null
|
|
147
|
-
registerEntryComponents({ Stub: Stub as never })
|
|
148
|
-
assert.equal(getEntryComponent('Stub'), Stub)
|
|
149
|
-
assert.equal(getEntryComponent('Missing'), undefined)
|
|
150
|
-
_resetEntryRegistryForTests()
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
it('skips falsy entries on register (defensive)', async () => {
|
|
154
|
-
const { registerEntryComponents, getEntryComponent, _resetEntryRegistryForTests } =
|
|
155
|
-
await import('./registry.js')
|
|
156
|
-
_resetEntryRegistryForTests()
|
|
157
|
-
registerEntryComponents({ Bad: undefined as never })
|
|
158
|
-
assert.equal(getEntryComponent('Bad'), undefined)
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
it('multiple register calls merge', async () => {
|
|
162
|
-
const { registerEntryComponents, getEntryComponent, _resetEntryRegistryForTests } =
|
|
163
|
-
await import('./registry.js')
|
|
164
|
-
_resetEntryRegistryForTests()
|
|
165
|
-
const A = () => null
|
|
166
|
-
const B = () => null
|
|
167
|
-
registerEntryComponents({ A: A as never })
|
|
168
|
-
registerEntryComponents({ B: B as never })
|
|
169
|
-
assert.equal(getEntryComponent('A'), A)
|
|
170
|
-
assert.equal(getEntryComponent('B'), B)
|
|
171
|
-
_resetEntryRegistryForTests()
|
|
172
|
-
})
|
|
173
|
-
})
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Escape-hatch infolist entry. Hands rendering off to a user-supplied
|
|
6
|
-
* React component registered via `registerEntryComponents()`. Useful
|
|
7
|
-
* when the built-in entries (Text/Badge/Icon/Image/KeyValue/Color) don't
|
|
8
|
-
* fit — a coordinates map, an audit-trail timeline, an embedded chart.
|
|
9
|
-
*
|
|
10
|
-
* Two usage patterns mirror the `View` widget shape:
|
|
11
|
-
*
|
|
12
|
-
* **Subclass form** — extend `ComponentEntry` so the component reference
|
|
13
|
-
* lives as a static on a stable class:
|
|
14
|
-
*
|
|
15
|
-
* import { ComponentEntry } from '@pilotiq/pilotiq'
|
|
16
|
-
* export class CoordinatesMap extends ComponentEntry {
|
|
17
|
-
* static componentName = 'CoordinatesMap'
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* // bootstrap/providers.ts
|
|
21
|
-
* registerEntryComponents({ CoordinatesMap })
|
|
22
|
-
*
|
|
23
|
-
* // Resource.detail()
|
|
24
|
-
* CoordinatesMap.make('location').label('Where')
|
|
25
|
-
*
|
|
26
|
-
* **Fluent form** — for one-off cases where a subclass is overkill:
|
|
27
|
-
*
|
|
28
|
-
* ComponentEntry.make('location').component('CoordinatesMap')
|
|
29
|
-
*
|
|
30
|
-
* The component receives `{ value, record }` as its sole props — `value`
|
|
31
|
-
* is the entry's resolved state value (honors `.state(path | fn)` like
|
|
32
|
-
* any other entry) and `record` is the full loaded record. Components
|
|
33
|
-
* are looked up at render through the entry-component registry (see
|
|
34
|
-
* `@pilotiq/pilotiq/entries`).
|
|
35
|
-
*/
|
|
36
|
-
export class ComponentEntry extends Entry {
|
|
37
|
-
/**
|
|
38
|
-
* Component name used to look up the registered React component at
|
|
39
|
-
* render time. Subclasses set this as a static; the fluent form sets
|
|
40
|
-
* it via `.component(name)`.
|
|
41
|
-
*
|
|
42
|
-
* (Despite the name, this is a *string key* into the runtime registry,
|
|
43
|
-
* not a component reference itself — keeps `ComponentEntry` shippable
|
|
44
|
-
* through `viewProps` and avoids the `_components.ts` manifest walker,
|
|
45
|
-
* mirroring the `View` widget convention.)
|
|
46
|
-
*/
|
|
47
|
-
static componentName?: string
|
|
48
|
-
|
|
49
|
-
protected _componentName?: string
|
|
50
|
-
|
|
51
|
-
// Public for `make()`'s `new this(name)` factory call from subclasses —
|
|
52
|
-
// a protected ctor here breaks `class Foo extends ComponentEntry {}; Foo.make('x')`
|
|
53
|
-
// because the typeof Foo signature wouldn't satisfy `new (name) => ComponentEntry`.
|
|
54
|
-
constructor(name: string) {
|
|
55
|
-
super(name)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
static make(
|
|
59
|
-
this: new (name: string) => ComponentEntry,
|
|
60
|
-
name: string,
|
|
61
|
-
): ComponentEntry {
|
|
62
|
-
return new this(name)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Set / override the registered component name. */
|
|
66
|
-
component(name: string): this {
|
|
67
|
-
this._componentName = name
|
|
68
|
-
return this
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
protected override getEntryType(): string { return 'component' }
|
|
72
|
-
|
|
73
|
-
/** Resolve the effective component name (instance > static > fallback to entry name). */
|
|
74
|
-
getComponentName(): string {
|
|
75
|
-
if (this._componentName) return this._componentName
|
|
76
|
-
const ctor = this.constructor as { componentName?: string }
|
|
77
|
-
if (ctor.componentName) return ctor.componentName
|
|
78
|
-
// Last resort — use the entry's `name`, mirroring `View.getId()`'s
|
|
79
|
-
// fallback. The renderer surfaces a "component not registered" error
|
|
80
|
-
// when the registry doesn't carry it.
|
|
81
|
-
return this._name
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Builds the wire meta with `entryType: 'component'` plus the
|
|
86
|
-
* registered component-name lookup key. Inherits `value`, `label`,
|
|
87
|
-
* chrome, and `_formatted` from `Entry.toMeta` — the renderer wraps
|
|
88
|
-
* the user component in `<EntryShell>` for label / helperText / tooltip
|
|
89
|
-
* / copyable parity with every other entry leaf.
|
|
90
|
-
*/
|
|
91
|
-
override toMeta(ctx?: RenderContext): EntryMeta & { component: string } {
|
|
92
|
-
const meta = super.toMeta(ctx) as EntryMeta
|
|
93
|
-
return { ...meta, component: this.getComponentName() }
|
|
94
|
-
}
|
|
95
|
-
}
|