@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,69 +0,0 @@
|
|
|
1
|
-
import { type ReactNode } from 'react'
|
|
2
|
-
import { getCustomPageWrapper } from './CustomPageWrapperRegistry.js'
|
|
3
|
-
import type { PageCollabConfig } from '../Page.js'
|
|
4
|
-
|
|
5
|
-
/** Per-custom-page collab opt-in keyed by URL slug (`P.getSlug()` for
|
|
6
|
-
* non-clustered, `${cluster.slug}/${P.getSlug()}` for clustered). Built
|
|
7
|
-
* server-side by `panelInfo()` as `pageCollab`. */
|
|
8
|
-
export type PageCollabMap = Record<string, PageCollabConfig>
|
|
9
|
-
|
|
10
|
-
export interface CustomPageWrapperGateProps {
|
|
11
|
-
currentPath?: string
|
|
12
|
-
basePath: string
|
|
13
|
-
/** Per-page opt-in map. Absent means no custom page opted in — gate
|
|
14
|
-
* always passes through. */
|
|
15
|
-
pageCollab?: PageCollabMap
|
|
16
|
-
children: ReactNode
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Strip `basePath` from `currentPath` and return the remaining slash-
|
|
21
|
-
* joined tail. Returns `null` when the path is empty / doesn't start
|
|
22
|
-
* with `basePath` / has no tail. Mirrors `parseRecordPageUrl`'s
|
|
23
|
-
* normalization (trailing slash on either side is tolerated).
|
|
24
|
-
*/
|
|
25
|
-
function pageSlugFromUrl(currentPath: string, basePath: string): string | null {
|
|
26
|
-
if (!currentPath) return null
|
|
27
|
-
const trimmedPath = currentPath.replace(/\/+$/, '')
|
|
28
|
-
const trimmedBase = basePath.replace(/\/+$/, '')
|
|
29
|
-
|
|
30
|
-
if (trimmedBase !== '' && !trimmedPath.startsWith(trimmedBase)) return null
|
|
31
|
-
|
|
32
|
-
const tail = trimmedPath.slice(trimmedBase.length).replace(/^\/+/, '')
|
|
33
|
-
if (tail.length === 0) return null
|
|
34
|
-
return tail
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Conditionally wraps the page tree with the plugin-registered
|
|
39
|
-
* `CustomPageWrapper` when the current URL resolves to a custom page
|
|
40
|
-
* (a `Page` subclass with `static collab = { room: '…' }`).
|
|
41
|
-
* Pass-through in every other case:
|
|
42
|
-
*
|
|
43
|
-
* - no plugin registered a wrapper (`getCustomPageWrapper() === null`)
|
|
44
|
-
* - `currentPath` not yet known on the very first SSR render
|
|
45
|
-
* - `pageCollab` map absent (no page opted in)
|
|
46
|
-
* - the URL tail doesn't match any registered page slug (resource
|
|
47
|
-
* list/edit/view pages, dashboard, theme editor, etc.)
|
|
48
|
-
*
|
|
49
|
-
* Mounted inside `AppShell` around the page content area, beside
|
|
50
|
-
* `RecordWrapperGate`. The two gates are mutually exclusive in
|
|
51
|
-
* practice — record routes have 3+ segments ending in /edit or /view,
|
|
52
|
-
* custom-page routes are 1-2 segments matching a registered page slug.
|
|
53
|
-
*/
|
|
54
|
-
export function CustomPageWrapperGate({ currentPath, basePath, pageCollab, children }: CustomPageWrapperGateProps) {
|
|
55
|
-
const Wrapper = getCustomPageWrapper()
|
|
56
|
-
if (!Wrapper || !currentPath || !pageCollab) return <>{children}</>
|
|
57
|
-
|
|
58
|
-
const slug = pageSlugFromUrl(currentPath, basePath)
|
|
59
|
-
if (!slug) return <>{children}</>
|
|
60
|
-
|
|
61
|
-
const cfg = pageCollab[slug]
|
|
62
|
-
if (!cfg) return <>{children}</>
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<Wrapper pageSlug={slug} room={cfg.room} presence={cfg.presence}>
|
|
66
|
-
{children}
|
|
67
|
-
</Wrapper>
|
|
68
|
-
)
|
|
69
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { ComponentType, ReactNode } from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Props the custom-page wrapper receives from `CustomPageWrapperGate`
|
|
5
|
-
* when the current URL resolves to an opted-in custom page (a `Page`
|
|
6
|
-
* subclass with `static collab = { room: '…' }`).
|
|
7
|
-
*
|
|
8
|
-
* The wrapper owns whatever page-scoped context the plugin provides —
|
|
9
|
-
* `@pilotiq-pro/collab` mounts a collab room here so every collab
|
|
10
|
-
* field inside the page tree shares one Y.Doc + WS connection. Other
|
|
11
|
-
* plugins could mount per-page presence, audit logging, etc.
|
|
12
|
-
*
|
|
13
|
-
* `pageSlug` is the gate's URL slug (cluster-prefixed for clustered
|
|
14
|
-
* pages). `room` is the literal `room` value the page declared on
|
|
15
|
-
* `static collab` — opaque to pilotiq; the plugin is free to namespace
|
|
16
|
-
* it internally before opening the WS.
|
|
17
|
-
*/
|
|
18
|
-
export interface CustomPageWrapperProps {
|
|
19
|
-
pageSlug: string
|
|
20
|
-
room: string
|
|
21
|
-
presence: boolean
|
|
22
|
-
children: ReactNode
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
let _component: ComponentType<CustomPageWrapperProps> | null = null
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Register a component that wraps the page tree on every opted-in
|
|
29
|
-
* custom-page route. Called once at boot by a plugin (e.g.
|
|
30
|
-
* `@pilotiq-pro/collab`). No-op when no plugin registers —
|
|
31
|
-
* `CustomPageWrapperGate` passes through unchanged.
|
|
32
|
-
*/
|
|
33
|
-
export function registerCustomPageWrapper(C: ComponentType<CustomPageWrapperProps>): void {
|
|
34
|
-
_component = C
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Returns the registered wrapper component, or `null`. */
|
|
38
|
-
export function getCustomPageWrapper(): ComponentType<CustomPageWrapperProps> | null {
|
|
39
|
-
return _component
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Test-only — drops any registered wrapper so tests stay isolated. */
|
|
43
|
-
export function _resetCustomPageWrapper(): void {
|
|
44
|
-
_component = null
|
|
45
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Module-level slot for focus / blur callbacks dispatched by pilotiq's
|
|
3
|
-
* `FieldShell`. A collab plugin (e.g. `@pilotiq-pro/collab`) registers
|
|
4
|
-
* a reporter at boot; on every controlled-field focus / blur event,
|
|
5
|
-
* `FieldShell` calls the matching method with `{ fieldName, formId }`
|
|
6
|
-
* so the plugin can mirror the local user's focus state into Yjs
|
|
7
|
-
* awareness.
|
|
8
|
-
*
|
|
9
|
-
* `FieldShell` skips dispatching for fields opted out via
|
|
10
|
-
* `Field.collab(false)` AND for dotted-path names (Repeater rows stay
|
|
11
|
-
* out of F4 presence in v1) — so the reporter never sees those events.
|
|
12
|
-
*/
|
|
13
|
-
export interface FieldFocusEvent {
|
|
14
|
-
fieldName: string
|
|
15
|
-
formId: string
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface FieldFocusReporter {
|
|
19
|
-
onFocus(event: FieldFocusEvent): void
|
|
20
|
-
onBlur(event: FieldFocusEvent): void
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
let _reporter: FieldFocusReporter | null = null
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Register the reporter. Called once at boot by the collab plugin.
|
|
27
|
-
* No-op when no plugin registers — `FieldShell` doesn't wire focus
|
|
28
|
-
* listeners.
|
|
29
|
-
*/
|
|
30
|
-
export function registerFieldFocusReporter(reporter: FieldFocusReporter): void {
|
|
31
|
-
_reporter = reporter
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Returns the registered reporter, or `null`. */
|
|
35
|
-
export function getFieldFocusReporter(): FieldFocusReporter | null {
|
|
36
|
-
return _reporter
|
|
37
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Props the field label slot component receives from `SchemaRenderer`.
|
|
5
|
-
* For AI actions this carries the field name, action list, and the
|
|
6
|
-
* pre-composed agent-run base URL stamped by `tagFieldAiUrls`.
|
|
7
|
-
*/
|
|
8
|
-
export interface FieldLabelSlotProps {
|
|
9
|
-
fieldName: string
|
|
10
|
-
actions: Array<{ slug: string; label: string; icon?: string }>
|
|
11
|
-
agentRunBase: string
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
let _component: ComponentType<FieldLabelSlotProps> | null = null
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Register a component to render inline next to every field label that
|
|
18
|
-
* has `aiActions` stamped on its meta. Called once at boot by a plugin's
|
|
19
|
-
* `register(panel)` step (e.g. `@pilotiq-pro/ai`). No-op when no plugin
|
|
20
|
-
* registers — `getFieldLabelSlot()` returns `null` and `SchemaRenderer`
|
|
21
|
-
* skips the slot.
|
|
22
|
-
*/
|
|
23
|
-
export function registerFieldLabelSlot(C: ComponentType<FieldLabelSlotProps>): void {
|
|
24
|
-
_component = C
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Returns the registered field label slot component, or `null`. */
|
|
28
|
-
export function getFieldLabelSlot(): ComponentType<FieldLabelSlotProps> | null {
|
|
29
|
-
return _component
|
|
30
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Props the per-field presence chip receives from `FieldShell` when a
|
|
5
|
-
* `@pilotiq-pro/collab`-style plugin has registered a component.
|
|
6
|
-
*
|
|
7
|
-
* The chip subscribes to the active collab room's awareness state and
|
|
8
|
-
* renders colored avatars / dots for every remote user currently
|
|
9
|
-
* focused on this field. Pilotiq core renders it alongside the field's
|
|
10
|
-
* label; the component owns the awareness lookup so pilotiq stays
|
|
11
|
-
* Yjs-free.
|
|
12
|
-
*
|
|
13
|
-
* Mounted only when:
|
|
14
|
-
*
|
|
15
|
-
* - A collab plugin has registered a component via
|
|
16
|
-
* `registerFieldPresenceComponent(...)`,
|
|
17
|
-
* - The field hasn't opted out via `Field.collab(false)`, and
|
|
18
|
-
* - The field has a stable `name` (dotted-path Repeater rows skip
|
|
19
|
-
* presence in v1 — Phase F.5 work).
|
|
20
|
-
*/
|
|
21
|
-
export interface FieldPresenceProps {
|
|
22
|
-
/** Top-level field name. Dotted-path names are skipped by `FieldShell`. */
|
|
23
|
-
fieldName: string
|
|
24
|
-
/**
|
|
25
|
-
* Stable form identifier — same value the form's `FormStateProvider`
|
|
26
|
-
* uses. Lets the chip scope presence by form when multiple forms
|
|
27
|
-
* render on the same record (action modals, etc.).
|
|
28
|
-
*/
|
|
29
|
-
formId: string
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
let _component: ComponentType<FieldPresenceProps> | null = null
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Register a component that renders inside `FieldShell`'s label area
|
|
36
|
-
* for every controlled field. Called once at boot by a collab plugin.
|
|
37
|
-
* No-op when no plugin registers — `FieldShell` skips the slot.
|
|
38
|
-
*/
|
|
39
|
-
export function registerFieldPresenceComponent(C: ComponentType<FieldPresenceProps>): void {
|
|
40
|
-
_component = C
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/** Returns the registered presence component, or `null`. */
|
|
44
|
-
export function getFieldPresenceComponent(): ComponentType<FieldPresenceProps> | null {
|
|
45
|
-
return _component
|
|
46
|
-
}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import type { ElementMeta } from '../schema/Element.js'
|
|
2
|
-
import type { CollabRoom } from './CollabRoomContext.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Binding contract that a collab plugin returns from
|
|
6
|
-
* `registerFormCollabBinding` — wraps a single form's value map in a
|
|
7
|
-
* shared CRDT type (typically a `Y.Map` on the surrounding record's
|
|
8
|
-
* `Y.Doc`) so every field on the form syncs across clients.
|
|
9
|
-
*
|
|
10
|
-
* Pilotiq's `FormStateProvider` calls into this contract when a
|
|
11
|
-
* `<RecordCollabRoom>` is mounted up-tree:
|
|
12
|
-
*
|
|
13
|
-
* - `get()` is read once on mount to overlay any already-synced
|
|
14
|
-
* state on top of the form's SSR-rendered defaults.
|
|
15
|
-
* - `set(name, v)` is called from `setValue` after the local React
|
|
16
|
-
* state update — every controlled field's edit lands in the CRDT.
|
|
17
|
-
* - `subscribe(fn)` registers a listener that fires when REMOTE
|
|
18
|
-
* changes land; `fn(snapshot)` receives the full updated map.
|
|
19
|
-
* The provider re-applies this snapshot onto its React state.
|
|
20
|
-
* - `destroy()` is called on unmount — gives the plugin a chance to
|
|
21
|
-
* remove its CRDT observer.
|
|
22
|
-
*
|
|
23
|
-
* Text-field character-level CRDT lives in `@pilotiq/tiptap`'s
|
|
24
|
-
* `CollabTextRenderer` (`Y.XmlFragment` per field, keyed by bare name
|
|
25
|
-
* for top-level + `${arrayName}.${rowId}.${fieldName}` composite for
|
|
26
|
-
* row leaves) — pilotiq core no longer mediates per-field text CRDT,
|
|
27
|
-
* so this binding only handles non-text values + row lifecycle.
|
|
28
|
-
*
|
|
29
|
-
* `unknown` payloads keep pilotiq core Yjs-free; the binding owns its
|
|
30
|
-
* own type knowledge. Same posture as `CollabExtensionFactory`.
|
|
31
|
-
*/
|
|
32
|
-
export interface FormCollabBinding {
|
|
33
|
-
/** Snapshot of the current synced values. Called once on mount. */
|
|
34
|
-
get(): Record<string, unknown>
|
|
35
|
-
/** Write the local edit to the CRDT. Triggers a broadcast to peers. */
|
|
36
|
-
set(name: string, value: unknown): void
|
|
37
|
-
/** Subscribe to remote changes. Returns an unsubscribe function. */
|
|
38
|
-
subscribe(fn: (snapshot: Record<string, unknown>) => void): () => void
|
|
39
|
-
/** Cleanup hook called when the form unmounts. */
|
|
40
|
-
destroy(): void
|
|
41
|
-
|
|
42
|
-
// ── Phase F.5 — Repeater / Builder row-identity surface (all optional) ──
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Add a row to a Repeater or Builder field. `rowId` is the stable
|
|
46
|
-
* `__id` the renderer already mints (UUID for new rows / DB PK for
|
|
47
|
-
* relationship-backed rows) — the binding indexes the row's CRDT
|
|
48
|
-
* surface by this id so concurrent inserts from peers both survive.
|
|
49
|
-
*
|
|
50
|
-
* Idempotent — calling with a `rowId` that already exists in the
|
|
51
|
-
* Repeater's array is a no-op. `initial` may carry pre-filled values
|
|
52
|
-
* for the new row (e.g. the inner fields' `default()` from schema
|
|
53
|
-
* resolution); the binding seeds them onto the row's storage under
|
|
54
|
-
* the same idempotent posture as top-level `set` (first writer wins
|
|
55
|
-
* across concurrent first-mounters).
|
|
56
|
-
*
|
|
57
|
-
* Renderer call sites: `RepeaterInput.addRow()` + `BuilderInput.addBlock()`.
|
|
58
|
-
* When absent, F.5 row-level CRDT degrades to v1 behaviour (whole-array
|
|
59
|
-
* LWW under the top-level Y.Map).
|
|
60
|
-
*/
|
|
61
|
-
addRow?(arrayName: string, rowId: string, initial: Record<string, unknown>): void
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Remove a row from a Repeater/Builder field by stable id. Idempotent
|
|
65
|
-
* — a missing `rowId` is a no-op. Triggered by the renderer's row
|
|
66
|
-
* delete button.
|
|
67
|
-
*/
|
|
68
|
-
removeRow?(arrayName: string, rowId: string): void
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Apply a new row order. `newOrder` is the full list of row ids in
|
|
72
|
-
* their final positions; the binding computes the minimal CRDT move
|
|
73
|
-
* sequence and applies it inside a single transaction (peers see one
|
|
74
|
-
* coalesced update, not N intermediate states).
|
|
75
|
-
*
|
|
76
|
-
* Called by drag-and-drop / up-down move handlers in
|
|
77
|
-
* `RepeaterInput` + `BuilderInput`.
|
|
78
|
-
*/
|
|
79
|
-
reorderRows?(arrayName: string, newOrder: string[]): void
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Write a single field on a row. Replaces the dotted-path `set` for
|
|
83
|
-
* row leaves (`tags.0.label` → `setRow('tags', rowId, 'label', value)`).
|
|
84
|
-
* Non-text row fields land on the row's scalar field-map under LWW;
|
|
85
|
-
* text row fields don't flow through here — the Tiptap renderer
|
|
86
|
-
* writes them directly to a `Y.XmlFragment` at the doc root keyed by
|
|
87
|
-
* `${arrayName}.${rowId}.${fieldName}`.
|
|
88
|
-
*
|
|
89
|
-
* `FormStateProvider` calls this on every local edit when both a
|
|
90
|
-
* dotted-path name is being written AND `setRow` is implemented;
|
|
91
|
-
* otherwise the v1 skip-on-dot path runs.
|
|
92
|
-
*/
|
|
93
|
-
setRow?(arrayName: string, rowId: string, fieldName: string, value: unknown): void
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Subscribe to row-lifecycle events for a Repeater/Builder array.
|
|
97
|
-
* Fires on remote add / remove / move; the renderer reconciles its
|
|
98
|
-
* `rows` state by `__id`. Local mutations fire too — the renderer
|
|
99
|
-
* deduplicates by checking whether the event's `rowId` matches one
|
|
100
|
-
* it just dispatched itself (the binding's roundtrip + the
|
|
101
|
-
* renderer's optimistic update converge).
|
|
102
|
-
*/
|
|
103
|
-
subscribeRows?(arrayName: string, fn: (event: RowsEvent) => void): () => void
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Snapshot the current row id order for an array. Unlike `subscribeRows`,
|
|
107
|
-
* which only fires on delta events, this returns whatever is in the CRDT
|
|
108
|
-
* right now — used by the renderer's mount-time reconciler to detect
|
|
109
|
-
* orphaned rows (CRDT carries a UUID forward after the parent save
|
|
110
|
-
* switched the row's `__id` to a DB PK; see
|
|
111
|
-
* `docs/plans/repeater-relationship-pk-switch.md` Phase A).
|
|
112
|
-
*
|
|
113
|
-
* Empty array when the binding has no state for `arrayName` yet.
|
|
114
|
-
*/
|
|
115
|
-
getRowOrder?(arrayName: string): string[]
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* PK-switch Phase B — re-key a row from `oldId` to `newId` across the
|
|
119
|
-
* binding's row CRDT surface. Called by `FormRenderer` after a successful
|
|
120
|
-
* form submit that emitted `relationshipRenames` in the JSON response;
|
|
121
|
-
* the relevant `Repeater.relationship` / `Builder.relationship` field
|
|
122
|
-
* pre-assigned the submitter's UUID and the server returned the DB PK
|
|
123
|
-
* each row was actually persisted under. Renaming inside CRDT means
|
|
124
|
-
* other peers converge on the DB PK without reloading.
|
|
125
|
-
*
|
|
126
|
-
* Idempotent: bindings should no-op on `oldId === newId`, on unknown
|
|
127
|
-
* `oldId`, on unknown `arrayName`, AND on collisions where `newId`
|
|
128
|
-
* already exists (clobbering an unrelated row's content is worse than
|
|
129
|
-
* leaving the orphan UUID for the mount-time reconciler to drop).
|
|
130
|
-
*
|
|
131
|
-
* When absent, the dispatch step silently skips — the submitting
|
|
132
|
-
* peer's Phase A reconciler still drops orphans on next mount, but
|
|
133
|
-
* other peers stay on the UUID until they reload (the documented
|
|
134
|
-
* pre-Phase-B posture). See
|
|
135
|
-
* `pilotiq-pro/docs/plans/repeater-relationship-pk-switch.md`.
|
|
136
|
-
*/
|
|
137
|
-
renameRow?(arrayName: string, oldId: string, newId: string): void
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Phase F.5 — array-scoped imperative API exposed to Repeater / Builder
|
|
142
|
-
* renderers through `useRowBinding(arrayName)`. Each method's first arg
|
|
143
|
-
* (`arrayName`) is pre-bound by the hook so call sites read naturally.
|
|
144
|
-
*
|
|
145
|
-
* Returned by the hook only when the active binding implements all four
|
|
146
|
-
* F.5 row methods (`addRow + removeRow + reorderRows`); partial impls
|
|
147
|
-
* read as null so renderers can do a single existence check before
|
|
148
|
-
* proceeding. `setRow` is intentionally NOT exposed here — it's invoked
|
|
149
|
-
* implicitly via `FormStateProvider.setValue`'s dotted-path routing,
|
|
150
|
-
* so renderers never need to touch it directly.
|
|
151
|
-
*/
|
|
152
|
-
export interface RowBindingApi {
|
|
153
|
-
/** Register a new row in the array's CRDT surface. `initial` may
|
|
154
|
-
* carry pre-seeded values (e.g. clone of a sibling); pass `{}` (or
|
|
155
|
-
* omit) for empty rows. Idempotent under existing rowId. */
|
|
156
|
-
add(rowId: string, initial?: Record<string, unknown>): void
|
|
157
|
-
/** Remove the row with the given id. Idempotent for unknown ids. */
|
|
158
|
-
remove(rowId: string): void
|
|
159
|
-
/** Replace the array's row order. `newOrder` is the full list of row
|
|
160
|
-
* ids in their post-reorder positions; the binding emits the minimal
|
|
161
|
-
* CRDT move sequence in one transaction so peers observe a single
|
|
162
|
-
* coalesced update. */
|
|
163
|
-
reorder(newOrder: string[]): void
|
|
164
|
-
/** Subscribe to remote row-lifecycle events on this array. Returns
|
|
165
|
-
* an unsubscribe fn the renderer's `useEffect` cleanup hangs on.
|
|
166
|
-
* Local mutations may also surface here (Yjs observers fire on
|
|
167
|
-
* local transactions); the renderer is expected to dedupe by
|
|
168
|
-
* rowId presence in its current state. Optional on the underlying
|
|
169
|
-
* contract — `null` when the binding lacks `subscribeRows`. */
|
|
170
|
-
subscribe(fn: (event: RowsEvent) => void): () => void
|
|
171
|
-
/** Snapshot the array's current row id order. Empty array when the
|
|
172
|
-
* binding has no state yet OR when the underlying binding doesn't
|
|
173
|
-
* implement `getRowOrder` (in which case mount-time reconciliation
|
|
174
|
-
* no-ops). */
|
|
175
|
-
current(): string[]
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Phase F.5 — row-lifecycle event surfaced through `subscribeRows`.
|
|
180
|
-
*
|
|
181
|
-
* - `add` — a new row was inserted at `index`. `values` carries
|
|
182
|
-
* the row's seeded field values (mirrors `addRow.initial`).
|
|
183
|
-
* - `remove` — a row was removed; `index` is its position at the
|
|
184
|
-
* moment of removal.
|
|
185
|
-
* - `move` — a row shifted positions. `from` and `to` are 0-based
|
|
186
|
-
* indices in the post-reorder layout (i.e. the row at
|
|
187
|
-
* position `from` ended up at `to`).
|
|
188
|
-
*
|
|
189
|
-
* Pilotiq core stays Yjs-free — the binding impl in `@pilotiq-pro/collab`
|
|
190
|
-
* translates `Y.Array<Y.Map>` `observe` deltas into these events.
|
|
191
|
-
*/
|
|
192
|
-
export type RowsEvent =
|
|
193
|
-
| { kind: 'add'; rowId: string; index: number; values: Record<string, unknown> }
|
|
194
|
-
| { kind: 'remove'; rowId: string; index: number }
|
|
195
|
-
| { kind: 'move'; rowId: string; from: number; to: number }
|
|
196
|
-
|
|
197
|
-
export interface FormCollabBindingFactoryArgs {
|
|
198
|
-
/** Active collab room — provides `ydoc`, `provider`, `user`. Opaque to pilotiq core. */
|
|
199
|
-
room: CollabRoom
|
|
200
|
-
/**
|
|
201
|
-
* Form identifier — used by the binding to partition CRDT state when
|
|
202
|
-
* multiple forms render against the same room (e.g. a record page that
|
|
203
|
-
* shows a primary form plus a side-mounted action form). Most pages
|
|
204
|
-
* only have one form, so most bindings use this as the `Y.Map` name.
|
|
205
|
-
*/
|
|
206
|
-
formId: string
|
|
207
|
-
/**
|
|
208
|
-
* Initial values from pilotiq's normal SSR resolution. The binding
|
|
209
|
-
* uses these to perform the idempotent "first-load seed" (`!ymap.has(k)`
|
|
210
|
-
* gated write) so the first client to open a record populates the
|
|
211
|
-
* Y.Map with the DB-derived defaults; subsequent clients find the
|
|
212
|
-
* map already populated and skip.
|
|
213
|
-
*/
|
|
214
|
-
initial: Record<string, unknown>
|
|
215
|
-
/**
|
|
216
|
-
* Initial form meta from the server. The binding walks this once at
|
|
217
|
-
* construction to index Repeater / Builder array names for row-level
|
|
218
|
-
* CRDT. Text fields (top-level and row leaves alike) don't need to be
|
|
219
|
-
* partitioned here — the Tiptap renderer owns their `Y.XmlFragment`s
|
|
220
|
-
* at the doc root. The meta is captured at mount; later structural
|
|
221
|
-
* changes from `live()` re-resolves aren't re-walked.
|
|
222
|
-
*/
|
|
223
|
-
formMeta: ElementMeta
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export type FormCollabBindingFactory = (args: FormCollabBindingFactoryArgs) => FormCollabBinding
|
|
227
|
-
|
|
228
|
-
let _factory: FormCollabBindingFactory | null = null
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Register the form-level CRDT binding factory. Called once at boot by
|
|
232
|
-
* `@pilotiq-pro/collab`'s plugin. No-op when no plugin registers —
|
|
233
|
-
* `FormStateProvider` falls back to its plain local-state path.
|
|
234
|
-
*/
|
|
235
|
-
export function registerFormCollabBinding(factory: FormCollabBindingFactory): void {
|
|
236
|
-
_factory = factory
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/** Returns the registered binding factory, or `null`. */
|
|
240
|
-
export function getFormCollabBinding(): FormCollabBindingFactory | null {
|
|
241
|
-
return _factory
|
|
242
|
-
}
|