payload 0.20.1 → 0.20.4-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/.eslintrc.js +21 -0
  2. package/CHANGELOG.md +33 -1
  3. package/components/elements.ts +1 -0
  4. package/components/index.js +2 -2
  5. package/components/styles.css +1 -1
  6. package/dist/admin/assets/fonts/SuisseIntl-Medium.woff +0 -0
  7. package/dist/admin/assets/fonts/SuisseIntl-Medium.woff2 +0 -0
  8. package/dist/admin/assets/fonts/merriweather-v30-latin-700.woff +0 -0
  9. package/dist/admin/assets/fonts/merriweather-v30-latin-700.woff2 +0 -0
  10. package/dist/admin/assets/fonts/merriweather-v30-latin-700italic.woff +0 -0
  11. package/dist/admin/assets/fonts/merriweather-v30-latin-700italic.woff2 +0 -0
  12. package/dist/admin/assets/fonts/merriweather-v30-latin-italic.woff +0 -0
  13. package/dist/admin/assets/fonts/merriweather-v30-latin-italic.woff2 +0 -0
  14. package/dist/admin/assets/fonts/merriweather-v30-latin-regular.woff +0 -0
  15. package/dist/admin/assets/fonts/merriweather-v30-latin-regular.woff2 +0 -0
  16. package/dist/admin/components/{forms/DraggableSection/ActionPanel → elements/ArrayAction}/index.d.ts +1 -2
  17. package/dist/admin/components/elements/ArrayAction/index.js +44 -0
  18. package/dist/admin/components/elements/ArrayAction/index.scss +54 -0
  19. package/dist/admin/components/elements/ArrayAction/types.d.ts +8 -0
  20. package/dist/admin/components/{forms/DraggableSection/ActionPanel → elements/ArrayAction}/types.js +0 -0
  21. package/dist/admin/components/elements/Banner/index.scss +13 -12
  22. package/dist/admin/components/elements/Button/index.js +2 -1
  23. package/dist/admin/components/elements/Button/index.scss +22 -21
  24. package/dist/admin/components/elements/Button/types.d.ts +2 -0
  25. package/dist/admin/components/elements/Card/index.js +3 -2
  26. package/dist/admin/components/elements/Card/index.scss +2 -2
  27. package/dist/admin/components/elements/Card/types.d.ts +1 -0
  28. package/dist/admin/components/{forms/DraggableSection/PositionPanel → elements/Collapsible}/index.d.ts +1 -2
  29. package/dist/admin/components/elements/Collapsible/index.js +43 -0
  30. package/dist/admin/components/elements/Collapsible/index.scss +113 -0
  31. package/dist/admin/components/elements/Collapsible/provider.d.ts +8 -0
  32. package/dist/admin/components/elements/Collapsible/provider.js +7 -0
  33. package/dist/admin/components/{forms/FieldTypeGutter → elements/Collapsible}/types.d.ts +7 -4
  34. package/dist/admin/components/{forms/DraggableSection/PositionPanel → elements/Collapsible}/types.js +0 -0
  35. package/dist/admin/components/elements/ColumnSelector/index.js +6 -3
  36. package/dist/admin/components/elements/ColumnSelector/index.scss +10 -1
  37. package/dist/admin/components/elements/DatePicker/index.scss +92 -47
  38. package/dist/admin/components/elements/DeleteDocument/index.js +5 -5
  39. package/dist/admin/components/elements/DeleteDocument/index.scss +5 -0
  40. package/dist/admin/components/elements/DeleteDocument/types.d.ts +1 -0
  41. package/dist/admin/components/elements/DuplicateDocument/index.js +1 -1
  42. package/dist/admin/components/elements/Eyebrow/index.js +4 -2
  43. package/dist/admin/components/elements/Eyebrow/index.scss +10 -6
  44. package/dist/admin/components/elements/FileDetails/index.scss +4 -4
  45. package/dist/admin/components/elements/GenerateConfirmation/index.js +1 -1
  46. package/dist/admin/components/elements/GenerateConfirmation/index.scss +5 -0
  47. package/dist/admin/components/elements/Gutter/index.d.ts +13 -0
  48. package/dist/admin/components/elements/Gutter/index.js +16 -0
  49. package/dist/admin/components/elements/Gutter/index.scss +19 -0
  50. package/dist/admin/components/elements/IDLabel/index.scss +2 -2
  51. package/dist/admin/components/elements/Loading/index.js +1 -1
  52. package/dist/admin/components/elements/Localizer/index.scss +2 -1
  53. package/dist/admin/components/elements/Nav/index.scss +12 -7
  54. package/dist/admin/components/elements/Paginator/ClickableArrow/index.scss +2 -2
  55. package/dist/admin/components/elements/Paginator/index.scss +5 -5
  56. package/dist/admin/components/elements/PerPage/index.js +1 -1
  57. package/dist/admin/components/elements/PerPage/index.scss +1 -2
  58. package/dist/admin/components/elements/Pill/index.scss +20 -16
  59. package/dist/admin/components/elements/Popup/PopupButton/index.js +2 -1
  60. package/dist/admin/components/elements/Popup/PopupButton/types.d.ts +1 -0
  61. package/dist/admin/components/elements/Popup/index.js +7 -7
  62. package/dist/admin/components/elements/Popup/index.scss +20 -17
  63. package/dist/admin/components/elements/Popup/types.d.ts +1 -0
  64. package/dist/admin/components/elements/ReactSelect/index.scss +20 -12
  65. package/dist/admin/components/elements/SortComplex/index.scss +3 -2
  66. package/dist/admin/components/elements/Status/index.js +2 -2
  67. package/dist/admin/components/elements/Status/index.scss +5 -0
  68. package/dist/admin/components/elements/StepNav/index.scss +0 -6
  69. package/dist/admin/components/elements/Table/index.js +2 -2
  70. package/dist/admin/components/elements/Table/index.scss +7 -4
  71. package/dist/admin/components/elements/Tooltip/index.scss +9 -9
  72. package/dist/admin/components/elements/UploadCard/index.scss +1 -1
  73. package/dist/admin/components/elements/WhereBuilder/Condition/Relationship/index.scss +3 -3
  74. package/dist/admin/components/elements/WhereBuilder/Condition/index.js +2 -2
  75. package/dist/admin/components/elements/WhereBuilder/index.js +1 -1
  76. package/dist/admin/components/elements/WhereBuilder/index.scss +1 -1
  77. package/dist/admin/components/forms/Error/index.scss +2 -3
  78. package/dist/admin/components/forms/FieldDescription/index.js +6 -2
  79. package/dist/admin/components/forms/FieldDescription/index.scss +1 -1
  80. package/dist/admin/components/forms/FieldDescription/types.d.ts +3 -2
  81. package/dist/admin/components/forms/FieldDescription/types.js +1 -1
  82. package/dist/admin/components/forms/Form/buildStateFromSchema/addFieldStatePromise.js +17 -0
  83. package/dist/admin/components/forms/Form/fieldReducer.js +18 -0
  84. package/dist/admin/components/forms/Label/index.scss +2 -2
  85. package/dist/admin/components/forms/RenderFields/index.js +2 -2
  86. package/dist/admin/components/forms/RenderFields/types.d.ts +1 -0
  87. package/dist/admin/components/forms/Submit/index.js +2 -2
  88. package/dist/admin/components/forms/field-types/Array/Array.js +93 -12
  89. package/dist/admin/components/forms/field-types/Array/index.scss +33 -35
  90. package/dist/admin/components/forms/field-types/Blocks/BlockSelector/BlockSelection/index.scss +3 -1
  91. package/dist/admin/components/forms/field-types/Blocks/Blocks.js +83 -37
  92. package/dist/admin/components/forms/{DraggableSection → field-types/Blocks}/SectionTitle/index.d.ts +0 -0
  93. package/dist/admin/components/forms/{DraggableSection → field-types/Blocks}/SectionTitle/index.js +8 -6
  94. package/dist/admin/components/forms/field-types/Blocks/SectionTitle/index.scss +49 -0
  95. package/dist/admin/components/forms/{DraggableSection → field-types/Blocks}/SectionTitle/types.d.ts +0 -1
  96. package/dist/admin/components/forms/{DraggableSection → field-types/Blocks}/SectionTitle/types.js +0 -0
  97. package/dist/admin/components/forms/field-types/Blocks/index.scss +53 -27
  98. package/dist/admin/components/forms/field-types/Checkbox/index.js +1 -1
  99. package/dist/admin/components/forms/field-types/Checkbox/index.scss +2 -2
  100. package/dist/admin/components/forms/field-types/Code/Code.js +4 -4
  101. package/dist/admin/components/forms/field-types/Code/index.scss +4 -4
  102. package/dist/admin/components/forms/{FieldTypeGutter → field-types/Collapsible}/index.d.ts +2 -2
  103. package/dist/admin/components/forms/field-types/Collapsible/index.js +44 -0
  104. package/dist/admin/components/forms/field-types/Collapsible/index.scss +11 -0
  105. package/dist/admin/components/forms/field-types/Collapsible/types.d.ts +8 -0
  106. package/dist/admin/components/forms/{DraggableSection → field-types/Collapsible}/types.js +0 -0
  107. package/dist/admin/components/forms/field-types/ConfirmPassword/index.js +2 -2
  108. package/dist/admin/components/forms/field-types/ConfirmPassword/index.scss +9 -9
  109. package/dist/admin/components/forms/field-types/DateTime/index.js +1 -1
  110. package/dist/admin/components/forms/field-types/DateTime/index.scss +1 -1
  111. package/dist/admin/components/forms/field-types/Email/index.js +1 -1
  112. package/dist/admin/components/forms/field-types/Email/index.scss +8 -8
  113. package/dist/admin/components/forms/field-types/Group/index.js +11 -14
  114. package/dist/admin/components/forms/field-types/Group/index.scss +25 -37
  115. package/dist/admin/components/forms/field-types/HiddenInput/index.js +1 -1
  116. package/dist/admin/components/forms/field-types/Number/index.js +2 -2
  117. package/dist/admin/components/forms/field-types/Number/index.scss +9 -9
  118. package/dist/admin/components/forms/field-types/Password/index.js +2 -2
  119. package/dist/admin/components/forms/field-types/Password/index.scss +9 -9
  120. package/dist/admin/components/forms/field-types/Point/index.js +4 -4
  121. package/dist/admin/components/forms/field-types/Point/index.scss +9 -9
  122. package/dist/admin/components/forms/field-types/RadioGroup/Input.d.ts +22 -0
  123. package/dist/admin/components/forms/field-types/RadioGroup/Input.js +41 -0
  124. package/dist/admin/components/forms/field-types/RadioGroup/RadioInput/index.js +1 -1
  125. package/dist/admin/components/forms/field-types/RadioGroup/RadioInput/index.scss +4 -4
  126. package/dist/admin/components/forms/field-types/RadioGroup/RadioInput/types.d.ts +2 -1
  127. package/dist/admin/components/forms/field-types/RadioGroup/index.d.ts +0 -1
  128. package/dist/admin/components/forms/field-types/RadioGroup/index.js +2 -35
  129. package/dist/admin/components/forms/field-types/RadioGroup/types.d.ts +1 -0
  130. package/dist/admin/components/forms/field-types/Relationship/index.js +1 -1
  131. package/dist/admin/components/forms/field-types/Relationship/index.scss +4 -4
  132. package/dist/admin/components/forms/field-types/RichText/RichText.js +30 -31
  133. package/dist/admin/components/forms/field-types/RichText/elements/link/index.js +1 -1
  134. package/dist/admin/components/forms/field-types/RichText/elements/link/index.scss +6 -6
  135. package/dist/admin/components/forms/field-types/RichText/elements/ol/index.d.ts +1 -0
  136. package/dist/admin/components/forms/field-types/RichText/elements/ol/index.js +2 -1
  137. package/dist/admin/components/forms/field-types/RichText/elements/ol/index.scss +7 -0
  138. package/dist/admin/components/forms/field-types/RichText/elements/relationship/Button/index.js +1 -1
  139. package/dist/admin/components/forms/field-types/RichText/elements/relationship/Button/index.scss +5 -3
  140. package/dist/admin/components/forms/field-types/RichText/elements/relationship/Element/index.scss +13 -2
  141. package/dist/admin/components/forms/field-types/RichText/elements/ul/index.d.ts +1 -0
  142. package/dist/admin/components/forms/field-types/RichText/elements/ul/index.js +2 -1
  143. package/dist/admin/components/forms/field-types/RichText/elements/ul/index.scss +7 -0
  144. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.scss +6 -2
  145. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.js +1 -1
  146. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss +17 -4
  147. package/dist/admin/components/forms/field-types/RichText/elements/upload/addSwapModals.scss +2 -0
  148. package/dist/admin/components/forms/field-types/RichText/index.scss +66 -20
  149. package/dist/admin/components/forms/field-types/Select/Input.js +1 -1
  150. package/dist/admin/components/forms/field-types/Select/index.scss +1 -1
  151. package/dist/admin/components/forms/field-types/Tabs/index.d.ts +5 -0
  152. package/dist/admin/components/forms/field-types/Tabs/index.js +36 -0
  153. package/dist/admin/components/forms/field-types/Tabs/index.scss +91 -0
  154. package/dist/admin/components/forms/field-types/Tabs/types.d.ts +8 -0
  155. package/dist/admin/components/forms/{FieldTypeGutter → field-types/Tabs}/types.js +0 -0
  156. package/dist/admin/components/forms/field-types/Text/Input.js +2 -2
  157. package/dist/admin/components/forms/field-types/Text/index.scss +9 -9
  158. package/dist/admin/components/forms/field-types/Textarea/Input.js +2 -2
  159. package/dist/admin/components/forms/field-types/Textarea/index.scss +1 -1
  160. package/dist/admin/components/forms/field-types/Upload/Add/index.js +1 -3
  161. package/dist/admin/components/forms/field-types/Upload/Add/index.scss +2 -0
  162. package/dist/admin/components/forms/field-types/Upload/SelectExisting/index.scss +2 -0
  163. package/dist/admin/components/forms/field-types/Upload/index.scss +2 -2
  164. package/dist/admin/components/forms/field-types/index.d.ts +2 -0
  165. package/dist/admin/components/forms/field-types/index.js +4 -0
  166. package/dist/admin/components/forms/field-types/rowReducer.d.ts +39 -1
  167. package/dist/admin/components/forms/field-types/rowReducer.js +18 -5
  168. package/dist/admin/components/forms/useField/index.js +4 -5
  169. package/dist/admin/components/graphics/Account/index.js +14 -4
  170. package/dist/admin/components/graphics/Icon/index.js +9 -3
  171. package/dist/admin/components/graphics/Logo/index.js +16 -10
  172. package/dist/admin/components/icons/Calendar/index.scss +1 -1
  173. package/dist/admin/components/icons/Check/index.scss +1 -1
  174. package/dist/admin/components/icons/Chevron/index.scss +1 -1
  175. package/dist/admin/components/icons/CloseMenu/index.scss +1 -1
  176. package/dist/admin/components/icons/Copy/index.scss +1 -1
  177. package/dist/admin/components/icons/Drag/index.d.ts +6 -0
  178. package/dist/admin/components/icons/Drag/index.js +13 -0
  179. package/dist/admin/components/icons/Drag/index.scss +10 -0
  180. package/dist/admin/components/icons/Edit/index.scss +1 -1
  181. package/dist/admin/components/icons/IndentLeft/index.scss +2 -2
  182. package/dist/admin/components/icons/IndentRight/index.js +1 -1
  183. package/dist/admin/components/icons/IndentRight/index.scss +2 -2
  184. package/dist/admin/components/icons/LogOut/index.scss +1 -1
  185. package/dist/admin/components/icons/Menu/index.d.ts +1 -0
  186. package/dist/admin/components/icons/Menu/index.js +5 -4
  187. package/dist/admin/components/icons/Menu/index.scss +7 -0
  188. package/dist/admin/components/icons/More/index.d.ts +6 -0
  189. package/dist/admin/components/icons/More/index.js +10 -0
  190. package/dist/admin/components/icons/More/index.scss +10 -0
  191. package/dist/admin/components/icons/Plus/index.scss +1 -1
  192. package/dist/admin/components/icons/Relationship/index.scss +1 -1
  193. package/dist/admin/components/icons/Search/index.d.ts +1 -0
  194. package/dist/admin/components/icons/Search/index.js +4 -3
  195. package/dist/admin/components/icons/Search/index.scss +11 -0
  196. package/dist/admin/components/icons/Swap/index.scss +1 -1
  197. package/dist/admin/components/icons/Upload/index.scss +1 -1
  198. package/dist/admin/components/icons/X/index.d.ts +3 -1
  199. package/dist/admin/components/icons/X/index.js +4 -1
  200. package/dist/admin/components/icons/X/index.scss +1 -1
  201. package/dist/admin/components/modals/LeaveWithoutSaving/index.js +1 -1
  202. package/dist/admin/components/modals/LeaveWithoutSaving/index.scss +5 -0
  203. package/dist/admin/components/modals/StayLoggedIn/index.js +1 -1
  204. package/dist/admin/components/modals/StayLoggedIn/index.scss +5 -0
  205. package/dist/admin/components/templates/Default/index.scss +1 -7
  206. package/dist/admin/components/utilities/DocumentInfo/index.js +11 -0
  207. package/dist/admin/components/utilities/DocumentInfo/types.d.ts +2 -0
  208. package/dist/admin/components/utilities/Theme/index.d.ts +13 -0
  209. package/dist/admin/components/utilities/Theme/index.js +47 -0
  210. package/dist/admin/components/views/Account/Default.js +9 -4
  211. package/dist/admin/components/views/Account/ToggleTheme/index.d.ts +2 -0
  212. package/dist/admin/components/views/Account/ToggleTheme/index.js +23 -0
  213. package/dist/admin/components/views/Account/index.js +12 -14
  214. package/dist/admin/components/views/Account/index.scss +37 -21
  215. package/dist/admin/components/views/CreateFirstUser/index.js +4 -6
  216. package/dist/admin/components/views/Dashboard/Default.js +5 -4
  217. package/dist/admin/components/views/Dashboard/index.scss +3 -11
  218. package/dist/admin/components/views/Global/Default.js +3 -2
  219. package/dist/admin/components/views/Global/index.js +12 -14
  220. package/dist/admin/components/views/Global/index.scss +22 -22
  221. package/dist/admin/components/views/NotFound/index.d.ts +0 -1
  222. package/dist/admin/components/views/NotFound/index.js +2 -2
  223. package/dist/admin/components/views/Version/Compare/index.scss +3 -3
  224. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Iterable/index.scss +4 -4
  225. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Nested/index.scss +1 -1
  226. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +2 -1
  227. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Relationship/index.scss +1 -1
  228. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Tabs/index.d.ts +7 -0
  229. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Tabs/index.js +8 -0
  230. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Text/index.js +2 -1
  231. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Text/index.scss +1 -1
  232. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/index.d.ts +6 -0
  233. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/index.js +3 -0
  234. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/styles.d.ts +13 -0
  235. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/styles.js +13 -0
  236. package/dist/admin/components/views/Version/RenderFieldsToDiff/index.js +5 -1
  237. package/dist/admin/components/views/Version/Restore/index.js +1 -1
  238. package/dist/admin/components/views/Version/Restore/index.scss +5 -0
  239. package/dist/admin/components/views/Version/Version.js +2 -1
  240. package/dist/admin/components/views/Version/index.scss +4 -7
  241. package/dist/admin/components/views/Versions/index.js +3 -2
  242. package/dist/admin/components/views/Versions/index.scss +2 -12
  243. package/dist/admin/components/views/collections/Edit/Auth/index.scss +3 -2
  244. package/dist/admin/components/views/collections/Edit/Default.js +5 -4
  245. package/dist/admin/components/views/collections/Edit/Upload/index.scss +5 -5
  246. package/dist/admin/components/views/collections/Edit/index.js +16 -18
  247. package/dist/admin/components/views/collections/Edit/index.scss +20 -21
  248. package/dist/admin/components/views/collections/List/Cell/field-types/Checkbox/index.scss +4 -4
  249. package/dist/admin/components/views/collections/List/Cell/field-types/Code/index.scss +4 -4
  250. package/dist/admin/components/views/collections/List/Cell/field-types/Relationship/index.d.ts +1 -0
  251. package/dist/admin/components/views/collections/List/Cell/field-types/Relationship/index.js +41 -34
  252. package/dist/admin/components/views/collections/List/Cell/field-types/Relationship/index.scss +3 -0
  253. package/dist/admin/components/views/collections/List/Cell/field-types/Upload/index.d.ts +0 -5
  254. package/dist/admin/components/views/collections/List/Cell/field-types/Upload/index.js +0 -4
  255. package/dist/admin/components/views/collections/List/Cell/field-types/index.d.ts +1 -3
  256. package/dist/admin/components/views/collections/List/Cell/field-types/index.js +1 -2
  257. package/dist/admin/components/views/collections/List/Default.js +8 -6
  258. package/dist/admin/components/views/collections/List/RelationshipProvider/index.d.ts +19 -0
  259. package/dist/admin/components/views/collections/List/RelationshipProvider/index.js +46 -0
  260. package/dist/admin/components/views/collections/List/RelationshipProvider/reducer.d.ts +18 -0
  261. package/dist/admin/components/views/collections/List/RelationshipProvider/reducer.js +34 -0
  262. package/dist/admin/components/views/collections/List/buildColumns.js +26 -31
  263. package/dist/admin/components/views/collections/List/getInitialColumns.js +25 -23
  264. package/dist/admin/components/views/collections/List/index.js +2 -2
  265. package/dist/admin/components/views/collections/List/index.scss +4 -15
  266. package/dist/admin/index.js +7 -5
  267. package/dist/admin/scss/app.scss +52 -14
  268. package/dist/admin/scss/colors.scss +245 -0
  269. package/dist/admin/scss/fonts.scss +41 -14
  270. package/dist/admin/scss/resets.scss +1 -0
  271. package/dist/admin/scss/styles.scss +0 -2
  272. package/dist/admin/scss/toastify.scss +12 -8
  273. package/dist/admin/scss/type.scss +11 -9
  274. package/dist/admin/scss/vars.scss +50 -53
  275. package/dist/admin/utilities/flattenTopLevelFields.d.ts +3 -0
  276. package/dist/admin/utilities/flattenTopLevelFields.js +30 -0
  277. package/dist/admin/utilities/getOffsetTop.d.ts +1 -2
  278. package/dist/admin/utilities/getOffsetTop.js +1 -1
  279. package/dist/admin/utilities/scrollToID.d.ts +1 -0
  280. package/dist/admin/utilities/scrollToID.js +10 -0
  281. package/dist/auth/operations/access.js +6 -1
  282. package/dist/bin/generateTypes.js +11 -2
  283. package/dist/collections/graphql/init.js +2 -2
  284. package/dist/collections/operations/local/create.js +1 -1
  285. package/dist/collections/tests/collections.spec.js +1 -78
  286. package/dist/config/defaults.js +1 -2
  287. package/dist/config/schema.js +2 -2
  288. package/dist/config/types.d.ts +2 -2
  289. package/dist/express/admin.js +2 -2
  290. package/dist/fields/config/sanitize.js +8 -1
  291. package/dist/fields/config/schema.d.ts +2 -0
  292. package/dist/fields/config/schema.js +19 -7
  293. package/dist/fields/config/types.d.ts +19 -11
  294. package/dist/fields/config/types.js +2 -2
  295. package/dist/fields/hooks/afterChange/promise.js +18 -2
  296. package/dist/fields/hooks/afterRead/promise.js +22 -2
  297. package/dist/fields/hooks/beforeChange/promise.js +25 -2
  298. package/dist/fields/hooks/beforeValidate/promise.js +20 -2
  299. package/dist/fields/richText/recurseNestedFields.js +15 -1
  300. package/dist/graphql/schema/buildMutationInputType.d.ts +4 -1
  301. package/dist/graphql/schema/buildMutationInputType.js +94 -70
  302. package/dist/graphql/schema/buildObjectType.d.ts +5 -3
  303. package/dist/graphql/schema/buildObjectType.js +114 -71
  304. package/dist/graphql/schema/buildPoliciesType.js +9 -1
  305. package/dist/graphql/schema/buildWhereInputType.js +2 -2
  306. package/dist/graphql/schema/fieldToWhereInputSchemaMap.js +56 -7
  307. package/dist/graphql/schema/withNullableType.js +1 -1
  308. package/dist/index.d.ts +2 -1
  309. package/dist/index.js +9 -7
  310. package/dist/mongoose/buildSchema.js +28 -7
  311. package/dist/mongoose/connect.d.ts +1 -1
  312. package/dist/mongoose/connect.js +24 -19
  313. package/dist/mongoose/testCredentials.d.ts +7 -7
  314. package/dist/mongoose/testCredentials.js +1 -1
  315. package/dist/utilities/mapAsync.d.ts +1 -0
  316. package/dist/utilities/mapAsync.js +8 -0
  317. package/dist/webpack/getBaseConfig.js +1 -2
  318. package/docs/admin/customizing-css.mdx +16 -28
  319. package/docs/fields/collapsible.mdx +44 -0
  320. package/docs/fields/date.mdx +1 -1
  321. package/docs/fields/email.mdx +1 -1
  322. package/docs/fields/group.mdx +1 -1
  323. package/docs/fields/number.mdx +1 -1
  324. package/docs/fields/overview.mdx +1 -0
  325. package/docs/fields/point.mdx +1 -1
  326. package/docs/fields/radio.mdx +1 -1
  327. package/docs/fields/relationship.mdx +1 -1
  328. package/docs/fields/rich-text.mdx +1 -1
  329. package/docs/fields/row.mdx +1 -1
  330. package/docs/fields/select.mdx +1 -1
  331. package/docs/fields/tabs.mdx +9 -0
  332. package/docs/fields/text.mdx +1 -1
  333. package/docs/fields/textarea.mdx +1 -1
  334. package/docs/fields/ui.mdx +1 -1
  335. package/docs/fields/upload.mdx +1 -1
  336. package/package.json +13 -11
  337. package/scss/index.scss +0 -7
  338. package/dist/admin/assets/fonts/SuisseIntl-Light.woff +0 -0
  339. package/dist/admin/assets/fonts/SuisseIntl-Light.woff2 +0 -0
  340. package/dist/admin/assets/fonts/SuisseIntl-Thin.woff +0 -0
  341. package/dist/admin/assets/fonts/SuisseIntl-Thin.woff2 +0 -0
  342. package/dist/admin/components/forms/DraggableSection/ActionPanel/index.js +0 -22
  343. package/dist/admin/components/forms/DraggableSection/ActionPanel/index.scss +0 -12
  344. package/dist/admin/components/forms/DraggableSection/ActionPanel/types.d.ts +0 -11
  345. package/dist/admin/components/forms/DraggableSection/PositionPanel/index.js +0 -18
  346. package/dist/admin/components/forms/DraggableSection/PositionPanel/index.scss +0 -21
  347. package/dist/admin/components/forms/DraggableSection/PositionPanel/types.d.ts +0 -6
  348. package/dist/admin/components/forms/DraggableSection/SectionTitle/index.scss +0 -37
  349. package/dist/admin/components/forms/DraggableSection/index.d.ts +0 -5
  350. package/dist/admin/components/forms/DraggableSection/index.js +0 -40
  351. package/dist/admin/components/forms/DraggableSection/index.scss +0 -113
  352. package/dist/admin/components/forms/DraggableSection/types.d.ts +0 -24
  353. package/dist/admin/components/forms/FieldTypeGutter/context.d.ts +0 -6
  354. package/dist/admin/components/forms/FieldTypeGutter/context.js +0 -9
  355. package/dist/admin/components/forms/FieldTypeGutter/index.js +0 -18
  356. package/dist/admin/components/forms/FieldTypeGutter/index.scss +0 -87
  357. package/dist/admin/components/views/NotFound/index.scss +0 -10
  358. package/dist/collections/tests/uploads.spec.d.ts +0 -1
  359. package/dist/collections/tests/uploads.spec.js +0 -365
  360. package/dist/errors/errors.spec.d.ts +0 -1
  361. package/dist/errors/errors.spec.js +0 -29
  362. package/dist/utilities/flattenTopLevelFields.d.ts +0 -2
  363. package/dist/utilities/flattenTopLevelFields.js +0 -16
@@ -157,4 +157,21 @@ export const addFieldStatePromise = async ({ field, locale, user, state, path, p
157
157
  operation,
158
158
  });
159
159
  }
160
+ else if (field.type === 'tabs') {
161
+ field.tabs.forEach((tab) => {
162
+ iterateFields({
163
+ state,
164
+ fields: tab.fields,
165
+ data,
166
+ parentPassesCondition: passesCondition,
167
+ path,
168
+ user,
169
+ fieldPromises,
170
+ fullData,
171
+ id,
172
+ locale,
173
+ operation,
174
+ });
175
+ });
176
+ }
160
177
  };
@@ -3,6 +3,7 @@ import { unflatten, flatten } from 'flatley';
3
3
  import flattenFilters from './flattenFilters';
4
4
  import getSiblingData from './getSiblingData';
5
5
  import reduceFieldsToValues from './reduceFieldsToValues';
6
+ import deepCopyObject from '../../../../utilities/deepCopyObject';
6
7
  const unflattenRowsFromState = (state, path) => {
7
8
  // Take a copy of state
8
9
  const remainingFlattenedState = { ...state };
@@ -84,6 +85,23 @@ function fieldReducer(state, action) {
84
85
  };
85
86
  return newState;
86
87
  }
88
+ case 'DUPLICATE_ROW': {
89
+ const { rowIndex, path, } = action;
90
+ const { unflattenedRows, remainingFlattenedState } = unflattenRowsFromState(state, path);
91
+ const duplicate = deepCopyObject(unflattenedRows[rowIndex]);
92
+ if (duplicate.id)
93
+ delete duplicate.id;
94
+ // If there are subfields
95
+ if (Object.keys(duplicate).length > 0) {
96
+ // Add new object containing subfield names to unflattenedRows array
97
+ unflattenedRows.splice(rowIndex + 1, 0, duplicate);
98
+ }
99
+ const newState = {
100
+ ...remainingFlattenedState,
101
+ ...(flatten({ [path]: unflattenedRows }, { filters: flattenFilters })),
102
+ };
103
+ return newState;
104
+ }
87
105
  case 'MOVE_ROW': {
88
106
  const { moveFromIndex, moveToIndex, path } = action;
89
107
  const { unflattenedRows, remainingFlattenedState } = unflattenRowsFromState(state, path);
@@ -3,10 +3,10 @@
3
3
  label.field-label {
4
4
  display: flex;
5
5
  padding-bottom: base(.25);
6
- color: $color-dark-gray;
6
+ color: var(--theme-elevation-800);
7
7
 
8
8
  .required {
9
- color: $color-red;
9
+ color: var(--theme-error-500);
10
10
  margin-left: base(.25);
11
11
  margin-right: auto;
12
12
  }
@@ -9,13 +9,13 @@ const intersectionObserverOptions = {
9
9
  };
10
10
  const RenderFields = (props) => {
11
11
  var _a;
12
- const { fieldSchema, fieldTypes, filter, permissions, readOnly: readOnlyOverride, className, } = props;
12
+ const { fieldSchema, fieldTypes, filter, permissions, readOnly: readOnlyOverride, className, forceRender, } = props;
13
13
  const [hasRendered, setHasRendered] = useState(false);
14
14
  const [intersectionRef, entry] = useIntersect(intersectionObserverOptions);
15
15
  const operation = useOperation();
16
16
  const isIntersecting = Boolean(entry === null || entry === void 0 ? void 0 : entry.isIntersecting);
17
17
  const isAboveViewport = ((_a = entry === null || entry === void 0 ? void 0 : entry.boundingClientRect) === null || _a === void 0 ? void 0 : _a.top) < 0;
18
- const shouldRender = isIntersecting || isAboveViewport;
18
+ const shouldRender = forceRender || isIntersecting || isAboveViewport;
19
19
  useEffect(() => {
20
20
  if (shouldRender && !hasRendered) {
21
21
  setHasRendered(true);
@@ -4,6 +4,7 @@ import { FieldTypes } from '../field-types';
4
4
  export declare type Props = {
5
5
  className?: string;
6
6
  readOnly?: boolean;
7
+ forceRender?: boolean;
7
8
  permissions?: {
8
9
  [field: string]: FieldPermissions;
9
10
  };
@@ -4,10 +4,10 @@ import Button from '../../elements/Button';
4
4
  import './index.scss';
5
5
  const baseClass = 'form-submit';
6
6
  const FormSubmit = (props) => {
7
- const { children, disabled: disabledFromProps, type = 'submit' } = props;
7
+ const { children, buttonId: id, disabled: disabledFromProps, type = 'submit' } = props;
8
8
  const processing = useFormProcessing();
9
9
  const { disabled } = useForm();
10
10
  return (React.createElement("div", { className: baseClass },
11
- React.createElement(Button, { ...props, type: type, disabled: disabledFromProps || processing || disabled ? true : undefined }, children)));
11
+ React.createElement(Button, { ...props, id: id, type: type, disabled: disabledFromProps || processing || disabled ? true : undefined }, children)));
12
12
  };
13
13
  export default FormSubmit;
@@ -1,9 +1,8 @@
1
1
  import React, { useCallback, useEffect, useReducer, useState } from 'react';
2
- import { DragDropContext, Droppable } from 'react-beautiful-dnd';
2
+ import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
3
3
  import { useAuth } from '../../../utilities/Auth';
4
4
  import withCondition from '../../withCondition';
5
5
  import Button from '../../../elements/Button';
6
- import DraggableSection from '../../DraggableSection';
7
6
  import reducer from '../rowReducer';
8
7
  import { useForm } from '../../Form/context';
9
8
  import buildStateFromSchema from '../../Form/buildStateFromSchema';
@@ -15,11 +14,19 @@ import Banner from '../../../elements/Banner';
15
14
  import FieldDescription from '../../FieldDescription';
16
15
  import { useDocumentInfo } from '../../../utilities/DocumentInfo';
17
16
  import { useOperation } from '../../../utilities/OperationProvider';
17
+ import { Collapsible } from '../../../elements/Collapsible';
18
+ import RenderFields from '../../RenderFields';
19
+ import { fieldAffectsData } from '../../../../../fields/config/types';
20
+ import { usePreferences } from '../../../utilities/Preferences';
21
+ import { ArrayAction } from '../../../elements/ArrayAction';
22
+ import { scrollToID } from '../../../../utilities/scrollToID';
23
+ import HiddenInput from '../HiddenInput';
18
24
  import './index.scss';
19
- const baseClass = 'field-type array';
25
+ const baseClass = 'array-field';
20
26
  const ArrayFieldType = (props) => {
21
27
  var _a, _b;
22
28
  const { name, path: pathFromProps, fields, fieldTypes, validate = array, required, maxRows, minRows, permissions, admin: { readOnly, description, condition, className, }, } = props;
29
+ const path = pathFromProps || name;
23
30
  // Handle labeling for Arrays, Global Arrays, and Blocks
24
31
  const getLabels = (p) => {
25
32
  if (p === null || p === void 0 ? void 0 : p.labels)
@@ -31,14 +38,15 @@ const ArrayFieldType = (props) => {
31
38
  const labels = getLabels(props);
32
39
  // eslint-disable-next-line react/destructuring-assignment
33
40
  const label = (_a = props === null || props === void 0 ? void 0 : props.label) !== null && _a !== void 0 ? _a : (_b = props === null || props === void 0 ? void 0 : props.labels) === null || _b === void 0 ? void 0 : _b.singular;
34
- const [rows, dispatchRows] = useReducer(reducer, []);
41
+ const { preferencesKey, preferences } = useDocumentInfo();
42
+ const { setPreference } = usePreferences();
43
+ const [rows, dispatchRows] = useReducer(reducer, undefined);
35
44
  const formContext = useForm();
36
45
  const { user } = useAuth();
37
46
  const { id } = useDocumentInfo();
38
47
  const locale = useLocale();
39
48
  const operation = useOperation();
40
49
  const { dispatchFields } = formContext;
41
- const path = pathFromProps || name;
42
50
  const memoizedValidate = useCallback((value, options) => {
43
51
  return validate(value, { ...options, minRows, maxRows, required });
44
52
  }, [maxRows, minRows, required, validate]);
@@ -51,10 +59,22 @@ const ArrayFieldType = (props) => {
51
59
  });
52
60
  const addRow = useCallback(async (rowIndex) => {
53
61
  const subFieldState = await buildStateFromSchema({ fieldSchema: fields, operation, id, user, locale });
62
+ console.log(subFieldState);
54
63
  dispatchFields({ type: 'ADD_ROW', rowIndex, subFieldState, path });
55
64
  dispatchRows({ type: 'ADD', rowIndex });
56
65
  setValue(value + 1);
66
+ setTimeout(() => {
67
+ scrollToID(`${path}-row-${rowIndex + 1}`);
68
+ }, 0);
57
69
  }, [dispatchRows, dispatchFields, fields, path, setValue, value, operation, id, user, locale]);
70
+ const duplicateRow = useCallback(async (rowIndex) => {
71
+ dispatchFields({ type: 'DUPLICATE_ROW', rowIndex, path });
72
+ dispatchRows({ type: 'ADD', rowIndex });
73
+ setValue(value + 1);
74
+ setTimeout(() => {
75
+ scrollToID(`${path}-row-${rowIndex + 1}`);
76
+ }, 0);
77
+ }, [dispatchRows, dispatchFields, path, setValue, value]);
58
78
  const removeRow = useCallback((rowIndex) => {
59
79
  dispatchRows({ type: 'REMOVE', rowIndex });
60
80
  dispatchFields({ type: 'REMOVE_ROW', rowIndex, path });
@@ -71,10 +91,53 @@ const ArrayFieldType = (props) => {
71
91
  const destinationIndex = result.destination.index;
72
92
  moveRow(sourceIndex, destinationIndex);
73
93
  }, [moveRow]);
94
+ const setCollapse = useCallback(async (rowID, collapsed) => {
95
+ var _a, _b, _c;
96
+ dispatchRows({ type: 'SET_COLLAPSE', id: rowID, collapsed });
97
+ if (preferencesKey) {
98
+ const preferencesToSet = preferences || { fields: {} };
99
+ let newCollapsedState = ((_b = (_a = preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) === null || _a === void 0 ? void 0 : _a[path]) === null || _b === void 0 ? void 0 : _b.collapsed.filter((filterID) => (rows.find((row) => row.id === filterID))))
100
+ || [];
101
+ if (!collapsed) {
102
+ newCollapsedState = newCollapsedState.filter((existingID) => existingID !== rowID);
103
+ }
104
+ else {
105
+ newCollapsedState.push(rowID);
106
+ }
107
+ setPreference(preferencesKey, {
108
+ ...preferencesToSet,
109
+ fields: {
110
+ ...(preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) || {},
111
+ [path]: {
112
+ ...(_c = preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) === null || _c === void 0 ? void 0 : _c[path],
113
+ collapsed: newCollapsedState,
114
+ },
115
+ },
116
+ });
117
+ }
118
+ }, [preferencesKey, preferences, path, setPreference, rows]);
119
+ const toggleCollapseAll = useCallback(async (collapse) => {
120
+ var _a;
121
+ dispatchRows({ type: 'SET_ALL_COLLAPSED', collapse });
122
+ if (preferencesKey) {
123
+ const preferencesToSet = preferences || { fields: {} };
124
+ setPreference(preferencesKey, {
125
+ ...preferencesToSet,
126
+ fields: {
127
+ ...(preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) || {},
128
+ [path]: {
129
+ ...(_a = preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) === null || _a === void 0 ? void 0 : _a[path],
130
+ collapsed: collapse ? rows.map(({ id: rowID }) => rowID) : [],
131
+ },
132
+ },
133
+ });
134
+ }
135
+ }, [path, preferences, preferencesKey, rows, setPreference]);
74
136
  useEffect(() => {
137
+ var _a, _b;
75
138
  const data = formContext.getDataByPath(path);
76
- dispatchRows({ type: 'SET_ALL', data: data || [] });
77
- }, [formContext, path]);
139
+ dispatchRows({ type: 'SET_ALL', data: data || [], collapsedState: (_b = (_a = preferences === null || preferences === void 0 ? void 0 : preferences.fields) === null || _a === void 0 ? void 0 : _a[path]) === null || _b === void 0 ? void 0 : _b.collapsed });
140
+ }, [formContext, path, preferences]);
78
141
  useEffect(() => {
79
142
  setValue((rows === null || rows === void 0 ? void 0 : rows.length) || 0, true);
80
143
  if ((rows === null || rows === void 0 ? void 0 : rows.length) === 0) {
@@ -84,20 +147,38 @@ const ArrayFieldType = (props) => {
84
147
  setDisableFormData(true);
85
148
  }
86
149
  }, [rows, setValue]);
87
- const hasMaxRows = maxRows && rows.length >= maxRows;
150
+ const hasMaxRows = maxRows && (rows === null || rows === void 0 ? void 0 : rows.length) >= maxRows;
88
151
  const classes = [
152
+ 'field-type',
89
153
  baseClass,
90
154
  className,
91
155
  ].filter(Boolean).join(' ');
156
+ if (!rows)
157
+ return null;
92
158
  return (React.createElement(DragDropContext, { onDragEnd: onDragEnd },
93
- React.createElement("div", { className: classes },
159
+ React.createElement("div", { id: `field-${path}`, className: classes },
94
160
  React.createElement("div", { className: `${baseClass}__error-wrap` },
95
161
  React.createElement(Error, { showError: showError, message: errorMessage })),
96
162
  React.createElement("header", { className: `${baseClass}__header` },
97
- React.createElement("h3", null, label),
163
+ React.createElement("div", { className: `${baseClass}__header-wrap` },
164
+ React.createElement("h3", null, label),
165
+ React.createElement("ul", { className: `${baseClass}__header-actions` },
166
+ React.createElement("li", null,
167
+ React.createElement("button", { type: "button", onClick: () => toggleCollapseAll(true), className: `${baseClass}__header-action` }, "Collapse All")),
168
+ React.createElement("li", null,
169
+ React.createElement("button", { type: "button", onClick: () => toggleCollapseAll(false), className: `${baseClass}__header-action` }, "Show All")))),
98
170
  React.createElement(FieldDescription, { value: value, description: description })),
99
171
  React.createElement(Droppable, { droppableId: "array-drop" }, (provided) => (React.createElement("div", { ref: provided.innerRef, ...provided.droppableProps },
100
- rows.length > 0 && rows.map((row, i) => (React.createElement(DraggableSection, { readOnly: readOnly, key: row.id, id: row.id, blockType: "array", label: labels.singular, rowCount: rows.length, rowIndex: i, addRow: addRow, removeRow: removeRow, moveRow: moveRow, parentPath: path, fieldTypes: fieldTypes, fieldSchema: fields, permissions: permissions, hasMaxRows: hasMaxRows }))),
172
+ rows.length > 0 && rows.map((row, i) => {
173
+ const rowNumber = i + 1;
174
+ return (React.createElement(Draggable, { key: row.id, draggableId: row.id, index: i, isDragDisabled: readOnly }, (providedDrag) => (React.createElement("div", { id: `${path}-row-${i}`, ref: providedDrag.innerRef, ...providedDrag.draggableProps },
175
+ React.createElement(Collapsible, { collapsed: row.collapsed, onToggle: (collapsed) => setCollapse(row.id, collapsed), className: `${baseClass}__row`, key: row.id, dragHandleProps: providedDrag.dragHandleProps, header: `${labels.singular} ${rowNumber >= 10 ? rowNumber : `0${rowNumber}`}`, actions: !readOnly ? (React.createElement(ArrayAction, { rowCount: rows.length, duplicateRow: duplicateRow, addRow: addRow, moveRow: moveRow, removeRow: removeRow, index: i })) : undefined },
176
+ React.createElement(HiddenInput, { name: `${path}.${i}.id`, value: row.id }),
177
+ React.createElement(RenderFields, { forceRender: true, readOnly: readOnly, fieldTypes: fieldTypes, permissions: permissions === null || permissions === void 0 ? void 0 : permissions.fields, fieldSchema: fields.map((field) => ({
178
+ ...field,
179
+ path: `${path}.${i}${fieldAffectsData(field) ? `.${field.name}` : ''}`,
180
+ })) }))))));
181
+ }),
101
182
  (rows.length < minRows || (required && rows.length === 0)) && (React.createElement(Banner, { type: "error" },
102
183
  "This field requires at least",
103
184
  ' ',
@@ -110,7 +191,7 @@ const ArrayFieldType = (props) => {
110
191
  labels.plural,
111
192
  ".")),
112
193
  provided.placeholder))),
113
- (!readOnly && (!hasMaxRows)) && (React.createElement("div", { className: `${baseClass}__add-button-wrap` },
194
+ (!readOnly && !hasMaxRows) && (React.createElement("div", { className: `${baseClass}__add-button-wrap` },
114
195
  React.createElement(Button, { onClick: () => addRow(value), buttonStyle: "icon-label", icon: "plus", iconStyle: "with-border", iconPosition: "left" }, `Add ${labels.singular}`))))));
115
196
  };
116
197
  export default withCondition(ArrayFieldType);
@@ -1,8 +1,7 @@
1
1
  @import '../../../../scss/styles.scss';
2
2
 
3
- .field-type.array {
4
- margin: base(2) 0;
5
- min-width: base(15);
3
+ .array-field {
4
+ margin: 0 0 base(2);
6
5
 
7
6
  &__header {
8
7
  h3 {
@@ -12,52 +11,51 @@
12
11
  margin-bottom: base(1);
13
12
  }
14
13
 
15
- &__error-wrap {
16
- position: relative;
14
+ &__header-wrap {
15
+ display: flex;
16
+ align-items: flex-end;
17
+ width: 100%;
17
18
  }
18
19
 
19
- &__add-button-wrap {
20
- margin-left: base(0);
20
+ &__header-actions {
21
+ list-style: none;
22
+ margin: 0 0 0 auto;
23
+ padding: 0;
24
+ display: flex;
25
+ }
21
26
 
22
- .btn {
23
- color: $color-gray;
24
- margin: 0;
27
+ &__header-action {
28
+ @extend %btn-reset;
29
+ cursor: pointer;
30
+ margin-left: base(.5);
25
31
 
26
- &:hover {
27
- color: $color-dark-gray;
28
- }
32
+ &:hover {
33
+ text-decoration: underline;
29
34
  }
30
35
  }
31
36
 
32
- .section .section {
33
- margin-top: 0;
37
+ &__row {
38
+ margin-bottom: base(.5);
34
39
  }
35
40
 
36
- .section__content {
37
- > div > div {
38
- width: 100%;
39
- }
41
+ &__error-wrap {
42
+ position: relative;
40
43
  }
41
44
 
42
- .render-fields {
43
- .row {
44
- &:last-child {
45
- margin-bottom: 0;
45
+ &__add-button-wrap {
46
+ margin-top: base(1);
47
+
48
+ .btn {
49
+ color: var(--theme-elevation-400);
50
+ margin: 0;
51
+
52
+ &:hover {
53
+ color: var(--theme-elevation-800);
46
54
  }
47
55
  }
48
56
  }
49
57
 
50
- @include mid-break {
51
- min-width: calc(100vw - #{base(2)});
52
- }
53
- }
54
-
55
- .field-type.group,
56
- .field-type.array,
57
- .field-type.blocks {
58
- .field-type.array {
59
- .field-type.array__add-button-wrap {
60
- margin-left: base(3);
61
- }
58
+ .field-type:last-child {
59
+ margin-bottom: 0;
62
60
  }
63
61
  }
@@ -12,12 +12,14 @@
12
12
  border-radius: 0;
13
13
  box-shadow: 0;
14
14
  border: 0;
15
+ color: currentColor;
15
16
 
16
17
  &:hover {
17
- background-color: $color-background-gray;
18
+ background-color: var(--theme-elevation-100);
18
19
  }
19
20
 
20
21
  &__image {
22
+
21
23
  svg,
22
24
  img {
23
25
  max-width: 100%;
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useEffect, useReducer, useState } from 'react';
2
- import { DragDropContext, Droppable } from 'react-beautiful-dnd';
2
+ import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
3
3
  import { useAuth } from '../../../utilities/Auth';
4
4
  import { usePreferences } from '../../../utilities/Preferences';
5
5
  import { useLocale } from '../../../utilities/Locale';
@@ -9,7 +9,6 @@ import reducer from '../rowReducer';
9
9
  import { useDocumentInfo } from '../../../utilities/DocumentInfo';
10
10
  import { useForm } from '../../Form/context';
11
11
  import buildStateFromSchema from '../../Form/buildStateFromSchema';
12
- import DraggableSection from '../../DraggableSection';
13
12
  import Error from '../../Error';
14
13
  import useField from '../../useField';
15
14
  import Popup from '../../../elements/Popup';
@@ -18,8 +17,16 @@ import { blocks as blocksValidator } from '../../../../../fields/validations';
18
17
  import Banner from '../../../elements/Banner';
19
18
  import FieldDescription from '../../FieldDescription';
20
19
  import { useOperation } from '../../../utilities/OperationProvider';
20
+ import { Collapsible } from '../../../elements/Collapsible';
21
+ import { ArrayAction } from '../../../elements/ArrayAction';
22
+ import RenderFields from '../../RenderFields';
23
+ import { fieldAffectsData } from '../../../../../fields/config/types';
24
+ import SectionTitle from './SectionTitle';
25
+ import Pill from '../../../elements/Pill';
26
+ import { scrollToID } from '../../../../utilities/scrollToID';
27
+ import HiddenInput from '../HiddenInput';
21
28
  import './index.scss';
22
- const baseClass = 'field-type blocks';
29
+ const baseClass = 'blocks-field';
23
30
  const labelDefaults = {
24
31
  singular: 'Block',
25
32
  plural: 'Blocks',
@@ -27,9 +34,9 @@ const labelDefaults = {
27
34
  const Blocks = (props) => {
28
35
  const { label, name, path: pathFromProps, blocks, labels = labelDefaults, fieldTypes, maxRows, minRows, required, validate = blocksValidator, permissions, admin: { readOnly, description, condition, className, }, } = props;
29
36
  const path = pathFromProps || name;
30
- const { preferencesKey } = useDocumentInfo();
31
- const { getPreference, setPreference } = usePreferences();
32
- const [rows, dispatchRows] = useReducer(reducer, []);
37
+ const { preferencesKey, preferences } = useDocumentInfo();
38
+ const { setPreference } = usePreferences();
39
+ const [rows, dispatchRows] = useReducer(reducer, undefined);
33
40
  const formContext = useForm();
34
41
  const { user } = useAuth();
35
42
  const { id } = useDocumentInfo();
@@ -40,19 +47,36 @@ const Blocks = (props) => {
40
47
  return validate(value, { ...options, minRows, maxRows, required });
41
48
  }, [maxRows, minRows, required, validate]);
42
49
  const [disableFormData, setDisableFormData] = useState(false);
50
+ const [selectorIndexOpen, setSelectorIndexOpen] = useState();
43
51
  const { showError, errorMessage, value, setValue, } = useField({
44
52
  path,
45
53
  validate: memoizedValidate,
46
54
  disableFormData,
47
55
  condition,
48
56
  });
57
+ const onAddPopupToggle = useCallback((open) => {
58
+ if (!open) {
59
+ setSelectorIndexOpen(undefined);
60
+ }
61
+ }, []);
49
62
  const addRow = useCallback(async (rowIndex, blockType) => {
50
63
  const block = blocks.find((potentialBlock) => potentialBlock.slug === blockType);
51
64
  const subFieldState = await buildStateFromSchema({ fieldSchema: block.fields, operation, id, user, locale });
52
65
  dispatchFields({ type: 'ADD_ROW', rowIndex, subFieldState, path, blockType });
53
66
  dispatchRows({ type: 'ADD', rowIndex, blockType });
54
67
  setValue(value + 1);
68
+ setTimeout(() => {
69
+ scrollToID(`${path}-row-${rowIndex + 1}`);
70
+ }, 0);
55
71
  }, [path, setValue, value, blocks, dispatchFields, operation, id, user, locale]);
72
+ const duplicateRow = useCallback(async (rowIndex, blockType) => {
73
+ dispatchFields({ type: 'DUPLICATE_ROW', rowIndex, path });
74
+ dispatchRows({ type: 'ADD', rowIndex, blockType });
75
+ setValue(value + 1);
76
+ setTimeout(() => {
77
+ scrollToID(`${path}-row-${rowIndex + 1}`);
78
+ }, 0);
79
+ }, [dispatchRows, dispatchFields, path, setValue, value]);
56
80
  const removeRow = useCallback((rowIndex) => {
57
81
  dispatchRows({ type: 'REMOVE', rowIndex });
58
82
  dispatchFields({ type: 'REMOVE_ROW', rowIndex, path });
@@ -62,11 +86,17 @@ const Blocks = (props) => {
62
86
  dispatchRows({ type: 'MOVE', moveFromIndex, moveToIndex });
63
87
  dispatchFields({ type: 'MOVE_ROW', moveFromIndex, moveToIndex, path });
64
88
  }, [dispatchRows, dispatchFields, path]);
89
+ const onDragEnd = useCallback((result) => {
90
+ if (!result.destination)
91
+ return;
92
+ const sourceIndex = result.source.index;
93
+ const destinationIndex = result.destination.index;
94
+ moveRow(sourceIndex, destinationIndex);
95
+ }, [moveRow]);
65
96
  const setCollapse = useCallback(async (rowID, collapsed) => {
66
97
  var _a, _b, _c;
67
98
  dispatchRows({ type: 'SET_COLLAPSE', id: rowID, collapsed });
68
99
  if (preferencesKey) {
69
- const preferences = await getPreference(preferencesKey);
70
100
  const preferencesToSet = preferences || { fields: {} };
71
101
  let newCollapsedState = ((_b = (_a = preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) === null || _a === void 0 ? void 0 : _a[path]) === null || _b === void 0 ? void 0 : _b.collapsed.filter((filterID) => (rows.find((row) => row.id === filterID))))
72
102
  || [];
@@ -87,32 +117,30 @@ const Blocks = (props) => {
87
117
  },
88
118
  });
89
119
  }
90
- }, [preferencesKey, getPreference, path, setPreference, rows]);
91
- const onDragEnd = useCallback((result) => {
92
- if (!result.destination)
93
- return;
94
- const sourceIndex = result.source.index;
95
- const destinationIndex = result.destination.index;
96
- moveRow(sourceIndex, destinationIndex);
97
- }, [moveRow]);
98
- // Get preferences, and once retrieved,
99
- // Reset rows with preferences included
100
- useEffect(() => {
101
- const data = formContext.getDataByPath(path);
102
- if (Array.isArray(data)) {
103
- const fetchPreferences = async () => {
104
- var _a, _b;
105
- const preferences = preferencesKey ? await getPreference(preferencesKey) : undefined;
106
- dispatchRows({ type: 'SET_ALL', data: data || [], collapsedState: (_b = (_a = preferences === null || preferences === void 0 ? void 0 : preferences.fields) === null || _a === void 0 ? void 0 : _a[path]) === null || _b === void 0 ? void 0 : _b.collapsed });
107
- };
108
- fetchPreferences();
120
+ }, [preferencesKey, preferences, path, setPreference, rows]);
121
+ const toggleCollapseAll = useCallback(async (collapse) => {
122
+ var _a;
123
+ dispatchRows({ type: 'SET_ALL_COLLAPSED', collapse });
124
+ if (preferencesKey) {
125
+ const preferencesToSet = preferences || { fields: {} };
126
+ setPreference(preferencesKey, {
127
+ ...preferencesToSet,
128
+ fields: {
129
+ ...(preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) || {},
130
+ [path]: {
131
+ ...(_a = preferencesToSet === null || preferencesToSet === void 0 ? void 0 : preferencesToSet.fields) === null || _a === void 0 ? void 0 : _a[path],
132
+ collapsed: collapse ? rows.map(({ id: rowID }) => rowID) : [],
133
+ },
134
+ },
135
+ });
109
136
  }
110
- }, [formContext, path, preferencesKey, getPreference]);
137
+ }, [path, preferences, preferencesKey, rows, setPreference]);
111
138
  // Set row count on mount and when form context is reset
112
139
  useEffect(() => {
140
+ var _a, _b;
113
141
  const data = formContext.getDataByPath(path);
114
- dispatchRows({ type: 'SET_ALL', data: data || [] });
115
- }, [formContext, path]);
142
+ dispatchRows({ type: 'SET_ALL', data: data || [], collapsedState: (_b = (_a = preferences === null || preferences === void 0 ? void 0 : preferences.fields) === null || _a === void 0 ? void 0 : _a[path]) === null || _b === void 0 ? void 0 : _b.collapsed });
143
+ }, [formContext, path, preferences]);
116
144
  useEffect(() => {
117
145
  setValue((rows === null || rows === void 0 ? void 0 : rows.length) || 0, true);
118
146
  if ((rows === null || rows === void 0 ? void 0 : rows.length) === 0) {
@@ -122,27 +150,45 @@ const Blocks = (props) => {
122
150
  setDisableFormData(true);
123
151
  }
124
152
  }, [rows, setValue]);
125
- const hasMaxRows = maxRows && rows.length >= maxRows;
153
+ const hasMaxRows = maxRows && (rows === null || rows === void 0 ? void 0 : rows.length) >= maxRows;
126
154
  const classes = [
155
+ 'field-type',
127
156
  baseClass,
128
157
  className,
129
158
  ].filter(Boolean).join(' ');
159
+ if (!rows)
160
+ return null;
130
161
  return (React.createElement(DragDropContext, { onDragEnd: onDragEnd },
131
- React.createElement("div", { className: classes },
162
+ React.createElement("div", { id: `field-${path}`, className: classes },
132
163
  React.createElement("div", { className: `${baseClass}__error-wrap` },
133
164
  React.createElement(Error, { showError: showError, message: errorMessage })),
134
165
  React.createElement("header", { className: `${baseClass}__header` },
135
- React.createElement("h3", null, label),
166
+ React.createElement("div", { className: `${baseClass}__header-wrap` },
167
+ React.createElement("h3", null, label),
168
+ React.createElement("ul", { className: `${baseClass}__header-actions` },
169
+ React.createElement("li", null,
170
+ React.createElement("button", { type: "button", onClick: () => toggleCollapseAll(true), className: `${baseClass}__header-action` }, "Collapse All")),
171
+ React.createElement("li", null,
172
+ React.createElement("button", { type: "button", onClick: () => toggleCollapseAll(false), className: `${baseClass}__header-action` }, "Show All")))),
136
173
  React.createElement(FieldDescription, { value: value, description: description })),
137
174
  React.createElement(Droppable, { droppableId: "blocks-drop", isDropDisabled: readOnly }, (provided) => (React.createElement("div", { ref: provided.innerRef, ...provided.droppableProps },
138
175
  rows.length > 0 && rows.map((row, i) => {
139
- var _a;
140
176
  const { blockType } = row;
141
177
  const blockToRender = blocks.find((block) => block.slug === blockType);
178
+ const rowNumber = i + 1;
142
179
  if (blockToRender) {
143
- return (React.createElement(DraggableSection, { readOnly: readOnly, key: row.id, id: row.id, blockType: "blocks", blocks: blocks, label: (_a = blockToRender === null || blockToRender === void 0 ? void 0 : blockToRender.labels) === null || _a === void 0 ? void 0 : _a.singular, isCollapsed: row.collapsed, rowCount: rows.length, rowIndex: i, addRow: addRow, removeRow: removeRow, moveRow: moveRow, setRowCollapse: setCollapse, parentPath: path, fieldTypes: fieldTypes, permissions: permissions, hasMaxRows: hasMaxRows, fieldSchema: [
144
- ...blockToRender.fields,
145
- ] }));
180
+ return (React.createElement(Draggable, { key: row.id, draggableId: row.id, index: i, isDragDisabled: readOnly }, (providedDrag) => (React.createElement("div", { id: `${path}-row-${i}`, ref: providedDrag.innerRef, ...providedDrag.draggableProps },
181
+ React.createElement(Collapsible, { collapsed: row.collapsed, onToggle: (collapsed) => setCollapse(row.id, collapsed), className: `${baseClass}__row`, key: row.id, dragHandleProps: providedDrag.dragHandleProps, header: (React.createElement("div", { className: `${baseClass}__block-header` },
182
+ React.createElement("span", { className: `${baseClass}__block-number` }, rowNumber >= 10 ? rowNumber : `0${rowNumber}`),
183
+ React.createElement(Pill, { pillStyle: "white", className: `${baseClass}__block-pill ${baseClass}__block-pill-${blockType}` }, blockToRender.labels.singular),
184
+ React.createElement(SectionTitle, { path: `${path}.${i}.blockName`, readOnly: readOnly }))), actions: !readOnly ? (React.createElement(React.Fragment, null,
185
+ React.createElement(Popup, { key: `${blockType}-${i}`, forceOpen: selectorIndexOpen === i, onToggleOpen: onAddPopupToggle, buttonType: "none", size: "large", horizontalAlign: "right", render: ({ close }) => (React.createElement(BlockSelector, { blocks: blocks, addRow: addRow, addRowIndex: i, close: close })) }),
186
+ React.createElement(ArrayAction, { rowCount: rows.length, duplicateRow: () => duplicateRow(i, blockType), addRow: () => setSelectorIndexOpen(i), moveRow: moveRow, removeRow: removeRow, index: i }))) : undefined },
187
+ React.createElement(HiddenInput, { name: `${path}.${i}.id`, value: row.id }),
188
+ React.createElement(RenderFields, { forceRender: true, readOnly: readOnly, fieldTypes: fieldTypes, permissions: permissions === null || permissions === void 0 ? void 0 : permissions.fields, fieldSchema: blockToRender.fields.map((field) => ({
189
+ ...field,
190
+ path: `${path}.${i}${fieldAffectsData(field) ? `.${field.name}` : ''}`,
191
+ })) }))))));
146
192
  }
147
193
  return null;
148
194
  }),
@@ -156,7 +202,7 @@ const Blocks = (props) => {
156
202
  labels.plural,
157
203
  ".")),
158
204
  provided.placeholder))),
159
- (!readOnly && (rows.length < maxRows || maxRows === undefined)) && (React.createElement("div", { className: `${baseClass}__add-button-wrap` },
205
+ (!readOnly && !hasMaxRows) && (React.createElement("div", { className: `${baseClass}__add-button-wrap` },
160
206
  React.createElement(Popup, { buttonType: "custom", size: "large", horizontalAlign: "left", button: (React.createElement(Button, { buttonStyle: "icon-label", icon: "plus", iconPosition: "left", iconStyle: "with-border" }, `Add ${labels.singular}`)), render: ({ close }) => (React.createElement(BlockSelector, { blocks: blocks, addRow: addRow, addRowIndex: value, close: close })) }))))));
161
207
  };
162
208
  export default withCondition(Blocks);
@@ -1,16 +1,18 @@
1
1
  import React from 'react';
2
- import useField from '../../useField';
3
- import Pill from '../../../elements/Pill';
2
+ import useField from '../../../useField';
4
3
  import './index.scss';
5
4
  const baseClass = 'section-title';
6
5
  const SectionTitle = (props) => {
7
- const { label, path, readOnly } = props;
6
+ const { path, readOnly } = props;
8
7
  const { value, setValue } = useField({ path });
9
8
  const classes = [
10
9
  baseClass,
11
10
  ].filter(Boolean).join(' ');
12
- return (React.createElement("div", { className: classes },
13
- React.createElement(Pill, { pillStyle: "light-gray", className: `${baseClass}__pill` }, label),
14
- React.createElement("input", { className: `${baseClass}__input`, id: path, value: value || '', placeholder: "Untitled", type: "text", name: path, onChange: setValue, readOnly: readOnly })));
11
+ return (React.createElement("div", { className: classes, "data-value": value },
12
+ React.createElement("input", { className: `${baseClass}__input`, id: path, value: value || '', placeholder: "Untitled", type: "text", name: path, onChange: (e) => {
13
+ e.stopPropagation();
14
+ e.preventDefault();
15
+ setValue(e.target.value);
16
+ }, readOnly: readOnly })));
15
17
  };
16
18
  export default SectionTitle;