dockview 1.8.1 → 1.8.3

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 (48) hide show
  1. package/dist/cjs/dockview/defaultTab.d.ts +4 -1
  2. package/dist/cjs/dockview/defaultTab.d.ts.map +1 -1
  3. package/dist/cjs/dockview/defaultTab.js +18 -11
  4. package/dist/cjs/dockview/defaultTab.js.map +1 -1
  5. package/dist/cjs/dockview/dockview.d.ts +4 -0
  6. package/dist/cjs/dockview/dockview.d.ts.map +1 -1
  7. package/dist/cjs/dockview/dockview.js +9 -0
  8. package/dist/cjs/dockview/dockview.js.map +1 -1
  9. package/dist/cjs/react.d.ts.map +1 -1
  10. package/dist/cjs/react.js.map +1 -1
  11. package/dist/cjs/types.d.ts +2 -1
  12. package/dist/cjs/types.d.ts.map +1 -1
  13. package/dist/dockview.amd.js +229 -116
  14. package/dist/dockview.amd.js.map +1 -1
  15. package/dist/dockview.amd.min.js +2 -2
  16. package/dist/dockview.amd.min.js.map +1 -1
  17. package/dist/dockview.amd.min.noStyle.js +2 -2
  18. package/dist/dockview.amd.min.noStyle.js.map +1 -1
  19. package/dist/dockview.amd.noStyle.js +228 -115
  20. package/dist/dockview.amd.noStyle.js.map +1 -1
  21. package/dist/dockview.cjs.js +229 -116
  22. package/dist/dockview.cjs.js.map +1 -1
  23. package/dist/dockview.esm.js +229 -116
  24. package/dist/dockview.esm.js.map +1 -1
  25. package/dist/dockview.esm.min.js +2 -2
  26. package/dist/dockview.esm.min.js.map +1 -1
  27. package/dist/dockview.js +229 -116
  28. package/dist/dockview.js.map +1 -1
  29. package/dist/dockview.min.js +2 -2
  30. package/dist/dockview.min.js.map +1 -1
  31. package/dist/dockview.min.noStyle.js +2 -2
  32. package/dist/dockview.min.noStyle.js.map +1 -1
  33. package/dist/dockview.noStyle.js +228 -115
  34. package/dist/dockview.noStyle.js.map +1 -1
  35. package/dist/esm/dockview/defaultTab.d.ts +4 -1
  36. package/dist/esm/dockview/defaultTab.d.ts.map +1 -1
  37. package/dist/esm/dockview/defaultTab.js +18 -11
  38. package/dist/esm/dockview/defaultTab.js.map +1 -1
  39. package/dist/esm/dockview/dockview.d.ts +4 -0
  40. package/dist/esm/dockview/dockview.d.ts.map +1 -1
  41. package/dist/esm/dockview/dockview.js +9 -0
  42. package/dist/esm/dockview/dockview.js.map +1 -1
  43. package/dist/esm/react.d.ts.map +1 -1
  44. package/dist/esm/react.js.map +1 -1
  45. package/dist/esm/types.d.ts +2 -1
  46. package/dist/esm/types.d.ts.map +1 -1
  47. package/dist/styles/dockview.css +3 -3
  48. package/package.json +3 -3
package/dist/dockview.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview
3
- * @version 1.8.1
3
+ * @version 1.8.3
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -57,7 +57,7 @@
57
57
  }
58
58
  }
59
59
 
60
- var css_248z = "@import \"dockview-core/dist/styles/dockview.css\";\n.tab .dockview-react-tab {\n display: flex;\n padding: 0px 8px;\n align-items: center;\n height: 100%;\n}\n.tab .dockview-react-tab .dockview-react-tab-title {\n padding: 0px 8px;\n flex-grow: 1;\n}\n.tab .dockview-react-tab .dockview-react-tab-action {\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n.tab .dockview-react-tab .dockview-react-tab-action:hover {\n border-radius: 2px;\n background-color: var(--dv-icon-hover-background-color);\n}\n.tab.inactive-tab:not(:hover) .dockview-react-tab-action {\n visibility: hidden;\n}\n.dockview-react-part {\n height: 100%;\n width: 100%;\n}";
60
+ var css_248z = "@import \"dockview-core/dist/styles/dockview.css\";\n.tab .dockview-react-tab {\n display: flex;\n padding: 0px 8px;\n align-items: center;\n height: 100%;\n}\n.tab .dockview-react-tab .dockview-react-tab-title {\n padding: 0px 8px;\n flex-grow: 1;\n}\n.tab .dockview-react-tab .dv-react-tab-close-btn {\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n.tab .dockview-react-tab .dv-react-tab-close-btn:hover {\n border-radius: 2px;\n background-color: var(--dv-icon-hover-background-color);\n}\n.tab.inactive-tab:not(:hover) .dv-react-tab-close-btn {\n visibility: hidden;\n}\n.dockview-react-part {\n height: 100%;\n width: 100%;\n}";
61
61
  styleInject(css_248z);
62
62
 
63
63
  class TransferObject {
@@ -294,9 +294,6 @@
294
294
  get isDisposed() {
295
295
  return this._isDisposed;
296
296
  }
297
- static from(...args) {
298
- return new CompositeDisposable(...args);
299
- }
300
297
  constructor(...args) {
301
298
  this._isDisposed = false;
302
299
  this._disposables = args;
@@ -2500,6 +2497,12 @@
2500
2497
  get onDidDrop() {
2501
2498
  return this.component.onDidDrop;
2502
2499
  }
2500
+ get onWillDragGroup() {
2501
+ return this.component.onWillDragGroup;
2502
+ }
2503
+ get onWillDragPanel() {
2504
+ return this.component.onWillDragPanel;
2505
+ }
2503
2506
  get panels() {
2504
2507
  return this.component.panels;
2505
2508
  }
@@ -2962,7 +2965,7 @@
2962
2965
  }
2963
2966
  configure() {
2964
2967
  this.addDisposables(this._onDragStart, addDisposableListener(this.el, 'dragstart', (event) => {
2965
- if (this.isCancelled(event)) {
2968
+ if (event.defaultPrevented || this.isCancelled(event)) {
2966
2969
  event.preventDefault();
2967
2970
  return;
2968
2971
  }
@@ -2982,19 +2985,23 @@
2982
2985
  }
2983
2986
  this.el.classList.add('dv-dragged');
2984
2987
  setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
2985
- this.dataDisposable.value = this.getData(event.dataTransfer);
2988
+ this.dataDisposable.value = this.getData(event);
2989
+ this._onDragStart.fire(event);
2986
2990
  if (event.dataTransfer) {
2987
2991
  event.dataTransfer.effectAllowed = 'move';
2988
- /**
2989
- * Although this is not used by dockview many third party dnd libraries will check
2990
- * dataTransfer.types to determine valid drag events.
2991
- *
2992
- * For example: in react-dnd if dataTransfer.types is not set then the dragStart event will be cancelled
2993
- * through .preventDefault(). Since this is applied globally to all drag events this would break dockviews
2994
- * dnd logic. You can see the code at
2995
- * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
2996
- */
2997
- event.dataTransfer.setData('text/plain', '__dockview_internal_drag_event__');
2992
+ const hasData = event.dataTransfer.items.length > 0;
2993
+ if (!hasData) {
2994
+ /**
2995
+ * Although this is not used by dockview many third party dnd libraries will check
2996
+ * dataTransfer.types to determine valid drag events.
2997
+ *
2998
+ * For example: in react-dnd if dataTransfer.types is not set then the dragStart event will be cancelled
2999
+ * through .preventDefault(). Since this is applied globally to all drag events this would break dockviews
3000
+ * dnd logic. You can see the code at
3001
+ * https://github.com/react-dnd/react-dnd/blob/main/packages/backend-html5/src/HTML5BackendImpl.ts#L542
3002
+ */
3003
+ event.dataTransfer.setData('text/plain', '__dockview_internal_drag_event__');
3004
+ }
2998
3005
  }
2999
3006
  }), addDisposableListener(this.el, 'dragend', () => {
3000
3007
  this.pointerEventsDisposable.dispose();
@@ -3003,44 +3010,45 @@
3003
3010
  }
3004
3011
  }
3005
3012
 
3013
+ class TabDragHandler extends DragHandler {
3014
+ constructor(element, accessor, group, panel) {
3015
+ super(element);
3016
+ this.accessor = accessor;
3017
+ this.group = group;
3018
+ this.panel = panel;
3019
+ this.panelTransfer = LocalSelectionTransfer.getInstance();
3020
+ }
3021
+ getData(event) {
3022
+ this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, this.panel.id)], PanelTransfer.prototype);
3023
+ return {
3024
+ dispose: () => {
3025
+ this.panelTransfer.clearData(PanelTransfer.prototype);
3026
+ },
3027
+ };
3028
+ }
3029
+ }
3006
3030
  class Tab extends CompositeDisposable {
3007
3031
  get element() {
3008
3032
  return this._element;
3009
3033
  }
3010
- constructor(panelId, accessor, group) {
3034
+ constructor(panel, accessor, group) {
3011
3035
  super();
3012
- this.panelId = panelId;
3036
+ this.panel = panel;
3013
3037
  this.accessor = accessor;
3014
3038
  this.group = group;
3039
+ this.content = undefined;
3015
3040
  this._onChanged = new Emitter();
3016
3041
  this.onChanged = this._onChanged.event;
3017
3042
  this._onDropped = new Emitter();
3018
3043
  this.onDrop = this._onDropped.event;
3044
+ this._onDragStart = new Emitter();
3045
+ this.onDragStart = this._onDragStart.event;
3019
3046
  this._element = document.createElement('div');
3020
3047
  this._element.className = 'tab';
3021
3048
  this._element.tabIndex = 0;
3022
3049
  this._element.draggable = true;
3023
3050
  toggleClass(this.element, 'inactive-tab', true);
3024
- this.addDisposables(this._onChanged, this._onDropped, new (class Handler extends DragHandler {
3025
- constructor() {
3026
- super(...arguments);
3027
- this.panelTransfer = LocalSelectionTransfer.getInstance();
3028
- }
3029
- getData() {
3030
- this.panelTransfer.setData([new PanelTransfer(accessor.id, group.id, panelId)], PanelTransfer.prototype);
3031
- return {
3032
- dispose: () => {
3033
- this.panelTransfer.clearData(PanelTransfer.prototype);
3034
- },
3035
- };
3036
- }
3037
- })(this._element));
3038
- this.addDisposables(addDisposableListener(this._element, 'mousedown', (event) => {
3039
- if (event.defaultPrevented) {
3040
- return;
3041
- }
3042
- this._onChanged.fire(event);
3043
- }));
3051
+ const dragHandler = new TabDragHandler(this._element, this.accessor, this.group, this.panel);
3044
3052
  this.droptarget = new Droptarget(this._element, {
3045
3053
  acceptedTargetZones: ['center'],
3046
3054
  canDisplayOverlay: (event, position) => {
@@ -3054,12 +3062,19 @@
3054
3062
  // don't allow group move to drop on self
3055
3063
  return false;
3056
3064
  }
3057
- return this.panelId !== data.panelId;
3065
+ return this.panel.id !== data.panelId;
3058
3066
  }
3059
3067
  return this.group.model.canDisplayOverlay(event, position, exports.DockviewDropTargets.Tab);
3060
3068
  },
3061
3069
  });
3062
- this.addDisposables(this.droptarget.onDrop((event) => {
3070
+ this.addDisposables(this._onChanged, this._onDropped, this._onDragStart, dragHandler.onDragStart((event) => {
3071
+ this._onDragStart.fire(event);
3072
+ }), dragHandler, addDisposableListener(this._element, 'mousedown', (event) => {
3073
+ if (event.defaultPrevented) {
3074
+ return;
3075
+ }
3076
+ this._onChanged.fire(event);
3077
+ }), this.droptarget.onDrop((event) => {
3063
3078
  this._onDropped.fire(event);
3064
3079
  }), this.droptarget);
3065
3080
  }
@@ -3091,9 +3106,9 @@
3091
3106
  }
3092
3107
 
3093
3108
  class GroupDragHandler extends DragHandler {
3094
- constructor(element, accessorId, group) {
3109
+ constructor(element, accessor, group) {
3095
3110
  super(element);
3096
- this.accessorId = accessorId;
3111
+ this.accessor = accessor;
3097
3112
  this.group = group;
3098
3113
  this.panelTransfer = LocalSelectionTransfer.getInstance();
3099
3114
  this.addDisposables(addDisposableListener(element, 'mousedown', (e) => {
@@ -3113,8 +3128,9 @@
3113
3128
  }
3114
3129
  return false;
3115
3130
  }
3116
- getData(dataTransfer) {
3117
- this.panelTransfer.setData([new PanelTransfer(this.accessorId, this.group.id, null)], PanelTransfer.prototype);
3131
+ getData(dragEvent) {
3132
+ const dataTransfer = dragEvent.dataTransfer;
3133
+ this.panelTransfer.setData([new PanelTransfer(this.accessor.id, this.group.id, null)], PanelTransfer.prototype);
3118
3134
  const style = window.getComputedStyle(this.el);
3119
3135
  const bgColor = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-background-color');
3120
3136
  const color = style.getPropertyValue('--dv-activegroup-visiblepanel-tab-color');
@@ -3149,14 +3165,16 @@
3149
3165
  this.group = group;
3150
3166
  this._onDrop = new Emitter();
3151
3167
  this.onDrop = this._onDrop.event;
3168
+ this._onDragStart = new Emitter();
3169
+ this.onDragStart = this._onDragStart.event;
3152
3170
  this._element = document.createElement('div');
3153
3171
  this._element.className = 'void-container';
3154
3172
  this._element.tabIndex = 0;
3155
3173
  this._element.draggable = true;
3156
- this.addDisposables(this._onDrop, addDisposableListener(this._element, 'click', () => {
3174
+ this.addDisposables(this._onDrop, this._onDragStart, addDisposableListener(this._element, 'click', () => {
3157
3175
  this.accessor.doSetGroupActive(this.group);
3158
3176
  }));
3159
- const handler = new GroupDragHandler(this._element, accessor.id, group);
3177
+ const handler = new GroupDragHandler(this._element, accessor, group);
3160
3178
  this.voidDropTarget = new Droptarget(this._element, {
3161
3179
  acceptedTargetZones: ['center'],
3162
3180
  canDisplayOverlay: (event, position) => {
@@ -3174,7 +3192,9 @@
3174
3192
  return group.model.canDisplayOverlay(event, position, exports.DockviewDropTargets.Panel);
3175
3193
  },
3176
3194
  });
3177
- this.addDisposables(handler, this.voidDropTarget.onDrop((event) => {
3195
+ this.addDisposables(handler, handler.onDragStart((event) => {
3196
+ this._onDragStart.fire(event);
3197
+ }), this.voidDropTarget.onDrop((event) => {
3178
3198
  this._onDrop.fire(event);
3179
3199
  }), this.voidDropTarget);
3180
3200
  }
@@ -3182,7 +3202,7 @@
3182
3202
 
3183
3203
  class TabsContainer extends CompositeDisposable {
3184
3204
  get panels() {
3185
- return this.tabs.map((_) => _.value.panelId);
3205
+ return this.tabs.map((_) => _.value.panel.id);
3186
3206
  }
3187
3207
  get size() {
3188
3208
  return this.tabs.length;
@@ -3236,7 +3256,7 @@
3236
3256
  this.tabs[this.selectedIndex].value === tab);
3237
3257
  }
3238
3258
  indexOf(id) {
3239
- return this.tabs.findIndex((tab) => tab.value.panelId === id);
3259
+ return this.tabs.findIndex((tab) => tab.value.panel.id === id);
3240
3260
  }
3241
3261
  constructor(accessor, group) {
3242
3262
  super();
@@ -3247,7 +3267,11 @@
3247
3267
  this._hidden = false;
3248
3268
  this._onDrop = new Emitter();
3249
3269
  this.onDrop = this._onDrop.event;
3250
- this.addDisposables(this._onDrop);
3270
+ this._onTabDragStart = new Emitter();
3271
+ this.onTabDragStart = this._onTabDragStart.event;
3272
+ this._onGroupDragStart = new Emitter();
3273
+ this.onGroupDragStart = this._onGroupDragStart.event;
3274
+ this.addDisposables(this._onDrop, this._onTabDragStart, this._onGroupDragStart);
3251
3275
  this._element = document.createElement('div');
3252
3276
  this._element.className = 'tabs-and-actions-container';
3253
3277
  toggleClass(this._element, 'dv-full-width-single-tab', this.accessor.options.singleTabMode === 'fullwidth');
@@ -3271,7 +3295,12 @@
3271
3295
  this._element.appendChild(this.leftActionsContainer);
3272
3296
  this._element.appendChild(this.voidContainer.element);
3273
3297
  this._element.appendChild(this.rightActionsContainer);
3274
- this.addDisposables(this.voidContainer, this.voidContainer.onDrop((event) => {
3298
+ this.addDisposables(this.voidContainer, this.voidContainer.onDragStart((event) => {
3299
+ this._onGroupDragStart.fire({
3300
+ nativeEvent: event,
3301
+ group: this.group,
3302
+ });
3303
+ }), this.voidContainer.onDrop((event) => {
3275
3304
  this._onDrop.fire({
3276
3305
  event: event.nativeEvent,
3277
3306
  index: this.tabs.length,
@@ -3317,7 +3346,7 @@
3317
3346
  }
3318
3347
  }
3319
3348
  delete(id) {
3320
- const index = this.tabs.findIndex((tab) => tab.value.panelId === id);
3349
+ const index = this.tabs.findIndex((tab) => tab.value.panel.id === id);
3321
3350
  const tabToRemove = this.tabs.splice(index, 1)[0];
3322
3351
  const { value, disposable } = tabToRemove;
3323
3352
  disposable.dispose();
@@ -3326,21 +3355,23 @@
3326
3355
  }
3327
3356
  setActivePanel(panel) {
3328
3357
  this.tabs.forEach((tab) => {
3329
- const isActivePanel = panel.id === tab.value.panelId;
3358
+ const isActivePanel = panel.id === tab.value.panel.id;
3330
3359
  tab.value.setActive(isActivePanel);
3331
3360
  });
3332
3361
  }
3333
3362
  openPanel(panel, index = this.tabs.length) {
3334
3363
  var _a;
3335
- if (this.tabs.find((tab) => tab.value.panelId === panel.id)) {
3364
+ if (this.tabs.find((tab) => tab.value.panel.id === panel.id)) {
3336
3365
  return;
3337
3366
  }
3338
- const tabToAdd = new Tab(panel.id, this.accessor, this.group);
3367
+ const tab = new Tab(panel, this.accessor, this.group);
3339
3368
  if (!((_a = panel.view) === null || _a === void 0 ? void 0 : _a.tab)) {
3340
3369
  throw new Error('invalid header component');
3341
3370
  }
3342
- tabToAdd.setContent(panel.view.tab);
3343
- const disposable = CompositeDisposable.from(tabToAdd.onChanged((event) => {
3371
+ tab.setContent(panel.view.tab);
3372
+ const disposable = new CompositeDisposable(tab.onDragStart((event) => {
3373
+ this._onTabDragStart.fire({ nativeEvent: event, panel });
3374
+ }), tab.onChanged((event) => {
3344
3375
  var _a;
3345
3376
  const isFloatingGroupsEnabled = !this.accessor.options.disableFloatingGroups;
3346
3377
  const isFloatingWithOnePanel = this.group.api.isFloating && this.size === 1;
@@ -3348,8 +3379,8 @@
3348
3379
  !isFloatingWithOnePanel &&
3349
3380
  event.shiftKey) {
3350
3381
  event.preventDefault();
3351
- const panel = this.accessor.getGroupPanel(tabToAdd.panelId);
3352
- const { top, left } = tabToAdd.element.getBoundingClientRect();
3382
+ const panel = this.accessor.getGroupPanel(tab.panel.id);
3383
+ const { top, left } = tab.element.getBoundingClientRect();
3353
3384
  const { top: rootTop, left: rootLeft } = this.accessor.element.getBoundingClientRect();
3354
3385
  this.accessor.addFloatingGroup(panel, {
3355
3386
  x: left - rootLeft,
@@ -3366,13 +3397,13 @@
3366
3397
  this.group.model.openPanel(panel, {
3367
3398
  skipFocus: alreadyFocused,
3368
3399
  });
3369
- }), tabToAdd.onDrop((event) => {
3400
+ }), tab.onDrop((event) => {
3370
3401
  this._onDrop.fire({
3371
3402
  event: event.nativeEvent,
3372
- index: this.tabs.findIndex((x) => x.value === tabToAdd),
3403
+ index: this.tabs.findIndex((x) => x.value === tab),
3373
3404
  });
3374
3405
  }));
3375
- const value = { value: tabToAdd, disposable };
3406
+ const value = { value: tab, disposable };
3376
3407
  this.addTab(value, index);
3377
3408
  }
3378
3409
  closePanel(panel) {
@@ -3400,7 +3431,7 @@
3400
3431
  }
3401
3432
  set locked(value) {
3402
3433
  this._locked = value;
3403
- toggleClass(this.container, 'locked-groupview', value);
3434
+ toggleClass(this.container, 'locked-groupview', value === 'no-drop-target' || value);
3404
3435
  }
3405
3436
  get isActive() {
3406
3437
  return this._isGroupActive;
@@ -3457,6 +3488,10 @@
3457
3488
  this.onMove = this._onMove.event;
3458
3489
  this._onDidDrop = new Emitter();
3459
3490
  this.onDidDrop = this._onDidDrop.event;
3491
+ this._onTabDragStart = new Emitter();
3492
+ this.onTabDragStart = this._onTabDragStart.event;
3493
+ this._onGroupDragStart = new Emitter();
3494
+ this.onGroupDragStart = this._onGroupDragStart.event;
3460
3495
  this._onDidAddPanel = new Emitter();
3461
3496
  this.onDidAddPanel = this._onDidAddPanel.event;
3462
3497
  this._onDidRemovePanel = new Emitter();
@@ -3469,7 +3504,8 @@
3469
3504
  this.dropTarget = new Droptarget(this.contentContainer.element, {
3470
3505
  acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
3471
3506
  canDisplayOverlay: (event, position) => {
3472
- if (this.locked && position === 'center') {
3507
+ if (this.locked === 'no-drop-target' ||
3508
+ (this.locked && position === 'center')) {
3473
3509
  return false;
3474
3510
  }
3475
3511
  const data = getPanelData();
@@ -3495,8 +3531,12 @@
3495
3531
  });
3496
3532
  container.append(this.tabsContainer.element, this.contentContainer.element);
3497
3533
  this.header.hidden = !!options.hideHeader;
3498
- this.locked = !!options.locked;
3499
- this.addDisposables(this.tabsContainer.onDrop((event) => {
3534
+ this.locked = options.locked || false;
3535
+ this.addDisposables(this._onTabDragStart, this._onGroupDragStart, this.tabsContainer.onTabDragStart((event) => {
3536
+ this._onTabDragStart.fire(event);
3537
+ }), this.tabsContainer.onGroupDragStart((event) => {
3538
+ this._onGroupDragStart.fire(event);
3539
+ }), this.tabsContainer.onDrop((event) => {
3500
3540
  this.handleDropEvent(event.event, 'center', event.index);
3501
3541
  }), this.contentContainer.onDidFocus(() => {
3502
3542
  this.accessor.doSetGroupActive(this.groupPanel, true);
@@ -3551,8 +3591,8 @@
3551
3591
  activeView: (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.id,
3552
3592
  id: this.id,
3553
3593
  };
3554
- if (this.locked) {
3555
- result.locked = true;
3594
+ if (this.locked !== false) {
3595
+ result.locked = this.locked;
3556
3596
  }
3557
3597
  if (this.header.hidden) {
3558
3598
  result.hideHeader = true;
@@ -3802,6 +3842,9 @@
3802
3842
  return false;
3803
3843
  }
3804
3844
  handleDropEvent(event, position, index) {
3845
+ if (this.locked === 'no-drop-target') {
3846
+ return;
3847
+ }
3805
3848
  const data = getPanelData();
3806
3849
  if (data && data.viewId === this.accessor.id) {
3807
3850
  if (data.panelId === null) {
@@ -5259,6 +5302,12 @@
5259
5302
  return pushToTop;
5260
5303
  })();
5261
5304
  class Overlay extends CompositeDisposable {
5305
+ set minimumInViewportWidth(value) {
5306
+ this.options.minimumInViewportWidth = value;
5307
+ }
5308
+ set minimumInViewportHeight(value) {
5309
+ this.options.minimumInViewportHeight = value;
5310
+ }
5262
5311
  constructor(options) {
5263
5312
  super();
5264
5313
  this.options = options;
@@ -5304,9 +5353,11 @@
5304
5353
  const overlayRect = this._element.getBoundingClientRect();
5305
5354
  // region: ensure bounds within allowable limits
5306
5355
  // a minimum width of minimumViewportWidth must be inside the viewport
5307
- const xOffset = Math.max(0, overlayRect.width - this.options.minimumInViewportWidth);
5356
+ const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));
5308
5357
  // a minimum height of minimumViewportHeight must be inside the viewport
5309
- const yOffset = Math.max(0, overlayRect.height - this.options.minimumInViewportHeight);
5358
+ const yOffset = typeof this.options.minimumInViewportHeight === 'number'
5359
+ ? Math.max(0, this.getMinimumHeight(overlayRect.height))
5360
+ : 0;
5310
5361
  const left = clamp(overlayRect.left - containerRect.left, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
5311
5362
  const top = clamp(overlayRect.top - containerRect.top, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
5312
5363
  this._element.style.left = `${left}px`;
@@ -5352,9 +5403,10 @@
5352
5403
  y: e.clientY - overlayRect.top,
5353
5404
  };
5354
5405
  }
5355
- const xOffset = Math.max(0, overlayRect.width - this.options.minimumInViewportWidth);
5356
- const yOffset = Math.max(0, overlayRect.height -
5357
- this.options.minimumInViewportHeight);
5406
+ const xOffset = Math.max(0, this.getMinimumWidth(overlayRect.width));
5407
+ const yOffset = Math.max(0, this.options.minimumInViewportHeight
5408
+ ? this.getMinimumHeight(overlayRect.height)
5409
+ : 0);
5358
5410
  const left = clamp(x - offset.x, -xOffset, Math.max(0, containerRect.width - overlayRect.width + xOffset));
5359
5411
  const top = clamp(y - offset.y, -yOffset, Math.max(0, containerRect.height - overlayRect.height + yOffset));
5360
5412
  this.setBounds({ top, left });
@@ -5428,14 +5480,11 @@
5428
5480
  let height = undefined;
5429
5481
  let left = undefined;
5430
5482
  let width = undefined;
5431
- const minimumInViewportHeight = this.options.minimumInViewportHeight;
5432
- const minimumInViewportWidth = this.options.minimumInViewportWidth;
5433
- function moveTop() {
5483
+ const moveTop = () => {
5434
5484
  top = clamp(y, -Number.MAX_VALUE, startPosition.originalY +
5435
5485
  startPosition.originalHeight >
5436
5486
  containerRect.height
5437
- ? containerRect.height -
5438
- minimumInViewportHeight
5487
+ ? this.getMinimumHeight(containerRect.height)
5439
5488
  : Math.max(0, startPosition.originalY +
5440
5489
  startPosition.originalHeight -
5441
5490
  Overlay.MINIMUM_HEIGHT));
@@ -5443,21 +5492,23 @@
5443
5492
  startPosition.originalY +
5444
5493
  startPosition.originalHeight -
5445
5494
  top;
5446
- }
5447
- function moveBottom() {
5495
+ };
5496
+ const moveBottom = () => {
5448
5497
  top =
5449
5498
  startPosition.originalY -
5450
5499
  startPosition.originalHeight;
5451
- height = clamp(y - top, top < 0
5452
- ? -top + minimumInViewportHeight
5500
+ height = clamp(y - top, top < 0 &&
5501
+ typeof this.options
5502
+ .minimumInViewportHeight === 'number'
5503
+ ? -top +
5504
+ this.options.minimumInViewportHeight
5453
5505
  : Overlay.MINIMUM_HEIGHT, Number.MAX_VALUE);
5454
- }
5455
- function moveLeft() {
5506
+ };
5507
+ const moveLeft = () => {
5456
5508
  left = clamp(x, -Number.MAX_VALUE, startPosition.originalX +
5457
5509
  startPosition.originalWidth >
5458
5510
  containerRect.width
5459
- ? containerRect.width -
5460
- minimumInViewportWidth
5511
+ ? this.getMinimumWidth(containerRect.width)
5461
5512
  : Math.max(0, startPosition.originalX +
5462
5513
  startPosition.originalWidth -
5463
5514
  Overlay.MINIMUM_WIDTH));
@@ -5465,15 +5516,18 @@
5465
5516
  startPosition.originalX +
5466
5517
  startPosition.originalWidth -
5467
5518
  left;
5468
- }
5469
- function moveRight() {
5519
+ };
5520
+ const moveRight = () => {
5470
5521
  left =
5471
5522
  startPosition.originalX -
5472
5523
  startPosition.originalWidth;
5473
- width = clamp(x - left, left < 0
5474
- ? -left + minimumInViewportWidth
5524
+ width = clamp(x - left, left < 0 &&
5525
+ typeof this.options
5526
+ .minimumInViewportWidth === 'number'
5527
+ ? -left +
5528
+ this.options.minimumInViewportWidth
5475
5529
  : Overlay.MINIMUM_WIDTH, Number.MAX_VALUE);
5476
- }
5530
+ };
5477
5531
  switch (direction) {
5478
5532
  case 'top':
5479
5533
  moveTop();
@@ -5517,6 +5571,18 @@
5517
5571
  }));
5518
5572
  }));
5519
5573
  }
5574
+ getMinimumWidth(width) {
5575
+ if (typeof this.options.minimumInViewportWidth === 'number') {
5576
+ return width - this.options.minimumInViewportWidth;
5577
+ }
5578
+ return 0;
5579
+ }
5580
+ getMinimumHeight(height) {
5581
+ if (typeof this.options.minimumInViewportHeight === 'number') {
5582
+ return height - this.options.minimumInViewportHeight;
5583
+ }
5584
+ return height;
5585
+ }
5520
5586
  dispose() {
5521
5587
  this._element.remove();
5522
5588
  super.dispose();
@@ -5537,6 +5603,7 @@
5537
5603
  }
5538
5604
  }
5539
5605
 
5606
+ const DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE = 100;
5540
5607
  class DockviewComponent extends BaseGrid {
5541
5608
  get orientation() {
5542
5609
  return this.gridview.orientation;
@@ -5567,6 +5634,10 @@
5567
5634
  this.nextGroupId = sequentialNumberGenerator();
5568
5635
  this._deserializer = new DefaultDockviewDeserialzier(this);
5569
5636
  this.watermark = null;
5637
+ this._onWillDragPanel = new Emitter();
5638
+ this.onWillDragPanel = this._onWillDragPanel.event;
5639
+ this._onWillDragGroup = new Emitter();
5640
+ this.onWillDragGroup = this._onWillDragGroup.event;
5570
5641
  this._onDidDrop = new Emitter();
5571
5642
  this.onDidDrop = this._onDidDrop.event;
5572
5643
  this._onDidRemovePanel = new Emitter();
@@ -5579,7 +5650,7 @@
5579
5650
  this.onDidActivePanelChange = this._onDidActivePanelChange.event;
5580
5651
  this.floatingGroups = [];
5581
5652
  toggleClass(this.gridview.element, 'dv-dockview', true);
5582
- this.addDisposables(this._onDidDrop, exports.DockviewEvent.any(this.onDidAddGroup, this.onDidRemoveGroup)(() => {
5653
+ this.addDisposables(this._onWillDragPanel, this._onWillDragGroup, this._onDidActivePanelChange, this._onDidAddPanel, this._onDidRemovePanel, this._onDidLayoutFromJSON, this._onDidDrop, exports.DockviewEvent.any(this.onDidAddGroup, this.onDidRemoveGroup)(() => {
5583
5654
  this.updateWatermark();
5584
5655
  }), exports.DockviewEvent.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidActivePanelChange)(() => {
5585
5656
  this._bufferOnDidLayoutChange.fire();
@@ -5616,7 +5687,7 @@
5616
5687
  return true;
5617
5688
  }
5618
5689
  if (this.options.showDndOverlay) {
5619
- if (position === 'center') {
5690
+ if (position === 'center' && this.gridview.length !== 0) {
5620
5691
  /**
5621
5692
  * for external events only show the four-corner drag overlays, disable
5622
5693
  * the center position so that external drag events can fall through to the group
@@ -5652,7 +5723,7 @@
5652
5723
  this.updateWatermark();
5653
5724
  }
5654
5725
  addFloatingGroup(item, coord, options) {
5655
- var _a, _b;
5726
+ var _a, _b, _c, _d, _e, _f;
5656
5727
  let group;
5657
5728
  if (item instanceof DockviewPanel) {
5658
5729
  group = this.createGroup();
@@ -5680,8 +5751,12 @@
5680
5751
  width: (_b = coord === null || coord === void 0 ? void 0 : coord.width) !== null && _b !== void 0 ? _b : 300,
5681
5752
  left: overlayLeft,
5682
5753
  top: overlayTop,
5683
- minimumInViewportWidth: 100,
5684
- minimumInViewportHeight: 100,
5754
+ minimumInViewportWidth: this.options.floatingGroupBounds === 'boundedWithinViewport'
5755
+ ? undefined
5756
+ : (_d = (_c = this.options.floatingGroupBounds) === null || _c === void 0 ? void 0 : _c.minimumWidthWithinViewport) !== null && _d !== void 0 ? _d : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE,
5757
+ minimumInViewportHeight: this.options.floatingGroupBounds === 'boundedWithinViewport'
5758
+ ? undefined
5759
+ : (_f = (_e = this.options.floatingGroupBounds) === null || _e === void 0 ? void 0 : _e.minimumHeightWithinViewport) !== null && _f !== void 0 ? _f : DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE,
5685
5760
  });
5686
5761
  const el = group.element.querySelector('.void-container');
5687
5762
  if (!el) {
@@ -5752,12 +5827,37 @@
5752
5827
  }
5753
5828
  }
5754
5829
  updateOptions(options) {
5830
+ var _a, _b;
5755
5831
  const hasOrientationChanged = typeof options.orientation === 'string' &&
5756
5832
  this.gridview.orientation !== options.orientation;
5833
+ const hasFloatingGroupOptionsChanged = options.floatingGroupBounds !== undefined &&
5834
+ options.floatingGroupBounds !== this.options.floatingGroupBounds;
5757
5835
  this._options = Object.assign(Object.assign({}, this.options), options);
5758
5836
  if (hasOrientationChanged) {
5759
5837
  this.gridview.orientation = options.orientation;
5760
5838
  }
5839
+ if (hasFloatingGroupOptionsChanged) {
5840
+ for (const group of this.floatingGroups) {
5841
+ switch (this.options.floatingGroupBounds) {
5842
+ case 'boundedWithinViewport':
5843
+ group.overlay.minimumInViewportHeight = undefined;
5844
+ group.overlay.minimumInViewportWidth = undefined;
5845
+ break;
5846
+ case undefined:
5847
+ group.overlay.minimumInViewportHeight =
5848
+ DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE;
5849
+ group.overlay.minimumInViewportWidth =
5850
+ DEFAULT_FLOATING_GROUP_OVERFLOW_SIZE;
5851
+ break;
5852
+ default:
5853
+ group.overlay.minimumInViewportHeight =
5854
+ (_a = this.options.floatingGroupBounds) === null || _a === void 0 ? void 0 : _a.minimumHeightWithinViewport;
5855
+ group.overlay.minimumInViewportWidth =
5856
+ (_b = this.options.floatingGroupBounds) === null || _b === void 0 ? void 0 : _b.minimumWidthWithinViewport;
5857
+ }
5858
+ group.overlay.setBounds({});
5859
+ }
5860
+ }
5761
5861
  this.layout(this.gridview.width, this.gridview.height, true);
5762
5862
  }
5763
5863
  layout(width, height, forceResize) {
@@ -6240,7 +6340,11 @@
6240
6340
  const view = new DockviewGroupPanel(this, id, options);
6241
6341
  view.init({ params: {}, accessor: null }); // required to initialized .part and allow for correct disposal of group
6242
6342
  if (!this._groups.has(view.id)) {
6243
- const disposable = new CompositeDisposable(view.model.onMove((event) => {
6343
+ const disposable = new CompositeDisposable(view.model.onTabDragStart((event) => {
6344
+ this._onWillDragPanel.fire(event);
6345
+ }), view.model.onGroupDragStart((event) => {
6346
+ this._onWillDragGroup.fire(event);
6347
+ }), view.model.onMove((event) => {
6244
6348
  const { groupId, itemId, target, index } = event;
6245
6349
  this.moveGroupOrPanel(view, groupId, itemId, target, index);
6246
6350
  }), view.model.onDidDrop((event) => {
@@ -6279,13 +6383,6 @@
6279
6383
  var _a;
6280
6384
  return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;
6281
6385
  }
6282
- dispose() {
6283
- this._onDidActivePanelChange.dispose();
6284
- this._onDidAddPanel.dispose();
6285
- this._onDidRemovePanel.dispose();
6286
- this._onDidLayoutFromJSON.dispose();
6287
- super.dispose();
6288
- }
6289
6386
  }
6290
6387
 
6291
6388
  class GridviewComponent extends BaseGrid {
@@ -7583,6 +7680,7 @@
7583
7680
  createRightHeaderActionsElement: createGroupControlElement(props.rightHeaderActionsComponent, { addPortal }),
7584
7681
  singleTabMode: props.singleTabMode,
7585
7682
  disableFloatingGroups: props.disableFloatingGroups,
7683
+ floatingGroupBounds: props.floatingGroupBounds,
7586
7684
  });
7587
7685
  const { clientWidth, clientHeight } = domRef.current;
7588
7686
  dockview.layout(clientWidth, clientHeight);
@@ -7617,6 +7715,14 @@
7617
7715
  frameworkComponents: props.components,
7618
7716
  });
7619
7717
  }, [props.components]);
7718
+ React__namespace.useEffect(() => {
7719
+ if (!dockviewRef.current) {
7720
+ return;
7721
+ }
7722
+ dockviewRef.current.updateOptions({
7723
+ floatingGroupBounds: props.floatingGroupBounds,
7724
+ });
7725
+ }, [props.floatingGroupBounds]);
7620
7726
  React__namespace.useEffect(() => {
7621
7727
  if (!dockviewRef.current) {
7622
7728
  return;
@@ -7723,25 +7829,32 @@
7723
7829
  React__namespace.createElement("path", { d: "M2.1 27.3L0 25.2L11.55 13.65L0 2.1L2.1 0L13.65 11.55L25.2 0L27.3 2.1L15.75 13.65L27.3 25.2L25.2 27.3L13.65 15.75L2.1 27.3Z" })));
7724
7830
 
7725
7831
  const DockviewDefaultTab = (_a) => {
7726
- var { api, containerApi: _containerApi, params: _params } = _a, rest = __rest(_a, ["api", "containerApi", "params"]);
7832
+ var { api, containerApi: _containerApi, params: _params, hideClose, closeActionOverride } = _a, rest = __rest(_a, ["api", "containerApi", "params", "hideClose", "closeActionOverride"]);
7727
7833
  const onClose = React__namespace.useCallback((event) => {
7728
- event.stopPropagation();
7729
- api.close();
7730
- }, [api]);
7834
+ event.preventDefault();
7835
+ if (closeActionOverride) {
7836
+ closeActionOverride();
7837
+ }
7838
+ else {
7839
+ api.close();
7840
+ }
7841
+ }, [api, closeActionOverride]);
7842
+ const onMouseDown = React__namespace.useCallback((e) => {
7843
+ e.preventDefault();
7844
+ }, []);
7731
7845
  const onClick = React__namespace.useCallback((event) => {
7846
+ if (event.defaultPrevented) {
7847
+ return;
7848
+ }
7732
7849
  api.setActive();
7733
7850
  if (rest.onClick) {
7734
7851
  rest.onClick(event);
7735
7852
  }
7736
7853
  }, [api, rest.onClick]);
7737
- const iconClassname = React__namespace.useMemo(() => {
7738
- const cn = ['dockview-react-tab-action'];
7739
- return cn.join(',');
7740
- }, []);
7741
- return (React__namespace.createElement("div", Object.assign({}, rest, { onClick: onClick, className: "dockview-react-tab" }),
7854
+ return (React__namespace.createElement("div", Object.assign({ "data-testid": "dockview-default-tab" }, rest, { onClick: onClick, className: "dockview-react-tab" }),
7742
7855
  React__namespace.createElement("span", { className: "dockview-react-tab-title" }, api.title),
7743
- React__namespace.createElement("div", { className: iconClassname, onClick: onClose },
7744
- React__namespace.createElement(CloseButton, null))));
7856
+ !hideClose && (React__namespace.createElement("div", { className: "dv-react-tab-close-btn", onMouseDown: onMouseDown, onClick: onClose },
7857
+ React__namespace.createElement(CloseButton, null)))));
7745
7858
  };
7746
7859
 
7747
7860
  class ReactPanelView extends SplitviewPanel {