@dnb/eufemia 10.17.0 → 10.18.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 (321) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/cjs/components/flex/Container.js +4 -0
  3. package/cjs/components/flex/Container.js.map +1 -1
  4. package/cjs/components/flex/utils.d.ts +1 -1
  5. package/cjs/components/flex/utils.js +11 -1
  6. package/cjs/components/flex/utils.js.map +1 -1
  7. package/cjs/components/input-masked/MultiInputMask.d.ts +10 -2
  8. package/cjs/components/input-masked/MultiInputMask.js +41 -14
  9. package/cjs/components/input-masked/MultiInputMask.js.map +1 -1
  10. package/cjs/components/input-masked/hooks/useMultiInputValues.d.ts +2 -2
  11. package/cjs/components/input-masked/hooks/useMultiInputValues.js.map +1 -1
  12. package/cjs/components/number-format/NumberFormat.js +1 -1
  13. package/cjs/components/number-format/NumberFormat.js.map +1 -1
  14. package/cjs/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.css +8 -1
  15. package/cjs/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.min.css +1 -1
  16. package/cjs/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.scss +6 -1
  17. package/cjs/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.css +4 -0
  18. package/cjs/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.min.css +1 -1
  19. package/cjs/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.scss +5 -0
  20. package/cjs/components/visually-hidden/VisuallyHidden.js +1 -1
  21. package/cjs/components/visually-hidden/VisuallyHidden.js.map +1 -1
  22. package/cjs/extensions/forms/DataContext/Provider/Provider.d.ts +8 -4
  23. package/cjs/extensions/forms/DataContext/Provider/Provider.js +22 -4
  24. package/cjs/extensions/forms/DataContext/Provider/Provider.js.map +1 -1
  25. package/cjs/extensions/forms/Field/ArraySelection/ArraySelection.js +14 -14
  26. package/cjs/extensions/forms/Field/ArraySelection/ArraySelection.js.map +1 -1
  27. package/cjs/extensions/forms/Field/ArraySelection/style/dnb-array-selection.css +12 -2
  28. package/cjs/extensions/forms/Field/ArraySelection/style/dnb-array-selection.min.css +1 -1
  29. package/cjs/extensions/forms/Field/ArraySelection/style/dnb-array-selection.scss +12 -2
  30. package/cjs/extensions/forms/Field/Date/Date.js +1 -5
  31. package/cjs/extensions/forms/Field/Date/Date.js.map +1 -1
  32. package/cjs/extensions/forms/Field/Expiry/Expiry.d.ts +1 -1
  33. package/cjs/extensions/forms/Field/Expiry/Expiry.js +20 -10
  34. package/cjs/extensions/forms/Field/Expiry/Expiry.js.map +1 -1
  35. package/cjs/extensions/forms/Field/Number/Number.js +0 -5
  36. package/cjs/extensions/forms/Field/Number/Number.js.map +1 -1
  37. package/cjs/extensions/forms/Field/PhoneNumber/PhoneNumber.js +4 -5
  38. package/cjs/extensions/forms/Field/PhoneNumber/PhoneNumber.js.map +1 -1
  39. package/cjs/extensions/forms/Field/Selection/Selection.d.ts +7 -1
  40. package/cjs/extensions/forms/Field/Selection/Selection.js +4 -9
  41. package/cjs/extensions/forms/Field/Selection/Selection.js.map +1 -1
  42. package/cjs/extensions/forms/Field/String/String.d.ts +0 -1
  43. package/cjs/extensions/forms/Field/String/String.js +2 -8
  44. package/cjs/extensions/forms/Field/String/String.js.map +1 -1
  45. package/cjs/extensions/forms/Field/Toggle/Toggle.js +0 -4
  46. package/cjs/extensions/forms/Field/Toggle/Toggle.js.map +1 -1
  47. package/cjs/extensions/forms/FieldBlock/FieldBlock.d.ts +1 -1
  48. package/cjs/extensions/forms/FieldBlock/FieldBlock.js +2 -10
  49. package/cjs/extensions/forms/FieldBlock/FieldBlock.js.map +1 -1
  50. package/cjs/extensions/forms/FieldBlock/style/dnb-field-block.css +0 -9
  51. package/cjs/extensions/forms/FieldBlock/style/dnb-field-block.min.css +1 -1
  52. package/cjs/extensions/forms/FieldBlock/style/dnb-field-block.scss +0 -11
  53. package/cjs/extensions/forms/Form/Handler/Handler.js +1 -0
  54. package/cjs/extensions/forms/Form/Handler/Handler.js.map +1 -1
  55. package/cjs/extensions/forms/Form/Visibility/Visibility.js +0 -1
  56. package/cjs/extensions/forms/Form/Visibility/Visibility.js.map +1 -1
  57. package/cjs/extensions/forms/Form/hooks/useData.d.ts +10 -0
  58. package/cjs/extensions/forms/Form/hooks/useData.js +36 -0
  59. package/cjs/extensions/forms/Form/hooks/useData.js.map +1 -0
  60. package/cjs/extensions/forms/Form/index.d.ts +1 -0
  61. package/cjs/extensions/forms/Form/index.js +7 -0
  62. package/cjs/extensions/forms/Form/index.js.map +1 -1
  63. package/cjs/extensions/forms/Iterate/Array/Array.js +0 -4
  64. package/cjs/extensions/forms/Iterate/Array/Array.js.map +1 -1
  65. package/cjs/extensions/forms/hooks/useDataValue.js +2 -2
  66. package/cjs/extensions/forms/hooks/useDataValue.js.map +1 -1
  67. package/cjs/extensions/forms/style/dnb-forms.css +12 -11
  68. package/cjs/extensions/forms/style/dnb-forms.min.css +1 -1
  69. package/cjs/extensions/forms/types.d.ts +4 -8
  70. package/cjs/extensions/forms/types.js.map +1 -1
  71. package/cjs/shared/Eufemia.d.ts +1 -1
  72. package/cjs/shared/Eufemia.js +2 -2
  73. package/cjs/shared/Eufemia.js.map +1 -1
  74. package/cjs/shared/helpers/EventEmitter.d.ts +5 -0
  75. package/cjs/shared/helpers/EventEmitter.js.map +1 -1
  76. package/cjs/shared/helpers/useEventEmitter.d.ts +2 -0
  77. package/cjs/shared/helpers/useEventEmitter.js.map +1 -1
  78. package/cjs/shared/helpers/useSharedState.d.ts +15 -0
  79. package/cjs/shared/helpers/useSharedState.js +71 -0
  80. package/cjs/shared/helpers/useSharedState.js.map +1 -0
  81. package/cjs/style/dnb-ui-components.css +12 -11
  82. package/cjs/style/dnb-ui-components.min.css +1 -1
  83. package/cjs/style/dnb-ui-extensions.css +12 -11
  84. package/cjs/style/dnb-ui-extensions.min.css +1 -1
  85. package/cjs/style/dnb-ui-forms.css +12 -11
  86. package/cjs/style/dnb-ui-forms.min.css +1 -1
  87. package/cjs/style/themes/theme-eiendom/eiendom-theme-components.css +28 -22
  88. package/cjs/style/themes/theme-eiendom/eiendom-theme-components.min.css +1 -1
  89. package/cjs/style/themes/theme-eiendom/eiendom-theme-extensions.css +12 -11
  90. package/cjs/style/themes/theme-eiendom/eiendom-theme-extensions.min.css +1 -1
  91. package/cjs/style/themes/theme-eiendom/eiendom-theme-forms.css +12 -11
  92. package/cjs/style/themes/theme-eiendom/eiendom-theme-forms.min.css +1 -1
  93. package/cjs/style/themes/theme-sbanken/sbanken-theme-components.css +32 -23
  94. package/cjs/style/themes/theme-sbanken/sbanken-theme-components.min.css +2 -2
  95. package/cjs/style/themes/theme-sbanken/sbanken-theme-extensions.css +12 -11
  96. package/cjs/style/themes/theme-sbanken/sbanken-theme-extensions.min.css +1 -1
  97. package/cjs/style/themes/theme-sbanken/sbanken-theme-forms.css +12 -11
  98. package/cjs/style/themes/theme-sbanken/sbanken-theme-forms.min.css +1 -1
  99. package/cjs/style/themes/theme-ui/ui-theme-components.css +28 -22
  100. package/cjs/style/themes/theme-ui/ui-theme-components.min.css +1 -1
  101. package/cjs/style/themes/theme-ui/ui-theme-extensions.css +12 -11
  102. package/cjs/style/themes/theme-ui/ui-theme-extensions.min.css +1 -1
  103. package/cjs/style/themes/theme-ui/ui-theme-forms.css +12 -11
  104. package/cjs/style/themes/theme-ui/ui-theme-forms.min.css +1 -1
  105. package/components/flex/Container.js +4 -0
  106. package/components/flex/Container.js.map +1 -1
  107. package/components/flex/utils.d.ts +1 -1
  108. package/components/flex/utils.js +11 -1
  109. package/components/flex/utils.js.map +1 -1
  110. package/components/input-masked/MultiInputMask.d.ts +10 -2
  111. package/components/input-masked/MultiInputMask.js +39 -14
  112. package/components/input-masked/MultiInputMask.js.map +1 -1
  113. package/components/input-masked/hooks/useMultiInputValues.d.ts +2 -2
  114. package/components/input-masked/hooks/useMultiInputValues.js.map +1 -1
  115. package/components/number-format/NumberFormat.js +1 -1
  116. package/components/number-format/NumberFormat.js.map +1 -1
  117. package/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.css +8 -1
  118. package/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.min.css +1 -1
  119. package/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.scss +6 -1
  120. package/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.css +4 -0
  121. package/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.min.css +1 -1
  122. package/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.scss +5 -0
  123. package/components/visually-hidden/VisuallyHidden.js +1 -1
  124. package/components/visually-hidden/VisuallyHidden.js.map +1 -1
  125. package/es/components/flex/Container.js +4 -0
  126. package/es/components/flex/Container.js.map +1 -1
  127. package/es/components/flex/utils.d.ts +1 -1
  128. package/es/components/flex/utils.js +11 -1
  129. package/es/components/flex/utils.js.map +1 -1
  130. package/es/components/input-masked/MultiInputMask.d.ts +10 -2
  131. package/es/components/input-masked/MultiInputMask.js +39 -13
  132. package/es/components/input-masked/MultiInputMask.js.map +1 -1
  133. package/es/components/input-masked/hooks/useMultiInputValues.d.ts +2 -2
  134. package/es/components/input-masked/hooks/useMultiInputValues.js.map +1 -1
  135. package/es/components/number-format/NumberFormat.js +1 -1
  136. package/es/components/number-format/NumberFormat.js.map +1 -1
  137. package/es/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.css +8 -1
  138. package/es/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.min.css +1 -1
  139. package/es/components/toggle-button/style/themes/dnb-toggle-button-theme-sbanken.scss +6 -1
  140. package/es/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.css +4 -0
  141. package/es/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.min.css +1 -1
  142. package/es/components/toggle-button/style/themes/dnb-toggle-button-theme-ui.scss +5 -0
  143. package/es/components/visually-hidden/VisuallyHidden.js +1 -1
  144. package/es/components/visually-hidden/VisuallyHidden.js.map +1 -1
  145. package/es/extensions/forms/DataContext/Provider/Provider.d.ts +8 -4
  146. package/es/extensions/forms/DataContext/Provider/Provider.js +22 -4
  147. package/es/extensions/forms/DataContext/Provider/Provider.js.map +1 -1
  148. package/es/extensions/forms/Field/ArraySelection/ArraySelection.js +15 -15
  149. package/es/extensions/forms/Field/ArraySelection/ArraySelection.js.map +1 -1
  150. package/es/extensions/forms/Field/ArraySelection/style/dnb-array-selection.css +12 -2
  151. package/es/extensions/forms/Field/ArraySelection/style/dnb-array-selection.min.css +1 -1
  152. package/es/extensions/forms/Field/ArraySelection/style/dnb-array-selection.scss +12 -2
  153. package/es/extensions/forms/Field/Date/Date.js +1 -5
  154. package/es/extensions/forms/Field/Date/Date.js.map +1 -1
  155. package/es/extensions/forms/Field/Expiry/Expiry.d.ts +1 -1
  156. package/es/extensions/forms/Field/Expiry/Expiry.js +20 -11
  157. package/es/extensions/forms/Field/Expiry/Expiry.js.map +1 -1
  158. package/es/extensions/forms/Field/Number/Number.js +0 -5
  159. package/es/extensions/forms/Field/Number/Number.js.map +1 -1
  160. package/es/extensions/forms/Field/PhoneNumber/PhoneNumber.js +4 -5
  161. package/es/extensions/forms/Field/PhoneNumber/PhoneNumber.js.map +1 -1
  162. package/es/extensions/forms/Field/Selection/Selection.d.ts +7 -1
  163. package/es/extensions/forms/Field/Selection/Selection.js +4 -9
  164. package/es/extensions/forms/Field/Selection/Selection.js.map +1 -1
  165. package/es/extensions/forms/Field/String/String.d.ts +0 -1
  166. package/es/extensions/forms/Field/String/String.js +2 -8
  167. package/es/extensions/forms/Field/String/String.js.map +1 -1
  168. package/es/extensions/forms/Field/Toggle/Toggle.js +0 -4
  169. package/es/extensions/forms/Field/Toggle/Toggle.js.map +1 -1
  170. package/es/extensions/forms/FieldBlock/FieldBlock.d.ts +1 -1
  171. package/es/extensions/forms/FieldBlock/FieldBlock.js +2 -10
  172. package/es/extensions/forms/FieldBlock/FieldBlock.js.map +1 -1
  173. package/es/extensions/forms/FieldBlock/style/dnb-field-block.css +0 -9
  174. package/es/extensions/forms/FieldBlock/style/dnb-field-block.min.css +1 -1
  175. package/es/extensions/forms/FieldBlock/style/dnb-field-block.scss +0 -11
  176. package/es/extensions/forms/Form/Handler/Handler.js +1 -0
  177. package/es/extensions/forms/Form/Handler/Handler.js.map +1 -1
  178. package/es/extensions/forms/Form/Visibility/Visibility.js +0 -1
  179. package/es/extensions/forms/Form/Visibility/Visibility.js.map +1 -1
  180. package/es/extensions/forms/Form/hooks/useData.d.ts +10 -0
  181. package/es/extensions/forms/Form/hooks/useData.js +29 -0
  182. package/es/extensions/forms/Form/hooks/useData.js.map +1 -0
  183. package/es/extensions/forms/Form/index.d.ts +1 -0
  184. package/es/extensions/forms/Form/index.js +1 -0
  185. package/es/extensions/forms/Form/index.js.map +1 -1
  186. package/es/extensions/forms/Iterate/Array/Array.js +0 -4
  187. package/es/extensions/forms/Iterate/Array/Array.js.map +1 -1
  188. package/es/extensions/forms/hooks/useDataValue.js +2 -2
  189. package/es/extensions/forms/hooks/useDataValue.js.map +1 -1
  190. package/es/extensions/forms/style/dnb-forms.css +12 -11
  191. package/es/extensions/forms/style/dnb-forms.min.css +1 -1
  192. package/es/extensions/forms/types.d.ts +4 -8
  193. package/es/extensions/forms/types.js.map +1 -1
  194. package/es/shared/Eufemia.d.ts +1 -1
  195. package/es/shared/Eufemia.js +2 -2
  196. package/es/shared/Eufemia.js.map +1 -1
  197. package/es/shared/helpers/EventEmitter.d.ts +5 -0
  198. package/es/shared/helpers/EventEmitter.js.map +1 -1
  199. package/es/shared/helpers/useEventEmitter.d.ts +2 -0
  200. package/es/shared/helpers/useEventEmitter.js.map +1 -1
  201. package/es/shared/helpers/useSharedState.d.ts +15 -0
  202. package/es/shared/helpers/useSharedState.js +63 -0
  203. package/es/shared/helpers/useSharedState.js.map +1 -0
  204. package/es/style/dnb-ui-components.css +12 -11
  205. package/es/style/dnb-ui-components.min.css +1 -1
  206. package/es/style/dnb-ui-extensions.css +12 -11
  207. package/es/style/dnb-ui-extensions.min.css +1 -1
  208. package/es/style/dnb-ui-forms.css +12 -11
  209. package/es/style/dnb-ui-forms.min.css +1 -1
  210. package/es/style/themes/theme-eiendom/eiendom-theme-components.css +28 -22
  211. package/es/style/themes/theme-eiendom/eiendom-theme-components.min.css +1 -1
  212. package/es/style/themes/theme-eiendom/eiendom-theme-extensions.css +12 -11
  213. package/es/style/themes/theme-eiendom/eiendom-theme-extensions.min.css +1 -1
  214. package/es/style/themes/theme-eiendom/eiendom-theme-forms.css +12 -11
  215. package/es/style/themes/theme-eiendom/eiendom-theme-forms.min.css +1 -1
  216. package/es/style/themes/theme-sbanken/sbanken-theme-components.css +32 -23
  217. package/es/style/themes/theme-sbanken/sbanken-theme-components.min.css +2 -2
  218. package/es/style/themes/theme-sbanken/sbanken-theme-extensions.css +12 -11
  219. package/es/style/themes/theme-sbanken/sbanken-theme-extensions.min.css +1 -1
  220. package/es/style/themes/theme-sbanken/sbanken-theme-forms.css +12 -11
  221. package/es/style/themes/theme-sbanken/sbanken-theme-forms.min.css +1 -1
  222. package/es/style/themes/theme-ui/ui-theme-components.css +28 -22
  223. package/es/style/themes/theme-ui/ui-theme-components.min.css +1 -1
  224. package/es/style/themes/theme-ui/ui-theme-extensions.css +12 -11
  225. package/es/style/themes/theme-ui/ui-theme-extensions.min.css +1 -1
  226. package/es/style/themes/theme-ui/ui-theme-forms.css +12 -11
  227. package/es/style/themes/theme-ui/ui-theme-forms.min.css +1 -1
  228. package/esm/dnb-ui-basis.min.mjs +1 -1
  229. package/esm/dnb-ui-components.min.mjs +1 -1
  230. package/esm/dnb-ui-elements.min.mjs +1 -1
  231. package/esm/dnb-ui-extensions.min.mjs +3 -3
  232. package/esm/dnb-ui-lib.min.mjs +1 -1
  233. package/extensions/forms/DataContext/Provider/Provider.d.ts +8 -4
  234. package/extensions/forms/DataContext/Provider/Provider.js +22 -4
  235. package/extensions/forms/DataContext/Provider/Provider.js.map +1 -1
  236. package/extensions/forms/Field/ArraySelection/ArraySelection.js +15 -15
  237. package/extensions/forms/Field/ArraySelection/ArraySelection.js.map +1 -1
  238. package/extensions/forms/Field/ArraySelection/style/dnb-array-selection.css +12 -2
  239. package/extensions/forms/Field/ArraySelection/style/dnb-array-selection.min.css +1 -1
  240. package/extensions/forms/Field/ArraySelection/style/dnb-array-selection.scss +12 -2
  241. package/extensions/forms/Field/Date/Date.js +1 -5
  242. package/extensions/forms/Field/Date/Date.js.map +1 -1
  243. package/extensions/forms/Field/Expiry/Expiry.d.ts +1 -1
  244. package/extensions/forms/Field/Expiry/Expiry.js +21 -11
  245. package/extensions/forms/Field/Expiry/Expiry.js.map +1 -1
  246. package/extensions/forms/Field/Number/Number.js +0 -5
  247. package/extensions/forms/Field/Number/Number.js.map +1 -1
  248. package/extensions/forms/Field/PhoneNumber/PhoneNumber.js +4 -5
  249. package/extensions/forms/Field/PhoneNumber/PhoneNumber.js.map +1 -1
  250. package/extensions/forms/Field/Selection/Selection.d.ts +7 -1
  251. package/extensions/forms/Field/Selection/Selection.js +4 -9
  252. package/extensions/forms/Field/Selection/Selection.js.map +1 -1
  253. package/extensions/forms/Field/String/String.d.ts +0 -1
  254. package/extensions/forms/Field/String/String.js +2 -8
  255. package/extensions/forms/Field/String/String.js.map +1 -1
  256. package/extensions/forms/Field/Toggle/Toggle.js +0 -4
  257. package/extensions/forms/Field/Toggle/Toggle.js.map +1 -1
  258. package/extensions/forms/FieldBlock/FieldBlock.d.ts +1 -1
  259. package/extensions/forms/FieldBlock/FieldBlock.js +2 -10
  260. package/extensions/forms/FieldBlock/FieldBlock.js.map +1 -1
  261. package/extensions/forms/FieldBlock/style/dnb-field-block.css +0 -9
  262. package/extensions/forms/FieldBlock/style/dnb-field-block.min.css +1 -1
  263. package/extensions/forms/FieldBlock/style/dnb-field-block.scss +0 -11
  264. package/extensions/forms/Form/Handler/Handler.js +1 -0
  265. package/extensions/forms/Form/Handler/Handler.js.map +1 -1
  266. package/extensions/forms/Form/Visibility/Visibility.js +0 -1
  267. package/extensions/forms/Form/Visibility/Visibility.js.map +1 -1
  268. package/extensions/forms/Form/hooks/useData.d.ts +10 -0
  269. package/extensions/forms/Form/hooks/useData.js +30 -0
  270. package/extensions/forms/Form/hooks/useData.js.map +1 -0
  271. package/extensions/forms/Form/index.d.ts +1 -0
  272. package/extensions/forms/Form/index.js +1 -0
  273. package/extensions/forms/Form/index.js.map +1 -1
  274. package/extensions/forms/Iterate/Array/Array.js +0 -4
  275. package/extensions/forms/Iterate/Array/Array.js.map +1 -1
  276. package/extensions/forms/hooks/useDataValue.js +2 -2
  277. package/extensions/forms/hooks/useDataValue.js.map +1 -1
  278. package/extensions/forms/style/dnb-forms.css +12 -11
  279. package/extensions/forms/style/dnb-forms.min.css +1 -1
  280. package/extensions/forms/types.d.ts +4 -8
  281. package/extensions/forms/types.js.map +1 -1
  282. package/package.json +1 -1
  283. package/shared/Eufemia.d.ts +1 -1
  284. package/shared/Eufemia.js +2 -2
  285. package/shared/Eufemia.js.map +1 -1
  286. package/shared/helpers/EventEmitter.d.ts +5 -0
  287. package/shared/helpers/EventEmitter.js.map +1 -1
  288. package/shared/helpers/useEventEmitter.d.ts +2 -0
  289. package/shared/helpers/useEventEmitter.js.map +1 -1
  290. package/shared/helpers/useSharedState.d.ts +15 -0
  291. package/shared/helpers/useSharedState.js +63 -0
  292. package/shared/helpers/useSharedState.js.map +1 -0
  293. package/style/dnb-ui-components.css +12 -11
  294. package/style/dnb-ui-components.min.css +1 -1
  295. package/style/dnb-ui-extensions.css +12 -11
  296. package/style/dnb-ui-extensions.min.css +1 -1
  297. package/style/dnb-ui-forms.css +12 -11
  298. package/style/dnb-ui-forms.min.css +1 -1
  299. package/style/themes/theme-eiendom/eiendom-theme-components.css +28 -22
  300. package/style/themes/theme-eiendom/eiendom-theme-components.min.css +1 -1
  301. package/style/themes/theme-eiendom/eiendom-theme-extensions.css +12 -11
  302. package/style/themes/theme-eiendom/eiendom-theme-extensions.min.css +1 -1
  303. package/style/themes/theme-eiendom/eiendom-theme-forms.css +12 -11
  304. package/style/themes/theme-eiendom/eiendom-theme-forms.min.css +1 -1
  305. package/style/themes/theme-sbanken/sbanken-theme-components.css +32 -23
  306. package/style/themes/theme-sbanken/sbanken-theme-components.min.css +2 -2
  307. package/style/themes/theme-sbanken/sbanken-theme-extensions.css +12 -11
  308. package/style/themes/theme-sbanken/sbanken-theme-extensions.min.css +1 -1
  309. package/style/themes/theme-sbanken/sbanken-theme-forms.css +12 -11
  310. package/style/themes/theme-sbanken/sbanken-theme-forms.min.css +1 -1
  311. package/style/themes/theme-ui/ui-theme-components.css +28 -22
  312. package/style/themes/theme-ui/ui-theme-components.min.css +1 -1
  313. package/style/themes/theme-ui/ui-theme-extensions.css +12 -11
  314. package/style/themes/theme-ui/ui-theme-extensions.min.css +1 -1
  315. package/style/themes/theme-ui/ui-theme-forms.css +12 -11
  316. package/style/themes/theme-ui/ui-theme-forms.min.css +1 -1
  317. package/umd/dnb-ui-basis.min.js +1 -1
  318. package/umd/dnb-ui-components.min.js +1 -1
  319. package/umd/dnb-ui-elements.min.js +1 -1
  320. package/umd/dnb-ui-extensions.min.js +2 -2
  321. package/umd/dnb-ui-lib.min.js +1 -1
@@ -1,17 +1,21 @@
1
1
  import React from 'react';
2
2
  import { JsonObject } from 'json-pointer';
3
- import { JSONSchema7 } from 'json-schema';
3
+ import { JSONSchema } from '../../types';
4
+ export type Path = string;
5
+ export type UpdateDataValue = (path: Path, data: unknown) => void;
4
6
  export interface Props<Data extends JsonObject> {
7
+ /** Unique ID to communicate with the hook Form.useData */
8
+ id?: string;
5
9
  /** Default source data, only used if no other source is available, and not leading to updates if changed after mount */
6
10
  defaultData?: Partial<Data>;
7
11
  /** Dynamic source data used as both initial data, and updates internal data if changed after mount */
8
12
  data?: Partial<Data>;
9
13
  /** JSON Schema for validating the data, like during input or after attempting submit */
10
- schema?: JSONSchema7;
14
+ schema?: JSONSchema;
11
15
  /** Change handler for the whole data set */
12
16
  onChange?: (data: Data) => void;
13
17
  /** Change handler for each value */
14
- onPathChange?: (path: string, value: any) => void;
18
+ onPathChange?: (path: Path, value: any) => void;
15
19
  /** Submit called, data was valid (if validation available) */
16
20
  onSubmit?: (data: Data, { resetForm, clearData, }: {
17
21
  /** Will remove browser-side stored autocomplete data */
@@ -26,4 +30,4 @@ export interface Props<Data extends JsonObject> {
26
30
  sessionStorageId?: string;
27
31
  children: React.ReactNode;
28
32
  }
29
- export default function Provider<Data extends JsonObject>({ defaultData, data, schema, onChange, onPathChange, onSubmit, onSubmitRequest, scrollTopOnSubmit, sessionStorageId, children, ...rest }: Props<Data>): import("react/jsx-runtime").JSX.Element;
33
+ export default function Provider<Data extends JsonObject>({ id, defaultData, data, schema, onChange, onPathChange, onSubmit, onSubmitRequest, scrollTopOnSubmit, sessionStorageId, children, ...rest }: Props<Data>): import("react/jsx-runtime").JSX.Element;
@@ -2,7 +2,7 @@
2
2
 
3
3
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
4
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
5
- const _excluded = ["defaultData", "data", "schema", "onChange", "onPathChange", "onSubmit", "onSubmitRequest", "scrollTopOnSubmit", "sessionStorageId", "children"];
5
+ const _excluded = ["id", "defaultData", "data", "schema", "onChange", "onPathChange", "onSubmit", "onSubmitRequest", "scrollTopOnSubmit", "sessionStorageId", "children"];
6
6
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
7
7
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
8
  import React, { useEffect, useRef, useMemo, useCallback, useReducer } from 'react';
@@ -10,6 +10,7 @@ import pointer from 'json-pointer';
10
10
  import ajv, { ajvErrorsToFormErrors } from '../../utils/ajv';
11
11
  import useMountEffect from '../../hooks/useMountEffect';
12
12
  import useUpdateEffect from '../../hooks/useUpdateEffect';
13
+ import { useSharedState } from '../../../../shared/helpers/useSharedState';
13
14
  import Context from '../Context';
14
15
  import structuredClone from '@ungap/structured-clone';
15
16
  function addListPath(paths, path) {
@@ -21,6 +22,7 @@ function removeListPath(paths, path) {
21
22
  const isArrayJsonPointer = /^\/\d+(\/|$)/;
22
23
  export default function Provider(_ref) {
23
24
  let {
25
+ id,
24
26
  defaultData,
25
27
  data,
26
28
  schema,
@@ -57,6 +59,12 @@ export default function Provider(_ref) {
57
59
  const internalDataRef = useRef(initialData);
58
60
  const dataCacheRef = useRef(data);
59
61
  const ajvSchemaValidatorRef = useRef();
62
+ const sharedState = useSharedState(id, initialData);
63
+ useMemo(() => {
64
+ if (sharedState !== null && sharedState !== void 0 && sharedState.data && !initialData) {
65
+ internalDataRef.current = sharedState.data;
66
+ }
67
+ }, [initialData, sharedState.data]);
60
68
  const validateData = useCallback(() => {
61
69
  if (!ajvSchemaValidatorRef.current) {
62
70
  return;
@@ -91,18 +99,28 @@ export default function Provider(_ref) {
91
99
  if (!path) {
92
100
  return;
93
101
  }
94
- const newData = structuredClone(path === '/' ? value : (_internalDataRef$curr = internalDataRef.current) !== null && _internalDataRef$curr !== void 0 ? _internalDataRef$curr : path.match(isArrayJsonPointer) ? [] : {});
102
+ const givenData = path === '/' ? value : (_internalDataRef$curr = internalDataRef.current) !== null && _internalDataRef$curr !== void 0 ? _internalDataRef$curr : path.match(isArrayJsonPointer) ? [] : {};
103
+ let newData = null;
104
+ try {
105
+ newData = structuredClone(givenData);
106
+ } catch (e) {
107
+ newData = givenData;
108
+ }
95
109
  if (path !== '/') {
96
110
  pointer.set(newData, path, value);
97
111
  }
112
+ if (id) {
113
+ var _sharedState$update;
114
+ (_sharedState$update = sharedState.update) === null || _sharedState$update === void 0 ? void 0 : _sharedState$update.call(sharedState, newData);
115
+ }
116
+ internalDataRef.current = newData;
98
117
  if (sessionStorageId && typeof window !== 'undefined') {
99
118
  var _window$sessionStorag2;
100
119
  (_window$sessionStorag2 = window.sessionStorage) === null || _window$sessionStorag2 === void 0 ? void 0 : _window$sessionStorag2.setItem(sessionStorageId, JSON.stringify(newData));
101
120
  }
102
- internalDataRef.current = newData;
103
121
  forceUpdate();
104
122
  return newData;
105
- }, [sessionStorageId]);
123
+ }, [id, sessionStorageId, sharedState]);
106
124
  const handlePathChange = useCallback((path, value) => {
107
125
  if (!path) {
108
126
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"Provider.js","names":["React","useEffect","useRef","useMemo","useCallback","useReducer","pointer","ajv","ajvErrorsToFormErrors","useMountEffect","useUpdateEffect","Context","structuredClone","addListPath","paths","path","includes","concat","removeListPath","filter","thisPath","isArrayJsonPointer","Provider","_ref","defaultData","data","schema","onChange","onPathChange","onSubmit","onSubmitRequest","scrollTopOnSubmit","sessionStorageId","children","rest","_objectWithoutProperties","_excluded","forceUpdate","undefined","console","error","mountedFieldPathsRef","errorsRef","showAllErrorsRef","setShowAllErrors","showAllErrors","current","valuesWithErrorRef","initialData","window","_window$sessionStorag","sessionDataJSON","sessionStorage","getItem","JSON","parse","internalDataRef","dataCacheRef","ajvSchemaValidatorRef","validateData","errors","compile","hasErrors","Boolean","find","mountedFieldPath","_errorsRef$current","setValueWithError","identifier","withError","updateDataValue","value","_internalDataRef$curr","newData","match","set","_window$sessionStorag2","setItem","stringify","handlePathChange","handleMountField","handleUnMountField","handleSubmit","formElement","arguments","length","resetForm","_formElement$reset","reset","call","removeItem","clearData","_window","scrollTo","top","behavior","createElement","_objectSpread","mountedFieldPaths"],"sources":["../../../../../../src/extensions/forms/DataContext/Provider/Provider.tsx"],"sourcesContent":["import React, {\n useEffect,\n useRef,\n useMemo,\n useCallback,\n useReducer,\n} from 'react'\nimport pointer, { JsonObject } from 'json-pointer'\nimport { JSONSchema7 } from 'json-schema'\nimport { ValidateFunction } from 'ajv'\nimport ajv, { ajvErrorsToFormErrors } from '../../utils/ajv'\nimport { FormError } from '../../types'\nimport useMountEffect from '../../hooks/useMountEffect'\nimport useUpdateEffect from '../../hooks/useUpdateEffect'\nimport Context, { ContextState } from '../Context'\n\n/**\n * Deprecated, as it is supported by all major browsers and Node.js >=v18\n * So its a question of time, when we will remove this polyfill\n */\nimport structuredClone from '@ungap/structured-clone'\n\nexport interface Props<Data extends JsonObject> {\n /** Default source data, only used if no other source is available, and not leading to updates if changed after mount */\n defaultData?: Partial<Data>\n /** Dynamic source data used as both initial data, and updates internal data if changed after mount */\n data?: Partial<Data>\n /** JSON Schema for validating the data, like during input or after attempting submit */\n schema?: JSONSchema7\n /** Change handler for the whole data set */\n onChange?: (data: Data) => void\n /** Change handler for each value */\n onPathChange?: (path: string, value: any) => void\n /** Submit called, data was valid (if validation available) */\n onSubmit?: (\n data: Data,\n {\n resetForm,\n clearData,\n }: {\n /** Will remove browser-side stored autocomplete data */\n resetForm: () => void\n /** Will empty the whole internal data set of the form */\n clearData: () => void\n }\n ) => void\n /** Submit was requested, but data was invalid */\n onSubmitRequest?: () => void\n scrollTopOnSubmit?: boolean\n /** Key for caching the data in session storage */\n sessionStorageId?: string\n children: React.ReactNode\n}\n\ntype PathList = string[]\n\nfunction addListPath(paths: PathList, path: string): PathList {\n return paths.includes(path) ? paths : paths.concat(path)\n}\n\nfunction removeListPath(paths: PathList, path: string): PathList {\n return paths.filter((thisPath) => thisPath !== path)\n}\n\nconst isArrayJsonPointer = /^\\/\\d+(\\/|$)/\n\nexport default function Provider<Data extends JsonObject>({\n defaultData,\n data,\n schema,\n onChange,\n onPathChange,\n onSubmit,\n onSubmitRequest,\n scrollTopOnSubmit,\n sessionStorageId,\n children,\n ...rest\n}: Props<Data>) {\n const [, forceUpdate] = useReducer(() => ({}), {})\n // Prop error handling\n if (data !== undefined && sessionStorageId !== undefined) {\n console.error(\n 'Providing both data and sessionStorageId could lead to competing data sources. To provide default data to use only before anything is changed in the interface, use defaultData.'\n )\n }\n\n // State\n const mountedFieldPathsRef = useRef<string[]>([])\n // - Errors from provider validation (the whole data set)\n const errorsRef = useRef<Record<string, FormError> | undefined>()\n const showAllErrorsRef = useRef<boolean>(false)\n const setShowAllErrors = useCallback((showAllErrors: boolean) => {\n showAllErrorsRef.current = showAllErrors\n }, [])\n // - Errors reported by fields, based on their direct validation rules\n const valuesWithErrorRef = useRef<string[]>([])\n // - Data\n const initialData = useMemo(() => {\n if (sessionStorageId && typeof window !== 'undefined') {\n const sessionDataJSON =\n window.sessionStorage?.getItem(sessionStorageId)\n if (sessionDataJSON) {\n return JSON.parse(sessionDataJSON)\n }\n }\n return data ?? defaultData\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Avoid triggering code that should only run initially\n }, [])\n const internalDataRef = useRef<Partial<Data>>(initialData)\n const dataCacheRef = useRef<Partial<Data>>(data)\n // - Validator\n const ajvSchemaValidatorRef = useRef<ValidateFunction>()\n\n const validateData = useCallback(() => {\n if (!ajvSchemaValidatorRef.current) {\n // No schema-based validator. Assume data is valid.\n return\n }\n\n if (!ajvSchemaValidatorRef.current(internalDataRef.current)) {\n // Errors found\n const errors = ajvErrorsToFormErrors(\n ajvSchemaValidatorRef.current.errors\n )\n errorsRef.current = errors\n } else {\n errorsRef.current = undefined\n }\n forceUpdate()\n }, [])\n\n useEffect(() => {\n if (!schema) {\n return\n }\n ajvSchemaValidatorRef.current = ajv.compile(schema)\n validateData()\n }, [schema, validateData])\n\n // Error handling\n const hasErrors = useCallback(\n () =>\n Boolean(\n mountedFieldPathsRef.current.find(\n (mountedFieldPath) =>\n errorsRef.current?.[mountedFieldPath] !== undefined ||\n valuesWithErrorRef.current.includes(mountedFieldPath)\n )\n ),\n []\n )\n\n const setValueWithError = useCallback(\n (identifier: string, withError: boolean) => {\n if (withError !== valuesWithErrorRef.current.includes(identifier)) {\n // The boolean error state for the target value was changed\n valuesWithErrorRef.current = withError\n ? addListPath(valuesWithErrorRef.current, identifier)\n : removeListPath(valuesWithErrorRef.current, identifier)\n forceUpdate()\n }\n },\n []\n )\n\n const updateDataValue = useCallback(\n (path, value) => {\n if (!path) {\n return\n }\n\n // Update the data even if it contains errors. Submit/SubmitRequest will be called accordingly\n const newData = structuredClone(\n path === '/'\n ? // When setting the root of the data, the whole data set should be the new value\n value\n : // For sub paths, use the the existing data set (or empty array/object), but modify it below (since pointer.set is not immutable)\n internalDataRef.current ??\n (path.match(isArrayJsonPointer) ? [] : {})\n )\n\n if (path !== '/') {\n pointer.set(newData as Data, path, value)\n }\n\n if (sessionStorageId && typeof window !== 'undefined') {\n window.sessionStorage?.setItem(\n sessionStorageId,\n JSON.stringify(newData)\n )\n }\n\n internalDataRef.current = newData\n\n forceUpdate()\n\n return newData\n },\n [sessionStorageId]\n )\n\n const handlePathChange = useCallback(\n (path, value) => {\n if (!path) {\n return\n }\n\n onPathChange?.(path, value)\n\n const newData = updateDataValue(path, value)\n\n onChange?.(newData as Data)\n\n showAllErrorsRef.current = false\n\n validateData()\n },\n [onPathChange, updateDataValue, onChange, validateData]\n )\n\n // Mounted fields\n const handleMountField = useCallback((path: string) => {\n mountedFieldPathsRef.current = addListPath(\n mountedFieldPathsRef.current,\n path\n )\n }, [])\n\n const handleUnMountField = useCallback((path: string) => {\n mountedFieldPathsRef.current = removeListPath(\n mountedFieldPathsRef.current,\n path\n )\n }, [])\n\n /**\n * Request to submit the whole form\n */\n const handleSubmit = useCallback<ContextState['handleSubmit']>(\n ({ formElement = null } = {}) => {\n if (!hasErrors()) {\n const resetForm = () => {\n formElement?.reset?.()\n\n if (typeof window !== 'undefined') {\n if (sessionStorageId) {\n window.sessionStorage.removeItem(sessionStorageId)\n }\n }\n\n forceUpdate() // in order to fill \"empty fields\" again with their internal states\n }\n const clearData = () => {\n internalDataRef.current = {}\n forceUpdate()\n }\n\n onSubmit?.(internalDataRef.current as Data, {\n resetForm,\n clearData,\n })\n\n if (typeof window !== 'undefined') {\n if (scrollTopOnSubmit) {\n window?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n }\n } else {\n showAllErrorsRef.current = true\n onSubmitRequest?.()\n forceUpdate()\n }\n return internalDataRef.current\n },\n [\n scrollTopOnSubmit,\n hasErrors,\n onSubmit,\n onSubmitRequest,\n sessionStorageId,\n ]\n )\n\n useMountEffect(() => {\n // Validate the initial data\n validateData()\n })\n\n useUpdateEffect(() => {\n // Update and validate changes to the external data set,\n // And avoid \"resetting\" the data with the originally given data (React.StrictMode)\n if (data !== dataCacheRef.current) {\n dataCacheRef.current = data\n internalDataRef.current = data\n }\n validateData()\n forceUpdate()\n }, [data, validateData, forceUpdate])\n\n return (\n <Context.Provider\n value={{\n data: internalDataRef.current,\n ...rest,\n handlePathChange,\n updateDataValue,\n handleSubmit,\n errors: errorsRef.current,\n showAllErrors: showAllErrorsRef.current,\n setShowAllErrors,\n mountedFieldPaths: mountedFieldPathsRef.current,\n handleMountField,\n handleUnMountField,\n hasErrors,\n setValueWithError,\n }}\n >\n {children}\n </Context.Provider>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Provider.js","names":["React","useEffect","useRef","useMemo","useCallback","useReducer","pointer","ajv","ajvErrorsToFormErrors","useMountEffect","useUpdateEffect","useSharedState","Context","structuredClone","addListPath","paths","path","includes","concat","removeListPath","filter","thisPath","isArrayJsonPointer","Provider","_ref","id","defaultData","data","schema","onChange","onPathChange","onSubmit","onSubmitRequest","scrollTopOnSubmit","sessionStorageId","children","rest","_objectWithoutProperties","_excluded","forceUpdate","undefined","console","error","mountedFieldPathsRef","errorsRef","showAllErrorsRef","setShowAllErrors","showAllErrors","current","valuesWithErrorRef","initialData","window","_window$sessionStorag","sessionDataJSON","sessionStorage","getItem","JSON","parse","internalDataRef","dataCacheRef","ajvSchemaValidatorRef","sharedState","validateData","errors","compile","hasErrors","Boolean","find","mountedFieldPath","_errorsRef$current","setValueWithError","identifier","withError","updateDataValue","value","_internalDataRef$curr","givenData","match","newData","e","set","_sharedState$update","update","call","_window$sessionStorag2","setItem","stringify","handlePathChange","handleMountField","handleUnMountField","handleSubmit","formElement","arguments","length","resetForm","_formElement$reset","reset","removeItem","clearData","_window","scrollTo","top","behavior","createElement","_objectSpread","mountedFieldPaths"],"sources":["../../../../../../src/extensions/forms/DataContext/Provider/Provider.tsx"],"sourcesContent":["import React, {\n useEffect,\n useRef,\n useMemo,\n useCallback,\n useReducer,\n} from 'react'\nimport pointer, { JsonObject } from 'json-pointer'\nimport { ValidateFunction } from 'ajv'\nimport ajv, { ajvErrorsToFormErrors } from '../../utils/ajv'\nimport { FormError, JSONSchema } from '../../types'\nimport useMountEffect from '../../hooks/useMountEffect'\nimport useUpdateEffect from '../../hooks/useUpdateEffect'\nimport { useSharedState } from '../../../../shared/helpers/useSharedState'\nimport Context, { ContextState } from '../Context'\n\n/**\n * Deprecated, as it is supported by all major browsers and Node.js >=v18\n * So its a question of time, when we will remove this polyfill\n */\nimport structuredClone from '@ungap/structured-clone'\n\nexport type Path = string\nexport type UpdateDataValue = (path: Path, data: unknown) => void\n\nexport interface Props<Data extends JsonObject> {\n /** Unique ID to communicate with the hook Form.useData */\n id?: string\n /** Default source data, only used if no other source is available, and not leading to updates if changed after mount */\n defaultData?: Partial<Data>\n /** Dynamic source data used as both initial data, and updates internal data if changed after mount */\n data?: Partial<Data>\n /** JSON Schema for validating the data, like during input or after attempting submit */\n schema?: JSONSchema\n /** Change handler for the whole data set */\n onChange?: (data: Data) => void\n /** Change handler for each value */\n onPathChange?: (path: Path, value: any) => void\n /** Submit called, data was valid (if validation available) */\n onSubmit?: (\n data: Data,\n {\n resetForm,\n clearData,\n }: {\n /** Will remove browser-side stored autocomplete data */\n resetForm: () => void\n /** Will empty the whole internal data set of the form */\n clearData: () => void\n }\n ) => void\n /** Submit was requested, but data was invalid */\n onSubmitRequest?: () => void\n scrollTopOnSubmit?: boolean\n /** Key for caching the data in session storage */\n sessionStorageId?: string\n children: React.ReactNode\n}\n\ntype PathList = string[]\n\nfunction addListPath(paths: PathList, path: Path): PathList {\n return paths.includes(path) ? paths : paths.concat(path)\n}\n\nfunction removeListPath(paths: PathList, path: Path): PathList {\n return paths.filter((thisPath) => thisPath !== path)\n}\n\nconst isArrayJsonPointer = /^\\/\\d+(\\/|$)/\n\nexport default function Provider<Data extends JsonObject>({\n id,\n defaultData,\n data,\n schema,\n onChange,\n onPathChange,\n onSubmit,\n onSubmitRequest,\n scrollTopOnSubmit,\n sessionStorageId,\n children,\n ...rest\n}: Props<Data>) {\n const [, forceUpdate] = useReducer(() => ({}), {})\n // Prop error handling\n if (data !== undefined && sessionStorageId !== undefined) {\n console.error(\n 'Providing both data and sessionStorageId could lead to competing data sources. To provide default data to use only before anything is changed in the interface, use defaultData.'\n )\n }\n\n // State\n const mountedFieldPathsRef = useRef<string[]>([])\n // - Errors from provider validation (the whole data set)\n const errorsRef = useRef<Record<string, FormError> | undefined>()\n const showAllErrorsRef = useRef<boolean>(false)\n const setShowAllErrors = useCallback((showAllErrors: boolean) => {\n showAllErrorsRef.current = showAllErrors\n }, [])\n // - Errors reported by fields, based on their direct validation rules\n const valuesWithErrorRef = useRef<string[]>([])\n // - Data\n const initialData = useMemo(() => {\n if (sessionStorageId && typeof window !== 'undefined') {\n const sessionDataJSON =\n window.sessionStorage?.getItem(sessionStorageId)\n if (sessionDataJSON) {\n return JSON.parse(sessionDataJSON)\n }\n }\n return data ?? defaultData\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Avoid triggering code that should only run initially\n }, [])\n const internalDataRef = useRef<Partial<Data>>(initialData)\n const dataCacheRef = useRef<Partial<Data>>(data)\n // - Validator\n const ajvSchemaValidatorRef = useRef<ValidateFunction>()\n // - Shared state\n const sharedState = useSharedState(id, initialData)\n useMemo(() => {\n if (sharedState?.data && !initialData) {\n internalDataRef.current = sharedState.data\n }\n }, [initialData, sharedState.data])\n\n const validateData = useCallback(() => {\n if (!ajvSchemaValidatorRef.current) {\n // No schema-based validator. Assume data is valid.\n return\n }\n\n if (!ajvSchemaValidatorRef.current(internalDataRef.current)) {\n // Errors found\n const errors = ajvErrorsToFormErrors(\n ajvSchemaValidatorRef.current.errors\n )\n errorsRef.current = errors\n } else {\n errorsRef.current = undefined\n }\n forceUpdate()\n }, [])\n\n useEffect(() => {\n if (!schema) {\n return\n }\n ajvSchemaValidatorRef.current = ajv.compile(schema)\n validateData()\n }, [schema, validateData])\n\n // Error handling\n const hasErrors = useCallback(\n () =>\n Boolean(\n mountedFieldPathsRef.current.find(\n (mountedFieldPath) =>\n errorsRef.current?.[mountedFieldPath] !== undefined ||\n valuesWithErrorRef.current.includes(mountedFieldPath)\n )\n ),\n []\n )\n\n const setValueWithError = useCallback(\n (identifier: string, withError: boolean) => {\n if (withError !== valuesWithErrorRef.current.includes(identifier)) {\n // The boolean error state for the target value was changed\n valuesWithErrorRef.current = withError\n ? addListPath(valuesWithErrorRef.current, identifier)\n : removeListPath(valuesWithErrorRef.current, identifier)\n forceUpdate()\n }\n },\n []\n )\n\n const updateDataValue: UpdateDataValue = useCallback(\n (path, value) => {\n if (!path) {\n return\n }\n\n const givenData =\n path === '/'\n ? // When setting the root of the data, the whole data set should be the new value\n value\n : // For sub paths, use the the existing data set (or empty array/object), but modify it below (since pointer.set is not immutable)\n internalDataRef.current ??\n (path.match(isArrayJsonPointer) ? [] : {})\n\n let newData = null\n try {\n // Update the data even if it contains errors. Submit/SubmitRequest will be called accordingly\n newData = structuredClone(givenData)\n } catch (e) {\n newData = givenData\n }\n\n if (path !== '/') {\n pointer.set(newData as Data, path, value)\n }\n\n if (id) {\n sharedState.update?.(newData)\n }\n\n internalDataRef.current = newData\n\n if (sessionStorageId && typeof window !== 'undefined') {\n window.sessionStorage?.setItem(\n sessionStorageId,\n JSON.stringify(newData)\n )\n }\n\n forceUpdate()\n\n return newData\n },\n [id, sessionStorageId, sharedState]\n )\n\n const handlePathChange: UpdateDataValue = useCallback(\n (path, value) => {\n if (!path) {\n return\n }\n\n onPathChange?.(path, value)\n\n const newData = updateDataValue(path, value)\n\n onChange?.(newData as Data)\n\n showAllErrorsRef.current = false\n\n validateData()\n },\n [onPathChange, updateDataValue, onChange, validateData]\n )\n\n // Mounted fields\n const handleMountField = useCallback((path: Path) => {\n mountedFieldPathsRef.current = addListPath(\n mountedFieldPathsRef.current,\n path\n )\n }, [])\n\n const handleUnMountField = useCallback((path: Path) => {\n mountedFieldPathsRef.current = removeListPath(\n mountedFieldPathsRef.current,\n path\n )\n }, [])\n\n /**\n * Request to submit the whole form\n */\n const handleSubmit = useCallback<ContextState['handleSubmit']>(\n ({ formElement = null } = {}) => {\n if (!hasErrors()) {\n const resetForm = () => {\n formElement?.reset?.()\n\n if (typeof window !== 'undefined') {\n if (sessionStorageId) {\n window.sessionStorage.removeItem(sessionStorageId)\n }\n }\n\n forceUpdate() // in order to fill \"empty fields\" again with their internal states\n }\n const clearData = () => {\n internalDataRef.current = {}\n forceUpdate()\n }\n\n onSubmit?.(internalDataRef.current as Data, {\n resetForm,\n clearData,\n })\n\n if (typeof window !== 'undefined') {\n if (scrollTopOnSubmit) {\n window?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n }\n } else {\n showAllErrorsRef.current = true\n onSubmitRequest?.()\n forceUpdate()\n }\n return internalDataRef.current\n },\n [\n scrollTopOnSubmit,\n hasErrors,\n onSubmit,\n onSubmitRequest,\n sessionStorageId,\n ]\n )\n\n useMountEffect(() => {\n // Validate the initial data\n validateData()\n })\n\n useUpdateEffect(() => {\n // Update and validate changes to the external data set,\n // And avoid \"resetting\" the data with the originally given data (React.StrictMode)\n if (data !== dataCacheRef.current) {\n dataCacheRef.current = data\n internalDataRef.current = data\n }\n validateData()\n forceUpdate()\n }, [data, validateData, forceUpdate])\n\n return (\n <Context.Provider\n value={{\n data: internalDataRef.current,\n ...rest,\n handlePathChange,\n updateDataValue,\n handleSubmit,\n errors: errorsRef.current,\n showAllErrors: showAllErrorsRef.current,\n setShowAllErrors,\n mountedFieldPaths: mountedFieldPathsRef.current,\n handleMountField,\n handleUnMountField,\n hasErrors,\n setValueWithError,\n }}\n >\n {children}\n </Context.Provider>\n )\n}\n"],"mappings":";;;;;;;AAAA,OAAOA,KAAK,IACVC,SAAS,EACTC,MAAM,EACNC,OAAO,EACPC,WAAW,EACXC,UAAU,QACL,OAAO;AACd,OAAOC,OAAO,MAAsB,cAAc;AAElD,OAAOC,GAAG,IAAIC,qBAAqB,QAAQ,iBAAiB;AAE5D,OAAOC,cAAc,MAAM,4BAA4B;AACvD,OAAOC,eAAe,MAAM,6BAA6B;AACzD,SAASC,cAAc,QAAQ,2CAA2C;AAC1E,OAAOC,OAAO,MAAwB,YAAY;AAMlD,OAAOC,eAAe,MAAM,yBAAyB;AAyCrD,SAASC,WAAWA,CAACC,KAAe,EAAEC,IAAU,EAAY;EAC1D,OAAOD,KAAK,CAACE,QAAQ,CAACD,IAAI,CAAC,GAAGD,KAAK,GAAGA,KAAK,CAACG,MAAM,CAACF,IAAI,CAAC;AAC1D;AAEA,SAASG,cAAcA,CAACJ,KAAe,EAAEC,IAAU,EAAY;EAC7D,OAAOD,KAAK,CAACK,MAAM,CAAEC,QAAQ,IAAKA,QAAQ,KAAKL,IAAI,CAAC;AACtD;AAEA,MAAMM,kBAAkB,GAAG,cAAc;AAEzC,eAAe,SAASC,QAAQA,CAAAC,IAAA,EAahB;EAAA,IAb0C;MACxDC,EAAE;MACFC,WAAW;MACXC,IAAI;MACJC,MAAM;MACNC,QAAQ;MACRC,YAAY;MACZC,QAAQ;MACRC,eAAe;MACfC,iBAAiB;MACjBC,gBAAgB;MAChBC;IAEW,CAAC,GAAAX,IAAA;IADTY,IAAI,GAAAC,wBAAA,CAAAb,IAAA,EAAAc,SAAA;EAEP,MAAM,GAAGC,WAAW,CAAC,GAAGlC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAElD,IAAIsB,IAAI,KAAKa,SAAS,IAAIN,gBAAgB,KAAKM,SAAS,EAAE;IACxDC,OAAO,CAACC,KAAK,CACX,kLACF,CAAC;EACH;EAGA,MAAMC,oBAAoB,GAAGzC,MAAM,CAAW,EAAE,CAAC;EAEjD,MAAM0C,SAAS,GAAG1C,MAAM,CAAwC,CAAC;EACjE,MAAM2C,gBAAgB,GAAG3C,MAAM,CAAU,KAAK,CAAC;EAC/C,MAAM4C,gBAAgB,GAAG1C,WAAW,CAAE2C,aAAsB,IAAK;IAC/DF,gBAAgB,CAACG,OAAO,GAAGD,aAAa;EAC1C,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,kBAAkB,GAAG/C,MAAM,CAAW,EAAE,CAAC;EAE/C,MAAMgD,WAAW,GAAG/C,OAAO,CAAC,MAAM;IAChC,IAAI+B,gBAAgB,IAAI,OAAOiB,MAAM,KAAK,WAAW,EAAE;MAAA,IAAAC,qBAAA;MACrD,MAAMC,eAAe,IAAAD,qBAAA,GACnBD,MAAM,CAACG,cAAc,cAAAF,qBAAA,uBAArBA,qBAAA,CAAuBG,OAAO,CAACrB,gBAAgB,CAAC;MAClD,IAAImB,eAAe,EAAE;QACnB,OAAOG,IAAI,CAACC,KAAK,CAACJ,eAAe,CAAC;MACpC;IACF;IACA,OAAO1B,IAAI,aAAJA,IAAI,cAAJA,IAAI,GAAID,WAAW;EAE5B,CAAC,EAAE,EAAE,CAAC;EACN,MAAMgC,eAAe,GAAGxD,MAAM,CAAgBgD,WAAW,CAAC;EAC1D,MAAMS,YAAY,GAAGzD,MAAM,CAAgByB,IAAI,CAAC;EAEhD,MAAMiC,qBAAqB,GAAG1D,MAAM,CAAmB,CAAC;EAExD,MAAM2D,WAAW,GAAGlD,cAAc,CAACc,EAAE,EAAEyB,WAAW,CAAC;EACnD/C,OAAO,CAAC,MAAM;IACZ,IAAI0D,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAElC,IAAI,IAAI,CAACuB,WAAW,EAAE;MACrCQ,eAAe,CAACV,OAAO,GAAGa,WAAW,CAAClC,IAAI;IAC5C;EACF,CAAC,EAAE,CAACuB,WAAW,EAAEW,WAAW,CAAClC,IAAI,CAAC,CAAC;EAEnC,MAAMmC,YAAY,GAAG1D,WAAW,CAAC,MAAM;IACrC,IAAI,CAACwD,qBAAqB,CAACZ,OAAO,EAAE;MAElC;IACF;IAEA,IAAI,CAACY,qBAAqB,CAACZ,OAAO,CAACU,eAAe,CAACV,OAAO,CAAC,EAAE;MAE3D,MAAMe,MAAM,GAAGvD,qBAAqB,CAClCoD,qBAAqB,CAACZ,OAAO,CAACe,MAChC,CAAC;MACDnB,SAAS,CAACI,OAAO,GAAGe,MAAM;IAC5B,CAAC,MAAM;MACLnB,SAAS,CAACI,OAAO,GAAGR,SAAS;IAC/B;IACAD,WAAW,CAAC,CAAC;EACf,CAAC,EAAE,EAAE,CAAC;EAENtC,SAAS,CAAC,MAAM;IACd,IAAI,CAAC2B,MAAM,EAAE;MACX;IACF;IACAgC,qBAAqB,CAACZ,OAAO,GAAGzC,GAAG,CAACyD,OAAO,CAACpC,MAAM,CAAC;IACnDkC,YAAY,CAAC,CAAC;EAChB,CAAC,EAAE,CAAClC,MAAM,EAAEkC,YAAY,CAAC,CAAC;EAG1B,MAAMG,SAAS,GAAG7D,WAAW,CAC3B,MACE8D,OAAO,CACLvB,oBAAoB,CAACK,OAAO,CAACmB,IAAI,CAC9BC,gBAAgB;IAAA,IAAAC,kBAAA;IAAA,OACf,EAAAA,kBAAA,GAAAzB,SAAS,CAACI,OAAO,cAAAqB,kBAAA,uBAAjBA,kBAAA,CAAoBD,gBAAgB,CAAC,MAAK5B,SAAS,IACnDS,kBAAkB,CAACD,OAAO,CAAC/B,QAAQ,CAACmD,gBAAgB,CAAC;EAAA,CACzD,CACF,CAAC,EACH,EACF,CAAC;EAED,MAAME,iBAAiB,GAAGlE,WAAW,CACnC,CAACmE,UAAkB,EAAEC,SAAkB,KAAK;IAC1C,IAAIA,SAAS,KAAKvB,kBAAkB,CAACD,OAAO,CAAC/B,QAAQ,CAACsD,UAAU,CAAC,EAAE;MAEjEtB,kBAAkB,CAACD,OAAO,GAAGwB,SAAS,GAClC1D,WAAW,CAACmC,kBAAkB,CAACD,OAAO,EAAEuB,UAAU,CAAC,GACnDpD,cAAc,CAAC8B,kBAAkB,CAACD,OAAO,EAAEuB,UAAU,CAAC;MAC1DhC,WAAW,CAAC,CAAC;IACf;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMkC,eAAgC,GAAGrE,WAAW,CAClD,CAACY,IAAI,EAAE0D,KAAK,KAAK;IAAA,IAAAC,qBAAA;IACf,IAAI,CAAC3D,IAAI,EAAE;MACT;IACF;IAEA,MAAM4D,SAAS,GACb5D,IAAI,KAAK,GAAG,GAER0D,KAAK,IAAAC,qBAAA,GAELjB,eAAe,CAACV,OAAO,cAAA2B,qBAAA,cAAAA,qBAAA,GACtB3D,IAAI,CAAC6D,KAAK,CAACvD,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAE;IAEhD,IAAIwD,OAAO,GAAG,IAAI;IAClB,IAAI;MAEFA,OAAO,GAAGjE,eAAe,CAAC+D,SAAS,CAAC;IACtC,CAAC,CAAC,OAAOG,CAAC,EAAE;MACVD,OAAO,GAAGF,SAAS;IACrB;IAEA,IAAI5D,IAAI,KAAK,GAAG,EAAE;MAChBV,OAAO,CAAC0E,GAAG,CAACF,OAAO,EAAU9D,IAAI,EAAE0D,KAAK,CAAC;IAC3C;IAEA,IAAIjD,EAAE,EAAE;MAAA,IAAAwD,mBAAA;MACN,CAAAA,mBAAA,GAAApB,WAAW,CAACqB,MAAM,cAAAD,mBAAA,uBAAlBA,mBAAA,CAAAE,IAAA,CAAAtB,WAAW,EAAUiB,OAAO,CAAC;IAC/B;IAEApB,eAAe,CAACV,OAAO,GAAG8B,OAAO;IAEjC,IAAI5C,gBAAgB,IAAI,OAAOiB,MAAM,KAAK,WAAW,EAAE;MAAA,IAAAiC,sBAAA;MACrD,CAAAA,sBAAA,GAAAjC,MAAM,CAACG,cAAc,cAAA8B,sBAAA,uBAArBA,sBAAA,CAAuBC,OAAO,CAC5BnD,gBAAgB,EAChBsB,IAAI,CAAC8B,SAAS,CAACR,OAAO,CACxB,CAAC;IACH;IAEAvC,WAAW,CAAC,CAAC;IAEb,OAAOuC,OAAO;EAChB,CAAC,EACD,CAACrD,EAAE,EAAES,gBAAgB,EAAE2B,WAAW,CACpC,CAAC;EAED,MAAM0B,gBAAiC,GAAGnF,WAAW,CACnD,CAACY,IAAI,EAAE0D,KAAK,KAAK;IACf,IAAI,CAAC1D,IAAI,EAAE;MACT;IACF;IAEAc,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAGd,IAAI,EAAE0D,KAAK,CAAC;IAE3B,MAAMI,OAAO,GAAGL,eAAe,CAACzD,IAAI,EAAE0D,KAAK,CAAC;IAE5C7C,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAGiD,OAAe,CAAC;IAE3BjC,gBAAgB,CAACG,OAAO,GAAG,KAAK;IAEhCc,YAAY,CAAC,CAAC;EAChB,CAAC,EACD,CAAChC,YAAY,EAAE2C,eAAe,EAAE5C,QAAQ,EAAEiC,YAAY,CACxD,CAAC;EAGD,MAAM0B,gBAAgB,GAAGpF,WAAW,CAAEY,IAAU,IAAK;IACnD2B,oBAAoB,CAACK,OAAO,GAAGlC,WAAW,CACxC6B,oBAAoB,CAACK,OAAO,EAC5BhC,IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMyE,kBAAkB,GAAGrF,WAAW,CAAEY,IAAU,IAAK;IACrD2B,oBAAoB,CAACK,OAAO,GAAG7B,cAAc,CAC3CwB,oBAAoB,CAACK,OAAO,EAC5BhC,IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAKN,MAAM0E,YAAY,GAAGtF,WAAW,CAC9B,YAAiC;IAAA,IAAhC;MAAEuF,WAAW,GAAG;IAAK,CAAC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,CAAC,CAAC;IAC1B,IAAI,CAAC3B,SAAS,CAAC,CAAC,EAAE;MAChB,MAAM6B,SAAS,GAAGA,CAAA,KAAM;QAAA,IAAAC,kBAAA;QACtBJ,WAAW,aAAXA,WAAW,wBAAAI,kBAAA,GAAXJ,WAAW,CAAEK,KAAK,cAAAD,kBAAA,uBAAlBA,kBAAA,CAAAZ,IAAA,CAAAQ,WAAqB,CAAC;QAEtB,IAAI,OAAOxC,MAAM,KAAK,WAAW,EAAE;UACjC,IAAIjB,gBAAgB,EAAE;YACpBiB,MAAM,CAACG,cAAc,CAAC2C,UAAU,CAAC/D,gBAAgB,CAAC;UACpD;QACF;QAEAK,WAAW,CAAC,CAAC;MACf,CAAC;MACD,MAAM2D,SAAS,GAAGA,CAAA,KAAM;QACtBxC,eAAe,CAACV,OAAO,GAAG,CAAC,CAAC;QAC5BT,WAAW,CAAC,CAAC;MACf,CAAC;MAEDR,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAG2B,eAAe,CAACV,OAAO,EAAU;QAC1C8C,SAAS;QACTI;MACF,CAAC,CAAC;MAEF,IAAI,OAAO/C,MAAM,KAAK,WAAW,EAAE;QACjC,IAAIlB,iBAAiB,EAAE;UAAA,IAAAkE,OAAA;UACrB,CAAAA,OAAA,GAAAhD,MAAM,cAAAgD,OAAA,uBAANA,OAAA,CAAQC,QAAQ,CAAC;YAAEC,GAAG,EAAE,CAAC;YAAEC,QAAQ,EAAE;UAAS,CAAC,CAAC;QAClD;MACF;IACF,CAAC,MAAM;MACLzD,gBAAgB,CAACG,OAAO,GAAG,IAAI;MAC/BhB,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAG,CAAC;MACnBO,WAAW,CAAC,CAAC;IACf;IACA,OAAOmB,eAAe,CAACV,OAAO;EAChC,CAAC,EACD,CACEf,iBAAiB,EACjBgC,SAAS,EACTlC,QAAQ,EACRC,eAAe,EACfE,gBAAgB,CAEpB,CAAC;EAEDzB,cAAc,CAAC,MAAM;IAEnBqD,YAAY,CAAC,CAAC;EAChB,CAAC,CAAC;EAEFpD,eAAe,CAAC,MAAM;IAGpB,IAAIiB,IAAI,KAAKgC,YAAY,CAACX,OAAO,EAAE;MACjCW,YAAY,CAACX,OAAO,GAAGrB,IAAI;MAC3B+B,eAAe,CAACV,OAAO,GAAGrB,IAAI;IAChC;IACAmC,YAAY,CAAC,CAAC;IACdvB,WAAW,CAAC,CAAC;EACf,CAAC,EAAE,CAACZ,IAAI,EAAEmC,YAAY,EAAEvB,WAAW,CAAC,CAAC;EAErC,OACEvC,KAAA,CAAAuG,aAAA,CAAC3F,OAAO,CAACW,QAAQ;IACfmD,KAAK,EAAA8B,aAAA,CAAAA,aAAA;MACH7E,IAAI,EAAE+B,eAAe,CAACV;IAAO,GAC1BZ,IAAI;MACPmD,gBAAgB;MAChBd,eAAe;MACfiB,YAAY;MACZ3B,MAAM,EAAEnB,SAAS,CAACI,OAAO;MACzBD,aAAa,EAAEF,gBAAgB,CAACG,OAAO;MACvCF,gBAAgB;MAChB2D,iBAAiB,EAAE9D,oBAAoB,CAACK,OAAO;MAC/CwC,gBAAgB;MAChBC,kBAAkB;MAClBxB,SAAS;MACTK;IAAiB;EACjB,GAEDnC,QACe,CAAC;AAEvB"}
@@ -2,13 +2,13 @@ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
3
3
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
4
  import React, { useMemo } from 'react';
5
- import { Checkbox, Button } from '../../../../components';
6
- import ButtonRow from '../../Form/ButtonRow';
5
+ import { Checkbox, ToggleButton } from '../../../../components';
7
6
  import classnames from 'classnames';
8
7
  import Option from '../Option';
9
8
  import FieldBlock from '../../FieldBlock';
10
9
  import { useDataValue } from '../../hooks';
11
10
  import { pickSpacingProps } from '../../../../components/flex/utils';
11
+ import ToggleButtonGroupContext from '../../../../components/toggle-button/ToggleButtonGroupContext';
12
12
  function ArraySelection(props) {
13
13
  const {
14
14
  id,
@@ -17,10 +17,9 @@ function ArraySelection(props) {
17
17
  layout = 'vertical',
18
18
  optionsLayout = 'vertical',
19
19
  label,
20
- labelDescription,
21
- labelSecondary,
22
20
  value,
23
21
  error,
22
+ hasError,
24
23
  info,
25
24
  warning,
26
25
  disabled,
@@ -30,15 +29,13 @@ function ArraySelection(props) {
30
29
  } = useDataValue(props);
31
30
  const fieldBlockProps = _objectSpread({
32
31
  forId: id,
33
- className: classnames(`dnb-forms-field-array-selection dnb-forms-field-array-selection--options-layout-${optionsLayout}`, className),
32
+ className: classnames(`dnb-forms-field-array-selection dnb-forms-field-array-selection--layout-${optionsLayout}`, className),
34
33
  contentClassName: 'dnb-forms-field-array-selection__options',
35
34
  info,
36
35
  warning,
37
36
  error,
38
37
  layout,
39
- label,
40
- labelDescription,
41
- labelSecondary
38
+ label
42
39
  }, pickSpacingProps(props));
43
40
  const options = useMemo(() => React.Children.toArray(children).filter(child => React.isValidElement(child) && child.type === Option).map(option => {
44
41
  var _option$props$title;
@@ -54,14 +51,16 @@ function ArraySelection(props) {
54
51
  }), [children, value, emptyValue, handleChange]);
55
52
  switch (variant) {
56
53
  case 'button':
57
- return React.createElement(FieldBlock, fieldBlockProps, React.createElement(ButtonRow, null, options.map((option, i) => React.createElement(Button, {
54
+ return React.createElement(FieldBlock, fieldBlockProps, React.createElement(ToggleButtonGroupContext.Provider, {
55
+ value: {
56
+ status: hasError ? 'error' : undefined,
57
+ disabled
58
+ }
59
+ }, options.map((option, i) => React.createElement(ToggleButton, {
58
60
  key: `option-${i}-${option.value}`,
59
- id: id,
60
61
  text: option.title,
61
- on_click: option.handleSelect,
62
- variant: value !== null && value !== void 0 && value.includes(option.value) ? undefined : 'secondary',
63
- status: error ? 'error' : undefined,
64
- disabled: disabled
62
+ checked: value === null || value === void 0 ? void 0 : value.includes(option.value),
63
+ on_change: option.handleSelect
65
64
  }))));
66
65
  case 'checkbox':
67
66
  return React.createElement(FieldBlock, fieldBlockProps, options.map((option, i) => React.createElement(Checkbox, {
@@ -70,7 +69,8 @@ function ArraySelection(props) {
70
69
  label: option.title,
71
70
  checked: value === null || value === void 0 ? void 0 : value.includes(option.value),
72
71
  disabled: disabled,
73
- on_change: option.handleSelect
72
+ on_change: option.handleSelect,
73
+ status: hasError ? 'error' : undefined
74
74
  })));
75
75
  }
76
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ArraySelection.js","names":["React","useMemo","Checkbox","Button","ButtonRow","classnames","Option","FieldBlock","useDataValue","pickSpacingProps","ArraySelection","props","id","className","variant","layout","optionsLayout","label","labelDescription","labelSecondary","value","error","info","warning","disabled","emptyValue","handleChange","children","fieldBlockProps","_objectSpread","forId","contentClassName","options","Children","toArray","filter","child","isValidElement","type","map","option","_option$props$title","title","handleSelect","selected","newValue","includes","length","createElement","i","key","text","on_click","undefined","status","checked","on_change","_supportsSpacingProps"],"sources":["../../../../../../src/extensions/forms/Field/ArraySelection/ArraySelection.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { Checkbox, Button } from '../../../../components'\nimport ButtonRow from '../../Form/ButtonRow'\nimport classnames from 'classnames'\nimport Option from '../Option'\nimport FieldBlock from '../../FieldBlock'\nimport { useDataValue } from '../../hooks'\nimport { FieldProps } from '../../types'\nimport { pickSpacingProps } from '../../../../components/flex/utils'\n\ninterface IOption {\n title: string\n value: number | string\n handleSelect: () => void\n}\n\nexport type Props = FieldProps<Array<string | number>> & {\n children?: React.ReactNode\n variant?: 'checkbox' | 'button'\n optionsLayout?: 'horizontal' | 'vertical'\n}\n\nfunction ArraySelection(props: Props) {\n const {\n id,\n className,\n variant = 'checkbox',\n layout = 'vertical',\n optionsLayout = 'vertical',\n label,\n labelDescription,\n labelSecondary,\n value,\n error,\n info,\n warning,\n disabled,\n emptyValue,\n handleChange,\n children,\n } = useDataValue(props)\n\n const fieldBlockProps = {\n forId: id,\n className: classnames(\n 'dnb-forms-field-array-selection',\n `dnb-forms-field-array-selection--options-layout-${optionsLayout}`,\n className\n ),\n contentClassName: 'dnb-forms-field-array-selection__options',\n info,\n warning,\n error,\n layout,\n label,\n labelDescription,\n labelSecondary,\n ...pickSpacingProps(props),\n }\n\n const options: IOption[] = useMemo(\n () =>\n React.Children.toArray(children)\n .filter(\n (child) => React.isValidElement(child) && child.type === Option\n )\n .map((option: React.ReactElement) => ({\n title: option.props.title ?? option.props.children,\n value: option.props.value,\n handleSelect: () => {\n const selected = option.props.value\n\n const newValue = value?.includes(selected)\n ? value.filter((value) => value !== selected)\n : [...(value ?? []), selected]\n\n handleChange?.(newValue.length === 0 ? emptyValue : newValue)\n },\n })),\n [children, value, emptyValue, handleChange]\n )\n\n switch (variant) {\n case 'button':\n return (\n <FieldBlock {...fieldBlockProps}>\n <ButtonRow>\n {options.map((option, i) => (\n <Button\n key={`option-${i}-${option.value}`}\n id={id}\n text={option.title}\n on_click={option.handleSelect}\n variant={\n value?.includes(option.value) ? undefined : 'secondary'\n }\n status={error ? 'error' : undefined}\n disabled={disabled}\n />\n ))}\n </ButtonRow>\n </FieldBlock>\n )\n case 'checkbox':\n return (\n <FieldBlock {...fieldBlockProps}>\n {options.map((option, i) => (\n <Checkbox\n key={`option-${i}-${option.value}`}\n className=\"dnb-forms-field-array-selection__checkbox\"\n label={option.title}\n checked={value?.includes(option.value)}\n disabled={disabled}\n on_change={option.handleSelect}\n />\n ))}\n </FieldBlock>\n )\n }\n}\n\nArraySelection._supportsSpacingProps = true\nexport default ArraySelection\n"],"mappings":"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"}
1
+ {"version":3,"file":"ArraySelection.js","names":["React","useMemo","Checkbox","ToggleButton","classnames","Option","FieldBlock","useDataValue","pickSpacingProps","ToggleButtonGroupContext","ArraySelection","props","id","className","variant","layout","optionsLayout","label","value","error","hasError","info","warning","disabled","emptyValue","handleChange","children","fieldBlockProps","_objectSpread","forId","contentClassName","options","Children","toArray","filter","child","isValidElement","type","map","option","_option$props$title","title","handleSelect","selected","newValue","includes","length","createElement","Provider","status","undefined","i","key","text","checked","on_change","_supportsSpacingProps"],"sources":["../../../../../../src/extensions/forms/Field/ArraySelection/ArraySelection.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport { Checkbox, ToggleButton } from '../../../../components'\nimport classnames from 'classnames'\nimport Option from '../Option'\nimport FieldBlock from '../../FieldBlock'\nimport { useDataValue } from '../../hooks'\nimport { FieldProps } from '../../types'\nimport { pickSpacingProps } from '../../../../components/flex/utils'\nimport ToggleButtonGroupContext from '../../../../components/toggle-button/ToggleButtonGroupContext'\n\ninterface IOption {\n title: string\n value: number | string\n handleSelect: () => void\n}\n\nexport type Props = FieldProps<Array<string | number>> & {\n children?: React.ReactNode\n variant?: 'checkbox' | 'button'\n optionsLayout?: 'horizontal' | 'vertical'\n}\n\nfunction ArraySelection(props: Props) {\n const {\n id,\n className,\n variant = 'checkbox',\n layout = 'vertical',\n optionsLayout = 'vertical',\n label,\n value,\n error,\n hasError,\n info,\n warning,\n disabled,\n emptyValue,\n handleChange,\n children,\n } = useDataValue(props)\n\n const fieldBlockProps = {\n forId: id,\n className: classnames(\n 'dnb-forms-field-array-selection',\n `dnb-forms-field-array-selection--layout-${optionsLayout}`,\n className\n ),\n contentClassName: 'dnb-forms-field-array-selection__options',\n info,\n warning,\n error,\n layout,\n label,\n ...pickSpacingProps(props),\n }\n\n const options: IOption[] = useMemo(\n () =>\n React.Children.toArray(children)\n .filter(\n (child) => React.isValidElement(child) && child.type === Option\n )\n .map((option: React.ReactElement) => ({\n title: option.props.title ?? option.props.children,\n value: option.props.value,\n handleSelect: () => {\n const selected = option.props.value\n\n const newValue = value?.includes(selected)\n ? value.filter((value) => value !== selected)\n : [...(value ?? []), selected]\n\n handleChange?.(newValue.length === 0 ? emptyValue : newValue)\n },\n })),\n [children, value, emptyValue, handleChange]\n )\n\n switch (variant) {\n case 'button':\n return (\n <FieldBlock {...fieldBlockProps}>\n <ToggleButtonGroupContext.Provider\n value={{\n status: hasError ? 'error' : undefined,\n disabled,\n }}\n >\n {options.map((option, i) => (\n <ToggleButton\n key={`option-${i}-${option.value}`}\n text={option.title}\n checked={value?.includes(option.value)}\n on_change={option.handleSelect}\n />\n ))}\n </ToggleButtonGroupContext.Provider>\n </FieldBlock>\n )\n case 'checkbox':\n return (\n <FieldBlock {...fieldBlockProps}>\n {options.map((option, i) => (\n <Checkbox\n key={`option-${i}-${option.value}`}\n className=\"dnb-forms-field-array-selection__checkbox\"\n label={option.title}\n checked={value?.includes(option.value)}\n disabled={disabled}\n on_change={option.handleSelect}\n status={hasError ? 'error' : undefined}\n />\n ))}\n </FieldBlock>\n )\n }\n}\n\nArraySelection._supportsSpacingProps = true\nexport default ArraySelection\n"],"mappings":"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"}
@@ -1,11 +1,21 @@
1
- .dnb-forms-field-array-selection--options-layout-vertical .dnb-forms-field-array-selection__options {
1
+ /*
2
+ * Utilities
3
+ */
4
+ .dnb-forms-field-array-selection--layout-vertical .dnb-forms-field-array-selection__options {
2
5
  display: flex;
3
6
  flex-flow: column;
4
7
  row-gap: var(--spacing-x-small);
5
8
  }
6
- .dnb-forms-field-array-selection--options-layout-horizontal .dnb-forms-field-array-selection__options {
9
+ .dnb-forms-field-array-selection--layout-horizontal .dnb-forms-field-array-selection__options {
7
10
  display: flex;
8
11
  flex-flow: row wrap;
9
12
  -moz-column-gap: var(--spacing-small);
10
13
  column-gap: var(--spacing-small);
14
+ row-gap: var(--spacing-x-small);
15
+ }
16
+ @media screen and (min-width: 40em) {
17
+ .dnb-forms-field-array-selection .dnb-forms-field-block--layout-horizontal .dnb-form-label {
18
+ line-height: 2.5rem;
19
+ margin-bottom: 0;
20
+ }
11
21
  }
@@ -1 +1 @@
1
- .dnb-forms-field-array-selection--options-layout-vertical .dnb-forms-field-array-selection__options{display:flex;flex-flow:column;row-gap:var(--spacing-x-small)}.dnb-forms-field-array-selection--options-layout-horizontal .dnb-forms-field-array-selection__options{-moz-column-gap:var(--spacing-small);column-gap:var(--spacing-small);display:flex;flex-flow:row wrap}
1
+ .dnb-forms-field-array-selection--layout-vertical .dnb-forms-field-array-selection__options{display:flex;flex-flow:column;row-gap:var(--spacing-x-small)}.dnb-forms-field-array-selection--layout-horizontal .dnb-forms-field-array-selection__options{-moz-column-gap:var(--spacing-small);column-gap:var(--spacing-small);display:flex;flex-flow:row wrap;row-gap:var(--spacing-x-small)}@media screen and (min-width:40em){.dnb-forms-field-array-selection .dnb-forms-field-block--layout-horizontal .dnb-form-label{line-height:2.5rem;margin-bottom:0}}
@@ -1,13 +1,23 @@
1
+ @import '../../../../../style/core/utilities.scss';
2
+
1
3
  .dnb-forms-field-array-selection {
2
- &--options-layout-vertical &__options {
4
+ &--layout-vertical &__options {
3
5
  display: flex;
4
6
  flex-flow: column;
5
7
  row-gap: var(--spacing-x-small);
6
8
  }
7
9
 
8
- &--options-layout-horizontal &__options {
10
+ &--layout-horizontal &__options {
9
11
  display: flex;
10
12
  flex-flow: row wrap;
11
13
  column-gap: var(--spacing-small);
14
+ row-gap: var(--spacing-x-small); // for when wrapped
15
+ }
16
+
17
+ @include allAbove(small) {
18
+ .dnb-forms-field-block--layout-horizontal .dnb-form-label {
19
+ line-height: 2.5rem;
20
+ margin-bottom: 0;
21
+ }
12
22
  }
13
23
  }
@@ -51,8 +51,6 @@ function DateComponent(props) {
51
51
  id,
52
52
  className,
53
53
  label,
54
- labelDescription,
55
- labelSecondary,
56
54
  value,
57
55
  help,
58
56
  info,
@@ -68,8 +66,6 @@ function DateComponent(props) {
68
66
  className: classnames('dnb-forms-field-string', className),
69
67
  forId: id,
70
68
  label: label !== null && label !== void 0 ? label : sharedContext === null || sharedContext === void 0 ? void 0 : sharedContext.translation.Forms.dateLabel,
71
- labelDescription: labelDescription,
72
- labelSecondary: labelSecondary,
73
69
  info: info,
74
70
  warning: warning,
75
71
  disabled: disabled,
@@ -81,7 +77,7 @@ function DateComponent(props) {
81
77
  show_input: true,
82
78
  show_cancel_button: true,
83
79
  show_reset_button: true,
84
- status: error || hasError ? 'error' : undefined,
80
+ status: hasError ? 'error' : undefined,
85
81
  suffix: help ? React.createElement(HelpButton, {
86
82
  title: help.title
87
83
  }, help.contents) : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"Date.js","names":["React","useCallback","useContext","useMemo","DatePicker","HelpButton","useDataValue","pickSpacingProps","SharedContext","classnames","FieldBlock","parseISO","isValid","DateComponent","props","sharedContext","tr","translation","Forms","errorMessages","_objectSpread","required","dateErrorRequired","pattern","inputErrorPattern","schema","_props$schema","type","validateRequired","value","_ref","error","undefined","preparedProps","fromInput","_ref2","date","id","className","label","labelDescription","labelSecondary","help","info","warning","hasError","disabled","handleFocus","handleBlur","handleChange","createElement","_extends","forId","dateLabel","show_input","show_cancel_button","show_reset_button","status","suffix","title","contents","on_change","on_reset","onFocus","onBlur","_supportsSpacingProps"],"sources":["../../../../../../src/extensions/forms/Field/Date/Date.tsx"],"sourcesContent":["import React, { useCallback, useContext, useMemo } from 'react'\nimport { DatePicker, HelpButton } from '../../../../components'\nimport { useDataValue } from '../../hooks'\nimport { FieldProps, FieldHelpProps } from '../../types'\nimport { pickSpacingProps } from '../../../../components/flex/utils'\nimport SharedContext from '../../../../shared/Context'\nimport { JSONSchema7 } from 'json-schema'\nimport classnames from 'classnames'\nimport FieldBlock from '../../FieldBlock'\nimport { parseISO, isValid } from 'date-fns'\n\nexport type Props = FieldHelpProps &\n FieldProps<string> & {\n // Validation\n pattern?: string\n }\n\nfunction DateComponent(props: Props) {\n const sharedContext = useContext(SharedContext)\n const tr = sharedContext?.translation.Forms\n\n const errorMessages = useMemo(\n () => ({\n required: tr.dateErrorRequired,\n pattern: tr.inputErrorPattern,\n ...props.errorMessages,\n }),\n [tr, props.errorMessages]\n )\n\n const schema = useMemo<JSONSchema7>(\n () =>\n props.schema ?? {\n type: 'string',\n pattern: props.pattern,\n },\n [props.schema, props.pattern]\n )\n\n const validateRequired = useCallback(\n (value: string, { required, error }) => {\n if (required && (!value || !isValid(parseISO(value)))) {\n return error\n }\n\n return undefined\n },\n []\n )\n\n const preparedProps: Props = {\n ...props,\n errorMessages,\n schema,\n fromInput: ({ date }: { date: string }) => {\n return date\n },\n validateRequired,\n }\n\n const {\n id,\n className,\n label,\n labelDescription,\n labelSecondary,\n value,\n help,\n info,\n warning,\n error,\n hasError,\n disabled,\n handleFocus,\n handleBlur,\n handleChange,\n } = useDataValue(preparedProps)\n\n return (\n <FieldBlock\n className={classnames('dnb-forms-field-string', className)}\n forId={id}\n label={label ?? sharedContext?.translation.Forms.dateLabel}\n labelDescription={labelDescription}\n labelSecondary={labelSecondary}\n info={info}\n warning={warning}\n disabled={disabled}\n error={error}\n {...pickSpacingProps(props)}\n >\n <DatePicker\n id={id}\n date={value}\n disabled={disabled}\n show_input={true}\n show_cancel_button={true}\n show_reset_button={true}\n status={error || hasError ? 'error' : undefined}\n suffix={\n help ? (\n <HelpButton title={help.title}>{help.contents}</HelpButton>\n ) : undefined\n }\n on_change={handleChange}\n on_reset={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...pickSpacingProps(props)}\n />\n </FieldBlock>\n )\n}\n\nDateComponent._supportsSpacingProps = true\nexport default DateComponent\n"],"mappings":"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"}
1
+ {"version":3,"file":"Date.js","names":["React","useCallback","useContext","useMemo","DatePicker","HelpButton","useDataValue","pickSpacingProps","SharedContext","classnames","FieldBlock","parseISO","isValid","DateComponent","props","sharedContext","tr","translation","Forms","errorMessages","_objectSpread","required","dateErrorRequired","pattern","inputErrorPattern","schema","_props$schema","type","validateRequired","value","_ref","error","undefined","preparedProps","fromInput","_ref2","date","id","className","label","help","info","warning","hasError","disabled","handleFocus","handleBlur","handleChange","createElement","_extends","forId","dateLabel","show_input","show_cancel_button","show_reset_button","status","suffix","title","contents","on_change","on_reset","onFocus","onBlur","_supportsSpacingProps"],"sources":["../../../../../../src/extensions/forms/Field/Date/Date.tsx"],"sourcesContent":["import React, { useCallback, useContext, useMemo } from 'react'\nimport { DatePicker, HelpButton } from '../../../../components'\nimport { useDataValue } from '../../hooks'\nimport { FieldProps, FieldHelpProps, JSONSchema } from '../../types'\nimport { pickSpacingProps } from '../../../../components/flex/utils'\nimport SharedContext from '../../../../shared/Context'\nimport classnames from 'classnames'\nimport FieldBlock from '../../FieldBlock'\nimport { parseISO, isValid } from 'date-fns'\n\nexport type Props = FieldHelpProps &\n FieldProps<string> & {\n // Validation\n pattern?: string\n }\n\nfunction DateComponent(props: Props) {\n const sharedContext = useContext(SharedContext)\n const tr = sharedContext?.translation.Forms\n\n const errorMessages = useMemo(\n () => ({\n required: tr.dateErrorRequired,\n pattern: tr.inputErrorPattern,\n ...props.errorMessages,\n }),\n [tr, props.errorMessages]\n )\n\n const schema = useMemo<JSONSchema>(\n () =>\n props.schema ?? {\n type: 'string',\n pattern: props.pattern,\n },\n [props.schema, props.pattern]\n )\n\n const validateRequired = useCallback(\n (value: string, { required, error }) => {\n if (required && (!value || !isValid(parseISO(value)))) {\n return error\n }\n\n return undefined\n },\n []\n )\n\n const preparedProps: Props = {\n ...props,\n errorMessages,\n schema,\n fromInput: ({ date }: { date: string }) => {\n return date\n },\n validateRequired,\n }\n\n const {\n id,\n className,\n label,\n value,\n help,\n info,\n warning,\n error,\n hasError,\n disabled,\n handleFocus,\n handleBlur,\n handleChange,\n } = useDataValue(preparedProps)\n\n return (\n <FieldBlock\n className={classnames('dnb-forms-field-string', className)}\n forId={id}\n label={label ?? sharedContext?.translation.Forms.dateLabel}\n info={info}\n warning={warning}\n disabled={disabled}\n error={error}\n {...pickSpacingProps(props)}\n >\n <DatePicker\n id={id}\n date={value}\n disabled={disabled}\n show_input={true}\n show_cancel_button={true}\n show_reset_button={true}\n status={hasError ? 'error' : undefined}\n suffix={\n help ? (\n <HelpButton title={help.title}>{help.contents}</HelpButton>\n ) : undefined\n }\n on_change={handleChange}\n on_reset={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...pickSpacingProps(props)}\n />\n </FieldBlock>\n )\n}\n\nDateComponent._supportsSpacingProps = true\nexport default DateComponent\n"],"mappings":";;;;;;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAC/D,SAASC,UAAU,EAAEC,UAAU,QAAQ,wBAAwB;AAC/D,SAASC,YAAY,QAAQ,aAAa;AAE1C,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,OAAOC,aAAa,MAAM,4BAA4B;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,UAAU,MAAM,kBAAkB;AACzC,SAASC,QAAQ,EAAEC,OAAO,QAAQ,UAAU;AAQ5C,SAASC,aAAaA,CAACC,KAAY,EAAE;EACnC,MAAMC,aAAa,GAAGb,UAAU,CAACM,aAAa,CAAC;EAC/C,MAAMQ,EAAE,GAAGD,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEE,WAAW,CAACC,KAAK;EAE3C,MAAMC,aAAa,GAAGhB,OAAO,CAC3B,MAAAiB,aAAA;IACEC,QAAQ,EAAEL,EAAE,CAACM,iBAAiB;IAC9BC,OAAO,EAAEP,EAAE,CAACQ;EAAiB,GAC1BV,KAAK,CAACK,aAAa,CACtB,EACF,CAACH,EAAE,EAAEF,KAAK,CAACK,aAAa,CAC1B,CAAC;EAED,MAAMM,MAAM,GAAGtB,OAAO,CACpB;IAAA,IAAAuB,aAAA;IAAA,QAAAA,aAAA,GACEZ,KAAK,CAACW,MAAM,cAAAC,aAAA,cAAAA,aAAA,GAAI;MACdC,IAAI,EAAE,QAAQ;MACdJ,OAAO,EAAET,KAAK,CAACS;IACjB,CAAC;EAAA,GACH,CAACT,KAAK,CAACW,MAAM,EAAEX,KAAK,CAACS,OAAO,CAC9B,CAAC;EAED,MAAMK,gBAAgB,GAAG3B,WAAW,CAClC,CAAC4B,KAAa,EAAAC,IAAA,KAA0B;IAAA,IAAxB;MAAET,QAAQ;MAAEU;IAAM,CAAC,GAAAD,IAAA;IACjC,IAAIT,QAAQ,KAAK,CAACQ,KAAK,IAAI,CAACjB,OAAO,CAACD,QAAQ,CAACkB,KAAK,CAAC,CAAC,CAAC,EAAE;MACrD,OAAOE,KAAK;IACd;IAEA,OAAOC,SAAS;EAClB,CAAC,EACD,EACF,CAAC;EAED,MAAMC,aAAoB,GAAAb,aAAA,CAAAA,aAAA,KACrBN,KAAK;IACRK,aAAa;IACbM,MAAM;IACNS,SAAS,EAAEC,KAAA,IAAgC;MAAA,IAA/B;QAAEC;MAAuB,CAAC,GAAAD,KAAA;MACpC,OAAOC,IAAI;IACb,CAAC;IACDR;EAAgB,EACjB;EAED,MAAM;IACJS,EAAE;IACFC,SAAS;IACTC,KAAK;IACLV,KAAK;IACLW,IAAI;IACJC,IAAI;IACJC,OAAO;IACPX,KAAK;IACLY,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,UAAU;IACVC;EACF,CAAC,GAAGzC,YAAY,CAAC2B,aAAa,CAAC;EAE/B,OACEjC,KAAA,CAAAgD,aAAA,CAACtC,UAAU,EAAAuC,QAAA;IACTX,SAAS,EAAE7B,UAAU,CAAC,wBAAwB,EAAE6B,SAAS,CAAE;IAC3DY,KAAK,EAAEb,EAAG;IACVE,KAAK,EAAEA,KAAK,aAALA,KAAK,cAALA,KAAK,GAAIxB,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEE,WAAW,CAACC,KAAK,CAACiC,SAAU;IAC3DV,IAAI,EAAEA,IAAK;IACXC,OAAO,EAAEA,OAAQ;IACjBE,QAAQ,EAAEA,QAAS;IACnBb,KAAK,EAAEA;EAAM,GACTxB,gBAAgB,CAACO,KAAK,CAAC,GAE3Bd,KAAA,CAAAgD,aAAA,CAAC5C,UAAU,EAAA6C,QAAA;IACTZ,EAAE,EAAEA,EAAG;IACPD,IAAI,EAAEP,KAAM;IACZe,QAAQ,EAAEA,QAAS;IACnBQ,UAAU,EAAE,IAAK;IACjBC,kBAAkB,EAAE,IAAK;IACzBC,iBAAiB,EAAE,IAAK;IACxBC,MAAM,EAAEZ,QAAQ,GAAG,OAAO,GAAGX,SAAU;IACvCwB,MAAM,EACJhB,IAAI,GACFxC,KAAA,CAAAgD,aAAA,CAAC3C,UAAU;MAACoD,KAAK,EAAEjB,IAAI,CAACiB;IAAM,GAAEjB,IAAI,CAACkB,QAAqB,CAAC,GACzD1B,SACL;IACD2B,SAAS,EAAEZ,YAAa;IACxBa,QAAQ,EAAEb,YAAa;IACvBc,OAAO,EAAEhB,WAAY;IACrBiB,MAAM,EAAEhB;EAAW,GACfvC,gBAAgB,CAACO,KAAK,CAAC,CAC5B,CACS,CAAC;AAEjB;AAEAD,aAAa,CAACkD,qBAAqB,GAAG,IAAI;AAC1C,eAAelD,aAAa"}
@@ -1,5 +1,5 @@
1
1
  import { FieldHelpProps, FieldProps } from '../../types';
2
- export type ExpiryProps = FieldProps<string> & FieldHelpProps;
2
+ export type ExpiryProps = FieldHelpProps & FieldProps<string>;
3
3
  declare function Expiry(props: ExpiryProps): import("react/jsx-runtime").JSX.Element;
4
4
  declare namespace Expiry {
5
5
  var _supportsEufemiaSpacingProps: boolean;
@@ -4,7 +4,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
5
5
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
6
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7
- import React, { useContext, useRef } from 'react';
7
+ import React, { useCallback, useContext, useMemo, useRef } from 'react';
8
8
  import { makeUniqueId } from '../../../../shared/component-helper';
9
9
  import SharedContext from '../../../../shared/Context';
10
10
  import { pickSpacingProps } from '../../../../components/flex/utils';
@@ -16,27 +16,39 @@ import { HelpButton } from '../../../../components';
16
16
  function Expiry(props) {
17
17
  var _value$substring;
18
18
  const sharedContext = useContext(SharedContext);
19
+ const translations = sharedContext === null || sharedContext === void 0 ? void 0 : sharedContext.translation.Forms;
19
20
  const placeholders = sharedContext === null || sharedContext === void 0 ? void 0 : sharedContext.translation.DatePicker.placeholder_characters;
21
+ const errorMessages = useMemo(() => _objectSpread({
22
+ required: translations.dateErrorRequired
23
+ }, props.errorMessages), [translations, props.errorMessages]);
24
+ const validateRequired = useCallback((value, _ref) => {
25
+ let {
26
+ required,
27
+ error
28
+ } = _ref;
29
+ return required && !value ? error : undefined;
30
+ }, []);
31
+ const preparedProps = _objectSpread(_objectSpread({}, props), {}, {
32
+ errorMessages,
33
+ fromInput: toExpiryString,
34
+ validateRequired
35
+ });
20
36
  const {
21
37
  id: propsId,
22
38
  className,
23
- label = sharedContext === null || sharedContext === void 0 ? void 0 : sharedContext.translation.Forms.expiryLabel,
39
+ label = translations.expiryLabel,
24
40
  error,
25
41
  info,
26
42
  warning,
27
43
  help,
28
44
  disabled,
29
45
  value = '',
30
- labelDescription,
31
- labelSecondary,
32
46
  layout = 'vertical',
33
47
  required,
34
48
  handleFocus,
35
49
  handleBlur,
36
50
  handleChange
37
- } = useDataValue(_objectSpread(_objectSpread({}, props), {}, {
38
- emptyValue: ''
39
- }));
51
+ } = useDataValue(_objectSpread({}, preparedProps));
40
52
  const expiry = {
41
53
  month: ensureValidMonth(value === null || value === void 0 ? void 0 : value.substring(0, 2)),
42
54
  year: (_value$substring = value === null || value === void 0 ? void 0 : value.substring(2, 4)) !== null && _value$substring !== void 0 ? _value$substring : ''
@@ -45,8 +57,6 @@ function Expiry(props) {
45
57
  const status = error ? 'error' : warning ? 'warn' : info ? 'info' : null;
46
58
  return React.createElement(FieldBlock, _extends({
47
59
  className: classnames('dnb-forms-field-expiry', className),
48
- labelSecondary: labelSecondary,
49
- labelDescription: labelDescription,
50
60
  info: info,
51
61
  warning: warning,
52
62
  error: error
@@ -60,7 +70,7 @@ function Expiry(props) {
60
70
  statusState: disabled ? 'disabled' : undefined,
61
71
  disabled: disabled,
62
72
  required: required,
63
- onChange: expiry => handleChange(expiryToString(expiry)),
73
+ onChange: handleChange,
64
74
  onBlur: handleBlur,
65
75
  onFocus: handleFocus,
66
76
  delimiter: "/",
@@ -82,7 +92,7 @@ function Expiry(props) {
82
92
  title: help.title
83
93
  }, help.contents) : undefined
84
94
  }));
85
- function expiryToString(values) {
95
+ function toExpiryString(values) {
86
96
  return Object.values(values).join('');
87
97
  }
88
98
  function ensureValidMonth(month) {
@@ -1 +1 @@
1
- {"version":3,"file":"Expiry.js","names":["React","useContext","useRef","makeUniqueId","SharedContext","pickSpacingProps","useDataValue","classnames","FieldBlock","MultiInputMask","HelpButton","Expiry","props","_value$substring","sharedContext","placeholders","translation","DatePicker","placeholder_characters","id","propsId","className","label","Forms","expiryLabel","error","info","warning","help","disabled","value","labelDescription","labelSecondary","layout","required","handleFocus","handleBlur","handleChange","_objectSpread","emptyValue","expiry","month","ensureValidMonth","substring","year","idRef","current","status","createElement","_extends","stretch","labelDirection","values","statusState","undefined","onChange","expiryToString","onBlur","onFocus","delimiter","inputMode","inputs","mask","getMonthMask","placeholderCharacter","autoComplete","suffix","title","contents","Object","join","firstMask","secondMask","firstDigit","charAt","isFirstDigitValid","test","seconDigit","isSecondDigitValid","_supportsEufemiaSpacingProps"],"sources":["../../../../../../src/extensions/forms/Field/Expiry/Expiry.tsx"],"sourcesContent":["import React, { useContext, useRef } from 'react'\nimport { makeUniqueId } from '../../../../shared/component-helper'\nimport SharedContext from '../../../../shared/Context'\nimport { FieldHelpProps, FieldProps } from '../../types'\nimport { pickSpacingProps } from '../../../../components/flex/utils'\nimport { useDataValue } from '../../hooks'\nimport classnames from 'classnames'\nimport FieldBlock from '../../FieldBlock'\nimport { MultiInputMask } from '../../../../components/input-masked'\nimport type { MultiInputMaskValue } from '../../../../components/input-masked'\nimport { HelpButton } from '../../../../components'\n\ntype ExpiryValue = MultiInputMaskValue<'month' | 'year'>\n\nexport type ExpiryProps = FieldProps<string> & FieldHelpProps\n\nfunction Expiry(props: ExpiryProps) {\n const sharedContext = useContext(SharedContext)\n const placeholders =\n sharedContext?.translation.DatePicker.placeholder_characters\n\n const {\n id: propsId,\n className,\n label = sharedContext?.translation.Forms.expiryLabel,\n error,\n info,\n warning,\n help,\n disabled,\n value = '',\n labelDescription,\n labelSecondary,\n layout = 'vertical',\n required,\n handleFocus,\n handleBlur,\n handleChange,\n } = useDataValue({\n ...props,\n emptyValue: '',\n })\n\n const expiry: ExpiryValue = {\n month: ensureValidMonth(value?.substring(0, 2)),\n year: value?.substring(2, 4) ?? '',\n }\n\n const idRef = useRef(propsId || makeUniqueId()).current\n\n const status = error ? 'error' : warning ? 'warn' : info ? 'info' : null\n\n return (\n <FieldBlock\n className={classnames('dnb-forms-field-expiry', className)}\n labelSecondary={labelSecondary}\n labelDescription={labelDescription}\n info={info}\n warning={warning}\n error={error}\n {...pickSpacingProps(props)}\n >\n <MultiInputMask\n stretch\n id={`${idRef}__input`}\n label={label}\n labelDirection={layout}\n values={expiry}\n status={status}\n statusState={disabled ? 'disabled' : undefined}\n disabled={disabled}\n required={required}\n onChange={(expiry) => handleChange(expiryToString(expiry))}\n onBlur={handleBlur}\n onFocus={handleFocus}\n delimiter=\"/\"\n inputMode=\"numeric\"\n inputs={[\n {\n id: 'month',\n label: sharedContext?.translation.DatePicker['month'],\n mask: getMonthMask(expiry?.month),\n placeholderCharacter: placeholders['month'],\n autoComplete: 'cc-exp-month',\n },\n {\n id: 'year',\n label: sharedContext?.translation.DatePicker['year'],\n mask: [/[0-9]/, /[0-9]/],\n placeholderCharacter: placeholders['year'],\n autoComplete: 'cc-exp-year',\n },\n ]}\n suffix={\n help ? (\n <HelpButton title={help.title}>{help.contents}</HelpButton>\n ) : undefined\n }\n />\n </FieldBlock>\n )\n\n function expiryToString(values: ExpiryValue) {\n return Object.values(values).join('')\n }\n\n function ensureValidMonth(month: string) {\n // Return empty value if no month is given\n if (!month) {\n return ''\n }\n\n const [firstMask, secondMask] = getMonthMask(month)\n\n const firstDigit = month?.charAt(0)\n const isFirstDigitValid = firstMask.test(firstDigit)\n\n if (firstDigit && !isFirstDigitValid) {\n // Return empty value if the first digit is invalid\n return ''\n }\n\n const seconDigit = month?.charAt(1)\n const isSecondDigitValid = secondMask.test(seconDigit)\n\n if (seconDigit && !isSecondDigitValid) {\n // Return empty value if the second digit is invalid\n return ''\n }\n\n // Return given month of month value is valid\n return month\n }\n\n function getMonthMask(month: string) {\n const firstDigit = month?.charAt(0)\n\n return [\n /[0-1]/,\n firstDigit === '0' || firstDigit === '' ? /[1-9]/ : /[0-2]/,\n ]\n }\n}\n\nExpiry._supportsEufemiaSpacingProps = true\nexport default Expiry\n"],"mappings":"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"}
1
+ {"version":3,"file":"Expiry.js","names":["React","useCallback","useContext","useMemo","useRef","makeUniqueId","SharedContext","pickSpacingProps","useDataValue","classnames","FieldBlock","MultiInputMask","HelpButton","Expiry","props","_value$substring","sharedContext","translations","translation","Forms","placeholders","DatePicker","placeholder_characters","errorMessages","_objectSpread","required","dateErrorRequired","validateRequired","value","_ref","error","undefined","preparedProps","fromInput","toExpiryString","id","propsId","className","label","expiryLabel","info","warning","help","disabled","layout","handleFocus","handleBlur","handleChange","expiry","month","ensureValidMonth","substring","year","idRef","current","status","createElement","_extends","stretch","labelDirection","values","statusState","onChange","onBlur","onFocus","delimiter","inputMode","inputs","mask","getMonthMask","placeholderCharacter","autoComplete","suffix","title","contents","Object","join","firstMask","secondMask","firstDigit","charAt","isFirstDigitValid","test","seconDigit","isSecondDigitValid","_supportsEufemiaSpacingProps"],"sources":["../../../../../../src/extensions/forms/Field/Expiry/Expiry.tsx"],"sourcesContent":["import React, { useCallback, useContext, useMemo, useRef } from 'react'\nimport { makeUniqueId } from '../../../../shared/component-helper'\nimport SharedContext from '../../../../shared/Context'\nimport { FieldHelpProps, FieldProps } from '../../types'\nimport { pickSpacingProps } from '../../../../components/flex/utils'\nimport { useDataValue } from '../../hooks'\nimport classnames from 'classnames'\nimport FieldBlock from '../../FieldBlock'\nimport { MultiInputMask } from '../../../../components/input-masked'\nimport type { MultiInputMaskValue } from '../../../../components/input-masked'\nimport { HelpButton } from '../../../../components'\n\ntype ExpiryValue = MultiInputMaskValue<'month' | 'year'>\n\nexport type ExpiryProps = FieldHelpProps & FieldProps<string>\n\nfunction Expiry(props: ExpiryProps) {\n const sharedContext = useContext(SharedContext)\n const translations = sharedContext?.translation.Forms\n const placeholders =\n sharedContext?.translation.DatePicker.placeholder_characters\n\n const errorMessages = useMemo(\n () => ({\n required: translations.dateErrorRequired,\n ...props.errorMessages,\n }),\n [translations, props.errorMessages]\n )\n\n const validateRequired = useCallback(\n (value: string, { required, error }) => {\n return required && !value ? error : undefined\n },\n []\n )\n\n const preparedProps: ExpiryProps = {\n ...props,\n errorMessages,\n fromInput: toExpiryString,\n validateRequired,\n }\n\n const {\n id: propsId,\n className,\n label = translations.expiryLabel,\n error,\n info,\n warning,\n help,\n disabled,\n value = '',\n layout = 'vertical',\n required,\n handleFocus,\n handleBlur,\n handleChange,\n } = useDataValue({\n ...preparedProps,\n })\n\n const expiry: ExpiryValue = {\n month: ensureValidMonth(value?.substring(0, 2)),\n year: value?.substring(2, 4) ?? '',\n }\n\n const idRef = useRef(propsId || makeUniqueId()).current\n\n const status = error ? 'error' : warning ? 'warn' : info ? 'info' : null\n\n return (\n <FieldBlock\n className={classnames('dnb-forms-field-expiry', className)}\n info={info}\n warning={warning}\n error={error}\n {...pickSpacingProps(props)}\n >\n <MultiInputMask\n stretch\n id={`${idRef}__input`}\n label={label}\n labelDirection={layout}\n values={expiry}\n status={status}\n statusState={disabled ? 'disabled' : undefined}\n disabled={disabled}\n required={required}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n delimiter=\"/\"\n inputMode=\"numeric\"\n inputs={[\n {\n id: 'month',\n label: sharedContext?.translation.DatePicker['month'],\n mask: getMonthMask(expiry?.month),\n placeholderCharacter: placeholders['month'],\n autoComplete: 'cc-exp-month',\n },\n {\n id: 'year',\n label: sharedContext?.translation.DatePicker['year'],\n mask: [/[0-9]/, /[0-9]/],\n placeholderCharacter: placeholders['year'],\n autoComplete: 'cc-exp-year',\n },\n ]}\n suffix={\n help ? (\n <HelpButton title={help.title}>{help.contents}</HelpButton>\n ) : undefined\n }\n />\n </FieldBlock>\n )\n\n function toExpiryString(values: ExpiryValue) {\n return Object.values(values).join('')\n }\n\n function ensureValidMonth(month: string) {\n // Return empty value if no month is given\n if (!month) {\n return ''\n }\n\n const [firstMask, secondMask] = getMonthMask(month)\n\n const firstDigit = month?.charAt(0)\n const isFirstDigitValid = firstMask.test(firstDigit)\n\n if (firstDigit && !isFirstDigitValid) {\n // Return empty value if the first digit is invalid\n return ''\n }\n\n const seconDigit = month?.charAt(1)\n const isSecondDigitValid = secondMask.test(seconDigit)\n\n if (seconDigit && !isSecondDigitValid) {\n // Return empty value if the second digit is invalid\n return ''\n }\n\n // Return given month of month value is valid\n return month\n }\n\n function getMonthMask(month: string) {\n const firstDigit = month?.charAt(0)\n\n return [\n /[0-1]/,\n firstDigit === '0' || firstDigit === '' ? /[1-9]/ : /[0-2]/,\n ]\n }\n}\n\nExpiry._supportsEufemiaSpacingProps = true\nexport default Expiry\n"],"mappings":"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"}
@@ -99,7 +99,6 @@ function NumberComponent(props) {
99
99
  toInput,
100
100
  fromInput,
101
101
  transformValue,
102
- size: props.size !== 'small' && props.size !== 'large' ? 'medium' : props.size,
103
102
  width: (_props$width = props.width) !== null && _props$width !== void 0 ? _props$width : 'medium'
104
103
  });
105
104
  const {
@@ -111,8 +110,6 @@ function NumberComponent(props) {
111
110
  layout,
112
111
  placeholder,
113
112
  label,
114
- labelDescription,
115
- labelSecondary,
116
113
  value,
117
114
  minimum = Number.MIN_SAFE_INTEGER,
118
115
  maximum = Number.MAX_SAFE_INTEGER,
@@ -159,8 +156,6 @@ function NumberComponent(props) {
159
156
  forId: id,
160
157
  layout,
161
158
  label,
162
- labelDescription,
163
- labelSecondary,
164
159
  info,
165
160
  warning,
166
161
  error,