@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.
- package/.eslintrc +8 -1
- package/demo/index.html +3 -0
- package/demo/layout/index.html +91 -0
- package/demo/layout/index.ts +182 -0
- package/dist/elements/layout/SplitItem.d.ts +1 -9
- package/dist/elements/layout/SplitItem.d.ts.map +1 -1
- package/dist/elements/layout/SplitItem.js +27 -20
- package/dist/elements/layout/SplitItem.js.map +1 -1
- package/dist/elements/layout/SplitLayout.d.ts +16 -14
- package/dist/elements/layout/SplitLayout.d.ts.map +1 -1
- package/dist/elements/layout/SplitLayout.js +47 -42
- package/dist/elements/layout/SplitLayout.js.map +1 -1
- package/dist/elements/layout/SplitPanel.d.ts +7 -2
- package/dist/elements/layout/SplitPanel.d.ts.map +1 -1
- package/dist/elements/layout/SplitPanel.js +130 -52
- package/dist/elements/layout/SplitPanel.js.map +1 -1
- package/dist/elements/layout/SplitView.d.ts.map +1 -1
- package/dist/elements/layout/SplitView.js +18 -14
- package/dist/elements/layout/SplitView.js.map +1 -1
- package/dist/elements/layout/type.d.ts +3 -3
- package/dist/elements/layout/type.d.ts.map +1 -1
- package/dist/elements/layout/type.js.map +1 -1
- package/dist/elements/schema-design/DataModelVisualizationElement.d.ts.map +1 -1
- package/dist/elements/schema-design/DataModelVisualizationElement.js +18 -1
- package/dist/elements/schema-design/DataModelVisualizationElement.js.map +1 -1
- package/dist/pages/http-project/HttpClientCommands.d.ts.map +1 -1
- package/dist/pages/http-project/HttpClientCommands.js +28 -12
- package/dist/pages/http-project/HttpClientCommands.js.map +1 -1
- package/package.json +2 -1
- package/src/elements/layout/SplitItem.ts +29 -21
- package/src/elements/layout/SplitLayout.ts +53 -43
- package/src/elements/layout/SplitPanel.ts +140 -57
- package/src/elements/layout/SplitView.ts +18 -15
- package/src/elements/layout/type.ts +3 -4
- package/src/elements/schema-design/DataModelVisualizationElement.ts +18 -1
- package/src/pages/http-project/HttpClientCommands.ts +28 -12
- package/test/elements/layout/SplitItem.test.ts +76 -75
- package/test/elements/layout/SplitLayoutManager.test.ts +70 -69
- package/test/elements/layout/SplitPanel.test.ts +10 -7
- package/tsconfig.eslint.json +8 -0
- package/web-test-runner.config.mjs +4 -1
- package/dist/define/layout/layout-panel.d.ts +0 -7
- package/dist/define/layout/layout-panel.d.ts.map +0 -1
- package/dist/define/layout/layout-panel.js +0 -3
- package/dist/define/layout/layout-panel.js.map +0 -1
- package/dist/elements/layout/LayoutManager.d.ts +0 -327
- package/dist/elements/layout/LayoutManager.d.ts.map +0 -1
- package/dist/elements/layout/LayoutManager.js +0 -747
- package/dist/elements/layout/LayoutManager.js.map +0 -1
- package/dist/elements/layout/LayoutPanelElement.d.ts +0 -62
- package/dist/elements/layout/LayoutPanelElement.d.ts.map +0 -1
- package/dist/elements/layout/LayoutPanelElement.js +0 -628
- package/dist/elements/layout/LayoutPanelElement.js.map +0 -1
- package/src/define/layout/layout-panel.ts +0 -9
- package/src/elements/layout/LayoutManager.ts +0 -930
- 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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
345
|
-
this.
|
|
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
|
|
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 [
|
|
367
|
-
nextKey =
|
|
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
|
|
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
|
|
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
|
-
|
|
388
|
-
|
|
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 =
|
|
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 =
|
|
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.
|
|
408
|
-
|
|
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,
|
|
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
|
|
458
|
-
if (
|
|
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
|
-
|
|
462
|
-
if (
|
|
463
|
-
|
|
524
|
+
const itemsIndex = this.items.findIndex(i => i.key === item.key);
|
|
525
|
+
if (itemsIndex < 0) {
|
|
526
|
+
return;
|
|
464
527
|
}
|
|
465
|
-
|
|
466
|
-
|
|
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
|
|
537
|
+
const hasTargetAtTarget = !!this.items[index];
|
|
538
|
+
this.decreaseIndex(item.index);
|
|
469
539
|
if (hasTargetAtTarget) {
|
|
470
|
-
this.increaseIndex(
|
|
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 =
|
|
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":"AAAA,OAAO,EAAQ,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAIhE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,UAAU;IAC/C;;OAEG;IACwC,MAAM,EAAE,cAAc,CAA6B;IAE9F;;OAEG;IACwC,GAAG,CAAC,EAAE,MAAM,CAAC;IAE7B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhD;;OAEG;IACM,SAAS,CAAC,MAAM,UAAS;IAElC;;OAEG;IACM,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,CAAsB;IAEjE;;OAEG;IACyB,KAAK,CAAC,EAAE,UAAU,CAAC;IAE/C;;;OAGG;IACyC,SAAS,UAAS;;IAWrD,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;IAMrC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI;IAU7C,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI;IAiB5C,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI;
|
|
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
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
if (
|
|
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"
|