@byline/ui 2.5.2 → 2.6.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.
Files changed (211) hide show
  1. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.js +1 -1
  2. package/dist/react.d.ts +18 -54
  3. package/dist/react.js +0 -35
  4. package/dist/uikit.d.ts +1 -0
  5. package/dist/uikit.js +1 -0
  6. package/package.json +2 -8
  7. package/src/dnd/draggable-sortable/demo/draggable-list-demo.tsx +1 -1
  8. package/src/react.ts +20 -68
  9. package/src/uikit.ts +1 -0
  10. package/dist/admin/group.d.ts +0 -27
  11. package/dist/admin/group.js +0 -14
  12. package/dist/admin/group.module.js +0 -6
  13. package/dist/admin/group_module.css +0 -19
  14. package/dist/admin/row.d.ts +0 -25
  15. package/dist/admin/row.js +0 -8
  16. package/dist/admin/row.module.js +0 -5
  17. package/dist/admin/row_module.css +0 -18
  18. package/dist/admin/tabs.d.ts +0 -25
  19. package/dist/admin/tabs.js +0 -35
  20. package/dist/admin/tabs.module.js +0 -10
  21. package/dist/admin/tabs_module.css +0 -68
  22. package/dist/fields/array/array-field.d.ts +0 -14
  23. package/dist/fields/array/array-field.js +0 -176
  24. package/dist/fields/array/array-field.module.js +0 -11
  25. package/dist/fields/array/array-field_module.css +0 -32
  26. package/dist/fields/blocks/blocks-field.d.ts +0 -13
  27. package/dist/fields/blocks/blocks-field.js +0 -244
  28. package/dist/fields/blocks/blocks-field.module.js +0 -26
  29. package/dist/fields/blocks/blocks-field_module.css +0 -107
  30. package/dist/fields/checkbox/checkbox-field.d.ts +0 -16
  31. package/dist/fields/checkbox/checkbox-field.js +0 -28
  32. package/dist/fields/checkbox/checkbox-field.module.js +0 -6
  33. package/dist/fields/checkbox/checkbox-field_module.css +0 -4
  34. package/dist/fields/column-formatter.d.ts +0 -20
  35. package/dist/fields/column-formatter.js +0 -15
  36. package/dist/fields/date-time-formatter.d.ts +0 -16
  37. package/dist/fields/date-time-formatter.js +0 -8
  38. package/dist/fields/datetime/datetime-field.d.ts +0 -16
  39. package/dist/fields/datetime/datetime-field.js +0 -37
  40. package/dist/fields/datetime/datetime-field.module.js +0 -5
  41. package/dist/fields/datetime/datetime-field_module.css +0 -4
  42. package/dist/fields/draggable-context-menu.d.ts +0 -6
  43. package/dist/fields/draggable-context-menu.js +0 -83
  44. package/dist/fields/draggable-context-menu.module.js +0 -15
  45. package/dist/fields/draggable-context-menu_module.css +0 -91
  46. package/dist/fields/field-helpers.d.ts +0 -26
  47. package/dist/fields/field-helpers.js +0 -50
  48. package/dist/fields/field-renderer.d.ts +0 -37
  49. package/dist/fields/field-renderer.js +0 -206
  50. package/dist/fields/field-renderer.module.js +0 -8
  51. package/dist/fields/field-renderer_module.css +0 -11
  52. package/dist/fields/file/file-field.d.ts +0 -19
  53. package/dist/fields/file/file-field.js +0 -226
  54. package/dist/fields/file/file-field.module.js +0 -18
  55. package/dist/fields/file/file-field_module.css +0 -131
  56. package/dist/fields/file/file-upload-field.d.ts +0 -21
  57. package/dist/fields/file/file-upload-field.js +0 -128
  58. package/dist/fields/file/file-upload-field.module.js +0 -15
  59. package/dist/fields/file/file-upload-field_module.css +0 -74
  60. package/dist/fields/group/group-field.d.ts +0 -15
  61. package/dist/fields/group/group-field.js +0 -59
  62. package/dist/fields/group/group-field.module.js +0 -9
  63. package/dist/fields/group/group-field_module.css +0 -27
  64. package/dist/fields/image/image-field.d.ts +0 -19
  65. package/dist/fields/image/image-field.js +0 -242
  66. package/dist/fields/image/image-field.module.js +0 -22
  67. package/dist/fields/image/image-field_module.css +0 -121
  68. package/dist/fields/image/image-upload-field.d.ts +0 -21
  69. package/dist/fields/image/image-upload-field.js +0 -187
  70. package/dist/fields/image/image-upload-field.module.js +0 -19
  71. package/dist/fields/image/image-upload-field_module.css +0 -92
  72. package/dist/fields/local-date-time.d.ts +0 -27
  73. package/dist/fields/local-date-time.js +0 -49
  74. package/dist/fields/locale-badge.d.ts +0 -18
  75. package/dist/fields/locale-badge.js +0 -10
  76. package/dist/fields/locale-badge.module.js +0 -5
  77. package/dist/fields/locale-badge_module.css +0 -27
  78. package/dist/fields/numerical/numerical-field.d.ts +0 -18
  79. package/dist/fields/numerical/numerical-field.js +0 -74
  80. package/dist/fields/relation/relation-display.d.ts +0 -40
  81. package/dist/fields/relation/relation-display.js +0 -58
  82. package/dist/fields/relation/relation-display.module.js +0 -9
  83. package/dist/fields/relation/relation-display_module.css +0 -21
  84. package/dist/fields/relation/relation-field.d.ts +0 -18
  85. package/dist/fields/relation/relation-field.js +0 -146
  86. package/dist/fields/relation/relation-field.module.js +0 -13
  87. package/dist/fields/relation/relation-field_module.css +0 -62
  88. package/dist/fields/relation/relation-picker.d.ts +0 -49
  89. package/dist/fields/relation/relation-picker.js +0 -233
  90. package/dist/fields/relation/relation-picker.module.js +0 -26
  91. package/dist/fields/relation/relation-picker_module.css +0 -124
  92. package/dist/fields/relation/relation-summary.d.ts +0 -31
  93. package/dist/fields/relation/relation-summary.js +0 -50
  94. package/dist/fields/relation/relation-summary.module.js +0 -11
  95. package/dist/fields/relation/relation-summary_module.css +0 -37
  96. package/dist/fields/select/select-field.d.ts +0 -16
  97. package/dist/fields/select/select-field.js +0 -50
  98. package/dist/fields/select/select-field.module.js +0 -5
  99. package/dist/fields/select/select-field_module.css +0 -4
  100. package/dist/fields/sortable-item.d.ts +0 -15
  101. package/dist/fields/sortable-item.js +0 -80
  102. package/dist/fields/sortable-item.module.js +0 -22
  103. package/dist/fields/sortable-item_module.css +0 -124
  104. package/dist/fields/text/text-field.d.ts +0 -20
  105. package/dist/fields/text/text-field.js +0 -104
  106. package/dist/fields/text/text-field.module.js +0 -6
  107. package/dist/fields/text/text-field_module.css +0 -5
  108. package/dist/fields/text-area/text-area-field.d.ts +0 -20
  109. package/dist/fields/text-area/text-area-field.js +0 -105
  110. package/dist/fields/text-area/text-area-field.module.js +0 -6
  111. package/dist/fields/text-area/text-area-field_module.css +0 -5
  112. package/dist/fields/use-field-change-handler.d.ts +0 -23
  113. package/dist/fields/use-field-change-handler.js +0 -52
  114. package/dist/forms/document-actions.d.ts +0 -48
  115. package/dist/forms/document-actions.js +0 -469
  116. package/dist/forms/document-actions.module.js +0 -34
  117. package/dist/forms/document-actions_module.css +0 -118
  118. package/dist/forms/form-context.d.ts +0 -89
  119. package/dist/forms/form-context.js +0 -466
  120. package/dist/forms/form-renderer.d.ts +0 -98
  121. package/dist/forms/form-renderer.js +0 -591
  122. package/dist/forms/form-renderer.module.js +0 -46
  123. package/dist/forms/form-renderer_module.css +0 -245
  124. package/dist/forms/navigation-guard.d.ts +0 -54
  125. package/dist/forms/navigation-guard.js +0 -22
  126. package/dist/forms/path-widget.d.ts +0 -36
  127. package/dist/forms/path-widget.js +0 -107
  128. package/dist/forms/path-widget.module.js +0 -8
  129. package/dist/forms/path-widget_module.css +0 -29
  130. package/dist/forms/upload-executor.d.ts +0 -57
  131. package/dist/forms/upload-executor.js +0 -92
  132. package/dist/services/field-services-context.d.ts +0 -16
  133. package/dist/services/field-services-context.js +0 -13
  134. package/dist/services/field-services-types.d.ts +0 -63
  135. package/dist/services/field-services-types.js +0 -1
  136. package/dist/widgets/diff-viewer/diff-modal.d.ts +0 -22
  137. package/dist/widgets/diff-viewer/diff-modal.js +0 -146
  138. package/dist/widgets/diff-viewer/diff-modal.module.js +0 -14
  139. package/dist/widgets/diff-viewer/diff-modal_module.css +0 -56
  140. package/dist/widgets/status-badge/status-badge.d.ts +0 -25
  141. package/dist/widgets/status-badge/status-badge.js +0 -35
  142. package/dist/widgets/status-badge/status-badge.module.js +0 -7
  143. package/dist/widgets/status-badge/status-badge_module.css +0 -20
  144. package/src/admin/group.module.css +0 -41
  145. package/src/admin/group.tsx +0 -40
  146. package/src/admin/row.module.css +0 -32
  147. package/src/admin/row.tsx +0 -33
  148. package/src/admin/tabs.module.css +0 -107
  149. package/src/admin/tabs.tsx +0 -82
  150. package/src/fields/array/array-field.module.css +0 -48
  151. package/src/fields/array/array-field.tsx +0 -266
  152. package/src/fields/blocks/blocks-field.module.css +0 -148
  153. package/src/fields/blocks/blocks-field.tsx +0 -312
  154. package/src/fields/checkbox/checkbox-field.module.css +0 -4
  155. package/src/fields/checkbox/checkbox-field.tsx +0 -54
  156. package/src/fields/column-formatter.tsx +0 -31
  157. package/src/fields/date-time-formatter.tsx +0 -22
  158. package/src/fields/datetime/datetime-field.module.css +0 -13
  159. package/src/fields/datetime/datetime-field.tsx +0 -54
  160. package/src/fields/draggable-context-menu.module.css +0 -127
  161. package/src/fields/draggable-context-menu.tsx +0 -85
  162. package/src/fields/field-helpers.ts +0 -69
  163. package/src/fields/field-renderer.module.css +0 -22
  164. package/src/fields/field-renderer.tsx +0 -288
  165. package/src/fields/file/file-field.module.css +0 -153
  166. package/src/fields/file/file-field.tsx +0 -271
  167. package/src/fields/file/file-upload-field.module.css +0 -101
  168. package/src/fields/file/file-upload-field.tsx +0 -183
  169. package/src/fields/group/group-field.module.css +0 -43
  170. package/src/fields/group/group-field.tsx +0 -84
  171. package/src/fields/image/image-field.module.css +0 -155
  172. package/src/fields/image/image-field.tsx +0 -291
  173. package/src/fields/image/image-upload-field.module.css +0 -123
  174. package/src/fields/image/image-upload-field.tsx +0 -270
  175. package/src/fields/local-date-time.tsx +0 -88
  176. package/src/fields/locale-badge.module.css +0 -37
  177. package/src/fields/locale-badge.tsx +0 -32
  178. package/src/fields/numerical/numerical-field.tsx +0 -114
  179. package/src/fields/relation/relation-display.module.css +0 -36
  180. package/src/fields/relation/relation-display.tsx +0 -130
  181. package/src/fields/relation/relation-field.module.css +0 -83
  182. package/src/fields/relation/relation-field.tsx +0 -206
  183. package/src/fields/relation/relation-picker.module.css +0 -168
  184. package/src/fields/relation/relation-picker.tsx +0 -325
  185. package/src/fields/relation/relation-summary.module.css +0 -55
  186. package/src/fields/relation/relation-summary.tsx +0 -123
  187. package/src/fields/select/select-field.module.css +0 -13
  188. package/src/fields/select/select-field.tsx +0 -61
  189. package/src/fields/sortable-item.module.css +0 -167
  190. package/src/fields/sortable-item.tsx +0 -101
  191. package/src/fields/text/text-field.module.css +0 -13
  192. package/src/fields/text/text-field.tsx +0 -146
  193. package/src/fields/text-area/text-area-field.module.css +0 -13
  194. package/src/fields/text-area/text-area-field.tsx +0 -147
  195. package/src/fields/use-field-change-handler.ts +0 -112
  196. package/src/forms/document-actions.module.css +0 -160
  197. package/src/forms/document-actions.tsx +0 -487
  198. package/src/forms/form-context.tsx +0 -704
  199. package/src/forms/form-renderer.module.css +0 -321
  200. package/src/forms/form-renderer.tsx +0 -888
  201. package/src/forms/navigation-guard.tsx +0 -98
  202. package/src/forms/path-widget.module.css +0 -41
  203. package/src/forms/path-widget.test.tsx +0 -217
  204. package/src/forms/path-widget.tsx +0 -181
  205. package/src/forms/upload-executor.ts +0 -190
  206. package/src/services/field-services-context.tsx +0 -35
  207. package/src/services/field-services-types.ts +0 -68
  208. package/src/widgets/diff-viewer/diff-modal.module.css +0 -79
  209. package/src/widgets/diff-viewer/diff-modal.tsx +0 -184
  210. package/src/widgets/status-badge/status-badge.module.css +0 -31
  211. package/src/widgets/status-badge/status-badge.tsx +0 -69
@@ -1,18 +0,0 @@
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 {};
@@ -1,146 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useState } from "react";
3
- import { getCollectionAdminConfig, getCollectionDefinition } from "@byline/core";
4
- import classnames from "classnames";
5
- import { useFieldError, useFieldValue } from "../../forms/form-context.js";
6
- import { CloseIcon } from "../../icons/close-icon.js";
7
- import { EditIcon } from "../../icons/edit-icon.js";
8
- import { Button, ErrorText, IconButton, Label } from "../../uikit.js";
9
- import relation_field_module from "./relation-field.module.js";
10
- import { RelationPicker } from "./relation-picker.js";
11
- import { RelationSummary } from "./relation-summary.js";
12
- const RelationField = ({ field, value, defaultValue, onChange, id, path })=>{
13
- const fieldPath = path ?? field.name;
14
- const htmlId = id ?? fieldPath;
15
- const fieldError = useFieldError(fieldPath);
16
- const fieldValue = useFieldValue(fieldPath);
17
- const incomingValue = void 0 !== fieldValue ? fieldValue ?? null : value ?? defaultValue ?? null;
18
- const targetDef = getCollectionDefinition(field.targetCollection);
19
- const targetAdminConfig = getCollectionAdminConfig(field.targetCollection);
20
- const [pickerOpen, setPickerOpen] = useState(false);
21
- const [pickedRecord, setPickedRecord] = useState(null);
22
- const handleSelect = (selection)=>{
23
- setPickerOpen(false);
24
- selection.record ? setPickedRecord({
25
- id: selection.targetDocumentId,
26
- record: selection.record
27
- }) : setPickedRecord(null);
28
- onChange?.({
29
- targetDocumentId: selection.targetDocumentId,
30
- targetCollectionId: selection.targetCollectionId
31
- });
32
- };
33
- const handleRemove = ()=>{
34
- setPickedRecord(null);
35
- onChange?.(null);
36
- };
37
- const cachedRecord = pickedRecord && incomingValue && pickedRecord.id === incomingValue.targetDocumentId ? pickedRecord.record : null;
38
- const isUnknown = null == targetDef;
39
- const monoClass = classnames('byline-field-relation-mono', relation_field_module.mono);
40
- return /*#__PURE__*/ jsxs("div", {
41
- className: `byline-field-relation ${field.name}`,
42
- children: [
43
- /*#__PURE__*/ jsx("div", {
44
- className: classnames('byline-field-relation-header', relation_field_module.header),
45
- children: /*#__PURE__*/ jsx(Label, {
46
- id: `${htmlId}-label`,
47
- htmlFor: htmlId,
48
- label: field.label ?? field.name,
49
- required: !field.optional
50
- })
51
- }),
52
- field.helpText && /*#__PURE__*/ jsx("div", {
53
- className: classnames('byline-field-relation-help', relation_field_module.help),
54
- children: field.helpText
55
- }),
56
- isUnknown ? /*#__PURE__*/ jsxs("div", {
57
- className: classnames('byline-field-relation-error-tile', relation_field_module["error-tile"]),
58
- children: [
59
- /*#__PURE__*/ jsxs("span", {
60
- children: [
61
- "Relation field ",
62
- /*#__PURE__*/ jsx("code", {
63
- className: monoClass,
64
- children: field.name
65
- }),
66
- " targets unknown collection ",
67
- /*#__PURE__*/ jsx("code", {
68
- className: monoClass,
69
- children: field.targetCollection
70
- }),
71
- "."
72
- ]
73
- }),
74
- /*#__PURE__*/ jsx("span", {
75
- className: classnames('byline-field-relation-error-text', relation_field_module["error-text"]),
76
- children: "Register the collection in your Byline config or correct the target path."
77
- })
78
- ]
79
- }) : incomingValue ? /*#__PURE__*/ jsxs("div", {
80
- className: classnames('byline-field-relation-tile', relation_field_module.tile),
81
- children: [
82
- /*#__PURE__*/ jsx(RelationSummary, {
83
- targetDefinition: targetDef,
84
- targetAdminConfig: targetAdminConfig,
85
- displayField: field.displayField,
86
- value: incomingValue,
87
- cachedRecord: cachedRecord
88
- }),
89
- /*#__PURE__*/ jsxs("div", {
90
- className: classnames('byline-field-relation-actions', relation_field_module.actions),
91
- children: [
92
- /*#__PURE__*/ jsx(IconButton, {
93
- id: htmlId,
94
- type: "button",
95
- intent: "noeffect",
96
- size: "xs",
97
- "aria-label": `Change ${targetDef.labels.singular}`,
98
- onClick: ()=>setPickerOpen(true),
99
- children: /*#__PURE__*/ jsx(EditIcon, {
100
- width: "15px",
101
- height: "15px"
102
- })
103
- }),
104
- /*#__PURE__*/ jsx(IconButton, {
105
- type: "button",
106
- intent: "noeffect",
107
- size: "xs",
108
- "aria-label": `Remove ${targetDef.labels.singular}`,
109
- onClick: handleRemove,
110
- children: /*#__PURE__*/ jsx(CloseIcon, {
111
- width: "15px",
112
- height: "15px"
113
- })
114
- })
115
- ]
116
- })
117
- ]
118
- }) : /*#__PURE__*/ jsxs(Button, {
119
- id: htmlId,
120
- size: "xs",
121
- variant: "outlined",
122
- intent: "noeffect",
123
- type: "button",
124
- onClick: ()=>setPickerOpen(true),
125
- children: [
126
- "Select ",
127
- targetDef.labels.singular,
128
- "…"
129
- ]
130
- }),
131
- fieldError && /*#__PURE__*/ jsx(ErrorText, {
132
- id: `${field.name}-error`,
133
- text: fieldError
134
- }),
135
- !isUnknown && /*#__PURE__*/ jsx(RelationPicker, {
136
- targetCollectionPath: field.targetCollection,
137
- targetDefinition: targetDef,
138
- displayField: field.displayField,
139
- isOpen: pickerOpen,
140
- onSelect: handleSelect,
141
- onDismiss: ()=>setPickerOpen(false)
142
- })
143
- ]
144
- });
145
- };
146
- export { RelationField };
@@ -1,13 +0,0 @@
1
- import "./relation-field_module.css";
2
- const relation_field_module = {
3
- header: "header-y7lSnb",
4
- help: "help-DEGVPH",
5
- "error-tile": "error-tile-y2kiiq",
6
- errorTile: "error-tile-y2kiiq",
7
- "error-text": "error-text-jHQh34",
8
- errorText: "error-text-jHQh34",
9
- tile: "tile-Y3_yre",
10
- actions: "actions-Nov8hS",
11
- mono: "mono-y8Xo6b"
12
- };
13
- export default relation_field_module;
@@ -1,62 +0,0 @@
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(.help-DEGVPH, .byline-field-relation-help) {
9
- color: var(--gray-400);
10
- font-size: var(--font-size-xs);
11
- margin-bottom: .25rem;
12
- }
13
-
14
- :is(.error-tile-y2kiiq, .byline-field-relation-error-tile) {
15
- padding: var(--spacing-8);
16
- border: var(--border-width-thin) var(--border-style-solid) var(--red-700);
17
- background-color: oklch(from var(--red-900) l c h / .2);
18
- border-radius: var(--border-radius-md);
19
- color: var(--red-200);
20
- font-size: var(--font-size-xs);
21
- flex-direction: column;
22
- gap: .25rem;
23
- margin-top: .25rem;
24
- display: flex;
25
- }
26
-
27
- :is(.error-text-jHQh34, .byline-field-relation-error-text) {
28
- color: oklch(from var(--red-400) l c h / .8);
29
- }
30
-
31
- :is(.tile-Y3_yre, .byline-field-relation-tile) {
32
- justify-content: space-between;
33
- align-items: flex-start;
34
- gap: var(--spacing-8);
35
- padding: var(--spacing-8);
36
- border: var(--border-width-thin) var(--border-style-solid) var(--primary-500);
37
- border-radius: var(--border-radius-md);
38
- color: var(--gray-200);
39
- font-size: var(--font-size-xs);
40
- margin-top: .25rem;
41
- display: flex;
42
- }
43
-
44
- :is(.actions-Nov8hS, .byline-field-relation-actions) {
45
- align-items: center;
46
- gap: var(--spacing-4);
47
- flex-shrink: 0;
48
- display: flex;
49
- }
50
-
51
- .byline-field-relation-actions .byline-button {
52
- color: var(--gray-900);
53
- }
54
-
55
- :is(.dark .byline-field-relation-actions .byline-button, [data-theme="dark"] .byline-field-relation-actions .byline-button) {
56
- color: var(--gray-200);
57
- }
58
-
59
- :is(.mono-y8Xo6b, .byline-field-relation-mono) {
60
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
61
- }
62
-
@@ -1,49 +0,0 @@
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 {};
@@ -1,233 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useState } from "react";
3
- import { getCollectionAdminConfig } from "@byline/core";
4
- import classnames from "classnames";
5
- import { useBylineFieldServices } from "../../services/field-services-context.js";
6
- import { Button, LoaderRing, Modal, Search } from "../../uikit.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 };
@@ -1,26 +0,0 @@
1
- import "./relation-picker_module.css";
2
- const relation_picker_module = {
3
- header: "header-quQOWP",
4
- title: "title-nX1CSv",
5
- body: "body-S2EcHm",
6
- list: "list-UFzd89",
7
- loading: "loading-LZVbkl",
8
- error: "error-ZtOVuJ",
9
- empty: "empty-ks6ZeP",
10
- rows: "rows-QZrdT9",
11
- "row-button": "row-button-ZHfXmj",
12
- rowButton: "row-button-ZHfXmj",
13
- "row-selected": "row-selected-VlrgyO",
14
- rowSelected: "row-selected-VlrgyO",
15
- "row-cells": "row-cells-aSIcf5",
16
- rowCells: "row-cells-aSIcf5",
17
- "row-stack": "row-stack-BOPzzj",
18
- rowStack: "row-stack-BOPzzj",
19
- "row-label": "row-label-gEaOEB",
20
- rowLabel: "row-label-gEaOEB",
21
- "row-path": "row-path-v1lJwb",
22
- rowPath: "row-path-v1lJwb",
23
- pager: "pager-EWOfET",
24
- action: "action-STxQVM"
25
- };
26
- export default relation_picker_module;
@@ -1,124 +0,0 @@
1
- :is(.header-quQOWP, .byline-field-relation-picker-header) {
2
- margin-bottom: var(--spacing-8);
3
- padding-top: 1rem;
4
- }
5
-
6
- :is(.title-nX1CSv, .byline-field-relation-picker-title) {
7
- margin: 0 0 var(--spacing-8) 0;
8
- font-size: var(--font-size-xl);
9
- }
10
-
11
- :is(.body-S2EcHm, .byline-field-relation-picker-body) {
12
- flex-direction: column;
13
- gap: .75rem;
14
- display: flex;
15
- }
16
-
17
- :is(.list-UFzd89, .byline-field-relation-picker-list) {
18
- border: var(--border-width-thin) var(--border-style-solid) var(--gray-700);
19
- border-radius: var(--border-radius-md);
20
- min-height: 320px;
21
- max-height: 420px;
22
- overflow-y: auto;
23
- }
24
-
25
- :is(.loading-LZVbkl, .byline-field-relation-picker-loading) {
26
- justify-content: center;
27
- align-items: center;
28
- padding: 2.5rem 0;
29
- display: flex;
30
- }
31
-
32
- :is(.error-ZtOVuJ, .byline-field-relation-picker-error) {
33
- color: var(--red-500);
34
- font-size: var(--font-size-sm);
35
- text-align: center;
36
- padding: 2.5rem 1rem;
37
- }
38
-
39
- :is(.empty-ks6ZeP, .byline-field-relation-picker-empty) {
40
- color: var(--gray-400);
41
- font-size: var(--font-size-sm);
42
- text-align: center;
43
- padding: 2.5rem 1rem;
44
- }
45
-
46
- :is(.rows-QZrdT9, .byline-field-relation-picker-rows) {
47
- margin: 0;
48
- padding: 0;
49
- list-style: none;
50
- }
51
-
52
- :is(.rows-QZrdT9 > li + li, .byline-field-relation-picker-rows > li + li) {
53
- border-top: var(--border-width-thin) var(--border-style-solid) var(--gray-700);
54
- }
55
-
56
- :is(.row-button-ZHfXmj, .byline-field-relation-picker-row-button) {
57
- width: 100%;
58
- padding: var(--spacing-8) .75rem;
59
- text-align: left;
60
- color: inherit;
61
- cursor: pointer;
62
- background: none;
63
- border: none;
64
- transition: background-color .15s;
65
- }
66
-
67
- :is(.row-button-ZHfXmj:hover, .byline-field-relation-picker-row-button:hover) {
68
- background-color: var(--gray-25);
69
- }
70
-
71
- :is(.row-selected-VlrgyO, .byline-field-relation-picker-row-selected) {
72
- background-color: oklch(from var(--primary-200) l c h / .3);
73
- border-left: 2px solid var(--primary-200);
74
- }
75
-
76
- :is(.row-cells-aSIcf5, .byline-field-relation-picker-row-cells) {
77
- align-items: center;
78
- gap: .75rem;
79
- display: flex;
80
- }
81
-
82
- :is(.row-stack-BOPzzj, .byline-field-relation-picker-row-stack) {
83
- flex-direction: column;
84
- gap: .125rem;
85
- display: flex;
86
- }
87
-
88
- :is(.row-label-gEaOEB, .byline-field-relation-picker-row-label) {
89
- color: var(--gray-100);
90
- font-size: var(--font-size-sm);
91
- text-overflow: ellipsis;
92
- white-space: nowrap;
93
- overflow: hidden;
94
- }
95
-
96
- :is(.row-path-v1lJwb, .byline-field-relation-picker-row-path) {
97
- color: var(--gray-500);
98
- font-size: var(--font-size-xs);
99
- text-overflow: ellipsis;
100
- white-space: nowrap;
101
- overflow: hidden;
102
- }
103
-
104
- :is(.pager-EWOfET, .byline-field-relation-picker-pager) {
105
- color: var(--gray-400);
106
- font-size: var(--font-size-xs);
107
- justify-content: space-between;
108
- align-items: center;
109
- display: flex;
110
- }
111
-
112
- :is(.action-STxQVM, .byline-field-relation-picker-action) {
113
- min-width: 70px;
114
- }
115
-
116
- :is(:is([data-theme="dark"], .dark) .row-button-ZHfXmj:hover, :is([data-theme="dark"], .dark) .byline-field-relation-picker-row-button:hover) {
117
- background-color: var(--gray-900);
118
- }
119
-
120
- :is(:is([data-theme="dark"], .dark) .row-selected-VlrgyO, :is([data-theme="dark"], .dark) .byline-field-relation-picker-row-selected) {
121
- background-color: oklch(from var(--primary-900) l c h / .3);
122
- border-left: 2px solid var(--primary-400);
123
- }
124
-