@pilotiq/pilotiq 0.24.1 → 0.24.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -0
- package/boost/guidelines.md +571 -0
- package/boost/skills/pilotiq-actions/SKILL.md +49 -0
- package/boost/skills/pilotiq-actions/rules/dispatch-modes.md +177 -0
- package/boost/skills/pilotiq-actions/rules/factories.md +130 -0
- package/boost/skills/pilotiq-actions/rules/visibility-and-authorization.md +125 -0
- package/boost/skills/pilotiq-fields/SKILL.md +47 -0
- package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
- package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
- package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
- package/boost/skills/pilotiq-relations/SKILL.md +47 -0
- package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
- package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
- package/boost/skills/pilotiq-resource/SKILL.md +61 -0
- package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
- package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
- package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
- package/dist/Pilotiq.d.ts +31 -0
- package/dist/Pilotiq.d.ts.map +1 -1
- package/dist/Pilotiq.js +3 -1
- package/dist/Pilotiq.js.map +1 -1
- package/dist/PilotiqRegistry.d.ts +13 -0
- package/dist/PilotiqRegistry.d.ts.map +1 -1
- package/dist/PilotiqRegistry.js +15 -0
- package/dist/PilotiqRegistry.js.map +1 -1
- package/dist/pageData/misc.d.ts.map +1 -1
- package/dist/pageData/misc.js +6 -0
- package/dist/pageData/misc.js.map +1 -1
- package/dist/pageData/navigation.d.ts +1 -0
- package/dist/pageData/navigation.d.ts.map +1 -1
- package/dist/pageData/navigation.js +3 -0
- package/dist/pageData/navigation.js.map +1 -1
- package/dist/pageData/relationPages.d.ts.map +1 -1
- package/dist/pageData/relationPages.js +3 -0
- package/dist/pageData/relationPages.js.map +1 -1
- package/dist/pageData/resourcePages.d.ts.map +1 -1
- package/dist/pageData/resourcePages.js +8 -0
- package/dist/pageData/resourcePages.js.map +1 -1
- package/dist/react/AppShell.d.ts +8 -0
- package/dist/react/AppShell.d.ts.map +1 -1
- package/dist/react/AppShell.js.map +1 -1
- package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/react/layouts/SidebarLayout.js +10 -2
- package/dist/react/layouts/SidebarLayout.js.map +1 -1
- package/dist/react/widgets/StatsOverviewRenderer.d.ts.map +1 -1
- package/dist/react/widgets/StatsOverviewRenderer.js +32 -18
- package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -1
- package/dist/routes/relations.d.ts.map +1 -1
- package/dist/routes/relations.js +25 -18
- package/dist/routes/relations.js.map +1 -1
- package/dist/routes/resources.js.map +1 -1
- package/package.json +10 -5
- package/.turbo/turbo-build.log +0 -8
- package/CLAUDE.md +0 -265
- package/src/Cluster.test.ts +0 -283
- package/src/Cluster.ts +0 -83
- package/src/Column.test.ts +0 -199
- package/src/Column.ts +0 -710
- package/src/Global.test.ts +0 -367
- package/src/Global.ts +0 -169
- package/src/Page.test.ts +0 -114
- package/src/Page.ts +0 -208
- package/src/Pilotiq.perf.test.ts +0 -252
- package/src/Pilotiq.test.ts +0 -129
- package/src/Pilotiq.ts +0 -1158
- package/src/PilotiqRegistry.ts +0 -36
- package/src/PilotiqServiceProvider.ts +0 -121
- package/src/RelationManager.test.ts +0 -400
- package/src/RelationManager.ts +0 -527
- package/src/RenderHook.test.ts +0 -252
- package/src/RenderHook.ts +0 -242
- package/src/Resource.test.ts +0 -284
- package/src/Resource.ts +0 -526
- package/src/RightPanel.test.ts +0 -202
- package/src/RightPanel.ts +0 -132
- package/src/Tab.test.ts +0 -91
- package/src/Tab.ts +0 -156
- package/src/UserMenuItem.ts +0 -145
- package/src/actions/Action.test.ts +0 -2526
- package/src/actions/Action.ts +0 -1515
- package/src/actions/ActionGroup.test.ts +0 -112
- package/src/actions/ActionGroup.ts +0 -173
- package/src/actions/attachFactory.ts +0 -172
- package/src/actions/bulkFactories.ts +0 -168
- package/src/actions/crudFactories.ts +0 -220
- package/src/actions/exportFactory.ts +0 -225
- package/src/actions/factoryHelpers.ts +0 -177
- package/src/actions/importFactory.ts +0 -243
- package/src/actions/index.ts +0 -17
- package/src/actions/m2mFactories.ts +0 -193
- package/src/actions/relationFactories.ts +0 -372
- package/src/applyPageHooks.test.ts +0 -463
- package/src/applyPageHooks.ts +0 -330
- package/src/authorization.test.ts +0 -483
- package/src/breadcrumbs.test.ts +0 -238
- package/src/cells/coerce.test.ts +0 -85
- package/src/cells/coerce.ts +0 -84
- package/src/clusterPaths.ts +0 -35
- package/src/columns/BadgeColumn.test.ts +0 -54
- package/src/columns/BadgeColumn.ts +0 -32
- package/src/columns/BooleanColumn.test.ts +0 -41
- package/src/columns/BooleanColumn.ts +0 -18
- package/src/columns/ColorColumn.test.ts +0 -37
- package/src/columns/ColorColumn.ts +0 -38
- package/src/columns/IconColumn.test.ts +0 -54
- package/src/columns/IconColumn.ts +0 -37
- package/src/columns/ImageColumn.test.ts +0 -41
- package/src/columns/ImageColumn.ts +0 -28
- package/src/columns/SelectColumn.ts +0 -98
- package/src/columns/TextColumn.test.ts +0 -190
- package/src/columns/TextColumn.ts +0 -20
- package/src/columns/TextInputColumn.ts +0 -68
- package/src/columns/ToggleColumn.ts +0 -46
- package/src/columns/editableColumns.test.ts +0 -238
- package/src/columns/index.ts +0 -9
- package/src/defaultGlobalPages.ts +0 -95
- package/src/defaultPages.test.ts +0 -634
- package/src/defaultPages.ts +0 -617
- package/src/defaultViewPage.test.ts +0 -147
- package/src/elements/Form.test.ts +0 -223
- package/src/elements/Form.ts +0 -416
- package/src/elements/ListTabs.ts +0 -28
- package/src/elements/Table.test.ts +0 -422
- package/src/elements/Table.ts +0 -850
- package/src/elements/TableGroup.test.ts +0 -260
- package/src/elements/TableGroup.ts +0 -334
- package/src/elements/dispatchAction.test.ts +0 -463
- package/src/elements/dispatchAction.ts +0 -355
- package/src/elements/dispatchForm.test.ts +0 -477
- package/src/elements/dispatchForm.ts +0 -1993
- package/src/elements/dispatchTable.test.ts +0 -1514
- package/src/elements/dispatchTable.ts +0 -745
- package/src/elements/index.ts +0 -21
- package/src/entries/BadgeEntry.ts +0 -39
- package/src/entries/CodeEntry.test.ts +0 -40
- package/src/entries/CodeEntry.ts +0 -52
- package/src/entries/ColorEntry.ts +0 -63
- package/src/entries/ComponentEntry.test.ts +0 -173
- package/src/entries/ComponentEntry.ts +0 -95
- package/src/entries/Entry.ts +0 -304
- package/src/entries/IconEntry.ts +0 -49
- package/src/entries/ImageEntry.ts +0 -61
- package/src/entries/KeyValueEntry.ts +0 -47
- package/src/entries/RepeatableEntry.test.ts +0 -239
- package/src/entries/RepeatableEntry.ts +0 -173
- package/src/entries/TextEntry.test.ts +0 -394
- package/src/entries/TextEntry.ts +0 -60
- package/src/entries/index.ts +0 -12
- package/src/entries/leaves.test.ts +0 -306
- package/src/entries/registry.ts +0 -54
- package/src/fields/BuilderField.test.ts +0 -1188
- package/src/fields/BuilderField.ts +0 -605
- package/src/fields/BuilderRelationship.test.ts +0 -811
- package/src/fields/CheckboxField.test.ts +0 -44
- package/src/fields/CheckboxField.ts +0 -27
- package/src/fields/CheckboxListField.test.ts +0 -99
- package/src/fields/CheckboxListField.ts +0 -66
- package/src/fields/ColorPickerField.test.ts +0 -33
- package/src/fields/ColorPickerField.ts +0 -25
- package/src/fields/DateField.ts +0 -54
- package/src/fields/DateTimeField.test.ts +0 -55
- package/src/fields/EmailField.ts +0 -16
- package/src/fields/Field.test.ts +0 -654
- package/src/fields/Field.ts +0 -817
- package/src/fields/FileUploadField.test.ts +0 -143
- package/src/fields/FileUploadField.ts +0 -159
- package/src/fields/HiddenField.test.ts +0 -27
- package/src/fields/HiddenField.ts +0 -28
- package/src/fields/KeyValueField.test.ts +0 -105
- package/src/fields/KeyValueField.ts +0 -55
- package/src/fields/MarkdownField.test.ts +0 -167
- package/src/fields/MarkdownField.ts +0 -162
- package/src/fields/NumberField.ts +0 -33
- package/src/fields/RadioField.test.ts +0 -94
- package/src/fields/RadioField.ts +0 -67
- package/src/fields/RepeaterField.test.ts +0 -1806
- package/src/fields/RepeaterField.ts +0 -939
- package/src/fields/RepeaterRelationship.test.ts +0 -1923
- package/src/fields/RepeaterSimple.test.ts +0 -248
- package/src/fields/RowButton.test.ts +0 -219
- package/src/fields/RowButton.ts +0 -135
- package/src/fields/SelectField.test.ts +0 -192
- package/src/fields/SelectField.ts +0 -235
- package/src/fields/SliderField.test.ts +0 -50
- package/src/fields/SliderField.ts +0 -53
- package/src/fields/SlugField.ts +0 -24
- package/src/fields/TagsInputField.test.ts +0 -154
- package/src/fields/TagsInputField.ts +0 -133
- package/src/fields/TextField.test.ts +0 -213
- package/src/fields/TextField.ts +0 -177
- package/src/fields/TextareaField.test.ts +0 -58
- package/src/fields/TextareaField.ts +0 -59
- package/src/fields/ToggleButtonsField.test.ts +0 -106
- package/src/fields/ToggleButtonsField.ts +0 -59
- package/src/fields/ToggleField.ts +0 -16
- package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
- package/src/fields/optionsResolver.ts +0 -95
- package/src/fields/resolveField.ts +0 -28
- package/src/filters/BooleanFilter.ts +0 -35
- package/src/filters/DateRangeFilter.test.ts +0 -194
- package/src/filters/DateRangeFilter.ts +0 -148
- package/src/filters/Filter.test.ts +0 -268
- package/src/filters/Filter.ts +0 -184
- package/src/filters/FormFilter.test.ts +0 -238
- package/src/filters/FormFilter.ts +0 -215
- package/src/filters/MultiSelectFilter.test.ts +0 -119
- package/src/filters/MultiSelectFilter.ts +0 -78
- package/src/filters/QueryBuilderFilter.test.ts +0 -662
- package/src/filters/QueryBuilderFilter.ts +0 -398
- package/src/filters/SelectFilter.ts +0 -46
- package/src/filters/TernaryFilter.test.ts +0 -160
- package/src/filters/TernaryFilter.ts +0 -72
- package/src/filters/TrashedFilter.test.ts +0 -149
- package/src/filters/TrashedFilter.ts +0 -55
- package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
- package/src/filters/queryBuilder/Constraint.ts +0 -115
- package/src/filters/queryBuilder/DateConstraint.ts +0 -69
- package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
- package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
- package/src/filters/queryBuilder/TextConstraint.ts +0 -64
- package/src/filters/queryBuilder/index.ts +0 -12
- package/src/icons/index.ts +0 -2
- package/src/icons/lucide.ts +0 -204
- package/src/icons/registry.test.ts +0 -56
- package/src/icons/registry.ts +0 -41
- package/src/icons/types.ts +0 -47
- package/src/index.ts +0 -525
- package/src/io/csv.test.ts +0 -142
- package/src/io/csv.ts +0 -170
- package/src/nestedRelationManagerData.test.ts +0 -547
- package/src/notifications/Notification.test.ts +0 -210
- package/src/notifications/Notification.ts +0 -354
- package/src/notifications/broadcast.test.ts +0 -110
- package/src/notifications/broadcast.ts +0 -95
- package/src/notifications/database.test.ts +0 -383
- package/src/notifications/database.ts +0 -398
- package/src/notifications/databaseNotifications.test.ts +0 -187
- package/src/notifications/dispatchNotificationAction.test.ts +0 -341
- package/src/notifications/dispatchNotificationAction.ts +0 -142
- package/src/notifications/flash.test.ts +0 -89
- package/src/notifications/flash.ts +0 -71
- package/src/notifications/index.ts +0 -45
- package/src/notifications/registerBroadcastAuth.test.ts +0 -134
- package/src/notifications/registerBroadcastAuth.ts +0 -100
- package/src/notifications/resolveSavedNotification.test.ts +0 -82
- package/src/notifications/resolveSavedNotification.ts +0 -59
- package/src/notifications/types.ts +0 -93
- package/src/orm/m2mAccessor.ts +0 -66
- package/src/orm/modelDefaults.test.ts +0 -633
- package/src/orm/modelDefaults.ts +0 -666
- package/src/pageData/breadcrumbs.ts +0 -288
- package/src/pageData/forms.ts +0 -578
- package/src/pageData/helpers.ts +0 -857
- package/src/pageData/misc.ts +0 -347
- package/src/pageData/navigation.ts +0 -842
- package/src/pageData/relationPages.ts +0 -1248
- package/src/pageData/relationTabs.ts +0 -286
- package/src/pageData/resourcePages.ts +0 -609
- package/src/pageData.test.ts +0 -1545
- package/src/pageData.ts +0 -341
- package/src/plugins/index.ts +0 -8
- package/src/plugins/themeEditor.test.ts +0 -36
- package/src/plugins/themeEditor.ts +0 -45
- package/src/react/AppShell.tsx +0 -251
- package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
- package/src/react/CollabRoomContext.ts +0 -98
- package/src/react/CollabTextRendererRegistry.ts +0 -102
- package/src/react/CommandPalette.tsx +0 -375
- package/src/react/CurrentUserContext.tsx +0 -50
- package/src/react/CustomPageWrapperGate.tsx +0 -69
- package/src/react/CustomPageWrapperRegistry.ts +0 -45
- package/src/react/FieldFocusReporterRegistry.ts +0 -37
- package/src/react/FieldLabelSlotRegistry.ts +0 -30
- package/src/react/FieldPresenceRegistry.ts +0 -46
- package/src/react/FormCollabBindingRegistry.ts +0 -242
- package/src/react/FormStateContext.tsx +0 -591
- package/src/react/HeadHooks.tsx +0 -126
- package/src/react/MarkdownEditorRegistry.test.ts +0 -38
- package/src/react/MarkdownEditorRegistry.ts +0 -107
- package/src/react/NotificationActionStrip.tsx +0 -263
- package/src/react/NotificationBell.tsx +0 -426
- package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
- package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
- package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
- package/src/react/PendingSuggestionsContext.tsx +0 -172
- package/src/react/RecordWrapperGate.tsx +0 -58
- package/src/react/RecordWrapperRegistry.ts +0 -39
- package/src/react/RenderHookSlot.tsx +0 -32
- package/src/react/RightSidebar.tsx +0 -257
- package/src/react/RightSidebarContext.tsx +0 -234
- package/src/react/RightSidebarTrigger.tsx +0 -53
- package/src/react/RowCoordsContext.tsx +0 -23
- package/src/react/SchemaRenderer.tsx +0 -549
- package/src/react/SearchTrigger.tsx +0 -46
- package/src/react/ThemeProvider.tsx +0 -93
- package/src/react/ThemeSettingsPage.tsx +0 -579
- package/src/react/ThemeToggle.tsx +0 -20
- package/src/react/Toaster.tsx +0 -158
- package/src/react/UserMenu.tsx +0 -196
- package/src/react/WidgetDataContext.tsx +0 -157
- package/src/react/cells/EditableCell.tsx +0 -389
- package/src/react/component-slots.test.ts +0 -103
- package/src/react/component-slots.ts +0 -116
- package/src/react/fieldJsHandler.test.ts +0 -166
- package/src/react/fieldJsHandler.ts +0 -79
- package/src/react/fields/BuilderInput.tsx +0 -1078
- package/src/react/fields/CheckboxInput.tsx +0 -39
- package/src/react/fields/CheckboxListInput.tsx +0 -102
- package/src/react/fields/ColorInput.tsx +0 -71
- package/src/react/fields/DateFieldInput.tsx +0 -70
- package/src/react/fields/DateTimeInput.tsx +0 -62
- package/src/react/fields/FieldShell.tsx +0 -348
- package/src/react/fields/FileUploadInput.tsx +0 -639
- package/src/react/fields/HiddenInput.tsx +0 -17
- package/src/react/fields/KeyValueInput.tsx +0 -230
- package/src/react/fields/MarkdownInput.tsx +0 -560
- package/src/react/fields/RadioInput.tsx +0 -81
- package/src/react/fields/RepeaterInput.test.ts +0 -116
- package/src/react/fields/RepeaterInput.tsx +0 -1420
- package/src/react/fields/SelectFieldInput.tsx +0 -280
- package/src/react/fields/SliderInput.tsx +0 -81
- package/src/react/fields/TagsInput.tsx +0 -283
- package/src/react/fields/TextLikeInput.tsx +0 -256
- package/src/react/fields/ToggleButtonsInput.tsx +0 -60
- package/src/react/fields/ToggleFieldInput.tsx +0 -56
- package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
- package/src/react/fields/relationshipRenameDispatch.ts +0 -97
- package/src/react/fields/repeaterReconcile.test.ts +0 -114
- package/src/react/fields/repeaterReconcile.ts +0 -104
- package/src/react/fields/rowChromeButton.tsx +0 -336
- package/src/react/fields/rowState.ts +0 -106
- package/src/react/fields/syncRowGates.test.ts +0 -202
- package/src/react/fields/syncRowGates.ts +0 -66
- package/src/react/fields/textInputControls.tsx +0 -238
- package/src/react/fields/useRowReorderDnd.ts +0 -78
- package/src/react/formStateHelpers.test.ts +0 -508
- package/src/react/formStateHelpers.ts +0 -381
- package/src/react/hooks/use-mobile.ts +0 -19
- package/src/react/icon-context.tsx +0 -60
- package/src/react/index.ts +0 -194
- package/src/react/layouts/SidebarLayout.tsx +0 -250
- package/src/react/layouts/TopbarLayout.tsx +0 -258
- package/src/react/navigate.tsx +0 -37
- package/src/react/onProviderSynced.test.ts +0 -90
- package/src/react/parseRecordEditUrl.test.ts +0 -122
- package/src/react/parseRecordEditUrl.ts +0 -94
- package/src/react/persistedState.ts +0 -40
- package/src/react/registry.ts +0 -48
- package/src/react/right-panel-registry.tsx +0 -47
- package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
- package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
- package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
- package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
- package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
- package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
- package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
- package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
- package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
- package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
- package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
- package/src/react/schemaRenderer/action/buttons.tsx +0 -99
- package/src/react/schemaRenderer/action/helpers.ts +0 -140
- package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
- package/src/react/schemaRenderer/columnFormat.ts +0 -65
- package/src/react/schemaRenderer/constants.ts +0 -50
- package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
- package/src/react/schemaRenderer/form/renderField.tsx +0 -511
- package/src/react/schemaRenderer/helpers.tsx +0 -81
- package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
- package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
- package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
- package/src/react/schemaRenderer/table/filters.tsx +0 -1233
- package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
- package/src/react/schemaRenderer/table/links.tsx +0 -112
- package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
- package/src/react/schemaRenderer/table/url.tsx +0 -143
- package/src/react/theme-preview/apply.ts +0 -99
- package/src/react/theme-preview/build-html.ts +0 -436
- package/src/react/ui/button.tsx +0 -51
- package/src/react/ui/calendar.tsx +0 -67
- package/src/react/ui/checkbox.tsx +0 -29
- package/src/react/ui/dialog.tsx +0 -108
- package/src/react/ui/dropdown-menu.tsx +0 -97
- package/src/react/ui/input.tsx +0 -20
- package/src/react/ui/label.tsx +0 -21
- package/src/react/ui/popover.tsx +0 -50
- package/src/react/ui/select.tsx +0 -169
- package/src/react/ui/separator.tsx +0 -25
- package/src/react/ui/sheet.tsx +0 -136
- package/src/react/ui/sidebar.tsx +0 -723
- package/src/react/ui/skeleton.tsx +0 -13
- package/src/react/ui/slider.tsx +0 -34
- package/src/react/ui/switch.tsx +0 -28
- package/src/react/ui/table.tsx +0 -105
- package/src/react/ui/tabs.tsx +0 -63
- package/src/react/ui/textarea.tsx +0 -18
- package/src/react/ui/tooltip.tsx +0 -64
- package/src/react/useResizableWidth.ts +0 -139
- package/src/react/utils.ts +0 -6
- package/src/react/widgetRegistry.test.ts +0 -43
- package/src/react/widgetRegistry.ts +0 -50
- package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
- package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
- package/src/react/widgets/ViewRenderer.tsx +0 -71
- package/src/relationManagerData.test.ts +0 -1595
- package/src/richtext/index.ts +0 -8
- package/src/richtext/registry.ts +0 -89
- package/src/routes/globals.ts +0 -148
- package/src/routes/guard.test.ts +0 -325
- package/src/routes/helpers.ts +0 -704
- package/src/routes/pages.ts +0 -175
- package/src/routes/panel.ts +0 -204
- package/src/routes/relations.ts +0 -1243
- package/src/routes/resources.ts +0 -781
- package/src/routes/theme.ts +0 -91
- package/src/routes-nested-relations.test.ts +0 -676
- package/src/routes-relations.test.ts +0 -972
- package/src/routes.test.ts +0 -2027
- package/src/routes.ts +0 -303
- package/src/schema/Alert.test.ts +0 -109
- package/src/schema/Alert.ts +0 -131
- package/src/schema/Block.ts +0 -169
- package/src/schema/Breadcrumbs.ts +0 -40
- package/src/schema/Card.ts +0 -35
- package/src/schema/Divider.ts +0 -20
- package/src/schema/Element.ts +0 -219
- package/src/schema/EmptyState.test.ts +0 -37
- package/src/schema/EmptyState.ts +0 -63
- package/src/schema/Fieldset.ts +0 -43
- package/src/schema/Grid.ts +0 -43
- package/src/schema/Group.ts +0 -30
- package/src/schema/Heading.ts +0 -39
- package/src/schema/Html.ts +0 -67
- package/src/schema/Icon.ts +0 -54
- package/src/schema/Image.ts +0 -57
- package/src/schema/LinkTag.ts +0 -41
- package/src/schema/Markdown.ts +0 -85
- package/src/schema/MetaTag.ts +0 -41
- package/src/schema/RelationTabs.ts +0 -71
- package/src/schema/ScriptTag.ts +0 -55
- package/src/schema/Section.ts +0 -160
- package/src/schema/ServerDataElement.test.ts +0 -140
- package/src/schema/ServerDataElement.ts +0 -156
- package/src/schema/SlotComponent.test.ts +0 -77
- package/src/schema/SlotComponent.ts +0 -71
- package/src/schema/Split.ts +0 -50
- package/src/schema/Stat.test.ts +0 -118
- package/src/schema/Stat.ts +0 -154
- package/src/schema/StatsOverview.test.ts +0 -141
- package/src/schema/StatsOverview.ts +0 -119
- package/src/schema/StyleTag.ts +0 -35
- package/src/schema/TableWidget.test.ts +0 -297
- package/src/schema/TableWidget.ts +0 -289
- package/src/schema/Tabs.ts +0 -79
- package/src/schema/Text.ts +0 -58
- package/src/schema/UnorderedList.ts +0 -49
- package/src/schema/View.test.ts +0 -111
- package/src/schema/View.ts +0 -127
- package/src/schema/Wizard.ts +0 -220
- package/src/schema/containers.test.ts +0 -564
- package/src/schema/headTags.test.ts +0 -134
- package/src/schema/index.ts +0 -40
- package/src/schema/primes.test.ts +0 -269
- package/src/schema/resolveSchema.test.ts +0 -379
- package/src/schema/resolveSchema.ts +0 -917
- package/src/schema/sanitize.ts +0 -58
- package/src/search.test.ts +0 -446
- package/src/search.ts +0 -178
- package/src/sessionFilters.test.ts +0 -375
- package/src/sessionFilters.ts +0 -143
- package/src/slot-components/index.ts +0 -10
- package/src/slot-components/registry.ts +0 -56
- package/src/styles/file-upload.css +0 -13
- package/src/summarizers/Summarizer.test.ts +0 -84
- package/src/summarizers/Summarizer.ts +0 -123
- package/src/summarizers/index.ts +0 -11
- package/src/theme/base-colors.ts +0 -68
- package/src/theme/chart-colors.ts +0 -50
- package/src/theme/colors.ts +0 -447
- package/src/theme/generate-css.test.ts +0 -139
- package/src/theme/generate-css.ts +0 -44
- package/src/theme/generate-scale.test.ts +0 -106
- package/src/theme/generate-scale.ts +0 -97
- package/src/theme/icon-map.ts +0 -42
- package/src/theme/index.ts +0 -34
- package/src/theme/migrate.test.ts +0 -178
- package/src/theme/migrate.ts +0 -81
- package/src/theme/presets.ts +0 -135
- package/src/theme/radius.ts +0 -18
- package/src/theme/resolve.test.ts +0 -238
- package/src/theme/resolve.ts +0 -96
- package/src/theme/spacing.ts +0 -18
- package/src/theme/storage.test.ts +0 -126
- package/src/theme/storage.ts +0 -106
- package/src/theme/theme-colors.ts +0 -88
- package/src/theme/types.ts +0 -125
- package/src/uploads/UploadAdapter.ts +0 -35
- package/src/uploads/index.ts +0 -2
- package/src/uploads/localUpload.test.ts +0 -70
- package/src/uploads/localUpload.ts +0 -84
- package/src/validation/Validator.ts +0 -49
- package/src/validation/index.ts +0 -28
- package/src/validation/rules.ts +0 -78
- package/src/validation/runValidators.ts +0 -435
- package/src/validation/uniqueValidator.test.ts +0 -196
- package/src/validation/uniqueValidator.ts +0 -133
- package/src/validation/validators.test.ts +0 -268
- package/src/vite.test.ts +0 -184
- package/src/vite.ts +0 -787
- package/src/widgets/index.ts +0 -10
- package/src/widgets/registry.ts +0 -45
- package/src/widgets.test.ts +0 -592
- package/tsconfig.build.json +0 -11
- package/tsconfig.json +0 -4
- package/tsconfig.test.json +0 -10
- package/views/react/Dashboard.tsx +0 -27
- package/views/react/Resources/Form.tsx +0 -102
- package/views/react/Resources/Index.tsx +0 -49
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
MarkdownField,
|
|
6
|
-
DEFAULT_MARKDOWN_TOOLBAR,
|
|
7
|
-
} from './MarkdownField.js'
|
|
8
|
-
|
|
9
|
-
describe('MarkdownField', () => {
|
|
10
|
-
it('emits fieldType "markdown"', () => {
|
|
11
|
-
const meta = MarkdownField.make('body').toMeta()
|
|
12
|
-
assert.equal(meta.fieldType, 'markdown')
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
it('defaults to the full toolbar', () => {
|
|
16
|
-
const meta = MarkdownField.make('body').toMeta({ hasUploadAdapter: true })
|
|
17
|
-
assert.deepEqual(
|
|
18
|
-
meta['toolbarButtons'],
|
|
19
|
-
[...DEFAULT_MARKDOWN_TOOLBAR],
|
|
20
|
-
)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('omits minHeight/maxHeight/fileAttachments* by default', () => {
|
|
24
|
-
const meta = MarkdownField.make('body').toMeta()
|
|
25
|
-
assert.equal('minHeight' in meta, false)
|
|
26
|
-
assert.equal('maxHeight' in meta, false)
|
|
27
|
-
assert.equal('fileAttachmentsDirectory' in meta, false)
|
|
28
|
-
assert.equal('fileAttachmentsVisibility' in meta, false)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
describe('toolbarButtons()', () => {
|
|
32
|
-
it('replaces the toolbar entirely with the given list', () => {
|
|
33
|
-
const meta = MarkdownField.make('body')
|
|
34
|
-
.toolbarButtons(['bold', 'italic', 'link'])
|
|
35
|
-
.toMeta({ hasUploadAdapter: true })
|
|
36
|
-
assert.deepEqual(meta['toolbarButtons'], ['bold', 'italic', 'link'])
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('preserves order from the user-supplied list', () => {
|
|
40
|
-
const meta = MarkdownField.make('body')
|
|
41
|
-
.toolbarButtons(['link', 'codeBlock', 'bold'])
|
|
42
|
-
.toMeta({ hasUploadAdapter: true })
|
|
43
|
-
assert.deepEqual(meta['toolbarButtons'], ['link', 'codeBlock', 'bold'])
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('empty array ships a chrome-less editor', () => {
|
|
47
|
-
const meta = MarkdownField.make('body').toolbarButtons([]).toMeta()
|
|
48
|
-
assert.deepEqual(meta['toolbarButtons'], [])
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
describe('disableToolbarButtons()', () => {
|
|
53
|
-
it('drops listed buttons from the default toolbar', () => {
|
|
54
|
-
const meta = MarkdownField.make('body')
|
|
55
|
-
.disableToolbarButtons(['attachFiles', 'codeBlock'])
|
|
56
|
-
.toMeta({ hasUploadAdapter: true })
|
|
57
|
-
assert.equal((meta['toolbarButtons'] as string[]).includes('attachFiles'), false)
|
|
58
|
-
assert.equal((meta['toolbarButtons'] as string[]).includes('codeBlock'), false)
|
|
59
|
-
assert.equal((meta['toolbarButtons'] as string[]).includes('bold'), true)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('chains with toolbarButtons() — drops from the most-recently-set list', () => {
|
|
63
|
-
const meta = MarkdownField.make('body')
|
|
64
|
-
.toolbarButtons(['bold', 'italic', 'link'])
|
|
65
|
-
.disableToolbarButtons(['italic'])
|
|
66
|
-
.toMeta({ hasUploadAdapter: true })
|
|
67
|
-
assert.deepEqual(meta['toolbarButtons'], ['bold', 'link'])
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('no-ops on buttons that are not in the current list', () => {
|
|
71
|
-
const meta = MarkdownField.make('body')
|
|
72
|
-
.toolbarButtons(['bold'])
|
|
73
|
-
.disableToolbarButtons(['attachFiles'])
|
|
74
|
-
.toMeta({ hasUploadAdapter: true })
|
|
75
|
-
assert.deepEqual(meta['toolbarButtons'], ['bold'])
|
|
76
|
-
})
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
describe('attachFiles strip', () => {
|
|
80
|
-
it('strips attachFiles from toolbar when no upload adapter is configured', () => {
|
|
81
|
-
const meta = MarkdownField.make('body').toMeta()
|
|
82
|
-
const toolbar = meta['toolbarButtons'] as string[]
|
|
83
|
-
assert.equal(toolbar.includes('attachFiles'), false)
|
|
84
|
-
// every other default button survives
|
|
85
|
-
assert.equal(toolbar.length, DEFAULT_MARKDOWN_TOOLBAR.length - 1)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
it('keeps attachFiles when ctx.hasUploadAdapter is true', () => {
|
|
89
|
-
const meta = MarkdownField.make('body').toMeta({ hasUploadAdapter: true })
|
|
90
|
-
const toolbar = meta['toolbarButtons'] as string[]
|
|
91
|
-
assert.equal(toolbar.includes('attachFiles'), true)
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
it('strips attachFiles when uploadUrl is set but adapter flag is not', () => {
|
|
95
|
-
// Mirrors the "URL stamped but no adapter" failure mode that
|
|
96
|
-
// should hide the optional affordance.
|
|
97
|
-
const meta = MarkdownField.make('body').toMeta({ uploadUrl: '/admin/_uploads' })
|
|
98
|
-
const toolbar = meta['toolbarButtons'] as string[]
|
|
99
|
-
assert.equal(toolbar.includes('attachFiles'), false)
|
|
100
|
-
// uploadUrl is also withheld so the renderer can't accidentally
|
|
101
|
-
// try to POST to a route that has no adapter wired up.
|
|
102
|
-
assert.equal('uploadUrl' in meta, false)
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('emits uploadUrl on meta only when both ctx fields are present', () => {
|
|
106
|
-
const meta = MarkdownField.make('body').toMeta({
|
|
107
|
-
uploadUrl: '/admin/_uploads',
|
|
108
|
-
hasUploadAdapter: true,
|
|
109
|
-
})
|
|
110
|
-
assert.equal(meta['uploadUrl'], '/admin/_uploads')
|
|
111
|
-
})
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
describe('minHeight / maxHeight', () => {
|
|
115
|
-
it('emits minHeight when set', () => {
|
|
116
|
-
const meta = MarkdownField.make('body').minHeight('200px').toMeta()
|
|
117
|
-
assert.equal(meta['minHeight'], '200px')
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
it('emits maxHeight when set', () => {
|
|
121
|
-
const meta = MarkdownField.make('body').maxHeight('600px').toMeta()
|
|
122
|
-
assert.equal(meta['maxHeight'], '600px')
|
|
123
|
-
})
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
describe('fileAttachmentsDirectory / fileAttachmentsVisibility', () => {
|
|
127
|
-
it('forwards directory + visibility to meta', () => {
|
|
128
|
-
const meta = MarkdownField.make('body')
|
|
129
|
-
.fileAttachmentsDirectory('articles')
|
|
130
|
-
.fileAttachmentsVisibility('public')
|
|
131
|
-
.toMeta()
|
|
132
|
-
assert.equal(meta['fileAttachmentsDirectory'], 'articles')
|
|
133
|
-
assert.equal(meta['fileAttachmentsVisibility'], 'public')
|
|
134
|
-
})
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
describe('cross-field plumbing (Plan #6 inheritance)', () => {
|
|
138
|
-
it('placeholder / required / helperText / default flow through buildMeta', () => {
|
|
139
|
-
const meta = MarkdownField.make('body')
|
|
140
|
-
.placeholder('Write in markdown…')
|
|
141
|
-
.required()
|
|
142
|
-
.helperText('Markdown formatting supported')
|
|
143
|
-
.default('# Hello')
|
|
144
|
-
.toMeta()
|
|
145
|
-
assert.equal(meta.placeholder, 'Write in markdown…')
|
|
146
|
-
assert.equal(meta.required, true)
|
|
147
|
-
assert.equal(meta['helperText'], 'Markdown formatting supported')
|
|
148
|
-
assert.equal(meta['defaultValue'], '# Hello')
|
|
149
|
-
})
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
describe('getters', () => {
|
|
153
|
-
it('expose internal config for tests / introspection', () => {
|
|
154
|
-
const f = MarkdownField.make('body')
|
|
155
|
-
.toolbarButtons(['bold', 'italic'])
|
|
156
|
-
.minHeight('100px')
|
|
157
|
-
.maxHeight('500px')
|
|
158
|
-
.fileAttachmentsDirectory('articles')
|
|
159
|
-
.fileAttachmentsVisibility('private')
|
|
160
|
-
assert.deepEqual([...f.getToolbarButtons()], ['bold', 'italic'])
|
|
161
|
-
assert.equal(f.getMinHeight(), '100px')
|
|
162
|
-
assert.equal(f.getMaxHeight(), '500px')
|
|
163
|
-
assert.equal(f.getFileAttachmentsDirectory(), 'articles')
|
|
164
|
-
assert.equal(f.getFileAttachmentsVisibility(), 'private')
|
|
165
|
-
})
|
|
166
|
-
})
|
|
167
|
-
})
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { Field, type FieldMeta } from './Field.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Recognized toolbar buttons. The renderer maps each id to a click handler
|
|
6
|
-
* that splices markdown into the textarea around the current selection.
|
|
7
|
-
* `attachFiles` is special-cased — it requires a panel-level UploadAdapter
|
|
8
|
-
* (`Pilotiq.uploads({ adapter })`) and is stripped server-side from the
|
|
9
|
-
* resolved meta when none is registered.
|
|
10
|
-
*/
|
|
11
|
-
export type MarkdownToolbarButton =
|
|
12
|
-
| 'bold'
|
|
13
|
-
| 'italic'
|
|
14
|
-
| 'strike'
|
|
15
|
-
| 'link'
|
|
16
|
-
| 'heading'
|
|
17
|
-
| 'bulletList'
|
|
18
|
-
| 'orderedList'
|
|
19
|
-
| 'blockquote'
|
|
20
|
-
| 'codeBlock'
|
|
21
|
-
| 'attachFiles'
|
|
22
|
-
|
|
23
|
-
export type MarkdownAttachmentVisibility = 'public' | 'private'
|
|
24
|
-
|
|
25
|
-
export const DEFAULT_MARKDOWN_TOOLBAR: readonly MarkdownToolbarButton[] = [
|
|
26
|
-
'bold',
|
|
27
|
-
'italic',
|
|
28
|
-
'strike',
|
|
29
|
-
'link',
|
|
30
|
-
'heading',
|
|
31
|
-
'bulletList',
|
|
32
|
-
'orderedList',
|
|
33
|
-
'blockquote',
|
|
34
|
-
'codeBlock',
|
|
35
|
-
'attachFiles',
|
|
36
|
-
] as const
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Markdown editor. The wire format is a plain markdown string under the
|
|
40
|
-
* field name — same shape as `TextareaField`, so no new coerce branch
|
|
41
|
-
* is needed.
|
|
42
|
-
*
|
|
43
|
-
* **Renderer is pluggable.** When `@pilotiq/tiptap` is installed, its
|
|
44
|
-
* `registerTiptap()` hook wires a WYSIWYG editor that parses the
|
|
45
|
-
* markdown into a Tiptap document, exposes a rich-text toolbar, and
|
|
46
|
-
* serializes back to markdown on every change via `tiptap-markdown`.
|
|
47
|
-
* Editor / Source / Preview tabs let users switch between the WYSIWYG
|
|
48
|
-
* view, raw markdown, and a rendered preview without leaving the form.
|
|
49
|
-
* Collab is automatic — when a `<RecordCollabRoom>` is mounted up-tree
|
|
50
|
-
* the editor binds to the shared `Y.XmlFragment` and all peers see live
|
|
51
|
-
* edits, the same way `RichTextField` does. Without `@pilotiq/tiptap`,
|
|
52
|
-
* `MarkdownInput` falls back to a textarea with a formatting toolbar +
|
|
53
|
-
* a preview tab — works fine for panels that don't install the adapter.
|
|
54
|
-
*
|
|
55
|
-
* The toolbar is configurable via `toolbarButtons([…])` /
|
|
56
|
-
* `disableToolbarButtons([…])`; pass `[]` to hide the toolbar entirely.
|
|
57
|
-
*
|
|
58
|
-
* `attachFiles` integrates with the panel's `UploadAdapter` (the same
|
|
59
|
-
* one `FileUpload` uses) — the toolbar button uploads the file via
|
|
60
|
-
* `POST {base}/_uploads` and inserts an `` image (or a
|
|
61
|
-
* `[name](url)` link for non-images). When no adapter is registered,
|
|
62
|
-
* the button is stripped server-side so apps without uploads never see
|
|
63
|
-
* a broken affordance.
|
|
64
|
-
*
|
|
65
|
-
* @example
|
|
66
|
-
* ```ts
|
|
67
|
-
* MarkdownField.make('body')
|
|
68
|
-
* .label('Article body')
|
|
69
|
-
* .placeholder('Write in markdown…')
|
|
70
|
-
* .minHeight('200px')
|
|
71
|
-
* .maxHeight('600px')
|
|
72
|
-
* .fileAttachmentsDirectory('articles')
|
|
73
|
-
* ```
|
|
74
|
-
*/
|
|
75
|
-
export class MarkdownField extends Field {
|
|
76
|
-
private _toolbarButtons: MarkdownToolbarButton[] = [...DEFAULT_MARKDOWN_TOOLBAR]
|
|
77
|
-
private _minHeight?: string
|
|
78
|
-
private _maxHeight?: string
|
|
79
|
-
private _fileAttachmentsDirectory?: string
|
|
80
|
-
private _fileAttachmentsVisibility?: MarkdownAttachmentVisibility
|
|
81
|
-
|
|
82
|
-
private constructor(name: string) {
|
|
83
|
-
super(name, 'markdown')
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
static make(name: string): MarkdownField {
|
|
87
|
-
return new MarkdownField(name)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Replace the toolbar entirely with the given list. Order is preserved.
|
|
92
|
-
* Pass `[]` for a toolbar-less editor (preview tab still mounts).
|
|
93
|
-
*/
|
|
94
|
-
toolbarButtons(buttons: MarkdownToolbarButton[]): this {
|
|
95
|
-
this._toolbarButtons = [...buttons]
|
|
96
|
-
return this
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Sugar — drop the listed buttons from the current toolbar without
|
|
101
|
-
* having to re-spell every survivor. Operates on whatever the current
|
|
102
|
-
* toolbar list is (the default, or whatever the last `toolbarButtons()`
|
|
103
|
-
* call set).
|
|
104
|
-
*/
|
|
105
|
-
disableToolbarButtons(buttons: MarkdownToolbarButton[]): this {
|
|
106
|
-
const drop = new Set(buttons)
|
|
107
|
-
this._toolbarButtons = this._toolbarButtons.filter(b => !drop.has(b))
|
|
108
|
-
return this
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** CSS height for the textarea's collapsed state — any valid CSS length. */
|
|
112
|
-
minHeight(value: string): this { this._minHeight = value; return this }
|
|
113
|
-
|
|
114
|
-
/** Cap the textarea's grown height — defaults to no cap. */
|
|
115
|
-
maxHeight(value: string): this { this._maxHeight = value; return this }
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Sub-directory hint forwarded to the upload adapter alongside the
|
|
119
|
-
* pasted-image / attached-file payload. Adapters honor it differently
|
|
120
|
-
* (`localUpload` writes to `<root>/<directory>/...`, S3 prepends to
|
|
121
|
-
* the key, etc.).
|
|
122
|
-
*/
|
|
123
|
-
fileAttachmentsDirectory(d: string): this {
|
|
124
|
-
this._fileAttachmentsDirectory = d
|
|
125
|
-
return this
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** Adapter-defined visibility hint — `'public'` or `'private'`. */
|
|
129
|
-
fileAttachmentsVisibility(v: MarkdownAttachmentVisibility): this {
|
|
130
|
-
this._fileAttachmentsVisibility = v
|
|
131
|
-
return this
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
getToolbarButtons(): readonly MarkdownToolbarButton[] { return this._toolbarButtons }
|
|
135
|
-
getMinHeight(): string | undefined { return this._minHeight }
|
|
136
|
-
getMaxHeight(): string | undefined { return this._maxHeight }
|
|
137
|
-
getFileAttachmentsDirectory(): string | undefined { return this._fileAttachmentsDirectory }
|
|
138
|
-
getFileAttachmentsVisibility(): MarkdownAttachmentVisibility | undefined { return this._fileAttachmentsVisibility }
|
|
139
|
-
|
|
140
|
-
override toMeta(ctx?: RenderContext): FieldMeta {
|
|
141
|
-
const base = this.buildMeta(ctx)
|
|
142
|
-
// Strip `attachFiles` server-side when the panel hasn't registered an
|
|
143
|
-
// upload adapter. Apps without uploads see a clean toolbar with no
|
|
144
|
-
// broken affordance — distinct from `uploadUrl`, which is always
|
|
145
|
-
// stamped so `FileUpload` can surface a clear error.
|
|
146
|
-
const toolbarButtons = ctx?.hasUploadAdapter
|
|
147
|
-
? this._toolbarButtons
|
|
148
|
-
: this._toolbarButtons.filter(b => b !== 'attachFiles')
|
|
149
|
-
return {
|
|
150
|
-
...base,
|
|
151
|
-
toolbarButtons,
|
|
152
|
-
...(this._minHeight !== undefined ? { minHeight: this._minHeight } : {}),
|
|
153
|
-
...(this._maxHeight !== undefined ? { maxHeight: this._maxHeight } : {}),
|
|
154
|
-
...(this._fileAttachmentsDirectory !== undefined
|
|
155
|
-
? { fileAttachmentsDirectory: this._fileAttachmentsDirectory } : {}),
|
|
156
|
-
...(this._fileAttachmentsVisibility !== undefined
|
|
157
|
-
? { fileAttachmentsVisibility: this._fileAttachmentsVisibility } : {}),
|
|
158
|
-
...(ctx?.uploadUrl && ctx?.hasUploadAdapter ? { uploadUrl: ctx.uploadUrl } : {}),
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Field, type FieldMeta } from './Field.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
export class NumberField extends Field {
|
|
5
|
-
private _min?: number
|
|
6
|
-
private _max?: number
|
|
7
|
-
private _step?: number
|
|
8
|
-
|
|
9
|
-
private constructor(name: string) {
|
|
10
|
-
super(name, 'number')
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
static make(name: string): NumberField {
|
|
14
|
-
return new NumberField(name)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
min(n: number): this { this._min = n; return this }
|
|
18
|
-
max(n: number): this { this._max = n; return this }
|
|
19
|
-
step(n: number): this { this._step = n; return this }
|
|
20
|
-
|
|
21
|
-
getMin(): number | undefined { return this._min }
|
|
22
|
-
getMax(): number | undefined { return this._max }
|
|
23
|
-
getStep(): number | undefined { return this._step }
|
|
24
|
-
|
|
25
|
-
override toMeta(ctx?: RenderContext): FieldMeta {
|
|
26
|
-
return {
|
|
27
|
-
...this.buildMeta(ctx),
|
|
28
|
-
...(this._min !== undefined ? { min: this._min } : {}),
|
|
29
|
-
...(this._max !== undefined ? { max: this._max } : {}),
|
|
30
|
-
...(this._step !== undefined ? { step: this._step } : {}),
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { RadioField, Radio } from './RadioField.js'
|
|
5
|
-
|
|
6
|
-
describe('RadioField', () => {
|
|
7
|
-
it('emits fieldType "radio"', async () => {
|
|
8
|
-
const meta = await RadioField.make('plan').toMeta()
|
|
9
|
-
assert.equal(meta.fieldType, 'radio')
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
it('exports an alias `Radio`', () => {
|
|
13
|
-
assert.equal(Radio, RadioField)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
describe('options(static array)', () => {
|
|
17
|
-
it('emits options array verbatim', async () => {
|
|
18
|
-
const meta = await RadioField.make('plan').options([
|
|
19
|
-
{ value: 'free', label: 'Free' },
|
|
20
|
-
{ value: 'pro', label: 'Pro' },
|
|
21
|
-
]).toMeta()
|
|
22
|
-
assert.deepEqual(meta['options'], [
|
|
23
|
-
{ value: 'free', label: 'Free' },
|
|
24
|
-
{ value: 'pro', label: 'Pro' },
|
|
25
|
-
])
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('hasDynamicOptions is false for static arrays', () => {
|
|
29
|
-
const f = RadioField.make('plan').options([{ value: 'a', label: 'A' }])
|
|
30
|
-
assert.equal(f.hasDynamicOptions(), false)
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('getOptions returns the array', () => {
|
|
34
|
-
const f = RadioField.make('plan').options([{ value: 'a', label: 'A' }])
|
|
35
|
-
assert.deepEqual(f.getOptions(), [{ value: 'a', label: 'A' }])
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
describe('inline()', () => {
|
|
40
|
-
it('default is vertical (no inline flag emitted)', async () => {
|
|
41
|
-
const meta = await RadioField.make('x').toMeta()
|
|
42
|
-
assert.equal('inline' in meta, false)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('inline() emits inline:true', async () => {
|
|
46
|
-
const meta = await RadioField.make('x').inline().toMeta()
|
|
47
|
-
assert.equal(meta['inline'], true)
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('inline(false) does not emit the flag', async () => {
|
|
51
|
-
const meta = await RadioField.make('x').inline(false).toMeta()
|
|
52
|
-
assert.equal('inline' in meta, false)
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
describe('options(resolver function)', () => {
|
|
57
|
-
it('runs the resolver against ctx', async () => {
|
|
58
|
-
const f = RadioField.make('state').options(({ $get }) => {
|
|
59
|
-
const country = $get?.('country') as string | undefined
|
|
60
|
-
if (country === 'US') return [{ value: 'CA', label: 'California' }]
|
|
61
|
-
return [{ value: 'NA', label: 'N/A' }]
|
|
62
|
-
})
|
|
63
|
-
assert.equal(f.hasDynamicOptions(), true)
|
|
64
|
-
const us = await f.toMeta({
|
|
65
|
-
values: { country: 'US' },
|
|
66
|
-
$get: (n) => ({ country: 'US' } as Record<string, unknown>)[n],
|
|
67
|
-
})
|
|
68
|
-
assert.deepEqual(us['options'], [{ value: 'CA', label: 'California' }])
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('async resolver is awaited', async () => {
|
|
72
|
-
const f = RadioField.make('items').options(async () => {
|
|
73
|
-
await new Promise(r => setTimeout(r, 1))
|
|
74
|
-
return [{ value: 'a', label: 'A' }]
|
|
75
|
-
})
|
|
76
|
-
const meta = await f.toMeta()
|
|
77
|
-
assert.deepEqual(meta['options'], [{ value: 'a', label: 'A' }])
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
it('thrown resolver returns empty options + console.warn', async () => {
|
|
81
|
-
const original = console.warn
|
|
82
|
-
const calls: unknown[] = []
|
|
83
|
-
console.warn = (...args: unknown[]) => { calls.push(args) }
|
|
84
|
-
try {
|
|
85
|
-
const f = RadioField.make('broken').options(() => { throw new Error('boom') })
|
|
86
|
-
const meta = await f.toMeta()
|
|
87
|
-
assert.deepEqual(meta['options'], [])
|
|
88
|
-
assert.equal(calls.length, 1)
|
|
89
|
-
} finally {
|
|
90
|
-
console.warn = original
|
|
91
|
-
}
|
|
92
|
-
})
|
|
93
|
-
})
|
|
94
|
-
})
|
package/src/fields/RadioField.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Field, type FieldMeta } from './Field.js'
|
|
2
|
-
import {
|
|
3
|
-
resolveOptions,
|
|
4
|
-
disableOptionsTakenInSiblings,
|
|
5
|
-
type OptionsResolver,
|
|
6
|
-
type SelectOption,
|
|
7
|
-
} from './optionsResolver.js'
|
|
8
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Single-choice field rendered as a stack of `<input type="radio">`
|
|
12
|
-
* + label rows. Reuses the same `OptionsResolver` shape as
|
|
13
|
-
* `SelectField` so dependent options work the same way: pass an
|
|
14
|
-
* array for static, or a function for `({ $get }) => …`.
|
|
15
|
-
*
|
|
16
|
-
* `inline()` switches the layout from vertical to a horizontal row
|
|
17
|
-
* — convenient for short lists (≤4 options).
|
|
18
|
-
*/
|
|
19
|
-
export class RadioField extends Field {
|
|
20
|
-
private _options: SelectOption[] | OptionsResolver = []
|
|
21
|
-
private _inline = false
|
|
22
|
-
|
|
23
|
-
private constructor(name: string) {
|
|
24
|
-
super(name, 'radio')
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
static make(name: string): RadioField {
|
|
28
|
-
return new RadioField(name)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
options(opts: SelectOption[] | OptionsResolver): this {
|
|
32
|
-
this._options = opts
|
|
33
|
-
return this
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
inline(value: boolean = true): this {
|
|
37
|
-
this._inline = value
|
|
38
|
-
return this
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
getOptions(): SelectOption[] {
|
|
42
|
-
return Array.isArray(this._options) ? this._options : []
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
hasDynamicOptions(): boolean {
|
|
46
|
-
return typeof this._options === 'function'
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
isInline(): boolean { return this._inline }
|
|
50
|
-
|
|
51
|
-
override async toMeta(ctx?: RenderContext): Promise<FieldMeta> {
|
|
52
|
-
const base = this.buildMeta(ctx)
|
|
53
|
-
const options = disableOptionsTakenInSiblings(
|
|
54
|
-
await resolveOptions(this._options, ctx, this.name),
|
|
55
|
-
this.shouldDisableOptionsTakenInSiblings(),
|
|
56
|
-
this.name,
|
|
57
|
-
ctx,
|
|
58
|
-
)
|
|
59
|
-
return {
|
|
60
|
-
...base,
|
|
61
|
-
options,
|
|
62
|
-
...(this._inline ? { inline: true } : {}),
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export const Radio = RadioField
|