@api-client/ui 0.0.10 → 0.0.12

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 (176) hide show
  1. package/.eslintrc +16 -1
  2. package/demo/elements/index.html +3 -0
  3. package/demo/elements/store/file-picker.html +15 -0
  4. package/demo/elements/store/file-picker.ts +134 -0
  5. package/demo/elements/store/index.html +19 -0
  6. package/demo/index.html +3 -0
  7. package/demo/layout/index.html +91 -0
  8. package/demo/layout/index.ts +182 -0
  9. package/demo/store/StorePlugin.js +1 -0
  10. package/dist/bindings/base/StoreBindings.d.ts +5 -0
  11. package/dist/bindings/base/StoreBindings.d.ts.map +1 -1
  12. package/dist/bindings/base/StoreBindings.js +15 -1
  13. package/dist/bindings/base/StoreBindings.js.map +1 -1
  14. package/dist/define/store/file-picker.d.ts +9 -0
  15. package/dist/define/store/file-picker.d.ts.map +1 -0
  16. package/dist/define/store/file-picker.js +10 -0
  17. package/dist/define/store/file-picker.js.map +1 -0
  18. package/dist/define/{files → store}/share-file.d.ts +1 -1
  19. package/dist/define/store/share-file.d.ts.map +1 -0
  20. package/dist/define/{files → store}/share-file.js +2 -2
  21. package/dist/define/store/share-file.js.map +1 -0
  22. package/dist/elements/layout/SplitItem.d.ts +1 -9
  23. package/dist/elements/layout/SplitItem.d.ts.map +1 -1
  24. package/dist/elements/layout/SplitItem.js +27 -20
  25. package/dist/elements/layout/SplitItem.js.map +1 -1
  26. package/dist/elements/layout/SplitLayout.d.ts +16 -14
  27. package/dist/elements/layout/SplitLayout.d.ts.map +1 -1
  28. package/dist/elements/layout/SplitLayout.js +47 -42
  29. package/dist/elements/layout/SplitLayout.js.map +1 -1
  30. package/dist/elements/layout/SplitPanel.d.ts +7 -2
  31. package/dist/elements/layout/SplitPanel.d.ts.map +1 -1
  32. package/dist/elements/layout/SplitPanel.js +130 -52
  33. package/dist/elements/layout/SplitPanel.js.map +1 -1
  34. package/dist/elements/layout/SplitView.d.ts.map +1 -1
  35. package/dist/elements/layout/SplitView.js +18 -14
  36. package/dist/elements/layout/SplitView.js.map +1 -1
  37. package/dist/elements/layout/type.d.ts +3 -3
  38. package/dist/elements/layout/type.d.ts.map +1 -1
  39. package/dist/elements/layout/type.js.map +1 -1
  40. package/dist/elements/store/FilePicker.element.d.ts +87 -0
  41. package/dist/elements/store/FilePicker.element.d.ts.map +1 -0
  42. package/dist/elements/store/FilePicker.element.js +263 -0
  43. package/dist/elements/store/FilePicker.element.js.map +1 -0
  44. package/dist/elements/store/FilePicker.styles.d.ts +3 -0
  45. package/dist/elements/store/FilePicker.styles.d.ts.map +1 -0
  46. package/dist/elements/store/FilePicker.styles.js +72 -0
  47. package/dist/elements/store/FilePicker.styles.js.map +1 -0
  48. package/dist/elements/store/FilesLib.d.ts +10 -0
  49. package/dist/elements/store/FilesLib.d.ts.map +1 -0
  50. package/dist/elements/store/FilesLib.js +38 -0
  51. package/dist/elements/store/FilesLib.js.map +1 -0
  52. package/dist/elements/{files/ShareFile.d.ts → store/ShareFile.element.d.ts} +1 -1
  53. package/dist/elements/store/ShareFile.element.d.ts.map +1 -0
  54. package/dist/elements/{files/ShareFile.js → store/ShareFile.element.js} +1 -1
  55. package/dist/elements/store/ShareFile.element.js.map +1 -0
  56. package/dist/elements/store/ShareFile.styles.d.ts.map +1 -0
  57. package/dist/elements/{files → store}/ShareFile.styles.js.map +1 -1
  58. package/dist/events/EventTypes.d.ts +1 -0
  59. package/dist/events/EventTypes.d.ts.map +1 -1
  60. package/dist/events/EventTypes.js +1 -0
  61. package/dist/events/EventTypes.js.map +1 -1
  62. package/dist/events/Events.d.ts +1 -0
  63. package/dist/events/Events.d.ts.map +1 -1
  64. package/dist/events/StoreEvents.d.ts +8 -1
  65. package/dist/events/StoreEvents.d.ts.map +1 -1
  66. package/dist/events/StoreEvents.js +19 -0
  67. package/dist/events/StoreEvents.js.map +1 -1
  68. package/dist/pages/ApplicationScreen.d.ts +1 -1
  69. package/dist/pages/ApplicationScreen.d.ts.map +1 -1
  70. package/dist/pages/ApplicationScreen.js +4 -2
  71. package/dist/pages/ApplicationScreen.js.map +1 -1
  72. package/dist/pages/api-client/ApiClient.screen.d.ts +0 -6
  73. package/dist/pages/api-client/ApiClient.screen.d.ts.map +1 -1
  74. package/dist/pages/api-client/ApiClient.screen.js +16 -29
  75. package/dist/pages/api-client/ApiClient.screen.js.map +1 -1
  76. package/dist/pages/api-client/Authenticate.screen.d.ts +1 -1
  77. package/dist/pages/api-client/Authenticate.screen.d.ts.map +1 -1
  78. package/dist/pages/api-client/Authenticate.screen.js +2 -2
  79. package/dist/pages/api-client/Authenticate.screen.js.map +1 -1
  80. package/dist/pages/api-client/pages/Files.page.d.ts +6 -35
  81. package/dist/pages/api-client/pages/Files.page.d.ts.map +1 -1
  82. package/dist/pages/api-client/pages/Files.page.js +32 -141
  83. package/dist/pages/api-client/pages/Files.page.js.map +1 -1
  84. package/dist/pages/api-client/pages/Shared.page.d.ts +1 -5
  85. package/dist/pages/api-client/pages/Shared.page.d.ts.map +1 -1
  86. package/dist/pages/api-client/pages/Shared.page.js +1 -40
  87. package/dist/pages/api-client/pages/Shared.page.js.map +1 -1
  88. package/dist/pages/demo/DemoPage.d.ts +7 -0
  89. package/dist/pages/demo/DemoPage.d.ts.map +1 -1
  90. package/dist/pages/demo/DemoPage.js +14 -0
  91. package/dist/pages/demo/DemoPage.js.map +1 -1
  92. package/dist/pages/http-project/HttpClientCommands.d.ts.map +1 -1
  93. package/dist/pages/http-project/HttpClientCommands.js +28 -12
  94. package/dist/pages/http-project/HttpClientCommands.js.map +1 -1
  95. package/dist/store/FileSystem.d.ts +90 -0
  96. package/dist/store/FileSystem.d.ts.map +1 -0
  97. package/dist/store/FileSystem.js +260 -0
  98. package/dist/store/FileSystem.js.map +1 -0
  99. package/dist/styles/global-styles.d.ts.map +1 -1
  100. package/dist/styles/global-styles.js +7 -0
  101. package/dist/styles/global-styles.js.map +1 -1
  102. package/dist/ui/icons/Icons.d.ts +2 -1
  103. package/dist/ui/icons/Icons.d.ts.map +1 -1
  104. package/dist/ui/icons/Icons.js +1 -0
  105. package/dist/ui/icons/Icons.js.map +1 -1
  106. package/dist/ui/list/UiDropdownList.d.ts +9 -1
  107. package/dist/ui/list/UiDropdownList.d.ts.map +1 -1
  108. package/dist/ui/list/UiDropdownList.js +39 -17
  109. package/dist/ui/list/UiDropdownList.js.map +1 -1
  110. package/dist/ui/list/UiList.d.ts +6 -1
  111. package/dist/ui/list/UiList.d.ts.map +1 -1
  112. package/dist/ui/list/UiList.js +24 -9
  113. package/dist/ui/list/UiList.js.map +1 -1
  114. package/dist/ui/table/DataTable.d.ts +4 -0
  115. package/dist/ui/table/DataTable.d.ts.map +1 -1
  116. package/dist/ui/table/DataTable.js +23 -1
  117. package/dist/ui/table/DataTable.js.map +1 -1
  118. package/package.json +2 -1
  119. package/src/bindings/base/StoreBindings.ts +16 -1
  120. package/src/define/store/file-picker.ts +12 -0
  121. package/src/define/{files → store}/share-file.ts +2 -2
  122. package/src/elements/layout/SplitItem.ts +29 -21
  123. package/src/elements/layout/SplitLayout.ts +53 -43
  124. package/src/elements/layout/SplitPanel.ts +140 -57
  125. package/src/elements/layout/SplitView.ts +18 -15
  126. package/src/elements/layout/type.ts +3 -4
  127. package/src/elements/store/FilePicker.element.ts +297 -0
  128. package/src/elements/store/FilePicker.styles.ts +72 -0
  129. package/src/elements/store/FilesLib.ts +32 -0
  130. package/src/events/EventTypes.ts +1 -0
  131. package/src/events/StoreEvents.ts +21 -1
  132. package/src/pages/ApplicationScreen.ts +5 -3
  133. package/src/pages/api-client/ApiClient.screen.ts +16 -31
  134. package/src/pages/api-client/Authenticate.screen.ts +2 -2
  135. package/src/pages/api-client/pages/Files.page.ts +37 -164
  136. package/src/pages/api-client/pages/Shared.page.ts +2 -40
  137. package/src/pages/demo/DemoPage.ts +17 -0
  138. package/src/pages/http-project/HttpClientCommands.ts +28 -12
  139. package/src/store/FileSystem.ts +325 -0
  140. package/src/styles/global-styles.ts +7 -0
  141. package/src/ui/icons/Icons.ts +2 -1
  142. package/src/ui/list/UiDropdownList.ts +44 -17
  143. package/src/ui/list/UiList.ts +26 -10
  144. package/src/ui/table/DataTable.ts +29 -3
  145. package/test/elements/layout/SplitItem.test.ts +76 -75
  146. package/test/elements/layout/SplitLayoutManager.test.ts +70 -69
  147. package/test/elements/layout/SplitPanel.test.ts +10 -7
  148. package/test/elements/store/FilePicker.test.ts +241 -0
  149. package/test/env.js +3 -0
  150. package/test/helpers/StoreHelper.ts +390 -0
  151. package/tsconfig.eslint.json +10 -0
  152. package/web-test-runner.config.mjs +51 -2
  153. package/dist/define/files/share-file.d.ts.map +0 -1
  154. package/dist/define/files/share-file.js.map +0 -1
  155. package/dist/define/layout/layout-panel.d.ts +0 -7
  156. package/dist/define/layout/layout-panel.d.ts.map +0 -1
  157. package/dist/define/layout/layout-panel.js +0 -3
  158. package/dist/define/layout/layout-panel.js.map +0 -1
  159. package/dist/elements/files/ShareFile.d.ts.map +0 -1
  160. package/dist/elements/files/ShareFile.js.map +0 -1
  161. package/dist/elements/files/ShareFile.styles.d.ts.map +0 -1
  162. package/dist/elements/layout/LayoutManager.d.ts +0 -327
  163. package/dist/elements/layout/LayoutManager.d.ts.map +0 -1
  164. package/dist/elements/layout/LayoutManager.js +0 -747
  165. package/dist/elements/layout/LayoutManager.js.map +0 -1
  166. package/dist/elements/layout/LayoutPanelElement.d.ts +0 -62
  167. package/dist/elements/layout/LayoutPanelElement.d.ts.map +0 -1
  168. package/dist/elements/layout/LayoutPanelElement.js +0 -628
  169. package/dist/elements/layout/LayoutPanelElement.js.map +0 -1
  170. package/src/define/layout/layout-panel.ts +0 -9
  171. package/src/elements/layout/LayoutManager.ts +0 -930
  172. package/src/elements/layout/LayoutPanelElement.ts +0 -651
  173. /package/dist/elements/{files → store}/ShareFile.styles.d.ts +0 -0
  174. /package/dist/elements/{files → store}/ShareFile.styles.js +0 -0
  175. /package/src/elements/{files/ShareFile.ts → store/ShareFile.element.ts} +0 -0
  176. /package/src/elements/{files → store}/ShareFile.styles.ts +0 -0
@@ -27,14 +27,15 @@ export interface IDataTableOptions {
27
27
 
28
28
  export type RenderContent = string | TemplateResult | TemplateResult[];
29
29
 
30
- type DataEvents = 'header' | 'item' | 'empty' | 'activate' | 'select' | 'render';
30
+ type DataEvents = 'header' | 'item' | 'empty' | 'activate' | 'select' | 'render' | 'scrollend';
31
31
 
32
32
  type CellCallback<T> = (item: T) => TemplateResult[];
33
33
  type ActivateCallback<T> = (item: T) => void;
34
34
  type SelectCallback = (item: string | string[]) => void;
35
+ type Callback = () => void;
35
36
 
36
37
  type DataEventsMap<T> = {
37
- [key in DataEvents]?: SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]};
38
+ [key in DataEvents]?: Callback | SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]};
38
39
  };
39
40
 
40
41
  export interface ICellOptions {
@@ -227,6 +228,7 @@ export class DataTable<T> {
227
228
  this.handleClick = this.handleClick.bind(this);
228
229
  this.handleKeyDown = this.handleKeyDown.bind(this);
229
230
  this.handleFocus = this.handleFocus.bind(this);
231
+ this.handleListScroll = this.handleListScroll.bind(this);
230
232
  }
231
233
 
232
234
  addEventListener(type: 'header', listener: () => TemplateResult[]): void;
@@ -241,6 +243,8 @@ export class DataTable<T> {
241
243
 
242
244
  addEventListener(type: 'select', listener: SelectCallback): void;
243
245
 
246
+ addEventListener(type: 'scrollend', listener: Callback): void;
247
+
244
248
  addEventListener(type: DataEvents, listener: SelectCallback | CellCallback<T> | CellCallback<T[]> | ActivateCallback<T> | ActivateCallback<T[]> | {(): TemplateResult | TemplateResult[]}): void {
245
249
  this.#listeners[type] = listener;
246
250
  }
@@ -585,6 +589,15 @@ export class DataTable<T> {
585
589
  }
586
590
  }
587
591
 
592
+ protected handleListScroll(e: Event): void {
593
+ const list = e.target as HTMLElement;
594
+ const { scrollTop, offsetHeight, scrollHeight } = list;
595
+ const bottom = scrollTop + offsetHeight >= scrollHeight - 20; // 20 is the offset which qualifies as the end. An arbitrary number.
596
+ if (bottom) {
597
+ this.dispatchScrollEnd();
598
+ }
599
+ }
600
+
588
601
  protected renderHeader(): TemplateResult {
589
602
  const cells = this.dispatchHeader();
590
603
  return html`
@@ -602,7 +615,7 @@ export class DataTable<T> {
602
615
  const contents = !!items && !!items.length ? items.map(item => this.renderItem(item)) : this.renderEmpty();
603
616
  const dbListener = active ? this.dblclickHandler : undefined;
604
617
  return html`
605
- <div class="data-table-body" role="rowgroup" @dblclick="${dbListener}">
618
+ <div class="data-table-body" role="rowgroup" @dblclick="${dbListener}" @scroll="${{ handleEvent: this.handleListScroll, passive: true }}">
606
619
  ${contents}
607
620
  </div>`;
608
621
  }
@@ -715,4 +728,17 @@ export class DataTable<T> {
715
728
  console.warn(e);
716
729
  }
717
730
  }
731
+
732
+ protected dispatchScrollEnd(): void {
733
+ const callback = this.#listeners.scrollend as Callback;
734
+ if (!callback) {
735
+ return;
736
+ }
737
+ try {
738
+ callback();
739
+ } catch (e) {
740
+ // eslint-disable-next-line no-console
741
+ console.warn(e);
742
+ }
743
+ }
718
744
  }
@@ -295,7 +295,7 @@ describe('layout', () => {
295
295
  });
296
296
  });
297
297
 
298
- describe('getParent()', () => {
298
+ describe('getParents()', () => {
299
299
  let manager: SplitLayout;
300
300
 
301
301
  beforeEach(() => {
@@ -308,8 +308,8 @@ describe('layout', () => {
308
308
  kind: 'test-kind',
309
309
  label: 'test-label',
310
310
  });
311
- const result = instance.getParent();
312
- assert.isUndefined(result);
311
+ const result = instance.getParents();
312
+ assert.deepEqual(result, []);
313
313
  });
314
314
 
315
315
  it('returns the parent panel', () => {
@@ -319,81 +319,82 @@ describe('layout', () => {
319
319
  kind: 'test-kind',
320
320
  label: 'test-label',
321
321
  });
322
- const result = instance.getParent();
323
- assert.deepEqual(result, panel);
322
+ const result = instance.getParents();
323
+ assert.deepEqual(result, [panel]);
324
324
  });
325
325
  });
326
326
 
327
- describe('remove()', () => {
328
- let manager: SplitLayout;
329
- let panel: SplitPanel;
330
- let item: SplitItem;
331
-
332
- beforeEach(() => {
333
- manager = new SplitLayout();
334
- panel = manager.addPanel();
335
- item = panel.addItem({
336
- key: 'test-key',
337
- kind: 'test-kind',
338
- label: 'test-label',
339
- });
340
- });
341
-
342
- it('removes the item from definitions', () => {
343
- item.remove();
344
- const result = manager.definitions.get(item.key);
345
- assert.notOk(result);
346
- });
347
-
348
- it('removes the item from the parent items', () => {
349
- item.remove();
350
- assert.deepEqual(panel.items, []);
351
- });
352
-
353
- it('informs the panel listeners about item removed', () => {
354
- const spy = sinon.spy();
355
- manager.addEventListener('closetab', spy);
356
- item.remove();
357
- assert.isTrue(spy.calledOnce, 'the event is dispatched');
358
- const e = spy.args[0][0] as CustomEvent<string>;
359
- assert.equal(e.detail, item.key, 'has the item key on the detail')
360
- });
361
-
362
- it('informs the panel listeners about layout change', () => {
363
- const spy = sinon.spy();
364
- manager.addEventListener('change', spy);
365
- item.remove();
366
- assert.isTrue(spy.calledOnce, 'the event is dispatched');
367
- });
368
- });
369
-
370
- describe('setSelected()', () => {
371
- let manager: SplitLayout;
372
- let panel: SplitPanel;
373
- let item: SplitItem;
374
-
375
- beforeEach(() => {
376
- manager = new SplitLayout();
377
- panel = manager.addPanel();
378
- item = panel.addItem({
379
- key: 'test-key',
380
- kind: 'test-kind',
381
- label: 'test-label',
382
- });
383
- });
384
-
385
- it('sets item selected with the panel', () => {
386
- item.setSelected();
387
- assert.equal(panel.selected, item.key);
388
- });
389
-
390
- it('informs the panel listeners about layout change', () => {
391
- const spy = sinon.spy();
392
- manager.addEventListener('change', spy);
393
- item.setSelected();
394
- assert.isTrue(spy.calledOnce, 'the event is dispatched');
395
- });
396
- });
327
+ // describe('remove()', () => {
328
+ // let manager: SplitLayout;
329
+ // let panel: SplitPanel;
330
+ // let item: SplitItem;
331
+
332
+ // beforeEach(() => {
333
+ // manager = new SplitLayout();
334
+ // panel = manager.addPanel();
335
+ // item = panel.addItem({
336
+ // key: 'test-key',
337
+ // kind: 'test-kind',
338
+ // label: 'test-label',
339
+ // });
340
+ // });
341
+
342
+ // it('removes the item from definitions', () => {
343
+ // item.remove();
344
+ // const result = manager.definitions.get(item.key);
345
+ // assert.notOk(result);
346
+ // });
347
+
348
+ // it('removes the item from the parent items', () => {
349
+ // item.remove();
350
+ // assert.deepEqual(panel.items, []);
351
+ // });
352
+
353
+ // it('informs the panel listeners about item removed', () => {
354
+ // const spy = sinon.spy();
355
+ // manager.addEventListener('closetab', spy);
356
+ // item.remove();
357
+ // assert.isTrue(spy.calledOnce, 'the event is dispatched');
358
+ // const e = spy.args[0][0] as CustomEvent<ITabCloseDetail>;
359
+ // assert.equal(e.detail.tab, item.key, 'has the item key on the detail')
360
+ // assert.equal(e.detail.panel, panel.key, 'has the panel key on the detail')
361
+ // });
362
+
363
+ // it('informs the panel listeners about layout change', () => {
364
+ // const spy = sinon.spy();
365
+ // manager.addEventListener('change', spy);
366
+ // item.remove();
367
+ // assert.isTrue(spy.calledOnce, 'the event is dispatched');
368
+ // });
369
+ // });
370
+
371
+ // describe('setSelected()', () => {
372
+ // let manager: SplitLayout;
373
+ // let panel: SplitPanel;
374
+ // let item: SplitItem;
375
+
376
+ // beforeEach(() => {
377
+ // manager = new SplitLayout();
378
+ // panel = manager.addPanel();
379
+ // item = panel.addItem({
380
+ // key: 'test-key',
381
+ // kind: 'test-kind',
382
+ // label: 'test-label',
383
+ // });
384
+ // });
385
+
386
+ // it('sets item selected with the panel', () => {
387
+ // item.setSelected();
388
+ // assert.equal(panel.selected, item.key);
389
+ // });
390
+
391
+ // it('informs the panel listeners about layout change', () => {
392
+ // const spy = sinon.spy();
393
+ // manager.addEventListener('change', spy);
394
+ // item.setSelected();
395
+ // assert.isTrue(spy.calledOnce, 'the event is dispatched');
396
+ // });
397
+ // });
397
398
 
398
399
  describe('setLabel()', () => {
399
400
  let manager: SplitLayout;
@@ -2,10 +2,10 @@ import { assert, aTimeout, fixture, html } from '@open-wc/testing';
2
2
  import { TemplateResult } from 'lit';
3
3
  import sinon from 'sinon';
4
4
  import { ISplitItem, SplitItem } from '../../../src/elements/layout/SplitItem.js';
5
- import { SplitLayout } from '../../../src/elements/layout/SplitLayout.js';
5
+ import { ITabCloseDetail, SplitLayout } from '../../../src/elements/layout/SplitLayout.js';
6
6
  import { ISplitPanel, SplitPanel } from '../../../src/elements/layout/SplitPanel.js';
7
7
  import SplitView from '../../../src/elements/layout/SplitView.js';
8
- import { LayoutType, SplitCloseDirection, SplitDirection, SplitRegion } from '../../../src/elements/layout/type.js';
8
+ import { LayoutType, SplitDirection, SplitRegion } from '../../../src/elements/layout/type.js';
9
9
  import '../../../src/define/layout/split-view.js';
10
10
 
11
11
  describe('layout', () => {
@@ -194,29 +194,29 @@ describe('layout', () => {
194
194
  });
195
195
  });
196
196
 
197
- describe('getParent()', () => {
197
+ describe('getParents()', () => {
198
198
  let manager: SplitLayout;
199
199
 
200
200
  beforeEach(() => {
201
201
  manager = new SplitLayout();
202
202
  });
203
203
 
204
- it('returns undefined when no item or panel', () => {
205
- const result = manager.getParent('unknown');
206
- assert.isUndefined(result);
204
+ it('returns empty array when no item or panel', () => {
205
+ const result = manager.getParents('unknown');
206
+ assert.deepEqual(result, []);
207
207
  });
208
208
 
209
209
  it('returns a parent for a panel that is a panel', () => {
210
210
  const p1 = manager.addPanel();
211
211
  const p2 = p1.addPanel();
212
- const result = manager.getParent(p2.key);
213
- assert.deepEqual(result, p1);
212
+ const result = manager.getParents(p2.key);
213
+ assert.deepEqual(result, [p1]);
214
214
  });
215
215
 
216
- it('returns undefined when the parent is the manager', () => {
216
+ it('returns empty array when the parent is the manager', () => {
217
217
  const p1 = manager.addPanel();
218
- const result = manager.getParent(p1.key);
219
- assert.isUndefined(result);
218
+ const result = manager.getParents(p1.key);
219
+ assert.deepEqual(result, []);
220
220
  });
221
221
 
222
222
  it('returns a parent for an item', () => {
@@ -226,20 +226,20 @@ describe('layout', () => {
226
226
  key: 'b',
227
227
  label: 'c',
228
228
  });
229
- const result = manager.getParent(i1.key);
230
- assert.deepEqual(result, p1);
229
+ const result = manager.getParents(i1.key);
230
+ assert.deepEqual(result, [p1]);
231
231
  });
232
232
 
233
- it('returns undefined for an item that has been remove', () => {
233
+ it('returns empty array for an item that has been removes', () => {
234
234
  const p1 = manager.addPanel();
235
235
  const i1 = p1.addItem({
236
236
  kind: 'a',
237
237
  key: 'b',
238
238
  label: 'c',
239
239
  });
240
- i1.remove();
241
- const result = manager.getParent(i1.key);
242
- assert.isUndefined(result);
240
+ p1.removeChildItem(i1);
241
+ const result = manager.getParents(i1.key);
242
+ assert.deepEqual(result, []);
243
243
  });
244
244
  });
245
245
 
@@ -361,10 +361,11 @@ describe('layout', () => {
361
361
  it('dispatches the "nameitem" event', () => {
362
362
  const spy = sinon.spy();
363
363
  manager.addEventListener('closetab', spy);
364
- manager.notifyTabClose('test');
364
+ manager.notifyTabClose('test', 'key');
365
365
  assert.isTrue(spy.calledOnce);
366
- const event = spy.args[0][0] as CustomEvent<string>;
367
- assert.equal(event.detail, 'test');
366
+ const event = spy.args[0][0] as CustomEvent<ITabCloseDetail>;
367
+ assert.equal(event.detail.tab, 'test');
368
+ assert.equal(event.detail.panel, 'key');
368
369
  });
369
370
  });
370
371
 
@@ -484,7 +485,7 @@ describe('layout', () => {
484
485
  kind: '',
485
486
  label: '',
486
487
  });
487
- const parent = i1.getParent()!;
488
+ const parent = i1.getParents()[0];
488
489
  assert.ok(parent, 'has the parent');
489
490
  const foundParent = manager.findPanel(parent.key);
490
491
  assert.ok(foundParent, 'the parent is in the layout');
@@ -500,7 +501,7 @@ describe('layout', () => {
500
501
  kind: '',
501
502
  label: '',
502
503
  });
503
- const itemParent = i1.getParent();
504
+ const itemParent = i1.getParents()[0];
504
505
  // p1 has panels in it so it must be p2.
505
506
  assert.deepEqual(itemParent, p2);
506
507
  });
@@ -514,7 +515,7 @@ describe('layout', () => {
514
515
  kind: '',
515
516
  label: '',
516
517
  });
517
- const itemParent = i1.getParent();
518
+ const itemParent = i1.getParents()[0];
518
519
  assert.deepEqual(itemParent, p2);
519
520
  });
520
521
 
@@ -721,48 +722,48 @@ describe('layout', () => {
721
722
  });
722
723
  });
723
724
 
724
- describe('removeRelative()', () => {
725
- let manager: SplitLayout;
726
-
727
- beforeEach(() => {
728
- manager = new SplitLayout();
729
- });
730
-
731
- it('calls removeRelative() on the parent with defaults', () => {
732
- const p1 = manager.addPanel();
733
- const spy = sinon.spy(p1, 'removeRelative');
734
- const i1 = p1.addItem({
735
- key: 'i1',
736
- kind: '',
737
- label: '',
738
- });
739
- manager.removeRelative(i1.key);
740
- assert.isTrue(spy.calledOnce);
741
- assert.equal(spy.args[0][0], i1.key, 'passes the key');
742
- assert.isUndefined(spy.args[0][1], 'has no direction specified');
743
- });
744
-
745
- it('calls removeRelative() on the parent with the direction', () => {
746
- const p1 = manager.addPanel();
747
- const spy = sinon.spy(p1, 'removeRelative');
748
- const i1 = p1.addItem({
749
- key: 'i1',
750
- kind: '',
751
- label: '',
752
- });
753
- manager.removeRelative(i1.key, SplitCloseDirection.left);
754
- assert.isTrue(spy.calledOnce);
755
- assert.equal(spy.args[0][0], i1.key, 'passes the key');
756
- assert.equal(spy.args[0][1], SplitCloseDirection.left, 'has the direction');
757
- });
758
-
759
- it('does nothing when item is not found', () => {
760
- const p1 = manager.addPanel();
761
- const spy = sinon.spy(p1, 'removeRelative');
762
- manager.removeRelative('unknown', SplitCloseDirection.left);
763
- assert.isFalse(spy.called);
764
- });
765
- });
725
+ // describe('removeRelative()', () => {
726
+ // let manager: SplitLayout;
727
+
728
+ // beforeEach(() => {
729
+ // manager = new SplitLayout();
730
+ // });
731
+
732
+ // it('calls removeRelative() on the parent with defaults', () => {
733
+ // const p1 = manager.addPanel();
734
+ // const spy = sinon.spy(p1, 'removeRelative');
735
+ // const i1 = p1.addItem({
736
+ // key: 'i1',
737
+ // kind: '',
738
+ // label: '',
739
+ // });
740
+ // manager.removeRelative(i1.key);
741
+ // assert.isTrue(spy.calledOnce);
742
+ // assert.equal(spy.args[0][0], i1.key, 'passes the key');
743
+ // assert.isUndefined(spy.args[0][1], 'has no direction specified');
744
+ // });
745
+
746
+ // it('calls removeRelative() on the parent with the direction', () => {
747
+ // const p1 = manager.addPanel();
748
+ // const spy = sinon.spy(p1, 'removeRelative');
749
+ // const i1 = p1.addItem({
750
+ // key: 'i1',
751
+ // kind: '',
752
+ // label: '',
753
+ // });
754
+ // manager.removeRelative(i1.key, SplitCloseDirection.left);
755
+ // assert.isTrue(spy.calledOnce);
756
+ // assert.equal(spy.args[0][0], i1.key, 'passes the key');
757
+ // assert.equal(spy.args[0][1], SplitCloseDirection.left, 'has the direction');
758
+ // });
759
+
760
+ // it('does nothing when item is not found', () => {
761
+ // const p1 = manager.addPanel();
762
+ // const spy = sinon.spy(p1, 'removeRelative');
763
+ // manager.removeRelative('unknown', SplitCloseDirection.left);
764
+ // assert.isFalse(spy.called);
765
+ // });
766
+ // });
766
767
 
767
768
  describe('moveItem()', () => {
768
769
  let manager: SplitLayout;
@@ -788,7 +789,7 @@ describe('layout', () => {
788
789
  kind: '',
789
790
  label: '',
790
791
  });
791
- manager.moveItem(p1.key, p1.key, i1.key, 1);
792
+ manager.moveItem(p1.key, p1.key, i1.key, { index: 1 });
792
793
  assert.equal(i1.index, 1, 'the #1 has changed index');
793
794
  assert.equal(i2.index, 0, 'the #2 has changed index');
794
795
  assert.equal(i3.index, 2, 'the #3 has unchanged index');
@@ -812,7 +813,7 @@ describe('layout', () => {
812
813
  kind: '',
813
814
  label: '',
814
815
  });
815
- manager.moveItem(p1.key, p2.key, i1.key, 0);
816
+ manager.moveItem(p1.key, p2.key, i1.key, { index: 0 });
816
817
  const readI1 = manager.findItem(i1.key)!;
817
818
  assert.ok(readI1, 'the manager has the moved item');
818
819
  assert.isFalse(p1.hasItem(i1.key), 'item was removed from the from parent');
@@ -830,7 +831,7 @@ describe('layout', () => {
830
831
  label: '',
831
832
  });
832
833
  assert.throws(() => {
833
- manager.moveItem('unknown', p1.key, i1.key, 0);
834
+ manager.moveItem('unknown', p1.key, i1.key, { index: 0 });
834
835
  }, 'Source layout panel not found.');
835
836
  });
836
837
 
@@ -842,7 +843,7 @@ describe('layout', () => {
842
843
  label: '',
843
844
  });
844
845
  assert.throws(() => {
845
- manager.moveItem(p1.key, 'unknown', i1.key, 0);
846
+ manager.moveItem(p1.key, 'unknown', i1.key, { index: 0 });
846
847
  }, 'Target layout panel not found.');
847
848
  });
848
849
 
@@ -1,7 +1,7 @@
1
1
  import { assert } from '@open-wc/testing';
2
2
  import sinon from 'sinon';
3
3
  import { SplitItem } from '../../../src/elements/layout/SplitItem';
4
- import { SplitLayout } from "../../../src/elements/layout/SplitLayout.js";
4
+ import { ITabCloseDetail, SplitLayout } from "../../../src/elements/layout/SplitLayout.js";
5
5
  import { SplitPanel } from '../../../src/elements/layout/SplitPanel.js';
6
6
  import { IPanelObject, LayoutType, PanelState, SplitCloseDirection, SplitDirection, SplitRegion } from '../../../src/elements/layout/type.js';
7
7
 
@@ -822,8 +822,9 @@ describe('layout', () => {
822
822
  manager.addEventListener('closetab', spy);
823
823
  panel.removeItem(i1.key);
824
824
  assert.isTrue(spy.calledOnce, 'removes the item');
825
- const event = spy.args[0][0] as CustomEvent<string>;
826
- assert.equal(event.detail, i1.key, 'has the tab key');
825
+ const event = spy.args[0][0] as CustomEvent<ITabCloseDetail>;
826
+ assert.equal(event.detail.tab, i1.key, 'has the tab key');
827
+ assert.equal(event.detail.panel, panel.key, 'has the panel key');
827
828
  });
828
829
 
829
830
  it('notifies tab removed when the panel has more items', () => {
@@ -842,8 +843,9 @@ describe('layout', () => {
842
843
  manager.addEventListener('closetab', spy);
843
844
  p1.removeItem(i1.key);
844
845
  assert.isTrue(spy.calledOnce, 'removes the item');
845
- const event = spy.args[0][0] as CustomEvent<string>;
846
- assert.equal(event.detail, i1.key, 'has the tab key');
846
+ const event = spy.args[0][0] as CustomEvent<ITabCloseDetail>;
847
+ assert.equal(event.detail.tab, i1.key, 'has the tab key');
848
+ assert.equal(event.detail.panel, p1.key, 'has the panel key');
847
849
  });
848
850
 
849
851
  it('notifies tab removed when removing the panel', () => {
@@ -857,8 +859,9 @@ describe('layout', () => {
857
859
  manager.addEventListener('closetab', spy);
858
860
  p1.removeItem(i1.key);
859
861
  assert.isTrue(spy.calledOnce, 'removes the item');
860
- const event = spy.args[0][0] as CustomEvent<string>;
861
- assert.equal(event.detail, i1.key, 'has the tab key');
862
+ const event = spy.args[0][0] as CustomEvent<ITabCloseDetail>;
863
+ assert.equal(event.detail.tab, i1.key, 'has the tab key');
864
+ assert.equal(event.detail.panel, p1.key, 'has the panel key');
862
865
  });
863
866
 
864
867
  it('moves the selection to the next item', () => {