goblin-gadgets 3.2.2 → 3.2.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 (361) hide show
  1. package/.editorconfig +9 -9
  2. package/.eslintrc.js +28 -28
  3. package/.zou-flow +2 -2
  4. package/builders/builders.js +5 -5
  5. package/builders/gadget.js +85 -85
  6. package/calendar-boards-gadget.js +64 -64
  7. package/demo-gadget.js +17 -17
  8. package/glyphs-dialog.js +13 -13
  9. package/login-dialog.js +13 -13
  10. package/package.json +46 -46
  11. package/pivot-gadget.js +18 -18
  12. package/stack-navigation.js +13 -13
  13. package/table-gadget.js +102 -102
  14. package/test/code-parser.spec.js +61 -61
  15. package/tree-gadget.js +70 -70
  16. package/types/types.js +455 -455
  17. package/widgets/accordion/styles.js +16 -16
  18. package/widgets/accordion/widget.js +90 -90
  19. package/widgets/analog-clock/props.js +102 -102
  20. package/widgets/analog-clock/scenarios.js +43 -43
  21. package/widgets/analog-clock/styles.js +754 -754
  22. package/widgets/analog-clock/widget.js +404 -404
  23. package/widgets/animated-container/animations.js +566 -566
  24. package/widgets/animated-container/styles.js +36 -36
  25. package/widgets/animated-container/widget.js +24 -24
  26. package/widgets/badge/styles.js +107 -107
  27. package/widgets/badge/widget.js +33 -33
  28. package/widgets/button/props.js +377 -377
  29. package/widgets/button/scenarios.js +54 -54
  30. package/widgets/button/styles.js +1082 -1082
  31. package/widgets/button/widget.js +426 -426
  32. package/widgets/button-combo/styles.js +73 -73
  33. package/widgets/button-combo/widget.js +297 -297
  34. package/widgets/calendar/props.js +207 -207
  35. package/widgets/calendar/scenarios.js +50 -50
  36. package/widgets/calendar/styles.js +198 -198
  37. package/widgets/calendar/widget.js +895 -895
  38. package/widgets/calendar-boards/styles.js +29 -29
  39. package/widgets/calendar-boards/widget.js +215 -215
  40. package/widgets/calendar-button/styles.js +273 -273
  41. package/widgets/calendar-button/widget.js +94 -94
  42. package/widgets/calendar-list/styles.js +35 -35
  43. package/widgets/calendar-list/widget.js +223 -223
  44. package/widgets/calendar-recurrence/widget.js +183 -183
  45. package/widgets/carousel/props.js +104 -104
  46. package/widgets/carousel/scenarios.js +163 -163
  47. package/widgets/carousel/styles.js +133 -133
  48. package/widgets/carousel/widget.js +491 -491
  49. package/widgets/carousel-bullet/styles.js +29 -29
  50. package/widgets/carousel-bullet/widget.js +25 -25
  51. package/widgets/carousel-button/styles.js +71 -71
  52. package/widgets/carousel-button/widget.js +33 -33
  53. package/widgets/carousel-item/styles.js +21 -21
  54. package/widgets/carousel-item/widget.js +24 -24
  55. package/widgets/chat-balloon/props.js +65 -65
  56. package/widgets/chat-balloon/scenarios.js +47 -47
  57. package/widgets/chat-balloon/styles.js +193 -193
  58. package/widgets/chat-balloon/widget.js +62 -62
  59. package/widgets/chat-dialog/styles.js +15 -15
  60. package/widgets/chat-dialog/widget.js +62 -62
  61. package/widgets/check-list/styles.js +66 -66
  62. package/widgets/check-list/widget.js +168 -168
  63. package/widgets/checkbox/widget.js +15 -15
  64. package/widgets/checkbox-nc/props.js +191 -191
  65. package/widgets/checkbox-nc/scenarios.js +41 -41
  66. package/widgets/checkbox-nc/styles.js +122 -122
  67. package/widgets/checkbox-nc/widget.js +116 -116
  68. package/widgets/clock-combo/styles.js +174 -174
  69. package/widgets/clock-combo/widget.js +390 -390
  70. package/widgets/color-picker/props.js +145 -145
  71. package/widgets/color-picker/scenarios.js +34 -34
  72. package/widgets/color-picker/styles.js +209 -209
  73. package/widgets/color-picker/widget.js +735 -735
  74. package/widgets/colored-container/props.js +34 -34
  75. package/widgets/colored-container/scenarios.js +54 -54
  76. package/widgets/colored-container/styles.js +100 -100
  77. package/widgets/colored-container/widget.js +27 -27
  78. package/widgets/combo/styles.js +69 -69
  79. package/widgets/combo/widget.js +224 -224
  80. package/widgets/combo-container/styles.js +66 -66
  81. package/widgets/combo-container/widget.js +188 -188
  82. package/widgets/command-button/widget.js +39 -39
  83. package/widgets/container/props.js +295 -295
  84. package/widgets/container/scenarios.js +47 -47
  85. package/widgets/container/styles.js +1439 -1439
  86. package/widgets/container/widget.js +279 -279
  87. package/widgets/demo/widget.js +24 -24
  88. package/widgets/dialog/styles.js +29 -29
  89. package/widgets/dialog/widget.js +26 -26
  90. package/widgets/dialog-modal/props.js +126 -126
  91. package/widgets/dialog-modal/styles.js +234 -234
  92. package/widgets/dialog-modal/widget.js +273 -273
  93. package/widgets/dialog-resizable/props.js +1 -1
  94. package/widgets/dialog-resizable/scenarios.js +18 -18
  95. package/widgets/dialog-resizable/widget.js +367 -367
  96. package/widgets/dialog-resizable-nc/props.js +150 -150
  97. package/widgets/dialog-resizable-nc/scenarios.js +18 -18
  98. package/widgets/dialog-resizable-nc/styles.js +259 -259
  99. package/widgets/dialog-resizable-nc/widget.js +197 -197
  100. package/widgets/directory-input/widget.js +18 -18
  101. package/widgets/directory-input-nc/widget.js +20 -20
  102. package/widgets/document-container/getPath.js +43 -43
  103. package/widgets/document-container/props.js +79 -79
  104. package/widgets/document-container/scenarios.js +39 -39
  105. package/widgets/document-container/styles.js +69 -69
  106. package/widgets/document-container/widget.js +53 -53
  107. package/widgets/drag-cab/styles.js +56 -56
  108. package/widgets/drag-cab/widget.js +285 -285
  109. package/widgets/drag-carrier/styles.js +21 -21
  110. package/widgets/drag-carrier/widget.js +780 -780
  111. package/widgets/dynamic-toolbar/styles.js +110 -110
  112. package/widgets/dynamic-toolbar/widget.js +128 -128
  113. package/widgets/field/readonly/label.js +39 -39
  114. package/widgets/field/widget.js +1743 -1743
  115. package/widgets/file-input/widget.js +18 -18
  116. package/widgets/file-input-nc/styles.js +38 -38
  117. package/widgets/file-input-nc/widget.js +88 -88
  118. package/widgets/flat-combo/styles.js +21 -21
  119. package/widgets/flat-combo/widget.js +61 -61
  120. package/widgets/flat-list/styles.js +30 -30
  121. package/widgets/flat-list/widget.js +219 -219
  122. package/widgets/flying-balloon/styles.js +52 -52
  123. package/widgets/flying-balloon/widget.js +43 -43
  124. package/widgets/fragment/widget.js +26 -26
  125. package/widgets/full-screen/props.js +27 -27
  126. package/widgets/full-screen/styles.js +32 -32
  127. package/widgets/full-screen/widget.js +40 -40
  128. package/widgets/gauge/props.js +71 -71
  129. package/widgets/gauge/scenarios.js +83 -83
  130. package/widgets/gauge/styles.js +183 -183
  131. package/widgets/gauge/widget.js +36 -36
  132. package/widgets/glyph-detail/service.js +9 -9
  133. package/widgets/glyph-detail/widget.js +109 -109
  134. package/widgets/glyphs-dialog/service.js +94 -94
  135. package/widgets/glyphs-dialog/styles.js +37 -37
  136. package/widgets/glyphs-dialog/widget.js +236 -236
  137. package/widgets/goblin-editor/widget.js +146 -146
  138. package/widgets/guild-entry/props.js +53 -53
  139. package/widgets/guild-entry/scenarios.js +26 -26
  140. package/widgets/guild-entry/styles.js +98 -98
  141. package/widgets/guild-entry/widget.js +126 -126
  142. package/widgets/guild-user-logo/guild-helpers.js +77 -77
  143. package/widgets/guild-user-logo/props.js +48 -48
  144. package/widgets/guild-user-logo/scenarios.js +64 -64
  145. package/widgets/guild-user-logo/styles.js +114 -114
  146. package/widgets/guild-user-logo/widget.js +81 -81
  147. package/widgets/guild-user-profile/props.js +73 -73
  148. package/widgets/guild-user-profile/scenarios.js +54 -54
  149. package/widgets/guild-user-profile/styles.js +162 -162
  150. package/widgets/guild-user-profile/widget.js +202 -202
  151. package/widgets/helpers/combo-helpers.js +218 -218
  152. package/widgets/helpers/geom-helpers.js +80 -80
  153. package/widgets/helpers/rect-helpers.js +10 -10
  154. package/widgets/helpers/shortcut-helpers.js +56 -56
  155. package/widgets/helpers/spacing-helpers.js +26 -26
  156. package/widgets/helpers/svg-helpers.js +151 -151
  157. package/widgets/helpers/table-helpers.js +68 -68
  158. package/widgets/hinter/styles.js +79 -79
  159. package/widgets/hinter/widget.js +205 -205
  160. package/widgets/hinter-column/widget.js +49 -49
  161. package/widgets/hinter-field/reducer.js +18 -18
  162. package/widgets/hinter-field/widget.js +176 -176
  163. package/widgets/hinter-field-nc/props.js +114 -114
  164. package/widgets/hinter-field-nc/scenarios.js +47 -47
  165. package/widgets/hinter-field-nc/widget.js +191 -191
  166. package/widgets/input-wrapper/widget.js +157 -157
  167. package/widgets/key-trap.js +96 -96
  168. package/widgets/label/props.js +1 -1
  169. package/widgets/label/scenarios.js +1 -1
  170. package/widgets/label/widget.js +7 -7
  171. package/widgets/label-nc/props.js +308 -308
  172. package/widgets/label-nc/scenarios.js +29 -29
  173. package/widgets/label-nc/styles.js +1218 -1218
  174. package/widgets/label-nc/widget.js +314 -314
  175. package/widgets/label-row/props.js +1 -1
  176. package/widgets/label-row/scenarios.js +1 -1
  177. package/widgets/label-row/widget.js +7 -7
  178. package/widgets/label-row-nc/props.js +94 -94
  179. package/widgets/label-row-nc/scenarios.js +46 -46
  180. package/widgets/label-row-nc/widget.js +81 -81
  181. package/widgets/label-text-field/styles.js +55 -55
  182. package/widgets/label-text-field/widget.js +178 -178
  183. package/widgets/launcher/props.js +177 -177
  184. package/widgets/launcher/scenarios.js +55 -55
  185. package/widgets/launcher/styles.js +46 -46
  186. package/widgets/launcher/widget.js +79 -79
  187. package/widgets/launcher-blob/props.js +25 -25
  188. package/widgets/launcher-blob/scenarios.js +24 -24
  189. package/widgets/launcher-blob/styles.js +62 -62
  190. package/widgets/launcher-blob/widget.js +50 -50
  191. package/widgets/list/widget.js +211 -211
  192. package/widgets/login-dialog/service.js +117 -117
  193. package/widgets/login-dialog/widget.js +117 -117
  194. package/widgets/map/reaflet.js +208 -208
  195. package/widgets/map/widget.js +67 -67
  196. package/widgets/markdown/styles.js +85 -85
  197. package/widgets/markdown/widget.js +31 -31
  198. package/widgets/notification/styles.js +97 -97
  199. package/widgets/notification/widget.js +207 -207
  200. package/widgets/pivot/custom.css +320 -320
  201. package/widgets/pivot/widget.js +42 -42
  202. package/widgets/radio-list/styles.js +48 -48
  203. package/widgets/radio-list/widget.js +111 -111
  204. package/widgets/resizable-container/styles.js +108 -108
  205. package/widgets/resizable-container/widget.js +225 -225
  206. package/widgets/retro-action-button/helpers.js +106 -106
  207. package/widgets/retro-action-button/styles.js +285 -285
  208. package/widgets/retro-action-button/widget.js +364 -364
  209. package/widgets/retro-badge-button/styles.js +87 -87
  210. package/widgets/retro-badge-button/widget.js +251 -251
  211. package/widgets/retro-gear/helpers.js +156 -156
  212. package/widgets/retro-gear/styles.js +130 -130
  213. package/widgets/retro-gear/widget.js +51 -51
  214. package/widgets/retro-illuminated-button/styles.js +274 -274
  215. package/widgets/retro-illuminated-button/widget.js +147 -147
  216. package/widgets/retro-panel/helpers.js +57 -57
  217. package/widgets/retro-panel/styles.js +293 -293
  218. package/widgets/retro-panel/widget.js +239 -239
  219. package/widgets/retro-screw/styles.js +80 -80
  220. package/widgets/retro-screw/widget.js +25 -25
  221. package/widgets/rocket/props.js +124 -124
  222. package/widgets/rocket/scenarios.js +71 -71
  223. package/widgets/rocket/styles.js +306 -306
  224. package/widgets/rocket/widget.js +225 -225
  225. package/widgets/samples-monitor/helpers.js +147 -147
  226. package/widgets/samples-monitor/styles.js +529 -529
  227. package/widgets/samples-monitor/widget.js +516 -516
  228. package/widgets/scrollable-container/styles.js +58 -58
  229. package/widgets/scrollable-container/widget.js +132 -132
  230. package/widgets/scrollable-linkable-container/reducer.js +18 -18
  231. package/widgets/scrollable-linkable-container/styles.js +42 -42
  232. package/widgets/scrollable-linkable-container/widget.js +78 -78
  233. package/widgets/select/styles.js +68 -68
  234. package/widgets/select/widget.js +119 -119
  235. package/widgets/separator/props.js +46 -46
  236. package/widgets/separator/styles.js +116 -116
  237. package/widgets/separator/widget.js +27 -27
  238. package/widgets/slider/props.js +136 -136
  239. package/widgets/slider/scenarios.js +74 -74
  240. package/widgets/slider/styles.js +246 -246
  241. package/widgets/slider/widget.js +404 -404
  242. package/widgets/slider-circle/props.js +72 -72
  243. package/widgets/slider-circle/scenarios.js +16 -16
  244. package/widgets/slider-circle/styles.js +78 -78
  245. package/widgets/slider-circle/widget.js +154 -154
  246. package/widgets/slider-xy/props.js +87 -87
  247. package/widgets/slider-xy/scenarios.js +19 -19
  248. package/widgets/slider-xy/styles.js +102 -102
  249. package/widgets/slider-xy/widget.js +234 -234
  250. package/widgets/smiley/props.js +51 -51
  251. package/widgets/smiley/scenarios.js +58 -58
  252. package/widgets/smiley/styles.js +489 -489
  253. package/widgets/smiley/widget.js +72 -72
  254. package/widgets/spinner/props.js +31 -31
  255. package/widgets/spinner/scenarios.js +31 -31
  256. package/widgets/spinner/styles.js +49 -49
  257. package/widgets/spinner/widget.js +23 -23
  258. package/widgets/splitter/props.js +71 -71
  259. package/widgets/splitter/scenarios.js +182 -182
  260. package/widgets/splitter/styles.js +41 -41
  261. package/widgets/splitter/widget.js +455 -455
  262. package/widgets/stack-navigation/service.js +324 -324
  263. package/widgets/stack-navigation/widget.js +296 -296
  264. package/widgets/state-browser/styles.js +19 -19
  265. package/widgets/state-browser/widget.js +135 -135
  266. package/widgets/state-browser-dialog/styles.js +100 -100
  267. package/widgets/state-browser-dialog/widget.js +253 -253
  268. package/widgets/state-monitor/styles.js +50 -50
  269. package/widgets/state-monitor/widget.js +324 -324
  270. package/widgets/switch-on-off/props.js +30 -30
  271. package/widgets/switch-on-off/scenarios.js +34 -34
  272. package/widgets/switch-on-off/styles.js +63 -63
  273. package/widgets/switch-on-off/widget.js +41 -41
  274. package/widgets/table/helpers.js +160 -160
  275. package/widgets/table/props.js +658 -658
  276. package/widgets/table/reducer.js +196 -196
  277. package/widgets/table/scenarios.js +54 -54
  278. package/widgets/table/widget.js +253 -253
  279. package/widgets/table-cell/props.js +145 -145
  280. package/widgets/table-cell/styles.js +160 -160
  281. package/widgets/table-cell/widget.js +139 -139
  282. package/widgets/table-header-drag-manager/styles.js +184 -184
  283. package/widgets/table-header-drag-manager/widget.js +392 -392
  284. package/widgets/table-nc/styles.js +100 -100
  285. package/widgets/table-nc/widget.js +409 -409
  286. package/widgets/table-row/props.js +73 -73
  287. package/widgets/table-row/styles.js +82 -82
  288. package/widgets/table-row/widget.js +207 -207
  289. package/widgets/text-field/widget.js +18 -18
  290. package/widgets/text-field-combo/widget.js +21 -21
  291. package/widgets/text-field-combo-nc/props.js +300 -300
  292. package/widgets/text-field-combo-nc/scenarios.js +72 -72
  293. package/widgets/text-field-combo-nc/widget.js +339 -339
  294. package/widgets/text-field-date-interval/styles.js +37 -37
  295. package/widgets/text-field-date-interval/widget.js +162 -162
  296. package/widgets/text-field-nc/props.js +40 -40
  297. package/widgets/text-field-nc/scenarios.js +67 -67
  298. package/widgets/text-field-nc/widget.js +14 -14
  299. package/widgets/text-field-time-interval/styles.js +37 -37
  300. package/widgets/text-field-time-interval/widget.js +160 -160
  301. package/widgets/text-field-typed/widget.js +51 -51
  302. package/widgets/text-field-typed-nc/props.js +81 -81
  303. package/widgets/text-field-typed-nc/scenarios.js +105 -105
  304. package/widgets/text-field-typed-nc/styles.js +20 -20
  305. package/widgets/text-field-typed-nc/widget.js +749 -750
  306. package/widgets/text-input-info-nc/props.js +62 -62
  307. package/widgets/text-input-info-nc/widget.js +55 -55
  308. package/widgets/text-input-nc/props.js +143 -143
  309. package/widgets/text-input-nc/scenarios.js +44 -44
  310. package/widgets/text-input-nc/styles.js +242 -242
  311. package/widgets/text-input-nc/widget.js +234 -234
  312. package/widgets/ticket/getPath.js +128 -128
  313. package/widgets/ticket/props.js +181 -181
  314. package/widgets/ticket/scenarios.js +39 -39
  315. package/widgets/ticket/styles.js +332 -332
  316. package/widgets/ticket/ticket-helpers.js +33 -33
  317. package/widgets/ticket/widget.js +348 -348
  318. package/widgets/ticket-hover/styles.js +207 -207
  319. package/widgets/ticket-hover/widget.js +53 -53
  320. package/widgets/time-gauge/widget.js +64 -64
  321. package/widgets/tips/styles.js +48 -48
  322. package/widgets/tips/widget.js +171 -171
  323. package/widgets/translatable-text-field/styles.js +202 -202
  324. package/widgets/translatable-text-field/text-field.js +132 -132
  325. package/widgets/translatable-text-field/widget.js +660 -660
  326. package/widgets/tree/props.js +246 -246
  327. package/widgets/tree/scenarios.js +14 -14
  328. package/widgets/tree/styles.js +142 -142
  329. package/widgets/tree/widget.js +383 -383
  330. package/widgets/tree-cell/styles.js +140 -140
  331. package/widgets/tree-cell/widget.js +100 -100
  332. package/widgets/tree-row/styles.js +77 -77
  333. package/widgets/tree-row/widget.js +135 -135
  334. package/widgets/triangle/props.js +48 -48
  335. package/widgets/triangle/scenarios.js +33 -33
  336. package/widgets/triangle/styles.js +92 -92
  337. package/widgets/triangle/widget.js +36 -36
  338. package/widgets/well-done/widget.js +170 -170
  339. package/widgets/widget-doc/reducer.js +68 -68
  340. package/widgets/widget-doc/styles.js +15 -15
  341. package/widgets/widget-doc/widget-list.js +25 -25
  342. package/widgets/widget-doc/widget.js +89 -89
  343. package/widgets/widget-doc-menu/styles.js +12 -12
  344. package/widgets/widget-doc-menu/widget.js +79 -79
  345. package/widgets/widget-doc-preview/parse-code.js +20 -20
  346. package/widgets/widget-doc-preview/styles.js +77 -77
  347. package/widgets/widget-doc-preview/widget.js +481 -481
  348. package/widgets/widget-doc-preview-container/styles.js +60 -60
  349. package/widgets/widget-doc-preview-container/widget.js +129 -129
  350. package/widgets/widget-doc-properties/styles.js +41 -41
  351. package/widgets/widget-doc-properties/widget.js +307 -307
  352. package/widgets/widget-doc-property/styles.js +75 -75
  353. package/widgets/widget-doc-property/widget.js +108 -108
  354. package/widgets/widget-doc-property-control/styles.js +14 -14
  355. package/widgets/widget-doc-property-control/widget.js +343 -343
  356. package/widgets/wizard/service.js +2132 -2132
  357. package/widgets/wizard/styles.js +21 -21
  358. package/widgets/wizard/widget.js +927 -927
  359. package/widgets/work-dialog/styles.js +31 -31
  360. package/widgets/work-dialog/widget.js +162 -162
  361. package/wizard.js +13 -13
@@ -1,367 +1,367 @@
1
- import React from 'react';
2
- import props from './props';
3
- import scenarios from './scenarios';
4
- import {registerWidget} from 'goblin-gadgets/widgets/widget-doc/widget-list';
5
- import Widget from 'goblin-laboratory/widgets/widget';
6
- import DialogResizableNC from 'goblin-gadgets/widgets/dialog-resizable-nc/widget';
7
- import KeyTrap from 'goblin-gadgets/widgets/key-trap.js';
8
- import _ from 'lodash';
9
- import {Unit} from 'goblin-theme';
10
- const px = Unit.toPx;
11
- const n = Unit.toValue;
12
-
13
- /******************************************************************************/
14
-
15
- function clipRectangle(rectangle) {
16
- // Clip position of center (horizontal and vertical) into viewport.
17
- const viewportWidth = window.visualViewport.width;
18
- const viewportHeight = window.visualViewport.height;
19
-
20
- rectangle.width = Math.min(rectangle.width, viewportWidth);
21
- rectangle.height = Math.min(rectangle.height, viewportHeight);
22
-
23
- const h = viewportWidth / 2 - rectangle.width / 2;
24
- const v = viewportHeight / 2 - rectangle.height / 2;
25
-
26
- rectangle.horizontal = Math.max(rectangle.horizontal, -h);
27
- rectangle.horizontal = Math.min(rectangle.horizontal, h);
28
- rectangle.vertical = Math.max(rectangle.vertical, -v);
29
- rectangle.vertical = Math.min(rectangle.vertical, v);
30
- }
31
-
32
- function compareRectangle(r1, r2) {
33
- return (
34
- r1.horizontal === r2.horizontal &&
35
- r1.vertical === r2.vertical &&
36
- r1.width === r2.width &&
37
- r1.height === r2.height
38
- );
39
- }
40
-
41
- /******************************************************************************/
42
-
43
- class DialogResizable extends Widget {
44
- constructor() {
45
- super(...arguments);
46
-
47
- let rectangle;
48
- if (this.props.rectangle) {
49
- rectangle = this.props.rectangle;
50
- } else {
51
- rectangle = {
52
- horizontal: n(this.props.horizontal),
53
- vertical: n(this.props.vertical),
54
- width: n(this.props.width),
55
- height: n(this.props.height),
56
- };
57
- }
58
- this.initialRectangle = rectangle;
59
-
60
- this.state = {
61
- rectangle: rectangle,
62
- resizingElement: null,
63
- };
64
-
65
- this.minWidth = n(this.props.minWidth || '100px');
66
- this.minHeight = n(this.props.minHeight || '100px');
67
-
68
- this.startingRectangle = null;
69
- this.originX = null;
70
- this.originY = null;
71
-
72
- this.onMinimize = this.onMinimize.bind(this);
73
- this.onRestore = this.onRestore.bind(this);
74
- this.onMaximize = this.onMaximize.bind(this);
75
- this.onCloseDialog = this.onCloseDialog.bind(this);
76
- this.onMouseDown = this.onMouseDown.bind(this);
77
- this.onMouseMove = this.onMouseMove.bind(this);
78
- this.onMouseUp = this.onMouseUp.bind(this);
79
-
80
- this.doMove = _.throttle(this.doMove.bind(this), 50);
81
- }
82
-
83
- //#region get/set
84
- get rectangle() {
85
- return this.state.rectangle;
86
- }
87
- set rectangle(value) {
88
- this.setState({
89
- rectangle: value,
90
- });
91
- }
92
-
93
- get resizingElement() {
94
- return this.state.resizingElement;
95
- }
96
- set resizingElement(value) {
97
- this.setState({
98
- resizingElement: value,
99
- });
100
- }
101
- //#endregion
102
-
103
- UNSAFE_componentWillMount() {
104
- KeyTrap.bind('Escape', this.onCloseDialog);
105
- if (!this.props.enterKeyStaysInside) {
106
- KeyTrap.bind('Enter', this.onCloseDialog);
107
- }
108
- }
109
-
110
- componentWillUnmount() {
111
- super.componentWillUnmount();
112
- KeyTrap.unbind('Escape', this.onCloseDialog);
113
- if (!this.props.enterKeyStaysInside) {
114
- KeyTrap.unbind('Enter', this.onCloseDialog);
115
- }
116
- }
117
-
118
- changeRectangle(rectangle) {
119
- if (!this.props.id) {
120
- return;
121
- }
122
-
123
- this.doFor(this.props.clientSessionId, 'set-dialogs', {
124
- dialogId: this.props.id,
125
- state: {rectangle},
126
- });
127
- }
128
-
129
- get minimalRectangle() {
130
- return {
131
- ...this.rectangle,
132
- width: this.minWidth,
133
- height: this.minHeight,
134
- };
135
- }
136
-
137
- get maximalRectangle() {
138
- return {
139
- horizontal: 0,
140
- vertical: 0,
141
- width: window.visualViewport.width,
142
- height: window.visualViewport.height,
143
- };
144
- }
145
-
146
- get minimizeEnable() {
147
- return !compareRectangle(this.rectangle, this.minimalRectangle);
148
- }
149
-
150
- get restoreEnable() {
151
- return !compareRectangle(this.rectangle, this.initialRectangle);
152
- }
153
-
154
- get maximizeEnable() {
155
- return !compareRectangle(this.rectangle, this.maximalRectangle);
156
- }
157
-
158
- onMinimize() {
159
- const rectangle = this.minimalRectangle;
160
- this.rectangle = rectangle;
161
- this.changeRectangle(rectangle);
162
- }
163
-
164
- onRestore() {
165
- this.rectangle = this.initialRectangle;
166
- this.changeRectangle(this.initialRectangle);
167
- }
168
-
169
- onMaximize() {
170
- const rectangle = this.maximalRectangle;
171
- this.rectangle = rectangle;
172
- this.changeRectangle(rectangle);
173
- }
174
-
175
- onCloseDialog() {
176
- this.props.onCloseDialog();
177
- }
178
-
179
- onMouseDown(e, element) {
180
- if (e.buttons === 1 && element) {
181
- // Mouse left button pressed ?
182
- this.resizingElement = element;
183
- this.originX = e.clientX;
184
- this.originY = e.clientY;
185
-
186
- const rectangle = {...this.rectangle};
187
- clipRectangle(rectangle);
188
- this.startingRectangle = rectangle;
189
- this.rectangle = rectangle;
190
- }
191
- }
192
-
193
- onMouseMove(e) {
194
- if (this.resizingElement) {
195
- const dx = e.clientX - this.originX;
196
- const dy = e.clientY - this.originY;
197
- this.doMove(dx, dy);
198
- }
199
- }
200
-
201
- doMove(dx, dy) {
202
- if (!this.resizingElement) {
203
- return;
204
- }
205
-
206
- const newRectangle = {...this.rectangle};
207
-
208
- const elements = this.resizingElement.split('+');
209
-
210
- // Move title bar.
211
- if (elements.includes('title')) {
212
- newRectangle.horizontal = this.startingRectangle.horizontal + dx;
213
- newRectangle.vertical = this.startingRectangle.vertical + dy;
214
- }
215
-
216
- // Move border and/or corner.
217
- if (elements.includes('left')) {
218
- dx = Math.min(dx, this.startingRectangle.width - this.minWidth);
219
- newRectangle.width = this.startingRectangle.width - dx;
220
- newRectangle.horizontal = this.startingRectangle.horizontal + dx / 2;
221
- }
222
-
223
- if (elements.includes('right')) {
224
- dx = Math.max(dx, this.minWidth - this.startingRectangle.width);
225
- newRectangle.width = this.startingRectangle.width + dx;
226
- newRectangle.horizontal = this.startingRectangle.horizontal + dx / 2;
227
- }
228
-
229
- if (elements.includes('top')) {
230
- dy = Math.min(dy, this.startingRectangle.height - this.minHeight);
231
- newRectangle.height = this.startingRectangle.height - dy;
232
- newRectangle.vertical = this.startingRectangle.vertical + dy / 2;
233
- }
234
-
235
- if (elements.includes('bottom')) {
236
- dy = Math.max(dy, this.minHeight - this.startingRectangle.height);
237
- newRectangle.height = this.startingRectangle.height + dy;
238
- newRectangle.vertical = this.startingRectangle.vertical + dy / 2;
239
- }
240
-
241
- this.rectangle = newRectangle;
242
- }
243
-
244
- onMouseUp() {
245
- if (this.resizingElement) {
246
- this.resizingElement = null;
247
- this.changeRectangle(this.rectangle);
248
- }
249
- }
250
-
251
- /******************************************************************************/
252
-
253
- renderFinal() {
254
- const {width, height, horizontal, vertical, ...otherProps} = this.props;
255
-
256
- const rectangle = {...this.rectangle};
257
- clipRectangle(rectangle);
258
-
259
- return (
260
- <DialogResizableNC
261
- {...otherProps}
262
- horizontal={px(rectangle.horizontal)}
263
- vertical={px(rectangle.vertical)}
264
- width={px(rectangle.width)}
265
- height={px(rectangle.height)}
266
- resizing={!!this.resizingElement}
267
- onMinimize={this.minimizeEnable ? this.onMinimize : null}
268
- onRestore={this.restoreEnable ? this.onRestore : null}
269
- onMaximize={this.maximizeEnable ? this.onMaximize : null}
270
- onCloseDialog={this.props.onCloseDialog ? this.onCloseDialog : null}
271
- onMouseDown={this.onMouseDown}
272
- onMouseMove={this.onMouseMove}
273
- onMouseUp={this.onMouseUp}
274
- />
275
- );
276
- }
277
-
278
- renderOriginal() {
279
- const {width, height, horizontal, vertical, ...otherProps} = this.props;
280
-
281
- return (
282
- <DialogResizableNC
283
- {...otherProps}
284
- horizontal={px(this.props.rectangle.horizontal)}
285
- vertical={px(this.props.rectangle.vertical)}
286
- width={px(this.props.rectangle.width)}
287
- height={px(this.props.rectangle.height)}
288
- resizing={false}
289
- onMinimize={this.minimizeEnable ? this.onMinimize : null}
290
- onRestore={this.restoreEnable ? this.onRestore : null}
291
- onMaximize={this.maximizeEnable ? this.onMaximize : null}
292
- onCloseDialog={this.props.onCloseDialog ? this.onCloseDialog : null}
293
- onMouseDown={this.onMouseDown}
294
- onMouseMove={this.onMouseMove}
295
- onMouseUp={this.onMouseUp}
296
- />
297
- );
298
- }
299
-
300
- renderResizing() {
301
- const {
302
- width,
303
- height,
304
- horizontal,
305
- vertical,
306
- children,
307
- ...otherProps
308
- } = this.props;
309
-
310
- const rectangle = {...this.rectangle};
311
- clipRectangle(rectangle);
312
-
313
- return (
314
- <DialogResizableNC
315
- {...otherProps}
316
- horizontal={px(rectangle.horizontal)}
317
- vertical={px(rectangle.vertical)}
318
- width={px(rectangle.width)}
319
- height={px(rectangle.height)}
320
- resizing={true}
321
- opacity={0.3}
322
- onMinimize={this.minimizeEnable ? this.onMinimize : null}
323
- onRestore={this.restoreEnable ? this.onRestore : null}
324
- onMaximize={this.maximizeEnable ? this.onMaximize : null}
325
- onCloseDialog={this.props.onCloseDialog ? this.onCloseDialog : null}
326
- onMouseDown={this.onMouseDown}
327
- onMouseMove={this.onMouseMove}
328
- onMouseUp={this.onMouseUp}
329
- />
330
- );
331
- }
332
-
333
- render() {
334
- if (this.props.drawChildrenWhileResizing) {
335
- // Always draw the final dialogue.
336
- return this.renderFinal();
337
- } else {
338
- if (this.resizingElement) {
339
- // During resizing, draw the original dialog (not yet moved) and
340
- // a skeleton of the new dialog.
341
- return (
342
- <>
343
- {this.renderOriginal()}
344
- {this.renderResizing()}
345
- </>
346
- );
347
- } else {
348
- return this.renderFinal();
349
- }
350
- }
351
- }
352
- }
353
-
354
- /******************************************************************************/
355
-
356
- export default Widget.connect((state, props) => {
357
- const userSession = Widget.getUserSession(state);
358
- const clientSessionId = userSession.get('id');
359
- const data = userSession.get(`dialogs.${props.id}`);
360
- const rectangle = data ? data.get('rectangle').toJS() : null;
361
-
362
- return {clientSessionId, rectangle};
363
- })(DialogResizable);
364
-
365
- /******************************************************************************/
366
-
367
- registerWidget(DialogResizable, props, scenarios, false);
1
+ import React from 'react';
2
+ import props from './props';
3
+ import scenarios from './scenarios';
4
+ import {registerWidget} from 'goblin-gadgets/widgets/widget-doc/widget-list';
5
+ import Widget from 'goblin-laboratory/widgets/widget';
6
+ import DialogResizableNC from 'goblin-gadgets/widgets/dialog-resizable-nc/widget';
7
+ import KeyTrap from 'goblin-gadgets/widgets/key-trap.js';
8
+ import _ from 'lodash';
9
+ import {Unit} from 'goblin-theme';
10
+ const px = Unit.toPx;
11
+ const n = Unit.toValue;
12
+
13
+ /******************************************************************************/
14
+
15
+ function clipRectangle(rectangle) {
16
+ // Clip position of center (horizontal and vertical) into viewport.
17
+ const viewportWidth = window.visualViewport.width;
18
+ const viewportHeight = window.visualViewport.height;
19
+
20
+ rectangle.width = Math.min(rectangle.width, viewportWidth);
21
+ rectangle.height = Math.min(rectangle.height, viewportHeight);
22
+
23
+ const h = viewportWidth / 2 - rectangle.width / 2;
24
+ const v = viewportHeight / 2 - rectangle.height / 2;
25
+
26
+ rectangle.horizontal = Math.max(rectangle.horizontal, -h);
27
+ rectangle.horizontal = Math.min(rectangle.horizontal, h);
28
+ rectangle.vertical = Math.max(rectangle.vertical, -v);
29
+ rectangle.vertical = Math.min(rectangle.vertical, v);
30
+ }
31
+
32
+ function compareRectangle(r1, r2) {
33
+ return (
34
+ r1.horizontal === r2.horizontal &&
35
+ r1.vertical === r2.vertical &&
36
+ r1.width === r2.width &&
37
+ r1.height === r2.height
38
+ );
39
+ }
40
+
41
+ /******************************************************************************/
42
+
43
+ class DialogResizable extends Widget {
44
+ constructor() {
45
+ super(...arguments);
46
+
47
+ let rectangle;
48
+ if (this.props.rectangle) {
49
+ rectangle = this.props.rectangle;
50
+ } else {
51
+ rectangle = {
52
+ horizontal: n(this.props.horizontal),
53
+ vertical: n(this.props.vertical),
54
+ width: n(this.props.width),
55
+ height: n(this.props.height),
56
+ };
57
+ }
58
+ this.initialRectangle = rectangle;
59
+
60
+ this.state = {
61
+ rectangle: rectangle,
62
+ resizingElement: null,
63
+ };
64
+
65
+ this.minWidth = n(this.props.minWidth || '100px');
66
+ this.minHeight = n(this.props.minHeight || '100px');
67
+
68
+ this.startingRectangle = null;
69
+ this.originX = null;
70
+ this.originY = null;
71
+
72
+ this.onMinimize = this.onMinimize.bind(this);
73
+ this.onRestore = this.onRestore.bind(this);
74
+ this.onMaximize = this.onMaximize.bind(this);
75
+ this.onCloseDialog = this.onCloseDialog.bind(this);
76
+ this.onMouseDown = this.onMouseDown.bind(this);
77
+ this.onMouseMove = this.onMouseMove.bind(this);
78
+ this.onMouseUp = this.onMouseUp.bind(this);
79
+
80
+ this.doMove = _.throttle(this.doMove.bind(this), 50);
81
+ }
82
+
83
+ //#region get/set
84
+ get rectangle() {
85
+ return this.state.rectangle;
86
+ }
87
+ set rectangle(value) {
88
+ this.setState({
89
+ rectangle: value,
90
+ });
91
+ }
92
+
93
+ get resizingElement() {
94
+ return this.state.resizingElement;
95
+ }
96
+ set resizingElement(value) {
97
+ this.setState({
98
+ resizingElement: value,
99
+ });
100
+ }
101
+ //#endregion
102
+
103
+ UNSAFE_componentWillMount() {
104
+ KeyTrap.bind('Escape', this.onCloseDialog);
105
+ if (!this.props.enterKeyStaysInside) {
106
+ KeyTrap.bind('Enter', this.onCloseDialog);
107
+ }
108
+ }
109
+
110
+ componentWillUnmount() {
111
+ super.componentWillUnmount();
112
+ KeyTrap.unbind('Escape', this.onCloseDialog);
113
+ if (!this.props.enterKeyStaysInside) {
114
+ KeyTrap.unbind('Enter', this.onCloseDialog);
115
+ }
116
+ }
117
+
118
+ changeRectangle(rectangle) {
119
+ if (!this.props.id) {
120
+ return;
121
+ }
122
+
123
+ this.doFor(this.props.clientSessionId, 'set-dialogs', {
124
+ dialogId: this.props.id,
125
+ state: {rectangle},
126
+ });
127
+ }
128
+
129
+ get minimalRectangle() {
130
+ return {
131
+ ...this.rectangle,
132
+ width: this.minWidth,
133
+ height: this.minHeight,
134
+ };
135
+ }
136
+
137
+ get maximalRectangle() {
138
+ return {
139
+ horizontal: 0,
140
+ vertical: 0,
141
+ width: window.visualViewport.width,
142
+ height: window.visualViewport.height,
143
+ };
144
+ }
145
+
146
+ get minimizeEnable() {
147
+ return !compareRectangle(this.rectangle, this.minimalRectangle);
148
+ }
149
+
150
+ get restoreEnable() {
151
+ return !compareRectangle(this.rectangle, this.initialRectangle);
152
+ }
153
+
154
+ get maximizeEnable() {
155
+ return !compareRectangle(this.rectangle, this.maximalRectangle);
156
+ }
157
+
158
+ onMinimize() {
159
+ const rectangle = this.minimalRectangle;
160
+ this.rectangle = rectangle;
161
+ this.changeRectangle(rectangle);
162
+ }
163
+
164
+ onRestore() {
165
+ this.rectangle = this.initialRectangle;
166
+ this.changeRectangle(this.initialRectangle);
167
+ }
168
+
169
+ onMaximize() {
170
+ const rectangle = this.maximalRectangle;
171
+ this.rectangle = rectangle;
172
+ this.changeRectangle(rectangle);
173
+ }
174
+
175
+ onCloseDialog() {
176
+ this.props.onCloseDialog();
177
+ }
178
+
179
+ onMouseDown(e, element) {
180
+ if (e.buttons === 1 && element) {
181
+ // Mouse left button pressed ?
182
+ this.resizingElement = element;
183
+ this.originX = e.clientX;
184
+ this.originY = e.clientY;
185
+
186
+ const rectangle = {...this.rectangle};
187
+ clipRectangle(rectangle);
188
+ this.startingRectangle = rectangle;
189
+ this.rectangle = rectangle;
190
+ }
191
+ }
192
+
193
+ onMouseMove(e) {
194
+ if (this.resizingElement) {
195
+ const dx = e.clientX - this.originX;
196
+ const dy = e.clientY - this.originY;
197
+ this.doMove(dx, dy);
198
+ }
199
+ }
200
+
201
+ doMove(dx, dy) {
202
+ if (!this.resizingElement) {
203
+ return;
204
+ }
205
+
206
+ const newRectangle = {...this.rectangle};
207
+
208
+ const elements = this.resizingElement.split('+');
209
+
210
+ // Move title bar.
211
+ if (elements.includes('title')) {
212
+ newRectangle.horizontal = this.startingRectangle.horizontal + dx;
213
+ newRectangle.vertical = this.startingRectangle.vertical + dy;
214
+ }
215
+
216
+ // Move border and/or corner.
217
+ if (elements.includes('left')) {
218
+ dx = Math.min(dx, this.startingRectangle.width - this.minWidth);
219
+ newRectangle.width = this.startingRectangle.width - dx;
220
+ newRectangle.horizontal = this.startingRectangle.horizontal + dx / 2;
221
+ }
222
+
223
+ if (elements.includes('right')) {
224
+ dx = Math.max(dx, this.minWidth - this.startingRectangle.width);
225
+ newRectangle.width = this.startingRectangle.width + dx;
226
+ newRectangle.horizontal = this.startingRectangle.horizontal + dx / 2;
227
+ }
228
+
229
+ if (elements.includes('top')) {
230
+ dy = Math.min(dy, this.startingRectangle.height - this.minHeight);
231
+ newRectangle.height = this.startingRectangle.height - dy;
232
+ newRectangle.vertical = this.startingRectangle.vertical + dy / 2;
233
+ }
234
+
235
+ if (elements.includes('bottom')) {
236
+ dy = Math.max(dy, this.minHeight - this.startingRectangle.height);
237
+ newRectangle.height = this.startingRectangle.height + dy;
238
+ newRectangle.vertical = this.startingRectangle.vertical + dy / 2;
239
+ }
240
+
241
+ this.rectangle = newRectangle;
242
+ }
243
+
244
+ onMouseUp() {
245
+ if (this.resizingElement) {
246
+ this.resizingElement = null;
247
+ this.changeRectangle(this.rectangle);
248
+ }
249
+ }
250
+
251
+ /******************************************************************************/
252
+
253
+ renderFinal() {
254
+ const {width, height, horizontal, vertical, ...otherProps} = this.props;
255
+
256
+ const rectangle = {...this.rectangle};
257
+ clipRectangle(rectangle);
258
+
259
+ return (
260
+ <DialogResizableNC
261
+ {...otherProps}
262
+ horizontal={px(rectangle.horizontal)}
263
+ vertical={px(rectangle.vertical)}
264
+ width={px(rectangle.width)}
265
+ height={px(rectangle.height)}
266
+ resizing={!!this.resizingElement}
267
+ onMinimize={this.minimizeEnable ? this.onMinimize : null}
268
+ onRestore={this.restoreEnable ? this.onRestore : null}
269
+ onMaximize={this.maximizeEnable ? this.onMaximize : null}
270
+ onCloseDialog={this.props.onCloseDialog ? this.onCloseDialog : null}
271
+ onMouseDown={this.onMouseDown}
272
+ onMouseMove={this.onMouseMove}
273
+ onMouseUp={this.onMouseUp}
274
+ />
275
+ );
276
+ }
277
+
278
+ renderOriginal() {
279
+ const {width, height, horizontal, vertical, ...otherProps} = this.props;
280
+
281
+ return (
282
+ <DialogResizableNC
283
+ {...otherProps}
284
+ horizontal={px(this.props.rectangle.horizontal)}
285
+ vertical={px(this.props.rectangle.vertical)}
286
+ width={px(this.props.rectangle.width)}
287
+ height={px(this.props.rectangle.height)}
288
+ resizing={false}
289
+ onMinimize={this.minimizeEnable ? this.onMinimize : null}
290
+ onRestore={this.restoreEnable ? this.onRestore : null}
291
+ onMaximize={this.maximizeEnable ? this.onMaximize : null}
292
+ onCloseDialog={this.props.onCloseDialog ? this.onCloseDialog : null}
293
+ onMouseDown={this.onMouseDown}
294
+ onMouseMove={this.onMouseMove}
295
+ onMouseUp={this.onMouseUp}
296
+ />
297
+ );
298
+ }
299
+
300
+ renderResizing() {
301
+ const {
302
+ width,
303
+ height,
304
+ horizontal,
305
+ vertical,
306
+ children,
307
+ ...otherProps
308
+ } = this.props;
309
+
310
+ const rectangle = {...this.rectangle};
311
+ clipRectangle(rectangle);
312
+
313
+ return (
314
+ <DialogResizableNC
315
+ {...otherProps}
316
+ horizontal={px(rectangle.horizontal)}
317
+ vertical={px(rectangle.vertical)}
318
+ width={px(rectangle.width)}
319
+ height={px(rectangle.height)}
320
+ resizing={true}
321
+ opacity={0.3}
322
+ onMinimize={this.minimizeEnable ? this.onMinimize : null}
323
+ onRestore={this.restoreEnable ? this.onRestore : null}
324
+ onMaximize={this.maximizeEnable ? this.onMaximize : null}
325
+ onCloseDialog={this.props.onCloseDialog ? this.onCloseDialog : null}
326
+ onMouseDown={this.onMouseDown}
327
+ onMouseMove={this.onMouseMove}
328
+ onMouseUp={this.onMouseUp}
329
+ />
330
+ );
331
+ }
332
+
333
+ render() {
334
+ if (this.props.drawChildrenWhileResizing) {
335
+ // Always draw the final dialogue.
336
+ return this.renderFinal();
337
+ } else {
338
+ if (this.resizingElement) {
339
+ // During resizing, draw the original dialog (not yet moved) and
340
+ // a skeleton of the new dialog.
341
+ return (
342
+ <>
343
+ {this.renderOriginal()}
344
+ {this.renderResizing()}
345
+ </>
346
+ );
347
+ } else {
348
+ return this.renderFinal();
349
+ }
350
+ }
351
+ }
352
+ }
353
+
354
+ /******************************************************************************/
355
+
356
+ export default Widget.connect((state, props) => {
357
+ const userSession = Widget.getUserSession(state);
358
+ const clientSessionId = userSession.get('id');
359
+ const data = userSession.get(`dialogs.${props.id}`);
360
+ const rectangle = data ? data.get('rectangle').toJS() : null;
361
+
362
+ return {clientSessionId, rectangle};
363
+ })(DialogResizable);
364
+
365
+ /******************************************************************************/
366
+
367
+ registerWidget(DialogResizable, props, scenarios, false);