@componyx/ui 0.0.0-stage → 1.0.4

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 (169) hide show
  1. package/AppSkin/AppSkin.css +1268 -0
  2. package/AppSkin/AppSkin.js +2748 -0
  3. package/AppSkin/Themes/Default.css +241 -0
  4. package/Base/Base.js +3407 -0
  5. package/Base/ComponentIcons.css +66 -0
  6. package/Base/Font/ComponentIcons.woff +0 -0
  7. package/Base/Font/UI.woff +0 -0
  8. package/Base/Library.js +8432 -0
  9. package/Base/NavigationManager.js +462 -0
  10. package/Base/ResponsiveTemplates.js +371 -0
  11. package/Base/Sanitizer.js +288 -0
  12. package/Base/Themes/Default.css +255 -0
  13. package/Base/UI.css +618 -0
  14. package/Base/UIResourcePath.js +6 -0
  15. package/Bindary/Bindary.js +2011 -0
  16. package/Bindary/Modules/Connection.js +216 -0
  17. package/Bindary/Modules/Core.js +854 -0
  18. package/Bindary/Modules/DataUpdater.js +351 -0
  19. package/Bindary/Modules/ExpressionEngine.js +347 -0
  20. package/Bindary/Modules/ProxyManager.js +482 -0
  21. package/Bindary/Modules/Renderer.js +605 -0
  22. package/Bindary/Modules/Router.js +291 -0
  23. package/Bindary/Modules/Scroller.js +89 -0
  24. package/Bindary/Modules/Template.js +1273 -0
  25. package/BookmarkSpy/BookmarkSpy.js +430 -0
  26. package/Box/Box.css +36 -0
  27. package/Box/Box.js +1685 -0
  28. package/Button/Button.css +470 -0
  29. package/Button/Button.js +1398 -0
  30. package/Button/Themes/Default.css +200 -0
  31. package/Carousel/Carousel.css +273 -0
  32. package/Carousel/Carousel.js +607 -0
  33. package/ColorButton/ColorButton.css +39 -0
  34. package/ColorButton/ColorButton.js +336 -0
  35. package/ColorPicker/ColorPicker.css +359 -0
  36. package/ColorPicker/ColorPicker.js +972 -0
  37. package/ComboBox/ComboBox.css +357 -0
  38. package/ComboBox/ComboBox.js +2342 -0
  39. package/ComboBox/Themes/Default.css +23 -0
  40. package/DataPager/DataPager.css +72 -0
  41. package/DataPager/DataPager.js +674 -0
  42. package/DatePicker/DatePicker.css +227 -0
  43. package/DatePicker/DatePicker.js +1531 -0
  44. package/DatePicker/Themes/Default.css +26 -0
  45. package/Dialog/Dialog.css +106 -0
  46. package/Dialog/Dialog.js +572 -0
  47. package/Dialog/Themes/Default.css +10 -0
  48. package/Editor/Data/Emoji.json +8285 -0
  49. package/Editor/Data/Special.json +1042 -0
  50. package/Editor/Editor.css +1562 -0
  51. package/Editor/Editor.js +4058 -0
  52. package/Editor/Font/Editor.woff +0 -0
  53. package/Editor/Modules/ComponentFactory.js +565 -0
  54. package/Editor/Modules/ContentManager.js +748 -0
  55. package/Editor/Modules/DialogManager.js +1234 -0
  56. package/Editor/Modules/EventManager.js +458 -0
  57. package/Editor/Modules/Format.js +950 -0
  58. package/Editor/Modules/History.js +191 -0
  59. package/Editor/Modules/LayoutState.js +379 -0
  60. package/Editor/Modules/ListManager.js +296 -0
  61. package/Editor/Modules/MenuManager.js +388 -0
  62. package/Editor/Modules/NodeManager.js +681 -0
  63. package/Editor/Modules/ParagraphButtons.js +122 -0
  64. package/Editor/Modules/Resizer.js +176 -0
  65. package/Editor/Modules/SelectionRange.js +564 -0
  66. package/Editor/Modules/SourceViewBuilder.js +212 -0
  67. package/Editor/Modules/SymbolPicker.js +208 -0
  68. package/Editor/Modules/Table.js +2327 -0
  69. package/Editor/Modules/TableDialog.js +757 -0
  70. package/Editor/Modules/Toolbar.js +375 -0
  71. package/Editor/Modules/TooltipMenu.js +125 -0
  72. package/Editor/Modules/Utility.js +131 -0
  73. package/Editor/Themes/Default.css +204 -0
  74. package/FileUpload/FileUpload.css +156 -0
  75. package/FileUpload/FileUpload.js +898 -0
  76. package/FileUpload/Themes/Default.css +17 -0
  77. package/Form/Form.css +1934 -0
  78. package/Form/Form.js +4943 -0
  79. package/Form/Modules/ActionManager.js +368 -0
  80. package/Form/Modules/BuildPanelManager.js +319 -0
  81. package/Form/Modules/ComponentFactory.js +468 -0
  82. package/Form/Modules/ComponentPanel.js +265 -0
  83. package/Form/Modules/ConfigPanelManager.js +685 -0
  84. package/Form/Modules/DataBinder.js +602 -0
  85. package/Form/Modules/DataObserver.js +717 -0
  86. package/Form/Modules/Draggable.js +756 -0
  87. package/Form/Modules/OptionsPanel.js +342 -0
  88. package/Form/Modules/Renderer.js +1889 -0
  89. package/Form/Modules/RuleEngine.js +585 -0
  90. package/Form/Modules/RulesPanel.js +1158 -0
  91. package/Form/Modules/Types.js +1709 -0
  92. package/Form/Modules/ValidationManager.js +194 -0
  93. package/Form/Themes/Default.css +216 -0
  94. package/FormField/FormField.css +468 -0
  95. package/FormField/FormField.js +576 -0
  96. package/FormField/Themes/Default.css +99 -0
  97. package/Grid/Grid.css +544 -0
  98. package/Grid/Grid.js +3761 -0
  99. package/Grid/Themes/Default.css +43 -0
  100. package/LICENSE +126 -0
  101. package/MaskedTextBox/MaskedTextBox.css +28 -0
  102. package/MaskedTextBox/MaskedTextBox.js +642 -0
  103. package/MaskedTextBox/Themes/Default.css +6 -0
  104. package/Menu/Menu.css +328 -0
  105. package/Menu/Menu.js +2386 -0
  106. package/Menu/Themes/Default.css +24 -0
  107. package/NumericBox/NumericBox.css +120 -0
  108. package/NumericBox/NumericBox.js +984 -0
  109. package/PanelBar/PanelBar.css +123 -0
  110. package/PanelBar/PanelBar.js +505 -0
  111. package/PanelBar/Themes/Default.css +51 -0
  112. package/PieChart/PieChart.css +95 -0
  113. package/PieChart/PieChart.js +820 -0
  114. package/PieChart/Themes/Default.css +9 -0
  115. package/README.md +178 -3
  116. package/Slider/Slider.css +348 -0
  117. package/Slider/Slider.js +1306 -0
  118. package/Slider/Themes/Default.css +44 -0
  119. package/TabStrip/TabStrip.css +52 -0
  120. package/TabStrip/TabStrip.js +362 -0
  121. package/TabStrip/Themes/Default.css +35 -0
  122. package/TimePicker/Themes/Default.css +30 -0
  123. package/TimePicker/TimePicker.css +253 -0
  124. package/TimePicker/TimePicker.js +1485 -0
  125. package/TooltipManager/Themes/Default.css +21 -0
  126. package/TooltipManager/TooltipManager.css +227 -0
  127. package/TooltipManager/TooltipManager.js +791 -0
  128. package/Validator/Validator.css +54 -0
  129. package/Validator/Validator.js +2508 -0
  130. package/componyx.html-data.json +619 -0
  131. package/index.js +27 -0
  132. package/package.json +43 -4
  133. package/types/AppSkin.d.ts +842 -0
  134. package/types/Base.d.ts +1034 -0
  135. package/types/Bindary.d.ts +1196 -0
  136. package/types/BookmarkSpy.d.ts +112 -0
  137. package/types/Box.d.ts +374 -0
  138. package/types/Button.d.ts +455 -0
  139. package/types/Carousel.d.ts +136 -0
  140. package/types/ColorButton.d.ts +120 -0
  141. package/types/ColorPicker.d.ts +225 -0
  142. package/types/ComboBox.d.ts +507 -0
  143. package/types/DataPager.d.ts +152 -0
  144. package/types/DatePicker.d.ts +354 -0
  145. package/types/Dialog.d.ts +160 -0
  146. package/types/Editor.d.ts +1289 -0
  147. package/types/FileUpload.d.ts +206 -0
  148. package/types/Form.d.ts +3078 -0
  149. package/types/FormField.d.ts +204 -0
  150. package/types/Grid.d.ts +911 -0
  151. package/types/Library.d.ts +1899 -0
  152. package/types/MaskedTextBox.d.ts +91 -0
  153. package/types/Menu.d.ts +577 -0
  154. package/types/NumericBox.d.ts +310 -0
  155. package/types/PanelBar.d.ts +223 -0
  156. package/types/PieChart.d.ts +224 -0
  157. package/types/ResponsiveTemplates.d.ts +108 -0
  158. package/types/Slider.d.ts +227 -0
  159. package/types/TabStrip.d.ts +185 -0
  160. package/types/TimePicker.d.ts +265 -0
  161. package/types/TooltipManager.d.ts +178 -0
  162. package/types/UI.d.ts +29 -0
  163. package/types/Validator.d.ts +653 -0
  164. package/types/index.d.ts +59 -0
  165. package/ui.css +11783 -0
  166. package/ui.js +79477 -0
  167. package/ui.min.css +138 -0
  168. package/ui.min.js +264 -0
  169. package/ui.min.js.map +1 -0
@@ -0,0 +1,564 @@
1
+ /*! Componyx.UI | (c) E.H. Daanen / Componyx | BUSL-1.1 | componyx.com/license */
2
+ componyx.UI.editor_modules = componyx.UI.editor_modules || {};
3
+
4
+ /**
5
+ * SelectionRange module - range manipulation and selection management.
6
+ * @class SelectionRange
7
+ * @memberof componyx.UI.editor_modules
8
+ * @ignore
9
+ */
10
+ componyx.UI.editor_modules.SelectionRange = class SelectionRange
11
+ {
12
+ constructor(editor)
13
+ {
14
+ this.editor = editor;
15
+ this.util = editor.utility;
16
+ }
17
+
18
+ /**
19
+ * Gets the range object.
20
+ */
21
+ getRange()
22
+ {
23
+ let editableElement = this.editor.getEditorElement(),
24
+ doc = this.editor.getDoc(),
25
+ sel = this.getSelection(),
26
+ range;
27
+
28
+ if (!sel.rangeCount)
29
+ {
30
+ editableElement.focus();
31
+
32
+ if (!sel.rangeCount)
33
+ {
34
+ range = doc.createRange();
35
+ range.selectNodeContents(editableElement.firstChild || editableElement);
36
+ range.collapse(true);
37
+ sel.addRange(range);
38
+ }
39
+ }
40
+
41
+ range = sel.getRangeAt(0);
42
+
43
+ if (this.editor.hasContent() && range.startContainer == editableElement && range.startOffset == 0)
44
+ range.setStart(editableElement.firstChild, 0);
45
+
46
+ return range;
47
+ }
48
+
49
+ selectAll()
50
+ {
51
+ let range = this.getRange(),
52
+ element = this.editor.getEditorElement();
53
+
54
+ range.setStartBefore(element.firstElementChild);
55
+ range.setEndAfter(element.lastElementChild);
56
+ this.selectNodesInRange(range);
57
+ }
58
+
59
+ /**
60
+ * Gets the selection object.
61
+ */
62
+ getSelection()
63
+ {
64
+ let iframe = this.editor._iframe;
65
+ return (iframe) ? iframe.contentWindow.getSelection() : window.getSelection();
66
+ }
67
+
68
+ /**
69
+ * Ensures that the Range is set to a text node.
70
+ * @param {Range} range
71
+ */
72
+ ensureTextRange(range)
73
+ {
74
+ let node,
75
+ collapsed = range.collapsed,
76
+ startContainer = range.startContainer,
77
+ endContainer = range.endContainer,
78
+ getTextNode = (node, container, beforeNode) =>
79
+ {
80
+ let textNode, useEndOffset = false;
81
+
82
+ if (node)
83
+ {
84
+ if (node.nodeName.match(this.util.voidNodeRegEx))
85
+ {
86
+ let prev = node.previousSibling;
87
+ while (prev && prev.nodeName.match(this.util.voidNodeRegEx))
88
+ prev = prev.previousSibling;
89
+
90
+ if (prev)
91
+ {
92
+ useEndOffset = true;
93
+ textNode = prev.nodeType == 3 ? prev : this.editor.nodeManager.getFirstTextNode(prev, container, true);
94
+ if (textNode)
95
+ return { textNode, useEndOffset };
96
+ }
97
+ }
98
+
99
+ node = (node.nodeType == 1) ? node.firstChild || this.editor.nodeManager.createTextNodePlaceHolder(node, beforeNode) : node;
100
+ textNode = node;
101
+ }
102
+ else
103
+ textNode = this.editor.nodeManager.createTextNodePlaceHolder(container, beforeNode);
104
+
105
+ return { textNode, useEndOffset };
106
+ };
107
+
108
+ if (startContainer.nodeType == 1)
109
+ {
110
+ node = startContainer.childNodes[range.startOffset];
111
+ let { textNode: startNode, useEndOffset } = getTextNode(node, startContainer, startContainer.firstChild);
112
+ let offset = useEndOffset ? startNode.textContent.length : 0;
113
+ range.setStart(startNode, offset);
114
+
115
+ if (collapsed && !range.collapsed)
116
+ {
117
+ range.setStart(range.startContainer, offset);
118
+ range.collapse(true);
119
+ }
120
+ }
121
+
122
+ if (range.collapsed)
123
+ return range;
124
+
125
+ if (endContainer.nodeType == 1)
126
+ {
127
+ node = endContainer.childNodes[range.endOffset] || endContainer.lastChild; // past the end - use last child
128
+
129
+ let { textNode: endNode } = getTextNode(node, endContainer);
130
+ range.setEnd(endNode, endNode.textContent.length);
131
+ }
132
+
133
+ return range;
134
+ }
135
+
136
+ /**
137
+ * Restores the range to the marker(s).
138
+ * @param {Object} marker
139
+ * @param {Range} range
140
+ * @returns {Range} The selection range.
141
+ */
142
+ restoreRangeToMarker(marker, range)
143
+ {
144
+ return this.restoreRange(this.setRangeToMarker(range, marker.startId, marker.endId));
145
+ }
146
+
147
+ /**
148
+ * Restores the selection range to the provided range.
149
+ * @param {Range} range
150
+ * @returns {Range} The selection range.
151
+ */
152
+ restoreRange(range)
153
+ {
154
+ let sel = this.getSelection();
155
+ sel.removeAllRanges();
156
+ sel.addRange(range);
157
+ return range;
158
+ }
159
+
160
+ /**
161
+ * Restores the range to the marker(s).
162
+ * @param {Range} range
163
+ * @param {string} startId
164
+ * @param {string} endId
165
+ * @returns {Range} The selection range.
166
+ */
167
+ setRangeToMarker(range, startId, endId)
168
+ {
169
+ let doc = this.editor.getDoc(),
170
+ startEl = $lib('#' + startId),
171
+ endEl = $lib('#' + endId),
172
+ endNode = (endEl) ? endEl.previousSibling : null;
173
+
174
+ if (!startEl && !endEl)
175
+ {
176
+ $lib.log('setRangeToMarker() exception, no marker found.');
177
+ return range;
178
+ }
179
+
180
+ if (startEl)
181
+ {
182
+ let startNode = startEl.nextSibling;
183
+
184
+ if (startNode && startNode.nodeType == 3)
185
+ range.setStart(startNode, 0);
186
+ else
187
+ {
188
+ if (startNode && startNode.hasChildNodes())
189
+ startNode = this.editor.nodeManager.getFirstTextNode(startNode, startEl.parentElement);
190
+
191
+ if (startNode && startNode.nodeType == 3)
192
+ range.setStart(startNode, 0);
193
+ else
194
+ {
195
+ startNode = this.editor.nodeManager.getFirstTextNode(startEl.previousSibling, startEl.parentElement, true);
196
+
197
+ if (startNode)
198
+ range.setStart(startNode, startNode.textContent.length);
199
+ else
200
+ {
201
+ startNode = doc.createTextNode('');
202
+ startEl.parentNode.insertBefore(startNode, startEl);
203
+ range.setStart(startNode, 0);
204
+ }
205
+ }
206
+ }
207
+ }
208
+
209
+ if (!endEl)
210
+ return range;
211
+
212
+ if (endNode && endNode.nodeType == 3)
213
+ range.setEnd(endNode, endNode.textContent.length);
214
+ else
215
+ {
216
+ if (endNode && endNode.hasChildNodes())
217
+ endNode = this.editor.nodeManager.getFirstTextNode(endNode, endEl.parentElement, true);
218
+
219
+ if (endNode && endNode.nodeType == 3)
220
+ range.setEnd(endNode, endNode.textContent.length);
221
+ else
222
+ {
223
+ endNode = this.editor.nodeManager.getFirstTextNode(endEl.nextSibling, endEl.parentElement);
224
+
225
+ if (endNode)
226
+ range.setEnd(endNode, 0);
227
+ else
228
+ {
229
+ endNode = doc.createTextNode('');
230
+ endEl.parentNode.insertBefore(endNode, endEl);
231
+ range.setEnd(endNode, 0);
232
+ }
233
+ }
234
+ }
235
+
236
+ return range;
237
+ }
238
+
239
+ /**
240
+ * Creates range marker(s).
241
+ * @param {Range} range
242
+ */
243
+ createRangeMarker(range)
244
+ {
245
+ let doc = this.editor.getDoc(),
246
+ startContainer = range.startContainer,
247
+ startOffset = range.startOffset,
248
+ endContainer = (!range.collapsed) ? range.endContainer : null,
249
+ endOffset = range.endOffset,
250
+ startMarker = doc.createElement('span'),
251
+ startId = this.util.newGuid(), endId, node;
252
+
253
+ startMarker.id = startId;
254
+ startMarker.setAttribute(this.util.markerAttr, '');
255
+
256
+ if (startContainer.nodeType == 1 || !startOffset)
257
+ startContainer.parentNode.insertBefore(startMarker, startContainer);
258
+ else
259
+ {
260
+ node = startContainer.splitText(startOffset);
261
+ node.parentNode.insertBefore(startMarker, node);
262
+
263
+ if (!node.textContent.length || node.nodeValue.match(/^\uFEFF+$/))
264
+ node.remove();
265
+
266
+ if (endContainer)
267
+ {
268
+ if (startContainer == endContainer)
269
+ {
270
+ endOffset -= startOffset;
271
+ endContainer = node;
272
+ }
273
+ }
274
+ }
275
+
276
+ if (endContainer)
277
+ {
278
+ let endMarker = doc.createElement('span');
279
+
280
+ endId = this.util.newGuid();
281
+ endMarker.id = endId;
282
+ endMarker.setAttribute(this.util.markerAttr, '');
283
+
284
+ if (endContainer.nodeType == 1 || endContainer.textContent.length == endOffset)
285
+ endContainer.parentElement.insertBefore(endMarker, endContainer.nextSibling);
286
+ else
287
+ {
288
+ node = endContainer.splitText(endOffset);
289
+ node.parentNode.insertBefore(endMarker, node);
290
+
291
+ if (!node.textContent.length || node.nodeValue.match(/^\uFEFF+$/))
292
+ node.remove();
293
+ }
294
+ }
295
+
296
+ return { startId: startId, endId: endId };
297
+ }
298
+
299
+ /**
300
+ * Remove range marker(s).
301
+ * @param {Object} marker
302
+ */
303
+ removeRangeMarker(marker)
304
+ {
305
+ const editableElement = this.editor.getEditorElement();
306
+ editableElement.querySelectorAll('#' + marker.startId).forEach(el => el.remove());
307
+
308
+ if (marker.endId)
309
+ editableElement.querySelectorAll('#' + marker.endId).forEach(el => el.remove());
310
+ }
311
+
312
+ /**
313
+ * Gets all the nodes within the range
314
+ * @param {Range} range
315
+ */
316
+ getNodesInRange(range)
317
+ {
318
+ let node = range.startContainer,
319
+ endNode = range.endContainer,
320
+ startOffset = range.startOffset,
321
+ endOffset = range.endOffset;
322
+
323
+ if (node == endNode && node.nodeType == 1 && startOffset == 0 && endOffset == node.childNodes.length)
324
+ return [node];
325
+
326
+ if (node.nodeType == 1 && node.childNodes.length > startOffset)
327
+ node = node.childNodes[startOffset];
328
+
329
+ if (endNode.nodeType == 1 && endNode.childNodes.length > endOffset)
330
+ endNode = endNode.childNodes[endOffset];
331
+
332
+ let rangeNodes = [node];
333
+
334
+ if (node == endNode)
335
+ return rangeNodes;
336
+
337
+ while (node && node != endNode)
338
+ {
339
+ node = this.editor.nodeManager.nextNode(node);
340
+
341
+ if (node)
342
+ rangeNodes.push(node);
343
+ }
344
+
345
+ return rangeNodes;
346
+ }
347
+
348
+ /**
349
+ * Gets the root nodes in the range
350
+ * @param {Range} range
351
+ * @param {Node[]} [nodes]
352
+ * @param {boolean} [useLayoutRoot = true]
353
+ */
354
+ getRootNodesInRange(range, nodes, useLayoutRoot = true)
355
+ {
356
+ let seen = new Map(),
357
+ rootNodes = [], node;
358
+
359
+ nodes = nodes || this.getNodesInRange(range);
360
+
361
+ for (let index = 0; index < nodes.length; ++index)
362
+ {
363
+ node = this.editor.nodeManager.getRootNode(nodes[index], useLayoutRoot);
364
+
365
+ if (node && !seen.has(node))
366
+ {
367
+ seen.set(node, true);
368
+ rootNodes.push(node);
369
+ }
370
+ }
371
+
372
+ return rootNodes;
373
+ }
374
+
375
+ /**
376
+ * Selects the contents of the specified node.
377
+ * @param {Node} node
378
+ */
379
+ selectNodeContents(node)
380
+ {
381
+ let doc = this.editor.getDoc(),
382
+ range = doc.createRange();
383
+
384
+ range.selectNodeContents(node);
385
+ return this.restoreRange(range);
386
+ }
387
+
388
+ /**
389
+ * Selects the nodes inside the range.
390
+ * @param {Range} range
391
+ */
392
+ selectNodesInRange(range)
393
+ {
394
+ let rootNodes = this.getRootNodesInRange(range),
395
+ nodes = this.editor.nodeManager.getSurroundingNodes(range.startContainer, rootNodes[0]);
396
+
397
+ $lib.each(rootNodes.concat(nodes), (node) =>
398
+ {
399
+ if (node.nodeType == 1 && node.hasAttribute(this.util.selAttr))
400
+ this.editor.selectNode.bind(node, false)();
401
+ });
402
+ }
403
+
404
+ /**
405
+ * Collapses the range to the specified node.
406
+ * @param {Node} node
407
+ * @param {boolean} toStart
408
+ */
409
+ collapseRangeToNode(node, toStart = false)
410
+ {
411
+ let doc = this.editor.getDoc(),
412
+ range = doc.createRange();
413
+
414
+ range.selectNode(node);
415
+ range.collapse(toStart); // move to start or end
416
+ return this.restoreRange(range);
417
+ }
418
+
419
+ /**
420
+ * Gets the selected HTML from the range.
421
+ * @param {Range} range
422
+ */
423
+ getSelectedHTML(range)
424
+ {
425
+ return $lib.element('', '', '', range.cloneContents()).innerHTML;
426
+ }
427
+
428
+ /**
429
+ * Splits the text containers at the start and end.
430
+ * @param {Range} range
431
+ * @param {boolean} start
432
+ * @param {boolean} end
433
+ */
434
+ splitRange(range, start, end)
435
+ {
436
+ let startOffset = range.startOffset,
437
+ endOffset = range.endOffset,
438
+ textLength = range.endContainer.textContent.length;
439
+
440
+ if (start && startOffset > 0)
441
+ {
442
+ if (range.startContainer == range.endContainer)
443
+ {
444
+ endOffset -= startOffset;
445
+ textLength -= startOffset;
446
+ }
447
+
448
+ range.setStart(range.startContainer.splitText(startOffset), 0); // startContainer is new node created at offset
449
+ }
450
+
451
+ if (end && endOffset < textLength)
452
+ range.endContainer.splitText(endOffset);
453
+
454
+ return range;
455
+ }
456
+
457
+ /**
458
+ * Returns a value indicating if the range has changed
459
+ */
460
+ rangeChanged(lastRange)
461
+ {
462
+ let r = this.getRange(), r2 = lastRange;
463
+
464
+ if (!r2)
465
+ return true;
466
+
467
+ return (r.startContainer != r2.startContainer || r.endContainer != r2.endContainer ||
468
+ r.startOffset != r2.startOffset || r.endOffset != r2.endOffset);
469
+ }
470
+
471
+ /**
472
+ * Inserts the node into the range.
473
+ * @param {Range} range
474
+ * @param {Node} insertNode
475
+ * @param {Node} selectNode
476
+ * @param {Boolean} after
477
+ */
478
+ insertIntoRange(range, insertNode, selectNode, after)
479
+ {
480
+ selectNode = selectNode || insertNode;
481
+ range.insertNode(insertNode);
482
+
483
+ if (after)
484
+ {
485
+ range.setStartAfter(selectNode);
486
+ range.setEndAfter(selectNode);
487
+ }
488
+ else
489
+ {
490
+ range.setStartBefore(selectNode);
491
+ range.setEndBefore(selectNode);
492
+ }
493
+ }
494
+
495
+ /**
496
+ * Surrounds the range with the layout node.
497
+ * @param {Range} range
498
+ * @param {Node} layoutNode
499
+ */
500
+ surroundRange(range, layoutNode)
501
+ {
502
+ let format = this.editor.format;
503
+ layoutNode.appendChild(range.extractContents()); // collapses range (extractContents() instead of surroundContents(), because the last has problems with text-nodes)
504
+ format.updateDeeperStyleNodes(layoutNode, format.getLayoutTreeStyles(layoutNode));
505
+ range.insertNode(this.editor.nodeManager.getRootNode(layoutNode));
506
+ }
507
+
508
+ /**
509
+ * Gets the list-item nodes for the specified range.
510
+ * @param {Node[]} nodesInRange
511
+ */
512
+ getListItemNodesInRange(nodesInRange)
513
+ {
514
+ let editableElement = this.editor.getEditorElement(),
515
+ listItemNodesInRange = new Set();
516
+
517
+ $lib.each(nodesInRange, (n) =>
518
+ {
519
+ let item = this.editor.nodeManager.getListItemNode(n, this.editor.nodeManager.getListNode(n, editableElement) || editableElement);
520
+
521
+ if (item)
522
+ listItemNodesInRange.add(item);
523
+ });
524
+
525
+ return listItemNodesInRange;
526
+ }
527
+
528
+ /**
529
+ * Returns a value indicating if the caret is at the start of a list item (<li>).
530
+ * @param {any} range
531
+ */
532
+ isCaretAtListItemStart(range)
533
+ {
534
+ let sContainer = range.startContainer,
535
+ el = (sContainer.nodeType == 3) ? sContainer.parentElement : sContainer;
536
+
537
+ return (range.startOffset == 0 && el.nodeName == 'LI');
538
+ }
539
+
540
+ /**
541
+ * Returns a value indicating if the caret is at the start of a paragraph (<p>).
542
+ * @param {any} range
543
+ */
544
+ isCaretAtParagraphStart(range)
545
+ {
546
+ let sContainer = range.startContainer,
547
+ el = (sContainer.nodeType == 3) ? sContainer.parentElement : sContainer;
548
+
549
+ return (range.startOffset == 0 && el.nodeName == 'P');
550
+ }
551
+
552
+ /**
553
+ * Returns a value indicating if the start container of the range allows content.
554
+ * @param {any} range
555
+ */
556
+ allowContent(range)
557
+ {
558
+ return (range.startContainer.nodeType != 1 || range.startContainer.contentEditable != 'false');
559
+ }
560
+ };
561
+
562
+ var SelectionRange = componyx.UI.editor_modules.RangeManager;
563
+
564
+ export { SelectionRange as default };