@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,381 +0,0 @@
|
|
|
1
|
-
import type { ElementMeta } from '../schema/Element.js'
|
|
2
|
-
import type { FormCollabBinding } from './FormCollabBindingRegistry.js'
|
|
3
|
-
|
|
4
|
-
/** Walk a form's child tree and collect every Field's `defaultValue` into
|
|
5
|
-
* a flat values map keyed by field name. Used by `FormStateProvider` to
|
|
6
|
-
* seed its controlled-state map from the server's initial render. */
|
|
7
|
-
export function collectFieldDefaults(formMeta: ElementMeta): Record<string, unknown> {
|
|
8
|
-
const out: Record<string, unknown> = {}
|
|
9
|
-
// Server already overlays form-level `values` onto each field's
|
|
10
|
-
// `defaultValue` during resolveSchema, so we only need to read the
|
|
11
|
-
// field's `defaultValue`. We also overlay `formMeta.values` last as a
|
|
12
|
-
// safety net for any field that didn't carry a defaultValue but has a
|
|
13
|
-
// matching key on the form.
|
|
14
|
-
walkFields(formMeta, (field) => {
|
|
15
|
-
const name = String(field['name'] ?? '')
|
|
16
|
-
if (!name) return
|
|
17
|
-
const defaultValue = field['defaultValue']
|
|
18
|
-
if (defaultValue !== undefined) {
|
|
19
|
-
out[name] = defaultValue
|
|
20
|
-
} else if (!(name in out)) {
|
|
21
|
-
out[name] = ''
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
const formValues = (formMeta as { values?: Record<string, unknown> }).values
|
|
26
|
-
if (formValues) {
|
|
27
|
-
for (const [k, v] of Object.entries(formValues)) {
|
|
28
|
-
if (v !== undefined) out[k] = v
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return out
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Locate a Field meta by name within a form's descendants. Returns
|
|
35
|
-
* `undefined` when no match. Used by `triggerLive` to look up the
|
|
36
|
-
* field's `live` config.
|
|
37
|
-
*
|
|
38
|
-
* Plan #14 — for dotted-path names like `items.0.product` (a field
|
|
39
|
-
* inside a Repeater row), walks into the Repeater's first row's
|
|
40
|
-
* children to find the inner field. The inner field's `live` config
|
|
41
|
-
* is identical for every row (it's defined once on the field), so
|
|
42
|
-
* reading from row 0 is sufficient. */
|
|
43
|
-
export function findFieldMeta(formMeta: ElementMeta, name: string): ElementMeta | undefined {
|
|
44
|
-
if (name.includes('.')) return findFieldMetaDotted(formMeta, name)
|
|
45
|
-
let found: ElementMeta | undefined
|
|
46
|
-
walkFields(formMeta, (field) => {
|
|
47
|
-
if (found) return
|
|
48
|
-
if (String(field['name'] ?? '') === name) found = field
|
|
49
|
-
})
|
|
50
|
-
return found
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Walk a dotted path against a form tree. Segments alternate
|
|
54
|
-
* field-name and row-index. Mirrors the server-side `resolveRepeaterPath`
|
|
55
|
-
* in `dispatchForm.ts`. */
|
|
56
|
-
function findFieldMetaDotted(formMeta: ElementMeta, path: string): ElementMeta | undefined {
|
|
57
|
-
const segments = path.split('.')
|
|
58
|
-
let currentChildren: ElementMeta[] = (formMeta.children as ElementMeta[] | undefined) ?? []
|
|
59
|
-
let i = 0
|
|
60
|
-
while (i < segments.length) {
|
|
61
|
-
const fieldName = segments[i]
|
|
62
|
-
if (fieldName === undefined) return undefined
|
|
63
|
-
const field = findChildFieldByName(currentChildren, fieldName)
|
|
64
|
-
if (!field) return undefined
|
|
65
|
-
// Leaf — last segment was a field name.
|
|
66
|
-
if (i === segments.length - 1) return field
|
|
67
|
-
// Otherwise we must be inside a Repeater; the next segment is a row index.
|
|
68
|
-
if (field['fieldType'] !== 'repeater') return undefined
|
|
69
|
-
const idxRaw = segments[i + 1]
|
|
70
|
-
if (idxRaw === undefined) return undefined
|
|
71
|
-
const idx = Number(idxRaw)
|
|
72
|
-
if (!Number.isInteger(idx) || idx < 0) return undefined
|
|
73
|
-
// Live config is template-level; row 0's children are equivalent for
|
|
74
|
-
// lookup. Fall back to the requested row when present (handles future
|
|
75
|
-
// per-row schema variants without re-coding).
|
|
76
|
-
const rows = (field['rows'] as Array<{ children: ElementMeta[] }> | undefined) ?? []
|
|
77
|
-
const row = rows[idx] ?? rows[0]
|
|
78
|
-
if (!row) {
|
|
79
|
-
const tpl = (field['template'] as ElementMeta[] | undefined) ?? []
|
|
80
|
-
currentChildren = tpl
|
|
81
|
-
} else {
|
|
82
|
-
currentChildren = row.children
|
|
83
|
-
}
|
|
84
|
-
i += 2
|
|
85
|
-
}
|
|
86
|
-
return undefined
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/** Find a direct child field by name — non-recursive (only scans the
|
|
90
|
-
* immediate `Field` children of the given list). Layout containers are
|
|
91
|
-
* flattened first so a Field inside `Section / Card / Group / etc.`
|
|
92
|
-
* still counts as a "direct" child of the row's schema. */
|
|
93
|
-
function findChildFieldByName(elements: ElementMeta[], name: string): ElementMeta | undefined {
|
|
94
|
-
for (const el of elements) {
|
|
95
|
-
if (el.type === 'field' && String(el['name'] ?? '') === name) return el
|
|
96
|
-
// Don't recurse into a Repeater's children — the dotted path handles
|
|
97
|
-
// that explicitly via the next segment.
|
|
98
|
-
if (el['fieldType'] === 'repeater') continue
|
|
99
|
-
const children = el.children as ElementMeta[] | undefined
|
|
100
|
-
if (Array.isArray(children) && children.length > 0) {
|
|
101
|
-
const hit = findChildFieldByName(children, name)
|
|
102
|
-
if (hit) return hit
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return undefined
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Recursive walker — visits every `field`-typed descendant. Stops at
|
|
109
|
-
* Repeater boundaries (its row children are addressed via dotted paths,
|
|
110
|
-
* not via this walker). */
|
|
111
|
-
function walkFields(node: ElementMeta, visit: (field: ElementMeta) => void): void {
|
|
112
|
-
if (node.type === 'field') {
|
|
113
|
-
visit(node)
|
|
114
|
-
if (node['fieldType'] === 'repeater') return
|
|
115
|
-
}
|
|
116
|
-
const children = node.children
|
|
117
|
-
if (Array.isArray(children)) {
|
|
118
|
-
for (const child of children) walkFields(child as ElementMeta, visit)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Build a nested object from FormData entries. Keys split on `.`:
|
|
124
|
-
* - `name` → `{ name: 'value' }`
|
|
125
|
-
* - `items.0.product` → `{ items: [{ product: 'value' }] }`
|
|
126
|
-
* - `items.0.modifiers.1.name` → nested arrays of objects
|
|
127
|
-
*
|
|
128
|
-
* Plan #14 — used by FormStateProvider to snapshot the current DOM
|
|
129
|
-
* state of a form (including uncontrolled inner-Repeater inputs)
|
|
130
|
-
* before POSTing a live re-resolve. Server's `coerceFormValues` does
|
|
131
|
-
* the same structural fold plus type coercion; the client just folds.
|
|
132
|
-
*
|
|
133
|
-
* Rules:
|
|
134
|
-
* - Numeric segments after a field name → array indices.
|
|
135
|
-
* - Multiple values for the same key → last one wins (matches
|
|
136
|
-
* browser-form semantics; checkbox lists handled at the field level).
|
|
137
|
-
* - Reserved `__id` keys (Repeater row identity) and `_formId / _method`
|
|
138
|
-
* are filtered out — they're transport metadata, not field values.
|
|
139
|
-
*/
|
|
140
|
-
export function parseFormDataToNested(fd: FormData): Record<string, unknown> {
|
|
141
|
-
const out: Record<string, unknown> = {}
|
|
142
|
-
for (const [rawKey, rawValue] of fd.entries()) {
|
|
143
|
-
if (rawKey === '_formId' || rawKey === '_method') continue
|
|
144
|
-
if (rawKey.endsWith('.__id')) continue
|
|
145
|
-
// FormData values may be File or string. We only need string here —
|
|
146
|
-
// file uploads pre-resolve to URL strings before live POST.
|
|
147
|
-
const value = typeof rawValue === 'string' ? rawValue : ''
|
|
148
|
-
writeNestedPath(out, rawKey.split('.'), value)
|
|
149
|
-
}
|
|
150
|
-
return out
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** Write a value into a nested object/array structure along a path
|
|
154
|
-
* whose segments alternate field name (string) and array index
|
|
155
|
-
* (numeric string). Creates intermediate objects/arrays as needed. */
|
|
156
|
-
function writeNestedPath(root: Record<string, unknown>, segments: string[], value: unknown): void {
|
|
157
|
-
if (segments.length === 0) return
|
|
158
|
-
let cursor: Record<string, unknown> | unknown[] = root
|
|
159
|
-
for (let i = 0; i < segments.length - 1; i++) {
|
|
160
|
-
const seg = segments[i] as string
|
|
161
|
-
const nextSeg = segments[i + 1] as string
|
|
162
|
-
const nextIsIndex = /^\d+$/.test(nextSeg)
|
|
163
|
-
if (Array.isArray(cursor)) {
|
|
164
|
-
const idx = Number(seg)
|
|
165
|
-
if (!Number.isInteger(idx) || idx < 0) return
|
|
166
|
-
if (cursor[idx] === undefined) cursor[idx] = nextIsIndex ? [] : {}
|
|
167
|
-
cursor = cursor[idx] as Record<string, unknown> | unknown[]
|
|
168
|
-
} else {
|
|
169
|
-
if (cursor[seg] === undefined) cursor[seg] = nextIsIndex ? [] : {}
|
|
170
|
-
cursor = cursor[seg] as Record<string, unknown> | unknown[]
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
const leaf = segments[segments.length - 1] as string
|
|
174
|
-
if (Array.isArray(cursor)) {
|
|
175
|
-
const idx = Number(leaf)
|
|
176
|
-
if (!Number.isInteger(idx) || idx < 0) return
|
|
177
|
-
cursor[idx] = value
|
|
178
|
-
} else {
|
|
179
|
-
cursor[leaf] = value
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/** Public — write a single value into a nested structure along a
|
|
184
|
-
* dotted path. Used by FormStateProvider to apply a `triggerLive`
|
|
185
|
-
* value override on top of the FormData snapshot. */
|
|
186
|
-
export function writeNestedValue(
|
|
187
|
-
root: Record<string, unknown>,
|
|
188
|
-
path: string,
|
|
189
|
-
value: unknown,
|
|
190
|
-
): void {
|
|
191
|
-
writeNestedPath(root, path.split('.'), value)
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/** Read a single value from a nested structure along a dotted path.
|
|
195
|
-
* Returns `undefined` for missing paths or when an intermediate
|
|
196
|
-
* segment is not a navigable container. Used by `afterStateUpdatedJs`
|
|
197
|
-
* to expose `$get('items.0.name')` to the JS handler. */
|
|
198
|
-
export function readNestedValue(
|
|
199
|
-
root: Record<string, unknown>,
|
|
200
|
-
path: string,
|
|
201
|
-
): unknown {
|
|
202
|
-
const segments = path.split('.')
|
|
203
|
-
let cursor: unknown = root
|
|
204
|
-
for (const seg of segments) {
|
|
205
|
-
if (cursor === null || cursor === undefined) return undefined
|
|
206
|
-
if (Array.isArray(cursor)) {
|
|
207
|
-
const idx = Number(seg)
|
|
208
|
-
if (!Number.isInteger(idx)) return undefined
|
|
209
|
-
cursor = cursor[idx]
|
|
210
|
-
continue
|
|
211
|
-
}
|
|
212
|
-
if (typeof cursor === 'object') {
|
|
213
|
-
cursor = (cursor as Record<string, unknown>)[seg]
|
|
214
|
-
continue
|
|
215
|
-
}
|
|
216
|
-
return undefined
|
|
217
|
-
}
|
|
218
|
-
return cursor
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Phase F.5 — parsed row-field coordinates.
|
|
223
|
-
*
|
|
224
|
-
* `fieldName` is the leaf field's name as declared in the inner schema
|
|
225
|
-
* (e.g. the `TextField.make('label')` inside a `Repeater.schema([...])`).
|
|
226
|
-
* Builder rows wrap their inner schema under a literal `data` segment;
|
|
227
|
-
* `parseRowFieldPath` strips that segment so consumers don't need to
|
|
228
|
-
* know which row-array dialect they're addressing.
|
|
229
|
-
*/
|
|
230
|
-
export interface ParsedRowFieldPath {
|
|
231
|
-
arrayName: string
|
|
232
|
-
index: number
|
|
233
|
-
fieldName: string
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Phase F.5 — parse a dotted form-field name into row-array coordinates
|
|
238
|
-
* when it matches a Repeater or Builder row-leaf shape; return `null`
|
|
239
|
-
* otherwise. Used by `FormStateProvider` to route row-leaf writes
|
|
240
|
-
* through `FormCollabBinding.setRow` instead of skipping them.
|
|
241
|
-
*
|
|
242
|
-
* `tags.0.label` → { arrayName: 'tags', index: 0, fieldName: 'label' } (Repeater)
|
|
243
|
-
* `blocks.0.data.body` → { arrayName: 'blocks', index: 0, fieldName: 'body' } (Builder)
|
|
244
|
-
* `tags.0.__id` → null (row identity — handled by addRow / reorderRows)
|
|
245
|
-
* `blocks.0.type` → null (Builder block discriminator — not a user field)
|
|
246
|
-
* `foo` → null (top-level field — top-level binding.set path)
|
|
247
|
-
* `tags.notnum.label` → null (malformed)
|
|
248
|
-
*
|
|
249
|
-
* Nested Repeaters / Builders (e.g. `articles.0.comments.1.body`) are
|
|
250
|
-
* out of scope v1 — they return `null` here too. F.5b's binding impl
|
|
251
|
-
* therefore never sees them and they continue to ride the local-state
|
|
252
|
-
* path until a future phase opens the door.
|
|
253
|
-
*/
|
|
254
|
-
export function parseRowFieldPath(path: string): ParsedRowFieldPath | null {
|
|
255
|
-
const segments = path.split('.')
|
|
256
|
-
if (segments.length === 3) {
|
|
257
|
-
const [arrayName, idxRaw, fieldName] = segments as [string, string, string]
|
|
258
|
-
if (!/^\d+$/.test(idxRaw)) return null
|
|
259
|
-
if (!arrayName || !fieldName) return null
|
|
260
|
-
if (fieldName === '__id' || fieldName === 'type') return null
|
|
261
|
-
return { arrayName, index: Number(idxRaw), fieldName }
|
|
262
|
-
}
|
|
263
|
-
if (segments.length === 4 && segments[2] === 'data') {
|
|
264
|
-
const [arrayName, idxRaw, , fieldName] = segments as [string, string, string, string]
|
|
265
|
-
if (!/^\d+$/.test(idxRaw)) return null
|
|
266
|
-
if (!arrayName || !fieldName) return null
|
|
267
|
-
return { arrayName, index: Number(idxRaw), fieldName }
|
|
268
|
-
}
|
|
269
|
-
return null
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Phase F.5 — resolve the stable `__id` of the row at `arrayName[index]`
|
|
274
|
-
* from a flat dotted-path values map. The renderer mints `__id` on every
|
|
275
|
-
* row insert (UUID for new / DB PK for relationship-backed) so callers
|
|
276
|
-
* here are looking up an id that already exists; returns `null` only
|
|
277
|
-
* when the row hasn't been registered yet (e.g. the binding observed a
|
|
278
|
-
* remote insert before the local renderer rebuilt its row map).
|
|
279
|
-
*
|
|
280
|
-
* The lookup always reads from the flat shape (`${arrayName}.${index}.__id`)
|
|
281
|
-
* since both `FormStateProvider`'s `valuesRef` and server-resolve responses
|
|
282
|
-
* use flat dotted-path keys.
|
|
283
|
-
*/
|
|
284
|
-
export function rowIdAtIndex(
|
|
285
|
-
values: Record<string, unknown>,
|
|
286
|
-
arrayName: string,
|
|
287
|
-
index: number,
|
|
288
|
-
): string | null {
|
|
289
|
-
const flat = values[`${arrayName}.${index}.__id`]
|
|
290
|
-
if (typeof flat === 'string' && flat.length > 0) return flat
|
|
291
|
-
return null
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Phase F2 — returns `true` iff the named field has explicitly opted out
|
|
296
|
-
* of realtime collab via `Field.collab(false)`. Sparse meta — absent =
|
|
297
|
-
* inherit the panel default (collab on). Walks the form meta tree the
|
|
298
|
-
* same way `findFieldMeta` does. Cheap (one map lookup per write).
|
|
299
|
-
*
|
|
300
|
-
* Exposed so `routeBindingWrite` can compose against it from this
|
|
301
|
-
* module instead of FormStateContext's private helper.
|
|
302
|
-
*/
|
|
303
|
-
export function fieldOptsOutOfCollab(formMeta: ElementMeta, name: string): boolean {
|
|
304
|
-
const meta = findFieldMeta(formMeta, name) as { collab?: boolean } | undefined
|
|
305
|
-
return meta?.collab === false
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Phase F.5 — route a single (name, value) write through the collab
|
|
310
|
-
* binding by name shape:
|
|
311
|
-
*
|
|
312
|
-
* - top-level name → `binding.set(name, value)` (F2 path)
|
|
313
|
-
* - row leaf → `binding.setRow(arrayName, rowId, fieldName, value)`
|
|
314
|
-
* when the binding implements F.5; falls through
|
|
315
|
-
* to no-op otherwise (v1 skip-on-dot behaviour).
|
|
316
|
-
*
|
|
317
|
-
* Skips when no binding is registered or the field opted out via
|
|
318
|
-
* `.collab(false)`. `valuesForLookup` supplies the rowId map — pass the
|
|
319
|
-
* latest snapshot the caller has access to (`valuesRef.current` for
|
|
320
|
-
* local writes; merged `valuesRef + serverValues` for server-resolve).
|
|
321
|
-
*
|
|
322
|
-
* Shared between `setValue` (local edits) and the server-resolve overlay
|
|
323
|
-
* inside `performLivePost` so both routing decisions stay in lockstep.
|
|
324
|
-
*/
|
|
325
|
-
export function routeBindingWrite(
|
|
326
|
-
binding: FormCollabBinding | null,
|
|
327
|
-
formMeta: ElementMeta | undefined,
|
|
328
|
-
valuesForLookup: Record<string, unknown>,
|
|
329
|
-
name: string,
|
|
330
|
-
value: unknown,
|
|
331
|
-
): void {
|
|
332
|
-
if (!binding) return
|
|
333
|
-
if (formMeta && fieldOptsOutOfCollab(formMeta, name)) return
|
|
334
|
-
if (!name.includes('.')) {
|
|
335
|
-
binding.set(name, value)
|
|
336
|
-
return
|
|
337
|
-
}
|
|
338
|
-
if (!binding.setRow) return // pre-F.5 binding — row leaves stay local
|
|
339
|
-
const parsed = parseRowFieldPath(name)
|
|
340
|
-
if (!parsed) return // nested-Repeater / malformed — out of scope v1
|
|
341
|
-
const rowId = rowIdAtIndex(valuesForLookup, parsed.arrayName, parsed.index)
|
|
342
|
-
if (!rowId) return // row not yet stamped — local-only until id lands
|
|
343
|
-
binding.setRow(parsed.arrayName, rowId, parsed.fieldName, value)
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Phase F.5 — walk a form's meta tree for top-level Repeater / Builder
|
|
348
|
-
* field names. Used by `FormStateProvider` to build the per-array
|
|
349
|
-
* `RowBindingApi` map from a single meta walk at binding mount.
|
|
350
|
-
*
|
|
351
|
-
* Stops at the array boundary itself — we want the array's own field
|
|
352
|
-
* name, not the inner-row fields inside it (which address through
|
|
353
|
-
* `setRow`'s dotted-path routing, not through their own row bindings).
|
|
354
|
-
* Skips fields opted out via `.collab(false)` so the array is left on
|
|
355
|
-
* the v1 local-state path.
|
|
356
|
-
*/
|
|
357
|
-
export function collectRowArrayFieldNames(formMeta: ElementMeta): string[] {
|
|
358
|
-
const out: string[] = []
|
|
359
|
-
walk(formMeta)
|
|
360
|
-
return out
|
|
361
|
-
|
|
362
|
-
function walk(node: ElementMeta): void {
|
|
363
|
-
if (node.type === 'field') {
|
|
364
|
-
const fieldType = node['fieldType']
|
|
365
|
-
if (fieldType === 'repeater' || fieldType === 'builder') {
|
|
366
|
-
if ((node as { collab?: boolean }).collab !== false) {
|
|
367
|
-
const name = String(node['name'] ?? '')
|
|
368
|
-
if (name) out.push(name)
|
|
369
|
-
}
|
|
370
|
-
// Don't descend — inner row fields address through dotted-path
|
|
371
|
-
// routing, not their own row bindings.
|
|
372
|
-
return
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
const children = node.children
|
|
376
|
-
if (Array.isArray(children)) {
|
|
377
|
-
for (const child of children) walk(child as ElementMeta)
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
|
|
3
|
-
const MOBILE_BREAKPOINT = 768
|
|
4
|
-
|
|
5
|
-
export function useIsMobile() {
|
|
6
|
-
const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)
|
|
7
|
-
|
|
8
|
-
React.useEffect(() => {
|
|
9
|
-
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
|
|
10
|
-
const onChange = () => {
|
|
11
|
-
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
|
|
12
|
-
}
|
|
13
|
-
mql.addEventListener('change', onChange)
|
|
14
|
-
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
|
|
15
|
-
return () => mql.removeEventListener('change', onChange)
|
|
16
|
-
}, [])
|
|
17
|
-
|
|
18
|
-
return !!isMobile
|
|
19
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import React, { createContext, useContext } from 'react'
|
|
2
|
-
import { getIcon, type IconType } from '../icons/registry.js'
|
|
3
|
-
import type { SerializedIcon } from '../icons/types.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Build-time component manifest. Maps Resource/Global/Page class names
|
|
7
|
-
* (e.g., `'ArticleResource'`) to the class itself. The Pilotiq Vite
|
|
8
|
-
* plugin emits this map by reading `app/Pilotiq/AdminPanel.ts` and
|
|
9
|
-
* re-exporting every registered class. The auto-gen `+Layout.tsx`
|
|
10
|
-
* imports it and passes it to `AppShell`.
|
|
11
|
-
*
|
|
12
|
-
* Only used to resolve component-typed icons (`Resource.icon = Newspaper`).
|
|
13
|
-
* String-typed icons go through `getIcon()` against the runtime registry.
|
|
14
|
-
*/
|
|
15
|
-
export type ComponentRegistry = Record<string, { icon?: unknown; navigationIcon?: unknown }>
|
|
16
|
-
|
|
17
|
-
const Ctx = createContext<ComponentRegistry | undefined>(undefined)
|
|
18
|
-
|
|
19
|
-
export function ComponentRegistryProvider({
|
|
20
|
-
value,
|
|
21
|
-
children,
|
|
22
|
-
}: {
|
|
23
|
-
value: ComponentRegistry | undefined
|
|
24
|
-
children: React.ReactNode
|
|
25
|
-
}) {
|
|
26
|
-
return <Ctx.Provider value={value}>{children}</Ctx.Provider>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function useComponentRegistry(): ComponentRegistry | undefined {
|
|
30
|
-
return useContext(Ctx)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Resolve a `SerializedIcon` from `viewProps` to a React component.
|
|
35
|
-
*
|
|
36
|
-
* - `string` → look up in the runtime `registerIcons()` registry.
|
|
37
|
-
* - `{ class: 'ArticleResource' }` → look up in the build-time component
|
|
38
|
-
* manifest. If the entry has its own `.navigationIcon` it wins;
|
|
39
|
-
* otherwise falls through to `.icon`. The icon prop on the class
|
|
40
|
-
* itself can be either another component (returned directly) or
|
|
41
|
-
* another string (re-resolved through the runtime registry).
|
|
42
|
-
* - `undefined` → returns `undefined` (caller picks its own fallback).
|
|
43
|
-
*/
|
|
44
|
-
export function useIconFor(value: SerializedIcon | undefined): IconType | undefined {
|
|
45
|
-
const manifest = useComponentRegistry()
|
|
46
|
-
if (value === undefined) return undefined
|
|
47
|
-
if (typeof value === 'string') return getIcon(value)
|
|
48
|
-
if (typeof value === 'object' && 'class' in value) {
|
|
49
|
-
const entry = manifest?.[value.class]
|
|
50
|
-
if (!entry) return undefined
|
|
51
|
-
const candidate = entry.navigationIcon ?? entry.icon
|
|
52
|
-
if (candidate === undefined || candidate === null) return undefined
|
|
53
|
-
// String → re-resolve through the runtime registry; otherwise
|
|
54
|
-
// (function or forwardRef/memo object) treat as a renderable component.
|
|
55
|
-
if (typeof candidate === 'string') return getIcon(candidate)
|
|
56
|
-
if (typeof candidate === 'function' || typeof candidate === 'object') return candidate as IconType
|
|
57
|
-
return undefined
|
|
58
|
-
}
|
|
59
|
-
return undefined
|
|
60
|
-
}
|
package/src/react/index.ts
DELETED
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
export { AppShell, type AppShellProps } from './AppShell.js'
|
|
2
|
-
export {
|
|
3
|
-
ComponentRegistryProvider,
|
|
4
|
-
useComponentRegistry,
|
|
5
|
-
useIconFor,
|
|
6
|
-
type ComponentRegistry,
|
|
7
|
-
} from './icon-context.js'
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
SchemaRenderer,
|
|
11
|
-
type SchemaRendererProps,
|
|
12
|
-
FormFields,
|
|
13
|
-
type FormFieldsProps,
|
|
14
|
-
} from './SchemaRenderer.js'
|
|
15
|
-
export { registerFieldRenderer, getFieldRenderer, type FieldRendererProps } from './registry.js'
|
|
16
|
-
export { registerFieldLabelSlot, getFieldLabelSlot, type FieldLabelSlotProps } from './FieldLabelSlotRegistry.js'
|
|
17
|
-
export {
|
|
18
|
-
registerPendingSuggestionOverlay,
|
|
19
|
-
getPendingSuggestionOverlay,
|
|
20
|
-
type PendingSuggestionOverlayProps,
|
|
21
|
-
} from './PendingSuggestionOverlayRegistry.js'
|
|
22
|
-
export {
|
|
23
|
-
PendingSuggestionsContext,
|
|
24
|
-
usePendingSuggestions,
|
|
25
|
-
usePendingSuggestionsForField,
|
|
26
|
-
type PendingSuggestion,
|
|
27
|
-
type PendingSuggestionOrigin,
|
|
28
|
-
type PendingSuggestionsApi,
|
|
29
|
-
} from './PendingSuggestionsContext.js'
|
|
30
|
-
export {
|
|
31
|
-
registerPendingSuggestionApplier,
|
|
32
|
-
getPendingSuggestionApplier,
|
|
33
|
-
type PendingSuggestionApplier,
|
|
34
|
-
} from './PendingSuggestionApplierRegistry.js'
|
|
35
|
-
export {
|
|
36
|
-
CollabRoomContext,
|
|
37
|
-
useCollabRoom,
|
|
38
|
-
onProviderSynced,
|
|
39
|
-
type CollabRoom,
|
|
40
|
-
type SyncedProviderLike,
|
|
41
|
-
} from './CollabRoomContext.js'
|
|
42
|
-
export { useCollabSeed } from './useCollabSeed.js'
|
|
43
|
-
export {
|
|
44
|
-
registerCollabExtensions,
|
|
45
|
-
getCollabExtensions,
|
|
46
|
-
type CollabExtensionFactory,
|
|
47
|
-
type CollabExtensionFactoryArgs,
|
|
48
|
-
} from './CollabExtensionFactoryRegistry.js'
|
|
49
|
-
export {
|
|
50
|
-
registerCollabTextRenderer,
|
|
51
|
-
getCollabTextRenderer,
|
|
52
|
-
type CollabTextRenderer,
|
|
53
|
-
type CollabTextRendererProps,
|
|
54
|
-
} from './CollabTextRendererRegistry.js'
|
|
55
|
-
export {
|
|
56
|
-
registerMarkdownEditor,
|
|
57
|
-
getMarkdownEditor,
|
|
58
|
-
type MarkdownEditor,
|
|
59
|
-
type MarkdownEditorProps,
|
|
60
|
-
} from './MarkdownEditorRegistry.js'
|
|
61
|
-
export {
|
|
62
|
-
registerFormCollabBinding,
|
|
63
|
-
getFormCollabBinding,
|
|
64
|
-
type FormCollabBinding,
|
|
65
|
-
type FormCollabBindingFactory,
|
|
66
|
-
type FormCollabBindingFactoryArgs,
|
|
67
|
-
type RowsEvent,
|
|
68
|
-
type RowBindingApi,
|
|
69
|
-
} from './FormCollabBindingRegistry.js'
|
|
70
|
-
export {
|
|
71
|
-
registerFieldPresenceComponent,
|
|
72
|
-
getFieldPresenceComponent,
|
|
73
|
-
type FieldPresenceProps,
|
|
74
|
-
} from './FieldPresenceRegistry.js'
|
|
75
|
-
export {
|
|
76
|
-
registerFieldFocusReporter,
|
|
77
|
-
getFieldFocusReporter,
|
|
78
|
-
type FieldFocusReporter,
|
|
79
|
-
type FieldFocusEvent,
|
|
80
|
-
} from './FieldFocusReporterRegistry.js'
|
|
81
|
-
export {
|
|
82
|
-
registerRecordWrapper,
|
|
83
|
-
getRecordWrapper,
|
|
84
|
-
type RecordWrapperProps,
|
|
85
|
-
} from './RecordWrapperRegistry.js'
|
|
86
|
-
export {
|
|
87
|
-
RecordWrapperGate,
|
|
88
|
-
type RecordWrapperGateProps,
|
|
89
|
-
} from './RecordWrapperGate.js'
|
|
90
|
-
export {
|
|
91
|
-
registerCustomPageWrapper,
|
|
92
|
-
getCustomPageWrapper,
|
|
93
|
-
type CustomPageWrapperProps,
|
|
94
|
-
} from './CustomPageWrapperRegistry.js'
|
|
95
|
-
export {
|
|
96
|
-
CustomPageWrapperGate,
|
|
97
|
-
type CustomPageWrapperGateProps,
|
|
98
|
-
type PageCollabMap,
|
|
99
|
-
} from './CustomPageWrapperGate.js'
|
|
100
|
-
export {
|
|
101
|
-
parseRecordPageUrl,
|
|
102
|
-
parseRecordEditUrl,
|
|
103
|
-
type RecordPageIdentity,
|
|
104
|
-
type RecordPageRole,
|
|
105
|
-
type RecordEditIdentity,
|
|
106
|
-
} from './parseRecordEditUrl.js'
|
|
107
|
-
export {
|
|
108
|
-
registerWidgetRenderer,
|
|
109
|
-
getWidgetRenderer,
|
|
110
|
-
type WidgetRendererProps,
|
|
111
|
-
} from './widgetRegistry.js'
|
|
112
|
-
|
|
113
|
-
export {
|
|
114
|
-
FormStateProvider,
|
|
115
|
-
useFieldState,
|
|
116
|
-
useFormState,
|
|
117
|
-
useFormId,
|
|
118
|
-
useRowBinding,
|
|
119
|
-
type FormStateApi,
|
|
120
|
-
type FormStateProviderProps,
|
|
121
|
-
type UseFieldStateResult,
|
|
122
|
-
} from './FormStateContext.js'
|
|
123
|
-
|
|
124
|
-
export { parseFormDataToNested, parseRowFieldPath, type ParsedRowFieldPath } from './formStateHelpers.js'
|
|
125
|
-
export { RowCoordsContext, useRowCoords, type RowCoords } from './RowCoordsContext.js'
|
|
126
|
-
|
|
127
|
-
export { NavigateProvider, useNavigate, type NavigateFn } from './navigate.js'
|
|
128
|
-
|
|
129
|
-
export { ToasterProvider, useToast } from './Toaster.js'
|
|
130
|
-
|
|
131
|
-
export {
|
|
132
|
-
WidgetDataProvider,
|
|
133
|
-
useInitialWidgetData,
|
|
134
|
-
useWidgetData,
|
|
135
|
-
type WidgetState,
|
|
136
|
-
type WidgetMetaLike,
|
|
137
|
-
type WidgetDataProviderProps,
|
|
138
|
-
} from './WidgetDataContext.js'
|
|
139
|
-
|
|
140
|
-
export {
|
|
141
|
-
RightPanelRegistryProvider,
|
|
142
|
-
useRightPanelRegistry,
|
|
143
|
-
useRightPanelComponent,
|
|
144
|
-
type RightPanelRegistry,
|
|
145
|
-
} from './right-panel-registry.js'
|
|
146
|
-
|
|
147
|
-
export {
|
|
148
|
-
RightSidebarProvider,
|
|
149
|
-
useRightSidebar,
|
|
150
|
-
useRightSidebarOptional,
|
|
151
|
-
type RightSidebarApi,
|
|
152
|
-
type RightSidebarProviderProps,
|
|
153
|
-
} from './RightSidebarContext.js'
|
|
154
|
-
export {
|
|
155
|
-
RightSidebar,
|
|
156
|
-
type RightSidebarProps,
|
|
157
|
-
} from './RightSidebar.js'
|
|
158
|
-
export { RightSidebarTrigger } from './RightSidebarTrigger.js'
|
|
159
|
-
export { SearchTrigger } from './SearchTrigger.js'
|
|
160
|
-
export {
|
|
161
|
-
useResizableWidth,
|
|
162
|
-
clampPanelWidth,
|
|
163
|
-
type UseResizableWidthOptions,
|
|
164
|
-
type UseResizableWidthApi,
|
|
165
|
-
} from './useResizableWidth.js'
|
|
166
|
-
|
|
167
|
-
export {
|
|
168
|
-
CurrentUserProvider,
|
|
169
|
-
useCurrentUser,
|
|
170
|
-
type CurrentUser,
|
|
171
|
-
} from './CurrentUserContext.js'
|
|
172
|
-
|
|
173
|
-
export { ThemeProvider, useTheme } from './ThemeProvider.js'
|
|
174
|
-
export { ThemeToggle } from './ThemeToggle.js'
|
|
175
|
-
export { ThemeSettingsPage } from './ThemeSettingsPage.js'
|
|
176
|
-
export { UserMenu } from './UserMenu.js'
|
|
177
|
-
export { NotificationBell } from './NotificationBell.js'
|
|
178
|
-
export { RenderHookSlot } from './RenderHookSlot.js'
|
|
179
|
-
export { HeadHooks } from './HeadHooks.js'
|
|
180
|
-
|
|
181
|
-
export {
|
|
182
|
-
isNavItemActive,
|
|
183
|
-
type NavComponentProps,
|
|
184
|
-
type HeaderComponentProps,
|
|
185
|
-
type FooterComponentProps,
|
|
186
|
-
type ComponentSlotRegistry,
|
|
187
|
-
} from './component-slots.js'
|
|
188
|
-
export type { NavItem } from '../pageData.js'
|
|
189
|
-
|
|
190
|
-
// Re-export pure theme functions for client-safe usage (avoids importing main barrel which has server-only code)
|
|
191
|
-
export { generateThemeCSS } from '../theme/generate-css.js'
|
|
192
|
-
export { resolveTheme } from '../theme/resolve.js'
|
|
193
|
-
|
|
194
|
-
// Backwards compat
|
|
195
|
-
export { AppShell as AdminShell, type AppShellProps as AdminShellProps } from './AppShell.js'
|