flexlayout-react 0.7.15 → 0.8.1

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 (252) hide show
  1. package/ChangeLog.txt +28 -0
  2. package/README.md +157 -330
  3. package/Screenshot_light.png +0 -0
  4. package/Screenshot_rounded.png +0 -0
  5. package/declarations/Attribute.d.ts +1 -1
  6. package/declarations/AttributeDefinitions.d.ts +1 -1
  7. package/declarations/DockLocation.d.ts +12 -12
  8. package/declarations/DropInfo.d.ts +12 -12
  9. package/declarations/I18nLabel.d.ts +12 -14
  10. package/declarations/Orientation.d.ts +7 -7
  11. package/declarations/PopupMenu.d.ts +1 -1
  12. package/declarations/Rect.d.ts +41 -28
  13. package/declarations/Types.d.ts +95 -79
  14. package/declarations/examples/demo/Utils.d.ts +4 -0
  15. package/declarations/index.d.ts +21 -22
  16. package/declarations/model/Action.d.ts +5 -5
  17. package/declarations/model/Actions.d.ts +127 -110
  18. package/declarations/model/BorderNode.d.ts +30 -34
  19. package/declarations/model/BorderSet.d.ts +3 -4
  20. package/declarations/model/ICloseType.d.ts +5 -5
  21. package/declarations/model/IDraggable.d.ts +2 -2
  22. package/declarations/model/IDropTarget.d.ts +2 -2
  23. package/declarations/model/IJsonModel.d.ts +811 -149
  24. package/declarations/model/LayoutWindow.d.ts +28 -0
  25. package/declarations/model/Model.d.ts +91 -86
  26. package/declarations/model/Node.d.ts +17 -17
  27. package/declarations/model/RowNode.d.ts +10 -11
  28. package/declarations/model/TabNode.d.ts +44 -37
  29. package/declarations/model/TabSetNode.d.ts +44 -41
  30. package/declarations/model/Utils.d.ts +1 -1
  31. package/declarations/model/WindowLayout.d.ts +24 -0
  32. package/declarations/src/Attribute.d.ts +1 -0
  33. package/declarations/src/AttributeDefinitions.d.ts +1 -0
  34. package/declarations/src/DockLocation.d.ts +12 -0
  35. package/declarations/src/DropInfo.d.ts +12 -0
  36. package/declarations/src/I18nLabel.d.ts +10 -0
  37. package/declarations/src/Orientation.d.ts +7 -0
  38. package/declarations/src/PopupMenu.d.ts +1 -0
  39. package/declarations/src/Rect.d.ts +31 -0
  40. package/declarations/src/Types.d.ts +92 -0
  41. package/declarations/src/index.d.ts +20 -0
  42. package/declarations/src/model/Action.d.ts +5 -0
  43. package/declarations/src/model/Actions.d.ts +110 -0
  44. package/declarations/src/model/BorderNode.d.ts +28 -0
  45. package/declarations/src/model/BorderSet.d.ts +3 -0
  46. package/declarations/src/model/ICloseType.d.ts +5 -0
  47. package/declarations/src/model/IDraggable.d.ts +2 -0
  48. package/declarations/src/model/IDropTarget.d.ts +2 -0
  49. package/declarations/src/model/IJsonModel.d.ts +153 -0
  50. package/declarations/src/model/Model.d.ts +98 -0
  51. package/declarations/src/model/Node.d.ts +16 -0
  52. package/declarations/src/model/RowNode.d.ts +11 -0
  53. package/declarations/src/model/TabNode.d.ts +36 -0
  54. package/declarations/src/model/TabSetNode.d.ts +37 -0
  55. package/declarations/src/model/Utils.d.ts +1 -0
  56. package/declarations/src/view/BorderButton.d.ts +1 -0
  57. package/declarations/src/view/BorderTab.d.ts +2 -0
  58. package/declarations/src/view/BorderTabSet.d.ts +1 -0
  59. package/declarations/src/view/DragContainer.d.ts +1 -0
  60. package/declarations/src/view/ErrorBoundary.d.ts +1 -0
  61. package/declarations/src/view/FloatingWindow.d.ts +1 -0
  62. package/declarations/src/view/Icons.d.ts +7 -0
  63. package/declarations/src/view/Layout.d.ts +113 -0
  64. package/declarations/src/view/Overlay.d.ts +1 -0
  65. package/declarations/src/view/PopupMenu.d.ts +1 -0
  66. package/declarations/src/view/Row.d.ts +1 -0
  67. package/declarations/src/view/Splitter.d.ts +1 -0
  68. package/declarations/src/view/Tab.d.ts +1 -0
  69. package/declarations/src/view/TabButton.d.ts +1 -0
  70. package/declarations/src/view/TabButtonStamp.d.ts +1 -0
  71. package/declarations/src/view/TabOverflowHook.d.ts +1 -0
  72. package/declarations/src/view/TabSet.d.ts +1 -0
  73. package/declarations/src/view/Utils.d.ts +4 -0
  74. package/declarations/view/BorderButton.d.ts +1 -1
  75. package/declarations/view/BorderTab.d.ts +2 -0
  76. package/declarations/view/BorderTabSet.d.ts +1 -1
  77. package/declarations/view/DragContainer.d.ts +1 -0
  78. package/declarations/view/ErrorBoundary.d.ts +1 -1
  79. package/declarations/view/ExtendedResizeObserver.d.ts +23 -0
  80. package/declarations/view/FloatingWindow.d.ts +1 -1
  81. package/declarations/view/Icons.d.ts +8 -7
  82. package/declarations/view/Layout.d.ts +140 -161
  83. package/declarations/view/Overlay.d.ts +1 -0
  84. package/declarations/view/PopoutWindow.d.ts +1 -0
  85. package/declarations/view/PopupMenu.d.ts +1 -0
  86. package/declarations/view/Row.d.ts +1 -0
  87. package/declarations/view/SizeTracker.d.ts +10 -0
  88. package/declarations/view/Splitter.d.ts +1 -1
  89. package/declarations/view/Tab.d.ts +1 -1
  90. package/declarations/view/TabButton.d.ts +1 -1
  91. package/declarations/view/TabButtonStamp.d.ts +1 -1
  92. package/declarations/view/TabOverflowHook.d.ts +1 -1
  93. package/declarations/view/TabSet.d.ts +1 -1
  94. package/declarations/view/Utils.d.ts +11 -1
  95. package/dist/bundles/demo.js +232052 -0
  96. package/dist/bundles/demo.js.map +1 -0
  97. package/dist/flexlayout.js +122 -92
  98. package/dist/flexlayout_min.js +1 -1
  99. package/lib/Attribute.js +42 -31
  100. package/lib/Attribute.js.map +1 -1
  101. package/lib/AttributeDefinitions.js +131 -108
  102. package/lib/AttributeDefinitions.js.map +1 -1
  103. package/lib/DockLocation.js +120 -124
  104. package/lib/DockLocation.js.map +1 -1
  105. package/lib/DropInfo.js +9 -13
  106. package/lib/DropInfo.js.map +1 -1
  107. package/lib/I18nLabel.js +13 -18
  108. package/lib/I18nLabel.js.map +1 -1
  109. package/lib/Orientation.js +22 -26
  110. package/lib/Orientation.js.map +1 -1
  111. package/lib/Rect.js +104 -72
  112. package/lib/Rect.js.map +1 -1
  113. package/lib/Types.js +96 -83
  114. package/lib/Types.js.map +1 -1
  115. package/lib/index.js +21 -38
  116. package/lib/index.js.map +1 -1
  117. package/lib/model/Action.js +6 -10
  118. package/lib/model/Action.js.map +1 -1
  119. package/lib/model/Actions.js +169 -155
  120. package/lib/model/Actions.js.map +1 -1
  121. package/lib/model/BorderNode.js +385 -406
  122. package/lib/model/BorderNode.js.map +1 -1
  123. package/lib/model/BorderSet.js +66 -121
  124. package/lib/model/BorderSet.js.map +1 -1
  125. package/lib/model/ICloseType.js +6 -9
  126. package/lib/model/ICloseType.js.map +1 -1
  127. package/lib/model/IDraggable.js +1 -2
  128. package/lib/model/IDropTarget.js +1 -2
  129. package/lib/model/IJsonModel.js +1 -2
  130. package/lib/model/LayoutWindow.js +83 -0
  131. package/lib/model/LayoutWindow.js.map +1 -0
  132. package/lib/model/Model.js +614 -496
  133. package/lib/model/Model.js.map +1 -1
  134. package/lib/model/Node.js +217 -228
  135. package/lib/model/Node.js.map +1 -1
  136. package/lib/model/RowNode.js +491 -504
  137. package/lib/model/RowNode.js.map +1 -1
  138. package/lib/model/TabNode.js +289 -184
  139. package/lib/model/TabNode.js.map +1 -1
  140. package/lib/model/TabSetNode.js +459 -446
  141. package/lib/model/TabSetNode.js.map +1 -1
  142. package/lib/model/Utils.js +47 -82
  143. package/lib/model/Utils.js.map +1 -1
  144. package/lib/view/BorderButton.js +129 -138
  145. package/lib/view/BorderButton.js.map +1 -1
  146. package/lib/view/BorderTab.js +47 -0
  147. package/lib/view/BorderTab.js.map +1 -0
  148. package/lib/view/BorderTabSet.js +134 -128
  149. package/lib/view/BorderTabSet.js.map +1 -1
  150. package/lib/view/DragContainer.js +16 -0
  151. package/lib/view/DragContainer.js.map +1 -0
  152. package/lib/view/ErrorBoundary.js +23 -27
  153. package/lib/view/ErrorBoundary.js.map +1 -1
  154. package/lib/view/Icons.js +40 -45
  155. package/lib/view/Icons.js.map +1 -1
  156. package/lib/view/Layout.js +919 -907
  157. package/lib/view/Layout.js.map +1 -1
  158. package/lib/view/Overlay.js +9 -0
  159. package/lib/view/Overlay.js.map +1 -0
  160. package/lib/view/PopoutWindow.js +129 -0
  161. package/lib/view/PopoutWindow.js.map +1 -0
  162. package/lib/view/PopupMenu.js +71 -0
  163. package/lib/view/PopupMenu.js.map +1 -0
  164. package/lib/view/Row.js +45 -0
  165. package/lib/view/Row.js.map +1 -0
  166. package/lib/view/SizeTracker.js +11 -0
  167. package/lib/view/SizeTracker.js.map +1 -0
  168. package/lib/view/Splitter.js +191 -147
  169. package/lib/view/Splitter.js.map +1 -1
  170. package/lib/view/Tab.js +86 -60
  171. package/lib/view/Tab.js.map +1 -1
  172. package/lib/view/TabButton.js +127 -135
  173. package/lib/view/TabButton.js.map +1 -1
  174. package/lib/view/TabButtonStamp.js +16 -21
  175. package/lib/view/TabButtonStamp.js.map +1 -1
  176. package/lib/view/TabOverflowHook.js +150 -149
  177. package/lib/view/TabOverflowHook.js.map +1 -1
  178. package/lib/view/TabSet.js +272 -234
  179. package/lib/view/TabSet.js.map +1 -1
  180. package/lib/view/Utils.js +126 -68
  181. package/lib/view/Utils.js.map +1 -1
  182. package/package.json +36 -30
  183. package/src/Attribute.ts +23 -0
  184. package/src/AttributeDefinitions.ts +38 -15
  185. package/src/DockLocation.ts +13 -13
  186. package/src/I18nLabel.ts +7 -9
  187. package/src/Rect.ts +53 -1
  188. package/src/Types.ts +16 -0
  189. package/src/index.ts +1 -2
  190. package/src/model/Actions.ts +49 -29
  191. package/src/model/BorderNode.ts +208 -214
  192. package/src/model/BorderSet.ts +42 -91
  193. package/src/model/IJsonModel.ts +883 -103
  194. package/src/model/LayoutWindow.ts +121 -0
  195. package/src/model/Model.ts +488 -366
  196. package/src/model/Node.ts +98 -111
  197. package/src/model/RowNode.ts +323 -319
  198. package/src/model/TabNode.ts +294 -110
  199. package/src/model/TabSetNode.ts +303 -242
  200. package/src/model/Utils.ts +6 -32
  201. package/src/view/BorderButton.tsx +36 -52
  202. package/src/view/BorderTab.tsx +70 -0
  203. package/src/view/BorderTabSet.tsx +64 -52
  204. package/src/view/DragContainer.tsx +32 -0
  205. package/src/view/Icons.tsx +6 -0
  206. package/src/view/Layout.tsx +1053 -1046
  207. package/src/view/Overlay.tsx +22 -0
  208. package/src/view/PopoutWindow.tsx +152 -0
  209. package/src/{PopupMenu.tsx → view/PopupMenu.tsx} +36 -31
  210. package/src/view/Row.tsx +68 -0
  211. package/src/view/SizeTracker.tsx +20 -0
  212. package/src/view/Splitter.tsx +167 -112
  213. package/src/view/Tab.tsx +76 -42
  214. package/src/view/TabButton.tsx +39 -54
  215. package/src/view/TabButtonStamp.tsx +5 -9
  216. package/src/view/TabOverflowHook.tsx +14 -9
  217. package/src/view/TabSet.tsx +221 -176
  218. package/src/view/Utils.tsx +119 -39
  219. package/style/_base.scss +140 -34
  220. package/style/dark.css +140 -35
  221. package/style/dark.css.map +1 -1
  222. package/style/dark.scss +3 -1
  223. package/style/gray.css +139 -34
  224. package/style/gray.css.map +1 -1
  225. package/style/gray.scss +2 -0
  226. package/style/light.css +141 -36
  227. package/style/light.css.map +1 -1
  228. package/style/light.scss +4 -2
  229. package/style/rounded.css +697 -0
  230. package/style/rounded.css.map +1 -0
  231. package/style/rounded.scss +194 -0
  232. package/style/underline.css +139 -34
  233. package/style/underline.css.map +1 -1
  234. package/style/underline.scss +2 -0
  235. package/cypress.config.ts +0 -16
  236. package/lib/DragDrop.js +0 -316
  237. package/lib/DragDrop.js.map +0 -1
  238. package/lib/PopupMenu.js +0 -68
  239. package/lib/PopupMenu.js.map +0 -1
  240. package/lib/model/SplitterNode.js +0 -72
  241. package/lib/model/SplitterNode.js.map +0 -1
  242. package/lib/view/FloatingWindow.js +0 -123
  243. package/lib/view/FloatingWindow.js.map +0 -1
  244. package/lib/view/FloatingWindowTab.js +0 -19
  245. package/lib/view/FloatingWindowTab.js.map +0 -1
  246. package/lib/view/TabFloating.js +0 -66
  247. package/lib/view/TabFloating.js.map +0 -1
  248. package/src/DragDrop.ts +0 -392
  249. package/src/model/SplitterNode.ts +0 -78
  250. package/src/view/FloatingWindow.tsx +0 -140
  251. package/src/view/FloatingWindowTab.tsx +0 -29
  252. package/src/view/TabFloating.tsx +0 -101
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TabFloating = void 0;
4
- const React = require("react");
5
- const Actions_1 = require("../model/Actions");
6
- const TabSetNode_1 = require("../model/TabSetNode");
7
- const Types_1 = require("../Types");
8
- const I18nLabel_1 = require("../I18nLabel");
9
- const Utils_1 = require("./Utils");
10
- /** @internal */
11
- const TabFloating = (props) => {
12
- const { layout, selected, node, path } = props;
13
- const showPopout = () => {
14
- if (node.getWindow()) {
15
- node.getWindow().focus();
16
- }
17
- };
18
- const dockPopout = () => {
19
- layout.doAction(Actions_1.Actions.unFloatTab(node.getId()));
20
- };
21
- const onMouseDown = () => {
22
- const parent = node.getParent();
23
- if (parent.getType() === TabSetNode_1.TabSetNode.TYPE) {
24
- if (!parent.isActive()) {
25
- layout.doAction(Actions_1.Actions.setActiveTabset(parent.getId()));
26
- }
27
- }
28
- };
29
- const onClickFocus = (event) => {
30
- event.preventDefault();
31
- showPopout();
32
- };
33
- const onClickDock = (event) => {
34
- event.preventDefault();
35
- dockPopout();
36
- };
37
- const cm = layout.getClassName;
38
- const parentNode = node.getParent();
39
- const style = node._styleWithPosition();
40
- if (!selected) {
41
- (0, Utils_1.hideElement)(style, node.getModel().isUseVisibility());
42
- }
43
- if (parentNode instanceof TabSetNode_1.TabSetNode) {
44
- if (node.getModel().getMaximizedTabset() !== undefined && !parentNode.isMaximized()) {
45
- (0, Utils_1.hideElement)(style, node.getModel().isUseVisibility());
46
- }
47
- }
48
- const message = layout.i18nName(I18nLabel_1.I18nLabel.Floating_Window_Message);
49
- const showMessage = layout.i18nName(I18nLabel_1.I18nLabel.Floating_Window_Show_Window);
50
- const dockMessage = layout.i18nName(I18nLabel_1.I18nLabel.Floating_Window_Dock_Window);
51
- const customRenderCallback = layout.getOnRenderFloatingTabPlaceholder();
52
- if (customRenderCallback) {
53
- return (React.createElement("div", { className: cm(Types_1.CLASSES.FLEXLAYOUT__TAB_FLOATING), onMouseDown: onMouseDown, onTouchStart: onMouseDown, style: style }, customRenderCallback(dockPopout, showPopout)));
54
- }
55
- else {
56
- return (React.createElement("div", { className: cm(Types_1.CLASSES.FLEXLAYOUT__TAB_FLOATING), "data-layout-path": path, onMouseDown: onMouseDown, onTouchStart: onMouseDown, style: style },
57
- React.createElement("div", { className: cm(Types_1.CLASSES.FLEXLAYOUT__TAB_FLOATING_INNER) },
58
- React.createElement("div", null, message),
59
- React.createElement("div", null,
60
- React.createElement("a", { href: "#", onClick: onClickFocus }, showMessage)),
61
- React.createElement("div", null,
62
- React.createElement("a", { href: "#", onClick: onClickDock }, dockMessage)))));
63
- }
64
- };
65
- exports.TabFloating = TabFloating;
66
- //# sourceMappingURL=TabFloating.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TabFloating.js","sourceRoot":"","sources":["../../src/view/TabFloating.tsx"],"names":[],"mappings":"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"}
package/src/DragDrop.ts DELETED
@@ -1,392 +0,0 @@
1
- import * as React from "react";
2
- import { Rect } from "./Rect";
3
-
4
- /** @internal */
5
- const canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);
6
-
7
- export class DragDrop {
8
- static instance = new DragDrop();
9
-
10
- /** @internal */
11
- private _fDblClick: ((event: Event) => void) | undefined;
12
- /** @internal */
13
- private _fClick: ((event: Event) => void) | undefined;
14
- /** @internal */
15
- private _fDragEnd: ((event: Event) => void) | undefined;
16
- /** @internal */
17
- private _fDragMove: ((event: React.MouseEvent<Element>) => void) | undefined;
18
- /** @internal */
19
- private _fDragStart: ((pos: { clientX: number; clientY: number }) => boolean) | undefined;
20
- /** @internal */
21
- private _fDragCancel: ((wasDragging: boolean) => void) | undefined;
22
-
23
- /** @internal */
24
- private _glass: HTMLDivElement | undefined;
25
- /** @internal */
26
- private _defaultGlassCursor: string;
27
- /** @internal */
28
- private _glassCursorOverride: string | undefined;
29
- /** @internal */
30
- private _manualGlassManagement: boolean = false;
31
- /** @internal */
32
- private _lastClick: number;
33
- /** @internal */
34
- private _clickX: number;
35
- /** @internal */
36
- private _clickY: number;
37
- /** @internal */
38
- private _startX: number = 0;
39
- /** @internal */
40
- private _startY: number = 0;
41
- /** @internal */
42
- private _dragDepth: number = 0;
43
- /** @internal */
44
- private _glassShowing: boolean = false;
45
- /** @internal */
46
- private _dragging: boolean = false;
47
- /** @internal */
48
- private _active: boolean = false; // drag and drop is in progress, can be used on ios to prevent body scrolling (see demo)
49
- /** @internal */
50
- private _document?: Document;
51
- /** @internal */
52
- private _rootElement?: HTMLElement | undefined;
53
- /** @internal */
54
- private _lastEvent?: Event | React.MouseEvent<HTMLDivElement, MouseEvent> | React.TouchEvent<HTMLDivElement> | React.DragEvent<Element> | undefined;
55
-
56
- /** @internal */
57
- private constructor() {
58
- if (canUseDOM) {
59
- // check for serverside rendering
60
- this._glass = document.createElement("div");
61
- this._glass.style.zIndex = "998";
62
- this._glass.style.backgroundColor = "transparent";
63
- this._glass.style.outline = "none";
64
- }
65
-
66
- this._defaultGlassCursor = "default";
67
-
68
- this._onMouseMove = this._onMouseMove.bind(this);
69
- this._onMouseUp = this._onMouseUp.bind(this);
70
- this._onKeyPress = this._onKeyPress.bind(this);
71
- this._onDragCancel = this._onDragCancel.bind(this);
72
- this._onDragEnter = this._onDragEnter.bind(this);
73
- this._onDragLeave = this._onDragLeave.bind(this);
74
- this.resizeGlass = this.resizeGlass.bind(this);
75
-
76
- this._lastClick = 0;
77
- this._clickX = 0;
78
- this._clickY = 0;
79
- }
80
-
81
- // if you add the glass pane then you should remove it
82
- addGlass(fCancel: ((wasDragging: boolean) => void) | undefined) {
83
- if (!this._glassShowing) {
84
- if (!this._document) {
85
- this._document = window.document;
86
- }
87
- if (!this._rootElement) {
88
- this._rootElement = this._document.body;
89
- }
90
- this.resizeGlass();
91
- this._document.defaultView?.addEventListener('resize', this.resizeGlass);
92
- this._document.body.appendChild(this._glass!);
93
- this._glass!.tabIndex = -1;
94
- this._glass!.focus();
95
- this._glass!.addEventListener("keydown", this._onKeyPress);
96
- this._glass!.addEventListener("dragenter", this._onDragEnter, { passive: false });
97
- this._glass!.addEventListener("dragover", this._onMouseMove, { passive: false });
98
- this._glass!.addEventListener("dragleave", this._onDragLeave, { passive: false });
99
- this._glassShowing = true;
100
- this._fDragCancel = fCancel;
101
- this._manualGlassManagement = false;
102
- } else {
103
- // second call to addGlass (via dragstart)
104
- this._manualGlassManagement = true;
105
- }
106
- }
107
-
108
- resizeGlass() {
109
- const glassRect = Rect.fromElement(this._rootElement!);
110
- glassRect.positionElement(this._glass!, "fixed");
111
- }
112
-
113
- hideGlass() {
114
- if (this._glassShowing) {
115
- this._document!.body.removeChild(this._glass!);
116
- this._document!.defaultView?.removeEventListener('resize', this.resizeGlass);
117
- this._glassShowing = false;
118
- this._document = undefined;
119
- this._rootElement = undefined;
120
- this.setGlassCursorOverride(undefined);
121
- }
122
- }
123
-
124
- /** @internal */
125
- _updateGlassCursor() {
126
- this._glass!.style.cursor = this._glassCursorOverride ?? this._defaultGlassCursor;
127
- }
128
-
129
- /** @internal */
130
- _setDefaultGlassCursor(cursor: string) {
131
- this._defaultGlassCursor = cursor;
132
- this._updateGlassCursor()
133
- }
134
-
135
- setGlassCursorOverride(cursor: string | undefined) {
136
- this._glassCursorOverride = cursor;
137
- this._updateGlassCursor()
138
- }
139
-
140
- startDrag(
141
- event: Event | React.MouseEvent<HTMLDivElement, MouseEvent> | React.TouchEvent<HTMLDivElement> | React.DragEvent<Element> | undefined,
142
- fDragStart: ((pos: { clientX: number; clientY: number }) => boolean) | undefined,
143
- fDragMove: ((event: React.MouseEvent<Element>) => void) | undefined,
144
- fDragEnd: ((event: Event) => void) | undefined,
145
- fDragCancel?: ((wasDragging: boolean) => void) | undefined,
146
- fClick?: ((event: Event) => void) | undefined,
147
- fDblClick?: ((event: Event) => void) | undefined,
148
- currentDocument?: Document,
149
- rootElement?: HTMLDivElement
150
- ) {
151
- // prevent 'duplicate' action (mouse event for same action as previous touch event (a fix for ios))
152
- if (event && this._lastEvent && this._lastEvent.type.startsWith("touch") && event.type.startsWith("mouse") && event.timeStamp - this._lastEvent.timeStamp < 500) {
153
- return;
154
- }
155
-
156
- if (this._dragging) {
157
- return;
158
- }
159
-
160
- this._lastEvent = event;
161
-
162
- if (currentDocument) {
163
- this._document = currentDocument;
164
- } else {
165
- this._document = window.document;
166
- }
167
- if (rootElement) {
168
- this._rootElement = rootElement;
169
- } else {
170
- this._rootElement = this._document.body;
171
- }
172
-
173
- const posEvent = this._getLocationEvent(event);
174
- this.addGlass(fDragCancel);
175
-
176
- if (event) {
177
- this._startX = posEvent.clientX;
178
- this._startY = posEvent.clientY;
179
- if (!window.matchMedia || window.matchMedia("(pointer: fine)").matches) {
180
- this._setDefaultGlassCursor(getComputedStyle(event.target as Element).cursor);
181
- }
182
- this._stopPropagation(event);
183
- this._preventDefault(event);
184
- } else {
185
- this._startX = 0;
186
- this._startY = 0;
187
- this._setDefaultGlassCursor("default");
188
- }
189
-
190
- this._dragging = false;
191
- this._fDragStart = fDragStart;
192
- this._fDragMove = fDragMove;
193
- this._fDragEnd = fDragEnd;
194
- this._fDragCancel = fDragCancel;
195
- this._fClick = fClick;
196
- this._fDblClick = fDblClick;
197
-
198
- this._active = true;
199
-
200
- if (event?.type === 'dragenter') {
201
- this._dragDepth = 1;
202
- this._rootElement.addEventListener("dragenter", this._onDragEnter, { passive: false });
203
- this._rootElement.addEventListener("dragover", this._onMouseMove, { passive: false });
204
- this._rootElement.addEventListener("dragleave", this._onDragLeave, { passive: false });
205
- this._document.addEventListener("dragend", this._onDragCancel, { passive: false });
206
- this._document.addEventListener("drop", this._onMouseUp, { passive: false });
207
- } else {
208
- this._document.addEventListener("mouseup", this._onMouseUp, { passive: false });
209
- this._document.addEventListener("mousemove", this._onMouseMove, { passive: false });
210
- this._document.addEventListener("touchend", this._onMouseUp, { passive: false });
211
- this._document.addEventListener("touchmove", this._onMouseMove, { passive: false });
212
- }
213
- }
214
-
215
- isDragging() {
216
- return this._dragging;
217
- }
218
-
219
- isActive() {
220
- return this._active;
221
- }
222
-
223
- toString() {
224
- const rtn = "(DragDrop: " + "startX=" + this._startX + ", startY=" + this._startY + ", dragging=" + this._dragging + ")";
225
-
226
- return rtn;
227
- }
228
-
229
- /** @internal */
230
- private _onKeyPress(event: KeyboardEvent) {
231
- if (event.code === 'Escape') {
232
- // esc
233
- this._onDragCancel();
234
- }
235
- }
236
-
237
- /** @internal */
238
- private _onDragCancel() {
239
- this._rootElement!.removeEventListener("dragenter", this._onDragEnter);
240
- this._rootElement!.removeEventListener("dragover", this._onMouseMove);
241
- this._rootElement!.removeEventListener("dragleave", this._onDragLeave);
242
- this._document!.removeEventListener("dragend", this._onDragCancel);
243
- this._document!.removeEventListener("drop", this._onMouseUp);
244
- this._document!.removeEventListener("mousemove", this._onMouseMove);
245
- this._document!.removeEventListener("mouseup", this._onMouseUp);
246
- this._document!.removeEventListener("touchend", this._onMouseUp);
247
- this._document!.removeEventListener("touchmove", this._onMouseMove);
248
- this.hideGlass();
249
- if (this._fDragCancel !== undefined) {
250
- this._fDragCancel(this._dragging);
251
- }
252
- this._dragging = false;
253
- this._active = false;
254
- }
255
-
256
- /** @internal */
257
- private _getLocationEvent(event: any) {
258
- let posEvent: any = event;
259
- if (event && event.touches) {
260
- posEvent = event.touches[0];
261
- }
262
- return posEvent;
263
- }
264
-
265
- /** @internal */
266
- private _getLocationEventEnd(event: any) {
267
- let posEvent: any = event;
268
- if (event.changedTouches) {
269
- posEvent = event.changedTouches[0];
270
- }
271
- return posEvent;
272
- }
273
-
274
- /** @internal */
275
- private _stopPropagation(event: Event | React.MouseEvent<HTMLDivElement, MouseEvent> | React.TouchEvent<HTMLDivElement> | React.DragEvent<Element>) {
276
- if (event.stopPropagation) {
277
- event.stopPropagation();
278
- }
279
- }
280
-
281
- /** @internal */
282
- private _preventDefault(event: Event | React.MouseEvent<HTMLDivElement, MouseEvent> | React.TouchEvent<HTMLDivElement> | React.DragEvent<Element>) {
283
- if (event.preventDefault && event.cancelable) {
284
- event.preventDefault();
285
- }
286
- return event;
287
- }
288
-
289
- /** @internal */
290
- private _onMouseMove(event: Event | React.MouseEvent<HTMLDivElement, MouseEvent> | React.TouchEvent<HTMLDivElement> | React.DragEvent<Element>) {
291
- this._lastEvent = event;
292
-
293
- const posEvent = this._getLocationEvent(event);
294
- this._stopPropagation(event);
295
- this._preventDefault(event);
296
-
297
- if (!this._dragging && (Math.abs(this._startX - posEvent.clientX) > 5 || Math.abs(this._startY - posEvent.clientY) > 5)) {
298
- this._dragging = true;
299
- if (this._fDragStart) {
300
- this._setDefaultGlassCursor("move");
301
- this._dragging = this._fDragStart({ clientX: this._startX, clientY: this._startY });
302
- }
303
- }
304
-
305
- if (this._dragging) {
306
- if (this._fDragMove) {
307
- this._fDragMove(posEvent);
308
- }
309
- }
310
- return false;
311
- }
312
-
313
- /** @internal */
314
- private _onMouseUp(event: Event) {
315
- this._lastEvent = event;
316
-
317
- const posEvent = this._getLocationEventEnd(event);
318
-
319
- this._stopPropagation(event);
320
- this._preventDefault(event);
321
-
322
- this._active = false;
323
-
324
- this._rootElement!.removeEventListener("dragenter", this._onDragEnter);
325
- this._rootElement!.removeEventListener("dragover", this._onMouseMove);
326
- this._rootElement!.removeEventListener("dragleave", this._onDragLeave);
327
- this._document!.removeEventListener("dragend", this._onDragCancel);
328
- this._document!.removeEventListener("drop", this._onMouseUp);
329
- this._document!.removeEventListener("mousemove", this._onMouseMove);
330
- this._document!.removeEventListener("mouseup", this._onMouseUp);
331
- this._document!.removeEventListener("touchend", this._onMouseUp);
332
- this._document!.removeEventListener("touchmove", this._onMouseMove);
333
-
334
- if (!this._manualGlassManagement) {
335
- this.hideGlass();
336
- }
337
-
338
- if (this._dragging) {
339
- this._dragging = false;
340
- if (this._fDragEnd) {
341
- this._fDragEnd(event);
342
- }
343
- // dump("set dragging = false\n");
344
- } else {
345
- if (this._fDragCancel) {
346
- this._fDragCancel(this._dragging);
347
- }
348
- if (Math.abs(this._startX - posEvent.clientX) <= 5 && Math.abs(this._startY - posEvent.clientY) <= 5) {
349
-
350
- let isDoubleClick = false;
351
- const clickTime = new Date().getTime();
352
- // check for double click
353
- if (Math.abs(this._clickX - posEvent.clientX) <= 5 && Math.abs(this._clickY - posEvent.clientY) <= 5) {
354
- if (clickTime - this._lastClick < 500) {
355
- if (this._fDblClick) {
356
- this._fDblClick(event);
357
- isDoubleClick = true;
358
- }
359
- }
360
- }
361
-
362
- if (!isDoubleClick && this._fClick) {
363
- this._fClick(event);
364
- }
365
-
366
- this._lastClick = clickTime;
367
- this._clickX = posEvent.clientX;
368
- this._clickY = posEvent.clientY;
369
- }
370
- }
371
- return false;
372
- }
373
-
374
- /** @internal */
375
- private _onDragEnter(event: DragEvent) {
376
- this._preventDefault(event);
377
- this._stopPropagation(event);
378
- this._dragDepth++;
379
- return false;
380
- }
381
-
382
- /** @internal */
383
- private _onDragLeave(event: DragEvent) {
384
- this._preventDefault(event);
385
- this._stopPropagation(event);
386
- this._dragDepth--;
387
- if (this._dragDepth <= 0) {
388
- this._onDragCancel();
389
- }
390
- return false;
391
- }
392
- }
@@ -1,78 +0,0 @@
1
- import { AttributeDefinitions } from "../AttributeDefinitions";
2
- import { Orientation } from "../Orientation";
3
- import { Model } from "./Model";
4
- import { Node } from "./Node";
5
-
6
- export class SplitterNode extends Node {
7
- static readonly TYPE: string = "splitter";
8
-
9
- /** @internal */
10
- constructor(model: Model) {
11
- super(model);
12
- this._fixed = true;
13
- this._attributes.type = SplitterNode.TYPE;
14
- model._addNode(this);
15
- }
16
-
17
- /** @internal */
18
- getWidth() {
19
- return this._model.getSplitterSize();
20
- }
21
-
22
- /** @internal */
23
- getMinWidth() {
24
- if (this.getOrientation() === Orientation.VERT) {
25
- return this._model.getSplitterSize();
26
- } else {
27
- return 0;
28
- }
29
- }
30
-
31
- /** @internal */
32
- getHeight() {
33
- return this._model.getSplitterSize();
34
- }
35
-
36
- /** @internal */
37
- getMinHeight() {
38
- if (this.getOrientation() === Orientation.HORZ) {
39
- return this._model.getSplitterSize();
40
- } else {
41
- return 0;
42
- }
43
- }
44
-
45
- /** @internal */
46
- getMinSize(orientation: Orientation) {
47
- if (orientation === Orientation.HORZ) {
48
- return this.getMinWidth();
49
- } else {
50
- return this.getMinHeight();
51
- }
52
- }
53
-
54
- /** @internal */
55
- getWeight(): number {
56
- return 0;
57
- }
58
-
59
- /** @internal */
60
- _setWeight(value: number): void { }
61
-
62
- /** @internal */
63
- _getPrefSize(orientation: Orientation): number {
64
- return this._model.getSplitterSize();
65
- }
66
-
67
- /** @internal */
68
- _updateAttrs(json: any): void { }
69
-
70
- /** @internal */
71
- _getAttributeDefinitions(): AttributeDefinitions {
72
- return new AttributeDefinitions();
73
- }
74
-
75
- toJson(): undefined {
76
- return undefined;
77
- }
78
- }
@@ -1,140 +0,0 @@
1
- import * as React from "react";
2
- import { createPortal } from "react-dom";
3
- import { Rect } from "../Rect";
4
- import { CLASSES } from "../Types";
5
-
6
- /** @internal */
7
- export interface IFloatingWindowProps {
8
- title: string;
9
- id: string;
10
- url: string;
11
- rect: Rect | null;
12
- onCloseWindow: (id: string) => void;
13
- onSetWindow: (id: string, window: Window) => void;
14
- }
15
-
16
- interface IStyleSheet {
17
- href: string | null;
18
- type: string;
19
- rules: string[] | null;
20
- }
21
-
22
- /** @internal */
23
- export const FloatingWindow = (props: React.PropsWithChildren<IFloatingWindowProps>) => {
24
- const { title, id, url, rect, onCloseWindow, onSetWindow, children } = props;
25
- const popoutWindow = React.useRef<Window | null>(null);
26
- const timerId = React.useRef<any>(null);
27
- const [content, setContent] = React.useState<HTMLElement | undefined>(undefined);
28
-
29
- React.useLayoutEffect(() => {
30
- if (timerId.current) {
31
- clearTimeout(timerId.current);
32
- }
33
- let isMounted = true;
34
- const r = rect || new Rect(0, 0, 100, 100);
35
- // Make a local copy of the styles from the current window which will be passed into
36
- // the floating window. window.document.styleSheets is mutable and we can't guarantee
37
- // the styles will exist when 'popoutWindow.load' is called below.
38
- const styles = Array.from(window.document.styleSheets).reduce((result, styleSheet) => {
39
- let rules: CSSRuleList | undefined = undefined;
40
- try {
41
- rules = styleSheet.cssRules;
42
- } catch (e) {
43
- // styleSheet.cssRules can throw security exception
44
- }
45
-
46
- try {
47
- return [
48
- ...result,
49
- {
50
- href: styleSheet.href,
51
- type: styleSheet.type,
52
- rules: rules ? Array.from(rules).map(rule => rule.cssText) : null,
53
- }
54
- ];
55
- } catch (e) {
56
- return result;
57
- }
58
- }, [] as IStyleSheet[]);
59
- popoutWindow.current = window.open(url, id, `left=${r.x},top=${r.y},width=${r.width},height=${r.height}`);
60
- if (popoutWindow.current !== null) {
61
- onSetWindow(id, popoutWindow.current);
62
-
63
- // listen for parent unloading to remove all popouts
64
- window.addEventListener("beforeunload", () => {
65
- if (popoutWindow.current) {
66
- popoutWindow.current.close();
67
- popoutWindow.current = null;
68
- }
69
- });
70
-
71
- popoutWindow.current.addEventListener("load", () => {
72
- if (isMounted) {
73
- const popoutDocument = popoutWindow.current!.document;
74
- popoutDocument.title = title;
75
- const popoutContent = popoutDocument.createElement("div");
76
- popoutContent.className = CLASSES.FLEXLAYOUT__FLOATING_WINDOW_CONTENT;
77
- popoutDocument.body.appendChild(popoutContent);
78
- copyStyles(popoutDocument, styles).then(() => {
79
- setContent(popoutContent);
80
- });
81
-
82
- // listen for popout unloading (needs to be after load for safari)
83
- popoutWindow.current!.addEventListener("beforeunload", () => {
84
- onCloseWindow(id);
85
- });
86
- }
87
- });
88
- } else {
89
- console.warn(`Unable to open window ${url}`);
90
- onCloseWindow(id);
91
- }
92
-
93
- return () => {
94
- isMounted = false;
95
- // delay so refresh will close window
96
- timerId.current = setTimeout(() => {
97
- if (popoutWindow.current) {
98
- popoutWindow.current.close();
99
- popoutWindow.current = null;
100
- }
101
- }, 0);
102
- };
103
- }, []);
104
-
105
- if (content !== undefined) {
106
- return createPortal(children, content!);
107
- } else {
108
- return null;
109
- }
110
- };
111
-
112
- /** @internal */
113
- function copyStyles(doc: Document, styleSheets: IStyleSheet[]): Promise<boolean[]> {
114
- const head = doc.head;
115
- const promises: Promise<boolean>[] = [];
116
- for (const styleSheet of styleSheets) {
117
- if (styleSheet.href) {
118
- // prefer links since they will keep paths to images etc
119
- const styleElement = doc.createElement("link");
120
- styleElement.type = styleSheet.type;
121
- styleElement.rel = "stylesheet";
122
- styleElement.href = styleSheet.href!;
123
- head.appendChild(styleElement);
124
- promises.push(
125
- new Promise((resolve) => {
126
- styleElement.onload = () => resolve(true);
127
- })
128
- );
129
- } else {
130
- if (styleSheet.rules) {
131
- const style = doc.createElement("style");
132
- for (const rule of styleSheet.rules) {
133
- style.appendChild(doc.createTextNode(rule));
134
- }
135
- head.appendChild(style);
136
- }
137
- }
138
- }
139
- return Promise.all(promises);
140
- }