@atlaskit/editor-plugin-table 0.1.0 → 0.1.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 (190) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/plugins/table/ui/FloatingDeleteButton/index.js +2 -1
  3. package/dist/cjs/version.json +1 -1
  4. package/dist/es2019/plugins/table/ui/FloatingDeleteButton/index.js +2 -1
  5. package/dist/es2019/version.json +1 -1
  6. package/dist/esm/plugins/table/ui/FloatingDeleteButton/index.js +2 -1
  7. package/dist/esm/version.json +1 -1
  8. package/examples/99-testing.tsx +35 -30
  9. package/package.json +2 -11
  10. package/src/__tests__/integration/__fixtures__/auto-size-documents.ts +5 -10
  11. package/src/__tests__/integration/__fixtures__/layout-documents.ts +1 -2
  12. package/src/__tests__/integration/__fixtures__/resize-documents.ts +5 -10
  13. package/src/__tests__/integration/resize.ts +1 -2
  14. package/src/__tests__/unit/analytics.ts +33 -32
  15. package/src/__tests__/unit/collab.ts +12 -9
  16. package/src/__tests__/unit/commands/sort.ts +28 -28
  17. package/src/__tests__/unit/copy-paste.ts +6 -8
  18. package/src/__tests__/unit/event-handlers.ts +7 -10
  19. package/src/__tests__/unit/fix-tables.ts +17 -23
  20. package/src/__tests__/unit/get-toolbar-config.ts +0 -5
  21. package/src/__tests__/unit/hover-selection.ts +1 -66
  22. package/src/__tests__/unit/index-with-fake-timers.ts +1 -1
  23. package/src/__tests__/unit/index.ts +5 -5
  24. package/src/__tests__/unit/nodeviews/TableComponent.tsx +11 -218
  25. package/src/__tests__/unit/nodeviews/cell.ts +12 -10
  26. package/src/__tests__/unit/nodeviews/table.ts +25 -26
  27. package/src/__tests__/unit/pm-plugins/safari-delete-composition-text-issue-workaround.ts +11 -8
  28. package/src/__tests__/unit/pm-plugins/sticky-headers/tableRow.tsx +11 -12
  29. package/src/__tests__/unit/toolbar.ts +18 -5
  30. package/src/__tests__/unit/ui/ContextualMenu.tsx +55 -0
  31. package/src/__tests__/unit/ui/CornerControls.tsx +7 -7
  32. package/src/__tests__/unit/ui/FloatingContextualButton.tsx +45 -49
  33. package/src/__tests__/unit/ui/FloatingContextualMenu.tsx +49 -0
  34. package/src/__tests__/unit/ui/FloatingDeleteButton.tsx +30 -2
  35. package/src/__tests__/unit/ui/FloatingInsertButton.tsx +143 -111
  36. package/src/__tests__/unit/ui/RowControls.tsx +112 -141
  37. package/src/__tests__/unit/ui/TableFloatingControls.tsx +18 -15
  38. package/src/__tests__/unit/undo-redo.ts +10 -9
  39. package/src/__tests__/unit/utils/nodes.ts +8 -4
  40. package/src/__tests__/unit/utils/row-controls.ts +8 -4
  41. package/src/plugins/table/commands/clear.ts +30 -29
  42. package/src/plugins/table/commands/go-to-next-cell.ts +41 -38
  43. package/src/plugins/table/commands/insert.ts +91 -91
  44. package/src/plugins/table/commands/misc.ts +123 -125
  45. package/src/plugins/table/commands/selection.ts +329 -319
  46. package/src/plugins/table/commands-with-analytics.ts +299 -294
  47. package/src/plugins/table/event-handlers.ts +111 -111
  48. package/src/plugins/table/handlers.ts +95 -94
  49. package/src/plugins/table/nodeviews/OverflowShadowsObserver.ts +4 -3
  50. package/src/plugins/table/nodeviews/TableComponent.tsx +6 -9
  51. package/src/plugins/table/nodeviews/update-overflow-shadows.ts +39 -39
  52. package/src/plugins/table/pm-plugins/decorations/utils/column-controls.ts +7 -9
  53. package/src/plugins/table/pm-plugins/decorations/utils/column-resizing.ts +30 -30
  54. package/src/plugins/table/pm-plugins/decorations/utils/compose-decorations.ts +7 -7
  55. package/src/plugins/table/pm-plugins/plugin-factory.ts +33 -33
  56. package/src/plugins/table/pm-plugins/safari-delete-composition-text-issue-workaround.ts +6 -9
  57. package/src/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.ts +3 -2
  58. package/src/plugins/table/pm-plugins/table-resizing/commands.ts +98 -90
  59. package/src/plugins/table/pm-plugins/table-resizing/utils/dom.ts +46 -47
  60. package/src/plugins/table/toolbar.tsx +116 -113
  61. package/src/plugins/table/transforms/column-width.ts +143 -146
  62. package/src/plugins/table/transforms/delete-columns.ts +144 -142
  63. package/src/plugins/table/transforms/delete-rows.ts +110 -111
  64. package/src/plugins/table/transforms/metadata.ts +9 -9
  65. package/src/plugins/table/ui/FloatingContextualMenu/ContextualMenu.tsx +7 -6
  66. package/src/plugins/table/ui/FloatingDeleteButton/index.tsx +3 -2
  67. package/src/plugins/table/ui/FloatingInsertButton/index.tsx +2 -5
  68. package/src/plugins/table/ui/LayoutButton/index.tsx +2 -6
  69. package/src/plugins/table/ui/common-styles.ts +1 -3
  70. package/src/plugins/table/utils/analytics.ts +24 -25
  71. package/src/plugins/table/utils/dom.ts +3 -3
  72. package/src/plugins/table/utils/row-controls.ts +92 -93
  73. package/dist/types-ts4.0/index.d.ts +0 -1
  74. package/dist/types-ts4.0/plugins/table/commands/clear.d.ts +0 -3
  75. package/dist/types-ts4.0/plugins/table/commands/collapse.d.ts +0 -2
  76. package/dist/types-ts4.0/plugins/table/commands/go-to-next-cell.d.ts +0 -4
  77. package/dist/types-ts4.0/plugins/table/commands/hover.d.ts +0 -8
  78. package/dist/types-ts4.0/plugins/table/commands/index.d.ts +0 -7
  79. package/dist/types-ts4.0/plugins/table/commands/insert.d.ts +0 -10
  80. package/dist/types-ts4.0/plugins/table/commands/misc.d.ts +0 -27
  81. package/dist/types-ts4.0/plugins/table/commands/selection.d.ts +0 -8
  82. package/dist/types-ts4.0/plugins/table/commands/sort.d.ts +0 -3
  83. package/dist/types-ts4.0/plugins/table/commands/split-cell.d.ts +0 -6
  84. package/dist/types-ts4.0/plugins/table/commands/toggle.d.ts +0 -12
  85. package/dist/types-ts4.0/plugins/table/commands-with-analytics.d.ts +0 -26
  86. package/dist/types-ts4.0/plugins/table/create-plugin-config.d.ts +0 -2
  87. package/dist/types-ts4.0/plugins/table/event-handlers.d.ts +0 -16
  88. package/dist/types-ts4.0/plugins/table/handlers.d.ts +0 -3
  89. package/dist/types-ts4.0/plugins/table/index.d.ts +0 -17
  90. package/dist/types-ts4.0/plugins/table/nodeviews/OverflowShadowsObserver.d.ts +0 -26
  91. package/dist/types-ts4.0/plugins/table/nodeviews/TableComponent.d.ts +0 -72
  92. package/dist/types-ts4.0/plugins/table/nodeviews/__mocks__/OverflowShadowsObserver.d.ts +0 -9
  93. package/dist/types-ts4.0/plugins/table/nodeviews/__mocks__/OverridableMock.d.ts +0 -9
  94. package/dist/types-ts4.0/plugins/table/nodeviews/table.d.ts +0 -31
  95. package/dist/types-ts4.0/plugins/table/nodeviews/tableCell.d.ts +0 -19
  96. package/dist/types-ts4.0/plugins/table/nodeviews/types.d.ts +0 -24
  97. package/dist/types-ts4.0/plugins/table/nodeviews/update-overflow-shadows.d.ts +0 -8
  98. package/dist/types-ts4.0/plugins/table/pm-plugins/decorations/plugin.d.ts +0 -7
  99. package/dist/types-ts4.0/plugins/table/pm-plugins/decorations/utils/column-controls.d.ts +0 -3
  100. package/dist/types-ts4.0/plugins/table/pm-plugins/decorations/utils/column-resizing.d.ts +0 -2
  101. package/dist/types-ts4.0/plugins/table/pm-plugins/decorations/utils/compose-decorations.d.ts +0 -2
  102. package/dist/types-ts4.0/plugins/table/pm-plugins/decorations/utils/index.d.ts +0 -3
  103. package/dist/types-ts4.0/plugins/table/pm-plugins/decorations/utils/types.d.ts +0 -6
  104. package/dist/types-ts4.0/plugins/table/pm-plugins/default-table-selection.d.ts +0 -5
  105. package/dist/types-ts4.0/plugins/table/pm-plugins/keymap.d.ts +0 -5
  106. package/dist/types-ts4.0/plugins/table/pm-plugins/main.d.ts +0 -8
  107. package/dist/types-ts4.0/plugins/table/pm-plugins/plugin-factory.d.ts +0 -1
  108. package/dist/types-ts4.0/plugins/table/pm-plugins/plugin-key.d.ts +0 -3
  109. package/dist/types-ts4.0/plugins/table/pm-plugins/safari-delayed-dom-selection-syncing-workaround.d.ts +0 -4
  110. package/dist/types-ts4.0/plugins/table/pm-plugins/safari-delete-composition-text-issue-workaround.d.ts +0 -15
  111. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/commands.d.ts +0 -3
  112. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/index.d.ts +0 -6
  113. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/nodeviews/dom.d.ts +0 -6
  114. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.d.ts +0 -65
  115. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/plugin-key.d.ts +0 -3
  116. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/plugin-state.d.ts +0 -3
  117. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/plugin.d.ts +0 -4
  118. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/types.d.ts +0 -16
  119. package/dist/types-ts4.0/plugins/table/pm-plugins/sticky-headers/util.d.ts +0 -2
  120. package/dist/types-ts4.0/plugins/table/pm-plugins/table-local-id.d.ts +0 -22
  121. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/commands.d.ts +0 -25
  122. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/event-handlers.d.ts +0 -4
  123. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/index.d.ts +0 -4
  124. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/plugin-factory.d.ts +0 -4
  125. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/plugin-key.d.ts +0 -3
  126. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/plugin.d.ts +0 -6
  127. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/reducer.d.ts +0 -3
  128. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/colgroup.d.ts +0 -8
  129. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/column-state.d.ts +0 -14
  130. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/content-width.d.ts +0 -4
  131. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/dom.d.ts +0 -13
  132. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/index.d.ts +0 -12
  133. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/misc.d.ts +0 -22
  134. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/resize-column.d.ts +0 -2
  135. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/resize-logic.d.ts +0 -4
  136. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/resize-state.d.ts +0 -29
  137. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/scale-table.d.ts +0 -17
  138. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/types.d.ts +0 -22
  139. package/dist/types-ts4.0/plugins/table/pm-plugins/table-resizing/utils/unit-to-number.d.ts +0 -1
  140. package/dist/types-ts4.0/plugins/table/pm-plugins/table-selection-keymap.d.ts +0 -4
  141. package/dist/types-ts4.0/plugins/table/reducer.d.ts +0 -3
  142. package/dist/types-ts4.0/plugins/table/toolbar.d.ts +0 -36
  143. package/dist/types-ts4.0/plugins/table/transforms/column-width.d.ts +0 -18
  144. package/dist/types-ts4.0/plugins/table/transforms/delete-columns.d.ts +0 -3
  145. package/dist/types-ts4.0/plugins/table/transforms/delete-rows.d.ts +0 -3
  146. package/dist/types-ts4.0/plugins/table/transforms/fix-tables.d.ts +0 -10
  147. package/dist/types-ts4.0/plugins/table/transforms/index.d.ts +0 -7
  148. package/dist/types-ts4.0/plugins/table/transforms/merge.d.ts +0 -5
  149. package/dist/types-ts4.0/plugins/table/transforms/metadata.d.ts +0 -21
  150. package/dist/types-ts4.0/plugins/table/transforms/replace-table.d.ts +0 -5
  151. package/dist/types-ts4.0/plugins/table/transforms/split.d.ts +0 -9
  152. package/dist/types-ts4.0/plugins/table/types.d.ts +0 -328
  153. package/dist/types-ts4.0/plugins/table/ui/FloatingContextualButton/index.d.ts +0 -29
  154. package/dist/types-ts4.0/plugins/table/ui/FloatingContextualButton/styles.d.ts +0 -1
  155. package/dist/types-ts4.0/plugins/table/ui/FloatingContextualMenu/ContextualMenu.d.ts +0 -87
  156. package/dist/types-ts4.0/plugins/table/ui/FloatingContextualMenu/index.d.ts +0 -22
  157. package/dist/types-ts4.0/plugins/table/ui/FloatingContextualMenu/styles.d.ts +0 -2
  158. package/dist/types-ts4.0/plugins/table/ui/FloatingDeleteButton/DeleteButton.d.ts +0 -14
  159. package/dist/types-ts4.0/plugins/table/ui/FloatingDeleteButton/getPopUpOptions.d.ts +0 -10
  160. package/dist/types-ts4.0/plugins/table/ui/FloatingDeleteButton/index.d.ts +0 -54
  161. package/dist/types-ts4.0/plugins/table/ui/FloatingDeleteButton/types.d.ts +0 -1
  162. package/dist/types-ts4.0/plugins/table/ui/FloatingInsertButton/InsertButton.d.ts +0 -12
  163. package/dist/types-ts4.0/plugins/table/ui/FloatingInsertButton/getPopupOptions.d.ts +0 -3
  164. package/dist/types-ts4.0/plugins/table/ui/FloatingInsertButton/index.d.ts +0 -35
  165. package/dist/types-ts4.0/plugins/table/ui/LayoutButton/index.d.ts +0 -21
  166. package/dist/types-ts4.0/plugins/table/ui/TableFloatingControls/CornerControls/index.d.ts +0 -16
  167. package/dist/types-ts4.0/plugins/table/ui/TableFloatingControls/NumberColumn/index.d.ts +0 -21
  168. package/dist/types-ts4.0/plugins/table/ui/TableFloatingControls/RowControls/index.d.ts +0 -17
  169. package/dist/types-ts4.0/plugins/table/ui/TableFloatingControls/index.d.ts +0 -40
  170. package/dist/types-ts4.0/plugins/table/ui/common-styles.d.ts +0 -4
  171. package/dist/types-ts4.0/plugins/table/ui/consts.d.ts +0 -39
  172. package/dist/types-ts4.0/plugins/table/ui/messages.d.ts +0 -38
  173. package/dist/types-ts4.0/plugins/table/ui/ui-styles.d.ts +0 -15
  174. package/dist/types-ts4.0/plugins/table/utils/analytics.d.ts +0 -18
  175. package/dist/types-ts4.0/plugins/table/utils/collapse.d.ts +0 -29
  176. package/dist/types-ts4.0/plugins/table/utils/column-controls.d.ts +0 -10
  177. package/dist/types-ts4.0/plugins/table/utils/decoration.d.ts +0 -16
  178. package/dist/types-ts4.0/plugins/table/utils/dom.d.ts +0 -20
  179. package/dist/types-ts4.0/plugins/table/utils/get-allow-add-column-custom-step.d.ts +0 -2
  180. package/dist/types-ts4.0/plugins/table/utils/index.d.ts +0 -11
  181. package/dist/types-ts4.0/plugins/table/utils/nodes.d.ts +0 -12
  182. package/dist/types-ts4.0/plugins/table/utils/paste.d.ts +0 -14
  183. package/dist/types-ts4.0/plugins/table/utils/referentiality.d.ts +0 -2
  184. package/dist/types-ts4.0/plugins/table/utils/row-controls.d.ts +0 -16
  185. package/dist/types-ts4.0/plugins/table/utils/selection.d.ts +0 -6
  186. package/dist/types-ts4.0/plugins/table/utils/table.d.ts +0 -4
  187. package/dist/types-ts4.0/plugins/table/utils/update-plugin-state-decorations.d.ts +0 -4
  188. package/dist/types-ts4.0/plugins/table-plugin.d.ts +0 -2
  189. package/src/plugins/table/ui/FloatingContextualMenu/__tests__/ContextualMenu.tsx +0 -56
  190. package/src/plugins/table/ui/FloatingContextualMenu/__tests__/FloatingContextualMenu.tsx +0 -50
@@ -1,5 +1,9 @@
1
1
  import { Node as PMNode } from 'prosemirror-model';
2
- import { createEditorFactory } from '@atlaskit/editor-test-helpers/create-editor';
2
+ import {
3
+ createProsemirrorEditorFactory,
4
+ LightEditorPlugin,
5
+ Preset,
6
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
3
7
  import {
4
8
  doc,
5
9
  p,
@@ -11,39 +15,37 @@ import {
11
15
  DocBuilder,
12
16
  } from '@atlaskit/editor-test-helpers/doc-builder';
13
17
  import { TableAttributes } from '@atlaskit/adf-schema';
14
- import { TablePluginState } from '../../../plugins/table/types';
15
18
  import { pluginKey } from '../../../plugins/table/pm-plugins/plugin-key';
16
19
  import tablePlugin from '../../../plugins/table';
17
20
  import TableView from '../../../plugins/table/nodeviews/table';
18
21
  import defaultSchema from '@atlaskit/editor-test-helpers/schema';
19
- import type { EditorProps } from '@atlaskit/editor-core';
20
22
  import { EditorView } from 'prosemirror-view';
21
23
  import { hoverRows } from '../../../plugins/table/commands';
22
24
 
23
25
  describe('table -> nodeviews -> table.tsx', () => {
24
- const createEditor = createEditorFactory<TablePluginState>();
25
- const createTableNode = (attrs?: TableAttributes) => (...args: any) =>
26
- table(attrs)(...args)(defaultSchema);
27
-
28
- const editor = (doc: DocBuilder, props?: EditorProps) =>
29
- createEditor({
30
- doc,
31
- editorProps: {
32
- allowTables: false,
33
- dangerouslyAppendPlugins: {
34
- __plugins: [tablePlugin()],
35
- },
36
- ...props,
37
- },
38
- pluginKey,
39
- });
40
-
41
- afterEach(() => {
42
- jest.clearAllMocks();
43
- });
26
+ const createEditor = createProsemirrorEditorFactory();
27
+ const createTableNode =
28
+ (attrs?: TableAttributes) =>
29
+ (...args: any) =>
30
+ table(attrs)(...args)(defaultSchema);
44
31
 
45
32
  describe('TableView', () => {
46
33
  describe('with tableRenderOptimization', () => {
34
+ const editor = (doc: DocBuilder) =>
35
+ createEditor({
36
+ doc,
37
+ preset: new Preset<LightEditorPlugin>().add([
38
+ tablePlugin,
39
+ {
40
+ tableOptions: {},
41
+ getEditorFeatureFlags: () => ({
42
+ tableRenderOptimization: true,
43
+ }),
44
+ },
45
+ ]),
46
+ pluginKey,
47
+ });
48
+
47
49
  describe('on view update', () => {
48
50
  let tableNode: PMNode,
49
51
  tableNodeView: TableView,
@@ -58,9 +60,6 @@ describe('table -> nodeviews -> table.tsx', () => {
58
60
  p('text'),
59
61
  table()(tr(tdCursor, tdEmpty), tr(tdEmpty, tdEmpty)),
60
62
  ),
61
- {
62
- featureFlags: { tableRenderOptimization: true },
63
- },
64
63
  );
65
64
  view = editorView;
66
65
  tableNodeView = new TableView({
@@ -1,4 +1,8 @@
1
- import { createEditorFactory } from '@atlaskit/editor-test-helpers/create-editor';
1
+ import {
2
+ createProsemirrorEditorFactory,
3
+ LightEditorPlugin,
4
+ Preset,
5
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
2
6
  import {
3
7
  doc,
4
8
  DocBuilder,
@@ -8,20 +12,19 @@ import {
8
12
  tr,
9
13
  } from '@atlaskit/editor-test-helpers/doc-builder';
10
14
  import { pluginKey } from '../../../plugins/table/pm-plugins/plugin-key';
11
- import { TablePluginState } from '../../../plugins/table/types';
15
+ import tablePlugin from '../../../plugins/table-plugin';
12
16
 
13
17
  describe('table/safari-delete-composition-text-issue-workaround', () => {
14
18
  let editor: any;
15
19
  beforeEach(() => {
16
- const createEditor = createEditorFactory<TablePluginState>();
20
+ const createEditor = createProsemirrorEditorFactory();
17
21
  editor = (doc: DocBuilder) =>
18
22
  createEditor({
19
23
  doc,
20
- editorProps: {
21
- allowTables: {
22
- allowColumnResizing: true,
23
- },
24
- },
24
+ preset: new Preset<LightEditorPlugin>().add([
25
+ tablePlugin,
26
+ { tableOptions: { allowColumnResizing: true } },
27
+ ]),
25
28
  pluginKey,
26
29
  });
27
30
  });
@@ -361,10 +361,9 @@ describe('TableRowNodeView', () => {
361
361
  }
362
362
 
363
363
  function mockScrollPositions(tableRowDom: HTMLTableRowElement) {
364
- const { tableWrapper, tableParent, scrollContainer } = getTableElements(
365
- tableRowDom,
366
- );
367
- ((findOverflowScrollParent as unknown) as jest.SpyInstance).mockReturnValue(
364
+ const { tableWrapper, tableParent, scrollContainer } =
365
+ getTableElements(tableRowDom);
366
+ (findOverflowScrollParent as unknown as jest.SpyInstance).mockReturnValue(
368
367
  scrollContainer,
369
368
  );
370
369
 
@@ -409,11 +408,11 @@ describe('TableRowNodeView', () => {
409
408
  contentDOM={
410
409
  disableContentDomMock
411
410
  ? jest.fn()
412
- : (wrapper: HTMLElement | null) => {
411
+ : (table: HTMLElement | null) => {
413
412
  const node = editorView.dom.getElementsByTagName('table')[0];
414
413
 
415
- if (!wrapper?.firstChild) {
416
- wrapper?.appendChild(node);
414
+ if (!table?.firstChild) {
415
+ table?.appendChild(node);
417
416
  }
418
417
  }
419
418
  }
@@ -439,8 +438,8 @@ describe('TableRowNodeView', () => {
439
438
  expect(sentinelBottom).toBeTruthy();
440
439
  });
441
440
 
442
- describe('updates sticky header state', () => {
443
- it('top sentinel does nothing if the rootBounds has height 0', () => {
441
+ describe('updates sticky header', () => {
442
+ it('does not update sticky header if trigger is sentinel top in confluence preview mode', () => {
444
443
  renderTableComponent();
445
444
  const sentinelTop = screen.getByTestId('sticky-sentinel-top');
446
445
 
@@ -454,7 +453,7 @@ describe('TableRowNodeView', () => {
454
453
  expect(updateStickyState).not.toHaveBeenCalled();
455
454
  });
456
455
 
457
- it('bottom sentinel does nothing if the rootBounds has height 0', () => {
456
+ it('does not update sticky header if trigger is sentinel bottom in confluence preview mode', () => {
458
457
  renderTableComponent();
459
458
  const sentinelBottom = screen.getByTestId('sticky-sentinel-bottom');
460
459
  triggerElementIntersect({
@@ -467,7 +466,7 @@ describe('TableRowNodeView', () => {
467
466
  expect(updateStickyState).not.toHaveBeenCalled();
468
467
  });
469
468
 
470
- it('updates sticky header when top of sticky header sentinel leaves scroll area', () => {
469
+ it('updates sticky header when sentinel is below scroll area', () => {
471
470
  renderTableComponent();
472
471
  const sentinelTop = screen.getByTestId('sticky-sentinel-top');
473
472
 
@@ -502,7 +501,7 @@ describe('TableRowNodeView', () => {
502
501
  );
503
502
  });
504
503
 
505
- it('updates sticky header when bottom of sticky header sentinel enters or leaves scroll area', () => {
504
+ it('updates sticky header when sentinel is above scroll area', () => {
506
505
  renderTableComponent();
507
506
  const sentinelBottom = screen.getByTestId('sticky-sentinel-bottom');
508
507
 
@@ -3,7 +3,11 @@ import {
3
3
  getToolbarCellOptionsConfig,
4
4
  } from '../../plugins/table/toolbar';
5
5
  import { ToolbarMenuConfig, ToolbarMenuState } from '../../plugins/table/types';
6
- import { createEditorState } from '@atlaskit/editor-test-helpers/create-editor-state';
6
+ import {
7
+ createProsemirrorEditorFactory,
8
+ LightEditorPlugin,
9
+ Preset,
10
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
7
11
  import {
8
12
  doc,
9
13
  p,
@@ -19,6 +23,8 @@ import type {
19
23
  import { splitCell } from '@atlaskit/editor-tables/utils';
20
24
  import { canMergeCells } from '../../plugins/table/transforms';
21
25
  import { Rect } from '@atlaskit/editor-tables/table-map';
26
+ import tablePlugin from '../../plugins/table';
27
+ import { pluginKey } from '../../plugins/table/pm-plugins/plugin-key';
22
28
 
23
29
  jest.mock('@atlaskit/editor-tables/utils');
24
30
  jest.mock('../../plugins/table/transforms');
@@ -131,7 +137,14 @@ describe('getToolbarMenuConfig', () => {
131
137
  });
132
138
 
133
139
  describe('getToolbarCellOptionsConfig', () => {
134
- const state = createEditorState(doc(table()(row(td()(p('1{cursor}'))))));
140
+ const createEditor = createProsemirrorEditorFactory();
141
+ const {
142
+ editorView: { state },
143
+ } = createEditor({
144
+ doc: doc(table()(row(td()(p('1{cursor}'))))),
145
+ preset: new Preset<LightEditorPlugin>().add(tablePlugin),
146
+ pluginKey,
147
+ });
135
148
  const getEditorContainerWidth = () => ({ width: 500 });
136
149
 
137
150
  const formatMessage: (t: { id: string }) => string = (message) =>
@@ -187,7 +200,7 @@ describe('getToolbarCellOptionsConfig', () => {
187
200
  });
188
201
 
189
202
  it('should have enabled merge cells when multiple cells are selected', () => {
190
- ((canMergeCells as Function) as jest.Mock<{}>).mockImplementation(
203
+ (canMergeCells as Function as jest.Mock<{}>).mockImplementation(
191
204
  () => () => true,
192
205
  );
193
206
  //
@@ -211,8 +224,8 @@ describe('getToolbarCellOptionsConfig', () => {
211
224
  });
212
225
 
213
226
  it('should have enabled split cell when cell can be splitted', () => {
214
- ((splitCell as Function) as jest.Mock<{}>).mockImplementation(() => () =>
215
- true,
227
+ (splitCell as Function as jest.Mock<{}>).mockImplementation(
228
+ () => () => true,
216
229
  );
217
230
  //
218
231
  const cellOptionsMenu = getToolbarCellOptionsConfig(
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { EditorView } from 'prosemirror-view';
4
+ import { createIntl } from 'react-intl-next';
5
+ import {
6
+ createProsemirrorEditorFactory,
7
+ LightEditorPlugin,
8
+ Preset,
9
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
10
+ import {
11
+ doc,
12
+ p,
13
+ table,
14
+ tdCursor,
15
+ tdEmpty,
16
+ th,
17
+ tr,
18
+ } from '@atlaskit/editor-test-helpers/doc-builder';
19
+ import tablePlugin from '../../../plugins/table-plugin';
20
+
21
+ import { ContextualMenu } from '../../../plugins/table/ui/FloatingContextualMenu/ContextualMenu';
22
+
23
+ describe('ContextualMenu', () => {
24
+ const getEditorContainerWidth = () => ({ width: 500 });
25
+ const createEditor = createProsemirrorEditorFactory();
26
+ describe('with right table cell position in plugin state', () => {
27
+ let editorView: EditorView;
28
+ beforeEach(() => {
29
+ ({ editorView } = createEditor({
30
+ doc: doc(table()(tr(th()(p('')), th()(p(''))), tr(tdCursor, tdEmpty))),
31
+ preset: new Preset<LightEditorPlugin>().add([
32
+ tablePlugin,
33
+ { tableOptions: { advanced: true } },
34
+ ]),
35
+ }));
36
+ });
37
+
38
+ it('should render contextual menu when no tableCellPosition is passed but exist on editor state ', () => {
39
+ const intl = createIntl({ locale: 'en' });
40
+ render(
41
+ <ContextualMenu
42
+ intl={intl}
43
+ editorView={editorView}
44
+ isOpen
45
+ selectionRect={{ bottom: 0, left: 0, right: 0, top: 0 }}
46
+ getEditorContainerWidth={getEditorContainerWidth}
47
+ />,
48
+ );
49
+
50
+ expect(
51
+ screen.getByTestId('table-cell-contextual-menu'),
52
+ ).toBeInTheDocument();
53
+ });
54
+ });
55
+ });
@@ -2,7 +2,11 @@ import React from 'react';
2
2
  import { fireEvent, render, screen } from '@testing-library/react';
3
3
  import { IntlProvider } from 'react-intl-next';
4
4
  import { isTableSelected } from '@atlaskit/editor-tables/utils';
5
- import { createEditorFactory } from '@atlaskit/editor-test-helpers/create-editor';
5
+ import {
6
+ createProsemirrorEditorFactory,
7
+ LightEditorPlugin,
8
+ Preset,
9
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
6
10
  import {
7
11
  doc,
8
12
  table,
@@ -11,22 +15,18 @@ import {
11
15
  DocBuilder,
12
16
  } from '@atlaskit/editor-test-helpers/doc-builder';
13
17
 
14
- import { TablePluginState } from '../../../plugins/table/types';
15
18
  import { CornerControls } from '../../../plugins/table/ui/TableFloatingControls/CornerControls';
16
19
  import { getPluginState } from '../../../plugins/table/pm-plugins/plugin-factory';
17
20
  import { pluginKey } from '../../../plugins/table/pm-plugins/plugin-key';
18
21
  import tablePlugin from '../../../plugins/table-plugin';
19
22
 
20
23
  describe('CornerControls', () => {
21
- const createEditor = createEditorFactory<TablePluginState>();
24
+ const createEditor = createProsemirrorEditorFactory();
22
25
 
23
26
  const editor = (doc: DocBuilder) =>
24
27
  createEditor({
25
28
  doc,
26
- editorProps: {
27
- allowTables: false,
28
- dangerouslyAppendPlugins: { __plugins: [tablePlugin()] },
29
- },
29
+ preset: new Preset<LightEditorPlugin>().add(tablePlugin),
30
30
  pluginKey,
31
31
  });
32
32
 
@@ -1,9 +1,14 @@
1
- import { ReactWrapper } from 'enzyme';
2
- import { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';
1
+ import * as prosemirrorUtils from 'prosemirror-utils';
2
+ import type { ContentNodeWithPos } from 'prosemirror-utils';
3
+ import { render, screen } from '@testing-library/react';
4
+ import { IntlProvider } from 'react-intl-next';
3
5
  import { EditorView } from 'prosemirror-view';
4
6
  import React from 'react';
5
- import { createEditorFactory } from '@atlaskit/editor-test-helpers/create-editor';
6
- import { mountWithIntl } from '@atlaskit/editor-test-helpers/enzyme';
7
+ import {
8
+ createProsemirrorEditorFactory,
9
+ LightEditorPlugin,
10
+ Preset,
11
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
7
12
  import {
8
13
  doc,
9
14
  table,
@@ -14,29 +19,23 @@ import {
14
19
  DocBuilder,
15
20
  } from '@atlaskit/editor-test-helpers/doc-builder';
16
21
  import { UIAnalyticsEvent } from '@atlaskit/analytics-next';
17
- import { TablePluginState } from '../../../plugins/table/types';
18
22
  import FloatingContextualButton, {
19
23
  Props as FloatingContextualButtonProps,
20
- FloatingContextualButtonInner,
21
24
  } from '../../../plugins/table/ui/FloatingContextualButton';
22
25
  import tablePlugin from '../../../plugins/table-plugin';
23
26
 
24
- describe('Floating Contextual Button', () => {
25
- const createEditor = createEditorFactory<TablePluginState>();
26
- let createAnalyticsEvent = jest.fn(() => ({ fire() {} } as UIAnalyticsEvent));
27
- const editor = (doc: DocBuilder) =>
28
- createEditor({
29
- doc,
30
- editorProps: {
31
- allowTables: false,
32
- dangerouslyAppendPlugins: { __plugins: [tablePlugin()] },
33
- },
34
- createAnalyticsEvent,
35
- });
27
+ const createEditor = createProsemirrorEditorFactory();
28
+ let createAnalyticsEvent = jest.fn(() => ({ fire() {} } as UIAnalyticsEvent));
29
+ const editor = (doc: DocBuilder) =>
30
+ createEditor({
31
+ doc,
32
+ preset: new Preset<LightEditorPlugin>().add(tablePlugin),
33
+ });
36
34
 
37
- let wrapper: ReactWrapper<FloatingContextualButtonProps>;
35
+ describe('Floating Contextual Button', () => {
38
36
  let editorView: EditorView;
39
37
  let refs: { [name: string]: number };
38
+ let tableNode: ContentNodeWithPos | undefined;
40
39
 
41
40
  beforeEach(() => {
42
41
  ({ editorView, refs } = editor(
@@ -49,47 +48,44 @@ describe('Floating Contextual Button', () => {
49
48
  ),
50
49
  ));
51
50
 
52
- const tableNode = findParentNodeOfTypeClosestToPos(
51
+ tableNode = prosemirrorUtils.findParentNodeOfTypeClosestToPos(
53
52
  editorView.state.selection.$from,
54
53
  editorView.state.schema.nodes.table,
55
54
  );
55
+ });
56
56
 
57
- wrapper = mountWithIntl(
58
- <FloatingContextualButton
59
- editorView={editorView}
60
- tableNode={tableNode && tableNode.node}
61
- targetCellPosition={refs.firstCell}
62
- dispatchAnalyticsEvent={createAnalyticsEvent}
63
- />,
57
+ const component = (props: FloatingContextualButtonProps) =>
58
+ render(
59
+ <IntlProvider locale="en">
60
+ <FloatingContextualButton
61
+ tableNode={tableNode && tableNode.node}
62
+ dispatchAnalyticsEvent={createAnalyticsEvent}
63
+ {...props}
64
+ />
65
+ </IntlProvider>,
64
66
  );
65
- });
66
67
 
67
68
  describe('when an error is thrown in the component', () => {
68
- it('handles it gracefully', () => {
69
- const buttonWrapper = wrapper.find(FloatingContextualButtonInner);
70
- expect(() =>
71
- buttonWrapper.simulateError(new Error('Oh no!')),
72
- ).not.toThrow();
69
+ it('renders', () => {
70
+ component({
71
+ editorView,
72
+ targetCellPosition: refs.firstCell,
73
+ });
74
+
75
+ expect(screen.getByLabelText('Cell options')).toBeInTheDocument();
73
76
  });
74
77
 
75
78
  it('dispatches an analytics event', () => {
76
- wrapper
77
- .find(FloatingContextualButtonInner)
78
- .simulateError(new Error('Oh no!'));
79
- expect(createAnalyticsEvent).toHaveBeenCalledWith({
80
- action: 'unhandledErrorCaught',
81
- actionSubject: 'floatingContextualButton',
82
- eventType: 'operational',
83
- attributes: {
84
- error: new Error('Oh no!'),
85
- errorInfo: expect.objectContaining({
86
- componentStack: expect.stringContaining(
87
- 'in FloatingContextualButton',
88
- ),
89
- }),
90
- errorRethrown: false,
91
- },
79
+ const mock = jest.spyOn(prosemirrorUtils, 'findDomRefAtPos');
80
+ mock.mockImplementation(() => {
81
+ throw new Error('Error message from mock');
92
82
  });
83
+ component({
84
+ editorView,
85
+ targetCellPosition: refs.firstCell,
86
+ });
87
+
88
+ expect(createAnalyticsEvent).toHaveBeenCalled();
93
89
  });
94
90
  });
95
91
  });
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { EditorView } from 'prosemirror-view';
4
+ import { IntlProvider } from 'react-intl-next';
5
+ import {
6
+ createProsemirrorEditorFactory,
7
+ LightEditorPlugin,
8
+ Preset,
9
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
10
+ import {
11
+ doc,
12
+ p,
13
+ table,
14
+ tdCursor,
15
+ tdEmpty,
16
+ th,
17
+ tr,
18
+ } from '@atlaskit/editor-test-helpers/doc-builder';
19
+
20
+ import { getPluginState } from '../../../plugins/table/pm-plugins/plugin-factory';
21
+ import FloatingContextualMenu from '../../../plugins/table/ui/FloatingContextualMenu';
22
+ import tablePlugin from '../../../plugins/table-plugin';
23
+
24
+ describe('FloatingContextualMenu', () => {
25
+ const createEditor = createProsemirrorEditorFactory();
26
+ describe('with right position in plugin state', () => {
27
+ let editorView: EditorView;
28
+ beforeEach(() => {
29
+ ({ editorView } = createEditor({
30
+ doc: doc(table()(tr(th()(p('')), th()(p(''))), tr(tdCursor, tdEmpty))),
31
+ preset: new Preset<LightEditorPlugin>().add(tablePlugin),
32
+ }));
33
+ });
34
+
35
+ it('should render floating contextual menu when no tableCellPosition is passed but exist on editor state ', () => {
36
+ render(
37
+ <IntlProvider locale="en">
38
+ <FloatingContextualMenu
39
+ editorView={editorView}
40
+ isOpen
41
+ pluginConfig={getPluginState(editorView.state).pluginConfig}
42
+ getEditorContainerWidth={jest.fn()}
43
+ />
44
+ </IntlProvider>,
45
+ );
46
+ expect(screen.getAllByLabelText('Popup').length).toBeGreaterThan(0);
47
+ });
48
+ });
49
+ });
@@ -9,10 +9,10 @@ import {
9
9
  DocBuilder,
10
10
  } from '@atlaskit/editor-test-helpers/doc-builder';
11
11
  import { selectColumns, selectRows } from '@atlaskit/editor-test-helpers/table';
12
- import { selectTable } from '@atlaskit/editor-tables/utils';
12
+ import { selectTable, getCellsInColumn } from '@atlaskit/editor-tables/utils';
13
13
  import { EditorView } from 'prosemirror-view';
14
14
  import React from 'react';
15
- import { render, screen } from '@testing-library/react';
15
+ import { render, screen, fireEvent } from '@testing-library/react';
16
16
  import { IntlProvider } from 'react-intl-next';
17
17
  import {
18
18
  TablePluginState,
@@ -134,4 +134,32 @@ describe('Floating Delete Button', () => {
134
134
  expect(screen.getAllByLabelText('Delete row').length).toBe(1);
135
135
  });
136
136
  });
137
+ describe('when deleting with the delete button', () => {
138
+ describe('Columns', () => {
139
+ it('should move cursor within the table after delete', () => {
140
+ selectColumns([0, 1])(editorView.state, editorView.dispatch);
141
+ component({ selection: editorView.state.selection, editorView });
142
+ const { tr } = editorView.state;
143
+ const { pos } = getCellsInColumn(2)(tr.selection)![2];
144
+ const lastCellPos = tr.doc.resolve(pos).pos + 1;
145
+ fireEvent.click(screen.getByLabelText('Delete column'));
146
+ expect(editorView.state.selection.from).toBeLessThanOrEqual(
147
+ lastCellPos,
148
+ );
149
+ });
150
+ });
151
+ describe('Rows', () => {
152
+ it('should move cursor within the table after delete', () => {
153
+ selectRows([0, 1])(editorView.state, editorView.dispatch);
154
+ component({ selection: editorView.state.selection, editorView });
155
+ const { tr } = editorView.state;
156
+ const { pos } = getCellsInColumn(2)(tr.selection)![2];
157
+ const lastCellPos = tr.doc.resolve(pos).pos + 1;
158
+ fireEvent.click(screen.getByLabelText('Delete row'));
159
+ expect(editorView.state.selection.from).toBeLessThanOrEqual(
160
+ lastCellPos,
161
+ );
162
+ });
163
+ });
164
+ });
137
165
  });