@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.
Files changed (368) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +17 -0
  3. package/dist/admin/components/admin-account/change-password.d.ts +9 -0
  4. package/dist/admin/components/admin-account/change-password.d.ts.map +1 -0
  5. package/dist/admin/components/admin-account/change-password.js +192 -0
  6. package/dist/admin/components/admin-account/change-password.module.js +8 -0
  7. package/dist/admin/components/admin-account/change-password_module.css +27 -0
  8. package/dist/admin/components/admin-account/container.d.ts +30 -0
  9. package/dist/admin/components/admin-account/container.d.ts.map +1 -0
  10. package/dist/admin/components/admin-account/container.js +299 -0
  11. package/dist/admin/components/admin-account/container.module.js +28 -0
  12. package/dist/admin/components/admin-account/container_module.css +106 -0
  13. package/dist/admin/components/admin-account/update.d.ts +9 -0
  14. package/dist/admin/components/admin-account/update.d.ts.map +1 -0
  15. package/dist/admin/components/admin-account/update.js +207 -0
  16. package/dist/admin/components/admin-account/update.module.js +8 -0
  17. package/dist/admin/components/admin-account/update_module.css +27 -0
  18. package/dist/admin/components/admin-permissions/inspector.d.ts +5 -0
  19. package/dist/admin/components/admin-permissions/inspector.d.ts.map +1 -0
  20. package/dist/admin/components/admin-permissions/inspector.js +284 -0
  21. package/dist/admin/components/admin-permissions/inspector.module.js +56 -0
  22. package/dist/admin/components/admin-permissions/inspector_module.css +238 -0
  23. package/dist/admin/components/admin-roles/create.d.ts +8 -0
  24. package/dist/admin/components/admin-roles/create.d.ts.map +1 -0
  25. package/dist/admin/components/admin-roles/create.js +177 -0
  26. package/dist/admin/components/admin-roles/create.module.js +8 -0
  27. package/dist/admin/components/admin-roles/create_module.css +27 -0
  28. package/dist/admin/components/admin-roles/permissions.d.ts +11 -0
  29. package/dist/admin/components/admin-roles/permissions.d.ts.map +1 -0
  30. package/dist/admin/components/admin-roles/permissions.js +303 -0
  31. package/dist/admin/components/admin-roles/permissions.module.js +44 -0
  32. package/dist/admin/components/admin-roles/permissions_module.css +192 -0
  33. package/dist/admin/components/admin-roles/update.d.ts +9 -0
  34. package/dist/admin/components/admin-roles/update.d.ts.map +1 -0
  35. package/dist/admin/components/admin-roles/update.js +166 -0
  36. package/dist/admin/components/admin-roles/update.module.js +8 -0
  37. package/dist/admin/components/admin-roles/update_module.css +27 -0
  38. package/dist/admin/components/admin-users/create.d.ts +9 -0
  39. package/dist/admin/components/admin-users/create.d.ts.map +1 -0
  40. package/dist/admin/components/admin-users/create.js +268 -0
  41. package/dist/admin/components/admin-users/create.module.js +10 -0
  42. package/dist/admin/components/admin-users/create_module.css +45 -0
  43. package/dist/admin/components/admin-users/roles.d.ts +12 -0
  44. package/dist/admin/components/admin-users/roles.d.ts.map +1 -0
  45. package/dist/admin/components/admin-users/roles.js +148 -0
  46. package/dist/admin/components/admin-users/roles.module.js +18 -0
  47. package/dist/admin/components/admin-users/roles_module.css +75 -0
  48. package/dist/admin/components/admin-users/set-password.d.ts +9 -0
  49. package/dist/admin/components/admin-users/set-password.d.ts.map +1 -0
  50. package/dist/admin/components/admin-users/set-password.js +170 -0
  51. package/dist/admin/components/admin-users/set-password.module.js +9 -0
  52. package/dist/admin/components/admin-users/set-password_module.css +31 -0
  53. package/dist/admin/components/admin-users/update.d.ts +9 -0
  54. package/dist/admin/components/admin-users/update.d.ts.map +1 -0
  55. package/dist/admin/components/admin-users/update.js +254 -0
  56. package/dist/admin/components/admin-users/update.module.js +9 -0
  57. package/dist/admin/components/admin-users/update_module.css +34 -0
  58. package/dist/admin/components/auth/sign-in-form.d.ts +14 -0
  59. package/dist/admin/components/auth/sign-in-form.d.ts.map +1 -0
  60. package/dist/admin/components/auth/sign-in-form.js +107 -0
  61. package/dist/admin/components/auth/sign-in-form.module.js +10 -0
  62. package/dist/admin/components/auth/sign-in-form_module.css +35 -0
  63. package/dist/admin/components/collections/diff-modal.d.ts +23 -0
  64. package/dist/admin/components/collections/diff-modal.d.ts.map +1 -0
  65. package/dist/admin/components/collections/diff-modal.js +147 -0
  66. package/dist/admin/components/collections/diff-modal.module.js +14 -0
  67. package/dist/admin/components/collections/diff-modal_module.css +56 -0
  68. package/dist/admin/components/collections/status-badge.d.ts +26 -0
  69. package/dist/admin/components/collections/status-badge.d.ts.map +1 -0
  70. package/dist/admin/components/collections/status-badge.js +35 -0
  71. package/dist/admin/components/collections/status-badge.module.js +7 -0
  72. package/dist/admin/components/collections/status-badge_module.css +20 -0
  73. package/dist/admin/group.d.ts +28 -0
  74. package/dist/admin/group.d.ts.map +1 -0
  75. package/dist/admin/group.js +14 -0
  76. package/dist/admin/group.module.js +6 -0
  77. package/dist/admin/group_module.css +19 -0
  78. package/dist/admin/row.d.ts +26 -0
  79. package/dist/admin/row.d.ts.map +1 -0
  80. package/dist/admin/row.js +8 -0
  81. package/dist/admin/row.module.js +5 -0
  82. package/dist/admin/row_module.css +18 -0
  83. package/dist/admin/tabs.d.ts +33 -0
  84. package/dist/admin/tabs.d.ts.map +1 -0
  85. package/dist/admin/tabs.js +34 -0
  86. package/dist/admin/tabs.module.js +10 -0
  87. package/dist/admin/tabs_module.css +68 -0
  88. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.js +105 -0
  89. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.module.js +12 -0
  90. package/dist/dnd/draggable-sortable/demo/draggable-list-demo_module.css +39 -0
  91. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts +19 -0
  92. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts.map +1 -0
  93. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.js +27 -0
  94. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts +25 -0
  95. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts.map +1 -0
  96. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.js +1 -0
  97. package/dist/dnd/draggable-sortable/draggable-sortable.d.ts +17 -0
  98. package/dist/dnd/draggable-sortable/draggable-sortable.d.ts.map +1 -0
  99. package/dist/dnd/draggable-sortable/draggable-sortable.js +46 -0
  100. package/dist/dnd/draggable-sortable/index.d.ts +5 -0
  101. package/dist/dnd/draggable-sortable/index.d.ts.map +1 -0
  102. package/dist/dnd/draggable-sortable/index.js +4 -0
  103. package/dist/dnd/draggable-sortable/types.d.ts +26 -0
  104. package/dist/dnd/draggable-sortable/types.d.ts.map +1 -0
  105. package/dist/dnd/draggable-sortable/types.js +1 -0
  106. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts +16 -0
  107. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts.map +1 -0
  108. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.js +28 -0
  109. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts +23 -0
  110. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts.map +1 -0
  111. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.js +1 -0
  112. package/dist/dnd/draggable-sortable/utils.d.ts +14 -0
  113. package/dist/dnd/draggable-sortable/utils.d.ts.map +1 -0
  114. package/dist/dnd/draggable-sortable/utils.js +10 -0
  115. package/dist/fields/array/array-field.d.ts +15 -0
  116. package/dist/fields/array/array-field.d.ts.map +1 -0
  117. package/dist/fields/array/array-field.js +176 -0
  118. package/dist/fields/array/array-field.module.js +11 -0
  119. package/dist/fields/array/array-field_module.css +32 -0
  120. package/dist/fields/blocks/blocks-field.d.ts +14 -0
  121. package/dist/fields/blocks/blocks-field.d.ts.map +1 -0
  122. package/dist/fields/blocks/blocks-field.js +244 -0
  123. package/dist/fields/blocks/blocks-field.module.js +26 -0
  124. package/dist/fields/blocks/blocks-field_module.css +107 -0
  125. package/dist/fields/checkbox/checkbox-field.d.ts +17 -0
  126. package/dist/fields/checkbox/checkbox-field.d.ts.map +1 -0
  127. package/dist/fields/checkbox/checkbox-field.js +27 -0
  128. package/dist/fields/column-formatter.d.ts +21 -0
  129. package/dist/fields/column-formatter.d.ts.map +1 -0
  130. package/dist/fields/column-formatter.js +15 -0
  131. package/dist/fields/date-time-formatter.d.ts +17 -0
  132. package/dist/fields/date-time-formatter.d.ts.map +1 -0
  133. package/dist/fields/date-time-formatter.js +8 -0
  134. package/dist/fields/datetime/datetime-field.d.ts +17 -0
  135. package/dist/fields/datetime/datetime-field.d.ts.map +1 -0
  136. package/dist/fields/datetime/datetime-field.js +37 -0
  137. package/dist/fields/datetime/datetime-field.module.js +5 -0
  138. package/dist/fields/datetime/datetime-field_module.css +4 -0
  139. package/dist/fields/draggable-context-menu.d.ts +7 -0
  140. package/dist/fields/draggable-context-menu.d.ts.map +1 -0
  141. package/dist/fields/draggable-context-menu.js +83 -0
  142. package/dist/fields/draggable-context-menu.module.js +15 -0
  143. package/dist/fields/draggable-context-menu_module.css +91 -0
  144. package/dist/fields/field-helpers.d.ts +27 -0
  145. package/dist/fields/field-helpers.d.ts.map +1 -0
  146. package/dist/fields/field-helpers.js +48 -0
  147. package/dist/fields/field-renderer.d.ts +31 -0
  148. package/dist/fields/field-renderer.d.ts.map +1 -0
  149. package/dist/fields/field-renderer.js +189 -0
  150. package/dist/fields/field-renderer.module.js +8 -0
  151. package/dist/fields/field-renderer_module.css +11 -0
  152. package/dist/fields/file/file-field.d.ts +18 -0
  153. package/dist/fields/file/file-field.d.ts.map +1 -0
  154. package/dist/fields/file/file-field.js +125 -0
  155. package/dist/fields/file/file-field.module.js +13 -0
  156. package/dist/fields/file/file-field_module.css +64 -0
  157. package/dist/fields/group/group-field.d.ts +16 -0
  158. package/dist/fields/group/group-field.d.ts.map +1 -0
  159. package/dist/fields/group/group-field.js +59 -0
  160. package/dist/fields/group/group-field.module.js +9 -0
  161. package/dist/fields/group/group-field_module.css +27 -0
  162. package/dist/fields/image/image-field.d.ts +20 -0
  163. package/dist/fields/image/image-field.d.ts.map +1 -0
  164. package/dist/fields/image/image-field.js +198 -0
  165. package/dist/fields/image/image-field.module.js +21 -0
  166. package/dist/fields/image/image-field_module.css +96 -0
  167. package/dist/fields/image/image-upload-field.d.ts +22 -0
  168. package/dist/fields/image/image-upload-field.d.ts.map +1 -0
  169. package/dist/fields/image/image-upload-field.js +187 -0
  170. package/dist/fields/image/image-upload-field.module.js +19 -0
  171. package/dist/fields/image/image-upload-field_module.css +92 -0
  172. package/dist/fields/local-date-time.d.ts +28 -0
  173. package/dist/fields/local-date-time.d.ts.map +1 -0
  174. package/dist/fields/local-date-time.js +49 -0
  175. package/dist/fields/locale-badge.d.ts +19 -0
  176. package/dist/fields/locale-badge.d.ts.map +1 -0
  177. package/dist/fields/locale-badge.js +10 -0
  178. package/dist/fields/locale-badge.module.js +5 -0
  179. package/dist/fields/locale-badge_module.css +27 -0
  180. package/dist/fields/numerical/numerical-field.d.ts +19 -0
  181. package/dist/fields/numerical/numerical-field.d.ts.map +1 -0
  182. package/dist/fields/numerical/numerical-field.js +73 -0
  183. package/dist/fields/relation/relation-display.d.ts +41 -0
  184. package/dist/fields/relation/relation-display.d.ts.map +1 -0
  185. package/dist/fields/relation/relation-display.js +58 -0
  186. package/dist/fields/relation/relation-display.module.js +9 -0
  187. package/dist/fields/relation/relation-display_module.css +21 -0
  188. package/dist/fields/relation/relation-field.d.ts +19 -0
  189. package/dist/fields/relation/relation-field.d.ts.map +1 -0
  190. package/dist/fields/relation/relation-field.js +133 -0
  191. package/dist/fields/relation/relation-field.module.js +13 -0
  192. package/dist/fields/relation/relation-field_module.css +62 -0
  193. package/dist/fields/relation/relation-picker.d.ts +50 -0
  194. package/dist/fields/relation/relation-picker.d.ts.map +1 -0
  195. package/dist/fields/relation/relation-picker.js +233 -0
  196. package/dist/fields/relation/relation-picker.module.js +26 -0
  197. package/dist/fields/relation/relation-picker_module.css +124 -0
  198. package/dist/fields/relation/relation-summary.d.ts +32 -0
  199. package/dist/fields/relation/relation-summary.d.ts.map +1 -0
  200. package/dist/fields/relation/relation-summary.js +50 -0
  201. package/dist/fields/relation/relation-summary.module.js +11 -0
  202. package/dist/fields/relation/relation-summary_module.css +37 -0
  203. package/dist/fields/select/select-field.d.ts +17 -0
  204. package/dist/fields/select/select-field.d.ts.map +1 -0
  205. package/dist/fields/select/select-field.js +42 -0
  206. package/dist/fields/select/select-field.module.js +5 -0
  207. package/dist/fields/select/select-field_module.css +4 -0
  208. package/dist/fields/sortable-item.d.ts +16 -0
  209. package/dist/fields/sortable-item.d.ts.map +1 -0
  210. package/dist/fields/sortable-item.js +80 -0
  211. package/dist/fields/sortable-item.module.js +22 -0
  212. package/dist/fields/sortable-item_module.css +124 -0
  213. package/dist/fields/text/text-field.d.ts +21 -0
  214. package/dist/fields/text/text-field.d.ts.map +1 -0
  215. package/dist/fields/text/text-field.js +104 -0
  216. package/dist/fields/text/text-field.module.js +6 -0
  217. package/dist/fields/text/text-field_module.css +5 -0
  218. package/dist/fields/text-area/text-area-field.d.ts +21 -0
  219. package/dist/fields/text-area/text-area-field.d.ts.map +1 -0
  220. package/dist/fields/text-area/text-area-field.js +105 -0
  221. package/dist/fields/text-area/text-area-field.module.js +6 -0
  222. package/dist/fields/text-area/text-area-field_module.css +5 -0
  223. package/dist/fields/use-field-change-handler.d.ts +24 -0
  224. package/dist/fields/use-field-change-handler.d.ts.map +1 -0
  225. package/dist/fields/use-field-change-handler.js +52 -0
  226. package/dist/forms/document-actions.d.ts +14 -0
  227. package/dist/forms/document-actions.d.ts.map +1 -0
  228. package/dist/forms/document-actions.js +153 -0
  229. package/dist/forms/document-actions.module.js +18 -0
  230. package/dist/forms/document-actions_module.css +66 -0
  231. package/dist/forms/form-context.d.ts +78 -0
  232. package/dist/forms/form-context.d.ts.map +1 -0
  233. package/dist/forms/form-context.js +420 -0
  234. package/dist/forms/form-renderer.d.ts +66 -0
  235. package/dist/forms/form-renderer.d.ts.map +1 -0
  236. package/dist/forms/form-renderer.js +555 -0
  237. package/dist/forms/form-renderer.module.js +46 -0
  238. package/dist/forms/form-renderer_module.css +242 -0
  239. package/dist/forms/navigation-guard.d.ts +55 -0
  240. package/dist/forms/navigation-guard.d.ts.map +1 -0
  241. package/dist/forms/navigation-guard.js +22 -0
  242. package/dist/forms/path-widget.d.ts +33 -0
  243. package/dist/forms/path-widget.d.ts.map +1 -0
  244. package/dist/forms/path-widget.js +101 -0
  245. package/dist/forms/path-widget.module.js +8 -0
  246. package/dist/forms/path-widget_module.css +29 -0
  247. package/dist/forms/upload-executor.d.ts +58 -0
  248. package/dist/forms/upload-executor.d.ts.map +1 -0
  249. package/dist/forms/upload-executor.js +92 -0
  250. package/dist/react.d.ts +55 -0
  251. package/dist/react.d.ts.map +1 -0
  252. package/dist/react.js +48 -0
  253. package/dist/services/admin-services-context.d.ts +17 -0
  254. package/dist/services/admin-services-context.d.ts.map +1 -0
  255. package/dist/services/admin-services-context.js +13 -0
  256. package/dist/services/admin-services-types.d.ts +130 -0
  257. package/dist/services/admin-services-types.d.ts.map +1 -0
  258. package/dist/services/admin-services-types.js +1 -0
  259. package/dist/services/field-services-context.d.ts +17 -0
  260. package/dist/services/field-services-context.d.ts.map +1 -0
  261. package/dist/services/field-services-context.js +13 -0
  262. package/dist/services/field-services-types.d.ts +64 -0
  263. package/dist/services/field-services-types.d.ts.map +1 -0
  264. package/dist/services/field-services-types.js +1 -0
  265. package/package.json +133 -0
  266. package/src/admin/components/admin-account/change-password.module.css +40 -0
  267. package/src/admin/components/admin-account/change-password.tsx +232 -0
  268. package/src/admin/components/admin-account/container.module.css +158 -0
  269. package/src/admin/components/admin-account/container.tsx +230 -0
  270. package/src/admin/components/admin-account/update.module.css +40 -0
  271. package/src/admin/components/admin-account/update.tsx +263 -0
  272. package/src/admin/components/admin-permissions/inspector.module.css +326 -0
  273. package/src/admin/components/admin-permissions/inspector.tsx +298 -0
  274. package/src/admin/components/admin-roles/create.module.css +40 -0
  275. package/src/admin/components/admin-roles/create.tsx +218 -0
  276. package/src/admin/components/admin-roles/permissions.module.css +279 -0
  277. package/src/admin/components/admin-roles/permissions.tsx +396 -0
  278. package/src/admin/components/admin-roles/update.module.css +40 -0
  279. package/src/admin/components/admin-roles/update.tsx +218 -0
  280. package/src/admin/components/admin-users/create.module.css +63 -0
  281. package/src/admin/components/admin-users/create.tsx +323 -0
  282. package/src/admin/components/admin-users/roles.module.css +119 -0
  283. package/src/admin/components/admin-users/roles.tsx +172 -0
  284. package/src/admin/components/admin-users/set-password.module.css +46 -0
  285. package/src/admin/components/admin-users/set-password.tsx +199 -0
  286. package/src/admin/components/admin-users/update.module.css +49 -0
  287. package/src/admin/components/admin-users/update.tsx +328 -0
  288. package/src/admin/components/auth/sign-in-form.module.css +53 -0
  289. package/src/admin/components/auth/sign-in-form.tsx +118 -0
  290. package/src/admin/components/collections/diff-modal.module.css +79 -0
  291. package/src/admin/components/collections/diff-modal.tsx +171 -0
  292. package/src/admin/components/collections/status-badge.module.css +31 -0
  293. package/src/admin/components/collections/status-badge.tsx +69 -0
  294. package/src/admin/group.module.css +41 -0
  295. package/src/admin/group.tsx +40 -0
  296. package/src/admin/row.module.css +32 -0
  297. package/src/admin/row.tsx +33 -0
  298. package/src/admin/tabs.module.css +107 -0
  299. package/src/admin/tabs.tsx +74 -0
  300. package/src/declarations.d.ts +4 -0
  301. package/src/dnd/draggable-sortable/demo/draggable-list-demo.module.css +65 -0
  302. package/src/dnd/draggable-sortable/demo/draggable-list-demo.tsx +117 -0
  303. package/src/dnd/draggable-sortable/draggable-sortable-item/index.tsx +54 -0
  304. package/src/dnd/draggable-sortable/draggable-sortable-item/types.ts +30 -0
  305. package/src/dnd/draggable-sortable/draggable-sortable.tsx +86 -0
  306. package/src/dnd/draggable-sortable/index.ts +5 -0
  307. package/src/dnd/draggable-sortable/types.ts +24 -0
  308. package/src/dnd/draggable-sortable/use-draggable-sortable/index.tsx +50 -0
  309. package/src/dnd/draggable-sortable/use-draggable-sortable/types.ts +25 -0
  310. package/src/dnd/draggable-sortable/utils.ts +29 -0
  311. package/src/fields/array/array-field.module.css +48 -0
  312. package/src/fields/array/array-field.tsx +266 -0
  313. package/src/fields/blocks/blocks-field.module.css +148 -0
  314. package/src/fields/blocks/blocks-field.tsx +312 -0
  315. package/src/fields/checkbox/checkbox-field.tsx +53 -0
  316. package/src/fields/column-formatter.tsx +31 -0
  317. package/src/fields/date-time-formatter.tsx +22 -0
  318. package/src/fields/datetime/datetime-field.module.css +13 -0
  319. package/src/fields/datetime/datetime-field.tsx +54 -0
  320. package/src/fields/draggable-context-menu.module.css +127 -0
  321. package/src/fields/draggable-context-menu.tsx +85 -0
  322. package/src/fields/field-helpers.ts +66 -0
  323. package/src/fields/field-renderer.module.css +22 -0
  324. package/src/fields/field-renderer.tsx +255 -0
  325. package/src/fields/file/file-field.module.css +88 -0
  326. package/src/fields/file/file-field.tsx +107 -0
  327. package/src/fields/group/group-field.module.css +43 -0
  328. package/src/fields/group/group-field.tsx +84 -0
  329. package/src/fields/image/image-field.module.css +129 -0
  330. package/src/fields/image/image-field.tsx +212 -0
  331. package/src/fields/image/image-upload-field.module.css +123 -0
  332. package/src/fields/image/image-upload-field.tsx +270 -0
  333. package/src/fields/local-date-time.tsx +88 -0
  334. package/src/fields/locale-badge.module.css +37 -0
  335. package/src/fields/locale-badge.tsx +32 -0
  336. package/src/fields/numerical/numerical-field.tsx +112 -0
  337. package/src/fields/relation/relation-display.module.css +36 -0
  338. package/src/fields/relation/relation-display.tsx +130 -0
  339. package/src/fields/relation/relation-field.module.css +83 -0
  340. package/src/fields/relation/relation-field.tsx +202 -0
  341. package/src/fields/relation/relation-picker.module.css +168 -0
  342. package/src/fields/relation/relation-picker.tsx +325 -0
  343. package/src/fields/relation/relation-summary.module.css +55 -0
  344. package/src/fields/relation/relation-summary.tsx +123 -0
  345. package/src/fields/select/select-field.module.css +13 -0
  346. package/src/fields/select/select-field.tsx +56 -0
  347. package/src/fields/sortable-item.module.css +167 -0
  348. package/src/fields/sortable-item.tsx +101 -0
  349. package/src/fields/text/text-field.module.css +13 -0
  350. package/src/fields/text/text-field.tsx +146 -0
  351. package/src/fields/text-area/text-area-field.module.css +13 -0
  352. package/src/fields/text-area/text-area-field.tsx +147 -0
  353. package/src/fields/use-field-change-handler.ts +112 -0
  354. package/src/forms/document-actions.module.css +94 -0
  355. package/src/forms/document-actions.tsx +149 -0
  356. package/src/forms/form-context.tsx +620 -0
  357. package/src/forms/form-renderer.module.css +318 -0
  358. package/src/forms/form-renderer.tsx +786 -0
  359. package/src/forms/navigation-guard.tsx +98 -0
  360. package/src/forms/path-widget.module.css +41 -0
  361. package/src/forms/path-widget.test.tsx +217 -0
  362. package/src/forms/path-widget.tsx +141 -0
  363. package/src/forms/upload-executor.ts +190 -0
  364. package/src/react.ts +79 -0
  365. package/src/services/admin-services-context.tsx +35 -0
  366. package/src/services/admin-services-types.ts +177 -0
  367. package/src/services/field-services-context.tsx +35 -0
  368. package/src/services/field-services-types.ts +68 -0
@@ -0,0 +1,130 @@
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
+
9
+ import type { CollectionDefinition, ColumnDefinition } from '@byline/core'
10
+ import cx from 'classnames'
11
+
12
+ import styles from './relation-display.module.css'
13
+
14
+ // ---------------------------------------------------------------------------
15
+ // Shared render helpers used by both the relation picker modal rows and
16
+ // the relation-summary tile on the edit form. Kept in lock-step so a row
17
+ // rendered in the picker looks identical to the selected tile.
18
+ // ---------------------------------------------------------------------------
19
+
20
+ /**
21
+ * Render a single row cell from a `ColumnDefinition`, reading the value
22
+ * from the document's `fields` (with a fallback to top-level metadata like
23
+ * `status`, `updated_at`, `path`). Honours both formatter shapes — plain
24
+ * function → its return value, `{ component }` → the component is rendered.
25
+ */
26
+ export function PickerCell({
27
+ column,
28
+ record,
29
+ }: {
30
+ column: ColumnDefinition
31
+ record: Record<string, any>
32
+ }) {
33
+ const name = String(column.fieldName)
34
+ const value = record?.fields?.[name] ?? record?.[name]
35
+
36
+ let content: any
37
+ if (column.formatter) {
38
+ if (typeof column.formatter === 'function') {
39
+ content = column.formatter(value, record)
40
+ } else {
41
+ const Comp = column.formatter.component
42
+ content = <Comp value={value} record={record} />
43
+ }
44
+ } else if (value == null) {
45
+ content = null
46
+ } else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
47
+ content = String(value)
48
+ } else {
49
+ content = null
50
+ }
51
+
52
+ return (
53
+ <div
54
+ className={cx(
55
+ 'byline-relation-cell',
56
+ styles.cell,
57
+ column.align === 'center' && ['byline-relation-cell-center', styles['cell-center']],
58
+ column.align === 'right' && ['byline-relation-cell-right', styles['cell-right']],
59
+ column.className
60
+ )}
61
+ >
62
+ {content}
63
+ </div>
64
+ )
65
+ }
66
+
67
+ /** First top-level `text` field name on a collection, or null. */
68
+ export function resolveFallbackDisplayField(
69
+ def: CollectionDefinition | null | undefined
70
+ ): string | null {
71
+ if (!def) return null
72
+ const textField = def.fields.find((f) => f.type === 'text')
73
+ return textField?.name ?? null
74
+ }
75
+
76
+ /** Resolve the row's primary label text from the document. */
77
+ export function resolveRowLabel(
78
+ doc: Record<string, any> | null | undefined,
79
+ displayField: string | null
80
+ ): string | null {
81
+ if (!doc) return null
82
+ if (displayField) {
83
+ const v = doc.fields?.[displayField]
84
+ if (typeof v === 'string' && v.length > 0) return v
85
+ }
86
+ if (typeof doc.fields?.title === 'string' && doc.fields.title.length > 0) {
87
+ return doc.fields.title as string
88
+ }
89
+ if (typeof doc.path === 'string' && doc.path.length > 0) return doc.path as string
90
+ return null
91
+ }
92
+
93
+ /**
94
+ * Build the `fields` projection for the picker listing. Unions:
95
+ * - caller-supplied `displayField`
96
+ * - target schema's `useAsTitle` (always included, even when not visible)
97
+ * - every `fieldName` declared in the admin config's `picker` columns
98
+ * - `title` (metadata fallback for rows with no explicit picker columns)
99
+ *
100
+ * Note that the document `path` is top-level metadata on every list response
101
+ * — it is always returned by `getCollectionDocuments` regardless of the
102
+ * `fields` projection. Callers that need `{ title, path }` for downstream
103
+ * normalisation (e.g. the rich-text link plugin) can rely on:
104
+ * - `record.fields[def.useAsTitle]` for the title
105
+ * - `record.path` for the path
106
+ *
107
+ * Returns `undefined` when no target definition is available, leaving the
108
+ * listing endpoint to decide its own default projection.
109
+ */
110
+ export function resolveSelectFields(
111
+ def: CollectionDefinition | null | undefined,
112
+ displayField: string | undefined,
113
+ pickerColumns: ColumnDefinition[] | undefined
114
+ ): string[] | undefined {
115
+ if (!def) return undefined
116
+ const out = new Set<string>()
117
+ if (displayField) out.add(displayField)
118
+ if (def.useAsTitle) out.add(def.useAsTitle)
119
+ const fallback = resolveFallbackDisplayField(def)
120
+ if (fallback) out.add(fallback)
121
+ if (pickerColumns) {
122
+ for (const col of pickerColumns) {
123
+ const name = String(col.fieldName)
124
+ if (def.fields.some((f) => f.name === name)) out.add(name)
125
+ }
126
+ }
127
+ if (def.fields.some((f) => f.name === 'title')) out.add('title')
128
+ if (out.size === 0) return undefined
129
+ return Array.from(out)
130
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * RelationField — widget for `type: 'relation'` fields.
3
+ *
4
+ * Override handles:
5
+ * .byline-field-relation — outer wrapper
6
+ * .byline-field-relation-header — label + remove-button row
7
+ * .byline-field-relation-remove — text-link remove button
8
+ * .byline-field-relation-help — help text below the label
9
+ * .byline-field-relation-error-tile — wrapper shown when target collection is unknown
10
+ * .byline-field-relation-error-text — secondary error message below the title
11
+ * .byline-field-relation-tile — bordered selected-value + change-button container
12
+ * .byline-field-relation-mono — monospace `<code>` for field/collection names
13
+ */
14
+
15
+ .header,
16
+ :global(.byline-field-relation-header) {
17
+ display: flex;
18
+ align-items: baseline;
19
+ gap: var(--spacing-8);
20
+ margin-bottom: 0.25rem;
21
+ }
22
+
23
+ .remove,
24
+ :global(.byline-field-relation-remove) {
25
+ background: none;
26
+ border: none;
27
+ padding: 0;
28
+ color: var(--red-500);
29
+ font-size: var(--font-size-xs);
30
+ cursor: pointer;
31
+ }
32
+
33
+ .remove:hover,
34
+ :global(.byline-field-relation-remove):hover {
35
+ color: var(--red-400);
36
+ text-decoration: underline;
37
+ text-underline-offset: 2px;
38
+ }
39
+
40
+ .help,
41
+ :global(.byline-field-relation-help) {
42
+ margin-bottom: 0.25rem;
43
+ color: var(--gray-400);
44
+ font-size: var(--font-size-xs);
45
+ }
46
+
47
+ .error-tile,
48
+ :global(.byline-field-relation-error-tile) {
49
+ display: flex;
50
+ flex-direction: column;
51
+ gap: 0.25rem;
52
+ margin-top: 0.25rem;
53
+ padding: var(--spacing-8);
54
+ border: var(--border-width-thin) var(--border-style-solid) var(--red-700);
55
+ background-color: oklch(from var(--red-900) l c h / 0.2);
56
+ border-radius: var(--border-radius-md);
57
+ color: var(--red-200);
58
+ font-size: var(--font-size-xs);
59
+ }
60
+
61
+ .error-text,
62
+ :global(.byline-field-relation-error-text) {
63
+ color: oklch(from var(--red-400) l c h / 0.8);
64
+ }
65
+
66
+ .tile,
67
+ :global(.byline-field-relation-tile) {
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: space-between;
71
+ gap: var(--spacing-8);
72
+ margin-top: 0.25rem;
73
+ padding: var(--spacing-8);
74
+ border: var(--border-width-thin) var(--border-style-solid) var(--primary-500);
75
+ border-radius: var(--border-radius-md);
76
+ color: var(--gray-200);
77
+ font-size: var(--font-size-xs);
78
+ }
79
+
80
+ .mono,
81
+ :global(.byline-field-relation-mono) {
82
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
83
+ }
@@ -0,0 +1,202 @@
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
+
9
+ import { useState } from 'react'
10
+
11
+ import type {
12
+ CollectionAdminConfig,
13
+ CollectionDefinition,
14
+ RelationField as FieldType,
15
+ RelatedDocumentValue,
16
+ } from '@byline/core'
17
+ import { getCollectionAdminConfig, getCollectionDefinition } from '@byline/core'
18
+ import { Button, ErrorText, Label } from '@infonomic/uikit/react'
19
+ import cx from 'classnames'
20
+
21
+ import { useFieldError, useFieldValue } from '../../forms/form-context'
22
+ import styles from './relation-field.module.css'
23
+ import { RelationPicker } from './relation-picker'
24
+ import { RelationSummary } from './relation-summary'
25
+
26
+ // The raw form value for a relation field is `RelatedDocumentValue`, but
27
+ // when the edit loader runs server-side populate the value arrives as a
28
+ // `PopulatedRelationValue` (same base shape, plus `_resolved` / `document`
29
+ // discriminator keys). We accept both here and let `RelationSummary`
30
+ // narrow internally.
31
+ type IncomingRelationValue = RelatedDocumentValue & {
32
+ _resolved?: boolean
33
+ _cycle?: boolean
34
+ document?: Record<string, any>
35
+ }
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // RelationField — widget for `type: 'relation'` fields
39
+ // ---------------------------------------------------------------------------
40
+
41
+ interface RelationFieldProps {
42
+ field: FieldType
43
+ value?: RelatedDocumentValue | null
44
+ defaultValue?: RelatedDocumentValue | null
45
+ onChange?: (value: RelatedDocumentValue | null) => void
46
+ id?: string
47
+ path?: string
48
+ }
49
+
50
+ export const RelationField = ({
51
+ field,
52
+ value,
53
+ defaultValue,
54
+ onChange,
55
+ id,
56
+ path,
57
+ }: RelationFieldProps) => {
58
+ const fieldPath = path ?? field.name
59
+ const htmlId = id ?? fieldPath
60
+ const fieldError = useFieldError(fieldPath)
61
+ const fieldValue = useFieldValue<IncomingRelationValue | null | undefined>(fieldPath)
62
+
63
+ const incomingValue: IncomingRelationValue | null =
64
+ fieldValue !== undefined
65
+ ? ((fieldValue as IncomingRelationValue | null) ?? null)
66
+ : ((value as IncomingRelationValue | null) ??
67
+ (defaultValue as IncomingRelationValue | null) ??
68
+ null)
69
+
70
+ // Resolve the target collection definition + admin config. The admin
71
+ // config drives the picker-column rendering inside RelationSummary so
72
+ // the selected tile matches the picker row exactly. Missing target →
73
+ // render an inline error and disable the picker.
74
+ const targetDef: CollectionDefinition | null = getCollectionDefinition(field.targetCollection)
75
+ const targetAdminConfig: CollectionAdminConfig | null = getCollectionAdminConfig(
76
+ field.targetCollection
77
+ )
78
+
79
+ const [pickerOpen, setPickerOpen] = useState(false)
80
+ // Cached target document from the most recent picker selection. Lets the
81
+ // tile render real display data (name, thumbnail) immediately after a
82
+ // pick without a round trip. Cleared via the `targetDocumentId`
83
+ // comparison in the render path.
84
+ const [pickedRecord, setPickedRecord] = useState<{
85
+ id: string
86
+ record: Record<string, any>
87
+ } | null>(null)
88
+
89
+ const handleSelect = (selection: {
90
+ targetDocumentId: string
91
+ targetCollectionId: string
92
+ record?: Record<string, any>
93
+ }) => {
94
+ setPickerOpen(false)
95
+ if (selection.record) {
96
+ setPickedRecord({ id: selection.targetDocumentId, record: selection.record })
97
+ } else {
98
+ setPickedRecord(null)
99
+ }
100
+ onChange?.({
101
+ targetDocumentId: selection.targetDocumentId,
102
+ targetCollectionId: selection.targetCollectionId,
103
+ })
104
+ }
105
+
106
+ const handleRemove = () => {
107
+ setPickedRecord(null)
108
+ onChange?.(null)
109
+ }
110
+
111
+ // Only carry the cached picker record through to the summary when it
112
+ // still matches the current value — guards against a stale cache after
113
+ // an external value change (e.g. patch rollback).
114
+ const cachedRecord =
115
+ pickedRecord && incomingValue && pickedRecord.id === incomingValue.targetDocumentId
116
+ ? pickedRecord.record
117
+ : null
118
+
119
+ const isUnknown = targetDef == null
120
+ const monoClass = cx('byline-field-relation-mono', styles.mono)
121
+
122
+ return (
123
+ <div className={`byline-field-relation ${field.name}`}>
124
+ <div className={cx('byline-field-relation-header', styles.header)}>
125
+ <Label
126
+ id={`${htmlId}-label`}
127
+ htmlFor={htmlId}
128
+ label={field.label ?? field.name}
129
+ required={!field.optional}
130
+ />
131
+ {incomingValue && !isUnknown && (
132
+ <button
133
+ type="button"
134
+ className={cx('byline-field-relation-remove', styles.remove)}
135
+ onClick={handleRemove}
136
+ >
137
+ Remove
138
+ </button>
139
+ )}
140
+ </div>
141
+ {field.helpText && (
142
+ <div className={cx('byline-field-relation-help', styles.help)}>{field.helpText}</div>
143
+ )}
144
+
145
+ {isUnknown ? (
146
+ <div className={cx('byline-field-relation-error-tile', styles['error-tile'])}>
147
+ <span>
148
+ Relation field <code className={monoClass}>{field.name}</code> targets unknown
149
+ collection <code className={monoClass}>{field.targetCollection}</code>.
150
+ </span>
151
+ <span className={cx('byline-field-relation-error-text', styles['error-text'])}>
152
+ Register the collection in your Byline config or correct the target path.
153
+ </span>
154
+ </div>
155
+ ) : incomingValue ? (
156
+ <div className={cx('byline-field-relation-tile', styles.tile)}>
157
+ <RelationSummary
158
+ targetDefinition={targetDef}
159
+ targetAdminConfig={targetAdminConfig}
160
+ displayField={field.displayField}
161
+ value={incomingValue}
162
+ cachedRecord={cachedRecord}
163
+ />
164
+ <Button
165
+ id={htmlId}
166
+ size="xs"
167
+ variant="outlined"
168
+ intent="noeffect"
169
+ type="button"
170
+ onClick={() => setPickerOpen(true)}
171
+ >
172
+ Change
173
+ </Button>
174
+ </div>
175
+ ) : (
176
+ <Button
177
+ id={htmlId}
178
+ size="xs"
179
+ variant="outlined"
180
+ intent="noeffect"
181
+ type="button"
182
+ onClick={() => setPickerOpen(true)}
183
+ >
184
+ Select {targetDef.labels.singular}…
185
+ </Button>
186
+ )}
187
+
188
+ {fieldError && <ErrorText id={`${field.name}-error`} text={fieldError} />}
189
+
190
+ {!isUnknown && (
191
+ <RelationPicker
192
+ targetCollectionPath={field.targetCollection}
193
+ targetDefinition={targetDef}
194
+ displayField={field.displayField}
195
+ isOpen={pickerOpen}
196
+ onSelect={handleSelect}
197
+ onDismiss={() => setPickerOpen(false)}
198
+ />
199
+ )}
200
+ </div>
201
+ )
202
+ }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * RelationPicker — modal listing for selecting a target document.
3
+ *
4
+ * Override handles:
5
+ * .byline-field-relation-picker — picker chrome wrapper
6
+ * .byline-field-relation-picker-header — modal header (title)
7
+ * .byline-field-relation-picker-title — title text
8
+ * .byline-field-relation-picker-body — vertical stack of search + list + pager
9
+ * .byline-field-relation-picker-list — scrollable list container
10
+ * .byline-field-relation-picker-loading — centered spinner row
11
+ * .byline-field-relation-picker-error — error message row
12
+ * .byline-field-relation-picker-empty — "no results" message row
13
+ * .byline-field-relation-picker-rows — <ul> of rows
14
+ * .byline-field-relation-picker-row-button — clickable row button
15
+ * .byline-field-relation-picker-row-selected — added when row is selected
16
+ * .byline-field-relation-picker-row-cells — picker-columns layout inside a row
17
+ * .byline-field-relation-picker-row-stack — fallback label/path stack
18
+ * .byline-field-relation-picker-row-label — fallback row label text
19
+ * .byline-field-relation-picker-row-path — fallback row secondary path
20
+ * .byline-field-relation-picker-pager — pager row at the bottom
21
+ * .byline-field-relation-picker-action — Cancel / Select buttons
22
+ */
23
+
24
+ .header,
25
+ :global(.byline-field-relation-picker-header) {
26
+ padding-top: 1rem;
27
+ margin-bottom: var(--spacing-8);
28
+ }
29
+
30
+ .title,
31
+ :global(.byline-field-relation-picker-title) {
32
+ margin: 0 0 var(--spacing-8) 0;
33
+ font-size: var(--font-size-xl);
34
+ }
35
+
36
+ .body,
37
+ :global(.byline-field-relation-picker-body) {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: 0.75rem;
41
+ }
42
+
43
+ .list,
44
+ :global(.byline-field-relation-picker-list) {
45
+ min-height: 320px;
46
+ max-height: 420px;
47
+ overflow-y: auto;
48
+ border: var(--border-width-thin) var(--border-style-solid) var(--gray-700);
49
+ border-radius: var(--border-radius-md);
50
+ }
51
+
52
+ .loading,
53
+ :global(.byline-field-relation-picker-loading) {
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ padding: 2.5rem 0;
58
+ }
59
+
60
+ .error,
61
+ :global(.byline-field-relation-picker-error) {
62
+ padding: 2.5rem 1rem;
63
+ color: var(--red-500);
64
+ font-size: var(--font-size-sm);
65
+ text-align: center;
66
+ }
67
+
68
+ .empty,
69
+ :global(.byline-field-relation-picker-empty) {
70
+ padding: 2.5rem 1rem;
71
+ color: var(--gray-400);
72
+ font-size: var(--font-size-sm);
73
+ text-align: center;
74
+ }
75
+
76
+ .rows,
77
+ :global(.byline-field-relation-picker-rows) {
78
+ margin: 0;
79
+ padding: 0;
80
+ list-style: none;
81
+ }
82
+
83
+ .rows > li + li,
84
+ :global(.byline-field-relation-picker-rows) > li + li {
85
+ border-top: var(--border-width-thin) var(--border-style-solid) var(--gray-700);
86
+ }
87
+
88
+ .row-button,
89
+ :global(.byline-field-relation-picker-row-button) {
90
+ width: 100%;
91
+ padding: var(--spacing-8) 0.75rem;
92
+ border: none;
93
+ background: none;
94
+ text-align: left;
95
+ color: inherit;
96
+ cursor: pointer;
97
+ transition: background-color 150ms ease;
98
+ }
99
+
100
+ .row-button:hover,
101
+ :global(.byline-field-relation-picker-row-button):hover {
102
+ background-color: var(--gray-25);
103
+ }
104
+
105
+ .row-selected,
106
+ :global(.byline-field-relation-picker-row-selected) {
107
+ background-color: oklch(from var(--primary-200) l c h / 0.3);
108
+ border-left: 2px solid var(--primary-200);
109
+ }
110
+
111
+ .row-cells,
112
+ :global(.byline-field-relation-picker-row-cells) {
113
+ display: flex;
114
+ align-items: center;
115
+ gap: 0.75rem;
116
+ }
117
+
118
+ .row-stack,
119
+ :global(.byline-field-relation-picker-row-stack) {
120
+ display: flex;
121
+ flex-direction: column;
122
+ gap: 0.125rem;
123
+ }
124
+
125
+ .row-label,
126
+ :global(.byline-field-relation-picker-row-label) {
127
+ color: var(--gray-100);
128
+ font-size: var(--font-size-sm);
129
+ overflow: hidden;
130
+ text-overflow: ellipsis;
131
+ white-space: nowrap;
132
+ }
133
+
134
+ .row-path,
135
+ :global(.byline-field-relation-picker-row-path) {
136
+ color: var(--gray-500);
137
+ font-size: var(--font-size-xs);
138
+ overflow: hidden;
139
+ text-overflow: ellipsis;
140
+ white-space: nowrap;
141
+ }
142
+
143
+ .pager,
144
+ :global(.byline-field-relation-picker-pager) {
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: space-between;
148
+ color: var(--gray-400);
149
+ font-size: var(--font-size-xs);
150
+ }
151
+
152
+ .action,
153
+ :global(.byline-field-relation-picker-action) {
154
+ min-width: 70px;
155
+ }
156
+
157
+ :is([data-theme="dark"], :global(.dark)) {
158
+ .row-button:hover,
159
+ :global(.byline-field-relation-picker-row-button):hover {
160
+ background-color: var(--gray-900);
161
+ }
162
+
163
+ .row-selected,
164
+ :global(.byline-field-relation-picker-row-selected) {
165
+ background-color: oklch(from var(--primary-900) l c h / 0.3);
166
+ border-left: 2px solid var(--primary-400);
167
+ }
168
+ }