@wix/patterns 1.475.0 → 1.477.0
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/dist/cjs/components/CardContainer/CardContainer.st.css.js +2 -2
- package/dist/cjs/components/CardContainer/CardContainer.st.css.js.map +1 -1
- package/dist/cjs/components/CmsFieldManagement/CmsFieldForm.st.css.js +3 -3
- package/dist/cjs/components/CmsFieldManagement/CmsFieldForm.st.css.js.map +1 -1
- package/dist/cjs/components/CmsFieldManagement/CmsFieldModal.st.css.js +3 -3
- package/dist/cjs/components/CmsFieldManagement/CmsFieldModal.st.css.js.map +1 -1
- package/dist/cjs/components/CmsFieldManagement/Sections/ValidationAndDefaultsSection.st.css.js +3 -3
- package/dist/cjs/components/CmsFieldManagement/Sections/ValidationAndDefaultsSection.st.css.js.map +1 -1
- package/dist/cjs/components/Collapse/Collapse.st.css.js +3 -3
- package/dist/cjs/components/Collapse/Collapse.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionPageNew/CollectionPage.st.css.js +2 -2
- package/dist/cjs/components/CollectionPageNew/CollectionPage.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js +3 -3
- package/dist/cjs/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionTable/CollectionTable.st.css.js +2 -2
- package/dist/cjs/components/CollectionTable/CollectionTable.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionTable/CollectionTableWSRTable.st.css.js +2 -2
- package/dist/cjs/components/CollectionTable/CollectionTableWSRTable.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionToolbar/CollectionToolbar.st.css.js +5 -5
- package/dist/cjs/components/CollectionToolbar/CollectionToolbar.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionToolbar/SearchOrCustomFilter.st.css.js +4 -4
- package/dist/cjs/components/CollectionToolbar/SearchOrCustomFilter.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js +2 -2
- package/dist/cjs/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js.map +1 -1
- package/dist/cjs/components/CollectionViewsDropdown/ViewsDropdown.st.css.js +2 -2
- package/dist/cjs/components/CollectionViewsDropdown/ViewsDropdown.st.css.js.map +1 -1
- package/dist/cjs/components/DragHandle/DragHandle.st.css.js +2 -2
- package/dist/cjs/components/DragHandle/DragHandle.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/EditableCell.js +5 -4
- package/dist/cjs/components/EditableTable/EditableCell.js.map +1 -1
- package/dist/cjs/components/EditableTable/EditableCell.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/EditableCell.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/HeaderActionsPopover.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/HeaderActionsPopover.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/CellViewLayout.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/cellTypes/CellViewLayout.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/address/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/address/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/array/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/array/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/boolean/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/boolean/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/boolean/View.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/boolean/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/color/Edit.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/cellTypes/color/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/date/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/date/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/date/View.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/cellTypes/date/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/datetime/Edit.st.css.js +8 -8
- package/dist/cjs/components/EditableTable/cellTypes/datetime/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/datetime/View.js +9 -5
- package/dist/cjs/components/EditableTable/cellTypes/datetime/View.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/datetime/View.st.css.js +7 -7
- package/dist/cjs/components/EditableTable/cellTypes/datetime/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/email/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/email/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/email/View.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/cellTypes/email/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/number/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/number/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/number/View.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/number/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/object/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/object/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/object/View.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/cellTypes/object/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/select/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/select/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/text/Edit.st.css.js +4 -4
- package/dist/cjs/components/EditableTable/cellTypes/text/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/text/View.st.css.js +2 -2
- package/dist/cjs/components/EditableTable/cellTypes/text/View.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/time/Edit.st.css.js +4 -4
- package/dist/cjs/components/EditableTable/cellTypes/time/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/url/Edit.st.css.js +3 -3
- package/dist/cjs/components/EditableTable/cellTypes/url/Edit.st.css.js.map +1 -1
- package/dist/cjs/components/EditableTable/cellTypes/url/View.st.css.js +5 -5
- package/dist/cjs/components/EditableTable/cellTypes/url/View.st.css.js.map +1 -1
- package/dist/cjs/components/EmptyState/EmptyStateBase.st.css.js +2 -2
- package/dist/cjs/components/EmptyState/EmptyStateBase.st.css.js.map +1 -1
- package/dist/cjs/components/EntityPage/EntityPagePlain.st.css.js +2 -2
- package/dist/cjs/components/EntityPage/EntityPagePlain.st.css.js.map +1 -1
- package/dist/cjs/components/Fade/Fade.st.css.js +2 -2
- package/dist/cjs/components/Fade/Fade.st.css.js.map +1 -1
- package/dist/cjs/components/Heading/Heading.st.css.js +2 -2
- package/dist/cjs/components/Heading/Heading.st.css.js.map +1 -1
- package/dist/cjs/components/ImportButton/ImportStepUpload.st.css.js +3 -3
- package/dist/cjs/components/ImportButton/ImportStepUpload.st.css.js.map +1 -1
- package/dist/cjs/components/InputOverflow/InputOverflow.st.css.js +2 -2
- package/dist/cjs/components/InputOverflow/InputOverflow.st.css.js.map +1 -1
- package/dist/cjs/components/LoadingRow/LoadingRow.st.css.js +3 -3
- package/dist/cjs/components/LoadingRow/LoadingRow.st.css.js.map +1 -1
- package/dist/cjs/components/MaxHeightText/MaxHeightText.st.css.js +2 -2
- package/dist/cjs/components/MaxHeightText/MaxHeightText.st.css.js.map +1 -1
- package/dist/cjs/components/MaxLines/MaxLines.st.css.js +2 -2
- package/dist/cjs/components/MaxLines/MaxLines.st.css.js.map +1 -1
- package/dist/cjs/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js +5 -5
- package/dist/cjs/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js.map +1 -1
- package/dist/cjs/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js +2 -2
- package/dist/cjs/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js.map +1 -1
- package/dist/cjs/components/NestedTable/NestedTableRow.st.css.js +5 -5
- package/dist/cjs/components/NestedTable/NestedTableRow.st.css.js.map +1 -1
- package/dist/cjs/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js +2 -2
- package/dist/cjs/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js.map +1 -1
- package/dist/cjs/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js +2 -2
- package/dist/cjs/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js.map +1 -1
- package/dist/cjs/components/PickerContent/PickerContent.st.css.js +2 -2
- package/dist/cjs/components/PickerContent/PickerContent.st.css.js.map +1 -1
- package/dist/cjs/components/PickerContent/PickerContentAdditionalStep.st.css.js +4 -4
- package/dist/cjs/components/PickerContent/PickerContentAdditionalStep.st.css.js.map +1 -1
- package/dist/cjs/components/PickerTableListItem/PickerTableListItem.st.css.js +2 -2
- package/dist/cjs/components/PickerTableListItem/PickerTableListItem.st.css.js.map +1 -1
- package/dist/cjs/components/ScrollableContent/ScrollableContent.st.css.js +2 -2
- package/dist/cjs/components/ScrollableContent/ScrollableContent.st.css.js.map +1 -1
- package/dist/cjs/components/SetupWidget/SetupWidget.st.css.js +10 -10
- package/dist/cjs/components/SetupWidget/SetupWidget.st.css.js.map +1 -1
- package/dist/cjs/components/SkeletonCard/SkeletonCard.st.css.js +3 -3
- package/dist/cjs/components/SkeletonCard/SkeletonCard.st.css.js.map +1 -1
- package/dist/cjs/components/SlidingModal/SlidingModal.st.css.js +2 -2
- package/dist/cjs/components/SlidingModal/SlidingModal.st.css.js.map +1 -1
- package/dist/cjs/components/Table/AddFieldColumnHeader.st.css.js +6 -6
- package/dist/cjs/components/Table/AddFieldColumnHeader.st.css.js.map +1 -1
- package/dist/cjs/components/TabsFilter/TabsFilter.st.css.js +3 -3
- package/dist/cjs/components/TabsFilter/TabsFilter.st.css.js.map +1 -1
- package/dist/cjs/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js +2 -2
- package/dist/cjs/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js.map +1 -1
- package/dist/cjs/components/ToolbarItem/ToolbarItem.st.css.js +2 -2
- package/dist/cjs/components/ToolbarItem/ToolbarItem.st.css.js.map +1 -1
- package/dist/cjs/components/ToolbarItemBox/ToolbarItemBox.st.css.js +2 -2
- package/dist/cjs/components/ToolbarItemBox/ToolbarItemBox.st.css.js.map +1 -1
- package/dist/cjs/components/common.st.css.js +4 -4
- package/dist/cjs/components/common.st.css.js.map +1 -1
- package/dist/cjs/state/CollectionPage/CollectionPageHeader.st.css.js +2 -2
- package/dist/cjs/state/CollectionPage/CollectionPageHeader.st.css.js.map +1 -1
- package/dist/cjs/state/CollectionPage/TitleBadges.st.css.js +4 -4
- package/dist/cjs/state/CollectionPage/TitleBadges.st.css.js.map +1 -1
- package/dist/cjs/state/EntityPage/EntityPageState.js +2 -1
- package/dist/cjs/state/EntityPage/EntityPageState.js.map +1 -1
- package/dist/cjs/state/FormPage/FormPageHeader.st.css.js +2 -2
- package/dist/cjs/state/FormPage/FormPageHeader.st.css.js.map +1 -1
- package/dist/cjs/styles.global.css +2 -2
- package/dist/cjs/test-utils/index.js +6 -0
- package/dist/cjs/test-utils/index.js.map +1 -1
- package/dist/cjs/test-utils/scrollUntilRendered.js +45 -0
- package/dist/cjs/test-utils/scrollUntilRendered.js.map +1 -0
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/docs/Collection Toolkit.md +16 -1
- package/dist/docs/Collection to Entity Flow.md +8 -1
- package/dist/docs/Composition and Providers.md +16 -1
- package/dist/docs/CustomFieldType.md +10 -1
- package/dist/docs/ImportButton.md +5 -24
- package/dist/docs/Reading the Doc Indices.md +21 -0
- package/dist/docs/index.json +62 -6
- package/dist/docs/useSchemaSource.md +22 -82
- package/dist/dts-bundle/components/EditableTable.d.ts +551 -0
- package/dist/dts-bundle/components/EntityPageFieldsCard.d.ts +100 -0
- package/dist/dts-bundle/components/LayoutSwitch.d.ts +931 -0
- package/dist/dts-bundle/components/schema/EntityPage.d.ts +317 -0
- package/dist/dts-bundle/components/schema/Grid.d.ts +467 -0
- package/dist/dts-bundle/components/schema/Table.d.ts +360 -0
- package/dist/dts-bundle/exports/core.d.ts +1 -0
- package/dist/dts-bundle/exports/essentials.d.ts +0 -1
- package/dist/dts-bundle/exports/giza.d.ts +0 -1
- package/dist/dts-bundle/exports/index.d.ts +1 -2
- package/dist/dts-bundle/exports/schema.d.ts +14 -7
- package/dist/dts-bundle/functions/listCmsCollections.d.ts +12 -0
- package/dist/dts-bundle/hooks/schema/useCollection.d.ts +341 -0
- package/dist/dts-bundle/hooks/schema/useEntityPage.d.ts +244 -0
- package/dist/dts-bundle/hooks/schema/useGridCollection.d.ts +338 -0
- package/dist/dts-bundle/hooks/schema/useTableCollection.d.ts +338 -0
- package/dist/dts-bundle/hooks/useCmsSchemaSource.d.ts +439 -0
- package/dist/dts-bundle/hooks/useEditableTableCollection.d.ts +422 -0
- package/dist/dts-bundle/hooks/useLayoutSwitchCollection.d.ts +414 -0
- package/dist/dts-bundle/hooks/useSchemaSource.d.ts +59 -0
- package/dist/dts-bundle/index.json +328 -18
- package/dist/dts-bundle/index.txt +23 -2
- package/dist/dts-bundle/types/CellType.d.ts +839 -0
- package/dist/dts-bundle/types/CmsCollectionSummary.d.ts +9 -0
- package/dist/dts-bundle/types/EntityPageState.d.ts +1 -1
- package/dist/dts-bundle/types/SchemaSource.d.ts +8 -48
- package/dist/dts-bundle/types/SchemaSourceInput.d.ts +814 -0
- package/dist/dts-bundle/types/UseCmsSchemaSourceDeps.d.ts +919 -0
- package/dist/esm/components/CardContainer/CardContainer.st.css.js +2 -2
- package/dist/esm/components/CmsFieldManagement/CmsFieldForm.st.css.js +2 -2
- package/dist/esm/components/CmsFieldManagement/CmsFieldForm.st.css.js.map +1 -1
- package/dist/esm/components/CmsFieldManagement/CmsFieldModal.st.css.js +2 -2
- package/dist/esm/components/CmsFieldManagement/Sections/ValidationAndDefaultsSection.st.css.js +2 -2
- package/dist/esm/components/Collapse/Collapse.st.css.js +2 -2
- package/dist/esm/components/CollectionPageNew/CollectionPage.st.css.js +2 -2
- package/dist/esm/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js +2 -2
- package/dist/esm/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js.map +1 -1
- package/dist/esm/components/CollectionTable/CollectionTable.st.css.js +2 -2
- package/dist/esm/components/CollectionTable/CollectionTableWSRTable.st.css.js +2 -2
- package/dist/esm/components/CollectionTable/CollectionTableWSRTable.st.css.js.map +1 -1
- package/dist/esm/components/CollectionToolbar/CollectionToolbar.st.css.js +2 -2
- package/dist/esm/components/CollectionToolbar/SearchOrCustomFilter.st.css.js +2 -2
- package/dist/esm/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js +2 -2
- package/dist/esm/components/CollectionViewsDropdown/ViewsDropdown.st.css.js +2 -2
- package/dist/esm/components/DragHandle/DragHandle.st.css.js +2 -2
- package/dist/esm/components/EditableTable/EditableCell.js +1 -1
- package/dist/esm/components/EditableTable/EditableCell.js.map +1 -1
- package/dist/esm/components/EditableTable/EditableCell.st.css.js +2 -2
- package/dist/esm/components/EditableTable/EditableCell.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/HeaderActionsPopover.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/CellViewLayout.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/CellViewLayout.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/address/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/address/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/array/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/array/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/boolean/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/boolean/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/boolean/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/boolean/View.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/color/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/date/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/date/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/date/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/datetime/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/datetime/View.js +4 -1
- package/dist/esm/components/EditableTable/cellTypes/datetime/View.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/datetime/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/email/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/email/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/number/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/number/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/number/View.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/object/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/object/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/object/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/select/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/select/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/text/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/text/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/text/View.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/time/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/time/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/url/Edit.st.css.js +2 -2
- package/dist/esm/components/EditableTable/cellTypes/url/Edit.st.css.js.map +1 -1
- package/dist/esm/components/EditableTable/cellTypes/url/View.st.css.js +2 -2
- package/dist/esm/components/EmptyState/EmptyStateBase.st.css.js +2 -2
- package/dist/esm/components/EmptyState/EmptyStateBase.st.css.js.map +1 -1
- package/dist/esm/components/EntityPage/EntityPagePlain.st.css.js +2 -2
- package/dist/esm/components/Fade/Fade.st.css.js +2 -2
- package/dist/esm/components/Heading/Heading.st.css.js +2 -2
- package/dist/esm/components/Heading/Heading.st.css.js.map +1 -1
- package/dist/esm/components/ImportButton/ImportStepUpload.st.css.js +2 -2
- package/dist/esm/components/InputOverflow/InputOverflow.st.css.js +2 -2
- package/dist/esm/components/LoadingRow/LoadingRow.st.css.js +3 -3
- package/dist/esm/components/MaxHeightText/MaxHeightText.st.css.js +2 -2
- package/dist/esm/components/MaxHeightText/MaxHeightText.st.css.js.map +1 -1
- package/dist/esm/components/MaxLines/MaxLines.st.css.js +2 -2
- package/dist/esm/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js +2 -2
- package/dist/esm/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js.map +1 -1
- package/dist/esm/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js +2 -2
- package/dist/esm/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js.map +1 -1
- package/dist/esm/components/NestedTable/NestedTableRow.st.css.js +2 -2
- package/dist/esm/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js +2 -2
- package/dist/esm/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js +2 -2
- package/dist/esm/components/PickerContent/PickerContent.st.css.js +2 -2
- package/dist/esm/components/PickerContent/PickerContentAdditionalStep.st.css.js +2 -2
- package/dist/esm/components/PickerTableListItem/PickerTableListItem.st.css.js +2 -2
- package/dist/esm/components/ScrollableContent/ScrollableContent.st.css.js +2 -2
- package/dist/esm/components/ScrollableContent/ScrollableContent.st.css.js.map +1 -1
- package/dist/esm/components/SetupWidget/SetupWidget.st.css.js +2 -2
- package/dist/esm/components/SetupWidget/SetupWidget.st.css.js.map +1 -1
- package/dist/esm/components/SkeletonCard/SkeletonCard.st.css.js +2 -2
- package/dist/esm/components/SlidingModal/SlidingModal.st.css.js +2 -2
- package/dist/esm/components/Table/AddFieldColumnHeader.st.css.js +2 -2
- package/dist/esm/components/Table/AddFieldColumnHeader.st.css.js.map +1 -1
- package/dist/esm/components/TabsFilter/TabsFilter.st.css.js +2 -2
- package/dist/esm/components/TabsFilter/TabsFilter.st.css.js.map +1 -1
- package/dist/esm/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js +2 -2
- package/dist/esm/components/ToolbarItem/ToolbarItem.st.css.js +2 -2
- package/dist/esm/components/ToolbarItemBox/ToolbarItemBox.st.css.js +2 -2
- package/dist/esm/components/ToolbarItemBox/ToolbarItemBox.st.css.js.map +1 -1
- package/dist/esm/components/common.st.css.js +2 -2
- package/dist/esm/state/CollectionPage/CollectionPageHeader.st.css.js +2 -2
- package/dist/esm/state/CollectionPage/CollectionPageHeader.st.css.js.map +1 -1
- package/dist/esm/state/CollectionPage/TitleBadges.st.css.js +2 -2
- package/dist/esm/state/CollectionPage/TitleBadges.st.css.js.map +1 -1
- package/dist/esm/state/EntityPage/EntityPageState.js +2 -0
- package/dist/esm/state/EntityPage/EntityPageState.js.map +1 -1
- package/dist/esm/state/FormPage/FormPageHeader.st.css.js +2 -2
- package/dist/esm/state/FormPage/FormPageHeader.st.css.js.map +1 -1
- package/dist/esm/styles.global.css +2 -2
- package/dist/esm/test-utils/index.js +1 -0
- package/dist/esm/test-utils/index.js.map +1 -1
- package/dist/esm/test-utils/scrollUntilRendered.js +32 -0
- package/dist/esm/test-utils/scrollUntilRendered.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/dist/examples/useSchemaSource/cms-collection.tsx +1 -1
- package/dist/examples/useSchemaSource/extra-columns-and-data.tsx +1 -1
- package/dist/types/components/CmsFieldManagement/CmsFieldForm.st.css.d.ts.map +1 -1
- package/dist/types/components/CollectionSectionHeader/CollectionSectionHeader.st.css.d.ts.map +1 -1
- package/dist/types/components/CollectionTable/CollectionTableWSRTable.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/EditableCell.d.ts.map +1 -1
- package/dist/types/components/EditableTable/EditableCell.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/CellViewLayout.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/address/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/array/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/boolean/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/boolean/View.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/date/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/datetime/View.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/number/View.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/object/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/select/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/text/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/time/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EditableTable/cellTypes/url/Edit.st.css.d.ts.map +1 -1
- package/dist/types/components/EmptyState/EmptyStateBase.st.css.d.ts.map +1 -1
- package/dist/types/components/Heading/Heading.st.css.d.ts.map +1 -1
- package/dist/types/components/MaxHeightText/MaxHeightText.st.css.d.ts.map +1 -1
- package/dist/types/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.d.ts.map +1 -1
- package/dist/types/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.d.ts.map +1 -1
- package/dist/types/components/ScrollableContent/ScrollableContent.st.css.d.ts.map +1 -1
- package/dist/types/components/SetupWidget/SetupWidget.st.css.d.ts.map +1 -1
- package/dist/types/components/Table/AddFieldColumnHeader.st.css.d.ts.map +1 -1
- package/dist/types/components/TabsFilter/TabsFilter.st.css.d.ts.map +1 -1
- package/dist/types/components/ToolbarItemBox/ToolbarItemBox.st.css.d.ts.map +1 -1
- package/dist/types/state/CollectionPage/CollectionPageHeader.st.css.d.ts.map +1 -1
- package/dist/types/state/CollectionPage/TitleBadges.st.css.d.ts.map +1 -1
- package/dist/types/state/EntityPage/EntityPageState.d.ts +1 -1
- package/dist/types/state/EntityPage/EntityPageState.d.ts.map +1 -1
- package/dist/types/state/FormPage/FormPageHeader.st.css.d.ts.map +1 -1
- package/dist/types/test-utils/index.d.ts +1 -0
- package/dist/types/test-utils/index.d.ts.map +1 -1
- package/dist/types/test-utils/scrollUntilRendered.d.ts +24 -0
- package/dist/types/test-utils/scrollUntilRendered.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +8 -8
- package/src/components/CardContainer/CardContainer.st.css.ts +2 -2
- package/src/components/CmsFieldManagement/CmsFieldForm.st.css.ts +2 -2
- package/src/components/CmsFieldManagement/CmsFieldModal.st.css.ts +2 -2
- package/src/components/CmsFieldManagement/Sections/ValidationAndDefaultsSection.st.css.ts +2 -2
- package/src/components/Collapse/Collapse.st.css.ts +2 -2
- package/src/components/CollectionPageNew/CollectionPage.st.css.ts +2 -2
- package/src/components/CollectionSectionHeader/CollectionSectionHeader.st.css.ts +2 -2
- package/src/components/CollectionTable/CollectionTable.st.css.ts +2 -2
- package/src/components/CollectionTable/CollectionTableWSRTable.st.css.ts +2 -2
- package/src/components/CollectionToolbar/CollectionToolbar.st.css.ts +2 -2
- package/src/components/CollectionToolbar/SearchOrCustomFilter.st.css.ts +2 -2
- package/src/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.ts +2 -2
- package/src/components/CollectionViewsDropdown/ViewsDropdown.st.css.ts +2 -2
- package/src/components/DragHandle/DragHandle.st.css.ts +2 -2
- package/src/components/EditableTable/EditableCell.st.css.ts +2 -2
- package/src/components/EditableTable/EditableCell.tsx +1 -0
- package/src/components/EditableTable/HeaderActionsPopover.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/CellViewLayout.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/address/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/array/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/boolean/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/boolean/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/color/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/date/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/date/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/datetime/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/datetime/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/datetime/View.tsx +4 -0
- package/src/components/EditableTable/cellTypes/email/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/email/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/number/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/number/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/object/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/object/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/select/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/text/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/text/View.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/time/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/url/Edit.st.css.ts +2 -2
- package/src/components/EditableTable/cellTypes/url/View.st.css.ts +2 -2
- package/src/components/EmptyState/EmptyStateBase.st.css.ts +2 -2
- package/src/components/EntityPage/EntityPagePlain.st.css.ts +2 -2
- package/src/components/Fade/Fade.st.css.ts +2 -2
- package/src/components/Heading/Heading.st.css.ts +2 -2
- package/src/components/ImportButton/ImportStepUpload.st.css.ts +2 -2
- package/src/components/InputOverflow/InputOverflow.st.css.ts +2 -2
- package/src/components/LoadingRow/LoadingRow.st.css.ts +3 -3
- package/src/components/MaxHeightText/MaxHeightText.st.css.ts +2 -2
- package/src/components/MaxLines/MaxLines.st.css.ts +2 -2
- package/src/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.ts +2 -2
- package/src/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.ts +2 -2
- package/src/components/NestedTable/NestedTableRow.st.css.ts +2 -2
- package/src/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.ts +2 -2
- package/src/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.ts +2 -2
- package/src/components/PickerContent/PickerContent.st.css.ts +2 -2
- package/src/components/PickerContent/PickerContentAdditionalStep.st.css.ts +2 -2
- package/src/components/PickerTableListItem/PickerTableListItem.st.css.ts +2 -2
- package/src/components/ScrollableContent/ScrollableContent.st.css.ts +2 -2
- package/src/components/SetupWidget/SetupWidget.st.css.ts +2 -2
- package/src/components/SkeletonCard/SkeletonCard.st.css.ts +2 -2
- package/src/components/SlidingModal/SlidingModal.st.css.ts +2 -2
- package/src/components/Table/AddFieldColumnHeader.st.css.ts +2 -2
- package/src/components/TabsFilter/TabsFilter.st.css.ts +2 -2
- package/src/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.ts +2 -2
- package/src/components/ToolbarItem/ToolbarItem.st.css.ts +2 -2
- package/src/components/ToolbarItemBox/ToolbarItemBox.st.css.ts +2 -2
- package/src/components/common.st.css.ts +2 -2
- package/src/state/CollectionPage/CollectionPageHeader.st.css.ts +2 -2
- package/src/state/CollectionPage/TitleBadges.st.css.ts +2 -2
- package/src/state/EntityPage/EntityPageState.ts +2 -1
- package/src/state/FormPage/FormPageHeader.st.css.ts +2 -2
- package/src/styles.global.css +2 -2
- package/src/test-utils/index.ts +1 -0
- package/src/test-utils/scrollUntilRendered.ts +98 -0
- package/src/version.ts +1 -1
- package/dist/examples/ImportButton/platformized-import-from-a-source.tsx +0 -56
- package/dist/examples/useSchemaSource/your-own-source.tsx +0 -173
- /package/dist/examples/ImportButton/{platformized-import-fields-inline.tsx → platformized-import.tsx} +0 -0
|
@@ -0,0 +1,814 @@
|
|
|
1
|
+
import { ComponentType, ReactNode, ReactElement, MutableRefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
type PatternsFieldType = 'SHORT_TEXT' | 'LONG_TEXT' | 'NUMBER' | 'BOOLEAN' | 'DATE' | 'DATETIME' | 'TIME' | 'URL' | 'ARRAY' | 'REFERENCE' | 'MULTI_REFERENCE' | 'OBJECT' | 'IMAGE' | 'VIDEO' | 'MEDIA_GALLERY' | 'ADDRESS' | 'RICH_TEXT' | 'DOCUMENT' | 'RICH_CONTENT' | 'MULTI_DOCUMENT' | 'EMAIL' | 'AUDIO' | 'COLOR' | 'CUSTOM' | 'UNKNOWN';
|
|
4
|
+
type QueryOperator = 'CONTAINS' | 'ENDS_WITH' | 'EQ' | 'EXISTS' | 'GT' | 'GTE' | 'HAS_ALL' | 'HAS_SOME' | 'LT' | 'LTE' | 'NE' | 'STARTS_WITH' | 'URLIZED';
|
|
5
|
+
interface NumberRange {
|
|
6
|
+
min?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
}
|
|
9
|
+
interface StringLengthRange {
|
|
10
|
+
minLength?: number;
|
|
11
|
+
maxLength?: number;
|
|
12
|
+
}
|
|
13
|
+
interface SpecificValue {
|
|
14
|
+
id: string;
|
|
15
|
+
value: string;
|
|
16
|
+
}
|
|
17
|
+
interface BaseField {
|
|
18
|
+
id: string;
|
|
19
|
+
displayName: string;
|
|
20
|
+
isPii?: boolean;
|
|
21
|
+
helpText?: string;
|
|
22
|
+
/** Whether this is a system-managed field (not user-created). */
|
|
23
|
+
isSystem?: boolean;
|
|
24
|
+
/** The group this field belongs to, when the source groups its fields.
|
|
25
|
+
* Absent ⇒ ungrouped. */
|
|
26
|
+
group?: string;
|
|
27
|
+
/** Whether this is the collection's primary display field. */
|
|
28
|
+
isPrimary?: boolean;
|
|
29
|
+
validation?: {
|
|
30
|
+
numberRange?: NumberRange;
|
|
31
|
+
stringLengthRange?: StringLengthRange;
|
|
32
|
+
specificValues?: SpecificValue[];
|
|
33
|
+
/** Regular expression source the value must match. Applies to text-like
|
|
34
|
+
* fields only; mutually exclusive with `specificValues`. */
|
|
35
|
+
pattern?: string;
|
|
36
|
+
required: boolean;
|
|
37
|
+
};
|
|
38
|
+
capabilities?: {
|
|
39
|
+
supportedQueryOperators: QueryOperator[];
|
|
40
|
+
sortable: boolean;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
interface BaseReferenceField extends BaseField {
|
|
44
|
+
referenceMetadata: {
|
|
45
|
+
referencedCollectionId: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
interface ReferenceField extends BaseReferenceField {
|
|
49
|
+
type: 'REFERENCE';
|
|
50
|
+
}
|
|
51
|
+
interface MultiReferenceField extends BaseReferenceField {
|
|
52
|
+
type: 'MULTI_REFERENCE';
|
|
53
|
+
}
|
|
54
|
+
interface NonReferenceField extends BaseField {
|
|
55
|
+
type: Exclude<PatternsFieldType, 'REFERENCE' | 'MULTI_REFERENCE'>;
|
|
56
|
+
/** Present iff `type` is 'CUSTOM'; keys a field type definition registered on the source. */
|
|
57
|
+
customType?: string;
|
|
58
|
+
}
|
|
59
|
+
type Field = ReferenceField | MultiReferenceField | NonReferenceField;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* `ComputedQuery` — cut here because it has its own bundle.
|
|
63
|
+
* Full shape: `types/ComputedQuery.d.ts`.
|
|
64
|
+
*/
|
|
65
|
+
interface ComputedQuery<F = any> {
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* `DataResultRaw` — cut here because it has its own bundle.
|
|
71
|
+
* Full shape: `types/DataResultRaw.d.ts`.
|
|
72
|
+
*/
|
|
73
|
+
interface DataResultRaw<T = any> {
|
|
74
|
+
[key: string]: unknown;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* `OffsetQuery` — cut here because it has its own bundle.
|
|
79
|
+
* Full shape: `types/OffsetQuery.d.ts`.
|
|
80
|
+
*/
|
|
81
|
+
type OffsetQuery<F = any> = Omit<ComputedQuery<F>, 'cursor'>;
|
|
82
|
+
type OffsetQueryResult<T> = Omit<DataResultRaw<T>, 'cursor'>;
|
|
83
|
+
type CursorQueryResult<T> = Omit<DataResultRaw<T>, 'cursor'> & {
|
|
84
|
+
cursor: string | undefined | null;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* `CursorQuery` — cut here because it has its own bundle.
|
|
88
|
+
* Full shape: `types/CursorQuery.d.ts`.
|
|
89
|
+
*/
|
|
90
|
+
type CursorQuery<F = any> = Omit<ComputedQuery<F>, 'offset'>;
|
|
91
|
+
type FetchTotalFn = (query: CursorQuery) => Promise<number>;
|
|
92
|
+
|
|
93
|
+
/** Field-management permissions. Absent when the schema's fields cannot be edited. */
|
|
94
|
+
interface SchemaPermissions {
|
|
95
|
+
createField: boolean;
|
|
96
|
+
updateField: boolean;
|
|
97
|
+
deleteField: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** The per-item delete verdict. */
|
|
100
|
+
interface RemoveItemDisabledResult {
|
|
101
|
+
disabled: boolean;
|
|
102
|
+
/** Why the item cannot be deleted — surfaced to the user by consumers. */
|
|
103
|
+
reason?: string;
|
|
104
|
+
}
|
|
105
|
+
/** Item-level CRUD permissions. */
|
|
106
|
+
interface ItemPermissions<T = Record<string, unknown>> {
|
|
107
|
+
createItem: boolean;
|
|
108
|
+
updateItem: boolean;
|
|
109
|
+
deleteItem: boolean;
|
|
110
|
+
/** Deleting several items in one operation. Absent = follows `deleteItem`. */
|
|
111
|
+
bulkDeleteItems?: boolean;
|
|
112
|
+
/** Per-item refinement of `deleteItem`: disables deleting an item even
|
|
113
|
+
* though `deleteItem` is true, optionally with a reason. Must be pure and
|
|
114
|
+
* synchronous. Absent = all items deletable. */
|
|
115
|
+
isRemoveItemDisabled?: (item: T) => RemoveItemDisabledResult;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A source-neutral description of a collection — data only, no behavior.
|
|
119
|
+
* Item access is in `CollectionBackend`, field mutations in `FieldActions`.
|
|
120
|
+
*/
|
|
121
|
+
interface Schema {
|
|
122
|
+
id: string;
|
|
123
|
+
fields: Record<string, Field | undefined>;
|
|
124
|
+
/** Human-readable label, when the source has one. Reported to BI. */
|
|
125
|
+
name?: string;
|
|
126
|
+
/** The kind of data set, when the source distinguishes kinds. Reported to BI. */
|
|
127
|
+
type?: string;
|
|
128
|
+
/** The field that best represents the entity (titles/selections). */
|
|
129
|
+
displayField: string;
|
|
130
|
+
/** The identifier field. */
|
|
131
|
+
idField: string;
|
|
132
|
+
/** Group display order, present when fields carry a `group`. */
|
|
133
|
+
groups?: string[];
|
|
134
|
+
/** Absent when the schema's fields cannot be edited. */
|
|
135
|
+
schemaPermissions?: SchemaPermissions;
|
|
136
|
+
itemPermissions?: ItemPermissions;
|
|
137
|
+
}
|
|
138
|
+
interface BackupConfig {
|
|
139
|
+
create: () => Promise<{
|
|
140
|
+
backupId: string;
|
|
141
|
+
}>;
|
|
142
|
+
waitForCompletion: (backupId: string, options?: {
|
|
143
|
+
signal?: AbortSignal;
|
|
144
|
+
}) => Promise<void>;
|
|
145
|
+
cancel?: (backupId: string) => Promise<void>;
|
|
146
|
+
restore?: (backupId: string) => Promise<{
|
|
147
|
+
restorationId: string;
|
|
148
|
+
}>;
|
|
149
|
+
waitForRestoration?: (restorationId: string, options?: {
|
|
150
|
+
signal?: AbortSignal;
|
|
151
|
+
}) => Promise<void>;
|
|
152
|
+
}
|
|
153
|
+
interface BulkInsertError {
|
|
154
|
+
rowIndex: number;
|
|
155
|
+
message?: string;
|
|
156
|
+
code?: string;
|
|
157
|
+
}
|
|
158
|
+
interface BulkInsertResult {
|
|
159
|
+
succeeded?: number;
|
|
160
|
+
failed?: number;
|
|
161
|
+
errors?: BulkInsertError[];
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Metadata for an item update. `changedFieldIds` narrows follow-up comparison
|
|
165
|
+
* work to fields the UI already knows were edited, which avoids diffing every
|
|
166
|
+
* value when some fields are large or expensive to compare.
|
|
167
|
+
*/
|
|
168
|
+
interface CollectionUpdateContext<T = Record<string, unknown>> {
|
|
169
|
+
previousItem: T;
|
|
170
|
+
changedFieldIds: string[];
|
|
171
|
+
}
|
|
172
|
+
/** Item data access shared by both pagination modes. `find` (on
|
|
173
|
+
* `CollectionBackend`) is the only required call — the rest are capabilities
|
|
174
|
+
* a source provides when it (or its consumer) supports them. */
|
|
175
|
+
interface CollectionBackendBase<T = Record<string, unknown>> {
|
|
176
|
+
get?: (entityId: string) => Promise<T>;
|
|
177
|
+
create?: (entity: Partial<T>) => Promise<T>;
|
|
178
|
+
update?: (entity: T, context?: CollectionUpdateContext<T>) => Promise<T>;
|
|
179
|
+
delete?: (entityId: string) => Promise<void>;
|
|
180
|
+
bulkDelete?: (entityIds: string[]) => Promise<void>;
|
|
181
|
+
move?: (id: string, params: {
|
|
182
|
+
moveAfterId: string | null | undefined;
|
|
183
|
+
}) => Promise<void>;
|
|
184
|
+
backup?: BackupConfig;
|
|
185
|
+
bulkInsert?: (entities: Partial<T>[]) => Promise<BulkInsertResult>;
|
|
186
|
+
}
|
|
187
|
+
/** Per-call search scope the query layer passes to a backend's `find`. */
|
|
188
|
+
interface FindOptions {
|
|
189
|
+
searchableFieldIds?: string[];
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* The query-layer fetch-data fns plus the optional `find` options the runtime
|
|
193
|
+
* already accepts. Kept separate so the shared `OffsetFetchDataFn`/
|
|
194
|
+
* `CursorFetchDataFn` used by `fetchData` stay unchanged.
|
|
195
|
+
*/
|
|
196
|
+
type OffsetFindFn<T, F extends FiltersMap> = (query: OffsetQuery<F>, options?: FindOptions) => Promise<OffsetQueryResult<T>>;
|
|
197
|
+
type CursorFindFn<T, F extends FiltersMap> = (query: CursorQuery<F>, options?: FindOptions) => Promise<CursorQueryResult<T>>;
|
|
198
|
+
/**
|
|
199
|
+
* A source's item data access. The source declares its `paginationMode`
|
|
200
|
+
* (offset by default) together with the matching `find`, same as core's
|
|
201
|
+
* `PaginationModeConfig`.
|
|
202
|
+
*/
|
|
203
|
+
type CollectionBackend<T = Record<string, unknown>, F extends FiltersMap = OptionalFiltersMap> = CollectionBackendBase<T> & ({
|
|
204
|
+
paginationMode?: 'offset';
|
|
205
|
+
find: OffsetFindFn<T, F>;
|
|
206
|
+
} | {
|
|
207
|
+
paginationMode: 'cursor';
|
|
208
|
+
find: CursorFindFn<T, F>;
|
|
209
|
+
fetchTotal?: FetchTotalFn;
|
|
210
|
+
});
|
|
211
|
+
/**
|
|
212
|
+
* Whatever the source's settings section collected in the add/edit field modal.
|
|
213
|
+
* The modal and the collection layer only carry it; the source that produced it
|
|
214
|
+
* is the only one that looks inside, so it declares its own shape on `addField`
|
|
215
|
+
* and `editField` (both are methods, so a narrower parameter type is allowed).
|
|
216
|
+
*/
|
|
217
|
+
type FieldSettings = unknown;
|
|
218
|
+
/** Field-management actions. All optional — a read-only source provides none. */
|
|
219
|
+
interface FieldActions {
|
|
220
|
+
/**
|
|
221
|
+
* Field-mutating actions return the collection's updated fields map so the
|
|
222
|
+
* caller can merge its local state from the response, without reloading the
|
|
223
|
+
* schema. (`renameField` is the exception — nothing consumes its result yet.)
|
|
224
|
+
*/
|
|
225
|
+
addField?(field: Field, settings?: FieldSettings): Promise<Schema['fields']>;
|
|
226
|
+
/**
|
|
227
|
+
* Adds several fields in a single mutation, each under its `field.id` key
|
|
228
|
+
* (callers decide the keys up front — e.g. CSV import uploads values under
|
|
229
|
+
* them), unlike `addField`, which derives a fresh key from the display name.
|
|
230
|
+
*/
|
|
231
|
+
addFields?: (fields: Field[]) => Promise<Schema['fields']>;
|
|
232
|
+
editField?(fieldId: string, updates: Partial<Field>, settings?: FieldSettings): Promise<Schema['fields']>;
|
|
233
|
+
deleteField?: (fieldId: string) => Promise<Schema['fields']>;
|
|
234
|
+
renameField?: (fieldId: string, newName: string) => Promise<void>;
|
|
235
|
+
makePrimary?: (fieldId: string) => Promise<Schema['fields']>;
|
|
236
|
+
duplicateField?: (fieldId: string) => Promise<Schema['fields']>;
|
|
237
|
+
duplicateFieldWithContent?: (fieldId: string) => Promise<Schema['fields']>;
|
|
238
|
+
}
|
|
239
|
+
/** Everything a source provides for a collection. */
|
|
240
|
+
interface LoadedSchema<T = Record<string, unknown>> {
|
|
241
|
+
schema: Schema;
|
|
242
|
+
backend: CollectionBackend<T>;
|
|
243
|
+
fieldActions?: FieldActions;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** Presentation for one existing field, without changing its type or behavior. */
|
|
247
|
+
interface FieldPresentation {
|
|
248
|
+
typeDisplay?: Partial<FieldTypeDisplay>;
|
|
249
|
+
collectionInputLabel?: string;
|
|
250
|
+
}
|
|
251
|
+
/** Read/write permission defaults a source supports, per audience. */
|
|
252
|
+
interface FieldPermissions {
|
|
253
|
+
installedApps?: {
|
|
254
|
+
hide?: boolean;
|
|
255
|
+
defaultRead?: boolean;
|
|
256
|
+
defaultWrite?: boolean;
|
|
257
|
+
};
|
|
258
|
+
siteVisitors?: {
|
|
259
|
+
hide?: boolean;
|
|
260
|
+
defaultRead?: boolean;
|
|
261
|
+
defaultWrite?: boolean;
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/** The add-modal subtitle: a line of text, an optional second note line, and an
|
|
265
|
+
* optional "learn more" link. */
|
|
266
|
+
interface FieldModalSubtitle {
|
|
267
|
+
text: string;
|
|
268
|
+
note?: string;
|
|
269
|
+
learnMore?: {
|
|
270
|
+
label: string;
|
|
271
|
+
href: string;
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/** The text a source supplies for the add/edit field modal. */
|
|
275
|
+
interface FieldModalText {
|
|
276
|
+
addTitle: string;
|
|
277
|
+
editTitle: string;
|
|
278
|
+
/** Subtitle for the add modal; omit for none. */
|
|
279
|
+
addSubtitle?: FieldModalSubtitle;
|
|
280
|
+
/** Label of the collapsible section below the main fields. */
|
|
281
|
+
settingsLabel?: string;
|
|
282
|
+
}
|
|
283
|
+
/** A warning shown under the PII toggle, with an optional action button. */
|
|
284
|
+
interface FieldPiiWarning {
|
|
285
|
+
text: string;
|
|
286
|
+
action?: {
|
|
287
|
+
label: string;
|
|
288
|
+
onClick: () => void;
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
interface FieldModalCollectionOption {
|
|
292
|
+
id: string;
|
|
293
|
+
label: string;
|
|
294
|
+
}
|
|
295
|
+
type FieldModalCollectionOptionsLoader = () => Promise<FieldModalCollectionOption[]>;
|
|
296
|
+
interface FieldModalCollectionAction {
|
|
297
|
+
label: string;
|
|
298
|
+
icon?: ComponentType;
|
|
299
|
+
disabled?: boolean;
|
|
300
|
+
/** Return an option to select, or undefined on cancellation. The option may
|
|
301
|
+
* be pending creation; persistence remains the source's responsibility. */
|
|
302
|
+
onClick: () => Promise<FieldModalCollectionOption | undefined>;
|
|
303
|
+
}
|
|
304
|
+
/** Extra collection picker a field type can add to the main modal body. */
|
|
305
|
+
interface FieldModalCollectionInput {
|
|
306
|
+
label?: string;
|
|
307
|
+
placeholder?: string;
|
|
308
|
+
emptyStateMessage?: string;
|
|
309
|
+
errorMessage?: string;
|
|
310
|
+
required?: boolean;
|
|
311
|
+
loadOptions?: FieldModalCollectionOptionsLoader;
|
|
312
|
+
/** An action below the options, also shown when no options match. */
|
|
313
|
+
dropdownAction?: FieldModalCollectionAction;
|
|
314
|
+
/** Restores the picker value from an existing field. */
|
|
315
|
+
getValue?: (field: Field) => string | undefined;
|
|
316
|
+
/** Adds picker-derived values to the source-owned settings payload. */
|
|
317
|
+
getSettings?: (collectionId: string) => FieldSettings;
|
|
318
|
+
}
|
|
319
|
+
interface FieldSettingsProps {
|
|
320
|
+
/** The picked field type, or absent before one is picked. */
|
|
321
|
+
fieldType?: string;
|
|
322
|
+
/** Validation rules the section should render as fixed, not user-editable.
|
|
323
|
+
* A section ignores any entry it doesn't recognize. */
|
|
324
|
+
lockedRules?: readonly string[];
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* The collapsible section below the main add/edit field inputs, supplied by the
|
|
328
|
+
* source. The modal renders it, blocks confirm while it has an error, and hands
|
|
329
|
+
* its values to the source's own `addField`/`editField` — it never looks inside.
|
|
330
|
+
*/
|
|
331
|
+
interface FieldSettingsSection {
|
|
332
|
+
Component: ComponentType<FieldSettingsProps>;
|
|
333
|
+
/** True keeps the modal open on confirm. The section shows the error itself. */
|
|
334
|
+
hasError(fieldType?: string): boolean;
|
|
335
|
+
/** Passed to `FieldActions.addField`/`editField` as-is. */
|
|
336
|
+
getValues(fieldType?: string): FieldSettings;
|
|
337
|
+
/**
|
|
338
|
+
* Fills the inputs when the modal opens: the field being edited, or nothing
|
|
339
|
+
* for a new field. Pushed in rather than read from a prop, so the values are
|
|
340
|
+
* there whether or not the section has been rendered yet.
|
|
341
|
+
*/
|
|
342
|
+
setValues(field?: Field): void;
|
|
343
|
+
/**
|
|
344
|
+
* Prefills a new field's rules from the caller's requested initial values —
|
|
345
|
+
* there is no backing `Field` yet, so this is separate from `setValues`.
|
|
346
|
+
* Absent ⇒ the section doesn't support prefilling any rule this way, and
|
|
347
|
+
* the modal drops that rule from `lockedProperties` rather than locking a
|
|
348
|
+
* control at a value it could never actually apply.
|
|
349
|
+
*/
|
|
350
|
+
setInitialValues?(initial: {
|
|
351
|
+
required?: boolean;
|
|
352
|
+
}): void;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* `Filter` — cut here because it has its own bundle.
|
|
357
|
+
* Full shape: `types/Filter.d.ts`.
|
|
358
|
+
*/
|
|
359
|
+
interface Filter<T = any> {
|
|
360
|
+
[key: string]: unknown;
|
|
361
|
+
}
|
|
362
|
+
type FiltersMap = {
|
|
363
|
+
[key: string]: Filter<any> | undefined;
|
|
364
|
+
};
|
|
365
|
+
type OptionalFiltersMap = {
|
|
366
|
+
[key: string]: undefined;
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
type ValidationRule = {
|
|
370
|
+
type: 'required';
|
|
371
|
+
message: string;
|
|
372
|
+
} | {
|
|
373
|
+
type: 'min' | 'max';
|
|
374
|
+
value: number;
|
|
375
|
+
message: string;
|
|
376
|
+
} | {
|
|
377
|
+
type: 'minLength' | 'maxLength';
|
|
378
|
+
value: number;
|
|
379
|
+
message: string;
|
|
380
|
+
} | {
|
|
381
|
+
type: 'pattern';
|
|
382
|
+
value: RegExp;
|
|
383
|
+
message: string;
|
|
384
|
+
} | {
|
|
385
|
+
type: 'custom';
|
|
386
|
+
validate: (value: unknown) => boolean;
|
|
387
|
+
message: string;
|
|
388
|
+
} | {
|
|
389
|
+
type: 'specificValues';
|
|
390
|
+
values: {
|
|
391
|
+
id: string;
|
|
392
|
+
value: string;
|
|
393
|
+
}[];
|
|
394
|
+
message: string;
|
|
395
|
+
};
|
|
396
|
+
interface Focusable {
|
|
397
|
+
focus: () => void;
|
|
398
|
+
}
|
|
399
|
+
type EditTrigger = {
|
|
400
|
+
kind: 'type';
|
|
401
|
+
key: string;
|
|
402
|
+
} | 'enter' | 'click' | 'doubleClick';
|
|
403
|
+
interface CellViewProps<V> {
|
|
404
|
+
value: V;
|
|
405
|
+
typeConfig?: unknown;
|
|
406
|
+
validation?: ValidationRule[];
|
|
407
|
+
/** Stable id of the column. Cell components can use it to derive unique DOM ids. */
|
|
408
|
+
columnId: string;
|
|
409
|
+
/** Stable key of the row. Cell components can use it to derive unique DOM ids. */
|
|
410
|
+
rowKey: string;
|
|
411
|
+
/** Whether the cell is editable. Used to conditionally render placeholders (don't show them for read-only cells). */
|
|
412
|
+
isEditable?: boolean;
|
|
413
|
+
}
|
|
414
|
+
interface CellEditProps<V> {
|
|
415
|
+
value: V;
|
|
416
|
+
onChange(value: V): void;
|
|
417
|
+
onCommit: () => void;
|
|
418
|
+
onCancel: () => void;
|
|
419
|
+
/**
|
|
420
|
+
* Signals that the cell is starting an editing operation that will move focus
|
|
421
|
+
* outside the table (e.g., opening a media manager or a modal). Calling this
|
|
422
|
+
* sets isEditing=true so the table does not clear cell focus while the
|
|
423
|
+
* external UI is open. Pair with onCommit (after the operation succeeds)
|
|
424
|
+
* or onCancel (if the user dismisses without a value change).
|
|
425
|
+
*/
|
|
426
|
+
onStartEdit?: () => void;
|
|
427
|
+
/** Ref to the focusable input element. Used for type-to-edit (focusing the input when user starts typing on a focused cell). */
|
|
428
|
+
inputRef?: MutableRefObject<Focusable | undefined | null>;
|
|
429
|
+
typeConfig?: unknown;
|
|
430
|
+
/** How edit mode was triggered. Edit components can use this to customize behavior (e.g., date picker auto-opens on 'type'). */
|
|
431
|
+
editTrigger?: EditTrigger | null;
|
|
432
|
+
/** Column-level validation rules. Edit components can derive UI behavior (e.g., maxLength blocking/tooltip) from these. */
|
|
433
|
+
validation?: ValidationRule[];
|
|
434
|
+
/** Stable id of the column. Cell components can use it to derive unique DOM ids. */
|
|
435
|
+
columnId: string;
|
|
436
|
+
/** Stable key of the row. Cell components can use it to derive unique DOM ids. */
|
|
437
|
+
rowKey: string;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Props passed to a cell type's optional `EditWrapper`. The table mounts the
|
|
441
|
+
* wrapper around the cell content and keeps it mounted across the edit↔view
|
|
442
|
+
* transition, so the wrapper can own behavior that must outlive the inline
|
|
443
|
+
* editor (e.g. a reference cell navigating to an overlay and refreshing on
|
|
444
|
+
* return). The wrapper hands anything the editor needs down via its own context.
|
|
445
|
+
*/
|
|
446
|
+
interface CellEditWrapperProps {
|
|
447
|
+
/** The column's typeConfig (same value handed to the cell's Edit/View). */
|
|
448
|
+
typeConfig?: unknown;
|
|
449
|
+
/** Stable id of the column. */
|
|
450
|
+
columnId: string;
|
|
451
|
+
/** Stable key of the row. */
|
|
452
|
+
rowKey: string;
|
|
453
|
+
/** The cell content (the Edit or View component) to render inside the wrapper. */
|
|
454
|
+
children: ReactNode;
|
|
455
|
+
}
|
|
456
|
+
type EditableCellContextMenuAction = 'copy' | 'cut' | 'paste' | 'clear';
|
|
457
|
+
interface EditableCellContextMenuActionContext<V> {
|
|
458
|
+
/** Current cell value, including pending or draft edits. */
|
|
459
|
+
value: V;
|
|
460
|
+
/** Field metadata associated with the column, when available. */
|
|
461
|
+
field?: Field;
|
|
462
|
+
/** Stable key of the row. */
|
|
463
|
+
rowKey: string;
|
|
464
|
+
/** Stable id of the column. */
|
|
465
|
+
columnId: string;
|
|
466
|
+
}
|
|
467
|
+
interface EditableCellContextMenuActionConfig<V> {
|
|
468
|
+
/** Returning a non-empty string disables the action and shows the tooltip. */
|
|
469
|
+
disabledTooltip(context: EditableCellContextMenuActionContext<V>): string | undefined;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* The editable-cell slot of a field type definition: how a cell of that type
|
|
473
|
+
* renders, edits, and moves through the clipboard. The definition's key
|
|
474
|
+
* identifies the type and the definition's `value` owns validation, so the
|
|
475
|
+
* slot carries neither.
|
|
476
|
+
*
|
|
477
|
+
* Members that take `V` use method syntax so a definition typed with a
|
|
478
|
+
* concrete value type stays assignable where a loosely typed definition is
|
|
479
|
+
* expected (see `FieldTypeDefinition`).
|
|
480
|
+
*/
|
|
481
|
+
interface EditableCellConfig<V> {
|
|
482
|
+
/** Render cell in view mode (read-only display). */
|
|
483
|
+
ViewComponent(props: CellViewProps<V>): ReactElement | null;
|
|
484
|
+
/** Render cell in edit mode (inline editor). Optional — omit for view-only cells. */
|
|
485
|
+
EditComponent?(props: CellEditProps<V>): ReactElement | null;
|
|
486
|
+
/** Serialize value to clipboard string. */
|
|
487
|
+
serialize?(value: V): string;
|
|
488
|
+
/** Deserialize clipboard string to value. */
|
|
489
|
+
deserialize?(raw: string): V;
|
|
490
|
+
/** Can this cell type be edited? (default: true) */
|
|
491
|
+
editable?: boolean;
|
|
492
|
+
/** Availability of Cairo's built-in cell context-menu actions. */
|
|
493
|
+
contextMenu?: Partial<Record<EditableCellContextMenuAction, EditableCellContextMenuActionConfig<V>>>;
|
|
494
|
+
/** Toggle value on single click (e.g., boolean checkbox). Skips focus→edit flow. */
|
|
495
|
+
toggleValue?(value: V): V;
|
|
496
|
+
/** Enter edit mode on single click (e.g., image cell with no value). */
|
|
497
|
+
editOnClick?(value: V): boolean;
|
|
498
|
+
/** Show the EditComponent when the cell is focused, without entering edit mode.
|
|
499
|
+
* Keyboard navigation remains active. Similar to toggleValue but without toggling. */
|
|
500
|
+
showEditWhenFocused?: boolean;
|
|
501
|
+
/** Optional wrapper component the cell type defines to own behavior that must
|
|
502
|
+
* outlive the inline editor. Mounted around the cell content and kept mounted
|
|
503
|
+
* across the edit↔view transition. */
|
|
504
|
+
EditWrapper?: ComponentType<CellEditWrapperProps>;
|
|
505
|
+
/** Cell content can grow past row height when focused. Only applies to
|
|
506
|
+
* showEditWhenFocused cells. */
|
|
507
|
+
growable?: boolean;
|
|
508
|
+
/** Called on type-to-edit. Return object with cleared value and/or prevent flag.
|
|
509
|
+
* Return undefined to block the key. Return {} to enter edit mode without changing the value. */
|
|
510
|
+
onTypeToEdit?(params: {
|
|
511
|
+
key: string;
|
|
512
|
+
validation?: ValidationRule[];
|
|
513
|
+
}): {
|
|
514
|
+
value?: V;
|
|
515
|
+
} | undefined;
|
|
516
|
+
/** Optional hook to normalize the committed value (e.g. auto-prepend https://).
|
|
517
|
+
* Called before the edit commits; the value is written back before committing. */
|
|
518
|
+
normalizeOnCommit?(value: V): V;
|
|
519
|
+
/** When true, type-to-edit flushes the edit-mode render synchronously and
|
|
520
|
+
* focuses the input within the same keydown event, then lets the browser's
|
|
521
|
+
* default action deliver the keystroke to the now-focused input naturally.
|
|
522
|
+
* Use for cells that wrap a controlled input whose value can't be seeded via props. */
|
|
523
|
+
nativeTypeToEdit?: boolean;
|
|
524
|
+
}
|
|
525
|
+
/** The props the filter builder passes to a definition's toolbar filter
|
|
526
|
+
* component — the same contract the built-in filter elements receive. */
|
|
527
|
+
interface FilterTypeComponentProps<V = any> {
|
|
528
|
+
filter: Filter<V>;
|
|
529
|
+
toolbarItemProps?: {
|
|
530
|
+
label?: ReactNode;
|
|
531
|
+
};
|
|
532
|
+
toolbarTagProps?: {
|
|
533
|
+
label?: string;
|
|
534
|
+
};
|
|
535
|
+
accordionItemProps?: {
|
|
536
|
+
label?: string;
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
/** The filter slot of a field type definition: the filter state registered on
|
|
540
|
+
* the collection query and the toolbar element that renders it. */
|
|
541
|
+
interface FilterTypeConfig {
|
|
542
|
+
createFilter: (field: Field) => Filter<any>;
|
|
543
|
+
Component: ComponentType<FilterTypeComponentProps>;
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* The read-only table slot of a field type definition: how a cell of that
|
|
547
|
+
* type renders in the table, and the column's layout. Independent of
|
|
548
|
+
* `editableTable` — neither slot falls back to the other.
|
|
549
|
+
*/
|
|
550
|
+
/** What a read-only table cell is told about itself. */
|
|
551
|
+
interface TableCellProps<V> {
|
|
552
|
+
value: V;
|
|
553
|
+
/** Stable id of the column. Cell components can use it to derive unique DOM ids. */
|
|
554
|
+
columnId: string;
|
|
555
|
+
/** The row this cell belongs to, so a cell can act on its item and not just
|
|
556
|
+
* display it. Typed loosely for the same reason as `FieldsSource.getCellValue`:
|
|
557
|
+
* the row shape belongs to the source, not to Cairo. */
|
|
558
|
+
row: unknown;
|
|
559
|
+
}
|
|
560
|
+
interface TableCellConfig<V> {
|
|
561
|
+
/** Render the cell. Method syntax keeps the definition assignable to
|
|
562
|
+
* `FieldTypeDefinition<unknown>` (see FieldTypeDefinition). */
|
|
563
|
+
CellComponent(props: TableCellProps<V>): ReactElement | null;
|
|
564
|
+
/** Column width. Required — custom types get no built-in layout default. */
|
|
565
|
+
width: string;
|
|
566
|
+
/** Default: 'start'. */
|
|
567
|
+
align?: 'start' | 'center' | 'end';
|
|
568
|
+
}
|
|
569
|
+
/** An extra menu item a field type definition adds to a field's actions menu. */
|
|
570
|
+
interface FieldTypeActionItem {
|
|
571
|
+
key: string;
|
|
572
|
+
label: string;
|
|
573
|
+
icon?: ReactNode;
|
|
574
|
+
skin?: 'destructive';
|
|
575
|
+
onClick: (field: Field) => void;
|
|
576
|
+
/** Default: visible. */
|
|
577
|
+
visible?: (field: Field) => boolean;
|
|
578
|
+
/** Returning a string disables the item and shows the tooltip. */
|
|
579
|
+
disabledTooltip?: (field: Field) => string | undefined;
|
|
580
|
+
}
|
|
581
|
+
/** The actions slot of a field type definition: extra items for the field's "more actions" menu. */
|
|
582
|
+
interface FieldActionsConfig {
|
|
583
|
+
items?: FieldTypeActionItem[];
|
|
584
|
+
}
|
|
585
|
+
/** Display metadata for a field type: menu label and type icons. */
|
|
586
|
+
interface FieldTypeDisplay {
|
|
587
|
+
label: string;
|
|
588
|
+
icons: {
|
|
589
|
+
Small: ComponentType;
|
|
590
|
+
Medium: ComponentType;
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
/** Value semantics of a field type, independent of any rendering surface.
|
|
594
|
+
* Members use method syntax so a definition typed with a concrete value type
|
|
595
|
+
* stays assignable where a loosely typed definition is expected. */
|
|
596
|
+
interface FieldValueBehavior<V> {
|
|
597
|
+
defaultValue?: V;
|
|
598
|
+
isEmpty?(value: V): boolean;
|
|
599
|
+
/** Returns an error message, or null when the value is valid. Every surface
|
|
600
|
+
* that validates a field of this type runs this. */
|
|
601
|
+
validate?(value: V, rules?: ValidationRule[]): string | null;
|
|
602
|
+
}
|
|
603
|
+
interface FieldCapabilities {
|
|
604
|
+
sortable: boolean;
|
|
605
|
+
}
|
|
606
|
+
/** The field-modal slot of a field type definition: opts the type into the
|
|
607
|
+
* add/edit-field modal's type picker and describes its entry there. */
|
|
608
|
+
interface FieldModalConfig {
|
|
609
|
+
/** True ⇒ the add-field modal offers this type. */
|
|
610
|
+
creatable: boolean;
|
|
611
|
+
/** Placeholder for the name input. Absent ⇒ the modal's generic placeholder. */
|
|
612
|
+
namePlaceholder?: string;
|
|
613
|
+
/** One-line description under the type in the picker. */
|
|
614
|
+
subtitle?: string;
|
|
615
|
+
/** Group heading this type is listed under in the picker. */
|
|
616
|
+
group?: string;
|
|
617
|
+
/** Whether a field of this type can be marked PII. Absent ⇒ follows the
|
|
618
|
+
* source-wide setting. */
|
|
619
|
+
supportsPii?: boolean;
|
|
620
|
+
/** Warning shown while the PII toggle is on. Read on every render, so it can
|
|
621
|
+
* use data that only exists once the schema has loaded. Default: none. */
|
|
622
|
+
piiWarning?: () => FieldPiiWarning | undefined;
|
|
623
|
+
/** This type's collapsible settings section — the same contract a
|
|
624
|
+
* source-declared type option carries (see `FieldSettingsSection`). */
|
|
625
|
+
settingsSection?: FieldSettingsSection;
|
|
626
|
+
/** Collection picker shown in the main add/edit field form. */
|
|
627
|
+
collectionInput?: FieldModalCollectionInput;
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Props the entity-page form dispatcher passes to a field type's form
|
|
631
|
+
* component. The dispatcher owns the form wiring (registration, validation
|
|
632
|
+
* from the definition's `value.validate`) and the field UI (label, required
|
|
633
|
+
* marker, error message); the component renders the input: read `value`,
|
|
634
|
+
* report edits through `onChange`, and hand back the focusable control
|
|
635
|
+
* through `inputRef` so a blocked save can reach it.
|
|
636
|
+
*/
|
|
637
|
+
interface FormFieldComponentProps<V> {
|
|
638
|
+
field: Field;
|
|
639
|
+
value: V;
|
|
640
|
+
onChange(value: V): void;
|
|
641
|
+
/** Call when the input loses focus — marks the field touched, so error
|
|
642
|
+
* timing matches the built-in renderers. */
|
|
643
|
+
onBlur: () => void;
|
|
644
|
+
/** Ref to the focusable input element. Used to focus the field when a
|
|
645
|
+
* blocked save reports an error on it. Absent ⇒ the entity page brings the
|
|
646
|
+
* field into view and focuses the first control it finds inside. */
|
|
647
|
+
inputRef?: MutableRefObject<Focusable | undefined | null>;
|
|
648
|
+
dataHook?: string;
|
|
649
|
+
}
|
|
650
|
+
/** The entity-page form slot of a field type definition. */
|
|
651
|
+
interface FormTypeConfig<V = unknown> {
|
|
652
|
+
/** Renders the input. Method syntax keeps the definition assignable to
|
|
653
|
+
* `FieldTypeDefinition<unknown>` (see FieldTypeDefinition). */
|
|
654
|
+
Component(props: FormFieldComponentProps<V>): ReactElement | null;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* A consumer-defined field type. Defined once on the fields source; every
|
|
658
|
+
* entry point that renders the field resolves its slot from here. `V` is the
|
|
659
|
+
* field's value type — `defineFieldType` infers it, and it keeps all the
|
|
660
|
+
* slots consistent with each other.
|
|
661
|
+
*
|
|
662
|
+
* Sources hold definitions of mixed value types in one
|
|
663
|
+
* `FieldTypeDefinition[]` (= `FieldTypeDefinition<unknown>[]`) array. That
|
|
664
|
+
* works because every member that takes `V` is declared with method syntax,
|
|
665
|
+
* which TypeScript checks bivariantly — so `FieldTypeDefinition<number>` is
|
|
666
|
+
* assignable to `FieldTypeDefinition<unknown>` without casts.
|
|
667
|
+
*/
|
|
668
|
+
interface FieldTypeDefinition<V = unknown> {
|
|
669
|
+
/** Unique key for the type. A built-in type uses its `PatternsFieldType`; a
|
|
670
|
+
* consumer-defined type uses the string its fields reference via `customType`. */
|
|
671
|
+
type: string;
|
|
672
|
+
display: FieldTypeDisplay;
|
|
673
|
+
/** Filter behavior, or an explicit opt-out — never silently absent. */
|
|
674
|
+
filter: FilterTypeConfig | {
|
|
675
|
+
filterable: false;
|
|
676
|
+
};
|
|
677
|
+
value?: FieldValueBehavior<V>;
|
|
678
|
+
capabilities?: FieldCapabilities;
|
|
679
|
+
/** Absent ⇒ the field renders with the default cell in the read-only table. */
|
|
680
|
+
table?: TableCellConfig<V>;
|
|
681
|
+
/** Absent ⇒ the field renders as a read-only cell in editable surfaces. */
|
|
682
|
+
editableTable?: EditableCellConfig<V>;
|
|
683
|
+
/** Required once a field of this type renders on an entity page:
|
|
684
|
+
* development throws without it; production skips the field. */
|
|
685
|
+
form?: FormTypeConfig<V>;
|
|
686
|
+
/** Extra items for the field's "more actions" menu. */
|
|
687
|
+
actions?: FieldActionsConfig;
|
|
688
|
+
/** Absent ⇒ the add/edit field modal never offers this type. Fields of the
|
|
689
|
+
* type created elsewhere still open in the modal for name/PII edits. */
|
|
690
|
+
fieldModal?: FieldModalConfig;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/** A field type the add/edit field modal offers, with everything that type
|
|
694
|
+
* brings to it. Declare one entry per `patternsType` — the type is the entry's
|
|
695
|
+
* identity. Nothing here reaches the table or the filters; that is `fieldTypes`
|
|
696
|
+
* (`FieldTypeDefinition[]`). */
|
|
697
|
+
interface FieldTypeOption {
|
|
698
|
+
patternsType: PatternsFieldType;
|
|
699
|
+
/** Custom display name. Absent ⇒ the UI's standard name for this type. */
|
|
700
|
+
label?: string;
|
|
701
|
+
/** Custom name-input placeholder. Absent ⇒ the UI's standard placeholder. */
|
|
702
|
+
namePlaceholder?: string;
|
|
703
|
+
/** A one-line description shown under the type in the add-field menu. */
|
|
704
|
+
subtitle?: string;
|
|
705
|
+
/** The group heading this type is listed under in the add-field menu, in
|
|
706
|
+
* first-seen order. Types sharing a heading form one group. Absent ⇒
|
|
707
|
+
* ungrouped. */
|
|
708
|
+
group?: string;
|
|
709
|
+
/** Whether a field of this type can be marked PII. Absent ⇒ follows the
|
|
710
|
+
* source's `supportsPii`. */
|
|
711
|
+
supportsPii?: boolean;
|
|
712
|
+
/** Warning shown while the PII toggle is on. Read on every render, so it can
|
|
713
|
+
* use data that only exists once the schema has loaded. Default: none. */
|
|
714
|
+
piiWarning?: () => FieldPiiWarning | undefined;
|
|
715
|
+
/** This type's own part of the collapsible section in the add/edit field
|
|
716
|
+
* modal. Default: none. */
|
|
717
|
+
settingsSection?: FieldSettingsSection;
|
|
718
|
+
/** Collection picker shown in the main add/edit field form. */
|
|
719
|
+
collectionInput?: FieldModalCollectionInput;
|
|
720
|
+
}
|
|
721
|
+
/** Everything the add/edit field modal shows for this source. */
|
|
722
|
+
interface FieldModalInput {
|
|
723
|
+
/** Title and subtitle. Default: generic titles. */
|
|
724
|
+
text?: FieldModalText;
|
|
725
|
+
/** Default option loader for reference-like built-in field types. */
|
|
726
|
+
loadReferenceableCollectionOptions?: FieldModalCollectionOptionsLoader;
|
|
727
|
+
/** The types the modal offers, in display order. Default: none. */
|
|
728
|
+
types?: FieldTypeOption[];
|
|
729
|
+
}
|
|
730
|
+
/** Copy shown before deleting a field. Strings are translated by the caller. */
|
|
731
|
+
interface DeleteFieldConfirmation {
|
|
732
|
+
title: string;
|
|
733
|
+
description: string;
|
|
734
|
+
/** When provided, confirmation requires this checkbox to be checked. */
|
|
735
|
+
confirmationCheckboxLabel?: string;
|
|
736
|
+
}
|
|
737
|
+
/** Identifies the collection behind a table on BI events. */
|
|
738
|
+
interface SchemaBiParams {
|
|
739
|
+
tableId?: string;
|
|
740
|
+
tableName?: string;
|
|
741
|
+
tableType?: string;
|
|
742
|
+
}
|
|
743
|
+
/** What a caller passes. Only `collectionId` and `loadSchema` are required. */
|
|
744
|
+
interface SchemaSourceInput<T> {
|
|
745
|
+
collectionId: string;
|
|
746
|
+
loadSchema: () => Promise<LoadedSchema<T>>;
|
|
747
|
+
/** Sources for collections this one references, keyed by the referenced
|
|
748
|
+
* collection id. A renderer resolves a reference field through the matching
|
|
749
|
+
* entry — its `loadSchema` gives the referenced schema and `sourceFetchData`
|
|
750
|
+
* queries the referenced items. Default: none. */
|
|
751
|
+
references?: Record<string, SchemaSource<any>>;
|
|
752
|
+
/** Lazy source lookup for a referenced collection that is not in `references`.
|
|
753
|
+
* Is used when a reference field is created in the add field modal.
|
|
754
|
+
* The returned source owns its own async schema/item loading. */
|
|
755
|
+
getReferencedCollectionSource?: (collectionId: string) => SchemaSource<any> | undefined;
|
|
756
|
+
paginationMode?: 'offset';
|
|
757
|
+
/** Stable row identity. Default: `row[idField]`. */
|
|
758
|
+
itemKey?: (item: T) => string;
|
|
759
|
+
/** Row display label. Default: `row[displayField]`. */
|
|
760
|
+
itemName?: (item: T) => string;
|
|
761
|
+
/** Fields free-text search runs against. Default: `[displayField]`. */
|
|
762
|
+
searchableFieldIds?: (schema: Schema) => string[];
|
|
763
|
+
/** What the add/edit field modal shows. Default: no types, generic titles. */
|
|
764
|
+
fieldModal?: FieldModalInput;
|
|
765
|
+
/** Consumer-defined field types: how a field of that type renders, filters and
|
|
766
|
+
* validates wherever it appears. A field with `type: 'CUSTOM'` resolves its
|
|
767
|
+
* definition here by `customType`. The add/edit field modal never reads this
|
|
768
|
+
* — see `fieldModal`. Default: none. */
|
|
769
|
+
fieldTypes?: FieldTypeDefinition[];
|
|
770
|
+
/** Overrides one existing field's type label, icons and collection-picker
|
|
771
|
+
* label. Does not change its type, values or add-field options. */
|
|
772
|
+
getFieldPresentation?: (field: Field) => FieldPresentation | undefined;
|
|
773
|
+
/** Default: `schemaPermissions.createField`. */
|
|
774
|
+
canAddFields?: (schema: Schema) => boolean;
|
|
775
|
+
/** Default: `schemaPermissions.updateField`, except for system fields and
|
|
776
|
+
* the id field. */
|
|
777
|
+
canEditField?: (field: Field, schema: Schema) => boolean;
|
|
778
|
+
/** Default: `schemaPermissions.deleteField`, except for system fields and
|
|
779
|
+
* the id field. */
|
|
780
|
+
canDeleteField?: (field: Field, schema: Schema) => boolean;
|
|
781
|
+
/** Resolved when deletion is requested. Undefined keeps the default dialog. */
|
|
782
|
+
getDeleteFieldConfirmation?: (field: Field, schema: Schema) => DeleteFieldConfirmation | undefined;
|
|
783
|
+
/** Permission defaults shown in the modal. Absent ⇒ no permissions section. */
|
|
784
|
+
fieldPermissions?: FieldPermissions;
|
|
785
|
+
/** Default: `false`. */
|
|
786
|
+
supportsPii?: boolean;
|
|
787
|
+
/** The value of a field on an item. Default: `item[field.id]`. */
|
|
788
|
+
getFieldValue?: (item: T, field: Field) => unknown;
|
|
789
|
+
/** Writes a field's value on an item, returning the updated item.
|
|
790
|
+
* Default: `{ ...item, [field.id]: value }`. */
|
|
791
|
+
setFieldValue?: (item: T, field: Field, value: unknown) => T;
|
|
792
|
+
}
|
|
793
|
+
/** The resolved source: defaults filled, `loadSchema` memoized. */
|
|
794
|
+
/**
|
|
795
|
+
* `SchemaSource` — cut here because it has its own bundle.
|
|
796
|
+
* Full shape: `types/SchemaSource.d.ts`.
|
|
797
|
+
*/
|
|
798
|
+
interface SchemaSource<T = any> {
|
|
799
|
+
[key: string]: unknown;
|
|
800
|
+
}
|
|
801
|
+
/** The collection fetch derived from a source: loads once, then queries the
|
|
802
|
+
* backend's `find`.
|
|
803
|
+
*
|
|
804
|
+
* Free-text search covers the columns the page is showing: the table keeps
|
|
805
|
+
* `query.columns` in sync with them, so the scope comes off the query rather
|
|
806
|
+
* than being threaded in. Falls back to the source's own `searchableFieldIds`
|
|
807
|
+
* before any columns are known (or with no table attached). */
|
|
808
|
+
declare function sourceFetchData<T>(source: SchemaSource<T>): (query: OffsetQuery) => Promise<OffsetQueryResult<T>>;
|
|
809
|
+
/** Fills source-neutral defaults over `input` and memoizes the load so the collection
|
|
810
|
+
* query and the table columns share a single fetch. */
|
|
811
|
+
declare function defineSchemaSource<T>(input: SchemaSourceInput<T>): SchemaSource<T>;
|
|
812
|
+
|
|
813
|
+
export { defineSchemaSource, sourceFetchData };
|
|
814
|
+
export type { DeleteFieldConfirmation, FieldModalInput, FieldTypeOption, SchemaBiParams, SchemaSource, SchemaSourceInput };
|