@byline/ui 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/README.md +17 -0
- package/dist/admin/components/admin-account/change-password.d.ts +9 -0
- package/dist/admin/components/admin-account/change-password.d.ts.map +1 -0
- package/dist/admin/components/admin-account/change-password.js +192 -0
- package/dist/admin/components/admin-account/change-password.module.js +8 -0
- package/dist/admin/components/admin-account/change-password_module.css +27 -0
- package/dist/admin/components/admin-account/container.d.ts +30 -0
- package/dist/admin/components/admin-account/container.d.ts.map +1 -0
- package/dist/admin/components/admin-account/container.js +299 -0
- package/dist/admin/components/admin-account/container.module.js +28 -0
- package/dist/admin/components/admin-account/container_module.css +106 -0
- package/dist/admin/components/admin-account/update.d.ts +9 -0
- package/dist/admin/components/admin-account/update.d.ts.map +1 -0
- package/dist/admin/components/admin-account/update.js +207 -0
- package/dist/admin/components/admin-account/update.module.js +8 -0
- package/dist/admin/components/admin-account/update_module.css +27 -0
- package/dist/admin/components/admin-permissions/inspector.d.ts +5 -0
- package/dist/admin/components/admin-permissions/inspector.d.ts.map +1 -0
- package/dist/admin/components/admin-permissions/inspector.js +284 -0
- package/dist/admin/components/admin-permissions/inspector.module.js +56 -0
- package/dist/admin/components/admin-permissions/inspector_module.css +238 -0
- package/dist/admin/components/admin-roles/create.d.ts +8 -0
- package/dist/admin/components/admin-roles/create.d.ts.map +1 -0
- package/dist/admin/components/admin-roles/create.js +177 -0
- package/dist/admin/components/admin-roles/create.module.js +8 -0
- package/dist/admin/components/admin-roles/create_module.css +27 -0
- package/dist/admin/components/admin-roles/permissions.d.ts +11 -0
- package/dist/admin/components/admin-roles/permissions.d.ts.map +1 -0
- package/dist/admin/components/admin-roles/permissions.js +303 -0
- package/dist/admin/components/admin-roles/permissions.module.js +44 -0
- package/dist/admin/components/admin-roles/permissions_module.css +192 -0
- package/dist/admin/components/admin-roles/update.d.ts +9 -0
- package/dist/admin/components/admin-roles/update.d.ts.map +1 -0
- package/dist/admin/components/admin-roles/update.js +166 -0
- package/dist/admin/components/admin-roles/update.module.js +8 -0
- package/dist/admin/components/admin-roles/update_module.css +27 -0
- package/dist/admin/components/admin-users/create.d.ts +9 -0
- package/dist/admin/components/admin-users/create.d.ts.map +1 -0
- package/dist/admin/components/admin-users/create.js +268 -0
- package/dist/admin/components/admin-users/create.module.js +10 -0
- package/dist/admin/components/admin-users/create_module.css +45 -0
- package/dist/admin/components/admin-users/roles.d.ts +12 -0
- package/dist/admin/components/admin-users/roles.d.ts.map +1 -0
- package/dist/admin/components/admin-users/roles.js +148 -0
- package/dist/admin/components/admin-users/roles.module.js +18 -0
- package/dist/admin/components/admin-users/roles_module.css +75 -0
- package/dist/admin/components/admin-users/set-password.d.ts +9 -0
- package/dist/admin/components/admin-users/set-password.d.ts.map +1 -0
- package/dist/admin/components/admin-users/set-password.js +170 -0
- package/dist/admin/components/admin-users/set-password.module.js +9 -0
- package/dist/admin/components/admin-users/set-password_module.css +31 -0
- package/dist/admin/components/admin-users/update.d.ts +9 -0
- package/dist/admin/components/admin-users/update.d.ts.map +1 -0
- package/dist/admin/components/admin-users/update.js +254 -0
- package/dist/admin/components/admin-users/update.module.js +9 -0
- package/dist/admin/components/admin-users/update_module.css +34 -0
- package/dist/admin/components/auth/sign-in-form.d.ts +14 -0
- package/dist/admin/components/auth/sign-in-form.d.ts.map +1 -0
- package/dist/admin/components/auth/sign-in-form.js +107 -0
- package/dist/admin/components/auth/sign-in-form.module.js +10 -0
- package/dist/admin/components/auth/sign-in-form_module.css +35 -0
- package/dist/admin/components/collections/diff-modal.d.ts +23 -0
- package/dist/admin/components/collections/diff-modal.d.ts.map +1 -0
- package/dist/admin/components/collections/diff-modal.js +147 -0
- package/dist/admin/components/collections/diff-modal.module.js +14 -0
- package/dist/admin/components/collections/diff-modal_module.css +56 -0
- package/dist/admin/components/collections/status-badge.d.ts +26 -0
- package/dist/admin/components/collections/status-badge.d.ts.map +1 -0
- package/dist/admin/components/collections/status-badge.js +35 -0
- package/dist/admin/components/collections/status-badge.module.js +7 -0
- package/dist/admin/components/collections/status-badge_module.css +20 -0
- package/dist/admin/group.d.ts +28 -0
- package/dist/admin/group.d.ts.map +1 -0
- package/dist/admin/group.js +14 -0
- package/dist/admin/group.module.js +6 -0
- package/dist/admin/group_module.css +19 -0
- package/dist/admin/row.d.ts +26 -0
- package/dist/admin/row.d.ts.map +1 -0
- package/dist/admin/row.js +8 -0
- package/dist/admin/row.module.js +5 -0
- package/dist/admin/row_module.css +18 -0
- package/dist/admin/tabs.d.ts +33 -0
- package/dist/admin/tabs.d.ts.map +1 -0
- package/dist/admin/tabs.js +34 -0
- package/dist/admin/tabs.module.js +10 -0
- package/dist/admin/tabs_module.css +68 -0
- package/dist/dnd/draggable-sortable/demo/draggable-list-demo.js +105 -0
- package/dist/dnd/draggable-sortable/demo/draggable-list-demo.module.js +12 -0
- package/dist/dnd/draggable-sortable/demo/draggable-list-demo_module.css +39 -0
- package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts +19 -0
- package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/draggable-sortable-item/index.js +27 -0
- package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts +25 -0
- package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/draggable-sortable-item/types.js +1 -0
- package/dist/dnd/draggable-sortable/draggable-sortable.d.ts +17 -0
- package/dist/dnd/draggable-sortable/draggable-sortable.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/draggable-sortable.js +46 -0
- package/dist/dnd/draggable-sortable/index.d.ts +5 -0
- package/dist/dnd/draggable-sortable/index.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/index.js +4 -0
- package/dist/dnd/draggable-sortable/types.d.ts +26 -0
- package/dist/dnd/draggable-sortable/types.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/types.js +1 -0
- package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts +16 -0
- package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/use-draggable-sortable/index.js +28 -0
- package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts +23 -0
- package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/use-draggable-sortable/types.js +1 -0
- package/dist/dnd/draggable-sortable/utils.d.ts +14 -0
- package/dist/dnd/draggable-sortable/utils.d.ts.map +1 -0
- package/dist/dnd/draggable-sortable/utils.js +10 -0
- package/dist/fields/array/array-field.d.ts +15 -0
- package/dist/fields/array/array-field.d.ts.map +1 -0
- package/dist/fields/array/array-field.js +176 -0
- package/dist/fields/array/array-field.module.js +11 -0
- package/dist/fields/array/array-field_module.css +32 -0
- package/dist/fields/blocks/blocks-field.d.ts +14 -0
- package/dist/fields/blocks/blocks-field.d.ts.map +1 -0
- package/dist/fields/blocks/blocks-field.js +244 -0
- package/dist/fields/blocks/blocks-field.module.js +26 -0
- package/dist/fields/blocks/blocks-field_module.css +107 -0
- package/dist/fields/checkbox/checkbox-field.d.ts +17 -0
- package/dist/fields/checkbox/checkbox-field.d.ts.map +1 -0
- package/dist/fields/checkbox/checkbox-field.js +27 -0
- package/dist/fields/column-formatter.d.ts +21 -0
- package/dist/fields/column-formatter.d.ts.map +1 -0
- package/dist/fields/column-formatter.js +15 -0
- package/dist/fields/date-time-formatter.d.ts +17 -0
- package/dist/fields/date-time-formatter.d.ts.map +1 -0
- package/dist/fields/date-time-formatter.js +8 -0
- package/dist/fields/datetime/datetime-field.d.ts +17 -0
- package/dist/fields/datetime/datetime-field.d.ts.map +1 -0
- package/dist/fields/datetime/datetime-field.js +37 -0
- package/dist/fields/datetime/datetime-field.module.js +5 -0
- package/dist/fields/datetime/datetime-field_module.css +4 -0
- package/dist/fields/draggable-context-menu.d.ts +7 -0
- package/dist/fields/draggable-context-menu.d.ts.map +1 -0
- package/dist/fields/draggable-context-menu.js +83 -0
- package/dist/fields/draggable-context-menu.module.js +15 -0
- package/dist/fields/draggable-context-menu_module.css +91 -0
- package/dist/fields/field-helpers.d.ts +27 -0
- package/dist/fields/field-helpers.d.ts.map +1 -0
- package/dist/fields/field-helpers.js +48 -0
- package/dist/fields/field-renderer.d.ts +31 -0
- package/dist/fields/field-renderer.d.ts.map +1 -0
- package/dist/fields/field-renderer.js +189 -0
- package/dist/fields/field-renderer.module.js +8 -0
- package/dist/fields/field-renderer_module.css +11 -0
- package/dist/fields/file/file-field.d.ts +18 -0
- package/dist/fields/file/file-field.d.ts.map +1 -0
- package/dist/fields/file/file-field.js +125 -0
- package/dist/fields/file/file-field.module.js +13 -0
- package/dist/fields/file/file-field_module.css +64 -0
- package/dist/fields/group/group-field.d.ts +16 -0
- package/dist/fields/group/group-field.d.ts.map +1 -0
- package/dist/fields/group/group-field.js +59 -0
- package/dist/fields/group/group-field.module.js +9 -0
- package/dist/fields/group/group-field_module.css +27 -0
- package/dist/fields/image/image-field.d.ts +20 -0
- package/dist/fields/image/image-field.d.ts.map +1 -0
- package/dist/fields/image/image-field.js +198 -0
- package/dist/fields/image/image-field.module.js +21 -0
- package/dist/fields/image/image-field_module.css +96 -0
- package/dist/fields/image/image-upload-field.d.ts +22 -0
- package/dist/fields/image/image-upload-field.d.ts.map +1 -0
- package/dist/fields/image/image-upload-field.js +187 -0
- package/dist/fields/image/image-upload-field.module.js +19 -0
- package/dist/fields/image/image-upload-field_module.css +92 -0
- package/dist/fields/local-date-time.d.ts +28 -0
- package/dist/fields/local-date-time.d.ts.map +1 -0
- package/dist/fields/local-date-time.js +49 -0
- package/dist/fields/locale-badge.d.ts +19 -0
- package/dist/fields/locale-badge.d.ts.map +1 -0
- package/dist/fields/locale-badge.js +10 -0
- package/dist/fields/locale-badge.module.js +5 -0
- package/dist/fields/locale-badge_module.css +27 -0
- package/dist/fields/numerical/numerical-field.d.ts +19 -0
- package/dist/fields/numerical/numerical-field.d.ts.map +1 -0
- package/dist/fields/numerical/numerical-field.js +73 -0
- package/dist/fields/relation/relation-display.d.ts +41 -0
- package/dist/fields/relation/relation-display.d.ts.map +1 -0
- package/dist/fields/relation/relation-display.js +58 -0
- package/dist/fields/relation/relation-display.module.js +9 -0
- package/dist/fields/relation/relation-display_module.css +21 -0
- package/dist/fields/relation/relation-field.d.ts +19 -0
- package/dist/fields/relation/relation-field.d.ts.map +1 -0
- package/dist/fields/relation/relation-field.js +133 -0
- package/dist/fields/relation/relation-field.module.js +13 -0
- package/dist/fields/relation/relation-field_module.css +62 -0
- package/dist/fields/relation/relation-picker.d.ts +50 -0
- package/dist/fields/relation/relation-picker.d.ts.map +1 -0
- package/dist/fields/relation/relation-picker.js +233 -0
- package/dist/fields/relation/relation-picker.module.js +26 -0
- package/dist/fields/relation/relation-picker_module.css +124 -0
- package/dist/fields/relation/relation-summary.d.ts +32 -0
- package/dist/fields/relation/relation-summary.d.ts.map +1 -0
- package/dist/fields/relation/relation-summary.js +50 -0
- package/dist/fields/relation/relation-summary.module.js +11 -0
- package/dist/fields/relation/relation-summary_module.css +37 -0
- package/dist/fields/select/select-field.d.ts +17 -0
- package/dist/fields/select/select-field.d.ts.map +1 -0
- package/dist/fields/select/select-field.js +42 -0
- package/dist/fields/select/select-field.module.js +5 -0
- package/dist/fields/select/select-field_module.css +4 -0
- package/dist/fields/sortable-item.d.ts +16 -0
- package/dist/fields/sortable-item.d.ts.map +1 -0
- package/dist/fields/sortable-item.js +80 -0
- package/dist/fields/sortable-item.module.js +22 -0
- package/dist/fields/sortable-item_module.css +124 -0
- package/dist/fields/text/text-field.d.ts +21 -0
- package/dist/fields/text/text-field.d.ts.map +1 -0
- package/dist/fields/text/text-field.js +104 -0
- package/dist/fields/text/text-field.module.js +6 -0
- package/dist/fields/text/text-field_module.css +5 -0
- package/dist/fields/text-area/text-area-field.d.ts +21 -0
- package/dist/fields/text-area/text-area-field.d.ts.map +1 -0
- package/dist/fields/text-area/text-area-field.js +105 -0
- package/dist/fields/text-area/text-area-field.module.js +6 -0
- package/dist/fields/text-area/text-area-field_module.css +5 -0
- package/dist/fields/use-field-change-handler.d.ts +24 -0
- package/dist/fields/use-field-change-handler.d.ts.map +1 -0
- package/dist/fields/use-field-change-handler.js +52 -0
- package/dist/forms/document-actions.d.ts +14 -0
- package/dist/forms/document-actions.d.ts.map +1 -0
- package/dist/forms/document-actions.js +153 -0
- package/dist/forms/document-actions.module.js +18 -0
- package/dist/forms/document-actions_module.css +66 -0
- package/dist/forms/form-context.d.ts +78 -0
- package/dist/forms/form-context.d.ts.map +1 -0
- package/dist/forms/form-context.js +420 -0
- package/dist/forms/form-renderer.d.ts +66 -0
- package/dist/forms/form-renderer.d.ts.map +1 -0
- package/dist/forms/form-renderer.js +555 -0
- package/dist/forms/form-renderer.module.js +46 -0
- package/dist/forms/form-renderer_module.css +242 -0
- package/dist/forms/navigation-guard.d.ts +55 -0
- package/dist/forms/navigation-guard.d.ts.map +1 -0
- package/dist/forms/navigation-guard.js +22 -0
- package/dist/forms/path-widget.d.ts +33 -0
- package/dist/forms/path-widget.d.ts.map +1 -0
- package/dist/forms/path-widget.js +101 -0
- package/dist/forms/path-widget.module.js +8 -0
- package/dist/forms/path-widget_module.css +29 -0
- package/dist/forms/upload-executor.d.ts +58 -0
- package/dist/forms/upload-executor.d.ts.map +1 -0
- package/dist/forms/upload-executor.js +92 -0
- package/dist/react.d.ts +55 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +48 -0
- package/dist/services/admin-services-context.d.ts +17 -0
- package/dist/services/admin-services-context.d.ts.map +1 -0
- package/dist/services/admin-services-context.js +13 -0
- package/dist/services/admin-services-types.d.ts +130 -0
- package/dist/services/admin-services-types.d.ts.map +1 -0
- package/dist/services/admin-services-types.js +1 -0
- package/dist/services/field-services-context.d.ts +17 -0
- package/dist/services/field-services-context.d.ts.map +1 -0
- package/dist/services/field-services-context.js +13 -0
- package/dist/services/field-services-types.d.ts +64 -0
- package/dist/services/field-services-types.d.ts.map +1 -0
- package/dist/services/field-services-types.js +1 -0
- package/package.json +133 -0
- package/src/admin/components/admin-account/change-password.module.css +40 -0
- package/src/admin/components/admin-account/change-password.tsx +232 -0
- package/src/admin/components/admin-account/container.module.css +158 -0
- package/src/admin/components/admin-account/container.tsx +230 -0
- package/src/admin/components/admin-account/update.module.css +40 -0
- package/src/admin/components/admin-account/update.tsx +263 -0
- package/src/admin/components/admin-permissions/inspector.module.css +326 -0
- package/src/admin/components/admin-permissions/inspector.tsx +298 -0
- package/src/admin/components/admin-roles/create.module.css +40 -0
- package/src/admin/components/admin-roles/create.tsx +218 -0
- package/src/admin/components/admin-roles/permissions.module.css +279 -0
- package/src/admin/components/admin-roles/permissions.tsx +396 -0
- package/src/admin/components/admin-roles/update.module.css +40 -0
- package/src/admin/components/admin-roles/update.tsx +218 -0
- package/src/admin/components/admin-users/create.module.css +63 -0
- package/src/admin/components/admin-users/create.tsx +323 -0
- package/src/admin/components/admin-users/roles.module.css +119 -0
- package/src/admin/components/admin-users/roles.tsx +172 -0
- package/src/admin/components/admin-users/set-password.module.css +46 -0
- package/src/admin/components/admin-users/set-password.tsx +199 -0
- package/src/admin/components/admin-users/update.module.css +49 -0
- package/src/admin/components/admin-users/update.tsx +328 -0
- package/src/admin/components/auth/sign-in-form.module.css +53 -0
- package/src/admin/components/auth/sign-in-form.tsx +118 -0
- package/src/admin/components/collections/diff-modal.module.css +79 -0
- package/src/admin/components/collections/diff-modal.tsx +171 -0
- package/src/admin/components/collections/status-badge.module.css +31 -0
- package/src/admin/components/collections/status-badge.tsx +69 -0
- package/src/admin/group.module.css +41 -0
- package/src/admin/group.tsx +40 -0
- package/src/admin/row.module.css +32 -0
- package/src/admin/row.tsx +33 -0
- package/src/admin/tabs.module.css +107 -0
- package/src/admin/tabs.tsx +74 -0
- package/src/declarations.d.ts +4 -0
- package/src/dnd/draggable-sortable/demo/draggable-list-demo.module.css +65 -0
- package/src/dnd/draggable-sortable/demo/draggable-list-demo.tsx +117 -0
- package/src/dnd/draggable-sortable/draggable-sortable-item/index.tsx +54 -0
- package/src/dnd/draggable-sortable/draggable-sortable-item/types.ts +30 -0
- package/src/dnd/draggable-sortable/draggable-sortable.tsx +86 -0
- package/src/dnd/draggable-sortable/index.ts +5 -0
- package/src/dnd/draggable-sortable/types.ts +24 -0
- package/src/dnd/draggable-sortable/use-draggable-sortable/index.tsx +50 -0
- package/src/dnd/draggable-sortable/use-draggable-sortable/types.ts +25 -0
- package/src/dnd/draggable-sortable/utils.ts +29 -0
- package/src/fields/array/array-field.module.css +48 -0
- package/src/fields/array/array-field.tsx +266 -0
- package/src/fields/blocks/blocks-field.module.css +148 -0
- package/src/fields/blocks/blocks-field.tsx +312 -0
- package/src/fields/checkbox/checkbox-field.tsx +53 -0
- package/src/fields/column-formatter.tsx +31 -0
- package/src/fields/date-time-formatter.tsx +22 -0
- package/src/fields/datetime/datetime-field.module.css +13 -0
- package/src/fields/datetime/datetime-field.tsx +54 -0
- package/src/fields/draggable-context-menu.module.css +127 -0
- package/src/fields/draggable-context-menu.tsx +85 -0
- package/src/fields/field-helpers.ts +66 -0
- package/src/fields/field-renderer.module.css +22 -0
- package/src/fields/field-renderer.tsx +255 -0
- package/src/fields/file/file-field.module.css +88 -0
- package/src/fields/file/file-field.tsx +107 -0
- package/src/fields/group/group-field.module.css +43 -0
- package/src/fields/group/group-field.tsx +84 -0
- package/src/fields/image/image-field.module.css +129 -0
- package/src/fields/image/image-field.tsx +212 -0
- package/src/fields/image/image-upload-field.module.css +123 -0
- package/src/fields/image/image-upload-field.tsx +270 -0
- package/src/fields/local-date-time.tsx +88 -0
- package/src/fields/locale-badge.module.css +37 -0
- package/src/fields/locale-badge.tsx +32 -0
- package/src/fields/numerical/numerical-field.tsx +112 -0
- package/src/fields/relation/relation-display.module.css +36 -0
- package/src/fields/relation/relation-display.tsx +130 -0
- package/src/fields/relation/relation-field.module.css +83 -0
- package/src/fields/relation/relation-field.tsx +202 -0
- package/src/fields/relation/relation-picker.module.css +168 -0
- package/src/fields/relation/relation-picker.tsx +325 -0
- package/src/fields/relation/relation-summary.module.css +55 -0
- package/src/fields/relation/relation-summary.tsx +123 -0
- package/src/fields/select/select-field.module.css +13 -0
- package/src/fields/select/select-field.tsx +56 -0
- package/src/fields/sortable-item.module.css +167 -0
- package/src/fields/sortable-item.tsx +101 -0
- package/src/fields/text/text-field.module.css +13 -0
- package/src/fields/text/text-field.tsx +146 -0
- package/src/fields/text-area/text-area-field.module.css +13 -0
- package/src/fields/text-area/text-area-field.tsx +147 -0
- package/src/fields/use-field-change-handler.ts +112 -0
- package/src/forms/document-actions.module.css +94 -0
- package/src/forms/document-actions.tsx +149 -0
- package/src/forms/form-context.tsx +620 -0
- package/src/forms/form-renderer.module.css +318 -0
- package/src/forms/form-renderer.tsx +786 -0
- package/src/forms/navigation-guard.tsx +98 -0
- package/src/forms/path-widget.module.css +41 -0
- package/src/forms/path-widget.test.tsx +217 -0
- package/src/forms/path-widget.tsx +141 -0
- package/src/forms/upload-executor.ts +190 -0
- package/src/react.ts +79 -0
- package/src/services/admin-services-context.tsx +35 -0
- package/src/services/admin-services-types.ts +177 -0
- package/src/services/field-services-context.tsx +35 -0
- package/src/services/field-services-types.ts +68 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
import type { CollectionDefinition, ColumnDefinition } from '@byline/core';
|
|
9
|
+
/**
|
|
10
|
+
* Render a single row cell from a `ColumnDefinition`, reading the value
|
|
11
|
+
* from the document's `fields` (with a fallback to top-level metadata like
|
|
12
|
+
* `status`, `updated_at`, `path`). Honours both formatter shapes — plain
|
|
13
|
+
* function → its return value, `{ component }` → the component is rendered.
|
|
14
|
+
*/
|
|
15
|
+
export declare function PickerCell({ column, record, }: {
|
|
16
|
+
column: ColumnDefinition;
|
|
17
|
+
record: Record<string, any>;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
/** First top-level `text` field name on a collection, or null. */
|
|
20
|
+
export declare function resolveFallbackDisplayField(def: CollectionDefinition | null | undefined): string | null;
|
|
21
|
+
/** Resolve the row's primary label text from the document. */
|
|
22
|
+
export declare function resolveRowLabel(doc: Record<string, any> | null | undefined, displayField: string | null): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Build the `fields` projection for the picker listing. Unions:
|
|
25
|
+
* - caller-supplied `displayField`
|
|
26
|
+
* - target schema's `useAsTitle` (always included, even when not visible)
|
|
27
|
+
* - every `fieldName` declared in the admin config's `picker` columns
|
|
28
|
+
* - `title` (metadata fallback for rows with no explicit picker columns)
|
|
29
|
+
*
|
|
30
|
+
* Note that the document `path` is top-level metadata on every list response
|
|
31
|
+
* — it is always returned by `getCollectionDocuments` regardless of the
|
|
32
|
+
* `fields` projection. Callers that need `{ title, path }` for downstream
|
|
33
|
+
* normalisation (e.g. the rich-text link plugin) can rely on:
|
|
34
|
+
* - `record.fields[def.useAsTitle]` for the title
|
|
35
|
+
* - `record.path` for the path
|
|
36
|
+
*
|
|
37
|
+
* Returns `undefined` when no target definition is available, leaving the
|
|
38
|
+
* listing endpoint to decide its own default projection.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveSelectFields(def: CollectionDefinition | null | undefined, displayField: string | undefined, pickerColumns: ColumnDefinition[] | undefined): string[] | undefined;
|
|
41
|
+
//# sourceMappingURL=relation-display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-display.d.ts","sourceRoot":"","sources":["../../../src/fields/relation/relation-display.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAW1E;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,MAAM,GACP,EAAE;IACD,MAAM,EAAE,gBAAgB,CAAA;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC5B,+BAiCA;AAED,kEAAkE;AAClE,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAC3C,MAAM,GAAG,IAAI,CAIf;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3C,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,GAAG,IAAI,CAWf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EAC5C,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,aAAa,EAAE,gBAAgB,EAAE,GAAG,SAAS,GAC5C,MAAM,EAAE,GAAG,SAAS,CAgBtB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import classnames from "classnames";
|
|
3
|
+
import relation_display_module from "./relation-display.module.js";
|
|
4
|
+
function PickerCell({ column, record }) {
|
|
5
|
+
const name = String(column.fieldName);
|
|
6
|
+
const value = record?.fields?.[name] ?? record?.[name];
|
|
7
|
+
let content;
|
|
8
|
+
if (column.formatter) if ('function' == typeof column.formatter) content = column.formatter(value, record);
|
|
9
|
+
else {
|
|
10
|
+
const Comp = column.formatter.component;
|
|
11
|
+
content = /*#__PURE__*/ jsx(Comp, {
|
|
12
|
+
value: value,
|
|
13
|
+
record: record
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else content = null == value ? null : 'string' == typeof value || 'number' == typeof value || 'boolean' == typeof value ? String(value) : null;
|
|
17
|
+
return /*#__PURE__*/ jsx("div", {
|
|
18
|
+
className: classnames('byline-relation-cell', relation_display_module.cell, 'center' === column.align && [
|
|
19
|
+
'byline-relation-cell-center',
|
|
20
|
+
relation_display_module["cell-center"]
|
|
21
|
+
], 'right' === column.align && [
|
|
22
|
+
'byline-relation-cell-right',
|
|
23
|
+
relation_display_module["cell-right"]
|
|
24
|
+
], column.className),
|
|
25
|
+
children: content
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function resolveFallbackDisplayField(def) {
|
|
29
|
+
if (!def) return null;
|
|
30
|
+
const textField = def.fields.find((f)=>'text' === f.type);
|
|
31
|
+
return textField?.name ?? null;
|
|
32
|
+
}
|
|
33
|
+
function resolveRowLabel(doc, displayField) {
|
|
34
|
+
if (!doc) return null;
|
|
35
|
+
if (displayField) {
|
|
36
|
+
const v = doc.fields?.[displayField];
|
|
37
|
+
if ('string' == typeof v && v.length > 0) return v;
|
|
38
|
+
}
|
|
39
|
+
if ('string' == typeof doc.fields?.title && doc.fields.title.length > 0) return doc.fields.title;
|
|
40
|
+
if ('string' == typeof doc.path && doc.path.length > 0) return doc.path;
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function resolveSelectFields(def, displayField, pickerColumns) {
|
|
44
|
+
if (!def) return;
|
|
45
|
+
const out = new Set();
|
|
46
|
+
if (displayField) out.add(displayField);
|
|
47
|
+
if (def.useAsTitle) out.add(def.useAsTitle);
|
|
48
|
+
const fallback = resolveFallbackDisplayField(def);
|
|
49
|
+
if (fallback) out.add(fallback);
|
|
50
|
+
if (pickerColumns) for (const col of pickerColumns){
|
|
51
|
+
const name = String(col.fieldName);
|
|
52
|
+
if (def.fields.some((f)=>f.name === name)) out.add(name);
|
|
53
|
+
}
|
|
54
|
+
if (def.fields.some((f)=>'title' === f.name)) out.add('title');
|
|
55
|
+
if (0 === out.size) return;
|
|
56
|
+
return Array.from(out);
|
|
57
|
+
}
|
|
58
|
+
export { PickerCell, resolveFallbackDisplayField, resolveRowLabel, resolveSelectFields };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "./relation-display_module.css";
|
|
2
|
+
const relation_display_module = {
|
|
3
|
+
cell: "cell-ax9SO1",
|
|
4
|
+
"cell-center": "cell-center-DhmZOy",
|
|
5
|
+
cellCenter: "cell-center-DhmZOy",
|
|
6
|
+
"cell-right": "cell-right-GKn6SW",
|
|
7
|
+
cellRight: "cell-right-GKn6SW"
|
|
8
|
+
};
|
|
9
|
+
export default relation_display_module;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
:is(.cell-ax9SO1, .byline-relation-cell) {
|
|
2
|
+
min-width: 0;
|
|
3
|
+
color: var(--gray-700);
|
|
4
|
+
font-size: var(--font-size-sm);
|
|
5
|
+
text-overflow: ellipsis;
|
|
6
|
+
white-space: nowrap;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
:is(.cell-center-DhmZOy, .byline-relation-cell-center) {
|
|
11
|
+
text-align: center;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:is(.cell-right-GKn6SW, .byline-relation-cell-right) {
|
|
15
|
+
text-align: right;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
:is(:is([data-theme="dark"], .dark) .cell-ax9SO1, :is([data-theme="dark"], .dark) .byline-relation-cell) {
|
|
19
|
+
color: var(--gray-100);
|
|
20
|
+
}
|
|
21
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
import type { RelationField as FieldType, RelatedDocumentValue } from '@byline/core';
|
|
9
|
+
interface RelationFieldProps {
|
|
10
|
+
field: FieldType;
|
|
11
|
+
value?: RelatedDocumentValue | null;
|
|
12
|
+
defaultValue?: RelatedDocumentValue | null;
|
|
13
|
+
onChange?: (value: RelatedDocumentValue | null) => void;
|
|
14
|
+
id?: string;
|
|
15
|
+
path?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const RelationField: ({ field, value, defaultValue, onChange, id, path, }: RelationFieldProps) => import("react").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=relation-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-field.d.ts","sourceRoot":"","sources":["../../../src/fields/relation/relation-field.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAGV,aAAa,IAAI,SAAS,EAC1B,oBAAoB,EACrB,MAAM,cAAc,CAAA;AAyBrB,UAAU,kBAAkB;IAC1B,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IACnC,YAAY,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,KAAK,IAAI,CAAA;IACvD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,aAAa,GAAI,qDAO3B,kBAAkB,gCAiJpB,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { getCollectionAdminConfig, getCollectionDefinition } from "@byline/core";
|
|
4
|
+
import { Button, ErrorText, Label } from "@infonomic/uikit/react";
|
|
5
|
+
import classnames from "classnames";
|
|
6
|
+
import { useFieldError, useFieldValue } from "../../forms/form-context.js";
|
|
7
|
+
import relation_field_module from "./relation-field.module.js";
|
|
8
|
+
import { RelationPicker } from "./relation-picker.js";
|
|
9
|
+
import { RelationSummary } from "./relation-summary.js";
|
|
10
|
+
const RelationField = ({ field, value, defaultValue, onChange, id, path })=>{
|
|
11
|
+
const fieldPath = path ?? field.name;
|
|
12
|
+
const htmlId = id ?? fieldPath;
|
|
13
|
+
const fieldError = useFieldError(fieldPath);
|
|
14
|
+
const fieldValue = useFieldValue(fieldPath);
|
|
15
|
+
const incomingValue = void 0 !== fieldValue ? fieldValue ?? null : value ?? defaultValue ?? null;
|
|
16
|
+
const targetDef = getCollectionDefinition(field.targetCollection);
|
|
17
|
+
const targetAdminConfig = getCollectionAdminConfig(field.targetCollection);
|
|
18
|
+
const [pickerOpen, setPickerOpen] = useState(false);
|
|
19
|
+
const [pickedRecord, setPickedRecord] = useState(null);
|
|
20
|
+
const handleSelect = (selection)=>{
|
|
21
|
+
setPickerOpen(false);
|
|
22
|
+
selection.record ? setPickedRecord({
|
|
23
|
+
id: selection.targetDocumentId,
|
|
24
|
+
record: selection.record
|
|
25
|
+
}) : setPickedRecord(null);
|
|
26
|
+
onChange?.({
|
|
27
|
+
targetDocumentId: selection.targetDocumentId,
|
|
28
|
+
targetCollectionId: selection.targetCollectionId
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
const handleRemove = ()=>{
|
|
32
|
+
setPickedRecord(null);
|
|
33
|
+
onChange?.(null);
|
|
34
|
+
};
|
|
35
|
+
const cachedRecord = pickedRecord && incomingValue && pickedRecord.id === incomingValue.targetDocumentId ? pickedRecord.record : null;
|
|
36
|
+
const isUnknown = null == targetDef;
|
|
37
|
+
const monoClass = classnames('byline-field-relation-mono', relation_field_module.mono);
|
|
38
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
39
|
+
className: `byline-field-relation ${field.name}`,
|
|
40
|
+
children: [
|
|
41
|
+
/*#__PURE__*/ jsxs("div", {
|
|
42
|
+
className: classnames('byline-field-relation-header', relation_field_module.header),
|
|
43
|
+
children: [
|
|
44
|
+
/*#__PURE__*/ jsx(Label, {
|
|
45
|
+
id: `${htmlId}-label`,
|
|
46
|
+
htmlFor: htmlId,
|
|
47
|
+
label: field.label ?? field.name,
|
|
48
|
+
required: !field.optional
|
|
49
|
+
}),
|
|
50
|
+
incomingValue && !isUnknown && /*#__PURE__*/ jsx("button", {
|
|
51
|
+
type: "button",
|
|
52
|
+
className: classnames('byline-field-relation-remove', relation_field_module.remove),
|
|
53
|
+
onClick: handleRemove,
|
|
54
|
+
children: "Remove"
|
|
55
|
+
})
|
|
56
|
+
]
|
|
57
|
+
}),
|
|
58
|
+
field.helpText && /*#__PURE__*/ jsx("div", {
|
|
59
|
+
className: classnames('byline-field-relation-help', relation_field_module.help),
|
|
60
|
+
children: field.helpText
|
|
61
|
+
}),
|
|
62
|
+
isUnknown ? /*#__PURE__*/ jsxs("div", {
|
|
63
|
+
className: classnames('byline-field-relation-error-tile', relation_field_module["error-tile"]),
|
|
64
|
+
children: [
|
|
65
|
+
/*#__PURE__*/ jsxs("span", {
|
|
66
|
+
children: [
|
|
67
|
+
"Relation field ",
|
|
68
|
+
/*#__PURE__*/ jsx("code", {
|
|
69
|
+
className: monoClass,
|
|
70
|
+
children: field.name
|
|
71
|
+
}),
|
|
72
|
+
" targets unknown collection ",
|
|
73
|
+
/*#__PURE__*/ jsx("code", {
|
|
74
|
+
className: monoClass,
|
|
75
|
+
children: field.targetCollection
|
|
76
|
+
}),
|
|
77
|
+
"."
|
|
78
|
+
]
|
|
79
|
+
}),
|
|
80
|
+
/*#__PURE__*/ jsx("span", {
|
|
81
|
+
className: classnames('byline-field-relation-error-text', relation_field_module["error-text"]),
|
|
82
|
+
children: "Register the collection in your Byline config or correct the target path."
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
}) : incomingValue ? /*#__PURE__*/ jsxs("div", {
|
|
86
|
+
className: classnames('byline-field-relation-tile', relation_field_module.tile),
|
|
87
|
+
children: [
|
|
88
|
+
/*#__PURE__*/ jsx(RelationSummary, {
|
|
89
|
+
targetDefinition: targetDef,
|
|
90
|
+
targetAdminConfig: targetAdminConfig,
|
|
91
|
+
displayField: field.displayField,
|
|
92
|
+
value: incomingValue,
|
|
93
|
+
cachedRecord: cachedRecord
|
|
94
|
+
}),
|
|
95
|
+
/*#__PURE__*/ jsx(Button, {
|
|
96
|
+
id: htmlId,
|
|
97
|
+
size: "xs",
|
|
98
|
+
variant: "outlined",
|
|
99
|
+
intent: "noeffect",
|
|
100
|
+
type: "button",
|
|
101
|
+
onClick: ()=>setPickerOpen(true),
|
|
102
|
+
children: "Change"
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
}) : /*#__PURE__*/ jsxs(Button, {
|
|
106
|
+
id: htmlId,
|
|
107
|
+
size: "xs",
|
|
108
|
+
variant: "outlined",
|
|
109
|
+
intent: "noeffect",
|
|
110
|
+
type: "button",
|
|
111
|
+
onClick: ()=>setPickerOpen(true),
|
|
112
|
+
children: [
|
|
113
|
+
"Select ",
|
|
114
|
+
targetDef.labels.singular,
|
|
115
|
+
"…"
|
|
116
|
+
]
|
|
117
|
+
}),
|
|
118
|
+
fieldError && /*#__PURE__*/ jsx(ErrorText, {
|
|
119
|
+
id: `${field.name}-error`,
|
|
120
|
+
text: fieldError
|
|
121
|
+
}),
|
|
122
|
+
!isUnknown && /*#__PURE__*/ jsx(RelationPicker, {
|
|
123
|
+
targetCollectionPath: field.targetCollection,
|
|
124
|
+
targetDefinition: targetDef,
|
|
125
|
+
displayField: field.displayField,
|
|
126
|
+
isOpen: pickerOpen,
|
|
127
|
+
onSelect: handleSelect,
|
|
128
|
+
onDismiss: ()=>setPickerOpen(false)
|
|
129
|
+
})
|
|
130
|
+
]
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
export { RelationField };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "./relation-field_module.css";
|
|
2
|
+
const relation_field_module = {
|
|
3
|
+
header: "header-y7lSnb",
|
|
4
|
+
remove: "remove-po_DBR",
|
|
5
|
+
help: "help-DEGVPH",
|
|
6
|
+
"error-tile": "error-tile-y2kiiq",
|
|
7
|
+
errorTile: "error-tile-y2kiiq",
|
|
8
|
+
"error-text": "error-text-jHQh34",
|
|
9
|
+
errorText: "error-text-jHQh34",
|
|
10
|
+
tile: "tile-Y3_yre",
|
|
11
|
+
mono: "mono-y8Xo6b"
|
|
12
|
+
};
|
|
13
|
+
export default relation_field_module;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
:is(.header-y7lSnb, .byline-field-relation-header) {
|
|
2
|
+
align-items: baseline;
|
|
3
|
+
gap: var(--spacing-8);
|
|
4
|
+
margin-bottom: .25rem;
|
|
5
|
+
display: flex;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
:is(.remove-po_DBR, .byline-field-relation-remove) {
|
|
9
|
+
color: var(--red-500);
|
|
10
|
+
font-size: var(--font-size-xs);
|
|
11
|
+
cursor: pointer;
|
|
12
|
+
background: none;
|
|
13
|
+
border: none;
|
|
14
|
+
padding: 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:is(.remove-po_DBR:hover, .byline-field-relation-remove:hover) {
|
|
18
|
+
color: var(--red-400);
|
|
19
|
+
text-underline-offset: 2px;
|
|
20
|
+
text-decoration: underline;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:is(.help-DEGVPH, .byline-field-relation-help) {
|
|
24
|
+
color: var(--gray-400);
|
|
25
|
+
font-size: var(--font-size-xs);
|
|
26
|
+
margin-bottom: .25rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
:is(.error-tile-y2kiiq, .byline-field-relation-error-tile) {
|
|
30
|
+
padding: var(--spacing-8);
|
|
31
|
+
border: var(--border-width-thin) var(--border-style-solid) var(--red-700);
|
|
32
|
+
background-color: oklch(from var(--red-900) l c h / .2);
|
|
33
|
+
border-radius: var(--border-radius-md);
|
|
34
|
+
color: var(--red-200);
|
|
35
|
+
font-size: var(--font-size-xs);
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
gap: .25rem;
|
|
38
|
+
margin-top: .25rem;
|
|
39
|
+
display: flex;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:is(.error-text-jHQh34, .byline-field-relation-error-text) {
|
|
43
|
+
color: oklch(from var(--red-400) l c h / .8);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:is(.tile-Y3_yre, .byline-field-relation-tile) {
|
|
47
|
+
justify-content: space-between;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: var(--spacing-8);
|
|
50
|
+
padding: var(--spacing-8);
|
|
51
|
+
border: var(--border-width-thin) var(--border-style-solid) var(--primary-500);
|
|
52
|
+
border-radius: var(--border-radius-md);
|
|
53
|
+
color: var(--gray-200);
|
|
54
|
+
font-size: var(--font-size-xs);
|
|
55
|
+
margin-top: .25rem;
|
|
56
|
+
display: flex;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:is(.mono-y8Xo6b, .byline-field-relation-mono) {
|
|
60
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
61
|
+
}
|
|
62
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
import type { CollectionDefinition } from '@byline/core';
|
|
9
|
+
/**
|
|
10
|
+
* Row rendering strategy, in priority order:
|
|
11
|
+
* 1. `CollectionAdminConfig.picker` — a ColumnDefinition[] from the target
|
|
12
|
+
* admin config. Each row renders the declared columns side-by-side,
|
|
13
|
+
* reusing any column formatters (thumbnail, date, etc).
|
|
14
|
+
* 2. Explicit `displayField` prop on this component (forwarded from
|
|
15
|
+
* `RelationField.displayField`).
|
|
16
|
+
* 3. `CollectionDefinition.useAsTitle` on the target.
|
|
17
|
+
* 4. First top-level `text` field on the target.
|
|
18
|
+
*
|
|
19
|
+
* Paths 2–4 render a single-line label (primary) + `path` (secondary).
|
|
20
|
+
*/
|
|
21
|
+
interface RelationPickerProps {
|
|
22
|
+
/** The target collection path (e.g. `'media'`). */
|
|
23
|
+
targetCollectionPath: string;
|
|
24
|
+
/** The target collection definition (used for labels + displayField fallback). */
|
|
25
|
+
targetDefinition?: CollectionDefinition | null;
|
|
26
|
+
/** Explicit display field to render as row label. */
|
|
27
|
+
displayField?: string;
|
|
28
|
+
/** Modal open/close state. */
|
|
29
|
+
isOpen: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Called with the picked selection when the user confirms.
|
|
32
|
+
*
|
|
33
|
+
* `record` is the raw document the picker row rendered — the caller can
|
|
34
|
+
* use it to show the selected value in its own tile without a refetch.
|
|
35
|
+
* The fields available on `record` are whatever `resolveSelectFields`
|
|
36
|
+
* asked the listing endpoint for (picker columns + `useAsTitle` +
|
|
37
|
+
* `displayField`), so any display surface downstream of the picker that
|
|
38
|
+
* also renders from those same columns will find the data it needs.
|
|
39
|
+
*/
|
|
40
|
+
onSelect: (selection: {
|
|
41
|
+
targetDocumentId: string;
|
|
42
|
+
targetCollectionId: string;
|
|
43
|
+
record?: Record<string, any>;
|
|
44
|
+
}) => void;
|
|
45
|
+
/** Called when the user dismisses the modal. */
|
|
46
|
+
onDismiss: () => void;
|
|
47
|
+
}
|
|
48
|
+
export declare const RelationPicker: ({ targetCollectionPath, targetDefinition, displayField, isOpen, onSelect, onDismiss, }: RelationPickerProps) => import("react").JSX.Element;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=relation-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-picker.d.ts","sourceRoot":"","sources":["../../../src/fields/relation/relation-picker.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAyB,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAkB/E;;;;;;;;;;;GAWG;AACH,UAAU,mBAAmB;IAC3B,mDAAmD;IACnD,oBAAoB,EAAE,MAAM,CAAA;IAC5B,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC9C,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf;;;;;;;;;OASG;IACH,QAAQ,EAAE,CAAC,SAAS,EAAE;QACpB,gBAAgB,EAAE,MAAM,CAAA;QACxB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAC7B,KAAK,IAAI,CAAA;IACV,gDAAgD;IAChD,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AAID,eAAO,MAAM,cAAc,GAAI,wFAO5B,mBAAmB,gCAuPrB,CAAA"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { getCollectionAdminConfig } from "@byline/core";
|
|
4
|
+
import { Button, LoaderRing, Modal, Search } from "@infonomic/uikit/react";
|
|
5
|
+
import classnames from "classnames";
|
|
6
|
+
import { useBylineFieldServices } from "../../services/field-services-context.js";
|
|
7
|
+
import { PickerCell, resolveFallbackDisplayField, resolveRowLabel, resolveSelectFields } from "./relation-display.js";
|
|
8
|
+
import relation_picker_module from "./relation-picker.module.js";
|
|
9
|
+
const PAGE_SIZE = 15;
|
|
10
|
+
const RelationPicker = ({ targetCollectionPath, targetDefinition, displayField, isOpen, onSelect, onDismiss })=>{
|
|
11
|
+
const [query, setQuery] = useState('');
|
|
12
|
+
const [page, setPage] = useState(1);
|
|
13
|
+
const [selectedDocumentId, setSelectedDocumentId] = useState(null);
|
|
14
|
+
const [loading, setLoading] = useState(false);
|
|
15
|
+
const [error, setError] = useState(null);
|
|
16
|
+
const [documents, setDocuments] = useState([]);
|
|
17
|
+
const [totalPages, setTotalPages] = useState(1);
|
|
18
|
+
const [collectionId, setCollectionId] = useState(null);
|
|
19
|
+
const { getCollectionDocuments } = useBylineFieldServices();
|
|
20
|
+
const targetAdminConfig = getCollectionAdminConfig(targetCollectionPath);
|
|
21
|
+
const pickerColumns = targetAdminConfig?.picker;
|
|
22
|
+
useEffect(()=>{
|
|
23
|
+
if (isOpen) {
|
|
24
|
+
setQuery('');
|
|
25
|
+
setPage(1);
|
|
26
|
+
setSelectedDocumentId(null);
|
|
27
|
+
setError(null);
|
|
28
|
+
}
|
|
29
|
+
}, [
|
|
30
|
+
isOpen
|
|
31
|
+
]);
|
|
32
|
+
useEffect(()=>{
|
|
33
|
+
if (!isOpen) return;
|
|
34
|
+
let cancelled = false;
|
|
35
|
+
const selectFields = resolveSelectFields(targetDefinition, displayField, pickerColumns);
|
|
36
|
+
setLoading(true);
|
|
37
|
+
setError(null);
|
|
38
|
+
getCollectionDocuments({
|
|
39
|
+
collection: targetCollectionPath,
|
|
40
|
+
params: {
|
|
41
|
+
page,
|
|
42
|
+
page_size: PAGE_SIZE,
|
|
43
|
+
query: query.length > 0 ? query : void 0,
|
|
44
|
+
fields: selectFields
|
|
45
|
+
}
|
|
46
|
+
}).then((response)=>{
|
|
47
|
+
if (cancelled) return;
|
|
48
|
+
setDocuments(response.docs);
|
|
49
|
+
setTotalPages(response.meta.totalPages ?? 1);
|
|
50
|
+
setCollectionId(response.included.collection.id);
|
|
51
|
+
}).catch((err)=>{
|
|
52
|
+
if (cancelled) return;
|
|
53
|
+
setError(err instanceof Error ? err.message : 'Failed to load documents');
|
|
54
|
+
}).finally(()=>{
|
|
55
|
+
if (!cancelled) setLoading(false);
|
|
56
|
+
});
|
|
57
|
+
return ()=>{
|
|
58
|
+
cancelled = true;
|
|
59
|
+
};
|
|
60
|
+
}, [
|
|
61
|
+
isOpen,
|
|
62
|
+
targetCollectionPath,
|
|
63
|
+
query,
|
|
64
|
+
page,
|
|
65
|
+
displayField,
|
|
66
|
+
targetDefinition,
|
|
67
|
+
pickerColumns,
|
|
68
|
+
getCollectionDocuments
|
|
69
|
+
]);
|
|
70
|
+
const resolvedDisplayField = displayField ?? targetDefinition?.useAsTitle ?? resolveFallbackDisplayField(targetDefinition) ?? null;
|
|
71
|
+
const handleSelect = useCallback(()=>{
|
|
72
|
+
if (!selectedDocumentId || !collectionId) return;
|
|
73
|
+
const record = documents.find((d)=>d?.id === selectedDocumentId);
|
|
74
|
+
onSelect({
|
|
75
|
+
targetDocumentId: selectedDocumentId,
|
|
76
|
+
targetCollectionId: collectionId,
|
|
77
|
+
record
|
|
78
|
+
});
|
|
79
|
+
}, [
|
|
80
|
+
selectedDocumentId,
|
|
81
|
+
collectionId,
|
|
82
|
+
documents,
|
|
83
|
+
onSelect
|
|
84
|
+
]);
|
|
85
|
+
const title = targetDefinition ? `Select ${targetDefinition.labels.singular}` : `Select ${targetCollectionPath}`;
|
|
86
|
+
return /*#__PURE__*/ jsx(Modal, {
|
|
87
|
+
isOpen: isOpen,
|
|
88
|
+
onDismiss: onDismiss,
|
|
89
|
+
children: /*#__PURE__*/ jsxs(Modal.Container, {
|
|
90
|
+
style: {
|
|
91
|
+
maxWidth: '600px',
|
|
92
|
+
width: '100%'
|
|
93
|
+
},
|
|
94
|
+
children: [
|
|
95
|
+
/*#__PURE__*/ jsx(Modal.Header, {
|
|
96
|
+
className: classnames('byline-field-relation-picker-header', relation_picker_module.header),
|
|
97
|
+
children: /*#__PURE__*/ jsx("h3", {
|
|
98
|
+
className: classnames('byline-field-relation-picker-title', relation_picker_module.title),
|
|
99
|
+
children: title
|
|
100
|
+
})
|
|
101
|
+
}),
|
|
102
|
+
/*#__PURE__*/ jsx(Modal.Content, {
|
|
103
|
+
children: /*#__PURE__*/ jsxs("div", {
|
|
104
|
+
className: classnames('byline-field-relation-picker-body', relation_picker_module.body),
|
|
105
|
+
children: [
|
|
106
|
+
/*#__PURE__*/ jsx(Search, {
|
|
107
|
+
onSearch: (q)=>{
|
|
108
|
+
setPage(1);
|
|
109
|
+
setQuery(q ?? '');
|
|
110
|
+
},
|
|
111
|
+
onClear: ()=>{
|
|
112
|
+
setPage(1);
|
|
113
|
+
setQuery('');
|
|
114
|
+
},
|
|
115
|
+
inputSize: "sm",
|
|
116
|
+
placeholder: "Search"
|
|
117
|
+
}),
|
|
118
|
+
/*#__PURE__*/ jsxs("div", {
|
|
119
|
+
className: classnames('byline-field-relation-picker-list', relation_picker_module.list),
|
|
120
|
+
children: [
|
|
121
|
+
loading && 0 === documents.length && /*#__PURE__*/ jsx("div", {
|
|
122
|
+
className: classnames('byline-field-relation-picker-loading', relation_picker_module.loading),
|
|
123
|
+
children: /*#__PURE__*/ jsx(LoaderRing, {
|
|
124
|
+
size: 24,
|
|
125
|
+
color: "#888888"
|
|
126
|
+
})
|
|
127
|
+
}),
|
|
128
|
+
!loading && error && /*#__PURE__*/ jsx("div", {
|
|
129
|
+
className: classnames('byline-field-relation-picker-error', relation_picker_module.error),
|
|
130
|
+
children: error
|
|
131
|
+
}),
|
|
132
|
+
!loading && !error && 0 === documents.length && /*#__PURE__*/ jsx("div", {
|
|
133
|
+
className: classnames('byline-field-relation-picker-empty', relation_picker_module.empty),
|
|
134
|
+
children: "No documents found"
|
|
135
|
+
}),
|
|
136
|
+
documents.length > 0 && /*#__PURE__*/ jsx("ul", {
|
|
137
|
+
className: classnames('byline-field-relation-picker-rows', relation_picker_module.rows),
|
|
138
|
+
children: documents.map((doc)=>{
|
|
139
|
+
const id = doc.id;
|
|
140
|
+
const selected = selectedDocumentId === id;
|
|
141
|
+
return /*#__PURE__*/ jsx("li", {
|
|
142
|
+
children: /*#__PURE__*/ jsx("button", {
|
|
143
|
+
type: "button",
|
|
144
|
+
className: classnames('byline-field-relation-picker-row-button', relation_picker_module["row-button"], selected && [
|
|
145
|
+
'byline-field-relation-picker-row-selected',
|
|
146
|
+
relation_picker_module["row-selected"]
|
|
147
|
+
]),
|
|
148
|
+
onClick: ()=>setSelectedDocumentId(id),
|
|
149
|
+
children: pickerColumns && pickerColumns.length > 0 ? /*#__PURE__*/ jsx("div", {
|
|
150
|
+
className: classnames('byline-field-relation-picker-row-cells', relation_picker_module["row-cells"]),
|
|
151
|
+
children: pickerColumns.map((col)=>/*#__PURE__*/ jsx(PickerCell, {
|
|
152
|
+
column: col,
|
|
153
|
+
record: doc
|
|
154
|
+
}, String(col.fieldName)))
|
|
155
|
+
}) : /*#__PURE__*/ jsxs("div", {
|
|
156
|
+
className: classnames('byline-field-relation-picker-row-stack', relation_picker_module["row-stack"]),
|
|
157
|
+
children: [
|
|
158
|
+
/*#__PURE__*/ jsx("span", {
|
|
159
|
+
className: classnames('byline-field-relation-picker-row-label', relation_picker_module["row-label"]),
|
|
160
|
+
children: resolveRowLabel(doc, resolvedDisplayField) || id
|
|
161
|
+
}),
|
|
162
|
+
'string' == typeof doc.path && doc.path.length > 0 && /*#__PURE__*/ jsx("span", {
|
|
163
|
+
className: classnames('byline-field-relation-picker-row-path', relation_picker_module["row-path"]),
|
|
164
|
+
children: doc.path
|
|
165
|
+
})
|
|
166
|
+
]
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
}, id);
|
|
170
|
+
})
|
|
171
|
+
})
|
|
172
|
+
]
|
|
173
|
+
}),
|
|
174
|
+
totalPages > 1 && /*#__PURE__*/ jsxs("div", {
|
|
175
|
+
className: classnames('byline-field-relation-picker-pager', relation_picker_module.pager),
|
|
176
|
+
children: [
|
|
177
|
+
/*#__PURE__*/ jsx(Button, {
|
|
178
|
+
size: "xs",
|
|
179
|
+
variant: "outlined",
|
|
180
|
+
intent: "noeffect",
|
|
181
|
+
type: "button",
|
|
182
|
+
disabled: page <= 1 || loading,
|
|
183
|
+
onClick: ()=>setPage((p)=>Math.max(1, p - 1)),
|
|
184
|
+
children: "Previous"
|
|
185
|
+
}),
|
|
186
|
+
/*#__PURE__*/ jsxs("span", {
|
|
187
|
+
children: [
|
|
188
|
+
"Page ",
|
|
189
|
+
page,
|
|
190
|
+
" of ",
|
|
191
|
+
totalPages
|
|
192
|
+
]
|
|
193
|
+
}),
|
|
194
|
+
/*#__PURE__*/ jsx(Button, {
|
|
195
|
+
size: "xs",
|
|
196
|
+
variant: "outlined",
|
|
197
|
+
intent: "noeffect",
|
|
198
|
+
type: "button",
|
|
199
|
+
disabled: page >= totalPages || loading,
|
|
200
|
+
onClick: ()=>setPage((p)=>Math.min(totalPages, p + 1)),
|
|
201
|
+
children: "Next"
|
|
202
|
+
})
|
|
203
|
+
]
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
})
|
|
207
|
+
}),
|
|
208
|
+
/*#__PURE__*/ jsxs(Modal.Actions, {
|
|
209
|
+
children: [
|
|
210
|
+
/*#__PURE__*/ jsx(Button, {
|
|
211
|
+
size: "sm",
|
|
212
|
+
intent: "noeffect",
|
|
213
|
+
type: "button",
|
|
214
|
+
onClick: onDismiss,
|
|
215
|
+
className: classnames('byline-field-relation-picker-action', relation_picker_module.action),
|
|
216
|
+
children: "Cancel"
|
|
217
|
+
}),
|
|
218
|
+
/*#__PURE__*/ jsx(Button, {
|
|
219
|
+
size: "sm",
|
|
220
|
+
className: classnames('byline-field-relation-picker-action', relation_picker_module.action),
|
|
221
|
+
intent: "primary",
|
|
222
|
+
type: "button",
|
|
223
|
+
disabled: !selectedDocumentId,
|
|
224
|
+
onClick: handleSelect,
|
|
225
|
+
children: "Select"
|
|
226
|
+
})
|
|
227
|
+
]
|
|
228
|
+
})
|
|
229
|
+
]
|
|
230
|
+
})
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
export { RelationPicker };
|