@byline/admin 2.5.2 → 2.6.1

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 (260) hide show
  1. package/dist/fields/array/array-field.d.ts +14 -0
  2. package/dist/fields/array/array-field.js +177 -0
  3. package/dist/fields/array/array-field.module.js +11 -0
  4. package/dist/fields/array/array-field_module.css +32 -0
  5. package/dist/fields/blocks/blocks-field.d.ts +13 -0
  6. package/dist/fields/blocks/blocks-field.js +245 -0
  7. package/dist/fields/blocks/blocks-field.module.js +26 -0
  8. package/dist/fields/blocks/blocks-field_module.css +107 -0
  9. package/dist/fields/checkbox/checkbox-field.d.ts +16 -0
  10. package/dist/fields/checkbox/checkbox-field.js +28 -0
  11. package/dist/fields/checkbox/checkbox-field.module.js +6 -0
  12. package/dist/fields/checkbox/checkbox-field_module.css +4 -0
  13. package/dist/fields/column-formatter.d.ts +20 -0
  14. package/dist/fields/column-formatter.js +15 -0
  15. package/dist/fields/date-time-formatter.d.ts +16 -0
  16. package/dist/fields/date-time-formatter.js +8 -0
  17. package/dist/fields/datetime/datetime-field.d.ts +16 -0
  18. package/dist/fields/datetime/datetime-field.js +37 -0
  19. package/dist/fields/datetime/datetime-field.module.js +5 -0
  20. package/dist/fields/datetime/datetime-field_module.css +4 -0
  21. package/dist/fields/draggable-context-menu.d.ts +6 -0
  22. package/dist/fields/draggable-context-menu.js +85 -0
  23. package/dist/fields/draggable-context-menu.module.js +15 -0
  24. package/dist/fields/draggable-context-menu_module.css +91 -0
  25. package/dist/fields/field-helpers.d.ts +26 -0
  26. package/dist/fields/field-helpers.js +50 -0
  27. package/dist/fields/field-renderer.d.ts +37 -0
  28. package/dist/fields/field-renderer.js +206 -0
  29. package/dist/fields/field-renderer.module.js +8 -0
  30. package/dist/fields/field-renderer_module.css +11 -0
  31. package/dist/fields/field-services-context.d.ts +16 -0
  32. package/dist/fields/field-services-context.js +13 -0
  33. package/dist/fields/field-services-types.d.ts +63 -0
  34. package/dist/fields/field-services-types.js +1 -0
  35. package/dist/fields/file/file-field.d.ts +19 -0
  36. package/dist/fields/file/file-field.js +225 -0
  37. package/dist/fields/file/file-field.module.js +18 -0
  38. package/dist/fields/file/file-field_module.css +131 -0
  39. package/dist/fields/file/file-upload-field.d.ts +21 -0
  40. package/dist/fields/file/file-upload-field.js +130 -0
  41. package/dist/fields/file/file-upload-field.module.js +15 -0
  42. package/dist/fields/file/file-upload-field_module.css +74 -0
  43. package/dist/fields/group/group-field.d.ts +15 -0
  44. package/dist/fields/group/group-field.js +59 -0
  45. package/dist/fields/group/group-field.module.js +9 -0
  46. package/dist/fields/group/group-field_module.css +27 -0
  47. package/dist/fields/image/image-field.d.ts +19 -0
  48. package/dist/fields/image/image-field.js +241 -0
  49. package/dist/fields/image/image-field.module.js +22 -0
  50. package/dist/fields/image/image-field_module.css +121 -0
  51. package/dist/fields/image/image-upload-field.d.ts +21 -0
  52. package/dist/fields/image/image-upload-field.js +190 -0
  53. package/dist/fields/image/image-upload-field.module.js +19 -0
  54. package/dist/fields/image/image-upload-field_module.css +92 -0
  55. package/dist/fields/local-date-time.d.ts +27 -0
  56. package/dist/fields/local-date-time.js +49 -0
  57. package/dist/fields/locale-badge.d.ts +18 -0
  58. package/dist/fields/locale-badge.js +10 -0
  59. package/dist/fields/locale-badge.module.js +5 -0
  60. package/dist/fields/locale-badge_module.css +27 -0
  61. package/dist/fields/numerical/numerical-field.d.ts +18 -0
  62. package/dist/fields/numerical/numerical-field.js +74 -0
  63. package/dist/fields/relation/relation-display.d.ts +40 -0
  64. package/dist/fields/relation/relation-display.js +61 -0
  65. package/dist/fields/relation/relation-display.module.js +9 -0
  66. package/dist/fields/relation/relation-display_module.css +21 -0
  67. package/dist/fields/relation/relation-field.d.ts +18 -0
  68. package/dist/fields/relation/relation-field.js +138 -0
  69. package/dist/fields/relation/relation-field.module.js +13 -0
  70. package/dist/fields/relation/relation-field_module.css +62 -0
  71. package/dist/fields/relation/relation-picker.d.ts +59 -0
  72. package/dist/fields/relation/relation-picker.js +237 -0
  73. package/dist/fields/relation/relation-picker.module.js +26 -0
  74. package/dist/fields/relation/relation-picker_module.css +124 -0
  75. package/dist/fields/relation/relation-summary.d.ts +31 -0
  76. package/dist/fields/relation/relation-summary.js +50 -0
  77. package/dist/fields/relation/relation-summary.module.js +11 -0
  78. package/dist/fields/relation/relation-summary_module.css +37 -0
  79. package/dist/fields/select/select-field.d.ts +16 -0
  80. package/dist/fields/select/select-field.js +50 -0
  81. package/dist/fields/select/select-field.module.js +5 -0
  82. package/dist/fields/select/select-field_module.css +4 -0
  83. package/dist/fields/sortable-item.d.ts +15 -0
  84. package/dist/fields/sortable-item.js +81 -0
  85. package/dist/fields/sortable-item.module.js +22 -0
  86. package/dist/fields/sortable-item_module.css +124 -0
  87. package/dist/fields/text/text-field.d.ts +20 -0
  88. package/dist/fields/text/text-field.js +104 -0
  89. package/dist/fields/text/text-field.module.js +6 -0
  90. package/dist/fields/text/text-field_module.css +5 -0
  91. package/dist/fields/text-area/text-area-field.d.ts +20 -0
  92. package/dist/fields/text-area/text-area-field.js +105 -0
  93. package/dist/fields/text-area/text-area-field.module.js +6 -0
  94. package/dist/fields/text-area/text-area-field_module.css +5 -0
  95. package/dist/fields/use-field-change-handler.d.ts +23 -0
  96. package/dist/fields/use-field-change-handler.js +52 -0
  97. package/dist/forms/document-actions.d.ts +48 -0
  98. package/dist/forms/document-actions.js +475 -0
  99. package/dist/forms/document-actions.module.js +34 -0
  100. package/dist/forms/document-actions_module.css +118 -0
  101. package/dist/forms/form-context.d.ts +89 -0
  102. package/dist/forms/form-context.js +466 -0
  103. package/dist/forms/form-renderer.d.ts +98 -0
  104. package/dist/forms/form-renderer.js +597 -0
  105. package/dist/forms/form-renderer.module.js +46 -0
  106. package/dist/forms/form-renderer_module.css +245 -0
  107. package/dist/forms/navigation-guard.d.ts +54 -0
  108. package/dist/forms/navigation-guard.js +22 -0
  109. package/dist/forms/path-widget.d.ts +36 -0
  110. package/dist/forms/path-widget.js +116 -0
  111. package/dist/forms/path-widget.module.js +8 -0
  112. package/dist/forms/path-widget_module.css +29 -0
  113. package/dist/forms/upload-executor.d.ts +57 -0
  114. package/dist/forms/upload-executor.js +94 -0
  115. package/dist/lib/translate-validation-error.d.ts +36 -0
  116. package/dist/lib/translate-validation-error.js +11 -0
  117. package/dist/modules/admin-account/commands.d.ts +2 -1
  118. package/dist/modules/admin-account/commands.js +13 -2
  119. package/dist/modules/admin-account/components/change-password.js +45 -36
  120. package/dist/modules/admin-account/components/container.js +185 -134
  121. package/dist/modules/admin-account/components/preferences.d.ts +8 -0
  122. package/dist/modules/admin-account/components/preferences.js +152 -0
  123. package/dist/modules/admin-account/components/preferences.module.js +11 -0
  124. package/dist/modules/admin-account/components/preferences_module.css +41 -0
  125. package/dist/modules/admin-account/components/update.js +50 -31
  126. package/dist/modules/admin-account/index.d.ts +3 -3
  127. package/dist/modules/admin-account/index.js +2 -2
  128. package/dist/modules/admin-account/schemas.d.ts +4 -0
  129. package/dist/modules/admin-account/schemas.js +4 -1
  130. package/dist/modules/admin-account/service.d.ts +1 -0
  131. package/dist/modules/admin-account/service.js +8 -0
  132. package/dist/modules/admin-permissions/components/inspector.js +31 -41
  133. package/dist/modules/admin-roles/components/create.js +43 -26
  134. package/dist/modules/admin-roles/components/permissions.js +26 -35
  135. package/dist/modules/admin-roles/components/update.js +26 -16
  136. package/dist/modules/admin-users/components/create.js +60 -40
  137. package/dist/modules/admin-users/components/roles.js +9 -15
  138. package/dist/modules/admin-users/components/set-password.js +30 -31
  139. package/dist/modules/admin-users/components/update.js +58 -39
  140. package/dist/modules/admin-users/dto.js +1 -0
  141. package/dist/modules/admin-users/repository.d.ts +17 -0
  142. package/dist/modules/admin-users/schemas.d.ts +4 -0
  143. package/dist/modules/admin-users/schemas.js +6 -2
  144. package/dist/modules/auth/components/sign-in-form.js +10 -8
  145. package/dist/presentation/group.d.ts +27 -0
  146. package/dist/presentation/group.js +14 -0
  147. package/dist/presentation/group.module.js +6 -0
  148. package/dist/presentation/group_module.css +19 -0
  149. package/dist/presentation/row.d.ts +25 -0
  150. package/dist/presentation/row.js +8 -0
  151. package/dist/presentation/row.module.js +5 -0
  152. package/dist/presentation/row_module.css +18 -0
  153. package/dist/presentation/tabs.d.ts +25 -0
  154. package/dist/presentation/tabs.js +39 -0
  155. package/dist/presentation/tabs.module.js +10 -0
  156. package/dist/presentation/tabs_module.css +68 -0
  157. package/dist/react.d.ts +66 -0
  158. package/dist/react.js +36 -0
  159. package/dist/services/admin-services-types.d.ts +16 -0
  160. package/dist/widgets/diff-viewer/diff-modal.d.ts +22 -0
  161. package/dist/widgets/diff-viewer/diff-modal.js +149 -0
  162. package/dist/widgets/diff-viewer/diff-modal.module.js +14 -0
  163. package/dist/widgets/diff-viewer/diff-modal_module.css +56 -0
  164. package/dist/widgets/status-badge/status-badge.d.ts +25 -0
  165. package/dist/widgets/status-badge/status-badge.js +37 -0
  166. package/dist/widgets/status-badge/status-badge.module.js +7 -0
  167. package/dist/widgets/status-badge/status-badge_module.css +20 -0
  168. package/package.json +14 -4
  169. package/src/fields/array/array-field.module.css +48 -0
  170. package/src/fields/array/array-field.tsx +267 -0
  171. package/src/fields/blocks/blocks-field.module.css +148 -0
  172. package/src/fields/blocks/blocks-field.tsx +323 -0
  173. package/src/fields/checkbox/checkbox-field.module.css +4 -0
  174. package/src/fields/checkbox/checkbox-field.tsx +54 -0
  175. package/src/fields/column-formatter.tsx +31 -0
  176. package/src/fields/date-time-formatter.tsx +22 -0
  177. package/src/fields/datetime/datetime-field.module.css +13 -0
  178. package/src/fields/datetime/datetime-field.tsx +54 -0
  179. package/src/fields/draggable-context-menu.module.css +127 -0
  180. package/src/fields/draggable-context-menu.tsx +87 -0
  181. package/src/fields/field-helpers.ts +69 -0
  182. package/src/fields/field-renderer.module.css +22 -0
  183. package/src/fields/field-renderer.tsx +288 -0
  184. package/src/fields/field-services-context.tsx +35 -0
  185. package/src/fields/field-services-types.ts +68 -0
  186. package/src/fields/file/file-field.module.css +153 -0
  187. package/src/fields/file/file-field.tsx +286 -0
  188. package/src/fields/file/file-upload-field.module.css +101 -0
  189. package/src/fields/file/file-upload-field.tsx +187 -0
  190. package/src/fields/group/group-field.module.css +43 -0
  191. package/src/fields/group/group-field.tsx +84 -0
  192. package/src/fields/image/image-field.module.css +155 -0
  193. package/src/fields/image/image-field.tsx +306 -0
  194. package/src/fields/image/image-upload-field.module.css +123 -0
  195. package/src/fields/image/image-upload-field.tsx +276 -0
  196. package/src/fields/local-date-time.tsx +88 -0
  197. package/src/fields/locale-badge.module.css +37 -0
  198. package/src/fields/locale-badge.tsx +32 -0
  199. package/src/fields/numerical/numerical-field.tsx +114 -0
  200. package/src/fields/relation/relation-display.module.css +36 -0
  201. package/src/fields/relation/relation-display.tsx +138 -0
  202. package/src/fields/relation/relation-field.module.css +83 -0
  203. package/src/fields/relation/relation-field.tsx +211 -0
  204. package/src/fields/relation/relation-picker.module.css +168 -0
  205. package/src/fields/relation/relation-picker.tsx +343 -0
  206. package/src/fields/relation/relation-summary.module.css +55 -0
  207. package/src/fields/relation/relation-summary.tsx +123 -0
  208. package/src/fields/select/select-field.module.css +13 -0
  209. package/src/fields/select/select-field.tsx +61 -0
  210. package/src/fields/sortable-item.module.css +167 -0
  211. package/src/fields/sortable-item.tsx +106 -0
  212. package/src/fields/text/text-field.module.css +13 -0
  213. package/src/fields/text/text-field.tsx +146 -0
  214. package/src/fields/text-area/text-area-field.module.css +13 -0
  215. package/src/fields/text-area/text-area-field.tsx +147 -0
  216. package/src/fields/use-field-change-handler.ts +112 -0
  217. package/src/forms/document-actions.module.css +160 -0
  218. package/src/forms/document-actions.tsx +482 -0
  219. package/src/forms/form-context.tsx +704 -0
  220. package/src/forms/form-renderer.module.css +321 -0
  221. package/src/forms/form-renderer.tsx +891 -0
  222. package/src/forms/navigation-guard.tsx +98 -0
  223. package/src/forms/path-widget.module.css +41 -0
  224. package/src/forms/path-widget.test.tsx +217 -0
  225. package/src/forms/path-widget.tsx +183 -0
  226. package/src/forms/upload-executor.ts +192 -0
  227. package/src/lib/translate-validation-error.ts +56 -0
  228. package/src/modules/admin-account/commands.ts +13 -0
  229. package/src/modules/admin-account/components/change-password.tsx +46 -31
  230. package/src/modules/admin-account/components/container.tsx +83 -38
  231. package/src/modules/admin-account/components/preferences.module.css +60 -0
  232. package/src/modules/admin-account/components/preferences.tsx +203 -0
  233. package/src/modules/admin-account/components/update.tsx +53 -27
  234. package/src/modules/admin-account/index.ts +3 -0
  235. package/src/modules/admin-account/schemas.ts +13 -0
  236. package/src/modules/admin-account/service.ts +12 -0
  237. package/src/modules/admin-permissions/components/inspector.tsx +22 -14
  238. package/src/modules/admin-roles/components/create.tsx +51 -23
  239. package/src/modules/admin-roles/components/permissions.tsx +25 -21
  240. package/src/modules/admin-roles/components/update.tsx +37 -19
  241. package/src/modules/admin-users/components/create.tsx +63 -34
  242. package/src/modules/admin-users/components/roles.tsx +9 -8
  243. package/src/modules/admin-users/components/set-password.tsx +34 -28
  244. package/src/modules/admin-users/components/update.tsx +58 -36
  245. package/src/modules/admin-users/dto.ts +1 -0
  246. package/src/modules/admin-users/repository.ts +17 -0
  247. package/src/modules/admin-users/schemas.ts +12 -0
  248. package/src/modules/auth/components/sign-in-form.tsx +14 -8
  249. package/src/presentation/group.module.css +41 -0
  250. package/src/presentation/group.tsx +40 -0
  251. package/src/presentation/row.module.css +32 -0
  252. package/src/presentation/row.tsx +33 -0
  253. package/src/presentation/tabs.module.css +107 -0
  254. package/src/presentation/tabs.tsx +84 -0
  255. package/src/react.ts +84 -0
  256. package/src/services/admin-services-types.ts +18 -0
  257. package/src/widgets/diff-viewer/diff-modal.module.css +79 -0
  258. package/src/widgets/diff-viewer/diff-modal.tsx +186 -0
  259. package/src/widgets/status-badge/status-badge.module.css +31 -0
  260. package/src/widgets/status-badge/status-badge.tsx +71 -0
@@ -0,0 +1,18 @@
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 {};
@@ -0,0 +1,138 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { getCollectionAdminConfig, getCollectionDefinition } from "@byline/core";
4
+ import { useTranslation } from "@byline/i18n/react";
5
+ import { Button, CloseIcon, EditIcon, ErrorText, IconButton, Label } from "@byline/ui/react";
6
+ import classnames from "classnames";
7
+ import { useFieldError, useFieldValue } from "../../forms/form-context.js";
8
+ import relation_field_module from "./relation-field.module.js";
9
+ import { RelationPicker } from "./relation-picker.js";
10
+ import { RelationSummary } from "./relation-summary.js";
11
+ const RelationField = ({ field, value, defaultValue, onChange, id, path })=>{
12
+ const fieldPath = path ?? field.name;
13
+ const htmlId = id ?? fieldPath;
14
+ const fieldError = useFieldError(fieldPath);
15
+ const fieldValue = useFieldValue(fieldPath);
16
+ const incomingValue = void 0 !== fieldValue ? fieldValue ?? null : value ?? defaultValue ?? null;
17
+ const targetDef = getCollectionDefinition(field.targetCollection);
18
+ const targetAdminConfig = getCollectionAdminConfig(field.targetCollection);
19
+ const { t } = useTranslation('byline-admin');
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
+ return /*#__PURE__*/ jsxs("div", {
40
+ className: `byline-field-relation ${field.name}`,
41
+ children: [
42
+ /*#__PURE__*/ jsx("div", {
43
+ className: classnames('byline-field-relation-header', relation_field_module.header),
44
+ children: /*#__PURE__*/ jsx(Label, {
45
+ id: `${htmlId}-label`,
46
+ htmlFor: htmlId,
47
+ label: field.label ?? field.name,
48
+ required: !field.optional
49
+ })
50
+ }),
51
+ field.helpText && /*#__PURE__*/ jsx("div", {
52
+ className: classnames('byline-field-relation-help', relation_field_module.help),
53
+ children: field.helpText
54
+ }),
55
+ isUnknown ? /*#__PURE__*/ jsxs("div", {
56
+ className: classnames('byline-field-relation-error-tile', relation_field_module["error-tile"]),
57
+ children: [
58
+ /*#__PURE__*/ jsx("span", {
59
+ children: t('fields.relation.unknownError', {
60
+ name: field.name,
61
+ target: field.targetCollection
62
+ })
63
+ }),
64
+ /*#__PURE__*/ jsx("span", {
65
+ className: classnames('byline-field-relation-error-text', relation_field_module["error-text"]),
66
+ children: t('fields.relation.unknownHint')
67
+ })
68
+ ]
69
+ }) : incomingValue ? /*#__PURE__*/ jsxs("div", {
70
+ className: classnames('byline-field-relation-tile', relation_field_module.tile),
71
+ children: [
72
+ /*#__PURE__*/ jsx(RelationSummary, {
73
+ targetDefinition: targetDef,
74
+ targetAdminConfig: targetAdminConfig,
75
+ displayField: field.displayField,
76
+ value: incomingValue,
77
+ cachedRecord: cachedRecord
78
+ }),
79
+ /*#__PURE__*/ jsxs("div", {
80
+ className: classnames('byline-field-relation-actions', relation_field_module.actions),
81
+ children: [
82
+ /*#__PURE__*/ jsx(IconButton, {
83
+ id: htmlId,
84
+ type: "button",
85
+ intent: "noeffect",
86
+ size: "xs",
87
+ "aria-label": t('fields.relation.changeAriaLabel', {
88
+ label: targetDef.labels.singular
89
+ }),
90
+ onClick: ()=>setPickerOpen(true),
91
+ children: /*#__PURE__*/ jsx(EditIcon, {
92
+ width: "15px",
93
+ height: "15px"
94
+ })
95
+ }),
96
+ /*#__PURE__*/ jsx(IconButton, {
97
+ type: "button",
98
+ intent: "noeffect",
99
+ size: "xs",
100
+ "aria-label": t('fields.relation.removeAriaLabel', {
101
+ label: targetDef.labels.singular
102
+ }),
103
+ onClick: handleRemove,
104
+ children: /*#__PURE__*/ jsx(CloseIcon, {
105
+ width: "15px",
106
+ height: "15px"
107
+ })
108
+ })
109
+ ]
110
+ })
111
+ ]
112
+ }) : /*#__PURE__*/ jsx(Button, {
113
+ id: htmlId,
114
+ size: "xs",
115
+ variant: "outlined",
116
+ intent: "noeffect",
117
+ type: "button",
118
+ onClick: ()=>setPickerOpen(true),
119
+ children: t('fields.relation.selectButton', {
120
+ label: targetDef.labels.singular
121
+ })
122
+ }),
123
+ fieldError && /*#__PURE__*/ jsx(ErrorText, {
124
+ id: `${field.name}-error`,
125
+ text: fieldError
126
+ }),
127
+ !isUnknown && /*#__PURE__*/ jsx(RelationPicker, {
128
+ targetCollectionPath: field.targetCollection,
129
+ targetDefinition: targetDef,
130
+ displayField: field.displayField,
131
+ isOpen: pickerOpen,
132
+ onSelect: handleSelect,
133
+ onDismiss: ()=>setPickerOpen(false)
134
+ })
135
+ ]
136
+ });
137
+ };
138
+ export { RelationField };
@@ -0,0 +1,13 @@
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;
@@ -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(.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
+
@@ -0,0 +1,59 @@
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
+ /**
29
+ * Extra field names to load into each row's `record.fields` beyond the
30
+ * display columns. Not rendered — available to the `onSelect` consumer
31
+ * (e.g. the inline-image modal seeding alt-text from the picked media).
32
+ *
33
+ * Pass a stable (module-level) array — this feeds the fetch effect's
34
+ * dependency list, so a fresh array each render would refetch on every
35
+ * render.
36
+ */
37
+ extraSelectFields?: string[];
38
+ /** Modal open/close state. */
39
+ isOpen: boolean;
40
+ /**
41
+ * Called with the picked selection when the user confirms.
42
+ *
43
+ * `record` is the raw document the picker row rendered — the caller can
44
+ * use it to show the selected value in its own tile without a refetch.
45
+ * The fields available on `record` are whatever `resolveSelectFields`
46
+ * asked the listing endpoint for (picker columns + `useAsTitle` +
47
+ * `displayField`), so any display surface downstream of the picker that
48
+ * also renders from those same columns will find the data it needs.
49
+ */
50
+ onSelect: (selection: {
51
+ targetDocumentId: string;
52
+ targetCollectionId: string;
53
+ record?: Record<string, any>;
54
+ }) => void;
55
+ /** Called when the user dismisses the modal. */
56
+ onDismiss: () => void;
57
+ }
58
+ export declare const RelationPicker: ({ targetCollectionPath, targetDefinition, displayField, extraSelectFields, isOpen, onSelect, onDismiss, }: RelationPickerProps) => import("react").JSX.Element;
59
+ export {};
@@ -0,0 +1,237 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from "react";
3
+ import { getCollectionAdminConfig } from "@byline/core";
4
+ import { useTranslation } from "@byline/i18n/react";
5
+ import { Button, LoaderRing, Modal, Search } from "@byline/ui/react";
6
+ import classnames from "classnames";
7
+ import { useBylineFieldServices } from "../field-services-context.js";
8
+ import { PickerCell, resolveFallbackDisplayField, resolveRowLabel, resolveSelectFields } from "./relation-display.js";
9
+ import relation_picker_module from "./relation-picker.module.js";
10
+ const PAGE_SIZE = 15;
11
+ const RelationPicker = ({ targetCollectionPath, targetDefinition, displayField, extraSelectFields, isOpen, onSelect, onDismiss })=>{
12
+ const [query, setQuery] = useState('');
13
+ const [page, setPage] = useState(1);
14
+ const { t } = useTranslation('byline-admin');
15
+ const [selectedDocumentId, setSelectedDocumentId] = useState(null);
16
+ const [loading, setLoading] = useState(false);
17
+ const [error, setError] = useState(null);
18
+ const [documents, setDocuments] = useState([]);
19
+ const [totalPages, setTotalPages] = useState(1);
20
+ const [collectionId, setCollectionId] = useState(null);
21
+ const { getCollectionDocuments } = useBylineFieldServices();
22
+ const targetAdminConfig = getCollectionAdminConfig(targetCollectionPath);
23
+ const pickerColumns = targetAdminConfig?.picker;
24
+ useEffect(()=>{
25
+ if (isOpen) {
26
+ setQuery('');
27
+ setPage(1);
28
+ setSelectedDocumentId(null);
29
+ setError(null);
30
+ }
31
+ }, [
32
+ isOpen
33
+ ]);
34
+ useEffect(()=>{
35
+ if (!isOpen) return;
36
+ let cancelled = false;
37
+ const selectFields = resolveSelectFields(targetDefinition, displayField, pickerColumns, extraSelectFields);
38
+ setLoading(true);
39
+ setError(null);
40
+ getCollectionDocuments({
41
+ collection: targetCollectionPath,
42
+ params: {
43
+ page,
44
+ page_size: PAGE_SIZE,
45
+ query: query.length > 0 ? query : void 0,
46
+ fields: selectFields
47
+ }
48
+ }).then((response)=>{
49
+ if (cancelled) return;
50
+ setDocuments(response.docs);
51
+ setTotalPages(response.meta.totalPages ?? 1);
52
+ setCollectionId(response.included.collection.id);
53
+ }).catch((err)=>{
54
+ if (cancelled) return;
55
+ setError(err instanceof Error ? err.message : t('fields.relation.picker.loadFailed'));
56
+ }).finally(()=>{
57
+ if (!cancelled) setLoading(false);
58
+ });
59
+ return ()=>{
60
+ cancelled = true;
61
+ };
62
+ }, [
63
+ isOpen,
64
+ targetCollectionPath,
65
+ query,
66
+ page,
67
+ displayField,
68
+ extraSelectFields,
69
+ targetDefinition,
70
+ pickerColumns,
71
+ getCollectionDocuments,
72
+ t
73
+ ]);
74
+ const resolvedDisplayField = displayField ?? targetDefinition?.useAsTitle ?? resolveFallbackDisplayField(targetDefinition) ?? null;
75
+ const handleSelect = useCallback(()=>{
76
+ if (!selectedDocumentId || !collectionId) return;
77
+ const record = documents.find((d)=>d?.id === selectedDocumentId);
78
+ onSelect({
79
+ targetDocumentId: selectedDocumentId,
80
+ targetCollectionId: collectionId,
81
+ record
82
+ });
83
+ }, [
84
+ selectedDocumentId,
85
+ collectionId,
86
+ documents,
87
+ onSelect
88
+ ]);
89
+ const title = t('fields.relation.selectPickerTitle', {
90
+ label: targetDefinition?.labels.singular ?? targetCollectionPath
91
+ });
92
+ return /*#__PURE__*/ jsx(Modal, {
93
+ isOpen: isOpen,
94
+ onDismiss: onDismiss,
95
+ children: /*#__PURE__*/ jsxs(Modal.Container, {
96
+ style: {
97
+ maxWidth: '600px',
98
+ width: '100%'
99
+ },
100
+ children: [
101
+ /*#__PURE__*/ jsx(Modal.Header, {
102
+ className: classnames('byline-field-relation-picker-header', relation_picker_module.header),
103
+ children: /*#__PURE__*/ jsx("h3", {
104
+ className: classnames('byline-field-relation-picker-title', relation_picker_module.title),
105
+ children: title
106
+ })
107
+ }),
108
+ /*#__PURE__*/ jsx(Modal.Content, {
109
+ children: /*#__PURE__*/ jsxs("div", {
110
+ className: classnames('byline-field-relation-picker-body', relation_picker_module.body),
111
+ children: [
112
+ /*#__PURE__*/ jsx(Search, {
113
+ onSearch: (q)=>{
114
+ setPage(1);
115
+ setQuery(q ?? '');
116
+ },
117
+ onClear: ()=>{
118
+ setPage(1);
119
+ setQuery('');
120
+ },
121
+ inputSize: "sm",
122
+ placeholder: t('fields.relation.picker.searchPlaceholder')
123
+ }),
124
+ /*#__PURE__*/ jsxs("div", {
125
+ className: classnames('byline-field-relation-picker-list', relation_picker_module.list),
126
+ children: [
127
+ loading && 0 === documents.length && /*#__PURE__*/ jsx("div", {
128
+ className: classnames('byline-field-relation-picker-loading', relation_picker_module.loading),
129
+ children: /*#__PURE__*/ jsx(LoaderRing, {
130
+ size: 24,
131
+ color: "#888888"
132
+ })
133
+ }),
134
+ !loading && error && /*#__PURE__*/ jsx("div", {
135
+ className: classnames('byline-field-relation-picker-error', relation_picker_module.error),
136
+ children: error
137
+ }),
138
+ !loading && !error && 0 === documents.length && /*#__PURE__*/ jsx("div", {
139
+ className: classnames('byline-field-relation-picker-empty', relation_picker_module.empty),
140
+ children: t('fields.relation.picker.empty')
141
+ }),
142
+ documents.length > 0 && /*#__PURE__*/ jsx("ul", {
143
+ className: classnames('byline-field-relation-picker-rows', relation_picker_module.rows),
144
+ children: documents.map((doc)=>{
145
+ const id = doc.id;
146
+ const selected = selectedDocumentId === id;
147
+ return /*#__PURE__*/ jsx("li", {
148
+ children: /*#__PURE__*/ jsx("button", {
149
+ type: "button",
150
+ className: classnames('byline-field-relation-picker-row-button', relation_picker_module["row-button"], selected && [
151
+ 'byline-field-relation-picker-row-selected',
152
+ relation_picker_module["row-selected"]
153
+ ]),
154
+ onClick: ()=>setSelectedDocumentId(id),
155
+ children: pickerColumns && pickerColumns.length > 0 ? /*#__PURE__*/ jsx("div", {
156
+ className: classnames('byline-field-relation-picker-row-cells', relation_picker_module["row-cells"]),
157
+ children: pickerColumns.map((col)=>/*#__PURE__*/ jsx(PickerCell, {
158
+ column: col,
159
+ record: doc
160
+ }, String(col.fieldName)))
161
+ }) : /*#__PURE__*/ jsxs("div", {
162
+ className: classnames('byline-field-relation-picker-row-stack', relation_picker_module["row-stack"]),
163
+ children: [
164
+ /*#__PURE__*/ jsx("span", {
165
+ className: classnames('byline-field-relation-picker-row-label', relation_picker_module["row-label"]),
166
+ children: resolveRowLabel(doc, resolvedDisplayField) || id
167
+ }),
168
+ 'string' == typeof doc.path && doc.path.length > 0 && /*#__PURE__*/ jsx("span", {
169
+ className: classnames('byline-field-relation-picker-row-path', relation_picker_module["row-path"]),
170
+ children: doc.path
171
+ })
172
+ ]
173
+ })
174
+ })
175
+ }, id);
176
+ })
177
+ })
178
+ ]
179
+ }),
180
+ totalPages > 1 && /*#__PURE__*/ jsxs("div", {
181
+ className: classnames('byline-field-relation-picker-pager', relation_picker_module.pager),
182
+ children: [
183
+ /*#__PURE__*/ jsx(Button, {
184
+ size: "xs",
185
+ variant: "outlined",
186
+ intent: "noeffect",
187
+ type: "button",
188
+ disabled: page <= 1 || loading,
189
+ onClick: ()=>setPage((p)=>Math.max(1, p - 1)),
190
+ children: t('common.pager.previous')
191
+ }),
192
+ /*#__PURE__*/ jsx("span", {
193
+ children: t('common.pager.pageOf', {
194
+ page,
195
+ total: totalPages
196
+ })
197
+ }),
198
+ /*#__PURE__*/ jsx(Button, {
199
+ size: "xs",
200
+ variant: "outlined",
201
+ intent: "noeffect",
202
+ type: "button",
203
+ disabled: page >= totalPages || loading,
204
+ onClick: ()=>setPage((p)=>Math.min(totalPages, p + 1)),
205
+ children: t('common.pager.next')
206
+ })
207
+ ]
208
+ })
209
+ ]
210
+ })
211
+ }),
212
+ /*#__PURE__*/ jsxs(Modal.Actions, {
213
+ children: [
214
+ /*#__PURE__*/ jsx(Button, {
215
+ size: "sm",
216
+ intent: "noeffect",
217
+ type: "button",
218
+ onClick: onDismiss,
219
+ className: classnames('byline-field-relation-picker-action', relation_picker_module.action),
220
+ children: t('common.actions.cancel')
221
+ }),
222
+ /*#__PURE__*/ jsx(Button, {
223
+ size: "sm",
224
+ className: classnames('byline-field-relation-picker-action', relation_picker_module.action),
225
+ intent: "primary",
226
+ type: "button",
227
+ disabled: !selectedDocumentId,
228
+ onClick: handleSelect,
229
+ children: t('common.actions.select')
230
+ })
231
+ ]
232
+ })
233
+ ]
234
+ })
235
+ });
236
+ };
237
+ export { RelationPicker };
@@ -0,0 +1,26 @@
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;