@api-client/ui 0.0.9 → 0.0.11

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 (56) hide show
  1. package/.eslintrc +8 -1
  2. package/demo/index.html +3 -0
  3. package/demo/layout/index.html +91 -0
  4. package/demo/layout/index.ts +182 -0
  5. package/dist/elements/layout/SplitItem.d.ts +1 -9
  6. package/dist/elements/layout/SplitItem.d.ts.map +1 -1
  7. package/dist/elements/layout/SplitItem.js +27 -20
  8. package/dist/elements/layout/SplitItem.js.map +1 -1
  9. package/dist/elements/layout/SplitLayout.d.ts +16 -14
  10. package/dist/elements/layout/SplitLayout.d.ts.map +1 -1
  11. package/dist/elements/layout/SplitLayout.js +47 -42
  12. package/dist/elements/layout/SplitLayout.js.map +1 -1
  13. package/dist/elements/layout/SplitPanel.d.ts +7 -2
  14. package/dist/elements/layout/SplitPanel.d.ts.map +1 -1
  15. package/dist/elements/layout/SplitPanel.js +130 -52
  16. package/dist/elements/layout/SplitPanel.js.map +1 -1
  17. package/dist/elements/layout/SplitView.d.ts.map +1 -1
  18. package/dist/elements/layout/SplitView.js +18 -14
  19. package/dist/elements/layout/SplitView.js.map +1 -1
  20. package/dist/elements/layout/type.d.ts +3 -3
  21. package/dist/elements/layout/type.d.ts.map +1 -1
  22. package/dist/elements/layout/type.js.map +1 -1
  23. package/dist/elements/schema-design/DataModelVisualizationElement.d.ts.map +1 -1
  24. package/dist/elements/schema-design/DataModelVisualizationElement.js +18 -1
  25. package/dist/elements/schema-design/DataModelVisualizationElement.js.map +1 -1
  26. package/dist/pages/http-project/HttpClientCommands.d.ts.map +1 -1
  27. package/dist/pages/http-project/HttpClientCommands.js +28 -12
  28. package/dist/pages/http-project/HttpClientCommands.js.map +1 -1
  29. package/package.json +2 -1
  30. package/src/elements/layout/SplitItem.ts +29 -21
  31. package/src/elements/layout/SplitLayout.ts +53 -43
  32. package/src/elements/layout/SplitPanel.ts +140 -57
  33. package/src/elements/layout/SplitView.ts +18 -15
  34. package/src/elements/layout/type.ts +3 -4
  35. package/src/elements/schema-design/DataModelVisualizationElement.ts +18 -1
  36. package/src/pages/http-project/HttpClientCommands.ts +28 -12
  37. package/test/elements/layout/SplitItem.test.ts +76 -75
  38. package/test/elements/layout/SplitLayoutManager.test.ts +70 -69
  39. package/test/elements/layout/SplitPanel.test.ts +10 -7
  40. package/tsconfig.eslint.json +8 -0
  41. package/web-test-runner.config.mjs +4 -1
  42. package/dist/define/layout/layout-panel.d.ts +0 -7
  43. package/dist/define/layout/layout-panel.d.ts.map +0 -1
  44. package/dist/define/layout/layout-panel.js +0 -3
  45. package/dist/define/layout/layout-panel.js.map +0 -1
  46. package/dist/elements/layout/LayoutManager.d.ts +0 -327
  47. package/dist/elements/layout/LayoutManager.d.ts.map +0 -1
  48. package/dist/elements/layout/LayoutManager.js +0 -747
  49. package/dist/elements/layout/LayoutManager.js.map +0 -1
  50. package/dist/elements/layout/LayoutPanelElement.d.ts +0 -62
  51. package/dist/elements/layout/LayoutPanelElement.d.ts.map +0 -1
  52. package/dist/elements/layout/LayoutPanelElement.js +0 -628
  53. package/dist/elements/layout/LayoutPanelElement.js.map +0 -1
  54. package/src/define/layout/layout-panel.ts +0 -9
  55. package/src/elements/layout/LayoutManager.ts +0 -930
  56. package/src/elements/layout/LayoutPanelElement.ts +0 -651
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-param-reassign */
1
2
  /* eslint-disable import/no-cycle */
2
3
  import { html } from "lit";
3
4
  import { uuidV4 } from "@api-client/core/build/browser.js";
@@ -78,7 +79,7 @@ export class SplitPanel {
78
79
  return result;
79
80
  }
80
81
  getParent() {
81
- return this.manager.getParent(this.key);
82
+ return this.manager.getParents(this.key)[0];
82
83
  }
83
84
  /**
84
85
  * @returns True when the panel accepts drop events.
@@ -191,6 +192,13 @@ export class SplitPanel {
191
192
  this.updateView();
192
193
  return instance;
193
194
  }
195
+ const panel = this.splitByRegion(region);
196
+ // we don't call request update here because
197
+ // the app has to redo the view rendering first as
198
+ // the panel purpose has changed.
199
+ return panel.addItem(item, { index });
200
+ }
201
+ splitByRegion(region) {
194
202
  let panel;
195
203
  if (region === 'east') {
196
204
  [, panel] = this.split({
@@ -220,10 +228,7 @@ export class SplitPanel {
220
228
  noSideEffects: true,
221
229
  });
222
230
  }
223
- // we don't call request update here because
224
- // the app has to redo the view rendering first as
225
- // the panel purpose has changed.
226
- return panel.addItem(item, { index });
231
+ return panel;
227
232
  }
228
233
  /**
229
234
  * Splits this panel into 2 panels.
@@ -325,36 +330,31 @@ export class SplitPanel {
325
330
  }
326
331
  }
327
332
  }
328
- /**
329
- * Removes an item from the layout
330
- * @param key The `key` of the item.
331
- * @returns The removed item, if any.
332
- */
333
- removeItem(key, opts = {}) {
334
- const removed = this.manager.findItem(key);
335
- if (!removed) {
336
- return undefined;
337
- }
338
- const index = this.items.findIndex(i => i.key === key);
333
+ removeChildItem(item, opts = {}) {
334
+ const index = this.items.findIndex(i => i.key === item.key);
339
335
  if (index < 0) {
340
336
  return undefined;
341
337
  }
342
338
  const itemInfo = this.items[index];
343
339
  this.items.splice(index, 1);
344
- this.manager.definitions.delete(itemInfo.key);
345
- this.decreaseIndex(removed.index || 0);
340
+ this.decreaseIndex(item.index || 0);
341
+ const parents = this.manager.getParents(item.key);
342
+ if (!parents.length) {
343
+ // remove the definition since no other panel have this item.
344
+ this.manager.definitions.delete(itemInfo.key);
345
+ }
346
346
  if (this.items.length === 0) {
347
347
  // remove panel (self)
348
348
  const parent = this.getParent();
349
349
  if (parent) {
350
350
  parent.removePanel(this.key);
351
351
  // Note, ignore `opts.noSideEffects` for tab close. It won't get dispatched elsewhere.
352
- this.manager.notifyTabClose(key);
352
+ this.manager.notifyTabClose(item.key, this.key);
353
353
  // no point doing the stuff below as the whole panel is removed.
354
- return removed;
354
+ return item;
355
355
  }
356
356
  }
357
- if (this.selected === key) {
357
+ if (this.selected === item.key) {
358
358
  let nextKey;
359
359
  if (this.items[index]) {
360
360
  nextKey = this.items[index].key;
@@ -363,49 +363,96 @@ export class SplitPanel {
363
363
  nextKey = this.items[index - 1].key;
364
364
  }
365
365
  else if (this.items.length) {
366
- const [item] = this.items;
367
- nextKey = item.key;
366
+ const [other] = this.items;
367
+ nextKey = other.key;
368
368
  }
369
369
  this.selected = nextKey;
370
370
  }
371
371
  if (!opts.noSideEffects) {
372
- this.manager.notifyTabClose(key);
372
+ this.manager.notifyTabClose(item.key, this.key);
373
373
  this.manager.notifyChange();
374
374
  this.manager.updateView(this.key);
375
375
  }
376
- return removed;
376
+ return item;
377
+ }
378
+ /**
379
+ * Removes an item from the layout
380
+ * @param key The `key` of the item.
381
+ * @returns The removed item, if any.
382
+ */
383
+ removeItem(key, opts) {
384
+ const removed = this.manager.findItem(key);
385
+ if (!removed) {
386
+ return undefined;
387
+ }
388
+ return this.removeChildItem(removed, opts);
389
+ // const index = this.items.findIndex(i => i.key === key);
390
+ // if (index < 0) {
391
+ // return undefined;
392
+ // }
393
+ // const itemInfo = this.items[index];
394
+ // this.items.splice(index, 1);
395
+ // this.manager.definitions.delete(itemInfo.key);
396
+ // this.decreaseIndex(removed.index || 0);
397
+ // if (this.items.length === 0) {
398
+ // // remove panel (self)
399
+ // const parent = this.getParent();
400
+ // if (parent) {
401
+ // parent.removePanel(this.key);
402
+ // // Note, ignore `opts.noSideEffects` for tab close. It won't get dispatched elsewhere.
403
+ // this.manager.notifyTabClose(key);
404
+ // // no point doing the stuff below as the whole panel is removed.
405
+ // return removed;
406
+ // }
407
+ // }
408
+ // if (this.selected === key) {
409
+ // let nextKey: string | undefined;
410
+ // if (this.items[index]) {
411
+ // nextKey = this.items[index].key;
412
+ // } else if (this.items[index - 1]) {
413
+ // nextKey = this.items[index - 1].key;
414
+ // } else if (this.items.length) {
415
+ // const [item] = this.items;
416
+ // nextKey = item.key;
417
+ // }
418
+ // this.selected = nextKey;
419
+ // }
420
+ // if (!opts.noSideEffects) {
421
+ // this.manager.notifyTabClose(key);
422
+ // this.manager.notifyChange();
423
+ // this.manager.updateView(this.key);
424
+ // }
425
+ // return removed;
377
426
  }
378
427
  /**
379
428
  * @param key The key of the item to perform a relative operation from.
380
429
  * @param dir The direction to which close other items. Default to both directions leaving only the `key` item
381
430
  */
382
431
  removeRelative(key, dir = SplitCloseDirection.both) {
383
- const index = this.items.findIndex(i => i.key === key);
432
+ const items = this.sortedItems();
433
+ const index = items.findIndex(i => i.key === key);
384
434
  if (index < 0) {
385
435
  return;
386
436
  }
387
- // note, even though we keep indexes in the item, the logic actually
388
- // keeps track of them and orders the `items` accordingly.
389
- const item = this.items[index];
390
- let removed;
437
+ const item = items[index];
438
+ let removed = [];
391
439
  if (dir === SplitCloseDirection.both) {
392
- removed = this.items.filter(i => i !== item);
393
- this.items = [item];
394
- this.selected = item.key;
440
+ removed = items.filter(i => i !== item).map(i => i.key);
395
441
  }
396
442
  else if (dir === SplitCloseDirection.left) {
397
- removed = this.items.slice(0, index);
398
- this.items = this.items.splice(index);
399
- this.selected = item.key;
443
+ removed = items.slice(0, index).map(i => i.key);
400
444
  }
401
445
  else {
402
- removed = this.items.slice(index + 1);
403
- this.items = this.items.splice(0, index + 1);
404
- this.selected = item.key;
446
+ removed = this.items.slice(index + 1).map(i => i.key);
405
447
  }
448
+ this.items = this.items.filter(i => !removed.includes(i.key));
449
+ this.selected = item.key;
406
450
  removed.forEach(i => {
407
- this.manager.definitions.delete(i.key);
408
- this.manager.notifyTabClose(i.key);
451
+ const parents = this.manager.getParents(i);
452
+ if (!parents.length) {
453
+ this.manager.definitions.delete(i);
454
+ }
455
+ this.manager.notifyTabClose(i, this.key);
409
456
  });
410
457
  this.manager.notifyChange();
411
458
  this.manager.updateView(this.key);
@@ -445,7 +492,7 @@ export class SplitPanel {
445
492
  * @param key The item key
446
493
  * @param toIndex The new index. When not set it moves the item to the end.
447
494
  */
448
- moveItem(key, toIndex) {
495
+ moveItem(key, opts = {}) {
449
496
  const info = this.items.find(i => i.key === key);
450
497
  if (!info) {
451
498
  return;
@@ -454,22 +501,53 @@ export class SplitPanel {
454
501
  if (!item) {
455
502
  return;
456
503
  }
457
- const hasIndex = typeof toIndex === 'number';
458
- if (hasIndex && item.index === toIndex) {
504
+ const { index, region } = opts;
505
+ if (region) {
506
+ this.moveToRegion(item, region);
507
+ }
508
+ else if (typeof index === 'number') {
509
+ this.moveToIndex(item, index);
510
+ }
511
+ else {
512
+ this.moveToEnd(item);
513
+ }
514
+ }
515
+ moveToRegion(item, region) {
516
+ if (this.items.length < 2) {
517
+ // nothing to split.
518
+ return;
519
+ }
520
+ if (region === SplitRegion.center) {
521
+ // the item is already there.
459
522
  return;
460
523
  }
461
- let hasTargetAtTarget = false;
462
- if (hasIndex) {
463
- hasTargetAtTarget = !!this.items[toIndex];
524
+ const itemsIndex = this.items.findIndex(i => i.key === item.key);
525
+ if (itemsIndex < 0) {
526
+ return;
464
527
  }
465
- if (item.index !== undefined) {
466
- this.decreaseIndex(item.index);
528
+ this.items.splice(itemsIndex, 1);
529
+ const index = typeof item.index === 'number' ? item.index : this.nextIndex();
530
+ const panel = this.splitByRegion(region);
531
+ panel.addItem(item, { index });
532
+ }
533
+ moveToIndex(item, index) {
534
+ if (item.index === index) {
535
+ return;
467
536
  }
468
- const finalIndex = hasIndex ? toIndex : this.nextIndex();
537
+ const hasTargetAtTarget = !!this.items[index];
538
+ this.decreaseIndex(item.index);
469
539
  if (hasTargetAtTarget) {
470
- this.increaseIndex(finalIndex);
540
+ this.increaseIndex(index);
541
+ }
542
+ item.index = index;
543
+ this.manager.notifyChange();
544
+ this.manager.updateView(this.key);
545
+ }
546
+ moveToEnd(item) {
547
+ if (item.index !== undefined) {
548
+ this.decreaseIndex(item.index);
471
549
  }
472
- item.index = finalIndex;
550
+ item.index = this.nextIndex();
473
551
  this.manager.notifyChange();
474
552
  this.manager.updateView(this.key);
475
553
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SplitPanel.js","sourceRoot":"","sources":["../../../src/elements/layout/SplitPanel.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-cycle */\nimport { html, TemplateResult } from \"lit\";\nimport { uuidV4 } from \"@api-client/core/build/browser.js\";\nimport { ISplitItem, SplitItem } from \"./SplitItem.js\";\nimport { IPanelObject, LayoutType, PanelState, SplitCloseDirection, SplitDirection, SplitItemRenderCallback, SplitLayoutAddOptions, SplitPanelRemoveItemOptions, SplitPanelSplitOptions, SplitPanelTarget, SplitRegion } from \"./type.js\";\nimport { SplitLayout } from './SplitLayout.js';\nimport missingIndexes from \"../../lib/math/MissingIndexes.js\";\nimport '../../define/layout/split-view.js';\n\nexport interface ISplitPanel {\n /**\n * If already generated, the key of the panel.\n */\n key?: string;\n\n layout: SplitDirection;\n items?: IPanelObject[];\n /**\n * The item being rendered in the panel.\n * Note, this is the `key` of the item and not the `id` of the item.\n */\n selected?: string;\n}\n\n/**\n * The class represents a panel model for the split layout.\n * A panel can only hold other panels or layout items. When a panel\n * defines both, items are ignored.\n * \n * A panel can render ony one item at a time. TO view more items \n * the application needs to add panels to this panel and distribute items among them.\n */\nexport class SplitPanel {\n /**\n * The key used as an internal reference to the definitions map.\n */\n key = uuidV4();\n\n layout: SplitDirection = SplitDirection.horizontal;\n\n items: IPanelObject[] = [];\n\n /**\n * The item being rendered in the panel.\n * Note, this is the `key` of the item and not the `id` of the item.\n */\n selected?: string;\n\n /**\n * The current state of the panel.\n */\n state: PanelState = PanelState.idle;\n\n get hasPanels(): boolean {\n return this.items.some(i => i.type === LayoutType.panel);\n }\n\n get hasItems(): boolean {\n return this.items.some(i => i.type === LayoutType.item);\n }\n\n static fromLayout(manager: SplitLayout, layout = SplitDirection.horizontal): SplitPanel {\n const schema: ISplitPanel = {\n layout,\n };\n return new SplitPanel(manager, schema);\n }\n\n /**\n * @param manager A reference to the manager.\n * @param parentPanel A reference to a parent panel.\n */\n constructor(public manager: SplitLayout, schema?: ISplitPanel) {\n if (schema) {\n this.new(schema);\n }\n }\n\n new(schema: ISplitPanel): void {\n const { key = uuidV4(), layout = SplitDirection.horizontal, items, selected } = schema;\n this.key = key;\n this.layout = layout;\n if (Array.isArray(items)) {\n this.items = items.map(i => ({ ...i }));\n } else {\n this.items = [];\n }\n if (selected) {\n this.selected = selected;\n } else {\n this.selected = undefined;\n }\n this.state = PanelState.idle;\n }\n\n toJSON(): ISplitPanel {\n const result: ISplitPanel = {\n layout: this.layout,\n key: this.key,\n };\n if (Array.isArray(this.items) && this.items.length) {\n result.items = this.items.map(i => ({ ...i }));\n }\n if (this.selected) {\n result.selected = this.selected;\n }\n return result;\n }\n\n getParent(): SplitPanel | undefined {\n return this.manager.getParent(this.key);\n }\n\n /**\n * @returns True when the panel accepts drop events.\n */\n canDrop(): boolean {\n return !!this.items.length;\n }\n\n /**\n * @returns Returns a **copy** of the items array sorted by index.\n */\n sortedItems(): SplitItem[] {\n const { items, manager } = this;\n const splitItems: SplitItem[] = [];\n items.forEach((i) => {\n if (i.type === LayoutType.item) {\n const value = manager.findItem(i.key as string);\n if (value) {\n splitItems.push(value);\n }\n }\n });\n return [...splitItems].sort((a, b) => (a.index || 0) - (b.index || 0));\n }\n\n /**\n * Finds an index where to put an item.\n * This finds \"holes\" in items where an index is not set for a given position.\n * In this case the resulting index is the missing index.\n * Otherwise it returns next after the highest index.\n * \n * @returns The index of the next item\n */\n nextIndex(): number {\n const { items, manager } = this;\n if (!items.length) {\n return 0;\n }\n const set = new Set<number>();\n for (const item of items) {\n const value = manager.findItem(item.key as string);\n if (!value) {\n continue;\n }\n const { index = 0 } = value;\n set.add(index);\n }\n const sorted = [...set].sort();\n const missing = missingIndexes(sorted);\n if (missing.length) {\n return missing[0];\n }\n const max = sorted.pop() as number;\n return max + 1;\n }\n\n /**\n * Checks whether this panel contains an item\n * @param key The key of the item to test.\n * @returns true if the panel contains an item\n */\n hasItem(key: string): boolean {\n return this.items.some(i => i.key === key);\n }\n\n /**\n * Adds an item to the layout.\n * \n * @param item The item to add\n * @param opts Layout adding item options\n * @returns Whether a new item was added to the layout. false when the item is already in the layout panel.\n */\n addItem(item: ISplitItem | SplitItem, opts: SplitLayoutAddOptions = {}): SplitItem {\n const { region = SplitRegion.center } = opts;\n const hasItem = region === SplitRegion.center && this.hasItem(item.key);\n if (hasItem) {\n if (item.key !== this.selected) {\n this.selected = item.key;\n this.manager.notifyChange();\n this.updateView();\n }\n return this.manager.findItem(item.key) as SplitItem;\n }\n\n const hasOptionIndex = typeof opts.index === 'number';\n const hasItemIndex = typeof item.index === 'number';\n const hasIndex = hasOptionIndex || hasItemIndex;\n let index: number;\n if (hasOptionIndex) {\n index = opts.index as number;\n } else if (hasItemIndex) {\n index = item.index as number;\n } else {\n index = this.nextIndex();\n }\n if (region === SplitRegion.center || (!this.hasItems && !this.hasPanels)) {\n if (hasIndex) {\n this.increaseIndex(index); // + 1\n }\n const instance = (item as SplitItem).toJSON ? item as SplitItem : new SplitItem(this.manager, item);\n instance.index = index;\n this.items.push({\n type: LayoutType.item,\n key: item.key,\n });\n this.manager.definitions.set(item.key, {\n type: LayoutType.item,\n value: instance,\n });\n // this.manager.dispatchNameItem(instance); ???? it's a fresh definition, should have a current name.\n this.selected = item.key;\n this.manager.notifyChange();\n this.updateView();\n return instance;\n }\n\n let panel: SplitPanel;\n if (region === 'east') {\n [, panel] = this.split({\n layout: SplitDirection.horizontal,\n itemsTarget: SplitPanelTarget.first,\n noSideEffects: true,\n });\n } else if (region === 'west') {\n [panel] = this.split({\n layout: SplitDirection.horizontal,\n itemsTarget: SplitPanelTarget.other,\n noSideEffects: true,\n });\n } else if (region === 'south') {\n [, panel] = this.split({\n layout: SplitDirection.vertical,\n itemsTarget: SplitPanelTarget.first,\n noSideEffects: true,\n });\n } else {\n [panel] = this.split({\n layout: SplitDirection.vertical,\n itemsTarget: SplitPanelTarget.other,\n noSideEffects: true,\n });\n }\n // we don't call request update here because\n // the app has to redo the view rendering first as\n // the panel purpose has changed.\n return panel.addItem(item, { index });\n }\n\n /**\n * Splits this panel into 2 panels.\n * This to be used when the panel has no other panels. Only items are allowed.\n * It produces 2 new panels and moves the items to the first one leaving the other one available.\n */\n split(opts: SplitPanelSplitOptions = {}): SplitPanel[] {\n const { layout = SplitDirection.horizontal, itemsTarget = SplitPanelTarget.first } = opts;\n if (this.hasPanels) {\n throw new Error(`Invalid state. Panels can be split only when containing items only.`);\n }\n this.layout = layout;\n const { items, selected } = this;\n this.items = [];\n this.selected = undefined;\n\n const p1 = this.addPanel()\n const p2 = this.addPanel()\n\n\n\n\n // const p1 = new SplitPanel(this.manager);\n // const p2 = new SplitPanel(this.manager);\n // this.manager.definitions.set(p1.key, {\n // type: LayoutType.panel,\n // value: p1,\n // });\n // this.manager.definitions.set(p2.key, {\n // type: LayoutType.panel,\n // value: p2,\n // });\n // this.items.push({\n // type: LayoutType.panel,\n // key: p1.key,\n // });\n // this.items.push({\n // type: LayoutType.panel,\n // key: p2.key,\n // });\n\n const panel = itemsTarget === SplitPanelTarget.first ? p1 : p2;\n panel.items = items;\n panel.selected = selected;\n if (!opts.noSideEffects) {\n this.manager.notifyChange();\n }\n return [p1, p2];\n }\n\n unsplit(): void {\n const panelItem = this.items.find(i => i.type === LayoutType.panel);\n if (!panelItem) {\n throw new Error('Invalid state. This panel has no panels to unshift.');\n }\n const panel = this.manager.findPanel(panelItem.key);\n if (!panel) {\n throw new Error('Invalid state. This panel is not managed by the SplitManager.');\n }\n const { items, selected } = panel;\n this.items = items;\n this.selected = selected;\n this.manager.notifyChange();\n }\n\n /**\n * Decreases items index by 1 to all items with index at least equal to `fromIndex`.\n * @param fromIndex The minimal index to affect.\n */\n decreaseIndex(fromIndex: number): void {\n for (const item of this.items) {\n if (item.type !== LayoutType.item) {\n continue;\n }\n const definition = this.manager.findItem(item.key);\n if (!definition) {\n continue;\n }\n if (!definition.index) {\n definition.index = 0;\n }\n const { index } = definition;\n if (index >= fromIndex && index > 0) {\n definition.index -= 1;\n }\n }\n }\n\n /**\n * Increases items index by 1 to all items with index at least equal to `fromIndex`.\n * @param fromIndex The minimal index to affect.\n */\n increaseIndex(fromIndex: number): void {\n for (const item of this.items) {\n if (item.type !== LayoutType.item) {\n continue;\n }\n const definition = this.manager.findItem(item.key);\n if (!definition) {\n continue;\n }\n if (!definition.index) {\n definition.index = 0;\n }\n const { index } = definition;\n if (index >= fromIndex) {\n definition.index += 1;\n }\n }\n }\n\n /**\n * Removes an item from the layout\n * @param key The `key` of the item.\n * @returns The removed item, if any.\n */\n removeItem(key: string, opts: SplitPanelRemoveItemOptions = {}): SplitItem | undefined {\n const removed = this.manager.findItem(key);\n if (!removed) {\n return undefined;\n }\n const index = this.items.findIndex(i => i.key === key);\n if (index < 0) {\n return undefined;\n }\n const itemInfo = this.items[index];\n this.items.splice(index, 1);\n this.manager.definitions.delete(itemInfo.key);\n this.decreaseIndex(removed.index || 0);\n\n if (this.items.length === 0) {\n // remove panel (self)\n const parent = this.getParent();\n if (parent) {\n parent.removePanel(this.key);\n // Note, ignore `opts.noSideEffects` for tab close. It won't get dispatched elsewhere.\n this.manager.notifyTabClose(key);\n // no point doing the stuff below as the whole panel is removed.\n return removed;\n }\n }\n if (this.selected === key) {\n let nextKey: string | undefined;\n if (this.items[index]) {\n nextKey = this.items[index].key;\n } else if (this.items[index - 1]) {\n nextKey = this.items[index - 1].key;\n } else if (this.items.length) {\n const [item] = this.items;\n nextKey = item.key;\n }\n this.selected = nextKey;\n }\n if (!opts.noSideEffects) {\n this.manager.notifyTabClose(key);\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n return removed;\n }\n\n /**\n * @param key The key of the item to perform a relative operation from.\n * @param dir The direction to which close other items. Default to both directions leaving only the `key` item\n */\n removeRelative(key: string, dir: SplitCloseDirection = SplitCloseDirection.both): void {\n const index = this.items.findIndex(i => i.key === key);\n if (index < 0) {\n return;\n }\n // note, even though we keep indexes in the item, the logic actually\n // keeps track of them and orders the `items` accordingly.\n const item = this.items[index];\n let removed: IPanelObject[];\n if (dir === SplitCloseDirection.both) {\n removed = this.items.filter(i => i !== item);\n this.items = [item];\n this.selected = item.key;\n } else if (dir === SplitCloseDirection.left) {\n removed = this.items.slice(0, index);\n this.items = this.items.splice(index);\n this.selected = item.key;\n } else {\n removed = this.items.slice(index + 1);\n this.items = this.items.splice(0, index + 1);\n this.selected = item.key;\n }\n removed.forEach(i => {\n this.manager.definitions.delete(i.key);\n this.manager.notifyTabClose(i.key);\n });\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n\n removePanel(id: string, opts: SplitPanelRemoveItemOptions = {}): void {\n const index = this.items.findIndex(p => p.key === id);\n if (index < 0) {\n return;\n }\n const item = this.items[index];\n\n const panel = this.manager.findPanel(item.key) as SplitPanel;\n panel.clearItems();\n\n this.items.splice(index, 1);\n this.manager.definitions.delete(item.key);\n if (this.items.length === 1) {\n this.unsplit();\n }\n if (!opts.noSideEffects) {\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n }\n\n clearItems(opts?: SplitPanelRemoveItemOptions): void {\n const { items } = this;\n items.forEach((childItem) => {\n if (childItem.type === LayoutType.item) {\n this.removeItem(childItem.key, opts);\n } else {\n this.removePanel(childItem.key, opts);\n }\n });\n }\n\n /**\n * Moves an item to a new index.\n * \n * @param key The item key\n * @param toIndex The new index. When not set it moves the item to the end.\n */\n moveItem(key: string, toIndex?: number): void {\n const info = this.items.find(i => i.key === key);\n if (!info) {\n return;\n }\n const item = this.manager.findItem(info.key);\n if (!item) {\n return;\n }\n const hasIndex = typeof toIndex === 'number';\n if (hasIndex && item.index === toIndex) {\n return;\n }\n let hasTargetAtTarget = false;\n if (hasIndex) {\n hasTargetAtTarget = !!this.items[toIndex];\n }\n if (item.index !== undefined) {\n this.decreaseIndex(item.index);\n }\n const finalIndex = hasIndex ? toIndex as number : this.nextIndex();\n if (hasTargetAtTarget) {\n this.increaseIndex(finalIndex);\n }\n item.index = finalIndex;\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n\n updateView(): void {\n const layout = this.manager.findView(this.key);\n if (!layout) {\n return;\n }\n layout.requestUpdate();\n }\n\n addPanel(layout = SplitDirection.horizontal): SplitPanel {\n return this.manager.addPanel({ layout, parent: this.key });\n }\n\n panelTemplate(panel: SplitPanel, itemCallback: SplitItemRenderCallback): TemplateResult | undefined {\n const { layout, items, selected, manager } = panel;\n const renderPanels = items.filter(i => i.type === LayoutType.panel);\n const renderItems = items.filter(i => i.type === LayoutType.item);\n if (!renderPanels.length && !renderItems.length) {\n return undefined;\n }\n const { dragTypes, constrain } = manager.options;\n let content: (TemplateResult | undefined)[];\n \n if (renderPanels.length) {\n content = renderPanels.map((item) => {\n const targetPanel = manager.findPanel(item.key);\n return targetPanel && this.panelTemplate(targetPanel, itemCallback)\n });\n } else {\n content = renderItems.map((item) => {\n const targetItem = manager.findItem(item.key);\n return targetItem && this.itemTemplate(targetItem, targetItem.key === selected, itemCallback)\n });\n }\n const valid = content.filter(i => !!i);\n if (!valid.length) {\n return undefined;\n }\n return html`\n <split-view \n layout=\"${layout}\" \n .dragTypes=\"${dragTypes}\" \n .panel=\"${panel}\"\n .key=\"${panel.key}\"\n ?constrain=\"${constrain}\"\n >\n ${content}\n </split-view>\n `;\n }\n\n itemTemplate(item: SplitItem, visible: boolean, itemCallback: SplitItemRenderCallback): TemplateResult {\n return itemCallback(item, visible);\n }\n\n render(itemCallback: SplitItemRenderCallback): TemplateResult | undefined {\n return this.panelTemplate(this, itemCallback);\n }\n}\n"]}
1
+ {"version":3,"file":"SplitPanel.js","sourceRoot":"","sources":["../../../src/elements/layout/SplitPanel.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\n/* eslint-disable import/no-cycle */\nimport { html, TemplateResult } from \"lit\";\nimport { uuidV4 } from \"@api-client/core/build/browser.js\";\nimport { ISplitItem, SplitItem } from \"./SplitItem.js\";\nimport { IPanelObject, LayoutType, PanelState, SplitCloseDirection, SplitDirection, SplitItemRenderCallback, SplitLayoutAddOptions, SplitPanelRemoveItemOptions, SplitPanelSplitOptions, SplitPanelTarget, SplitRegion } from \"./type.js\";\nimport { SplitLayout } from './SplitLayout.js';\nimport missingIndexes from \"../../lib/math/MissingIndexes.js\";\nimport '../../define/layout/split-view.js';\n\nexport interface ISplitPanel {\n /**\n * If already generated, the key of the panel.\n */\n key?: string;\n\n layout: SplitDirection;\n items?: IPanelObject[];\n /**\n * The item being rendered in the panel.\n * Note, this is the `key` of the item and not the `id` of the item.\n */\n selected?: string;\n}\n\n/**\n * The class represents a panel model for the split layout.\n * A panel can only hold other panels or layout items. When a panel\n * defines both, items are ignored.\n * \n * A panel can render ony one item at a time. TO view more items \n * the application needs to add panels to this panel and distribute items among them.\n */\nexport class SplitPanel {\n /**\n * The key used as an internal reference to the definitions map.\n */\n key = uuidV4();\n\n layout: SplitDirection = SplitDirection.horizontal;\n\n items: IPanelObject[] = [];\n\n /**\n * The item being rendered in the panel.\n * Note, this is the `key` of the item and not the `id` of the item.\n */\n selected?: string;\n\n /**\n * The current state of the panel.\n */\n state: PanelState = PanelState.idle;\n\n get hasPanels(): boolean {\n return this.items.some(i => i.type === LayoutType.panel);\n }\n\n get hasItems(): boolean {\n return this.items.some(i => i.type === LayoutType.item);\n }\n\n static fromLayout(manager: SplitLayout, layout = SplitDirection.horizontal): SplitPanel {\n const schema: ISplitPanel = {\n layout,\n };\n return new SplitPanel(manager, schema);\n }\n\n /**\n * @param manager A reference to the manager.\n * @param parentPanel A reference to a parent panel.\n */\n constructor(public manager: SplitLayout, schema?: ISplitPanel) {\n if (schema) {\n this.new(schema);\n }\n }\n\n new(schema: ISplitPanel): void {\n const { key = uuidV4(), layout = SplitDirection.horizontal, items, selected } = schema;\n this.key = key;\n this.layout = layout;\n if (Array.isArray(items)) {\n this.items = items.map(i => ({ ...i }));\n } else {\n this.items = [];\n }\n if (selected) {\n this.selected = selected;\n } else {\n this.selected = undefined;\n }\n this.state = PanelState.idle;\n }\n\n toJSON(): ISplitPanel {\n const result: ISplitPanel = {\n layout: this.layout,\n key: this.key,\n };\n if (Array.isArray(this.items) && this.items.length) {\n result.items = this.items.map(i => ({ ...i }));\n }\n if (this.selected) {\n result.selected = this.selected;\n }\n return result;\n }\n\n getParent(): SplitPanel | undefined {\n return this.manager.getParents(this.key)[0];\n }\n\n /**\n * @returns True when the panel accepts drop events.\n */\n canDrop(): boolean {\n return !!this.items.length;\n }\n\n /**\n * @returns Returns a **copy** of the items array sorted by index.\n */\n sortedItems(): SplitItem[] {\n const { items, manager } = this;\n const splitItems: SplitItem[] = [];\n items.forEach((i) => {\n if (i.type === LayoutType.item) {\n const value = manager.findItem(i.key as string);\n if (value) {\n splitItems.push(value);\n }\n }\n });\n return [...splitItems].sort((a, b) => (a.index || 0) - (b.index || 0));\n }\n\n /**\n * Finds an index where to put an item.\n * This finds \"holes\" in items where an index is not set for a given position.\n * In this case the resulting index is the missing index.\n * Otherwise it returns next after the highest index.\n * \n * @returns The index of the next item\n */\n nextIndex(): number {\n const { items, manager } = this;\n if (!items.length) {\n return 0;\n }\n const set = new Set<number>();\n for (const item of items) {\n const value = manager.findItem(item.key as string);\n if (!value) {\n continue;\n }\n const { index = 0 } = value;\n set.add(index);\n }\n const sorted = [...set].sort();\n const missing = missingIndexes(sorted);\n if (missing.length) {\n return missing[0];\n }\n const max = sorted.pop() as number;\n return max + 1;\n }\n\n /**\n * Checks whether this panel contains an item\n * @param key The key of the item to test.\n * @returns true if the panel contains an item\n */\n hasItem(key: string): boolean {\n return this.items.some(i => i.key === key);\n }\n\n /**\n * Adds an item to the layout.\n * \n * @param item The item to add\n * @param opts Layout adding item options\n * @returns Whether a new item was added to the layout. false when the item is already in the layout panel.\n */\n addItem(item: ISplitItem | SplitItem, opts: SplitLayoutAddOptions = {}): SplitItem {\n const { region = SplitRegion.center } = opts;\n const hasItem = region === SplitRegion.center && this.hasItem(item.key);\n if (hasItem) {\n if (item.key !== this.selected) {\n this.selected = item.key;\n this.manager.notifyChange();\n this.updateView();\n }\n return this.manager.findItem(item.key) as SplitItem;\n }\n\n const hasOptionIndex = typeof opts.index === 'number';\n const hasItemIndex = typeof item.index === 'number';\n const hasIndex = hasOptionIndex || hasItemIndex;\n let index: number;\n if (hasOptionIndex) {\n index = opts.index as number;\n } else if (hasItemIndex) {\n index = item.index as number;\n } else {\n index = this.nextIndex();\n }\n if (region === SplitRegion.center || (!this.hasItems && !this.hasPanels)) {\n if (hasIndex) {\n this.increaseIndex(index); // + 1\n }\n const instance = (item as SplitItem).toJSON ? item as SplitItem : new SplitItem(this.manager, item);\n instance.index = index;\n this.items.push({\n type: LayoutType.item,\n key: item.key,\n });\n this.manager.definitions.set(item.key, {\n type: LayoutType.item,\n value: instance,\n });\n // this.manager.dispatchNameItem(instance); ???? it's a fresh definition, should have a current name.\n this.selected = item.key;\n this.manager.notifyChange();\n this.updateView();\n return instance;\n }\n\n const panel = this.splitByRegion(region);\n // we don't call request update here because\n // the app has to redo the view rendering first as\n // the panel purpose has changed.\n return panel.addItem(item, { index });\n }\n\n protected splitByRegion(region: SplitRegion): SplitPanel {\n let panel: SplitPanel;\n if (region === 'east') {\n [, panel] = this.split({\n layout: SplitDirection.horizontal,\n itemsTarget: SplitPanelTarget.first,\n noSideEffects: true,\n });\n } else if (region === 'west') {\n [panel] = this.split({\n layout: SplitDirection.horizontal,\n itemsTarget: SplitPanelTarget.other,\n noSideEffects: true,\n });\n } else if (region === 'south') {\n [, panel] = this.split({\n layout: SplitDirection.vertical,\n itemsTarget: SplitPanelTarget.first,\n noSideEffects: true,\n });\n } else {\n [panel] = this.split({\n layout: SplitDirection.vertical,\n itemsTarget: SplitPanelTarget.other,\n noSideEffects: true,\n });\n }\n return panel;\n }\n\n /**\n * Splits this panel into 2 panels.\n * This to be used when the panel has no other panels. Only items are allowed.\n * It produces 2 new panels and moves the items to the first one leaving the other one available.\n */\n split(opts: SplitPanelSplitOptions = {}): SplitPanel[] {\n const { layout = SplitDirection.horizontal, itemsTarget = SplitPanelTarget.first } = opts;\n if (this.hasPanels) {\n throw new Error(`Invalid state. Panels can be split only when containing items only.`);\n }\n this.layout = layout;\n const { items, selected } = this;\n this.items = [];\n this.selected = undefined;\n\n const p1 = this.addPanel();\n const p2 = this.addPanel();\n\n // const p1 = new SplitPanel(this.manager);\n // const p2 = new SplitPanel(this.manager);\n // this.manager.definitions.set(p1.key, {\n // type: LayoutType.panel,\n // value: p1,\n // });\n // this.manager.definitions.set(p2.key, {\n // type: LayoutType.panel,\n // value: p2,\n // });\n // this.items.push({\n // type: LayoutType.panel,\n // key: p1.key,\n // });\n // this.items.push({\n // type: LayoutType.panel,\n // key: p2.key,\n // });\n\n const panel = itemsTarget === SplitPanelTarget.first ? p1 : p2;\n panel.items = items;\n panel.selected = selected;\n if (!opts.noSideEffects) {\n this.manager.notifyChange();\n }\n return [p1, p2];\n }\n\n unsplit(): void {\n const panelItem = this.items.find(i => i.type === LayoutType.panel);\n if (!panelItem) {\n throw new Error('Invalid state. This panel has no panels to unshift.');\n }\n const panel = this.manager.findPanel(panelItem.key);\n if (!panel) {\n throw new Error('Invalid state. This panel is not managed by the SplitManager.');\n }\n const { items, selected } = panel;\n this.items = items;\n this.selected = selected;\n this.manager.notifyChange();\n }\n\n /**\n * Decreases items index by 1 to all items with index at least equal to `fromIndex`.\n * @param fromIndex The minimal index to affect.\n */\n decreaseIndex(fromIndex: number): void {\n for (const item of this.items) {\n if (item.type !== LayoutType.item) {\n continue;\n }\n const definition = this.manager.findItem(item.key);\n if (!definition) {\n continue;\n }\n if (!definition.index) {\n definition.index = 0;\n }\n const { index } = definition;\n if (index >= fromIndex && index > 0) {\n definition.index -= 1;\n }\n }\n }\n\n /**\n * Increases items index by 1 to all items with index at least equal to `fromIndex`.\n * @param fromIndex The minimal index to affect.\n */\n increaseIndex(fromIndex: number): void {\n for (const item of this.items) {\n if (item.type !== LayoutType.item) {\n continue;\n }\n const definition = this.manager.findItem(item.key);\n if (!definition) {\n continue;\n }\n if (!definition.index) {\n definition.index = 0;\n }\n const { index } = definition;\n if (index >= fromIndex) {\n definition.index += 1;\n }\n }\n }\n\n removeChildItem(item: SplitItem, opts: SplitPanelRemoveItemOptions = {}): SplitItem | undefined {\n const index = this.items.findIndex(i => i.key === item.key);\n if (index < 0) {\n return undefined;\n }\n const itemInfo = this.items[index];\n this.items.splice(index, 1);\n this.decreaseIndex(item.index || 0);\n const parents = this.manager.getParents(item.key);\n if (!parents.length) {\n // remove the definition since no other panel have this item.\n this.manager.definitions.delete(itemInfo.key);\n }\n\n if (this.items.length === 0) {\n // remove panel (self)\n const parent = this.getParent();\n if (parent) {\n parent.removePanel(this.key);\n // Note, ignore `opts.noSideEffects` for tab close. It won't get dispatched elsewhere.\n this.manager.notifyTabClose(item.key, this.key);\n // no point doing the stuff below as the whole panel is removed.\n return item;\n }\n }\n\n if (this.selected === item.key) {\n let nextKey: string | undefined;\n if (this.items[index]) {\n nextKey = this.items[index].key;\n } else if (this.items[index - 1]) {\n nextKey = this.items[index - 1].key;\n } else if (this.items.length) {\n const [other] = this.items;\n nextKey = other.key;\n }\n this.selected = nextKey;\n }\n\n if (!opts.noSideEffects) {\n this.manager.notifyTabClose(item.key, this.key);\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n return item;\n }\n\n /**\n * Removes an item from the layout\n * @param key The `key` of the item.\n * @returns The removed item, if any.\n */\n removeItem(key: string, opts?: SplitPanelRemoveItemOptions): SplitItem | undefined {\n const removed = this.manager.findItem(key);\n if (!removed) {\n return undefined;\n }\n return this.removeChildItem(removed, opts);\n // const index = this.items.findIndex(i => i.key === key);\n // if (index < 0) {\n // return undefined;\n // }\n // const itemInfo = this.items[index];\n // this.items.splice(index, 1);\n // this.manager.definitions.delete(itemInfo.key);\n // this.decreaseIndex(removed.index || 0);\n\n // if (this.items.length === 0) {\n // // remove panel (self)\n // const parent = this.getParent();\n // if (parent) {\n // parent.removePanel(this.key);\n // // Note, ignore `opts.noSideEffects` for tab close. It won't get dispatched elsewhere.\n // this.manager.notifyTabClose(key);\n // // no point doing the stuff below as the whole panel is removed.\n // return removed;\n // }\n // }\n // if (this.selected === key) {\n // let nextKey: string | undefined;\n // if (this.items[index]) {\n // nextKey = this.items[index].key;\n // } else if (this.items[index - 1]) {\n // nextKey = this.items[index - 1].key;\n // } else if (this.items.length) {\n // const [item] = this.items;\n // nextKey = item.key;\n // }\n // this.selected = nextKey;\n // }\n // if (!opts.noSideEffects) {\n // this.manager.notifyTabClose(key);\n // this.manager.notifyChange();\n // this.manager.updateView(this.key);\n // }\n // return removed;\n }\n\n /**\n * @param key The key of the item to perform a relative operation from.\n * @param dir The direction to which close other items. Default to both directions leaving only the `key` item\n */\n removeRelative(key: string, dir: SplitCloseDirection = SplitCloseDirection.both): void {\n const items = this.sortedItems();\n const index = items.findIndex(i => i.key === key);\n if (index < 0) {\n return;\n }\n \n const item = items[index];\n let removed: string[] = [];\n if (dir === SplitCloseDirection.both) {\n removed = items.filter(i => i !== item).map(i => i.key);\n } else if (dir === SplitCloseDirection.left) {\n removed = items.slice(0, index).map(i => i.key);\n } else {\n removed = this.items.slice(index + 1).map(i => i.key);\n }\n this.items = this.items.filter(i => !removed.includes(i.key));\n this.selected = item.key;\n\n removed.forEach(i => {\n const parents = this.manager.getParents(i);\n if (!parents.length) {\n this.manager.definitions.delete(i);\n }\n this.manager.notifyTabClose(i, this.key);\n });\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n\n removePanel(id: string, opts: SplitPanelRemoveItemOptions = {}): void {\n const index = this.items.findIndex(p => p.key === id);\n if (index < 0) {\n return;\n }\n const item = this.items[index];\n\n const panel = this.manager.findPanel(item.key) as SplitPanel;\n panel.clearItems();\n\n this.items.splice(index, 1);\n this.manager.definitions.delete(item.key);\n if (this.items.length === 1) {\n this.unsplit();\n }\n if (!opts.noSideEffects) {\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n }\n\n clearItems(opts?: SplitPanelRemoveItemOptions): void {\n const { items } = this;\n items.forEach((childItem) => {\n if (childItem.type === LayoutType.item) {\n this.removeItem(childItem.key, opts);\n } else {\n this.removePanel(childItem.key, opts);\n }\n });\n }\n\n /**\n * Moves an item to a new index.\n * \n * @param key The item key\n * @param toIndex The new index. When not set it moves the item to the end.\n */\n moveItem(key: string, opts: SplitLayoutAddOptions = {}): void {\n const info = this.items.find(i => i.key === key);\n if (!info) {\n return;\n }\n const item = this.manager.findItem(info.key);\n if (!item) {\n return;\n }\n const { index, region } = opts;\n if (region) {\n this.moveToRegion(item, region);\n } else if (typeof index === 'number') {\n this.moveToIndex(item, index);\n } else {\n this.moveToEnd(item);\n }\n }\n\n moveToRegion(item: SplitItem, region: SplitRegion): void {\n if (this.items.length < 2) {\n // nothing to split.\n return;\n }\n if (region === SplitRegion.center) {\n // the item is already there.\n return;\n }\n const itemsIndex = this.items.findIndex(i => i.key === item.key);\n if (itemsIndex < 0) {\n return;\n }\n this.items.splice(itemsIndex, 1);\n const index = typeof item.index === 'number' ? item.index : this.nextIndex();\n const panel = this.splitByRegion(region);\n panel.addItem(item, { index });\n }\n\n moveToIndex(item: SplitItem, index: number): void {\n if (item.index === index) {\n return;\n }\n const hasTargetAtTarget = !!this.items[index as number];\n this.decreaseIndex(item.index);\n if (hasTargetAtTarget) {\n this.increaseIndex(index);\n }\n item.index = index;\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n\n moveToEnd(item: SplitItem): void {\n if (item.index !== undefined) {\n this.decreaseIndex(item.index);\n }\n item.index = this.nextIndex();\n this.manager.notifyChange();\n this.manager.updateView(this.key);\n }\n\n updateView(): void {\n const layout = this.manager.findView(this.key);\n if (!layout) {\n return;\n }\n layout.requestUpdate();\n }\n\n addPanel(layout = SplitDirection.horizontal): SplitPanel {\n return this.manager.addPanel({ layout, parent: this.key });\n }\n\n panelTemplate(panel: SplitPanel, itemCallback: SplitItemRenderCallback): TemplateResult | undefined {\n const { layout, items, selected, manager } = panel;\n const renderPanels = items.filter(i => i.type === LayoutType.panel);\n const renderItems = items.filter(i => i.type === LayoutType.item);\n if (!renderPanels.length && !renderItems.length) {\n return undefined;\n }\n const { dragTypes, constrain } = manager.options;\n let content: (TemplateResult | undefined)[];\n \n if (renderPanels.length) {\n content = renderPanels.map((item) => {\n const targetPanel = manager.findPanel(item.key);\n return targetPanel && this.panelTemplate(targetPanel, itemCallback)\n });\n } else {\n content = renderItems.map((item) => {\n const targetItem = manager.findItem(item.key);\n return targetItem && this.itemTemplate(targetItem, targetItem.key === selected, itemCallback)\n });\n }\n const valid = content.filter(i => !!i);\n if (!valid.length) {\n return undefined;\n }\n return html`\n <split-view \n layout=\"${layout}\" \n .dragTypes=\"${dragTypes}\" \n .panel=\"${panel}\"\n .key=\"${panel.key}\"\n ?constrain=\"${constrain}\"\n >\n ${content}\n </split-view>\n `;\n }\n\n itemTemplate(item: SplitItem, visible: boolean, itemCallback: SplitItemRenderCallback): TemplateResult {\n return itemCallback(item, visible);\n }\n\n render(itemCallback: SplitItemRenderCallback): TemplateResult | undefined {\n return this.panelTemplate(this, itemCallback);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SplitView.d.ts","sourceRoot":"","sources":["../../../src/elements/layout/SplitView.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SplitView.d.ts","sourceRoot":"","sources":["../../../src/elements/layout/SplitView.ts"],"names":[],"mappings":"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"}
@@ -67,7 +67,8 @@ export default class SplitView extends LitElement {
67
67
  }
68
68
  handleDrop(e) {
69
69
  const { dataTransfer } = e;
70
- if (!dataTransfer || !this.panelCanDrop(e)) {
70
+ const { panel } = this;
71
+ if (!dataTransfer || !panel || !this.panelCanDrop(e)) {
71
72
  return;
72
73
  }
73
74
  e.preventDefault();
@@ -77,22 +78,24 @@ export default class SplitView extends LitElement {
77
78
  if (!kind || !key) {
78
79
  return;
79
80
  }
81
+ const layoutKey = dataTransfer.getData('layout/key');
80
82
  this.inDrag = false;
81
- const { panel } = this;
82
- let dispatch = true;
83
- if (panel) {
83
+ // TODO: When the drag originated in another panel then we
84
+ // move the panel between them. Otherwise we add the item to the panel.
85
+ if (layoutKey) {
86
+ // move operation not add.
87
+ panel.manager.moveItem(layoutKey, panel.key, key, { region: this.dragRegion });
88
+ }
89
+ else {
84
90
  panel.addItem({ key, kind, label: 'New tab' }, { region: this.dragRegion });
85
91
  panel.manager.requestNameUpdate(key);
86
- dispatch = true;
87
- }
88
- if (dispatch) {
89
- this.dispatchEvent(new CustomEvent('datadrop', {
90
- detail: { kind, key, region: this.dragRegion },
91
- composed: true,
92
- bubbles: true,
93
- cancelable: true,
94
- }));
95
92
  }
93
+ this.dispatchEvent(new CustomEvent('datadrop', {
94
+ detail: { kind, key, region: this.dragRegion },
95
+ composed: true,
96
+ bubbles: true,
97
+ cancelable: true,
98
+ }));
96
99
  this.requestUpdate();
97
100
  }
98
101
  handleDragleave(e) {
@@ -245,7 +248,7 @@ export default class SplitView extends LitElement {
245
248
  moveTab(fromLayout, toLayout, key, toIndex) {
246
249
  const { panel } = this;
247
250
  if (panel) {
248
- panel.manager.moveItem(fromLayout, toLayout, key, toIndex);
251
+ panel.manager.moveItem(fromLayout, toLayout, key, { index: toIndex });
249
252
  }
250
253
  }
251
254
  findTab(e) {
@@ -402,6 +405,7 @@ export default class SplitView extends LitElement {
402
405
  data-index="${index}"
403
406
  data-parent="${ifDefined(parent)}"
404
407
  data-dirty="${isDirty}"
408
+ data-panel="${ifDefined(panel?.key)}"
405
409
  role="tab"
406
410
  class="${classMap(classes)}"
407
411
  draggable="true"