@atlaskit/editor-core 151.1.2 → 151.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cjs/create-editor/ReactEditorView.js +22 -8
  3. package/dist/cjs/create-editor/create-plugins-list.js +30 -11
  4. package/dist/cjs/labs/next/presets/cxhtml.js +1 -2
  5. package/dist/cjs/labs/next/presets/default.js +3 -1
  6. package/dist/cjs/nodeviews/ReactNodeView.js +2 -2
  7. package/dist/cjs/nodeviews/SelectionBasedNodeView.js +6 -0
  8. package/dist/cjs/plugins/analytics/types/enums.js +1 -0
  9. package/dist/cjs/plugins/annotation/utils.js +19 -8
  10. package/dist/cjs/plugins/avatar-group/index.js +2 -1
  11. package/dist/cjs/plugins/avatar-group/ui/AvatarGroupPluginWrapper.js +5 -2
  12. package/dist/cjs/plugins/before-primaryToolbar/index.js +26 -0
  13. package/dist/cjs/plugins/before-primaryToolbar/ui/BeforePrimaryToolbarWrapper.js +28 -0
  14. package/dist/cjs/plugins/code-bidi-warning/index.js +5 -2
  15. package/dist/cjs/plugins/code-bidi-warning/pm-plugins/main.js +12 -3
  16. package/dist/cjs/plugins/code-bidi-warning/pm-plugins/plugin-factory.js +15 -5
  17. package/dist/cjs/plugins/code-block/index.js +3 -3
  18. package/dist/cjs/plugins/code-block/nodeviews/highlighting-code-block.js +6 -3
  19. package/dist/cjs/plugins/code-block/pm-plugins/main.js +11 -3
  20. package/dist/cjs/plugins/extension/extension-api.js +10 -2
  21. package/dist/cjs/plugins/extension/ui/styles.js +1 -1
  22. package/dist/cjs/plugins/feature-flags-context/feature-flags-from-props.js +4 -2
  23. package/dist/cjs/plugins/find-replace/FindReplaceToolbarButtonWithState.js +172 -0
  24. package/dist/cjs/plugins/find-replace/index.js +14 -137
  25. package/dist/cjs/plugins/find-replace/ui/Find.js +16 -9
  26. package/dist/cjs/plugins/find-replace/ui/FindReplace.js +9 -2
  27. package/dist/cjs/plugins/find-replace/ui/Replace.js +11 -3
  28. package/dist/cjs/plugins/find-replace/ui/styles.js +44 -35
  29. package/dist/cjs/plugins/floating-toolbar/ui/EmojiPickerButton.js +10 -4
  30. package/dist/cjs/plugins/floating-toolbar/ui/Toolbar.js +1 -1
  31. package/dist/cjs/plugins/fragment/index.js +34 -0
  32. package/dist/cjs/plugins/fragment/plugin-key.js +11 -0
  33. package/dist/cjs/plugins/hyperlink/ui/HyperlinkAddToolbar/HyperlinkAddToolbar.js +1 -1
  34. package/dist/cjs/plugins/index.js +16 -0
  35. package/dist/cjs/plugins/list/actions/conversions.js +39 -71
  36. package/dist/cjs/plugins/list/transforms.js +7 -1
  37. package/dist/cjs/plugins/media/index.js +2 -3
  38. package/dist/cjs/plugins/media/nodeviews/mediaGroup.js +3 -1
  39. package/dist/cjs/plugins/media/nodeviews/mediaInline.js +12 -5
  40. package/dist/cjs/plugins/media/nodeviews/mediaNodeUpdater.js +3 -3
  41. package/dist/cjs/plugins/media/nodeviews/mediaSingle.js +6 -4
  42. package/dist/cjs/plugins/media/nodeviews/styles.js +6 -1
  43. package/dist/cjs/plugins/media/pm-plugins/alt-text/ui/AltTextEdit.js +5 -1
  44. package/dist/cjs/plugins/media/pm-plugins/main.js +49 -15
  45. package/dist/cjs/plugins/media/toolbar/commands.js +59 -0
  46. package/dist/cjs/plugins/media/toolbar/filePreviewItem.js +7 -2
  47. package/dist/cjs/plugins/media/toolbar/index.js +90 -3
  48. package/dist/cjs/plugins/media/ui/ResizableMediaSingle/index.js +9 -1
  49. package/dist/cjs/plugins/media/utils/media-common.js +1 -1
  50. package/dist/cjs/plugins/media/utils/media-files.js +5 -1
  51. package/dist/cjs/plugins/panel/actions.js +2 -2
  52. package/dist/cjs/plugins/panel/index.js +3 -3
  53. package/dist/cjs/plugins/panel/nodeviews/panel.js +2 -2
  54. package/dist/cjs/plugins/panel/toolbar.js +10 -5
  55. package/dist/cjs/plugins/panel/utils.js +15 -0
  56. package/dist/cjs/plugins/rank.js +3 -2
  57. package/dist/cjs/plugins/selection/pm-plugins/selection-main.js +49 -1
  58. package/dist/cjs/plugins/status/ui/statusPicker.js +4 -2
  59. package/dist/cjs/plugins/table/commands/insert.js +1 -0
  60. package/dist/cjs/plugins/table/index.js +3 -2
  61. package/dist/cjs/plugins/table/nodeviews/OverflowShadowsObserver.js +1 -3
  62. package/dist/cjs/plugins/table/pm-plugins/main.js +26 -3
  63. package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/colgroup.js +2 -2
  64. package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/resize-state.js +2 -0
  65. package/dist/cjs/plugins/table/transforms/column-width.js +14 -5
  66. package/dist/cjs/plugins/table/transforms/fix-tables.js +43 -6
  67. package/dist/cjs/plugins/table/ui/FloatingContextualButton/index.js +3 -2
  68. package/dist/cjs/plugins/table/ui/FloatingContextualMenu/ContextualMenu.js +1 -0
  69. package/dist/cjs/plugins/table/ui/common-styles.css.js +1 -1
  70. package/dist/cjs/plugins/table/ui/consts.js +1 -1
  71. package/dist/cjs/plugins/table/ui/messages.js +1 -1
  72. package/dist/cjs/plugins/tasks-and-decisions/nodeviews/decisionItem.js +1 -1
  73. package/dist/cjs/plugins/tasks-and-decisions/nodeviews/taskItem.js +1 -1
  74. package/dist/cjs/plugins/tasks-and-decisions/pm-plugins/main.js +2 -2
  75. package/dist/cjs/plugins/text-color/ui/ToolbarTextColor/index.js +2 -1
  76. package/dist/cjs/plugins/text-formatting/index.js +2 -1
  77. package/dist/cjs/plugins/type-ahead/ui/TypeAheadList.js +1 -0
  78. package/dist/cjs/ui/Appearance/FullPage/FullPageToolbar.js +77 -26
  79. package/dist/cjs/ui/Appearance/FullPage/MainToolbar.js +32 -9
  80. package/dist/cjs/ui/ColorPalette/Color/index.js +8 -18
  81. package/dist/cjs/ui/ColorPalette/index.js +7 -4
  82. package/dist/cjs/ui/ColorPickerButton/index.js +1 -1
  83. package/dist/cjs/ui/ConfigPanel/ConfigPanel.js +114 -61
  84. package/dist/cjs/ui/ConfigPanel/FormContent.js +39 -26
  85. package/dist/cjs/ui/ConfigPanel/transformers.js +490 -248
  86. package/dist/cjs/ui/ConfigPanel/utils.js +2 -10
  87. package/dist/cjs/ui/DropdownMenu/index.js +3 -1
  88. package/dist/cjs/ui/LinkSearch/LinkSearchListItem.js +1 -1
  89. package/dist/cjs/ui/Resizer/index.js +9 -1
  90. package/dist/cjs/version-wrapper.js +1 -1
  91. package/dist/cjs/version.json +1 -1
  92. package/dist/es2019/create-editor/ReactEditorView.js +19 -8
  93. package/dist/es2019/create-editor/create-plugins-list.js +31 -12
  94. package/dist/es2019/labs/next/presets/cxhtml.js +1 -2
  95. package/dist/es2019/labs/next/presets/default.js +3 -1
  96. package/dist/es2019/nodeviews/ReactNodeView.js +1 -1
  97. package/dist/es2019/nodeviews/SelectionBasedNodeView.js +11 -0
  98. package/dist/es2019/plugins/analytics/types/enums.js +1 -0
  99. package/dist/es2019/plugins/annotation/utils.js +18 -7
  100. package/dist/es2019/plugins/avatar-group/index.js +2 -1
  101. package/dist/es2019/plugins/avatar-group/ui/AvatarGroupPluginWrapper.js +3 -2
  102. package/dist/es2019/plugins/before-primaryToolbar/index.js +15 -0
  103. package/dist/es2019/plugins/before-primaryToolbar/ui/BeforePrimaryToolbarWrapper.js +12 -0
  104. package/dist/es2019/plugins/code-bidi-warning/index.js +8 -2
  105. package/dist/es2019/plugins/code-bidi-warning/pm-plugins/main.js +12 -2
  106. package/dist/es2019/plugins/code-bidi-warning/pm-plugins/plugin-factory.js +16 -5
  107. package/dist/es2019/plugins/code-block/index.js +3 -2
  108. package/dist/es2019/plugins/code-block/nodeviews/highlighting-code-block.js +6 -3
  109. package/dist/es2019/plugins/code-block/pm-plugins/main.js +11 -3
  110. package/dist/es2019/plugins/extension/extension-api.js +9 -2
  111. package/dist/es2019/plugins/extension/ui/styles.js +6 -0
  112. package/dist/es2019/plugins/feature-flags-context/feature-flags-from-props.js +4 -2
  113. package/dist/es2019/plugins/find-replace/FindReplaceToolbarButtonWithState.js +152 -0
  114. package/dist/es2019/plugins/find-replace/index.js +15 -128
  115. package/dist/es2019/plugins/find-replace/ui/Find.js +18 -10
  116. package/dist/es2019/plugins/find-replace/ui/FindReplace.js +11 -3
  117. package/dist/es2019/plugins/find-replace/ui/Replace.js +12 -4
  118. package/dist/es2019/plugins/find-replace/ui/styles.js +37 -47
  119. package/dist/es2019/plugins/floating-toolbar/ui/DropdownMenu.js +2 -1
  120. package/dist/es2019/plugins/floating-toolbar/ui/EmojiPickerButton.js +10 -2
  121. package/dist/es2019/plugins/floating-toolbar/ui/Toolbar.js +1 -1
  122. package/dist/es2019/plugins/fragment/index.js +22 -0
  123. package/dist/es2019/plugins/fragment/plugin-key.js +2 -0
  124. package/dist/es2019/plugins/hyperlink/ui/HyperlinkAddToolbar/HyperlinkAddToolbar.js +2 -2
  125. package/dist/es2019/plugins/index.js +2 -0
  126. package/dist/es2019/plugins/list/actions/conversions.js +38 -69
  127. package/dist/es2019/plugins/list/transforms.js +5 -1
  128. package/dist/es2019/plugins/media/index.js +2 -2
  129. package/dist/es2019/plugins/media/nodeviews/mediaGroup.js +2 -1
  130. package/dist/es2019/plugins/media/nodeviews/mediaInline.js +8 -4
  131. package/dist/es2019/plugins/media/nodeviews/mediaNodeUpdater.js +3 -3
  132. package/dist/es2019/plugins/media/nodeviews/mediaSingle.js +7 -5
  133. package/dist/es2019/plugins/media/nodeviews/styles.js +2 -0
  134. package/dist/es2019/plugins/media/pm-plugins/alt-text/ui/AltTextEdit.js +5 -1
  135. package/dist/es2019/plugins/media/pm-plugins/main.js +32 -17
  136. package/dist/es2019/plugins/media/toolbar/commands.js +47 -0
  137. package/dist/es2019/plugins/media/toolbar/filePreviewItem.js +6 -2
  138. package/dist/es2019/plugins/media/toolbar/index.js +90 -3
  139. package/dist/es2019/plugins/media/ui/ResizableMediaSingle/index.js +7 -1
  140. package/dist/es2019/plugins/media/utils/media-common.js +1 -1
  141. package/dist/es2019/plugins/media/utils/media-files.js +6 -1
  142. package/dist/es2019/plugins/panel/actions.js +2 -2
  143. package/dist/es2019/plugins/panel/index.js +5 -5
  144. package/dist/es2019/plugins/panel/nodeviews/panel.js +2 -2
  145. package/dist/es2019/plugins/panel/toolbar.js +10 -5
  146. package/dist/es2019/plugins/panel/utils.js +8 -1
  147. package/dist/es2019/plugins/rank.js +3 -2
  148. package/dist/es2019/plugins/selection/pm-plugins/selection-main.js +48 -1
  149. package/dist/es2019/plugins/status/ui/statusPicker.js +4 -2
  150. package/dist/es2019/plugins/table/commands/insert.js +1 -2
  151. package/dist/es2019/plugins/table/index.js +2 -1
  152. package/dist/es2019/plugins/table/nodeviews/OverflowShadowsObserver.js +1 -2
  153. package/dist/es2019/plugins/table/pm-plugins/main.js +25 -4
  154. package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/colgroup.js +2 -2
  155. package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/resize-state.js +2 -0
  156. package/dist/es2019/plugins/table/transforms/column-width.js +13 -3
  157. package/dist/es2019/plugins/table/transforms/fix-tables.js +43 -5
  158. package/dist/es2019/plugins/table/ui/FloatingContextualButton/index.js +3 -2
  159. package/dist/es2019/plugins/table/ui/FloatingContextualMenu/ContextualMenu.js +1 -0
  160. package/dist/es2019/plugins/table/ui/common-styles.css.js +5 -1
  161. package/dist/es2019/plugins/table/ui/consts.js +2 -2
  162. package/dist/es2019/plugins/table/ui/messages.js +1 -1
  163. package/dist/es2019/plugins/tasks-and-decisions/nodeviews/decisionItem.js +1 -1
  164. package/dist/es2019/plugins/tasks-and-decisions/nodeviews/taskItem.js +1 -1
  165. package/dist/es2019/plugins/tasks-and-decisions/pm-plugins/main.js +3 -3
  166. package/dist/es2019/plugins/text-color/ui/ToolbarTextColor/index.js +2 -1
  167. package/dist/es2019/plugins/text-formatting/index.js +3 -2
  168. package/dist/es2019/plugins/type-ahead/ui/TypeAheadList.js +2 -1
  169. package/dist/es2019/plugins/type-ahead/ui/TypeAheadListItem.js +2 -1
  170. package/dist/es2019/ui/Appearance/FullPage/FullPageToolbar.js +60 -27
  171. package/dist/es2019/ui/Appearance/FullPage/MainToolbar.js +51 -7
  172. package/dist/es2019/ui/ColorPalette/Color/index.js +9 -18
  173. package/dist/es2019/ui/ColorPalette/index.js +7 -4
  174. package/dist/es2019/ui/ColorPickerButton/index.js +1 -1
  175. package/dist/es2019/ui/ConfigPanel/ConfigPanel.js +101 -49
  176. package/dist/es2019/ui/ConfigPanel/FormContent.js +35 -26
  177. package/dist/es2019/ui/ConfigPanel/transformers.js +243 -72
  178. package/dist/es2019/ui/ConfigPanel/utils.js +1 -2
  179. package/dist/es2019/ui/Dropdown/index.js +2 -1
  180. package/dist/es2019/ui/DropdownMenu/index.js +7 -3
  181. package/dist/es2019/ui/ElementBrowser/InsertMenu.js +1 -0
  182. package/dist/es2019/ui/ElementBrowser/components/ElementList/ElementList.js +1 -0
  183. package/dist/es2019/ui/LinkSearch/LinkSearchListItem.js +2 -2
  184. package/dist/es2019/ui/Resizer/index.js +9 -1
  185. package/dist/es2019/version-wrapper.js +1 -1
  186. package/dist/es2019/version.json +1 -1
  187. package/dist/esm/create-editor/ReactEditorView.js +22 -8
  188. package/dist/esm/create-editor/create-plugins-list.js +31 -12
  189. package/dist/esm/labs/next/presets/cxhtml.js +1 -2
  190. package/dist/esm/labs/next/presets/default.js +3 -1
  191. package/dist/esm/nodeviews/ReactNodeView.js +2 -2
  192. package/dist/esm/nodeviews/SelectionBasedNodeView.js +7 -0
  193. package/dist/esm/plugins/analytics/types/enums.js +1 -0
  194. package/dist/esm/plugins/annotation/utils.js +18 -7
  195. package/dist/esm/plugins/avatar-group/index.js +2 -1
  196. package/dist/esm/plugins/avatar-group/ui/AvatarGroupPluginWrapper.js +5 -2
  197. package/dist/esm/plugins/before-primaryToolbar/index.js +15 -0
  198. package/dist/esm/plugins/before-primaryToolbar/ui/BeforePrimaryToolbarWrapper.js +12 -0
  199. package/dist/esm/plugins/code-bidi-warning/index.js +5 -2
  200. package/dist/esm/plugins/code-bidi-warning/pm-plugins/main.js +12 -3
  201. package/dist/esm/plugins/code-bidi-warning/pm-plugins/plugin-factory.js +15 -5
  202. package/dist/esm/plugins/code-block/index.js +3 -3
  203. package/dist/esm/plugins/code-block/nodeviews/highlighting-code-block.js +6 -3
  204. package/dist/esm/plugins/code-block/pm-plugins/main.js +11 -3
  205. package/dist/esm/plugins/extension/extension-api.js +9 -2
  206. package/dist/esm/plugins/extension/ui/styles.js +1 -1
  207. package/dist/esm/plugins/feature-flags-context/feature-flags-from-props.js +4 -2
  208. package/dist/esm/plugins/find-replace/FindReplaceToolbarButtonWithState.js +155 -0
  209. package/dist/esm/plugins/find-replace/index.js +14 -131
  210. package/dist/esm/plugins/find-replace/ui/Find.js +17 -10
  211. package/dist/esm/plugins/find-replace/ui/FindReplace.js +10 -3
  212. package/dist/esm/plugins/find-replace/ui/Replace.js +11 -4
  213. package/dist/esm/plugins/find-replace/ui/styles.js +39 -18
  214. package/dist/esm/plugins/floating-toolbar/ui/DropdownMenu.js +2 -1
  215. package/dist/esm/plugins/floating-toolbar/ui/EmojiPickerButton.js +9 -4
  216. package/dist/esm/plugins/floating-toolbar/ui/Toolbar.js +1 -1
  217. package/dist/esm/plugins/fragment/index.js +22 -0
  218. package/dist/esm/plugins/fragment/plugin-key.js +2 -0
  219. package/dist/esm/plugins/hyperlink/ui/HyperlinkAddToolbar/HyperlinkAddToolbar.js +2 -2
  220. package/dist/esm/plugins/index.js +2 -0
  221. package/dist/esm/plugins/list/actions/conversions.js +38 -71
  222. package/dist/esm/plugins/list/transforms.js +7 -1
  223. package/dist/esm/plugins/media/index.js +2 -3
  224. package/dist/esm/plugins/media/nodeviews/mediaGroup.js +2 -1
  225. package/dist/esm/plugins/media/nodeviews/mediaInline.js +11 -6
  226. package/dist/esm/plugins/media/nodeviews/mediaNodeUpdater.js +3 -3
  227. package/dist/esm/plugins/media/nodeviews/mediaSingle.js +7 -5
  228. package/dist/esm/plugins/media/nodeviews/styles.js +2 -0
  229. package/dist/esm/plugins/media/pm-plugins/alt-text/ui/AltTextEdit.js +5 -1
  230. package/dist/esm/plugins/media/pm-plugins/main.js +47 -16
  231. package/dist/esm/plugins/media/toolbar/commands.js +45 -0
  232. package/dist/esm/plugins/media/toolbar/filePreviewItem.js +6 -2
  233. package/dist/esm/plugins/media/toolbar/index.js +88 -3
  234. package/dist/esm/plugins/media/ui/ResizableMediaSingle/index.js +9 -1
  235. package/dist/esm/plugins/media/utils/media-common.js +1 -1
  236. package/dist/esm/plugins/media/utils/media-files.js +6 -1
  237. package/dist/esm/plugins/panel/actions.js +2 -2
  238. package/dist/esm/plugins/panel/index.js +5 -5
  239. package/dist/esm/plugins/panel/nodeviews/panel.js +2 -2
  240. package/dist/esm/plugins/panel/toolbar.js +9 -4
  241. package/dist/esm/plugins/panel/utils.js +13 -0
  242. package/dist/esm/plugins/rank.js +3 -2
  243. package/dist/esm/plugins/selection/pm-plugins/selection-main.js +50 -1
  244. package/dist/esm/plugins/status/ui/statusPicker.js +4 -2
  245. package/dist/esm/plugins/table/commands/insert.js +1 -2
  246. package/dist/esm/plugins/table/index.js +3 -2
  247. package/dist/esm/plugins/table/nodeviews/OverflowShadowsObserver.js +1 -2
  248. package/dist/esm/plugins/table/pm-plugins/main.js +27 -4
  249. package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/colgroup.js +2 -2
  250. package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/resize-state.js +2 -0
  251. package/dist/esm/plugins/table/transforms/column-width.js +13 -3
  252. package/dist/esm/plugins/table/transforms/fix-tables.js +42 -4
  253. package/dist/esm/plugins/table/ui/FloatingContextualButton/index.js +3 -2
  254. package/dist/esm/plugins/table/ui/FloatingContextualMenu/ContextualMenu.js +1 -0
  255. package/dist/esm/plugins/table/ui/common-styles.css.js +1 -1
  256. package/dist/esm/plugins/table/ui/consts.js +2 -2
  257. package/dist/esm/plugins/table/ui/messages.js +1 -1
  258. package/dist/esm/plugins/tasks-and-decisions/nodeviews/decisionItem.js +1 -1
  259. package/dist/esm/plugins/tasks-and-decisions/nodeviews/taskItem.js +1 -1
  260. package/dist/esm/plugins/tasks-and-decisions/pm-plugins/main.js +3 -3
  261. package/dist/esm/plugins/text-color/ui/ToolbarTextColor/index.js +2 -1
  262. package/dist/esm/plugins/text-formatting/index.js +3 -2
  263. package/dist/esm/plugins/type-ahead/ui/TypeAheadList.js +2 -1
  264. package/dist/esm/plugins/type-ahead/ui/TypeAheadListItem.js +2 -1
  265. package/dist/esm/ui/Appearance/FullPage/FullPageToolbar.js +67 -27
  266. package/dist/esm/ui/Appearance/FullPage/MainToolbar.js +20 -7
  267. package/dist/esm/ui/ColorPalette/Color/index.js +9 -16
  268. package/dist/esm/ui/ColorPalette/index.js +7 -4
  269. package/dist/esm/ui/ColorPickerButton/index.js +1 -1
  270. package/dist/esm/ui/ConfigPanel/ConfigPanel.js +113 -62
  271. package/dist/esm/ui/ConfigPanel/FormContent.js +39 -26
  272. package/dist/esm/ui/ConfigPanel/transformers.js +488 -248
  273. package/dist/esm/ui/ConfigPanel/utils.js +1 -6
  274. package/dist/esm/ui/Dropdown/index.js +2 -1
  275. package/dist/esm/ui/DropdownMenu/index.js +7 -3
  276. package/dist/esm/ui/ElementBrowser/InsertMenu.js +1 -0
  277. package/dist/esm/ui/ElementBrowser/components/ElementList/ElementList.js +1 -0
  278. package/dist/esm/ui/LinkSearch/LinkSearchListItem.js +2 -2
  279. package/dist/esm/ui/Resizer/index.js +9 -1
  280. package/dist/esm/version-wrapper.js +1 -1
  281. package/dist/esm/version.json +1 -1
  282. package/dist/types/labs/next/full-page.d.ts +1 -1
  283. package/dist/types/nodeviews/ReactNodeView.d.ts +1 -1
  284. package/dist/types/nodeviews/SelectionBasedNodeView.d.ts +1 -0
  285. package/dist/types/plugins/analytics/types/enums.d.ts +1 -0
  286. package/dist/types/plugins/analytics/types/events.d.ts +7 -1
  287. package/dist/types/plugins/annotation/utils.d.ts +1 -1
  288. package/dist/types/plugins/avatar-group/index.d.ts +1 -0
  289. package/dist/types/plugins/avatar-group/ui/AvatarGroupPluginWrapper.d.ts +1 -0
  290. package/dist/types/plugins/before-primaryToolbar/index.d.ts +5 -0
  291. package/dist/types/plugins/before-primaryToolbar/ui/BeforePrimaryToolbarWrapper.d.ts +5 -0
  292. package/dist/types/plugins/code-bidi-warning/index.d.ts +4 -2
  293. package/dist/types/plugins/code-bidi-warning/pm-plugins/main.d.ts +4 -2
  294. package/dist/types/plugins/code-bidi-warning/pm-plugins/plugin-factory.d.ts +2 -1
  295. package/dist/types/plugins/code-bidi-warning/pm-plugins/types.d.ts +1 -0
  296. package/dist/types/plugins/code-block/index.d.ts +1 -1
  297. package/dist/types/plugins/code-block/nodeviews/highlighting-code-block.d.ts +12 -1
  298. package/dist/types/plugins/code-block/pm-plugins/main.d.ts +3 -1
  299. package/dist/types/plugins/code-block/types.d.ts +2 -0
  300. package/dist/types/plugins/feature-flags-context/get-enabled-feature-flag-keys.d.ts +1 -1
  301. package/dist/types/plugins/find-replace/FindReplaceToolbarButtonWithState.d.ts +15 -0
  302. package/dist/types/plugins/find-replace/index.d.ts +1 -0
  303. package/dist/types/plugins/find-replace/ui/Find.d.ts +1 -0
  304. package/dist/types/plugins/find-replace/ui/FindReplace.d.ts +1 -0
  305. package/dist/types/plugins/find-replace/ui/Replace.d.ts +1 -0
  306. package/dist/types/plugins/find-replace/ui/styles.d.ts +5 -14
  307. package/dist/types/plugins/floating-toolbar/ui/EmojiPickerButton.d.ts +1 -1
  308. package/dist/types/plugins/fragment/index.d.ts +5 -0
  309. package/dist/types/plugins/fragment/plugin-key.d.ts +2 -0
  310. package/dist/types/plugins/index.d.ts +2 -0
  311. package/dist/types/plugins/media/nodeviews/mediaInline.d.ts +3 -2
  312. package/dist/types/plugins/media/nodeviews/mediaNodeUpdater.d.ts +2 -2
  313. package/dist/types/plugins/media/nodeviews/mediaSingle.d.ts +1 -1
  314. package/dist/types/plugins/media/nodeviews/styles.d.ts +2 -0
  315. package/dist/types/plugins/media/toolbar/commands.d.ts +3 -0
  316. package/dist/types/plugins/media/toolbar/filePreviewItem.d.ts +2 -0
  317. package/dist/types/plugins/media/types.d.ts +0 -1
  318. package/dist/types/plugins/panel/actions.d.ts +1 -1
  319. package/dist/types/plugins/panel/types.d.ts +8 -2
  320. package/dist/types/plugins/quick-insert/index.d.ts +2 -1
  321. package/dist/types/plugins/table/commands/insert.d.ts +3 -0
  322. package/dist/types/plugins/table/pm-plugins/main.d.ts +2 -1
  323. package/dist/types/plugins/table/pm-plugins/table-resizing/utils/types.d.ts +1 -0
  324. package/dist/types/plugins/table/transforms/column-width.d.ts +4 -1
  325. package/dist/types/plugins/table/transforms/fix-tables.d.ts +3 -2
  326. package/dist/types/plugins/table/types.d.ts +8 -0
  327. package/dist/types/plugins/table/ui/consts.d.ts +1 -1
  328. package/dist/types/types/editor-appearance-component.d.ts +2 -2
  329. package/dist/types/types/editor-props.d.ts +11 -1
  330. package/dist/types/types/feature-flags.d.ts +13 -0
  331. package/dist/types/types/index.d.ts +1 -1
  332. package/dist/types/ui/Appearance/FullPage/FullPageToolbar.d.ts +2 -2
  333. package/dist/types/ui/Appearance/FullPage/MainToolbar.d.ts +10 -1
  334. package/dist/types/ui/ColorPalette/Color/index.d.ts +8 -5
  335. package/dist/types/ui/ColorPalette/index.d.ts +1 -0
  336. package/dist/types/ui/ConfigPanel/transformers.d.ts +7 -1
  337. package/dist/types/ui/ConfigPanel/utils.d.ts +0 -1
  338. package/dist/types/ui/Resizer/index.d.ts +1 -0
  339. package/package.json +14 -10
  340. package/dist/cjs/plugins/floating-toolbar/ui/EditorRemoveEmojiIcon.js +0 -38
  341. package/dist/es2019/plugins/floating-toolbar/ui/EditorRemoveEmojiIcon.js +0 -28
  342. package/dist/esm/plugins/floating-toolbar/ui/EditorRemoveEmojiIcon.js +0 -28
  343. package/dist/types/plugins/floating-toolbar/ui/EditorRemoveEmojiIcon.d.ts +0 -1
@@ -6,11 +6,12 @@ import { withAnalyticsContext, withAnalyticsEvents } from '@atlaskit/analytics-n
6
6
  import Form from '@atlaskit/form';
7
7
  import { isTabGroup } from '@atlaskit/editor-common/extensions';
8
8
  import _isEqual from 'lodash/isEqual';
9
+ import _mergeRecursive from 'lodash/merge';
9
10
  import { fireAnalyticsEvent, EVENT_TYPE, ACTION_SUBJECT, ACTION } from '../../plugins/analytics';
10
11
  import LoadingState from './LoadingState';
11
12
  import Header from './Header';
12
13
  import ErrorMessage from './ErrorMessage';
13
- import { serialize, deserialize } from './transformers';
14
+ import { serialize, deserialize, findDuplicateFields } from './transformers';
14
15
  import { injectIntl } from 'react-intl';
15
16
  import ButtonGroup from '@atlaskit/button/button-group';
16
17
  import Button from '@atlaskit/button/custom-theme-button';
@@ -19,6 +20,7 @@ import { pluginKey as extensionPluginKey } from '../../plugins/extension/plugin-
19
20
  import WithPluginState from '../WithPluginState';
20
21
  import FormContent from './FormContent';
21
22
  import { messages } from './messages';
23
+ import { FormErrorBoundary } from './FormErrorBoundary';
22
24
 
23
25
  function ConfigForm({
24
26
  canSave,
@@ -32,8 +34,19 @@ function ConfigForm({
32
34
  onCancel,
33
35
  onFieldChange,
34
36
  parameters,
35
- submitting
37
+ submitting,
38
+ contextIdentifierProvider
36
39
  }) {
40
+ useEffect(() => {
41
+ if (fields) {
42
+ const firstDuplicateField = findDuplicateFields(fields);
43
+
44
+ if (firstDuplicateField) {
45
+ throw new Error(`Possible duplicate field name: \`${firstDuplicateField.name}\`.`);
46
+ }
47
+ }
48
+ }, [fields]);
49
+
37
50
  if (isLoading || !hasParsedParameters && errorMessage === null) {
38
51
  return /*#__PURE__*/React.createElement(LoadingState, null);
39
52
  }
@@ -44,34 +57,27 @@ function ConfigForm({
44
57
  });
45
58
  }
46
59
 
47
- return /*#__PURE__*/React.createElement(WithPluginState, {
48
- plugins: {
49
- extension: extensionPluginKey
50
- },
51
- render: ({
52
- extension
53
- }) => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FormContent, {
54
- fields: fields,
55
- parameters: parameters,
56
- extensionManifest: extensionManifest,
57
- onFieldChange: onFieldChange,
58
- firstVisibleFieldName: firstVisibleFieldName,
59
- contextIdentifierProvider: extension === null || extension === void 0 ? void 0 : extension.contextIdentifierProvider
60
- }), /*#__PURE__*/React.createElement("div", {
61
- style: canSave ? {} : {
62
- display: 'none'
63
- }
64
- }, /*#__PURE__*/React.createElement(FormFooter, {
65
- align: "start"
66
- }, /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(Button, {
67
- type: "submit",
68
- appearance: "primary"
69
- }, intl.formatMessage(messages.submit)), /*#__PURE__*/React.createElement(Button, {
70
- appearance: "default",
71
- isDisabled: submitting,
72
- onClick: onCancel
73
- }, intl.formatMessage(messages.cancel))))))
74
- });
60
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FormContent, {
61
+ fields: fields,
62
+ parameters: parameters,
63
+ extensionManifest: extensionManifest,
64
+ onFieldChange: onFieldChange,
65
+ firstVisibleFieldName: firstVisibleFieldName,
66
+ contextIdentifierProvider: contextIdentifierProvider
67
+ }), /*#__PURE__*/React.createElement("div", {
68
+ style: canSave ? {} : {
69
+ display: 'none'
70
+ }
71
+ }, /*#__PURE__*/React.createElement(FormFooter, {
72
+ align: "start"
73
+ }, /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(Button, {
74
+ type: "submit",
75
+ appearance: "primary"
76
+ }, intl.formatMessage(messages.submit)), /*#__PURE__*/React.createElement(Button, {
77
+ appearance: "default",
78
+ isDisabled: submitting,
79
+ onClick: onCancel
80
+ }, intl.formatMessage(messages.cancel))))));
75
81
  }
76
82
 
77
83
  const ConfigFormIntl = injectIntl(ConfigForm);
@@ -126,14 +132,48 @@ class ConfigPanel extends React.Component {
126
132
  });
127
133
 
128
134
  _defineProperty(this, "backfillTabFormData", (fields, formData, currentParameters) => {
129
- const mergedTabGroups = fields.filter(isTabGroup).reduce((acc, field) => ({ ...acc,
130
- [field.name]: { ...(currentParameters[field.name] || {}),
131
- ...(formData[field.name] || {})
135
+ const getRelevantData = (field, formParams, currentParams, backfill) => {
136
+ if (field.hasGroupedValues && !(field.name in backfill)) {
137
+ backfill[field.name] = {};
132
138
  }
133
- }), {});
134
- return { ...formData,
135
- ...mergedTabGroups
136
- };
139
+
140
+ const actualFormParams = field.hasGroupedValues ? formParams[field.name] || {} : formParams;
141
+ const actualCurrentParams = field.hasGroupedValues ? currentParams[field.name] || {} : currentParams;
142
+ const actualBackfillParams = field.hasGroupedValues ? backfill[field.name] : backfill;
143
+ return {
144
+ formParams: actualFormParams,
145
+ currentParams: actualCurrentParams,
146
+ backfillParams: actualBackfillParams
147
+ };
148
+ }; // Traverse any tab structures and backfill field values on tabs
149
+ // which aren't shown. This filter should be ok because tabs are
150
+ // currently only allowed on top level
151
+
152
+
153
+ const mergedTabGroups = fields.filter(isTabGroup).reduce((missingBackfill, tabGroup) => {
154
+ const {
155
+ formParams: tabGroupFormData,
156
+ currentParams: tabGroupCurrentData,
157
+ backfillParams: tabGroupParams
158
+ } = getRelevantData(tabGroup, formData, currentParameters, missingBackfill); // Loop through tabs and see what fields are missing from current data
159
+
160
+ tabGroup.fields.forEach(tabField => {
161
+ const {
162
+ formParams: tabFormData,
163
+ currentParams: tabCurrentData,
164
+ backfillParams: tabParams
165
+ } = getRelevantData(tabField, tabGroupFormData, tabGroupCurrentData, tabGroupParams);
166
+ tabField.fields.forEach(field => {
167
+ if (field.name in tabFormData || !(field.name in tabCurrentData)) {
168
+ return;
169
+ }
170
+
171
+ tabParams[field.name] = tabCurrentData[field.name];
172
+ });
173
+ });
174
+ return missingBackfill;
175
+ }, {});
176
+ return _mergeRecursive({}, mergedTabGroups, formData);
137
177
  });
138
178
 
139
179
  _defineProperty(this, "handleSubmit", async formData => {
@@ -352,18 +392,30 @@ class ConfigPanel extends React.Component {
352
392
  noValidate: true,
353
393
  onKeyDown: handleKeyDown,
354
394
  "data-testid": "extension-config-panel"
355
- }), this.renderHeader(extensionManifest), /*#__PURE__*/React.createElement(ConfigFormIntl, {
356
- canSave: !autoSave,
357
- errorMessage: errorMessage,
358
- extensionManifest: extensionManifest,
359
- fields: fields,
360
- firstVisibleFieldName: firstVisibleFieldName,
361
- hasParsedParameters: hasParsedParameters,
362
- isLoading: isLoading || false,
363
- onCancel: onCancel,
364
- onFieldChange: onFieldChange,
365
- parameters: currentParameters,
366
- submitting: submitting
395
+ }), this.renderHeader(extensionManifest), /*#__PURE__*/React.createElement(WithPluginState, {
396
+ plugins: {
397
+ extension: extensionPluginKey
398
+ },
399
+ render: ({
400
+ extension
401
+ }) => /*#__PURE__*/React.createElement(FormErrorBoundary, {
402
+ contextIdentifierProvider: extension === null || extension === void 0 ? void 0 : extension.contextIdentifierProvider,
403
+ extensionKey: extensionManifest.key,
404
+ fields: fields || []
405
+ }, /*#__PURE__*/React.createElement(ConfigFormIntl, {
406
+ canSave: !autoSave,
407
+ errorMessage: errorMessage,
408
+ extensionManifest: extensionManifest,
409
+ fields: fields,
410
+ firstVisibleFieldName: firstVisibleFieldName,
411
+ hasParsedParameters: hasParsedParameters,
412
+ isLoading: isLoading || false,
413
+ onCancel: onCancel,
414
+ onFieldChange: onFieldChange,
415
+ parameters: currentParameters,
416
+ submitting: submitting,
417
+ contextIdentifierProvider: extension === null || extension === void 0 ? void 0 : extension.contextIdentifierProvider
418
+ }))
367
419
  }));
368
420
  });
369
421
  });
@@ -134,35 +134,44 @@ export function FieldComponent({
134
134
  });
135
135
 
136
136
  case 'expand':
137
- // if expand is under a tab.
138
- const resolvedParentName = parentName ? `${parentName}.${field.name}` : field.name;
139
- return /*#__PURE__*/React.createElement(Expand, {
140
- field: field,
141
- isExpanded: field.isExpanded
142
- }, /*#__PURE__*/React.createElement(FormContent, {
143
- parentName: resolvedParentName,
144
- fields: field.fields,
145
- parameters: parameters[field.name] || {},
146
- onFieldChange: onFieldChange,
147
- extensionManifest: extensionManifest
148
- }));
149
-
150
- case 'tab-group':
151
- const renderPanel = tabField => {
152
- const tabParameters = parameters[field.name] || {};
153
- return /*#__PURE__*/React.createElement(FormContent, {
154
- parentName: `${field.name}.${tabField.name}`,
155
- fields: tabField.fields,
156
- parameters: tabParameters[tabField.name] || {},
137
+ {
138
+ // if expand is under a tab with hasGroupedValues=true
139
+ const resolvedParentName = [parentName, field.hasGroupedValues ? field.name : undefined].filter(val => !!val).join('.') || undefined;
140
+ const resolvedParameters = !field.hasGroupedValues ? parameters : parameters[field.name] || {};
141
+ return /*#__PURE__*/React.createElement(Expand, {
142
+ field: field,
143
+ isExpanded: field.isExpanded
144
+ }, /*#__PURE__*/React.createElement(FormContent, {
145
+ parentName: resolvedParentName,
146
+ fields: field.fields,
147
+ parameters: resolvedParameters,
157
148
  onFieldChange: onFieldChange,
158
149
  extensionManifest: extensionManifest
159
- });
160
- };
150
+ }));
151
+ }
161
152
 
162
- return /*#__PURE__*/React.createElement(TabGroup, {
163
- field: field,
164
- renderPanel: renderPanel
165
- });
153
+ case 'tab-group':
154
+ {
155
+ const tabGroupField = field;
156
+ const tabGroupParams = tabGroupField.hasGroupedValues ? parameters[tabGroupField.name] || {} : parameters;
157
+
158
+ const renderPanel = tabField => {
159
+ const parentName = [tabGroupField.hasGroupedValues ? tabGroupField.name : undefined, tabField.hasGroupedValues ? tabField.name : undefined].filter(val => !!val).join('.') || undefined;
160
+ const tabParameters = tabField.hasGroupedValues ? tabGroupParams[tabField.name] || {} : tabGroupParams;
161
+ return /*#__PURE__*/React.createElement(FormContent, {
162
+ parentName: parentName,
163
+ fields: tabField.fields,
164
+ parameters: tabParameters,
165
+ onFieldChange: onFieldChange,
166
+ extensionManifest: extensionManifest
167
+ });
168
+ };
169
+
170
+ return /*#__PURE__*/React.createElement(TabGroup, {
171
+ field: tabGroupField,
172
+ renderPanel: renderPanel
173
+ });
174
+ }
166
175
 
167
176
  default:
168
177
  return /*#__PURE__*/React.createElement(UnhandledType, {
@@ -1,4 +1,4 @@
1
- import { isFieldset, isDateRange, isTabGroup, isExpand, getFieldSerializer, getFieldDeserializer } from '@atlaskit/editor-common/extensions';
1
+ import { isFieldset, isDateRange, isTabGroup, isTabField, isExpand, getFieldSerializer, getFieldDeserializer } from '@atlaskit/editor-common/extensions';
2
2
  import { getNameFromDuplicateField, isDuplicateField } from './utils';
3
3
 
4
4
  const isOption = option => {
@@ -8,10 +8,9 @@ const isOption = option => {
8
8
  const isOptions = options => {
9
9
  return Array.isArray(options) && options.every(isOption);
10
10
  };
11
- /** maps the typed-values from the Form values object */
12
-
13
11
 
14
- function extract(value, field) {
12
+ /** maps the typed-values from the Form values object */
13
+ function extract(value, field, options) {
15
14
  if (isOptions(value)) {
16
15
  return value.map(item => item.value);
17
16
  } else if (isOption(value)) {
@@ -24,79 +23,235 @@ function extract(value, field) {
24
23
  }
25
24
 
26
25
  return Number(value);
26
+ } // Workaround for https://product-fabric.atlassian.net/browse/DST-2701
27
+ else if (options !== null && options !== void 0 && options.useDefaultValue && value === undefined && 'defaultValue' in field) {
28
+ return field.defaultValue;
27
29
  }
28
30
 
29
31
  return value;
30
32
  }
31
33
 
32
- export const serialize = async (manifest, data, fields, depth = 0) => {
34
+ export const findDuplicateFields = fields => findDuplicateFieldsInternal(flattenFields(fields));
35
+
36
+ const findDuplicateFieldsInternal = fields => {
37
+ const allowDuplicatesMap = {};
38
+ return fields.find(field => {
39
+ if (isExpand(field)) {
40
+ return findDuplicateFieldsInternal(field.fields);
41
+ } else if (isTabGroup(field)) {
42
+ return field.fields.find(tabField => findDuplicateFieldsInternal(tabField.fields));
43
+ } else if (allowDuplicatesMap[field.name] === undefined) {
44
+ allowDuplicatesMap[field.name] = !!field.allowDuplicates;
45
+ return;
46
+ } else if (!field.allowDuplicates || !allowDuplicatesMap[field.name]) {
47
+ return field;
48
+ }
49
+
50
+ return;
51
+ });
52
+ };
53
+
54
+ export const serialize = async (manifest, data, fields, options = {}) => {
33
55
  const result = [];
56
+ const {
57
+ depth = 0,
58
+ parentType
59
+ } = options;
60
+ const flattenedFields = flattenFields(fields);
61
+ const fillResults = flattenedFields.map(async field => {
62
+ if (isTabGroup(field)) {
63
+ const tabGroupData = await serializeTabGroupField(manifest, field, data);
64
+ result.push(...tabGroupData);
65
+ } else if (isTabField(field)) {
66
+ const tabData = await serializeTabField(manifest, field, data);
67
+ result.push(...tabData);
68
+ } else if (isExpand(field)) {
69
+ const expandData = await serializeExpandField(manifest, field, data);
70
+ result.push(...expandData);
71
+ } // WARNING: don't recursively serialize, limit to depth < 1
72
+ // serializable?
73
+ else if (isFieldset(field) && depth === 0) {
74
+ const fieldsetData = await serializeFieldset(manifest, field, data, depth);
34
75
 
35
- if (data) {
36
- for (const name in data) {
37
- const field = fields.find(field => field.name === getNameFromDuplicateField(name));
76
+ if (fieldsetData) {
77
+ result.push(fieldsetData);
78
+ }
79
+ } else {
80
+ const value = extract(data[field.name], field, {
81
+ useDefaultValue: true
82
+ }); // ignore undefined values
83
+
84
+ if (value !== undefined) {
85
+ result.push({
86
+ [field.name]: value
87
+ });
88
+ }
89
+ }
90
+ });
91
+ await Promise.all(fillResults); // Crunch fields down to parameters
38
92
 
39
- if (field === undefined) {
40
- continue;
41
- } // ignore undefined values
93
+ const parameters = result.reduce((obj, current) => {
94
+ for (const key in current) {
95
+ obj[key] = current[key];
96
+ }
42
97
 
98
+ return obj;
99
+ }, {}); // Fix up duplicate values (currently only for fieldsets)
43
100
 
44
- let value = extract(data[name], field);
101
+ const hasDuplicateFields = parentType === 'fieldset' && !!flattenedFields.find(field => field.allowDuplicates);
45
102
 
46
- if (value === undefined) {
47
- continue;
48
- }
103
+ if (hasDuplicateFields) {
104
+ return serializeMergeDuplicateFieldData(parameters, data, flattenedFields);
105
+ }
49
106
 
50
- if (isTabGroup(field)) {
51
- const {
52
- fields: tabs
53
- } = field;
54
- value = {};
107
+ return parameters;
108
+ };
55
109
 
56
- const resolveTabValues = async (tabField, groupData) => {
57
- return await serialize(manifest, groupData[tabField.name] || {}, tabField.fields);
58
- };
110
+ const serializeFieldset = async (manifest, field, data, depth) => {
111
+ let fieldSerializer;
59
112
 
60
- for (let i = 0; i < tabs.length; i++) {
61
- const tabField = tabs[i];
62
- value[tabField.name] = await resolveTabValues(tabField, data[field.name] || {});
63
- }
64
- } else if (isExpand(field)) {
65
- value = await serialize(manifest, data[field.name] || {}, field.fields);
66
- } // WARNING: don't recursively serialize, limit to depth < 1
67
- // serializable?
68
- else if (isFieldset(field) && depth === 0) {
69
- const fieldSerializer = await getFieldSerializer(manifest, field.options.transformer);
70
-
71
- if (fieldSerializer) {
72
- const {
73
- fields: fieldsetFields
74
- } = field;
75
- const extracted = await serialize(manifest, value, fieldsetFields, depth + 1);
76
- value = fieldSerializer(extracted);
77
- }
113
+ try {
114
+ fieldSerializer = await getFieldSerializer(manifest, field.options.transformer);
115
+ } catch (ex) {
116
+ // We only throw if there is data that may be lost
117
+ if (data[field.name] !== undefined) {
118
+ throw ex;
119
+ }
120
+ }
121
+
122
+ if (!fieldSerializer) {
123
+ return;
124
+ }
125
+
126
+ const {
127
+ fields: fieldsetFields
128
+ } = field;
129
+ const fieldParams = extract(data[field.name], field, {
130
+ useDefaultValue: true
131
+ }) || {};
132
+ const extracted = await serialize(manifest, fieldParams, fieldsetFields, {
133
+ depth: depth + 1,
134
+ parentType: 'fieldset'
135
+ });
136
+ return {
137
+ [field.name]: fieldSerializer(extracted)
138
+ };
139
+ };
140
+
141
+ const serializeExpandField = async (manifest, field, data) => {
142
+ const expandData = field.hasGroupedValues ? data[field.name] || {} : data;
143
+ const value = await serialize(manifest, expandData, field.fields, {
144
+ parentType: 'expand'
145
+ });
146
+ const results = [];
147
+
148
+ if (!field.hasGroupedValues) {
149
+ for (const fieldName in value) {
150
+ results.push({
151
+ [fieldName]: value[fieldName]
152
+ });
153
+ }
154
+ } else {
155
+ results.push({
156
+ [field.name]: value
157
+ });
158
+ }
159
+
160
+ return results;
161
+ };
162
+
163
+ const resolveTabValues = async (manifest, tabField, groupData) => {
164
+ const tabFieldParams = tabField.hasGroupedValues ? groupData[tabField.name] || {} : groupData;
165
+ return await serialize(manifest, tabFieldParams, tabField.fields, {
166
+ parentType: 'tab'
167
+ });
168
+ };
169
+
170
+ const serializeTabGroupField = async (manifest, field, data) => {
171
+ const {
172
+ fields: tabs
173
+ } = field;
174
+ const results = [];
175
+ const value = {};
176
+
177
+ for (let i = 0; i < tabs.length; i++) {
178
+ const tabField = tabs[i];
179
+ const tabFieldParameters = await resolveTabValues(manifest, tabField, field.hasGroupedValues ? data[field.name] || {} : data);
180
+
181
+ if (tabField.hasGroupedValues) {
182
+ // Keep namespaced by tab
183
+ value[tabField.name] = tabFieldParameters;
184
+ } else {
185
+ // Copy into tabGroup value
186
+ for (const fieldName in tabFieldParameters) {
187
+ value[fieldName] = tabFieldParameters[fieldName];
78
188
  }
189
+ }
190
+ } // Now for tabGroup...
191
+
79
192
 
80
- result.push({
81
- [field.name]: value
193
+ if (field.hasGroupedValues) {
194
+ results.push({
195
+ [field.name]: value
196
+ });
197
+ } else {
198
+ for (const fieldName in value) {
199
+ results.push({
200
+ [fieldName]: value
82
201
  });
83
202
  }
84
- } // when there are duplicate fields we return an array eg. [{ title: 'one' }, { title: 'two' }]
85
- // when there aren't we return an object eg. { title: 'one' }
203
+ }
86
204
 
205
+ return results;
206
+ };
87
207
 
88
- const hasDuplicateFields = !!Object.keys(data).find(key => isDuplicateField(key));
208
+ const serializeTabField = async (manifest, field, data) => {
209
+ const results = [];
210
+ const tabField = field;
211
+ const tabFieldParameters = await resolveTabValues(manifest, tabField, data);
89
212
 
90
- if (hasDuplicateFields) {
91
- return result;
213
+ if (tabField.hasGroupedValues) {
214
+ // Keep namespaced by tab
215
+ results.push({
216
+ [tabField.name]: tabFieldParameters
217
+ });
218
+ } else {
219
+ // Copy into tabGroup value
220
+ for (const fieldName in tabFieldParameters) {
221
+ results.push({
222
+ [fieldName]: tabFieldParameters[fieldName]
223
+ });
224
+ }
92
225
  }
93
226
 
94
- return result.reduce((obj, current) => {
95
- for (const key in current) {
96
- obj[key] = current[key];
227
+ return results;
228
+ };
229
+
230
+ const serializeMergeDuplicateFieldData = (parameters, formData, flattenedFields) => {
231
+ // Weed out all the non-duplicate field names
232
+ const allDuplicateFieldNames = Object.keys(formData).filter(key => isDuplicateField(key));
233
+ return flattenedFields.reduce((newParams, field) => {
234
+ const paramValue = parameters[field.name];
235
+
236
+ if (!field.allowDuplicates && paramValue !== undefined) {
237
+ newParams[field.name] = paramValue;
238
+ } else {
239
+ // extract the given duplicate values through the field
240
+ const duplicateValues = allDuplicateFieldNames.filter(name => getNameFromDuplicateField(name) === field.name).map(duplicateFieldName => extract(formData[duplicateFieldName], field, {
241
+ useDefaultValue: true
242
+ })); // Merge and ensure that all values are worth serializing
243
+
244
+ const mergedValues = [paramValue, // first value
245
+ ...duplicateValues].filter(value => value !== undefined);
246
+
247
+ if (mergedValues.length > 0) {
248
+ // Replace so the duplicate field values are saved under the
249
+ // fieldName as an array
250
+ newParams[field.name] = mergedValues;
251
+ }
97
252
  }
98
253
 
99
- return obj;
254
+ return newParams;
100
255
  }, {});
101
256
  };
102
257
 
@@ -137,21 +292,51 @@ function injectDefaultValues(data, fields) {
137
292
  }
138
293
  }
139
294
 
140
- if (doParametersContainDuplicateFields(copy)) {
141
- return copy;
142
- }
143
-
144
295
  return convertToParametersObject(copy);
145
296
  }
297
+ /**
298
+ * Flattens the given FieldDefinition[] so it resembles the expected data
299
+ * structure in result Parameters.
300
+ */
301
+
302
+
303
+ const flattenFields = fields => {
304
+ const flattenAccumulator = (accumulator, field) => {
305
+ if (isTabGroup(field)) {
306
+ if (field.hasGroupedValues) {
307
+ accumulator.push(field);
308
+ } else {
309
+ const flattenedTabs = field.fields.reduce((tabAccumulator, tab) => {
310
+ return tabAccumulator.concat(tab.hasGroupedValues ? tab : tab.fields.reduce(flattenAccumulator, []));
311
+ }, []);
312
+ accumulator.push(...flattenedTabs);
313
+ }
314
+ } else if (isExpand(field)) {
315
+ if (field.hasGroupedValues) {
316
+ accumulator.push(field);
317
+ } else {
318
+ const flattenedExpand = field.fields.reduce(flattenAccumulator, []);
319
+ accumulator.push(...flattenedExpand);
320
+ }
321
+ } else {
322
+ accumulator.push(field);
323
+ }
324
+
325
+ return accumulator;
326
+ };
327
+
328
+ return fields.reduce(flattenAccumulator, []);
329
+ };
146
330
 
147
331
  export const deserialize = async (manifest, data, fields, depth = 0) => {
148
332
  const dataArray = convertToParametersArray(data);
149
333
  let result = [];
150
334
  const errors = [];
335
+ const flattenedFields = flattenFields(fields);
151
336
 
152
337
  for (const item of dataArray) {
153
338
  const [name, originalValue] = Object.entries(item)[0];
154
- const field = fields.find(field => field.name === getNameFromDuplicateField(name));
339
+ const field = flattenedFields.find(field => field.name === getNameFromDuplicateField(name));
155
340
 
156
341
  if (field === undefined) {
157
342
  continue;
@@ -193,21 +378,7 @@ export const deserialize = async (manifest, data, fields, depth = 0) => {
193
378
  result.errors = convertToParametersObject(errors);
194
379
  }
195
380
 
196
- return injectDefaultValues(result, fields);
197
- };
198
-
199
- const doParametersContainDuplicateFields = parameters => {
200
- const keyMap = new Set();
201
-
202
- for (const param of parameters) {
203
- const key = Object.keys(param)[0];
204
-
205
- if (keyMap.has(key)) {
206
- return true;
207
- }
208
-
209
- keyMap.add(key);
210
- }
381
+ return injectDefaultValues(result, flattenedFields);
211
382
  };
212
383
 
213
384
  const convertToParametersObject = (parameters = []) => {
@@ -8,7 +8,6 @@ export const fromEntries = iterable => {
8
8
  return obj;
9
9
  }, {});
10
10
  };
11
- export const toEntries = parameters => Array.isArray(parameters) ? parameters.reduce((prev, curr) => [...prev, ...Object.entries(curr)], []) : Object.entries(parameters);
12
11
 
13
12
  const isEmptyString = value => typeof value === 'string' && value === '';
14
13
 
@@ -50,7 +49,7 @@ export const getSafeParentedName = (name, parentName) => {
50
49
  const duplicateFieldRegex = /:[0-9]+$/;
51
50
  export const isDuplicateField = key => duplicateFieldRegex.test(key);
52
51
  export const getNameFromDuplicateField = key => key.replace(duplicateFieldRegex, '');
53
- /*
52
+ /*
54
53
  ColorPickerButton only accepts 8 digit hex alpha values, for example:
55
54
  #123fffaa (8 digits, hex alpha)
56
55
  */
@@ -1,6 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import React from 'react';
3
- import { PureComponent } from 'react';
3
+ import { PureComponent } from 'react'; // eslint-disable-next-line @atlaskit/design-system/no-deprecated-imports
4
+
4
5
  import DropdownList from '@atlaskit/droplist';
5
6
  import { Popup } from '@atlaskit/editor-common';
6
7
  import withOuterListeners from '../with-outer-listeners';