@pilotiq/pilotiq 0.24.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 +33 -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/package.json +6 -1
- 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,239 +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 { RepeatableEntry } from './RepeatableEntry.js'
|
|
6
|
-
import { TextEntry } from './TextEntry.js'
|
|
7
|
-
import { BadgeEntry } from './BadgeEntry.js'
|
|
8
|
-
import type { ElementMeta } from '../schema/Element.js'
|
|
9
|
-
import type { EntryMeta } from './Entry.js'
|
|
10
|
-
|
|
11
|
-
beforeEach(() => _resetResolverRegistry())
|
|
12
|
-
|
|
13
|
-
describe('RepeatableEntry', () => {
|
|
14
|
-
it('serializes the discriminator + chrome', async () => {
|
|
15
|
-
const out = await resolveSchema(
|
|
16
|
-
[RepeatableEntry.make('items').schema([TextEntry.make('label')])],
|
|
17
|
-
{ record: { items: [{ label: 'A' }, { label: 'B' }] } },
|
|
18
|
-
)
|
|
19
|
-
const m = out[0] as EntryMeta
|
|
20
|
-
assert.equal(m.entryType, 'repeatable')
|
|
21
|
-
assert.equal(m.label, 'Items')
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
it('resolves one row per array element with row-scoped record', async () => {
|
|
25
|
-
const out = await resolveSchema(
|
|
26
|
-
[RepeatableEntry.make('items').schema([
|
|
27
|
-
TextEntry.make('label'),
|
|
28
|
-
BadgeEntry.make('status'),
|
|
29
|
-
])],
|
|
30
|
-
{ record: { items: [
|
|
31
|
-
{ label: 'Item A', status: 'draft' },
|
|
32
|
-
{ label: 'Item B', status: 'published' },
|
|
33
|
-
] } },
|
|
34
|
-
)
|
|
35
|
-
const m = out[0] as ElementMeta & { rows: Array<{ id: string; children: ElementMeta[] }> }
|
|
36
|
-
assert.equal(m.rows.length, 2)
|
|
37
|
-
assert.equal(m.rows[0]!.children.length, 2)
|
|
38
|
-
// Row 0: TextEntry resolved against { label: 'Item A', status: 'draft' }
|
|
39
|
-
assert.equal((m.rows[0]!.children[0] as ElementMeta)['value'], 'Item A')
|
|
40
|
-
assert.equal((m.rows[0]!.children[1] as ElementMeta)['value'], 'draft')
|
|
41
|
-
// Row 1
|
|
42
|
-
assert.equal((m.rows[1]!.children[0] as ElementMeta)['value'], 'Item B')
|
|
43
|
-
assert.equal((m.rows[1]!.children[1] as ElementMeta)['value'], 'published')
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('emits empty rows when the record value is missing / null / non-array', async () => {
|
|
47
|
-
const cases: Array<unknown> = [undefined, null, 'not-an-array', 42, {}]
|
|
48
|
-
for (const value of cases) {
|
|
49
|
-
const out = await resolveSchema(
|
|
50
|
-
[RepeatableEntry.make('items').schema([TextEntry.make('label')])],
|
|
51
|
-
{ record: { items: value } },
|
|
52
|
-
)
|
|
53
|
-
const m = out[0] as ElementMeta & { rows: unknown[] }
|
|
54
|
-
assert.deepEqual(m.rows, [], `expected empty rows for ${JSON.stringify(value)}`)
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('emits empty rows when the array is empty', async () => {
|
|
59
|
-
const out = await resolveSchema(
|
|
60
|
-
[RepeatableEntry.make('items').schema([TextEntry.make('label')])],
|
|
61
|
-
{ record: { items: [] } },
|
|
62
|
-
)
|
|
63
|
-
const m = out[0] as ElementMeta & { rows: unknown[] }
|
|
64
|
-
assert.deepEqual(m.rows, [])
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('reads stable ids off id / __id / uuid; falls back to fieldName-index', async () => {
|
|
68
|
-
const out = await resolveSchema(
|
|
69
|
-
[RepeatableEntry.make('items').schema([TextEntry.make('label')])],
|
|
70
|
-
{ record: { items: [
|
|
71
|
-
{ id: 7, label: 'A' },
|
|
72
|
-
{ __id: 'x-9', label: 'B' },
|
|
73
|
-
{ uuid: 'u-3', label: 'C' },
|
|
74
|
-
{ label: 'D' }, // no id-ish field
|
|
75
|
-
] } },
|
|
76
|
-
)
|
|
77
|
-
const m = out[0] as ElementMeta & { rows: Array<{ id: string }> }
|
|
78
|
-
assert.equal(m.rows[0]!.id, '7')
|
|
79
|
-
assert.equal(m.rows[1]!.id, 'x-9')
|
|
80
|
-
assert.equal(m.rows[2]!.id, 'u-3')
|
|
81
|
-
assert.equal(m.rows[3]!.id, 'items-3')
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('emits columns / grid / table chrome only when configured', async () => {
|
|
85
|
-
const bare = await resolveSchema(
|
|
86
|
-
[RepeatableEntry.make('items').schema([TextEntry.make('label')])],
|
|
87
|
-
{ record: { items: [{ label: 'A' }] } },
|
|
88
|
-
)
|
|
89
|
-
const m0 = bare[0] as ElementMeta & {
|
|
90
|
-
columns?: number; grid?: number; table?: unknown; contained?: boolean
|
|
91
|
-
}
|
|
92
|
-
assert.equal(m0.columns, undefined)
|
|
93
|
-
assert.equal(m0.grid, undefined)
|
|
94
|
-
assert.equal(m0.table, undefined)
|
|
95
|
-
assert.equal(m0.contained, undefined)
|
|
96
|
-
|
|
97
|
-
const styled = await resolveSchema(
|
|
98
|
-
[
|
|
99
|
-
RepeatableEntry.make('items')
|
|
100
|
-
.schema([TextEntry.make('label')])
|
|
101
|
-
.columns(2)
|
|
102
|
-
.grid(3)
|
|
103
|
-
.contained(false),
|
|
104
|
-
],
|
|
105
|
-
{ record: { items: [{ label: 'A' }] } },
|
|
106
|
-
)
|
|
107
|
-
const m1 = styled[0] as ElementMeta & {
|
|
108
|
-
columns?: number; grid?: number; contained?: boolean
|
|
109
|
-
}
|
|
110
|
-
assert.equal(m1.columns, 2)
|
|
111
|
-
assert.equal(m1.grid, 3)
|
|
112
|
-
assert.equal(m1.contained, false)
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('grid(n<2) clears the grid mode', async () => {
|
|
116
|
-
const out = await resolveSchema(
|
|
117
|
-
[RepeatableEntry.make('items').schema([TextEntry.make('label')]).grid(3).grid(1)],
|
|
118
|
-
{ record: { items: [{ label: 'A' }] } },
|
|
119
|
-
)
|
|
120
|
-
const m = out[0] as ElementMeta & { grid?: number }
|
|
121
|
-
assert.equal(m.grid, undefined)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('table(...) emits the column descriptors', async () => {
|
|
125
|
-
const out = await resolveSchema(
|
|
126
|
-
[
|
|
127
|
-
RepeatableEntry.make('items')
|
|
128
|
-
.schema([TextEntry.make('label'), TextEntry.make('qty').numeric()])
|
|
129
|
-
.table([
|
|
130
|
-
{ label: 'Item' },
|
|
131
|
-
{ label: 'Qty', alignment: 'right', width: '6rem' },
|
|
132
|
-
]),
|
|
133
|
-
],
|
|
134
|
-
{ record: { items: [{ label: 'A', qty: 1 }] } },
|
|
135
|
-
)
|
|
136
|
-
const m = out[0] as ElementMeta & {
|
|
137
|
-
table?: { columns: Array<{ label: string; alignment?: string; width?: string }> }
|
|
138
|
-
}
|
|
139
|
-
assert.equal(m.table?.columns.length, 2)
|
|
140
|
-
assert.equal(m.table?.columns[0]?.label, 'Item')
|
|
141
|
-
assert.equal(m.table?.columns[1]?.alignment, 'right')
|
|
142
|
-
assert.equal(m.table?.columns[1]?.width, '6rem')
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
it('table([]) clears table mode', async () => {
|
|
146
|
-
const out = await resolveSchema(
|
|
147
|
-
[
|
|
148
|
-
RepeatableEntry.make('items')
|
|
149
|
-
.schema([TextEntry.make('label')])
|
|
150
|
-
.table([{ label: 'X' }])
|
|
151
|
-
.table([]),
|
|
152
|
-
],
|
|
153
|
-
{ record: { items: [{ label: 'A' }] } },
|
|
154
|
-
)
|
|
155
|
-
const m = out[0] as ElementMeta & { table?: unknown }
|
|
156
|
-
assert.equal(m.table, undefined)
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
it('inner formatStateUsing runs per row against the row record', async () => {
|
|
160
|
-
const out = await resolveSchema(
|
|
161
|
-
[
|
|
162
|
-
RepeatableEntry.make('items').schema([
|
|
163
|
-
TextEntry.make('amount').formatStateUsing(v => `$${Number(v).toFixed(2)}`),
|
|
164
|
-
]),
|
|
165
|
-
],
|
|
166
|
-
{ record: { items: [
|
|
167
|
-
{ amount: 10 },
|
|
168
|
-
{ amount: 12.5 },
|
|
169
|
-
] } },
|
|
170
|
-
)
|
|
171
|
-
const m = out[0] as ElementMeta & { rows: Array<{ children: ElementMeta[] }> }
|
|
172
|
-
assert.equal((m.rows[0]!.children[0] as ElementMeta)['_formatted'], '$10.00')
|
|
173
|
-
assert.equal((m.rows[1]!.children[0] as ElementMeta)['_formatted'], '$12.50')
|
|
174
|
-
})
|
|
175
|
-
|
|
176
|
-
it('primitive array elements stash under `_value` so an inner _value entry can target them', async () => {
|
|
177
|
-
const out = await resolveSchema(
|
|
178
|
-
[RepeatableEntry.make('tags').schema([TextEntry.make('_value').label('Tag')])],
|
|
179
|
-
{ record: { tags: ['featured', 'sale', 'new'] } },
|
|
180
|
-
)
|
|
181
|
-
const m = out[0] as ElementMeta & { rows: Array<{ children: ElementMeta[] }> }
|
|
182
|
-
assert.equal(m.rows.length, 3)
|
|
183
|
-
assert.equal((m.rows[0]!.children[0] as ElementMeta)['value'], 'featured')
|
|
184
|
-
assert.equal((m.rows[2]!.children[0] as ElementMeta)['value'], 'new')
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
it('inherits Entry chrome — label / inlineLabel / helperText / default', async () => {
|
|
188
|
-
const out = await resolveSchema(
|
|
189
|
-
[
|
|
190
|
-
RepeatableEntry.make('items')
|
|
191
|
-
.label('Line items')
|
|
192
|
-
.inlineLabel()
|
|
193
|
-
.helperText('From the original PO')
|
|
194
|
-
.default('No items')
|
|
195
|
-
.schema([TextEntry.make('label')]),
|
|
196
|
-
],
|
|
197
|
-
{ record: { items: [{ label: 'A' }] } },
|
|
198
|
-
)
|
|
199
|
-
const m = out[0] as ElementMeta
|
|
200
|
-
assert.equal(m['label'], 'Line items')
|
|
201
|
-
assert.equal(m['inlineLabel'], true)
|
|
202
|
-
assert.equal(m['helperText'], 'From the original PO')
|
|
203
|
-
assert.equal(m['default'], 'No items')
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
it('accepts a custom state() resolver for the array source', async () => {
|
|
207
|
-
const out = await resolveSchema(
|
|
208
|
-
[
|
|
209
|
-
RepeatableEntry.make('lines')
|
|
210
|
-
.state((r: Record<string, unknown>) => r['nested'] as unknown[])
|
|
211
|
-
.schema([TextEntry.make('label')]),
|
|
212
|
-
],
|
|
213
|
-
// No top-level `lines` key — the resolver pulls from `nested` instead.
|
|
214
|
-
// Note: state() only feeds `EntryMeta.value`. The row source is read
|
|
215
|
-
// directly off `record[name]`, so this scenario is a no-rows case
|
|
216
|
-
// unless the consumer also names the field after the source key.
|
|
217
|
-
{ record: { lines: [{ label: 'A' }], nested: [{ label: 'X' }] } },
|
|
218
|
-
)
|
|
219
|
-
const m = out[0] as ElementMeta & {
|
|
220
|
-
rows: Array<{ children: ElementMeta[] }>
|
|
221
|
-
value?: unknown
|
|
222
|
-
}
|
|
223
|
-
// Rows still resolve from `record.lines` (RepeatableEntry's row source
|
|
224
|
-
// is name-bound — `state()` doesn't redirect the row read).
|
|
225
|
-
assert.equal(m.rows.length, 1)
|
|
226
|
-
assert.equal((m.rows[0]!.children[0] as ElementMeta)['value'], 'A')
|
|
227
|
-
// But the `value` field reflects the state() override.
|
|
228
|
-
assert.deepEqual(m.value, [{ label: 'X' }])
|
|
229
|
-
})
|
|
230
|
-
|
|
231
|
-
it('empty inner schema short-circuits to empty rows', async () => {
|
|
232
|
-
const out = await resolveSchema(
|
|
233
|
-
[RepeatableEntry.make('items')],
|
|
234
|
-
{ record: { items: [{ label: 'A' }] } },
|
|
235
|
-
)
|
|
236
|
-
const m = out[0] as ElementMeta & { rows: unknown[] }
|
|
237
|
-
assert.deepEqual(m.rows, [])
|
|
238
|
-
})
|
|
239
|
-
})
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { Element, type ElementMeta } from '../schema/Element.js'
|
|
2
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
3
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Header descriptor for `RepeatableEntry.table([...])` mode. One entry per
|
|
7
|
-
* inner schema element, in declaration order — column[i] is the header for
|
|
8
|
-
* `schema[i]`. Mirrors `RepeaterTableColumn` so the two surfaces read the
|
|
9
|
-
* same; kept as a separate type so future divergences (e.g. `width()` on a
|
|
10
|
-
* read-only column) can land here without touching the form-side field.
|
|
11
|
-
*
|
|
12
|
-
* `alignment` aligns header text + cell contents (cells use `text-*`).
|
|
13
|
-
* `width` is a raw CSS width string passed to `<col style="width: …">`.
|
|
14
|
-
*/
|
|
15
|
-
export interface RepeatableEntryTableColumn {
|
|
16
|
-
label: string
|
|
17
|
-
alignment?: 'left' | 'center' | 'right'
|
|
18
|
-
width?: string
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* One resolved row of a `RepeatableEntry`. `id` is a stable per-row key
|
|
23
|
-
* (read from the row's `id`-ish field if present, otherwise the row index)
|
|
24
|
-
* so React reconciliation behaves on reorder. `children` is the resolved
|
|
25
|
-
* inner schema, scoped to this row's record.
|
|
26
|
-
*/
|
|
27
|
-
export interface RepeatableEntryRowMeta {
|
|
28
|
-
id: string
|
|
29
|
-
children: ElementMeta[]
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface RepeatableEntryMeta extends EntryMeta {
|
|
33
|
-
rows: RepeatableEntryRowMeta[]
|
|
34
|
-
/** Column count for the inner schema *inside* one card (mirrors
|
|
35
|
-
* `Repeater.columns`). Ignored under `table` mode. */
|
|
36
|
-
columns?: number
|
|
37
|
-
/** Number of cards across (≥ 2). Ignored under `table` mode. */
|
|
38
|
-
grid?: number
|
|
39
|
-
/** Compact `<table>` layout — supplied headers map 1:1 to inner schema
|
|
40
|
-
* fields by declaration order. Mutually exclusive with `columns / grid`
|
|
41
|
-
* (the renderer picks the most specific layout — `table > grid > stack`). */
|
|
42
|
-
table?: { columns: RepeatableEntryTableColumn[] }
|
|
43
|
-
/** When `false`, strips the outer card chrome — useful when each row is
|
|
44
|
-
* already self-contained (e.g. a single `Section.aside()` per row). */
|
|
45
|
-
contained?: boolean
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Read-only sibling of `RepeaterField`. Renders an array stored on the
|
|
50
|
-
* record (`ctx.record[name]`) as a stack of cards (default), an n-column
|
|
51
|
-
* grid (`grid(n)`), or a compact HTML table (`table([…])`), with the inner
|
|
52
|
-
* schema resolved once per row against that row's record.
|
|
53
|
-
*
|
|
54
|
-
* Each row's children resolve with `ctx.record` set to the row's data, so
|
|
55
|
-
* inner entries (`TextEntry / BadgeEntry / IconEntry / ImageEntry / …`) read
|
|
56
|
-
* their state via the same `record[name]` lookup they use everywhere else.
|
|
57
|
-
*
|
|
58
|
-
* `RepeatableEntry` does not coerce or validate — the value at
|
|
59
|
-
* `ctx.record[name]` is read as-is. Non-array / null / undefined / empty-
|
|
60
|
-
* array values render the inherited `default()` placeholder.
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* RepeatableEntry.make('lineItems').schema([
|
|
64
|
-
* TextEntry.make('description'),
|
|
65
|
-
* TextEntry.make('quantity').numeric(),
|
|
66
|
-
* TextEntry.make('total').money('USD'),
|
|
67
|
-
* ]).table([
|
|
68
|
-
* { label: 'Item' },
|
|
69
|
-
* { label: 'Qty', alignment: 'right' },
|
|
70
|
-
* { label: 'Total', alignment: 'right' },
|
|
71
|
-
* ])
|
|
72
|
-
*/
|
|
73
|
-
export class RepeatableEntry extends Entry {
|
|
74
|
-
protected override _children: Element[] = []
|
|
75
|
-
|
|
76
|
-
private _columns?: number
|
|
77
|
-
private _grid?: number
|
|
78
|
-
private _tableColumns?: RepeatableEntryTableColumn[]
|
|
79
|
-
private _contained = true
|
|
80
|
-
|
|
81
|
-
private constructor(name: string) {
|
|
82
|
-
super(name)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
static make(name: string): RepeatableEntry {
|
|
86
|
-
return new RepeatableEntry(name)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
protected override getEntryType(): string { return 'repeatable' }
|
|
90
|
-
|
|
91
|
-
/** Inner schema rendered per row. */
|
|
92
|
-
schema(elements: Element[]): this {
|
|
93
|
-
this._children = elements
|
|
94
|
-
return this
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/** Grid column count for the inner schema *inside* one card (mirrors
|
|
98
|
-
* `Repeater.columns`). Ignored under table mode. */
|
|
99
|
-
columns(n: number): this { this._columns = n; return this }
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Lay the rows themselves in an n-column grid. Mirrors `Repeater.grid(n)`
|
|
103
|
-
* but read-only and v1 only takes a fixed integer (the responsive object
|
|
104
|
-
* form on Repeater is a form-side ergonomic — defer until asked).
|
|
105
|
-
*
|
|
106
|
-
* `n < 2` resets to vertical stack (the default).
|
|
107
|
-
*/
|
|
108
|
-
grid(n: number): this {
|
|
109
|
-
if (n >= 2) this._grid = n
|
|
110
|
-
else delete this._grid
|
|
111
|
-
return this
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Compact `<table>` layout — one `<tr>` per row, one `<td>` per inner
|
|
116
|
-
* entry, with the supplied headers above. Columns map 1:1 to inner
|
|
117
|
-
* schema entries by declaration order.
|
|
118
|
-
*
|
|
119
|
-
* Mutually exclusive with `columns / grid` at render time (the renderer
|
|
120
|
-
* dispatches `table > grid > stack`). Pass an empty array to clear.
|
|
121
|
-
*/
|
|
122
|
-
table(columns: RepeatableEntryTableColumn[]): this {
|
|
123
|
-
if (columns.length === 0) delete this._tableColumns
|
|
124
|
-
else this._tableColumns = columns
|
|
125
|
-
return this
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Toggle the outer card chrome. `contained(false)` drops the card border
|
|
130
|
-
* + padding so each row sits flush — useful when the inner schema brings
|
|
131
|
-
* its own visual container (a `Section.aside()` per row, say).
|
|
132
|
-
*/
|
|
133
|
-
contained(v = true): this { this._contained = v; return this }
|
|
134
|
-
|
|
135
|
-
// ─── Read-only access for the resolver ──────────────────
|
|
136
|
-
|
|
137
|
-
override getChildren(): Element[] | undefined {
|
|
138
|
-
return this._children.length > 0 ? this._children : undefined
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** Direct access to the inner schema — used by `resolveRepeatableRows`. */
|
|
142
|
-
getInnerSchema(): Element[] { return this._children }
|
|
143
|
-
|
|
144
|
-
getColumns(): number | undefined { return this._columns }
|
|
145
|
-
getGrid(): number | undefined { return this._grid }
|
|
146
|
-
getTableColumns(): RepeatableEntryTableColumn[] | undefined { return this._tableColumns }
|
|
147
|
-
isContained(): boolean { return this._contained }
|
|
148
|
-
|
|
149
|
-
override async toMeta(ctx?: RenderContext): Promise<RepeatableEntryMeta> {
|
|
150
|
-
const meta = await Promise.resolve(super.toMeta(ctx)) as RepeatableEntryMeta
|
|
151
|
-
meta.rows = []
|
|
152
|
-
if (this._columns !== undefined) meta.columns = this._columns
|
|
153
|
-
if (this._grid !== undefined) meta.grid = this._grid
|
|
154
|
-
if (this._tableColumns !== undefined) meta.table = { columns: this._tableColumns }
|
|
155
|
-
if (!this._contained) meta.contained = false
|
|
156
|
-
return meta
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** Read a row's stable id off common conventions; falls back to the row
|
|
161
|
-
* index when the row carries no id-ish field. Mirrors `readRowId` over in
|
|
162
|
-
* `resolveSchema.ts` but inlined here so the entry layer doesn't depend on
|
|
163
|
-
* Repeater internals. */
|
|
164
|
-
export function readRepeatableRowId(row: unknown, fieldName: string, index: number): string {
|
|
165
|
-
if (row && typeof row === 'object' && !Array.isArray(row)) {
|
|
166
|
-
const r = row as Record<string, unknown>
|
|
167
|
-
const candidate = r['id'] ?? r['__id'] ?? r['uuid']
|
|
168
|
-
if (typeof candidate === 'string' || typeof candidate === 'number') {
|
|
169
|
-
return String(candidate)
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return `${fieldName}-${index}`
|
|
173
|
-
}
|