ember-headless-table 2.1.2 → 2.1.4

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.
@@ -35,7 +35,18 @@ declare class ResizeHandle extends Modifier<{
35
35
  setup: () => void;
36
36
  setPosition: (event: Event) => void;
37
37
  setStartPosition: (event: Event) => void;
38
- queueUpdate: () => void;
38
+ /**
39
+ * queueUpdate takes an optional function argument that is called
40
+ * in the requestAnimationFrame callback _after_ the resize function.
41
+ *
42
+ * We can use this to ensure that preferences are only ever saved after
43
+ * we have completed column resizing.
44
+ *
45
+ * Because the requestAnimationFrame 'hides' these function calls from the
46
+ * the ember test waiter, we also ensure that we track them by also cancelling
47
+ * the waiter in the requestAnimationFrame callback.
48
+ */
49
+ queueUpdate: (callback?: () => void) => void;
39
50
  dragEndHandler: () => void;
40
51
  dragMove: (event: Event) => void;
41
52
  dragStartHandler: (event: Event) => void;
@@ -76,21 +76,36 @@ class ResizeHandle extends Modifier {
76
76
  this.pointerStartY = event.clientY;
77
77
  }
78
78
  });
79
- _defineProperty(this, "queueUpdate", () => {
80
- cancelAnimationFrame(this.dragFrame);
79
+ /**
80
+ * queueUpdate takes an optional function argument that is called
81
+ * in the requestAnimationFrame callback _after_ the resize function.
82
+ *
83
+ * We can use this to ensure that preferences are only ever saved after
84
+ * we have completed column resizing.
85
+ *
86
+ * Because the requestAnimationFrame 'hides' these function calls from the
87
+ * the ember test waiter, we also ensure that we track them by also cancelling
88
+ * the waiter in the requestAnimationFrame callback.
89
+ */
90
+ _defineProperty(this, "queueUpdate", callback => {
91
+ if (this.dragFrame) {
92
+ cancelAnimationFrame(this.dragFrame);
93
+ }
81
94
  this.dragFrame = requestAnimationFrame(() => {
82
95
  this.meta.resize(this.pointerX - this.pointerStartX);
83
96
  this.pointerStartX = this.pointerX;
97
+ if (callback) {
98
+ callback();
99
+ }
100
+ if (this.token) {
101
+ waiter.endAsync(this.token);
102
+ this.token = undefined;
103
+ }
84
104
  });
85
105
  });
86
106
  _defineProperty(this, "dragEndHandler", () => {
87
107
  this.meta.isResizing = false;
88
- this.queueUpdate();
89
- if (this.token) {
90
- waiter.endAsync(this.token);
91
- this.token = undefined;
92
- }
93
- this.meta.save();
108
+ this.queueUpdate(this.meta.save);
94
109
 
95
110
  /**
96
111
  * No need to listen if we aren't dragging
@@ -1 +1 @@
1
- {"version":3,"file":"handle.js","sources":["../../../src/plugins/column-resizing/handle.ts"],"sourcesContent":["import { registerDestructor } from '@ember/destroyable';\nimport { buildWaiter } from '@ember/test-waiters';\n\nimport Modifier from 'ember-modifier';\n\nimport { meta } from '../-private/base';\nimport { ColumnResizing } from './plugin';\n\nimport type { ColumnMeta } from './plugin';\nimport type { Column } from '#/column';\n\nlet waiter = buildWaiter('ColumnResizing#ResizeHandle');\n\n/**\n * - why are mouse events used instead of drag events?\n * - why not use the \"draggable\" attribute?\n *\n * It seems drag events are more for files and/or moving images around on a page\n * dragging an image, for example, has a ghost of that image until it is dropped.\n * The same thing happens with text.\n * This prevents us from having total control of the styling of how dragging works.\n *\n *\n *\n */\n\nclass ResizeHandle extends Modifier<{ Args: { Positional: [Column] } }> {\n declare dragHandle: HTMLElement;\n declare column: Column;\n declare meta: ColumnMeta;\n\n // Pointer\n pointerStartX = 0;\n pointerStartY = 0;\n pointerX = 0;\n pointerY = 0;\n declare dragFrame: number;\n\n // Keyboard\n keyDistance = 0;\n declare keyFrame: number; // ha\n declare lastKey: number;\n\n // waiter\n token?: unknown;\n\n isSetup = false;\n modify(element: Element, [column]: [Column]) {\n this.column = column;\n this.meta = meta.forColumn(column, ColumnResizing);\n this.dragHandle = element as HTMLElement;\n\n if (!this.isSetup) {\n this.isSetup = true;\n this.setup();\n }\n }\n\n setup = () => {\n this.dragHandle.addEventListener('touchstart', this.dragStartHandler);\n this.dragHandle.addEventListener('mousedown', this.dragStartHandler);\n this.dragHandle.addEventListener('keydown', this.keyHandler);\n\n registerDestructor(this, () => {\n this.meta.isResizing = false;\n\n if (this.token) {\n waiter.endAsync(this.token);\n this.token = undefined;\n }\n\n this.dragHandle.removeEventListener('touchstart', this.dragStartHandler);\n this.dragHandle.removeEventListener('mousedown', this.dragStartHandler);\n window.removeEventListener('touchmove', this.dragMove);\n window.removeEventListener('touchend', this.dragEndHandler);\n window.removeEventListener('mousemove', this.dragMove);\n window.removeEventListener('mouseup', this.dragEndHandler);\n this.dragHandle.removeEventListener('keydown', this.keyHandler);\n });\n };\n\n setPosition = (event: Event) => {\n if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;\n\n if ('TouchEvent' in window && event instanceof TouchEvent) {\n let firstTouch = event.touches[0];\n\n if (!firstTouch) return;\n\n this.pointerX = firstTouch.clientX;\n this.pointerY = firstTouch.clientY;\n } else {\n this.pointerX = event.clientX;\n this.pointerY = event.clientY;\n }\n };\n\n setStartPosition = (event: Event) => {\n if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;\n\n if ('TouchEvent' in window && event instanceof TouchEvent) {\n let firstTouch = event.touches[0];\n\n if (!firstTouch) return;\n\n this.pointerStartX = firstTouch.clientX;\n this.pointerStartY = firstTouch.clientY;\n } else {\n this.pointerStartX = event.clientX;\n this.pointerStartY = event.clientY;\n }\n };\n\n queueUpdate = () => {\n cancelAnimationFrame(this.dragFrame);\n this.dragFrame = requestAnimationFrame(() => {\n this.meta.resize(this.pointerX - this.pointerStartX);\n this.pointerStartX = this.pointerX;\n });\n };\n\n dragEndHandler = () => {\n this.meta.isResizing = false;\n this.queueUpdate();\n\n if (this.token) {\n waiter.endAsync(this.token);\n this.token = undefined;\n }\n\n this.meta.save();\n\n /**\n * No need to listen if we aren't dragging\n */\n window.removeEventListener('touchmove', this.dragMove);\n window.removeEventListener('touchend', this.dragEndHandler);\n window.removeEventListener('mousemove', this.dragMove);\n window.removeEventListener('mouseup', this.dragEndHandler);\n };\n\n dragMove = (event: Event) => {\n if (!this.meta.isResizing) return;\n this.setPosition(event);\n this.queueUpdate();\n };\n\n dragStartHandler = (event: Event) => {\n if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;\n\n this.meta.isResizing = true;\n if (event.target !== this.dragHandle) return;\n\n if (this.token) {\n waiter.endAsync(this.token);\n }\n\n this.token = waiter.beginAsync();\n\n this.setPosition(event);\n this.setStartPosition(event);\n\n window.addEventListener('touchend', this.dragEndHandler);\n window.addEventListener('touchmove', this.dragMove);\n window.addEventListener('mousemove', this.dragMove);\n window.addEventListener('mouseup', this.dragEndHandler);\n };\n\n keyHandler = (event: KeyboardEvent) => {\n let deltaT = new Date().getTime() - this.lastKey;\n let isRapid = deltaT < 50;\n\n if (event.code === 'ArrowDown' || event.code === 'ArrowRight') {\n this.keyDistance += isRapid ? 8 : 1;\n this.lastKey = new Date().getTime();\n }\n\n if (event.code === 'ArrowUp' || event.code === 'ArrowLeft') {\n this.keyDistance -= isRapid ? 8 : 1;\n this.lastKey = new Date().getTime();\n }\n\n cancelAnimationFrame(this.keyFrame);\n this.keyFrame = requestAnimationFrame(() => {\n this.meta.resize(this.keyDistance);\n\n this.keyDistance = 0;\n });\n };\n}\n\n/**\n * Modifier to attach to the column resize handles.\n * This provides both keyboard and mouse support for resizing columns.\n * (provided the resize handle element is focusable -- so consider using\n * a button for the resize element)\n *\n * @example\n * ```js\n * import Component from '@glimmer/component';\n * import { meta } from 'ember-headless-table/plugins';\n * import { resizeHandle, ColumnResizing } from 'ember-headless-table/plugins/column-resizing';\n *\n * export default class TableHead extends Component {\n * /* ✂️ *\\/\n *\n * <template>\n * <thead>\n * <tr>\n * {{#each this.columns as |column|}}\n * <th>\n * <span>{{column.name}}</span>\n * <button {{resizeHandle column}}></button>\n * </th>\n * {{/each}}\n * </tr>\n * </thead>\n * </template>\n * }\n * ```\n *\n * Width and isResizing state is maintained on the \"meta\"\n * class so that the users may choose per-column stylings for\n * isResizing and dragging behaviors.\n *\n * For example, while dragging, the user may add a class based on the\n * isDragging property.\n *\n * @example\n * ```js\n * import Component from '@glimmer/component';\n * import { meta } from 'ember-headless-table/plugins';\n * import { resizeHandle, ColumnResizing } from 'ember-headless-table/plugins/column-resizing';\n *\n * export default class TableHead extends Component {\n * /* ✂️ *\\/\n *\n * isDragging = (column) => {\n * return meta.forColumn(column, ColumnResizing).isDragging;\n * }\n *\n * <template>\n * <thead>\n * <tr>\n * {{#each this.columns as |column|}}\n * <th class=\"header {{if (this.isDragging column) 'blue'}}\">\n * <span>{{column.name}}</span>\n * <button {{resizeHandle column}}></button>\n * </th>\n * {{/each}}\n * </tr>\n * </thead>\n * </template>\n * }\n * ```\n *\n *\n * @note\n * The logic here is copied from the drag slider in\n * https://limber.glimdown.com/\n * See: \"resize-handle\" on Limber's GitHub\n */\nexport const resizeHandle = ResizeHandle;\n"],"names":["waiter","buildWaiter","ResizeHandle","Modifier","constructor","args","_defineProperty","dragHandle","addEventListener","dragStartHandler","keyHandler","registerDestructor","meta","isResizing","token","endAsync","undefined","removeEventListener","window","dragMove","dragEndHandler","event","PointerEvent","MouseEvent","TouchEvent","firstTouch","touches","pointerX","clientX","pointerY","clientY","pointerStartX","pointerStartY","cancelAnimationFrame","dragFrame","requestAnimationFrame","resize","queueUpdate","save","setPosition","target","beginAsync","setStartPosition","deltaT","Date","getTime","lastKey","isRapid","code","keyDistance","keyFrame","modify","element","column","forColumn","ColumnResizing","isSetup","setup","resizeHandle"],"mappings":"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"}
1
+ {"version":3,"file":"handle.js","sources":["../../../src/plugins/column-resizing/handle.ts"],"sourcesContent":["import { registerDestructor } from '@ember/destroyable';\nimport { buildWaiter } from '@ember/test-waiters';\n\nimport Modifier from 'ember-modifier';\n\nimport { meta } from '../-private/base';\nimport { ColumnResizing } from './plugin';\n\nimport type { ColumnMeta } from './plugin';\nimport type { Column } from '#/column';\n\nlet waiter = buildWaiter('ColumnResizing#ResizeHandle');\n\n/**\n * - why are mouse events used instead of drag events?\n * - why not use the \"draggable\" attribute?\n *\n * It seems drag events are more for files and/or moving images around on a page\n * dragging an image, for example, has a ghost of that image until it is dropped.\n * The same thing happens with text.\n * This prevents us from having total control of the styling of how dragging works.\n *\n *\n *\n */\n\nclass ResizeHandle extends Modifier<{ Args: { Positional: [Column] } }> {\n declare dragHandle: HTMLElement;\n declare column: Column;\n declare meta: ColumnMeta;\n\n // Pointer\n pointerStartX = 0;\n pointerStartY = 0;\n pointerX = 0;\n pointerY = 0;\n declare dragFrame: number;\n\n // Keyboard\n keyDistance = 0;\n declare keyFrame: number; // ha\n declare lastKey: number;\n\n // waiter\n token?: unknown;\n\n isSetup = false;\n modify(element: Element, [column]: [Column]) {\n this.column = column;\n this.meta = meta.forColumn(column, ColumnResizing);\n this.dragHandle = element as HTMLElement;\n\n if (!this.isSetup) {\n this.isSetup = true;\n this.setup();\n }\n }\n\n setup = () => {\n this.dragHandle.addEventListener('touchstart', this.dragStartHandler);\n this.dragHandle.addEventListener('mousedown', this.dragStartHandler);\n this.dragHandle.addEventListener('keydown', this.keyHandler);\n\n registerDestructor(this, () => {\n this.meta.isResizing = false;\n\n if (this.token) {\n waiter.endAsync(this.token);\n this.token = undefined;\n }\n\n this.dragHandle.removeEventListener('touchstart', this.dragStartHandler);\n this.dragHandle.removeEventListener('mousedown', this.dragStartHandler);\n window.removeEventListener('touchmove', this.dragMove);\n window.removeEventListener('touchend', this.dragEndHandler);\n window.removeEventListener('mousemove', this.dragMove);\n window.removeEventListener('mouseup', this.dragEndHandler);\n this.dragHandle.removeEventListener('keydown', this.keyHandler);\n });\n };\n\n setPosition = (event: Event) => {\n if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;\n\n if ('TouchEvent' in window && event instanceof TouchEvent) {\n let firstTouch = event.touches[0];\n\n if (!firstTouch) return;\n\n this.pointerX = firstTouch.clientX;\n this.pointerY = firstTouch.clientY;\n } else {\n this.pointerX = event.clientX;\n this.pointerY = event.clientY;\n }\n };\n\n setStartPosition = (event: Event) => {\n if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;\n\n if ('TouchEvent' in window && event instanceof TouchEvent) {\n let firstTouch = event.touches[0];\n\n if (!firstTouch) return;\n\n this.pointerStartX = firstTouch.clientX;\n this.pointerStartY = firstTouch.clientY;\n } else {\n this.pointerStartX = event.clientX;\n this.pointerStartY = event.clientY;\n }\n };\n\n /**\n * queueUpdate takes an optional function argument that is called\n * in the requestAnimationFrame callback _after_ the resize function.\n *\n * We can use this to ensure that preferences are only ever saved after\n * we have completed column resizing.\n *\n * Because the requestAnimationFrame 'hides' these function calls from the\n * the ember test waiter, we also ensure that we track them by also cancelling\n * the waiter in the requestAnimationFrame callback.\n */\n queueUpdate = (callback?: () => void) => {\n if (this.dragFrame) {\n cancelAnimationFrame(this.dragFrame);\n }\n\n this.dragFrame = requestAnimationFrame(() => {\n this.meta.resize(this.pointerX - this.pointerStartX);\n this.pointerStartX = this.pointerX;\n\n if (callback) {\n callback();\n }\n\n if (this.token) {\n waiter.endAsync(this.token);\n this.token = undefined;\n }\n });\n };\n\n dragEndHandler = () => {\n this.meta.isResizing = false;\n\n this.queueUpdate(this.meta.save);\n\n /**\n * No need to listen if we aren't dragging\n */\n window.removeEventListener('touchmove', this.dragMove);\n window.removeEventListener('touchend', this.dragEndHandler);\n window.removeEventListener('mousemove', this.dragMove);\n window.removeEventListener('mouseup', this.dragEndHandler);\n };\n\n dragMove = (event: Event) => {\n if (!this.meta.isResizing) return;\n this.setPosition(event);\n this.queueUpdate();\n };\n\n dragStartHandler = (event: Event) => {\n if (!(event instanceof PointerEvent || event instanceof MouseEvent)) return;\n\n this.meta.isResizing = true;\n if (event.target !== this.dragHandle) return;\n\n if (this.token) {\n waiter.endAsync(this.token);\n }\n\n this.token = waiter.beginAsync();\n\n this.setPosition(event);\n this.setStartPosition(event);\n\n window.addEventListener('touchend', this.dragEndHandler);\n window.addEventListener('touchmove', this.dragMove);\n window.addEventListener('mousemove', this.dragMove);\n window.addEventListener('mouseup', this.dragEndHandler);\n };\n\n keyHandler = (event: KeyboardEvent) => {\n let deltaT = new Date().getTime() - this.lastKey;\n let isRapid = deltaT < 50;\n\n if (event.code === 'ArrowDown' || event.code === 'ArrowRight') {\n this.keyDistance += isRapid ? 8 : 1;\n this.lastKey = new Date().getTime();\n }\n\n if (event.code === 'ArrowUp' || event.code === 'ArrowLeft') {\n this.keyDistance -= isRapid ? 8 : 1;\n this.lastKey = new Date().getTime();\n }\n\n cancelAnimationFrame(this.keyFrame);\n this.keyFrame = requestAnimationFrame(() => {\n this.meta.resize(this.keyDistance);\n\n this.keyDistance = 0;\n });\n };\n}\n\n/**\n * Modifier to attach to the column resize handles.\n * This provides both keyboard and mouse support for resizing columns.\n * (provided the resize handle element is focusable -- so consider using\n * a button for the resize element)\n *\n * @example\n * ```js\n * import Component from '@glimmer/component';\n * import { meta } from 'ember-headless-table/plugins';\n * import { resizeHandle, ColumnResizing } from 'ember-headless-table/plugins/column-resizing';\n *\n * export default class TableHead extends Component {\n * /* ✂️ *\\/\n *\n * <template>\n * <thead>\n * <tr>\n * {{#each this.columns as |column|}}\n * <th>\n * <span>{{column.name}}</span>\n * <button {{resizeHandle column}}></button>\n * </th>\n * {{/each}}\n * </tr>\n * </thead>\n * </template>\n * }\n * ```\n *\n * Width and isResizing state is maintained on the \"meta\"\n * class so that the users may choose per-column stylings for\n * isResizing and dragging behaviors.\n *\n * For example, while dragging, the user may add a class based on the\n * isDragging property.\n *\n * @example\n * ```js\n * import Component from '@glimmer/component';\n * import { meta } from 'ember-headless-table/plugins';\n * import { resizeHandle, ColumnResizing } from 'ember-headless-table/plugins/column-resizing';\n *\n * export default class TableHead extends Component {\n * /* ✂️ *\\/\n *\n * isDragging = (column) => {\n * return meta.forColumn(column, ColumnResizing).isDragging;\n * }\n *\n * <template>\n * <thead>\n * <tr>\n * {{#each this.columns as |column|}}\n * <th class=\"header {{if (this.isDragging column) 'blue'}}\">\n * <span>{{column.name}}</span>\n * <button {{resizeHandle column}}></button>\n * </th>\n * {{/each}}\n * </tr>\n * </thead>\n * </template>\n * }\n * ```\n *\n *\n * @note\n * The logic here is copied from the drag slider in\n * https://limber.glimdown.com/\n * See: \"resize-handle\" on Limber's GitHub\n */\nexport const resizeHandle = ResizeHandle;\n"],"names":["waiter","buildWaiter","ResizeHandle","Modifier","constructor","args","_defineProperty","dragHandle","addEventListener","dragStartHandler","keyHandler","registerDestructor","meta","isResizing","token","endAsync","undefined","removeEventListener","window","dragMove","dragEndHandler","event","PointerEvent","MouseEvent","TouchEvent","firstTouch","touches","pointerX","clientX","pointerY","clientY","pointerStartX","pointerStartY","callback","dragFrame","cancelAnimationFrame","requestAnimationFrame","resize","queueUpdate","save","setPosition","target","beginAsync","setStartPosition","deltaT","Date","getTime","lastKey","isRapid","code","keyDistance","keyFrame","modify","element","column","forColumn","ColumnResizing","isSetup","setup","resizeHandle"],"mappings":"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"}
@@ -22,18 +22,11 @@ function createHelpers(selectors) {
22
22
  clientX: targetX,
23
23
  button: 0
24
24
  });
25
- await new Promise(resolve => setTimeout(resolve, 50));
26
25
  triggerEvent(element, 'mouseup', {
27
26
  clientX: targetX,
28
27
  button: 0
29
28
  });
30
29
  await settled();
31
-
32
- /**
33
- * This has been super finnicky... :(
34
- */
35
- await new Promise(resolve => setTimeout(resolve, 100));
36
- await requestAnimationFrameSettled();
37
30
  }
38
31
  function horizontalScrollElement() {
39
32
  assert(`Can't use scrollRight/swipeLeft helpers without a \`scrollContainer\` selector`, selectors.scrollContainer);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/test-support/index.ts"],"sourcesContent":["import { assert } from '@ember/debug';\nimport { find, settled, triggerEvent } from '@ember/test-helpers';\n\ninterface Selectors {\n resizeHandle?: string;\n scrollContainer?: string;\n}\n\nexport function createHelpers(selectors: Selectors) {\n async function resize(parent: Element, delta: number) {\n assert(\n `Can't use the dragLeft/dragRight/resize helpers without a \\`resizeHandle\\` selector`,\n selectors.resizeHandle\n );\n\n let element = parent.querySelector(selectors.resizeHandle);\n\n assert(`Can't resize without a handle`, element);\n\n /**\n * Start the click in exactly the middle of the element.\n * \"startX\" is the horizontal middle of \"element\"\n */\n let rect = element.getBoundingClientRect();\n let startX = (rect.right + rect.left) / 2;\n\n let targetX = startX + delta;\n\n triggerEvent(element, 'mousedown', { clientX: startX, button: 0 });\n triggerEvent(element, 'mousemove', { clientX: targetX, button: 0 });\n\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n triggerEvent(element, 'mouseup', { clientX: targetX, button: 0 });\n\n await settled();\n\n /**\n * This has been super finnicky... :(\n */\n await new Promise((resolve) => setTimeout(resolve, 100));\n await requestAnimationFrameSettled();\n }\n\n function horizontalScrollElement() {\n assert(\n `Can't use scrollRight/swipeLeft helpers without a \\`scrollContainer\\` selector`,\n selectors.scrollContainer\n );\n\n let element = find(selectors.scrollContainer);\n\n assert(`scroll container not found`, element instanceof HTMLElement);\n\n return element;\n }\n\n async function scrollRight(distance: number) {\n let element = horizontalScrollElement();\n\n element.scrollLeft += distance;\n await requestAnimationFrameSettled();\n }\n\n async function scrollLeft(distance: number) {\n let element = horizontalScrollElement();\n\n element.scrollLeft -= distance;\n await requestAnimationFrameSettled();\n }\n\n return {\n dragLeft: (column: Element, amount: number) => resize(column, -amount),\n dragRight: (column: Element, amount: number) => resize(column, amount),\n scrollLeft,\n scrollRight,\n swipeLeft: scrollRight,\n swipeRight: scrollLeft,\n };\n}\n\nexport async function requestAnimationFrameSettled() {\n await new Promise(requestAnimationFrame);\n await settled();\n}\n"],"names":["createHelpers","selectors","resize","parent","delta","assert","resizeHandle","element","querySelector","rect","getBoundingClientRect","startX","right","left","targetX","triggerEvent","clientX","button","Promise","resolve","setTimeout","settled","requestAnimationFrameSettled","horizontalScrollElement","scrollContainer","find","HTMLElement","scrollRight","distance","scrollLeft","dragLeft","column","amount","dragRight","swipeLeft","swipeRight","requestAnimationFrame"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/test-support/index.ts"],"sourcesContent":["import { assert } from '@ember/debug';\nimport { find, settled, triggerEvent } from '@ember/test-helpers';\n\ninterface Selectors {\n resizeHandle?: string;\n scrollContainer?: string;\n}\n\nexport function createHelpers(selectors: Selectors) {\n async function resize(parent: Element, delta: number) {\n assert(\n `Can't use the dragLeft/dragRight/resize helpers without a \\`resizeHandle\\` selector`,\n selectors.resizeHandle\n );\n\n let element = parent.querySelector(selectors.resizeHandle);\n\n assert(`Can't resize without a handle`, element);\n\n /**\n * Start the click in exactly the middle of the element.\n * \"startX\" is the horizontal middle of \"element\"\n */\n let rect = element.getBoundingClientRect();\n let startX = (rect.right + rect.left) / 2;\n\n let targetX = startX + delta;\n\n triggerEvent(element, 'mousedown', { clientX: startX, button: 0 });\n triggerEvent(element, 'mousemove', { clientX: targetX, button: 0 });\n triggerEvent(element, 'mouseup', { clientX: targetX, button: 0 });\n\n await settled();\n }\n\n function horizontalScrollElement() {\n assert(\n `Can't use scrollRight/swipeLeft helpers without a \\`scrollContainer\\` selector`,\n selectors.scrollContainer\n );\n\n let element = find(selectors.scrollContainer);\n\n assert(`scroll container not found`, element instanceof HTMLElement);\n\n return element;\n }\n\n async function scrollRight(distance: number) {\n let element = horizontalScrollElement();\n\n element.scrollLeft += distance;\n await requestAnimationFrameSettled();\n }\n\n async function scrollLeft(distance: number) {\n let element = horizontalScrollElement();\n\n element.scrollLeft -= distance;\n await requestAnimationFrameSettled();\n }\n\n return {\n dragLeft: (column: Element, amount: number) => resize(column, -amount),\n dragRight: (column: Element, amount: number) => resize(column, amount),\n scrollLeft,\n scrollRight,\n swipeLeft: scrollRight,\n swipeRight: scrollLeft,\n };\n}\n\nexport async function requestAnimationFrameSettled() {\n await new Promise(requestAnimationFrame);\n await settled();\n}\n"],"names":["createHelpers","selectors","resize","parent","delta","assert","resizeHandle","element","querySelector","rect","getBoundingClientRect","startX","right","left","targetX","triggerEvent","clientX","button","settled","horizontalScrollElement","scrollContainer","find","HTMLElement","scrollRight","distance","scrollLeft","requestAnimationFrameSettled","dragLeft","column","amount","dragRight","swipeLeft","swipeRight","Promise","requestAnimationFrame"],"mappings":";;;AAQO,SAASA,aAAaA,CAACC,SAAoB,EAAE;AAClD,EAAA,eAAeC,MAAMA,CAACC,MAAe,EAAEC,KAAa,EAAE;AACpDC,IAAAA,MAAM,CACH,CAAoF,mFAAA,CAAA,EACrFJ,SAAS,CAACK,YAAY,CACvB,CAAA;IAED,IAAIC,OAAO,GAAGJ,MAAM,CAACK,aAAa,CAACP,SAAS,CAACK,YAAY,CAAC,CAAA;AAE1DD,IAAAA,MAAM,CAAE,CAAA,6BAAA,CAA8B,EAAEE,OAAO,CAAC,CAAA;;AAEhD;AACJ;AACA;AACA;AACI,IAAA,IAAIE,IAAI,GAAGF,OAAO,CAACG,qBAAqB,EAAE,CAAA;IAC1C,IAAIC,MAAM,GAAG,CAACF,IAAI,CAACG,KAAK,GAAGH,IAAI,CAACI,IAAI,IAAI,CAAC,CAAA;AAEzC,IAAA,IAAIC,OAAO,GAAGH,MAAM,GAAGP,KAAK,CAAA;AAE5BW,IAAAA,YAAY,CAACR,OAAO,EAAE,WAAW,EAAE;AAAES,MAAAA,OAAO,EAAEL,MAAM;AAAEM,MAAAA,MAAM,EAAE,CAAA;AAAE,KAAC,CAAC,CAAA;AAClEF,IAAAA,YAAY,CAACR,OAAO,EAAE,WAAW,EAAE;AAAES,MAAAA,OAAO,EAAEF,OAAO;AAAEG,MAAAA,MAAM,EAAE,CAAA;AAAE,KAAC,CAAC,CAAA;AACnEF,IAAAA,YAAY,CAACR,OAAO,EAAE,SAAS,EAAE;AAAES,MAAAA,OAAO,EAAEF,OAAO;AAAEG,MAAAA,MAAM,EAAE,CAAA;AAAE,KAAC,CAAC,CAAA;AAEjE,IAAA,MAAMC,OAAO,EAAE,CAAA;AACjB,GAAA;EAEA,SAASC,uBAAuBA,GAAG;AACjCd,IAAAA,MAAM,CACH,CAA+E,8EAAA,CAAA,EAChFJ,SAAS,CAACmB,eAAe,CAC1B,CAAA;AAED,IAAA,IAAIb,OAAO,GAAGc,IAAI,CAACpB,SAAS,CAACmB,eAAe,CAAC,CAAA;AAE7Cf,IAAAA,MAAM,CAAE,CAA2B,0BAAA,CAAA,EAAEE,OAAO,YAAYe,WAAW,CAAC,CAAA;AAEpE,IAAA,OAAOf,OAAO,CAAA;AAChB,GAAA;EAEA,eAAegB,WAAWA,CAACC,QAAgB,EAAE;IAC3C,IAAIjB,OAAO,GAAGY,uBAAuB,EAAE,CAAA;IAEvCZ,OAAO,CAACkB,UAAU,IAAID,QAAQ,CAAA;AAC9B,IAAA,MAAME,4BAA4B,EAAE,CAAA;AACtC,GAAA;EAEA,eAAeD,UAAUA,CAACD,QAAgB,EAAE;IAC1C,IAAIjB,OAAO,GAAGY,uBAAuB,EAAE,CAAA;IAEvCZ,OAAO,CAACkB,UAAU,IAAID,QAAQ,CAAA;AAC9B,IAAA,MAAME,4BAA4B,EAAE,CAAA;AACtC,GAAA;EAEA,OAAO;AACLC,IAAAA,QAAQ,EAAEA,CAACC,MAAe,EAAEC,MAAc,KAAK3B,MAAM,CAAC0B,MAAM,EAAE,CAACC,MAAM,CAAC;IACtEC,SAAS,EAAEA,CAACF,MAAe,EAAEC,MAAc,KAAK3B,MAAM,CAAC0B,MAAM,EAAEC,MAAM,CAAC;IACtEJ,UAAU;IACVF,WAAW;AACXQ,IAAAA,SAAS,EAAER,WAAW;AACtBS,IAAAA,UAAU,EAAEP,UAAAA;GACb,CAAA;AACH,CAAA;AAEO,eAAeC,4BAA4BA,GAAG;AACnD,EAAA,MAAM,IAAIO,OAAO,CAACC,qBAAqB,CAAC,CAAA;AACxC,EAAA,MAAMhB,OAAO,EAAE,CAAA;AACjB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-headless-table",
3
- "version": "2.1.2",
3
+ "version": "2.1.4",
4
4
  "description": "An implementation of table behaviors for driving any table or table-like UI -- all without a UI (headless)",
5
5
  "keywords": [
6
6
  "ember-addon",
@@ -63,11 +63,11 @@
63
63
  }
64
64
  },
65
65
  "peerDependencies": {
66
- "@ember/test-helpers": "^2.6.0",
67
- "@ember/test-waiters": "^2.4.5 || ^3.0.0",
66
+ "@ember/test-helpers": ">= 2.6.0",
67
+ "@ember/test-waiters": "^2.4.5 || >= 3.0.0",
68
68
  "@glint/template": ">= 0.8.3",
69
69
  "ember-cached-decorator-polyfill": "^1.0.1",
70
- "ember-source": "^3.28.0 || ^4.0.0 || ^5.0.0"
70
+ "ember-source": "^3.28.0 || ^4.0.0 || >= 5.0.0"
71
71
  },
72
72
  "peerDependenciesMeta": {
73
73
  "@glimmer/component": {