@pilotiq/pilotiq 0.23.1 → 0.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +91 -0
- package/boost/guidelines.md +566 -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/actions/exportFactory.d.ts +10 -0
- package/dist/actions/exportFactory.d.ts.map +1 -1
- package/dist/actions/exportFactory.js +10 -0
- package/dist/actions/exportFactory.js.map +1 -1
- package/dist/react/CollabRoomContext.d.ts +5 -5
- package/dist/react/index.d.ts +0 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +0 -1
- package/dist/react/index.js.map +1 -1
- package/dist/routes/helpers.d.ts.map +1 -1
- package/dist/routes/helpers.js +6 -2
- package/dist/routes/helpers.js.map +1 -1
- package/dist/routes/relations.d.ts.map +1 -1
- package/dist/routes/relations.js +12 -0
- package/dist/routes/relations.js.map +1 -1
- package/package.json +6 -1
- package/.turbo/turbo-build.log +0 -8
- package/CLAUDE.md +0 -265
- package/dist/react/useCollabSeed.d.ts +0 -23
- package/dist/react/useCollabSeed.d.ts.map +0 -1
- package/dist/react/useCollabSeed.js +0 -82
- package/dist/react/useCollabSeed.js.map +0 -1
- 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 -215
- 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 -195
- 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/useCollabSeed.ts +0 -86
- 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 -700
- package/src/routes/pages.ts +0 -175
- package/src/routes/panel.ts +0 -204
- package/src/routes/relations.ts +0 -1227
- 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,286 +0,0 @@
|
|
|
1
|
-
import type { ElementMeta } from '../schema/Element.js'
|
|
2
|
-
import type { Page } from '../Page.js'
|
|
3
|
-
import type { ResourceClass } from '../Resource.js'
|
|
4
|
-
import {
|
|
5
|
-
RelationManager,
|
|
6
|
-
safeManagerPolicy as safeManagerPolicyImpl,
|
|
7
|
-
type ManagerCanMethod as ManagerCanMethodType,
|
|
8
|
-
} from '../RelationManager.js'
|
|
9
|
-
import { RelationTabs, relationTab, type RelationTabMeta } from '../schema/RelationTabs.js'
|
|
10
|
-
import { resourceBasePath } from '../clusterPaths.js'
|
|
11
|
-
import type { IconValue } from '../icons/types.js'
|
|
12
|
-
import { getPrimaryKey } from '../orm/modelDefaults.js'
|
|
13
|
-
import type { RelationChainStep } from './breadcrumbs.js'
|
|
14
|
-
import { safeBool } from './helpers.js'
|
|
15
|
-
|
|
16
|
-
// ─── RelationTabs strip helpers ─────────────────────────────
|
|
17
|
-
//
|
|
18
|
-
// `buildRelationTabs` (depth 1) and `buildNestedRelationTabs` (depth 2)
|
|
19
|
-
// are called by both the resource view/edit page builders (parent
|
|
20
|
-
// tabs strip) AND the relation manager page builders (nested-tabs
|
|
21
|
-
// strip + record-sub-pages strip). Living in a shared module avoids
|
|
22
|
-
// pageData/resourcePages.ts ↔ pageData/relationPages.ts cycle.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Phase B — build a `RelationTabs` strip scoped to a parent's nested
|
|
27
|
-
* children (e.g. tabs for `replies / reactions` listed under a single
|
|
28
|
-
* comment). The strip's "back" tab points to the depth-2 view page for
|
|
29
|
-
* the leaf parent itself, then one tab per sibling nested manager.
|
|
30
|
-
*
|
|
31
|
-
* Only emitted when the depth-1 manager declares `M.relations()` —
|
|
32
|
-
* absent that, callers skip the prepend so single-manager surfaces stay
|
|
33
|
-
* clean. `activeKey` accepts the literal `'__view'` for the leaf
|
|
34
|
-
* parent's view tab, or any sibling manager's relationship key.
|
|
35
|
-
*
|
|
36
|
-
* Per-tab `canX` gating (2026-05-11) — sibling nested-manager tabs run
|
|
37
|
-
* `N.canViewAny(user, child1Record)` (with fall-through to the related
|
|
38
|
-
* Resource via `safeManagerPolicy`) so the strip hides tabs the user
|
|
39
|
-
* couldn't reach anyway. The back-link `__view` stays unconditional
|
|
40
|
-
* since the user is already on a page scoped under `M.canViewAny` —
|
|
41
|
-
* they reached this strip, they can navigate back to it.
|
|
42
|
-
*/
|
|
43
|
-
export async function buildNestedRelationTabs(
|
|
44
|
-
R: ResourceClass,
|
|
45
|
-
M: typeof RelationManager,
|
|
46
|
-
basePath: string,
|
|
47
|
-
step0: RelationChainStep,
|
|
48
|
-
child1Id: string,
|
|
49
|
-
activeKey: string,
|
|
50
|
-
user: unknown,
|
|
51
|
-
child1Record: unknown,
|
|
52
|
-
): Promise<RelationTabs | undefined> {
|
|
53
|
-
const siblings = M.relations()
|
|
54
|
-
if (siblings.length === 0) return undefined
|
|
55
|
-
|
|
56
|
-
const resourceBase = resourceBasePath(basePath, R)
|
|
57
|
-
const parentBase = `${resourceBase}/${step0.recordId}/${step0.relationship}`
|
|
58
|
-
|
|
59
|
-
// Sibling gating runs in parallel — each predicate may hit auth /
|
|
60
|
-
// db, so don't serialize them.
|
|
61
|
-
const siblingGates = siblings.map(N => {
|
|
62
|
-
const Related = (N as unknown as { relatedResource?: ResourceClass }).relatedResource
|
|
63
|
-
return safeManagerPolicyImpl(N, 'canViewAny', Related, user, child1Record)
|
|
64
|
-
})
|
|
65
|
-
const siblingVisible = await Promise.all(siblingGates)
|
|
66
|
-
|
|
67
|
-
const tabs: RelationTabMeta[] = []
|
|
68
|
-
|
|
69
|
-
// Back-link: depth-2 view page for the leaf parent record. Acts as
|
|
70
|
-
// the "View" tab in the same way `__view` does on depth-1 strips.
|
|
71
|
-
tabs.push(relationTab({
|
|
72
|
-
key: '__view',
|
|
73
|
-
label: M.getLabelSingular(),
|
|
74
|
-
url: `${parentBase}/${child1Id}`,
|
|
75
|
-
active: activeKey === '__view',
|
|
76
|
-
icon: M.getIcon(),
|
|
77
|
-
iconOwner: M.name,
|
|
78
|
-
}))
|
|
79
|
-
|
|
80
|
-
siblings.forEach((N, i) => {
|
|
81
|
-
if (!siblingVisible[i]) return
|
|
82
|
-
let nestedRel: string
|
|
83
|
-
try { nestedRel = N.getRelationship() } catch { return }
|
|
84
|
-
const icon = N.getIcon()
|
|
85
|
-
tabs.push(relationTab({
|
|
86
|
-
key: nestedRel,
|
|
87
|
-
label: N.getLabel(),
|
|
88
|
-
url: `${parentBase}/${child1Id}/${nestedRel}`,
|
|
89
|
-
active: activeKey === nestedRel,
|
|
90
|
-
...(icon !== undefined ? { icon, iconOwner: N.name } : {}),
|
|
91
|
-
}))
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
// After gating, only the back-link may remain — one tab isn't a
|
|
95
|
-
// useful sub-nav. Drop the strip in that case (consistent with
|
|
96
|
-
// depth-1's empty-tabs branch).
|
|
97
|
-
if (tabs.length <= 1) return undefined
|
|
98
|
-
|
|
99
|
-
return RelationTabs.make(tabs)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Plan #11 — build the `RelationTabs` strip for a parent record. The
|
|
104
|
-
* strip surfaces the per-record sub-navigation: View, Edit, plus one
|
|
105
|
-
* tab per `R.relations()` manager. `activeKey` selects which tab the
|
|
106
|
-
* renderer highlights — `'__view'` / `'__edit'` for the parent tabs,
|
|
107
|
-
* the manager's relationship key for a manager tab.
|
|
108
|
-
*
|
|
109
|
-
* Sub-nav follow-up (2026-05-03 cont'd) — emit BOTH `__view` and
|
|
110
|
-
* `__edit` as sibling tabs (record sub-navigation) instead of one
|
|
111
|
-
* parent tab whose label depends on mode. Tabs are dropped when the
|
|
112
|
-
* corresponding page role isn't registered (a Resource overriding
|
|
113
|
-
* `pages()` to omit `view` or `edit` shouldn't surface a tab that
|
|
114
|
-
* 404s).
|
|
115
|
-
*
|
|
116
|
-
* Per-tab `canX` gating (2026-05-11) — the strip now also evaluates
|
|
117
|
-
* the matching predicate for each tab and drops the entry when the
|
|
118
|
-
* user can't reach it. Routes still enforce; this is presentation
|
|
119
|
-
* polish so the chrome doesn't promise a link that 403s on click.
|
|
120
|
-
*
|
|
121
|
-
* - `__view` → `R.canView(user, parentRecord)` (skip gating when
|
|
122
|
-
* `parentRecord` is undefined — record load failed,
|
|
123
|
-
* so the route's own load+gate will surface a 404/403
|
|
124
|
-
* rather than the strip hiding silently).
|
|
125
|
-
* - `__edit` → `R.canEdit(user, parentRecord)` (same posture).
|
|
126
|
-
* - manager → `safeManagerPolicy(M, 'canViewAny', Related, user,
|
|
127
|
-
* parentRecord)` (falls through to Related's
|
|
128
|
-
* `canViewAny` when the manager hasn't overridden).
|
|
129
|
-
*
|
|
130
|
-
* Returns `undefined` when the resource has no relation managers — the
|
|
131
|
-
* caller can then skip the prepend entirely so resources without
|
|
132
|
-
* relations stay shape-compatible with their existing schemaData.
|
|
133
|
-
* (View+Edit sub-nav alone isn't worth a tab strip; users navigate
|
|
134
|
-
* those via headerActions or the back link.)
|
|
135
|
-
*/
|
|
136
|
-
export async function buildRelationTabs(
|
|
137
|
-
R: ResourceClass,
|
|
138
|
-
recordId: string,
|
|
139
|
-
basePath: string,
|
|
140
|
-
activeKey: string,
|
|
141
|
-
user: unknown,
|
|
142
|
-
parentRecord: unknown,
|
|
143
|
-
): Promise<RelationTabs | undefined> {
|
|
144
|
-
const managers = R.relations()
|
|
145
|
-
const recordPageMap = R.getRecordPages()
|
|
146
|
-
const recordPageSlugs = Object.keys(recordPageMap)
|
|
147
|
-
// No managers AND no record sub-pages → no strip. View+Edit alone
|
|
148
|
-
// isn't worth a tab strip; users navigate those via headerActions or
|
|
149
|
-
// the back link. (When either is non-empty, the strip is worth
|
|
150
|
-
// mounting even if all the dynamic tabs end up gated away — the
|
|
151
|
-
// post-gate emptiness check below catches that.)
|
|
152
|
-
if (managers.length === 0 && recordPageSlugs.length === 0) return undefined
|
|
153
|
-
|
|
154
|
-
const resourceBase = resourceBasePath(basePath, R)
|
|
155
|
-
const pages = R.resolvePages()
|
|
156
|
-
|
|
157
|
-
// Evaluate every per-tab predicate in parallel. The arrays line up
|
|
158
|
-
// 1:1 with `pages.view` / `pages.edit` / `recordPageSlugs` /
|
|
159
|
-
// `managers` below — we resolve all gates first so the tab-build
|
|
160
|
-
// loop stays straight-line.
|
|
161
|
-
// Record-aware predicates short-circuit to `true` when no parent
|
|
162
|
-
// record was loaded (presentation should never hide more aggressively
|
|
163
|
-
// than the route can enforce; a missing record means the route will
|
|
164
|
-
// 404/403 on click and the strip stays consistent with that).
|
|
165
|
-
const canViewPromise = pages.view && parentRecord !== undefined && parentRecord !== null
|
|
166
|
-
? safeBool(() => R.canView(user, parentRecord))
|
|
167
|
-
: Promise.resolve(true)
|
|
168
|
-
const canEditPromise = pages.edit && parentRecord !== undefined && parentRecord !== null
|
|
169
|
-
? safeBool(() => R.canEdit(user, parentRecord))
|
|
170
|
-
: Promise.resolve(true)
|
|
171
|
-
const recordPageGates = recordPageSlugs.map(subSlug => {
|
|
172
|
-
// Record sub-page gates run against the parent record verbatim —
|
|
173
|
-
// missing record still calls the predicate so a sub-page that
|
|
174
|
-
// gates on global user state (no record needed) still evaluates.
|
|
175
|
-
// safeBool fails closed for throwing predicates.
|
|
176
|
-
return safeBool(() => recordPageMap[subSlug]!.canAccess(user, parentRecord))
|
|
177
|
-
})
|
|
178
|
-
const managerGates = managers.map(M => {
|
|
179
|
-
const Related = (M as unknown as { relatedResource?: ResourceClass }).relatedResource
|
|
180
|
-
return safeManagerPolicyImpl(M, 'canViewAny', Related, user, parentRecord)
|
|
181
|
-
})
|
|
182
|
-
const gateResults = await Promise.all([
|
|
183
|
-
canViewPromise, canEditPromise,
|
|
184
|
-
...recordPageGates,
|
|
185
|
-
...managerGates,
|
|
186
|
-
])
|
|
187
|
-
const canView = gateResults[0] as boolean
|
|
188
|
-
const canEdit = gateResults[1] as boolean
|
|
189
|
-
const recordPageVisible = gateResults.slice(2, 2 + recordPageSlugs.length) as boolean[]
|
|
190
|
-
const managerVisible = gateResults.slice(2 + recordPageSlugs.length) as boolean[]
|
|
191
|
-
|
|
192
|
-
const tabs: RelationTabMeta[] = []
|
|
193
|
-
|
|
194
|
-
if (pages.view && canView) {
|
|
195
|
-
tabs.push(relationTab({
|
|
196
|
-
key: '__view',
|
|
197
|
-
label: 'View',
|
|
198
|
-
url: `${resourceBase}/${recordId}`,
|
|
199
|
-
active: activeKey === '__view',
|
|
200
|
-
icon: R.icon as IconValue | undefined,
|
|
201
|
-
iconOwner: R.name,
|
|
202
|
-
}))
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if (pages.edit && canEdit) {
|
|
206
|
-
tabs.push(relationTab({
|
|
207
|
-
key: '__edit',
|
|
208
|
-
label: 'Edit',
|
|
209
|
-
url: `${resourceBase}/${recordId}/edit`,
|
|
210
|
-
active: activeKey === '__edit',
|
|
211
|
-
// Re-use the resource icon so when ViewPage is pruned, Edit
|
|
212
|
-
// still carries the visual identity. When both are present, the
|
|
213
|
-
// icon repeats — acceptable; the labels disambiguate.
|
|
214
|
-
icon: R.icon as IconValue | undefined,
|
|
215
|
-
iconOwner: R.name,
|
|
216
|
-
}))
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Record sub-page tabs — between Edit and the managers, in declaration
|
|
220
|
-
// order. Tab label inherits from the sub-page's class (`getLabel()`);
|
|
221
|
-
// icon picks up the sub-page's static `icon` when set. Slug doubles as
|
|
222
|
-
// the URL segment AND the `activeKey` discriminator the data builder
|
|
223
|
-
// passes when rendering the sub-page.
|
|
224
|
-
recordPageSlugs.forEach((subSlug, i) => {
|
|
225
|
-
if (!recordPageVisible[i]) return
|
|
226
|
-
const SubPage = recordPageMap[subSlug]!
|
|
227
|
-
tabs.push(relationTab({
|
|
228
|
-
key: subSlug,
|
|
229
|
-
label: SubPage.getLabel(),
|
|
230
|
-
url: `${resourceBase}/${recordId}/${subSlug}`,
|
|
231
|
-
active: activeKey === subSlug,
|
|
232
|
-
...(SubPage.icon !== undefined
|
|
233
|
-
? { icon: SubPage.icon, iconOwner: SubPage.name }
|
|
234
|
-
: {}),
|
|
235
|
-
}))
|
|
236
|
-
})
|
|
237
|
-
|
|
238
|
-
managers.forEach((M, i) => {
|
|
239
|
-
if (!managerVisible[i]) return
|
|
240
|
-
let rel: string
|
|
241
|
-
try { rel = M.getRelationship() } catch { return }
|
|
242
|
-
const icon = M.getIcon()
|
|
243
|
-
tabs.push(relationTab({
|
|
244
|
-
key: rel,
|
|
245
|
-
label: M.getLabel(),
|
|
246
|
-
url: `${resourceBase}/${recordId}/${rel}`,
|
|
247
|
-
active: activeKey === rel,
|
|
248
|
-
...(icon !== undefined ? { icon, iconOwner: M.name } : {}),
|
|
249
|
-
}))
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
// After gating, the strip may collapse to zero entries. Mirror the
|
|
253
|
-
// "no managers + no sub-pages" branch above — no strip is friendlier
|
|
254
|
-
// than a one-tab strip with just the active page.
|
|
255
|
-
if (tabs.length === 0) return undefined
|
|
256
|
-
|
|
257
|
-
return RelationTabs.make(tabs)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
export { safeBool }
|
|
261
|
-
|
|
262
|
-
/** Pull a human-readable title off a parent record for breadcrumb /
|
|
263
|
-
* page-title use. Falls back through `recordTitleAttribute` →
|
|
264
|
-
* `name` → `title` → primary key value → 'Record'. */
|
|
265
|
-
export function deriveParentTitle(
|
|
266
|
-
R: ResourceClass,
|
|
267
|
-
record: unknown,
|
|
268
|
-
manager?: typeof RelationManager,
|
|
269
|
-
): string {
|
|
270
|
-
const r = record as Record<string, unknown>
|
|
271
|
-
// Manager-scoped child rows prefer the manager's `recordTitleAttribute`
|
|
272
|
-
// when set — the manager owns its presentation surface, and the related
|
|
273
|
-
// Resource may not opt into the same column (e.g. nested-only Resources
|
|
274
|
-
// that exist purely to back a manager).
|
|
275
|
-
const managerAttr = manager?.recordTitleAttribute
|
|
276
|
-
if (managerAttr && r[managerAttr] != null) return String(r[managerAttr])
|
|
277
|
-
const attr = R.recordTitleAttribute
|
|
278
|
-
if (attr && r[attr] != null) return String(r[attr])
|
|
279
|
-
if (r['name'] != null) return String(r['name'])
|
|
280
|
-
if (r['title'] != null) return String(r['title'])
|
|
281
|
-
if (R.model) {
|
|
282
|
-
const pk = getPrimaryKey(R.model)
|
|
283
|
-
if (r[pk] != null) return String(r[pk])
|
|
284
|
-
}
|
|
285
|
-
return 'Record'
|
|
286
|
-
}
|