@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,328 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * This Source Code is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ *
8
+ * Copyright (c) Infonomic Company Limited
9
+ */
10
+
11
+ /**
12
+ * Account details drawer form.
13
+ *
14
+ * Client-side validation runs through TanStack Form's `onDynamic` +
15
+ * Zod — same rules the server uses, re-declared here so field errors
16
+ * show up without a network round-trip. On submit the form diffs
17
+ * against the original row and sends only the *changed* fields as a
18
+ * patch, plus the `vid` the form was opened with, so a concurrent edit
19
+ * elsewhere comes back as `admin.users.versionConflict` and we surface
20
+ * a reload prompt.
21
+ */
22
+
23
+ import { useState } from 'react'
24
+ import { revalidateLogic, useForm } from '@tanstack/react-form-start'
25
+
26
+ import type { AdminUserResponse } from '@byline/admin/admin-users'
27
+ import { Alert, Button, Checkbox, Input, LoaderEllipsis } from '@infonomic/uikit/react'
28
+ import cx from 'classnames'
29
+ import { z } from 'zod'
30
+
31
+ import { useBylineAdminServices } from '../../../services/admin-services-context.js'
32
+ import styles from './update.module.css'
33
+
34
+ const updateUserSchema = z.object({
35
+ given_name: z.string().max(100, 'Given name must not exceed 100 characters'),
36
+ family_name: z.string().max(100, 'Family name must not exceed 100 characters'),
37
+ username: z.string().max(100, 'Username must not exceed 100 characters'),
38
+ email: z
39
+ .email({ message: 'Enter a valid email address' })
40
+ .min(3)
41
+ .max(254, 'Email must not exceed 254 characters'),
42
+ is_super_admin: z.boolean(),
43
+ is_enabled: z.boolean(),
44
+ is_email_verified: z.boolean(),
45
+ })
46
+
47
+ type UpdateUserValues = z.infer<typeof updateUserSchema>
48
+
49
+ function defaultsFrom(user: AdminUserResponse): UpdateUserValues {
50
+ return {
51
+ given_name: user.given_name ?? '',
52
+ family_name: user.family_name ?? '',
53
+ username: user.username ?? '',
54
+ email: user.email,
55
+ is_super_admin: user.is_super_admin,
56
+ is_enabled: user.is_enabled,
57
+ is_email_verified: user.is_email_verified,
58
+ }
59
+ }
60
+
61
+ /** Build a patch object containing only fields whose values differ from the original user row. */
62
+ function buildPatch(values: UpdateUserValues, user: AdminUserResponse) {
63
+ const patch: {
64
+ given_name?: string | null
65
+ family_name?: string | null
66
+ username?: string | null
67
+ email?: string
68
+ is_super_admin?: boolean
69
+ is_enabled?: boolean
70
+ is_email_verified?: boolean
71
+ } = {}
72
+ // Text fields: treat empty string as null (clear). null === null matches,
73
+ // '' → null ≠ current null stays consistent.
74
+ const normaliseText = (value: string): string | null => (value.trim().length > 0 ? value : null)
75
+ const nextGiven = normaliseText(values.given_name)
76
+ const nextFamily = normaliseText(values.family_name)
77
+ const nextUsername = normaliseText(values.username)
78
+
79
+ if (nextGiven !== user.given_name) patch.given_name = nextGiven
80
+ if (nextFamily !== user.family_name) patch.family_name = nextFamily
81
+ if (nextUsername !== user.username) patch.username = nextUsername
82
+ if (values.email !== user.email) patch.email = values.email
83
+ if (values.is_super_admin !== user.is_super_admin) patch.is_super_admin = values.is_super_admin
84
+ if (values.is_enabled !== user.is_enabled) patch.is_enabled = values.is_enabled
85
+ if (values.is_email_verified !== user.is_email_verified)
86
+ patch.is_email_verified = values.is_email_verified
87
+ return patch
88
+ }
89
+
90
+ interface UpdateUserProps {
91
+ user: AdminUserResponse
92
+ onClose?: () => void
93
+ onSuccess?: (user: AdminUserResponse) => void
94
+ }
95
+
96
+ export function UpdateUser({ user, onClose, onSuccess }: UpdateUserProps) {
97
+ const { updateAdminUser } = useBylineAdminServices()
98
+ const [formError, setFormError] = useState<string | null>(null)
99
+ const [successMessage, setSuccessMessage] = useState<string | null>(null)
100
+
101
+ const form = useForm({
102
+ defaultValues: defaultsFrom(user),
103
+ validationLogic: revalidateLogic({
104
+ mode: 'blur',
105
+ modeAfterSubmission: 'change',
106
+ }),
107
+ validators: {
108
+ onDynamic: updateUserSchema,
109
+ },
110
+ onSubmit: async ({ value }) => {
111
+ setFormError(null)
112
+ setSuccessMessage(null)
113
+ const patch = buildPatch(value, user)
114
+ if (Object.keys(patch).length === 0) {
115
+ setSuccessMessage('No changes to save.')
116
+ return
117
+ }
118
+
119
+ try {
120
+ const updated = await updateAdminUser({
121
+ data: { id: user.id, vid: user.vid, patch },
122
+ })
123
+ setSuccessMessage('Saved.')
124
+ onSuccess?.(updated)
125
+ } catch (err) {
126
+ const code = getErrorCode(err)
127
+ if (code === 'admin.users.emailInUse') {
128
+ // Surface on the email field directly.
129
+ form.setFieldMeta('email', (meta) => ({
130
+ ...meta,
131
+ errorMap: { ...meta.errorMap, onServer: 'This email is already in use.' },
132
+ errors: ['This email is already in use.'],
133
+ }))
134
+ return
135
+ }
136
+ if (code === 'admin.users.versionConflict') {
137
+ setFormError(
138
+ 'This user has been modified elsewhere since you opened this form. Reload to get the latest values and try again.'
139
+ )
140
+ return
141
+ }
142
+ if (code === 'admin.users.notFound') {
143
+ setFormError('This user no longer exists.')
144
+ return
145
+ }
146
+ setFormError('Could not save changes. Please try again.')
147
+ }
148
+ },
149
+ })
150
+
151
+ return (
152
+ <div className={cx('byline-user-update-wrap', styles.wrap)}>
153
+ <form
154
+ noValidate
155
+ onSubmit={(event) => {
156
+ event.preventDefault()
157
+ event.stopPropagation()
158
+ void form.handleSubmit()
159
+ }}
160
+ className={cx('byline-user-update-form', styles.form)}
161
+ >
162
+ {formError ? <Alert intent="danger">{formError}</Alert> : null}
163
+ {successMessage ? <Alert intent="success">{successMessage}</Alert> : null}
164
+
165
+ <form.Field name="given_name">
166
+ {(field) => (
167
+ <Input
168
+ label="Given name"
169
+ id="given_name"
170
+ name={field.name}
171
+ value={field.state.value}
172
+ onBlur={field.handleBlur}
173
+ onChange={(e) => field.handleChange(e.currentTarget.value)}
174
+ error={field.state.meta.errors.length > 0}
175
+ errorText={firstError(field.state.meta.errors)}
176
+ autoComplete="given-name"
177
+ />
178
+ )}
179
+ </form.Field>
180
+
181
+ <form.Field name="family_name">
182
+ {(field) => (
183
+ <Input
184
+ label="Family name"
185
+ id="family_name"
186
+ name={field.name}
187
+ value={field.state.value}
188
+ onBlur={field.handleBlur}
189
+ onChange={(e) => field.handleChange(e.currentTarget.value)}
190
+ error={field.state.meta.errors.length > 0}
191
+ errorText={firstError(field.state.meta.errors)}
192
+ autoComplete="family-name"
193
+ />
194
+ )}
195
+ </form.Field>
196
+
197
+ <form.Field name="username">
198
+ {(field) => (
199
+ <Input
200
+ label="Username"
201
+ id="username"
202
+ name={field.name}
203
+ value={field.state.value}
204
+ onBlur={field.handleBlur}
205
+ onChange={(e) => field.handleChange(e.currentTarget.value)}
206
+ error={field.state.meta.errors.length > 0}
207
+ errorText={firstError(field.state.meta.errors)}
208
+ helpText="Optional. Leave blank to clear."
209
+ autoComplete="username"
210
+ />
211
+ )}
212
+ </form.Field>
213
+
214
+ <form.Field name="email">
215
+ {(field) => (
216
+ <Input
217
+ label="Email"
218
+ id="email"
219
+ name={field.name}
220
+ type="email"
221
+ value={field.state.value}
222
+ onBlur={field.handleBlur}
223
+ onChange={(e) => field.handleChange(e.currentTarget.value)}
224
+ error={field.state.meta.errors.length > 0}
225
+ errorText={firstError(field.state.meta.errors)}
226
+ autoComplete="email"
227
+ required
228
+ />
229
+ )}
230
+ </form.Field>
231
+
232
+ <div className={cx('byline-user-update-flags', styles.flags)}>
233
+ <form.Field name="is_enabled">
234
+ {(field) => (
235
+ <Checkbox
236
+ id="is_enabled"
237
+ name={field.name}
238
+ label="Enabled"
239
+ checked={field.state.value}
240
+ onCheckedChange={(checked) => field.handleChange(checked === true)}
241
+ helpText="Disabled accounts cannot sign in."
242
+ />
243
+ )}
244
+ </form.Field>
245
+
246
+ <form.Field name="is_email_verified">
247
+ {(field) => (
248
+ <Checkbox
249
+ id="is_email_verified"
250
+ name={field.name}
251
+ label="Email verified"
252
+ checked={field.state.value}
253
+ onCheckedChange={(checked) => field.handleChange(checked === true)}
254
+ />
255
+ )}
256
+ </form.Field>
257
+
258
+ <form.Field name="is_super_admin">
259
+ {(field) => (
260
+ <Checkbox
261
+ id="is_super_admin"
262
+ name={field.name}
263
+ label="Super admin"
264
+ checked={field.state.value}
265
+ onCheckedChange={(checked) => field.handleChange(checked === true)}
266
+ helpText="Super admins bypass every ability check — grant with care."
267
+ />
268
+ )}
269
+ </form.Field>
270
+ </div>
271
+
272
+ <div className={cx('byline-user-update-actions', styles.actions)}>
273
+ <Button
274
+ type="button"
275
+ intent="secondary"
276
+ size="sm"
277
+ onClick={onClose}
278
+ className={cx('byline-user-update-action', styles.action)}
279
+ >
280
+ {successMessage ? 'Close' : 'Cancel'}
281
+ </Button>
282
+ <form.Subscribe
283
+ selector={(state) => ({
284
+ canSubmit: state.canSubmit,
285
+ isSubmitting: state.isSubmitting,
286
+ isDirty: state.isDirty,
287
+ })}
288
+ >
289
+ {({ canSubmit, isSubmitting }) => (
290
+ <Button
291
+ size="sm"
292
+ intent="primary"
293
+ type="submit"
294
+ disabled={!canSubmit || isSubmitting}
295
+ className={cx('byline-user-update-action', styles.action)}
296
+ >
297
+ {isSubmitting === true ? <LoaderEllipsis size={42} /> : 'Save'}
298
+ </Button>
299
+ )}
300
+ </form.Subscribe>
301
+ </div>
302
+ </form>
303
+ </div>
304
+ )
305
+ }
306
+
307
+ function firstError(errors: readonly unknown[]): string | undefined {
308
+ for (const err of errors) {
309
+ if (typeof err === 'string') return err
310
+ if (err && typeof err === 'object' && 'message' in err) {
311
+ const msg = (err as { message?: unknown }).message
312
+ if (typeof msg === 'string') return msg
313
+ }
314
+ }
315
+ return undefined
316
+ }
317
+
318
+ /**
319
+ * Extract the admin-users error code from a thrown server-fn response.
320
+ * Typed errors (`AdminUsersError`, `AuthError`) survive the server-fn
321
+ * boundary with their `code` intact thanks to the `BylineCodedError`
322
+ * serialization adapter registered in `src/start.ts`.
323
+ */
324
+ function getErrorCode(err: unknown): string | null {
325
+ return typeof (err as { code?: unknown })?.code === 'string'
326
+ ? (err as { code: string }).code
327
+ : null
328
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * SignInForm — admin sign-in card form.
3
+ *
4
+ * Override handles:
5
+ * .byline-sign-in-card — outer Card (responsive width)
6
+ * .byline-sign-in-alert — error alert spacing
7
+ * .byline-sign-in-form — the form element
8
+ * .byline-sign-in-fields — vertical stack of inputs
9
+ * .byline-sign-in-actions — submit-button row
10
+ * .byline-sign-in-button — the submit button (min-width)
11
+ */
12
+
13
+ .card,
14
+ :global(.byline-sign-in-card) {
15
+ width: 100%;
16
+ }
17
+
18
+ @media (min-width: 40rem) {
19
+ .card,
20
+ :global(.byline-sign-in-card) {
21
+ max-width: 380px;
22
+ }
23
+ }
24
+
25
+ .alert,
26
+ :global(.byline-sign-in-alert) {
27
+ margin-top: var(--spacing-12);
28
+ }
29
+
30
+ .form,
31
+ :global(.byline-sign-in-form) {
32
+ padding-top: var(--spacing-8);
33
+ margin-bottom: var(--spacing-8);
34
+ }
35
+
36
+ .fields,
37
+ :global(.byline-sign-in-fields) {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: var(--spacing-16);
41
+ }
42
+
43
+ .actions,
44
+ :global(.byline-sign-in-actions) {
45
+ display: flex;
46
+ justify-content: flex-end;
47
+ margin-top: var(--spacing-24);
48
+ }
49
+
50
+ .button,
51
+ :global(.byline-sign-in-button) {
52
+ min-width: 5rem;
53
+ }
@@ -0,0 +1,118 @@
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
+ /**
10
+ * Admin sign-in form.
11
+ *
12
+ * Client component — collects email + password, calls the `adminSignIn`
13
+ * server fn, and on success navigates to the caller-supplied
14
+ * `callbackUrl` (or `/admin`). On failure renders a generic "Invalid
15
+ * credentials" alert; the provider equalises timing between
16
+ * unknown-email and wrong-password so the UI doesn't distinguish the two.
17
+ *
18
+ * Stable override handles: `.byline-sign-in-card`, `.byline-sign-in-alert`,
19
+ * `.byline-sign-in-form`, `.byline-sign-in-fields`,
20
+ * `.byline-sign-in-actions`, `.byline-sign-in-button`.
21
+ */
22
+
23
+ import { type FormEvent, useState } from 'react'
24
+
25
+ import { Alert, Button, Card, Input, LoaderEllipsis } from '@infonomic/uikit/react'
26
+ import cx from 'classnames'
27
+
28
+ import { useBylineAdminServices } from '../../../services/admin-services-context.js'
29
+ import styles from './sign-in-form.module.css'
30
+
31
+ interface SignInFormProps {
32
+ /** Destination after successful sign-in. Defaults to `/admin`. */
33
+ callbackUrl?: string
34
+ }
35
+
36
+ export function SignInForm({ callbackUrl }: SignInFormProps) {
37
+ const { adminSignIn } = useBylineAdminServices()
38
+ const [email, setEmail] = useState('')
39
+ const [password, setPassword] = useState('')
40
+ const [pending, setPending] = useState(false)
41
+ const [error, setError] = useState<string | null>(null)
42
+
43
+ async function handleSubmit(event: FormEvent<HTMLFormElement>) {
44
+ event.preventDefault()
45
+ if (pending) return
46
+ if (email.trim().length === 0 || password.length === 0) {
47
+ setError('Enter your email and password.')
48
+ return
49
+ }
50
+
51
+ setPending(true)
52
+ setError(null)
53
+ try {
54
+ await adminSignIn({ data: { email: email.trim(), password } })
55
+ const target = callbackUrl && callbackUrl.length > 0 ? callbackUrl : '/admin'
56
+ // Full-page navigation — the admin layout needs to re-run its
57
+ // `beforeLoad` guard against the freshly-set session cookies.
58
+ window.location.assign(target)
59
+ } catch (err) {
60
+ console.warn('sign-in failed', err)
61
+ setError('Invalid credentials.')
62
+ setPending(false)
63
+ }
64
+ }
65
+
66
+ return (
67
+ <Card className={cx('byline-sign-in-card', styles.card)}>
68
+ <Card.Header>
69
+ <Card.Title>
70
+ <h2>Sign in</h2>
71
+ </Card.Title>
72
+ <Card.Description>Sign in to the Byline admin.</Card.Description>
73
+ {error && (
74
+ <Alert intent="danger" className={cx('byline-sign-in-alert', styles.alert)}>
75
+ {error}
76
+ </Alert>
77
+ )}
78
+ </Card.Header>
79
+ <Card.Content>
80
+ <form onSubmit={handleSubmit} noValidate className={cx('byline-sign-in-form', styles.form)}>
81
+ <div className={cx('byline-sign-in-fields', styles.fields)}>
82
+ <Input
83
+ label="Email"
84
+ id="email"
85
+ name="email"
86
+ type="email"
87
+ autoComplete="email"
88
+ required
89
+ value={email}
90
+ onChange={(event) => setEmail(event.currentTarget.value)}
91
+ disabled={pending}
92
+ />
93
+ <Input
94
+ label="Password"
95
+ id="password"
96
+ name="password"
97
+ type="password"
98
+ autoComplete="current-password"
99
+ required
100
+ value={password}
101
+ onChange={(event) => setPassword(event.currentTarget.value)}
102
+ disabled={pending}
103
+ />
104
+ </div>
105
+ <div className={cx('byline-sign-in-actions', styles.actions)}>
106
+ <Button
107
+ type="submit"
108
+ disabled={pending}
109
+ className={cx('byline-sign-in-button', styles.button)}
110
+ >
111
+ {pending ? <LoaderEllipsis size={30} color="#aaaaaa" /> : <span>Sign In</span>}
112
+ </Button>
113
+ </div>
114
+ </form>
115
+ </Card.Content>
116
+ </Card>
117
+ )
118
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * DiffModal — side-by-side document version comparison modal.
3
+ *
4
+ * Override handles:
5
+ * .byline-diff-modal-header — modal header padding
6
+ * .byline-diff-modal-title-stack — heading + subtitle stack
7
+ * .byline-diff-modal-title — heading
8
+ * .byline-diff-modal-subtitle — subtitle line
9
+ * .byline-diff-modal-version — inline pill identifying the historical version
10
+ * .byline-diff-modal-content — scrollable content
11
+ * .byline-diff-modal-state — loading / error placeholder
12
+ * .byline-diff-modal-error — error placeholder colour modifier
13
+ * .byline-diff-modal-viewer — diff viewer wrapper
14
+ */
15
+
16
+ .header,
17
+ :global(.byline-diff-modal-header) {
18
+ padding-top: var(--spacing-16);
19
+ margin-bottom: var(--spacing-8);
20
+ flex-shrink: 0;
21
+ }
22
+
23
+ .title-stack,
24
+ :global(.byline-diff-modal-title-stack) {
25
+ display: flex;
26
+ flex-direction: column;
27
+ }
28
+
29
+ .title,
30
+ :global(.byline-diff-modal-title) {
31
+ margin: 0;
32
+ font-size: var(--font-size-xl);
33
+ }
34
+
35
+ .subtitle,
36
+ :global(.byline-diff-modal-subtitle) {
37
+ margin: 0;
38
+ font-size: var(--font-size-sm);
39
+ color: var(--gray-400);
40
+ }
41
+
42
+ .version,
43
+ :global(.byline-diff-modal-version) {
44
+ font-family: var(--font-family-mono);
45
+ font-size: var(--font-size-xs);
46
+ background-color: var(--canvas-700);
47
+ padding: 0 var(--spacing-4);
48
+ border-radius: var(--border-radius-sm);
49
+ }
50
+
51
+ .content,
52
+ :global(.byline-diff-modal-content) {
53
+ flex: 1 1 0;
54
+ overflow: auto;
55
+ padding: 0;
56
+ min-height: 0;
57
+ }
58
+
59
+ .state,
60
+ :global(.byline-diff-modal-state) {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ height: 100%;
65
+ gap: var(--spacing-12);
66
+ color: var(--gray-400);
67
+ }
68
+
69
+ .error,
70
+ :global(.byline-diff-modal-error) {
71
+ color: var(--red-400);
72
+ gap: 0;
73
+ }
74
+
75
+ .viewer,
76
+ :global(.byline-diff-modal-viewer) {
77
+ font-family: var(--font-family-mono);
78
+ font-size: var(--font-size-sm);
79
+ }