@pilotiq/pilotiq 0.24.1 → 0.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/boost/guidelines.md +566 -0
- package/boost/skills/pilotiq-fields/SKILL.md +47 -0
- package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
- package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
- package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
- package/boost/skills/pilotiq-relations/SKILL.md +47 -0
- package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
- package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
- package/boost/skills/pilotiq-resource/SKILL.md +61 -0
- package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
- package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
- package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
- package/package.json +6 -1
- package/.turbo/turbo-build.log +0 -8
- package/CLAUDE.md +0 -265
- package/src/Cluster.test.ts +0 -283
- package/src/Cluster.ts +0 -83
- package/src/Column.test.ts +0 -199
- package/src/Column.ts +0 -710
- package/src/Global.test.ts +0 -367
- package/src/Global.ts +0 -169
- package/src/Page.test.ts +0 -114
- package/src/Page.ts +0 -208
- package/src/Pilotiq.perf.test.ts +0 -252
- package/src/Pilotiq.test.ts +0 -129
- package/src/Pilotiq.ts +0 -1158
- package/src/PilotiqRegistry.ts +0 -36
- package/src/PilotiqServiceProvider.ts +0 -121
- package/src/RelationManager.test.ts +0 -400
- package/src/RelationManager.ts +0 -527
- package/src/RenderHook.test.ts +0 -252
- package/src/RenderHook.ts +0 -242
- package/src/Resource.test.ts +0 -284
- package/src/Resource.ts +0 -526
- package/src/RightPanel.test.ts +0 -202
- package/src/RightPanel.ts +0 -132
- package/src/Tab.test.ts +0 -91
- package/src/Tab.ts +0 -156
- package/src/UserMenuItem.ts +0 -145
- package/src/actions/Action.test.ts +0 -2526
- package/src/actions/Action.ts +0 -1515
- package/src/actions/ActionGroup.test.ts +0 -112
- package/src/actions/ActionGroup.ts +0 -173
- package/src/actions/attachFactory.ts +0 -172
- package/src/actions/bulkFactories.ts +0 -168
- package/src/actions/crudFactories.ts +0 -220
- package/src/actions/exportFactory.ts +0 -225
- package/src/actions/factoryHelpers.ts +0 -177
- package/src/actions/importFactory.ts +0 -243
- package/src/actions/index.ts +0 -17
- package/src/actions/m2mFactories.ts +0 -193
- package/src/actions/relationFactories.ts +0 -372
- package/src/applyPageHooks.test.ts +0 -463
- package/src/applyPageHooks.ts +0 -330
- package/src/authorization.test.ts +0 -483
- package/src/breadcrumbs.test.ts +0 -238
- package/src/cells/coerce.test.ts +0 -85
- package/src/cells/coerce.ts +0 -84
- package/src/clusterPaths.ts +0 -35
- package/src/columns/BadgeColumn.test.ts +0 -54
- package/src/columns/BadgeColumn.ts +0 -32
- package/src/columns/BooleanColumn.test.ts +0 -41
- package/src/columns/BooleanColumn.ts +0 -18
- package/src/columns/ColorColumn.test.ts +0 -37
- package/src/columns/ColorColumn.ts +0 -38
- package/src/columns/IconColumn.test.ts +0 -54
- package/src/columns/IconColumn.ts +0 -37
- package/src/columns/ImageColumn.test.ts +0 -41
- package/src/columns/ImageColumn.ts +0 -28
- package/src/columns/SelectColumn.ts +0 -98
- package/src/columns/TextColumn.test.ts +0 -190
- package/src/columns/TextColumn.ts +0 -20
- package/src/columns/TextInputColumn.ts +0 -68
- package/src/columns/ToggleColumn.ts +0 -46
- package/src/columns/editableColumns.test.ts +0 -238
- package/src/columns/index.ts +0 -9
- package/src/defaultGlobalPages.ts +0 -95
- package/src/defaultPages.test.ts +0 -634
- package/src/defaultPages.ts +0 -617
- package/src/defaultViewPage.test.ts +0 -147
- package/src/elements/Form.test.ts +0 -223
- package/src/elements/Form.ts +0 -416
- package/src/elements/ListTabs.ts +0 -28
- package/src/elements/Table.test.ts +0 -422
- package/src/elements/Table.ts +0 -850
- package/src/elements/TableGroup.test.ts +0 -260
- package/src/elements/TableGroup.ts +0 -334
- package/src/elements/dispatchAction.test.ts +0 -463
- package/src/elements/dispatchAction.ts +0 -355
- package/src/elements/dispatchForm.test.ts +0 -477
- package/src/elements/dispatchForm.ts +0 -1993
- package/src/elements/dispatchTable.test.ts +0 -1514
- package/src/elements/dispatchTable.ts +0 -745
- package/src/elements/index.ts +0 -21
- package/src/entries/BadgeEntry.ts +0 -39
- package/src/entries/CodeEntry.test.ts +0 -40
- package/src/entries/CodeEntry.ts +0 -52
- package/src/entries/ColorEntry.ts +0 -63
- package/src/entries/ComponentEntry.test.ts +0 -173
- package/src/entries/ComponentEntry.ts +0 -95
- package/src/entries/Entry.ts +0 -304
- package/src/entries/IconEntry.ts +0 -49
- package/src/entries/ImageEntry.ts +0 -61
- package/src/entries/KeyValueEntry.ts +0 -47
- package/src/entries/RepeatableEntry.test.ts +0 -239
- package/src/entries/RepeatableEntry.ts +0 -173
- package/src/entries/TextEntry.test.ts +0 -394
- package/src/entries/TextEntry.ts +0 -60
- package/src/entries/index.ts +0 -12
- package/src/entries/leaves.test.ts +0 -306
- package/src/entries/registry.ts +0 -54
- package/src/fields/BuilderField.test.ts +0 -1188
- package/src/fields/BuilderField.ts +0 -605
- package/src/fields/BuilderRelationship.test.ts +0 -811
- package/src/fields/CheckboxField.test.ts +0 -44
- package/src/fields/CheckboxField.ts +0 -27
- package/src/fields/CheckboxListField.test.ts +0 -99
- package/src/fields/CheckboxListField.ts +0 -66
- package/src/fields/ColorPickerField.test.ts +0 -33
- package/src/fields/ColorPickerField.ts +0 -25
- package/src/fields/DateField.ts +0 -54
- package/src/fields/DateTimeField.test.ts +0 -55
- package/src/fields/EmailField.ts +0 -16
- package/src/fields/Field.test.ts +0 -654
- package/src/fields/Field.ts +0 -817
- package/src/fields/FileUploadField.test.ts +0 -143
- package/src/fields/FileUploadField.ts +0 -159
- package/src/fields/HiddenField.test.ts +0 -27
- package/src/fields/HiddenField.ts +0 -28
- package/src/fields/KeyValueField.test.ts +0 -105
- package/src/fields/KeyValueField.ts +0 -55
- package/src/fields/MarkdownField.test.ts +0 -167
- package/src/fields/MarkdownField.ts +0 -162
- package/src/fields/NumberField.ts +0 -33
- package/src/fields/RadioField.test.ts +0 -94
- package/src/fields/RadioField.ts +0 -67
- package/src/fields/RepeaterField.test.ts +0 -1806
- package/src/fields/RepeaterField.ts +0 -939
- package/src/fields/RepeaterRelationship.test.ts +0 -1923
- package/src/fields/RepeaterSimple.test.ts +0 -248
- package/src/fields/RowButton.test.ts +0 -219
- package/src/fields/RowButton.ts +0 -135
- package/src/fields/SelectField.test.ts +0 -192
- package/src/fields/SelectField.ts +0 -235
- package/src/fields/SliderField.test.ts +0 -50
- package/src/fields/SliderField.ts +0 -53
- package/src/fields/SlugField.ts +0 -24
- package/src/fields/TagsInputField.test.ts +0 -154
- package/src/fields/TagsInputField.ts +0 -133
- package/src/fields/TextField.test.ts +0 -213
- package/src/fields/TextField.ts +0 -177
- package/src/fields/TextareaField.test.ts +0 -58
- package/src/fields/TextareaField.ts +0 -59
- package/src/fields/ToggleButtonsField.test.ts +0 -106
- package/src/fields/ToggleButtonsField.ts +0 -59
- package/src/fields/ToggleField.ts +0 -16
- package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
- package/src/fields/optionsResolver.ts +0 -95
- package/src/fields/resolveField.ts +0 -28
- package/src/filters/BooleanFilter.ts +0 -35
- package/src/filters/DateRangeFilter.test.ts +0 -194
- package/src/filters/DateRangeFilter.ts +0 -148
- package/src/filters/Filter.test.ts +0 -268
- package/src/filters/Filter.ts +0 -184
- package/src/filters/FormFilter.test.ts +0 -238
- package/src/filters/FormFilter.ts +0 -215
- package/src/filters/MultiSelectFilter.test.ts +0 -119
- package/src/filters/MultiSelectFilter.ts +0 -78
- package/src/filters/QueryBuilderFilter.test.ts +0 -662
- package/src/filters/QueryBuilderFilter.ts +0 -398
- package/src/filters/SelectFilter.ts +0 -46
- package/src/filters/TernaryFilter.test.ts +0 -160
- package/src/filters/TernaryFilter.ts +0 -72
- package/src/filters/TrashedFilter.test.ts +0 -149
- package/src/filters/TrashedFilter.ts +0 -55
- package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
- package/src/filters/queryBuilder/Constraint.ts +0 -115
- package/src/filters/queryBuilder/DateConstraint.ts +0 -69
- package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
- package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
- package/src/filters/queryBuilder/TextConstraint.ts +0 -64
- package/src/filters/queryBuilder/index.ts +0 -12
- package/src/icons/index.ts +0 -2
- package/src/icons/lucide.ts +0 -204
- package/src/icons/registry.test.ts +0 -56
- package/src/icons/registry.ts +0 -41
- package/src/icons/types.ts +0 -47
- package/src/index.ts +0 -525
- package/src/io/csv.test.ts +0 -142
- package/src/io/csv.ts +0 -170
- package/src/nestedRelationManagerData.test.ts +0 -547
- package/src/notifications/Notification.test.ts +0 -210
- package/src/notifications/Notification.ts +0 -354
- package/src/notifications/broadcast.test.ts +0 -110
- package/src/notifications/broadcast.ts +0 -95
- package/src/notifications/database.test.ts +0 -383
- package/src/notifications/database.ts +0 -398
- package/src/notifications/databaseNotifications.test.ts +0 -187
- package/src/notifications/dispatchNotificationAction.test.ts +0 -341
- package/src/notifications/dispatchNotificationAction.ts +0 -142
- package/src/notifications/flash.test.ts +0 -89
- package/src/notifications/flash.ts +0 -71
- package/src/notifications/index.ts +0 -45
- package/src/notifications/registerBroadcastAuth.test.ts +0 -134
- package/src/notifications/registerBroadcastAuth.ts +0 -100
- package/src/notifications/resolveSavedNotification.test.ts +0 -82
- package/src/notifications/resolveSavedNotification.ts +0 -59
- package/src/notifications/types.ts +0 -93
- package/src/orm/m2mAccessor.ts +0 -66
- package/src/orm/modelDefaults.test.ts +0 -633
- package/src/orm/modelDefaults.ts +0 -666
- package/src/pageData/breadcrumbs.ts +0 -288
- package/src/pageData/forms.ts +0 -578
- package/src/pageData/helpers.ts +0 -857
- package/src/pageData/misc.ts +0 -347
- package/src/pageData/navigation.ts +0 -842
- package/src/pageData/relationPages.ts +0 -1248
- package/src/pageData/relationTabs.ts +0 -286
- package/src/pageData/resourcePages.ts +0 -609
- package/src/pageData.test.ts +0 -1545
- package/src/pageData.ts +0 -341
- package/src/plugins/index.ts +0 -8
- package/src/plugins/themeEditor.test.ts +0 -36
- package/src/plugins/themeEditor.ts +0 -45
- package/src/react/AppShell.tsx +0 -251
- package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
- package/src/react/CollabRoomContext.ts +0 -98
- package/src/react/CollabTextRendererRegistry.ts +0 -102
- package/src/react/CommandPalette.tsx +0 -375
- package/src/react/CurrentUserContext.tsx +0 -50
- package/src/react/CustomPageWrapperGate.tsx +0 -69
- package/src/react/CustomPageWrapperRegistry.ts +0 -45
- package/src/react/FieldFocusReporterRegistry.ts +0 -37
- package/src/react/FieldLabelSlotRegistry.ts +0 -30
- package/src/react/FieldPresenceRegistry.ts +0 -46
- package/src/react/FormCollabBindingRegistry.ts +0 -242
- package/src/react/FormStateContext.tsx +0 -591
- package/src/react/HeadHooks.tsx +0 -126
- package/src/react/MarkdownEditorRegistry.test.ts +0 -38
- package/src/react/MarkdownEditorRegistry.ts +0 -107
- package/src/react/NotificationActionStrip.tsx +0 -263
- package/src/react/NotificationBell.tsx +0 -426
- package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
- package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
- package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
- package/src/react/PendingSuggestionsContext.tsx +0 -172
- package/src/react/RecordWrapperGate.tsx +0 -58
- package/src/react/RecordWrapperRegistry.ts +0 -39
- package/src/react/RenderHookSlot.tsx +0 -32
- package/src/react/RightSidebar.tsx +0 -257
- package/src/react/RightSidebarContext.tsx +0 -234
- package/src/react/RightSidebarTrigger.tsx +0 -53
- package/src/react/RowCoordsContext.tsx +0 -23
- package/src/react/SchemaRenderer.tsx +0 -549
- package/src/react/SearchTrigger.tsx +0 -46
- package/src/react/ThemeProvider.tsx +0 -93
- package/src/react/ThemeSettingsPage.tsx +0 -579
- package/src/react/ThemeToggle.tsx +0 -20
- package/src/react/Toaster.tsx +0 -158
- package/src/react/UserMenu.tsx +0 -196
- package/src/react/WidgetDataContext.tsx +0 -157
- package/src/react/cells/EditableCell.tsx +0 -389
- package/src/react/component-slots.test.ts +0 -103
- package/src/react/component-slots.ts +0 -116
- package/src/react/fieldJsHandler.test.ts +0 -166
- package/src/react/fieldJsHandler.ts +0 -79
- package/src/react/fields/BuilderInput.tsx +0 -1078
- package/src/react/fields/CheckboxInput.tsx +0 -39
- package/src/react/fields/CheckboxListInput.tsx +0 -102
- package/src/react/fields/ColorInput.tsx +0 -71
- package/src/react/fields/DateFieldInput.tsx +0 -70
- package/src/react/fields/DateTimeInput.tsx +0 -62
- package/src/react/fields/FieldShell.tsx +0 -348
- package/src/react/fields/FileUploadInput.tsx +0 -639
- package/src/react/fields/HiddenInput.tsx +0 -17
- package/src/react/fields/KeyValueInput.tsx +0 -230
- package/src/react/fields/MarkdownInput.tsx +0 -560
- package/src/react/fields/RadioInput.tsx +0 -81
- package/src/react/fields/RepeaterInput.test.ts +0 -116
- package/src/react/fields/RepeaterInput.tsx +0 -1420
- package/src/react/fields/SelectFieldInput.tsx +0 -280
- package/src/react/fields/SliderInput.tsx +0 -81
- package/src/react/fields/TagsInput.tsx +0 -283
- package/src/react/fields/TextLikeInput.tsx +0 -256
- package/src/react/fields/ToggleButtonsInput.tsx +0 -60
- package/src/react/fields/ToggleFieldInput.tsx +0 -56
- package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
- package/src/react/fields/relationshipRenameDispatch.ts +0 -97
- package/src/react/fields/repeaterReconcile.test.ts +0 -114
- package/src/react/fields/repeaterReconcile.ts +0 -104
- package/src/react/fields/rowChromeButton.tsx +0 -336
- package/src/react/fields/rowState.ts +0 -106
- package/src/react/fields/syncRowGates.test.ts +0 -202
- package/src/react/fields/syncRowGates.ts +0 -66
- package/src/react/fields/textInputControls.tsx +0 -238
- package/src/react/fields/useRowReorderDnd.ts +0 -78
- package/src/react/formStateHelpers.test.ts +0 -508
- package/src/react/formStateHelpers.ts +0 -381
- package/src/react/hooks/use-mobile.ts +0 -19
- package/src/react/icon-context.tsx +0 -60
- package/src/react/index.ts +0 -194
- package/src/react/layouts/SidebarLayout.tsx +0 -250
- package/src/react/layouts/TopbarLayout.tsx +0 -258
- package/src/react/navigate.tsx +0 -37
- package/src/react/onProviderSynced.test.ts +0 -90
- package/src/react/parseRecordEditUrl.test.ts +0 -122
- package/src/react/parseRecordEditUrl.ts +0 -94
- package/src/react/persistedState.ts +0 -40
- package/src/react/registry.ts +0 -48
- package/src/react/right-panel-registry.tsx +0 -47
- package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
- package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
- package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
- package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
- package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
- package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
- package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
- package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
- package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
- package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
- package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
- package/src/react/schemaRenderer/action/buttons.tsx +0 -99
- package/src/react/schemaRenderer/action/helpers.ts +0 -140
- package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
- package/src/react/schemaRenderer/columnFormat.ts +0 -65
- package/src/react/schemaRenderer/constants.ts +0 -50
- package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
- package/src/react/schemaRenderer/form/renderField.tsx +0 -511
- package/src/react/schemaRenderer/helpers.tsx +0 -81
- package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
- package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
- package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
- package/src/react/schemaRenderer/table/filters.tsx +0 -1233
- package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
- package/src/react/schemaRenderer/table/links.tsx +0 -112
- package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
- package/src/react/schemaRenderer/table/url.tsx +0 -143
- package/src/react/theme-preview/apply.ts +0 -99
- package/src/react/theme-preview/build-html.ts +0 -436
- package/src/react/ui/button.tsx +0 -51
- package/src/react/ui/calendar.tsx +0 -67
- package/src/react/ui/checkbox.tsx +0 -29
- package/src/react/ui/dialog.tsx +0 -108
- package/src/react/ui/dropdown-menu.tsx +0 -97
- package/src/react/ui/input.tsx +0 -20
- package/src/react/ui/label.tsx +0 -21
- package/src/react/ui/popover.tsx +0 -50
- package/src/react/ui/select.tsx +0 -169
- package/src/react/ui/separator.tsx +0 -25
- package/src/react/ui/sheet.tsx +0 -136
- package/src/react/ui/sidebar.tsx +0 -723
- package/src/react/ui/skeleton.tsx +0 -13
- package/src/react/ui/slider.tsx +0 -34
- package/src/react/ui/switch.tsx +0 -28
- package/src/react/ui/table.tsx +0 -105
- package/src/react/ui/tabs.tsx +0 -63
- package/src/react/ui/textarea.tsx +0 -18
- package/src/react/ui/tooltip.tsx +0 -64
- package/src/react/useResizableWidth.ts +0 -139
- package/src/react/utils.ts +0 -6
- package/src/react/widgetRegistry.test.ts +0 -43
- package/src/react/widgetRegistry.ts +0 -50
- package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
- package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
- package/src/react/widgets/ViewRenderer.tsx +0 -71
- package/src/relationManagerData.test.ts +0 -1595
- package/src/richtext/index.ts +0 -8
- package/src/richtext/registry.ts +0 -89
- package/src/routes/globals.ts +0 -148
- package/src/routes/guard.test.ts +0 -325
- package/src/routes/helpers.ts +0 -704
- package/src/routes/pages.ts +0 -175
- package/src/routes/panel.ts +0 -204
- package/src/routes/relations.ts +0 -1243
- package/src/routes/resources.ts +0 -781
- package/src/routes/theme.ts +0 -91
- package/src/routes-nested-relations.test.ts +0 -676
- package/src/routes-relations.test.ts +0 -972
- package/src/routes.test.ts +0 -2027
- package/src/routes.ts +0 -303
- package/src/schema/Alert.test.ts +0 -109
- package/src/schema/Alert.ts +0 -131
- package/src/schema/Block.ts +0 -169
- package/src/schema/Breadcrumbs.ts +0 -40
- package/src/schema/Card.ts +0 -35
- package/src/schema/Divider.ts +0 -20
- package/src/schema/Element.ts +0 -219
- package/src/schema/EmptyState.test.ts +0 -37
- package/src/schema/EmptyState.ts +0 -63
- package/src/schema/Fieldset.ts +0 -43
- package/src/schema/Grid.ts +0 -43
- package/src/schema/Group.ts +0 -30
- package/src/schema/Heading.ts +0 -39
- package/src/schema/Html.ts +0 -67
- package/src/schema/Icon.ts +0 -54
- package/src/schema/Image.ts +0 -57
- package/src/schema/LinkTag.ts +0 -41
- package/src/schema/Markdown.ts +0 -85
- package/src/schema/MetaTag.ts +0 -41
- package/src/schema/RelationTabs.ts +0 -71
- package/src/schema/ScriptTag.ts +0 -55
- package/src/schema/Section.ts +0 -160
- package/src/schema/ServerDataElement.test.ts +0 -140
- package/src/schema/ServerDataElement.ts +0 -156
- package/src/schema/SlotComponent.test.ts +0 -77
- package/src/schema/SlotComponent.ts +0 -71
- package/src/schema/Split.ts +0 -50
- package/src/schema/Stat.test.ts +0 -118
- package/src/schema/Stat.ts +0 -154
- package/src/schema/StatsOverview.test.ts +0 -141
- package/src/schema/StatsOverview.ts +0 -119
- package/src/schema/StyleTag.ts +0 -35
- package/src/schema/TableWidget.test.ts +0 -297
- package/src/schema/TableWidget.ts +0 -289
- package/src/schema/Tabs.ts +0 -79
- package/src/schema/Text.ts +0 -58
- package/src/schema/UnorderedList.ts +0 -49
- package/src/schema/View.test.ts +0 -111
- package/src/schema/View.ts +0 -127
- package/src/schema/Wizard.ts +0 -220
- package/src/schema/containers.test.ts +0 -564
- package/src/schema/headTags.test.ts +0 -134
- package/src/schema/index.ts +0 -40
- package/src/schema/primes.test.ts +0 -269
- package/src/schema/resolveSchema.test.ts +0 -379
- package/src/schema/resolveSchema.ts +0 -917
- package/src/schema/sanitize.ts +0 -58
- package/src/search.test.ts +0 -446
- package/src/search.ts +0 -178
- package/src/sessionFilters.test.ts +0 -375
- package/src/sessionFilters.ts +0 -143
- package/src/slot-components/index.ts +0 -10
- package/src/slot-components/registry.ts +0 -56
- package/src/styles/file-upload.css +0 -13
- package/src/summarizers/Summarizer.test.ts +0 -84
- package/src/summarizers/Summarizer.ts +0 -123
- package/src/summarizers/index.ts +0 -11
- package/src/theme/base-colors.ts +0 -68
- package/src/theme/chart-colors.ts +0 -50
- package/src/theme/colors.ts +0 -447
- package/src/theme/generate-css.test.ts +0 -139
- package/src/theme/generate-css.ts +0 -44
- package/src/theme/generate-scale.test.ts +0 -106
- package/src/theme/generate-scale.ts +0 -97
- package/src/theme/icon-map.ts +0 -42
- package/src/theme/index.ts +0 -34
- package/src/theme/migrate.test.ts +0 -178
- package/src/theme/migrate.ts +0 -81
- package/src/theme/presets.ts +0 -135
- package/src/theme/radius.ts +0 -18
- package/src/theme/resolve.test.ts +0 -238
- package/src/theme/resolve.ts +0 -96
- package/src/theme/spacing.ts +0 -18
- package/src/theme/storage.test.ts +0 -126
- package/src/theme/storage.ts +0 -106
- package/src/theme/theme-colors.ts +0 -88
- package/src/theme/types.ts +0 -125
- package/src/uploads/UploadAdapter.ts +0 -35
- package/src/uploads/index.ts +0 -2
- package/src/uploads/localUpload.test.ts +0 -70
- package/src/uploads/localUpload.ts +0 -84
- package/src/validation/Validator.ts +0 -49
- package/src/validation/index.ts +0 -28
- package/src/validation/rules.ts +0 -78
- package/src/validation/runValidators.ts +0 -435
- package/src/validation/uniqueValidator.test.ts +0 -196
- package/src/validation/uniqueValidator.ts +0 -133
- package/src/validation/validators.test.ts +0 -268
- package/src/vite.test.ts +0 -184
- package/src/vite.ts +0 -787
- package/src/widgets/index.ts +0 -10
- package/src/widgets/registry.ts +0 -45
- package/src/widgets.test.ts +0 -592
- package/tsconfig.build.json +0 -11
- package/tsconfig.json +0 -4
- package/tsconfig.test.json +0 -10
- package/views/react/Dashboard.tsx +0 -27
- package/views/react/Resources/Form.tsx +0 -102
- package/views/react/Resources/Index.tsx +0 -49
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { IconColumn } from './IconColumn.js'
|
|
5
|
-
|
|
6
|
-
describe('IconColumn', () => {
|
|
7
|
-
it('emits columnType:icon with the value→{icon,color} map', () => {
|
|
8
|
-
const meta = IconColumn.make('isAdmin')
|
|
9
|
-
.options({
|
|
10
|
-
true: { icon: 'shield-check', color: 'success' },
|
|
11
|
-
false: { icon: 'user', color: 'muted' },
|
|
12
|
-
})
|
|
13
|
-
.toMeta()
|
|
14
|
-
assert.equal(meta.columnType, 'icon')
|
|
15
|
-
assert.deepEqual(meta.iconOptions, {
|
|
16
|
-
true: { icon: 'shield-check', color: 'success' },
|
|
17
|
-
false: { icon: 'user', color: 'muted' },
|
|
18
|
-
})
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('omits iconOptions when no map is set', () => {
|
|
22
|
-
const meta = IconColumn.make('flag').toMeta()
|
|
23
|
-
assert.equal(meta.columnType, 'icon')
|
|
24
|
-
assert.equal(meta.iconOptions, undefined)
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('color-less options round-trip', () => {
|
|
28
|
-
const meta = IconColumn.make('icon')
|
|
29
|
-
.options({ a: { icon: 'check' } })
|
|
30
|
-
.toMeta()
|
|
31
|
-
assert.equal(meta.iconOptions?.['a']?.icon, 'check')
|
|
32
|
-
assert.equal(meta.iconOptions?.['a']?.color, undefined)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('successive .options() calls merge', () => {
|
|
36
|
-
const meta = IconColumn.make('priority')
|
|
37
|
-
.options({ high: { icon: 'arrow-up' } })
|
|
38
|
-
.options({ low: { icon: 'arrow-down' } })
|
|
39
|
-
.toMeta()
|
|
40
|
-
assert.deepEqual(meta.iconOptions, {
|
|
41
|
-
high: { icon: 'arrow-up' },
|
|
42
|
-
low: { icon: 'arrow-down' },
|
|
43
|
-
})
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('inherits the base alignment / tooltip chain', () => {
|
|
47
|
-
const meta = IconColumn.make('status')
|
|
48
|
-
.alignment('center')
|
|
49
|
-
.tooltip('Status flag')
|
|
50
|
-
.toMeta()
|
|
51
|
-
assert.equal(meta.alignment, 'center')
|
|
52
|
-
assert.equal(meta.tooltip, 'Status flag')
|
|
53
|
-
})
|
|
54
|
-
})
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Column, type ColumnMeta, type ColumnColor } from '../Column.js'
|
|
2
|
-
|
|
3
|
-
/** Per-value rendering option for an IconColumn cell. */
|
|
4
|
-
export interface IconOption {
|
|
5
|
-
icon: string
|
|
6
|
-
color?: ColumnColor | string
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Renders the cell as a small icon. Use a value-to-icon map to vary the
|
|
11
|
-
* icon by raw cell value (e.g. status string, boolean, numeric flag).
|
|
12
|
-
*
|
|
13
|
-
* IconColumn.make('isAdmin').options({
|
|
14
|
-
* true: { icon: 'shield-check', color: 'success' },
|
|
15
|
-
* false: { icon: 'user', color: 'muted' },
|
|
16
|
-
* })
|
|
17
|
-
*/
|
|
18
|
-
export class IconColumn extends Column {
|
|
19
|
-
protected _options: Record<string, IconOption> = {}
|
|
20
|
-
|
|
21
|
-
static override make(name: string): IconColumn {
|
|
22
|
-
const c = new IconColumn(name)
|
|
23
|
-
c.setColumnType('icon')
|
|
24
|
-
return c
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
options(map: Record<string, IconOption>): this {
|
|
28
|
-
this._options = { ...this._options, ...map }
|
|
29
|
-
return this
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
protected override serializeExtras(meta: ColumnMeta): void {
|
|
33
|
-
if (Object.keys(this._options).length > 0) {
|
|
34
|
-
meta.iconOptions = this._options
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { ImageColumn } from './ImageColumn.js'
|
|
5
|
-
|
|
6
|
-
describe('ImageColumn', () => {
|
|
7
|
-
it('emits columnType:image with size and shape', () => {
|
|
8
|
-
const meta = ImageColumn.make('avatar').size(48).circular().toMeta()
|
|
9
|
-
assert.equal(meta.columnType, 'image')
|
|
10
|
-
assert.equal(meta.imageSize, 48)
|
|
11
|
-
assert.equal(meta.imageShape, 'circle')
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('defaults to 32px square', () => {
|
|
15
|
-
const meta = ImageColumn.make('avatar').toMeta()
|
|
16
|
-
assert.equal(meta.imageSize, 32)
|
|
17
|
-
assert.equal(meta.imageShape, 'square')
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
it('square() flips back from circular()', () => {
|
|
21
|
-
const meta = ImageColumn.make('avatar').circular().square().toMeta()
|
|
22
|
-
assert.equal(meta.imageShape, 'square')
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('inherits the alignment / tooltip / width chain', () => {
|
|
26
|
-
const meta = ImageColumn.make('avatar')
|
|
27
|
-
.alignment('center')
|
|
28
|
-
.tooltip('Profile picture')
|
|
29
|
-
.width('80px')
|
|
30
|
-
.toMeta()
|
|
31
|
-
assert.equal(meta.alignment, 'center')
|
|
32
|
-
assert.equal(meta.tooltip, 'Profile picture')
|
|
33
|
-
assert.equal(meta.width, '80px')
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('size(64).circular() round-trips', () => {
|
|
37
|
-
const meta = ImageColumn.make('avatar').size(64).circular().toMeta()
|
|
38
|
-
assert.equal(meta.imageSize, 64)
|
|
39
|
-
assert.equal(meta.imageShape, 'circle')
|
|
40
|
-
})
|
|
41
|
-
})
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Column, type ColumnMeta } from '../Column.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Renders the cell value as an image (avatar / thumbnail). The cell
|
|
5
|
-
* value should be a URL string. Defaults to a 32px square; use
|
|
6
|
-
* `.size(n)` and `.circular()` / `.square()` to tweak.
|
|
7
|
-
*/
|
|
8
|
-
export class ImageColumn extends Column {
|
|
9
|
-
protected _size = 32
|
|
10
|
-
protected _shape: 'square' | 'circle' = 'square'
|
|
11
|
-
|
|
12
|
-
static override make(name: string): ImageColumn {
|
|
13
|
-
const c = new ImageColumn(name)
|
|
14
|
-
c.setColumnType('image')
|
|
15
|
-
return c
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Width = height in px. Default 32. */
|
|
19
|
-
size(px: number): this { this._size = px; return this }
|
|
20
|
-
|
|
21
|
-
circular(): this { this._shape = 'circle'; return this }
|
|
22
|
-
square(): this { this._shape = 'square'; return this }
|
|
23
|
-
|
|
24
|
-
protected override serializeExtras(meta: ColumnMeta): void {
|
|
25
|
-
meta.imageSize = this._size
|
|
26
|
-
meta.imageShape = this._shape
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { Column, type ColumnMeta, type ColumnSelectOption } from '../Column.js'
|
|
2
|
-
|
|
3
|
-
/** Accepted shapes for `SelectColumn.options(...)`. The map form
|
|
4
|
-
* (`{ draft: 'Draft' }`) is convenience sugar for the array form. */
|
|
5
|
-
export type SelectColumnOptionsInput =
|
|
6
|
-
| Record<string, string>
|
|
7
|
-
| Array<ColumnSelectOption>
|
|
8
|
-
|
|
9
|
-
/** Per-row resolver — runs once per visible row at table-data time and
|
|
10
|
-
* stamps the resolved options on the row under `_cellSelectOptions[col]`
|
|
11
|
-
* so the inline `<select>` shows row-specific values (e.g. assignee
|
|
12
|
-
* candidates filtered by record team). May return a Promise. */
|
|
13
|
-
export type SelectColumnOptionsResolver =
|
|
14
|
-
(record: unknown) => SelectColumnOptionsInput | Promise<SelectColumnOptionsInput>
|
|
15
|
-
|
|
16
|
-
/** Normalize either input shape to the canonical array form. Shared
|
|
17
|
-
* between the static `.options()` setter and the per-row resolver path
|
|
18
|
-
* inside `dispatchTable.ts`. */
|
|
19
|
-
export function normalizeSelectOptions(opts: SelectColumnOptionsInput): ColumnSelectOption[] {
|
|
20
|
-
return Array.isArray(opts)
|
|
21
|
-
? opts.map(o => ({ value: o.value, label: o.label }))
|
|
22
|
-
: Object.entries(opts).map(([value, label]) => ({ value, label }))
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Inline-edit select. Renders a `<select>` in the cell; each change
|
|
27
|
-
* fires an immediate PATCH.
|
|
28
|
-
*
|
|
29
|
-
* SelectColumn.make('status')
|
|
30
|
-
* .options({ draft: 'Draft', published: 'Published', archived: 'Archived' })
|
|
31
|
-
* .nullable()
|
|
32
|
-
*
|
|
33
|
-
* Pair with `Column.disabled(record => …)` for per-row gating
|
|
34
|
-
* (e.g. forbid changing status once archived).
|
|
35
|
-
*
|
|
36
|
-
* Per-row options resolve via `.options(record => …)`:
|
|
37
|
-
*
|
|
38
|
-
* SelectColumn.make('assigneeId')
|
|
39
|
-
* .options(async (row) => {
|
|
40
|
-
* const team = await Team.find(row.teamId)
|
|
41
|
-
* return team.members.map(m => ({ value: String(m.id), label: m.name }))
|
|
42
|
-
* })
|
|
43
|
-
*
|
|
44
|
-
* The resolver runs once per visible row in `loadTableRecords` and
|
|
45
|
-
* stamps the resolved option list on `row._cellSelectOptions[col.name]`.
|
|
46
|
-
* Failed resolvers stay silent — the cell falls back to whatever was
|
|
47
|
-
* passed as a static `.options(...)` (or an empty list) so a single bad
|
|
48
|
-
* row doesn't break the whole table.
|
|
49
|
-
*/
|
|
50
|
-
export class SelectColumn extends Column {
|
|
51
|
-
protected _options: ColumnSelectOption[] = []
|
|
52
|
-
protected _optionsResolver?: SelectColumnOptionsResolver
|
|
53
|
-
protected _nullable = false
|
|
54
|
-
protected _selectablePlaceholder = true
|
|
55
|
-
|
|
56
|
-
static override make(name: string): SelectColumn {
|
|
57
|
-
const c = new SelectColumn(name)
|
|
58
|
-
c.setColumnType('select')
|
|
59
|
-
return c
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** Static options OR a per-row resolver. Function form receives the
|
|
63
|
-
* raw record and may return a Promise — runs once per row in
|
|
64
|
-
* `loadTableRecords`. Re-calling replaces the previous set; mixing
|
|
65
|
-
* static + resolver replaces both because the renderer reads the
|
|
66
|
-
* per-row stamp first and falls back to the static list. */
|
|
67
|
-
options(opts: SelectColumnOptionsInput | SelectColumnOptionsResolver): this {
|
|
68
|
-
if (typeof opts === 'function') {
|
|
69
|
-
this._optionsResolver = opts
|
|
70
|
-
this._options = []
|
|
71
|
-
} else {
|
|
72
|
-
this._options = normalizeSelectOptions(opts)
|
|
73
|
-
delete this._optionsResolver
|
|
74
|
-
}
|
|
75
|
-
return this
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** Add an explicit "—" option that maps to `null`. Without this a
|
|
79
|
-
* required column has no way to clear the value through the inline
|
|
80
|
-
* control. */
|
|
81
|
-
nullable(v = true): this { this._nullable = v; return this }
|
|
82
|
-
|
|
83
|
-
/** Hide the placeholder option (the leading "Select…" entry) once a
|
|
84
|
-
* value is set. Default: keep showing it so users can clear or
|
|
85
|
-
* reselect. Filament parity. */
|
|
86
|
-
selectablePlaceholder(v = true): this { this._selectablePlaceholder = v; return this }
|
|
87
|
-
|
|
88
|
-
getOptions(): ReadonlyArray<ColumnSelectOption> { return this._options }
|
|
89
|
-
getOptionsResolver(): SelectColumnOptionsResolver | undefined { return this._optionsResolver }
|
|
90
|
-
|
|
91
|
-
protected override serializeExtras(meta: ColumnMeta): void {
|
|
92
|
-
// The static list still serializes when set so the renderer has a
|
|
93
|
-
// fallback if the per-row resolver throws or stamps no options.
|
|
94
|
-
if (this._options.length > 0) meta.selectOptions = this._options.slice()
|
|
95
|
-
if (this._nullable) meta.selectNullable = true
|
|
96
|
-
if (!this._selectablePlaceholder) meta.selectablePlaceholder = false
|
|
97
|
-
}
|
|
98
|
-
}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { TextColumn } from './TextColumn.js'
|
|
5
|
-
import { Column } from '../Column.js'
|
|
6
|
-
|
|
7
|
-
describe('TextColumn', () => {
|
|
8
|
-
it('toMeta omits columnType (text is the default)', () => {
|
|
9
|
-
const meta = TextColumn.make('title').toMeta()
|
|
10
|
-
assert.equal(meta.type, 'column')
|
|
11
|
-
assert.equal(meta.name, 'title')
|
|
12
|
-
// 'text' is the default columnType — kept off the wire to keep meta tidy.
|
|
13
|
-
assert.equal(meta.columnType, undefined)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
it('inherits the full base-column chain', () => {
|
|
17
|
-
const meta = TextColumn.make('a')
|
|
18
|
-
.label('A')
|
|
19
|
-
.sortable()
|
|
20
|
-
.searchable()
|
|
21
|
-
.alignment('end')
|
|
22
|
-
.width('120px')
|
|
23
|
-
.default('—')
|
|
24
|
-
.tooltip('Help')
|
|
25
|
-
.wrap()
|
|
26
|
-
.lineClamp(2)
|
|
27
|
-
.weight('semibold')
|
|
28
|
-
.color('muted')
|
|
29
|
-
.toMeta()
|
|
30
|
-
assert.equal(meta.label, 'A')
|
|
31
|
-
assert.equal(meta.sortable, true)
|
|
32
|
-
assert.equal(meta.alignment, 'end')
|
|
33
|
-
assert.equal(meta.width, '120px')
|
|
34
|
-
assert.equal(meta.default, '—')
|
|
35
|
-
assert.equal(meta.tooltip, 'Help')
|
|
36
|
-
assert.equal(meta.wrap, true)
|
|
37
|
-
assert.equal(meta.lineClamp, 2)
|
|
38
|
-
assert.equal(meta.weight, 'semibold')
|
|
39
|
-
assert.equal(meta.color, 'muted')
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
describe('built-in formatters', () => {
|
|
43
|
-
it('dateTime() emits format spec', () => {
|
|
44
|
-
const meta = TextColumn.make('publishedAt').dateTime().toMeta()
|
|
45
|
-
assert.deepEqual(meta.format, { kind: 'dateTime' })
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('dateTime("PPpp") carries the pattern', () => {
|
|
49
|
-
const meta = TextColumn.make('publishedAt').dateTime('PPpp').toMeta()
|
|
50
|
-
assert.deepEqual(meta.format, { kind: 'dateTime', pattern: 'PPpp' })
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('since() emits kind:since', () => {
|
|
54
|
-
const meta = TextColumn.make('createdAt').since().toMeta()
|
|
55
|
-
assert.deepEqual(meta.format, { kind: 'since' })
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('money(currency) emits kind:money + currency', () => {
|
|
59
|
-
const meta = TextColumn.make('price').money('USD').toMeta()
|
|
60
|
-
assert.deepEqual(meta.format, { kind: 'money', currency: 'USD' })
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('money(currency, locale) carries the locale', () => {
|
|
64
|
-
const meta = TextColumn.make('price').money('EUR', 'de-DE').toMeta()
|
|
65
|
-
assert.deepEqual(meta.format, { kind: 'money', currency: 'EUR', locale: 'de-DE' })
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('numeric() with no opts emits bare kind:numeric', () => {
|
|
69
|
-
const meta = TextColumn.make('count').numeric().toMeta()
|
|
70
|
-
assert.deepEqual(meta.format, { kind: 'numeric' })
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('numeric({ decimals }) carries decimals', () => {
|
|
74
|
-
const meta = TextColumn.make('count').numeric({ decimals: 2 }).toMeta()
|
|
75
|
-
assert.deepEqual(meta.format, { kind: 'numeric', decimals: 2 })
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('limit(n) emits kind:limit + chars', () => {
|
|
79
|
-
const meta = TextColumn.make('body').limit(40).toMeta()
|
|
80
|
-
assert.deepEqual(meta.format, { kind: 'limit', chars: 40 })
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('words(n) emits kind:words + words', () => {
|
|
84
|
-
const meta = TextColumn.make('body').words(20).toMeta()
|
|
85
|
-
assert.deepEqual(meta.format, { kind: 'words', words: 20 })
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
it('characters(n) is a Filament-parity alias for limit(n)', () => {
|
|
89
|
-
const a = TextColumn.make('body').characters(40).toMeta()
|
|
90
|
-
const b = TextColumn.make('body').limit(40).toMeta()
|
|
91
|
-
assert.deepEqual(a.format, b.format)
|
|
92
|
-
assert.deepEqual(a.format, { kind: 'limit', chars: 40 })
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('formatters overwrite each other — last call wins', () => {
|
|
96
|
-
const meta = TextColumn.make('body').words(10).limit(40).toMeta()
|
|
97
|
-
assert.deepEqual(meta.format, { kind: 'limit', chars: 40 })
|
|
98
|
-
})
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
describe('rich-display chrome', () => {
|
|
102
|
-
it('listWithLineBreaks() emits flag only when called', () => {
|
|
103
|
-
const off = TextColumn.make('tags').toMeta()
|
|
104
|
-
const on = TextColumn.make('tags').listWithLineBreaks().toMeta()
|
|
105
|
-
assert.equal(off['listWithLineBreaks'], undefined)
|
|
106
|
-
assert.equal(on['listWithLineBreaks'], true)
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('bulleted() emits flag only when called', () => {
|
|
110
|
-
const off = TextColumn.make('tags').toMeta()
|
|
111
|
-
const on = TextColumn.make('tags').bulleted().toMeta()
|
|
112
|
-
assert.equal(off['bulleted'], undefined)
|
|
113
|
-
assert.equal(on['bulleted'], true)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('copyMessage() defaults to "Copied!"', () => {
|
|
117
|
-
const meta = TextColumn.make('email').copyMessage().toMeta()
|
|
118
|
-
assert.equal(meta['copyMessage'], 'Copied!')
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('copyMessage(s) honors the custom toast string', () => {
|
|
122
|
-
const meta = TextColumn.make('email').copyMessage('Email copied').toMeta()
|
|
123
|
-
assert.equal(meta['copyMessage'], 'Email copied')
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
it('chrome flags compose with each other and with format()', () => {
|
|
127
|
-
const meta = TextColumn.make('bio')
|
|
128
|
-
.words(20)
|
|
129
|
-
.listWithLineBreaks()
|
|
130
|
-
.bulleted()
|
|
131
|
-
.copyMessage('Done')
|
|
132
|
-
.toMeta()
|
|
133
|
-
assert.deepEqual(meta.format, { kind: 'words', words: 20 })
|
|
134
|
-
assert.equal(meta['listWithLineBreaks'], true)
|
|
135
|
-
assert.equal(meta['bulleted'], true)
|
|
136
|
-
assert.equal(meta['copyMessage'], 'Done')
|
|
137
|
-
})
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
describe('markdown / html', () => {
|
|
141
|
-
it('markdown() stamps richText: "markdown"', () => {
|
|
142
|
-
const meta = TextColumn.make('body').markdown().toMeta()
|
|
143
|
-
assert.equal(meta['richText'], 'markdown')
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
it('html() stamps richText: "html"', () => {
|
|
147
|
-
const meta = TextColumn.make('body').html().toMeta()
|
|
148
|
-
assert.equal(meta['richText'], 'html')
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
it('html() and markdown() are mutually exclusive — last call wins', () => {
|
|
152
|
-
const a = TextColumn.make('body').markdown().html().toMeta()
|
|
153
|
-
const b = TextColumn.make('body').html().markdown().toMeta()
|
|
154
|
-
assert.equal(a['richText'], 'html')
|
|
155
|
-
assert.equal(b['richText'], 'markdown')
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
it('markdown(false) clears the flag', () => {
|
|
159
|
-
const col = TextColumn.make('body').markdown()
|
|
160
|
-
assert.equal(col.isRichText(), true)
|
|
161
|
-
col.markdown(false)
|
|
162
|
-
assert.equal(col.isRichText(), false)
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
it('allowRaw() sets sanitize to false', () => {
|
|
166
|
-
const col = TextColumn.make('body').markdown().allowRaw()
|
|
167
|
-
assert.equal(col.getSanitize(), false)
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
it('sanitize(opts) carries the widened config through the accessor', () => {
|
|
171
|
-
const col = TextColumn.make('body').html().sanitize({ allowedTags: ['span'] })
|
|
172
|
-
assert.deepEqual(col.getSanitize(), { allowedTags: ['span'] })
|
|
173
|
-
})
|
|
174
|
-
})
|
|
175
|
-
|
|
176
|
-
it('formatStateUsing stamps hasFormatter:true on the meta', () => {
|
|
177
|
-
const col = TextColumn.make('priority').formatStateUsing((v) => `★ ${v}`)
|
|
178
|
-
const meta = col.toMeta()
|
|
179
|
-
assert.equal(meta.hasFormatter, true)
|
|
180
|
-
assert.equal(col.hasFormatter(), true)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
it('Column.make and TextColumn.make produce equivalent meta', () => {
|
|
184
|
-
// Plan §44: `Column.make()` is an alias for `TextColumn.make()`. The
|
|
185
|
-
// wire shape must stay identical so existing code keeps working.
|
|
186
|
-
const a = Column.make('title').label('Title').sortable().toMeta()
|
|
187
|
-
const b = TextColumn.make('title').label('Title').sortable().toMeta()
|
|
188
|
-
assert.deepEqual(a, b)
|
|
189
|
-
})
|
|
190
|
-
})
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Column } from '../Column.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The standard text column. Renders cell values as plain text and exposes
|
|
5
|
-
* the full chain of built-in formatters (`dateTime / since / money /
|
|
6
|
-
* numeric / limit`) plus typography setters (`weight / color`) inherited
|
|
7
|
-
* from `Column`.
|
|
8
|
-
*
|
|
9
|
-
* `TextColumn.make('name')` and `Column.make('name')` are equivalent —
|
|
10
|
-
* the base `Column` defaults `columnType = 'text'`, so the bare factory
|
|
11
|
-
* keeps working unchanged. `TextColumn.make` exists for symmetry with
|
|
12
|
-
* the other column subclasses (`BadgeColumn / IconColumn / BooleanColumn /
|
|
13
|
-
* ImageColumn`) so callers reading a list page can spot the column kind
|
|
14
|
-
* at a glance.
|
|
15
|
-
*/
|
|
16
|
-
export class TextColumn extends Column {
|
|
17
|
-
static override make(name: string): TextColumn {
|
|
18
|
-
return new TextColumn(name)
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Column, type ColumnMeta } from '../Column.js'
|
|
2
|
-
|
|
3
|
-
/** HTML `<input type=…>` discriminator for `TextInputColumn`. Mirrors
|
|
4
|
-
* the subset of types we coerce server-side; richer types (date, color,
|
|
5
|
-
* file) belong to dedicated columns or stay form-only. */
|
|
6
|
-
export type TextInputColumnType = 'text' | 'number' | 'email' | 'url' | 'tel'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Inline-edit text input. Renders an `<input>` directly in the cell;
|
|
10
|
-
* commits via debounced PATCH on typing + immediate PATCH on blur.
|
|
11
|
-
*
|
|
12
|
-
* TextInputColumn.make('title')
|
|
13
|
-
* .placeholder('Untitled')
|
|
14
|
-
* .validate([required(), minLength(3)])
|
|
15
|
-
* .debounce(750)
|
|
16
|
-
*
|
|
17
|
-
* Numeric variant:
|
|
18
|
-
*
|
|
19
|
-
* TextInputColumn.make('price').type('number').step(0.01).min(0)
|
|
20
|
-
*/
|
|
21
|
-
export class TextInputColumn extends Column {
|
|
22
|
-
protected _inputType: TextInputColumnType = 'text'
|
|
23
|
-
protected _inputPlaceholder?: string
|
|
24
|
-
protected _step?: number
|
|
25
|
-
protected _min?: number
|
|
26
|
-
protected _max?: number
|
|
27
|
-
protected _debounceMs?: number
|
|
28
|
-
|
|
29
|
-
static override make(name: string): TextInputColumn {
|
|
30
|
-
const c = new TextInputColumn(name)
|
|
31
|
-
c.setColumnType('textInput')
|
|
32
|
-
return c
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Map to `<input type=…>`. Default `'text'`. `'number'` parses to
|
|
36
|
-
* a JS number server-side; the rest stay strings. */
|
|
37
|
-
type(t: TextInputColumnType): this { this._inputType = t; return this }
|
|
38
|
-
|
|
39
|
-
/** Input placeholder (the text shown when the input is empty). NOT
|
|
40
|
-
* the same as `Column.placeholder()` / `default()`, which is the
|
|
41
|
-
* empty-cell fallback for read-only formatters. */
|
|
42
|
-
placeholder(p: string): this { this._inputPlaceholder = p; return this }
|
|
43
|
-
|
|
44
|
-
/** Numeric `<input step=…>`. */
|
|
45
|
-
step(n: number): this { this._step = n; return this }
|
|
46
|
-
|
|
47
|
-
/** Numeric `<input min=…>`. */
|
|
48
|
-
min(n: number): this { this._min = n; return this }
|
|
49
|
-
|
|
50
|
-
/** Numeric `<input max=…>`. */
|
|
51
|
-
max(n: number): this { this._max = n; return this }
|
|
52
|
-
|
|
53
|
-
/** Override the renderer's default debounce. Time between the last
|
|
54
|
-
* keystroke and the PATCH fire (ms). Blur always commits immediately
|
|
55
|
-
* regardless. */
|
|
56
|
-
debounce(ms: number): this { this._debounceMs = ms; return this }
|
|
57
|
-
|
|
58
|
-
getInputType(): TextInputColumnType { return this._inputType }
|
|
59
|
-
|
|
60
|
-
protected override serializeExtras(meta: ColumnMeta): void {
|
|
61
|
-
if (this._inputType !== 'text') meta.inputType = this._inputType
|
|
62
|
-
if (this._inputPlaceholder !== undefined) meta.inputPlaceholder = this._inputPlaceholder
|
|
63
|
-
if (this._step !== undefined) meta.inputStep = this._step
|
|
64
|
-
if (this._min !== undefined) meta.inputMin = this._min
|
|
65
|
-
if (this._max !== undefined) meta.inputMax = this._max
|
|
66
|
-
if (this._debounceMs !== undefined) meta.debounceMs = this._debounceMs
|
|
67
|
-
}
|
|
68
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Column, type ColumnMeta, type ColumnColor } from '../Column.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Inline-edit boolean toggle. Renders a Switch in the cell; each click
|
|
5
|
-
* fires an immediate PATCH (no debounce). Falsy values render off,
|
|
6
|
-
* truthy on — strings like `'true'` / `'1'` from URL-encoded bodies are
|
|
7
|
-
* normalized by the route handler.
|
|
8
|
-
*
|
|
9
|
-
* ToggleColumn.make('featured')
|
|
10
|
-
* .onColor('success')
|
|
11
|
-
* .onIcon('star').offIcon('star-off')
|
|
12
|
-
*
|
|
13
|
-
* Pair with `Column.disabled(record => …)` for per-row gating
|
|
14
|
-
* (e.g. forbid toggling on archived rows).
|
|
15
|
-
*/
|
|
16
|
-
export class ToggleColumn extends Column {
|
|
17
|
-
protected _onColor?: ColumnColor
|
|
18
|
-
protected _offColor?: ColumnColor
|
|
19
|
-
protected _onIcon?: string
|
|
20
|
-
protected _offIcon?: string
|
|
21
|
-
|
|
22
|
-
static override make(name: string): ToggleColumn {
|
|
23
|
-
const c = new ToggleColumn(name)
|
|
24
|
-
c.setColumnType('toggle')
|
|
25
|
-
return c
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Color preset applied to the switch when on. Defaults to `'primary'`
|
|
29
|
-
* (renderer-side fallback) so users can opt into success / warning. */
|
|
30
|
-
onColor(c: ColumnColor): this { this._onColor = c; return this }
|
|
31
|
-
|
|
32
|
-
/** Color preset applied to the switch when off. Defaults to `'muted'`. */
|
|
33
|
-
offColor(c: ColumnColor): this { this._offColor = c; return this }
|
|
34
|
-
|
|
35
|
-
/** Icon (registry name) shown on the on side. When set on either side
|
|
36
|
-
* the renderer flips into icon-button mode instead of native toggle. */
|
|
37
|
-
onIcon(name: string): this { this._onIcon = name; return this }
|
|
38
|
-
offIcon(name: string): this { this._offIcon = name; return this }
|
|
39
|
-
|
|
40
|
-
protected override serializeExtras(meta: ColumnMeta): void {
|
|
41
|
-
if (this._onColor !== undefined) meta.toggleOnColor = this._onColor
|
|
42
|
-
if (this._offColor !== undefined) meta.toggleOffColor = this._offColor
|
|
43
|
-
if (this._onIcon !== undefined) meta.toggleOnIcon = this._onIcon
|
|
44
|
-
if (this._offIcon !== undefined) meta.toggleOffIcon = this._offIcon
|
|
45
|
-
}
|
|
46
|
-
}
|