@globalpayments/vega 2.47.1 → 2.48.0

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 (359) hide show
  1. package/dist/cjs/{app-globals-fdf98585.js → app-globals-22798708.js} +3 -3
  2. package/dist/cjs/{content-state-b1ec39e3.js → content-state-54d94562.js} +220 -4
  3. package/dist/cjs/{design-token-0c22ffa8.js → design-token-1abb655a.js} +1 -1
  4. package/dist/cjs/{element-appender-slimmer-b3109dd1.js → element-appender-slimmer-2d4c8c18.js} +2 -2
  5. package/dist/cjs/{form-field-controller-slimmer-2432e295.js → form-field-controller-slimmer-527c25a0.js} +2 -2
  6. package/dist/cjs/{image-annotation-action-becd6f24.js → image-annotation-action-b78404b8.js} +1 -1
  7. package/dist/cjs/{index-ec9a1f36.js → index-c4dec3aa.js} +1 -1
  8. package/dist/cjs/index.cjs.js +6 -6
  9. package/dist/cjs/{inject-keyboard-manager-d1eac696.js → inject-keyboard-manager-b301e887.js} +1 -1
  10. package/dist/cjs/{keyboard-manager-97d0ddfa.js → keyboard-manager-2ccf4b16.js} +25 -5
  11. package/dist/cjs/{keyboard-manager-slimmer-23ce5dcf.js → keyboard-manager-slimmer-900cf2f5.js} +1 -1
  12. package/dist/cjs/loader.cjs.js +5 -5
  13. package/dist/cjs/{min-number-rule-5bcccc8f.js → min-number-rule-965fc43d.js} +2 -2
  14. package/dist/cjs/{public-rules-3c2a69b4.js → public-rules-c4d2df9d.js} +3 -3
  15. package/dist/cjs/{responsive-format-facade-e48962dd.js → responsive-format-facade-38f3763e.js} +1 -1
  16. package/dist/cjs/{rich-text-editor-required-rule-f08f5891.js → rich-text-editor-required-rule-e73f2c4f.js} +1 -1
  17. package/dist/cjs/{string-input-formatter-slimmer-56a2401f.js → string-input-formatter-slimmer-50322824.js} +2 -2
  18. package/dist/cjs/{style-formatter-48ef74d4.js → style-formatter-ecb4d49c.js} +1 -1
  19. package/dist/cjs/{sub-state-notify-slimmer-b16c9094.js → sub-state-notify-slimmer-7f437b19.js} +1 -1
  20. package/dist/cjs/{sub-state-observer-slimmer-1b6de09f.js → sub-state-observer-slimmer-e90362cd.js} +1 -1
  21. package/dist/cjs/vega-accordion.cjs.entry.js +4 -4
  22. package/dist/cjs/vega-app-header-button.cjs.entry.js +4 -4
  23. package/dist/cjs/vega-box.cjs.entry.js +5 -5
  24. package/dist/cjs/vega-button-circle.cjs.entry.js +4 -4
  25. package/dist/cjs/vega-button-group_2.cjs.entry.js +3 -3
  26. package/dist/cjs/vega-button.cjs.entry.js +3 -3
  27. package/dist/cjs/vega-calendar_3.cjs.entry.js +3 -3
  28. package/dist/cjs/vega-card.cjs.entry.js +4 -4
  29. package/dist/cjs/vega-carousel.cjs.entry.js +3 -3
  30. package/dist/cjs/vega-checkbox_2.cjs.entry.js +3 -3
  31. package/dist/cjs/vega-chip.cjs.entry.js +4 -4
  32. package/dist/cjs/vega-color-picker.cjs.entry.js +3 -3
  33. package/dist/cjs/vega-combo-box.cjs.entry.js +5 -5
  34. package/dist/cjs/vega-date-picker_2.cjs.entry.js +10 -10
  35. package/dist/cjs/vega-dialog_2.cjs.entry.js +4 -4
  36. package/dist/cjs/vega-divider.cjs.entry.js +4 -4
  37. package/dist/cjs/vega-dropdown_5.cjs.entry.js +8 -8
  38. package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
  39. package/dist/cjs/vega-file-uploader.cjs.entry.js +3 -3
  40. package/dist/cjs/vega-flag-icon.cjs.entry.js +4 -4
  41. package/dist/cjs/vega-flex.cjs.entry.js +5 -5
  42. package/dist/cjs/vega-font.cjs.entry.js +4 -4
  43. package/dist/cjs/vega-form.cjs.entry.js +4 -4
  44. package/dist/cjs/vega-grid.cjs.entry.js +4 -4
  45. package/dist/cjs/vega-icon.cjs.entry.js +4 -4
  46. package/dist/cjs/vega-image-uploader.cjs.entry.js +16 -7
  47. package/dist/cjs/vega-input-credit-card.cjs.entry.js +3 -3
  48. package/dist/cjs/vega-input-numeric.cjs.entry.js +11 -8
  49. package/dist/cjs/vega-input-phone-number.cjs.entry.js +3 -3
  50. package/dist/cjs/vega-input-range.cjs.entry.js +3 -3
  51. package/dist/cjs/vega-input-select.cjs.entry.js +5 -5
  52. package/dist/cjs/vega-input.cjs.entry.js +8 -8
  53. package/dist/cjs/{vega-internal-event-id-dc866d43.js → vega-internal-event-id-bfea9b93.js} +4 -0
  54. package/dist/cjs/vega-left-nav_5.cjs.entry.js +447 -194
  55. package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +3 -3
  56. package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +1 -1
  57. package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +1 -1
  58. package/dist/cjs/vega-pagination.cjs.entry.js +3 -3
  59. package/dist/cjs/vega-popover_2.cjs.entry.js +11 -11
  60. package/dist/cjs/vega-radio_2.cjs.entry.js +8 -5
  61. package/dist/cjs/vega-rich-text-content.cjs.entry.js +12 -12
  62. package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +448 -192
  63. package/dist/cjs/vega-selection-chip_2.cjs.entry.js +6 -6
  64. package/dist/cjs/vega-selection-tile_2.cjs.entry.js +4 -4
  65. package/dist/cjs/vega-sidenav_3.cjs.entry.js +5 -5
  66. package/dist/cjs/vega-signature-capture.cjs.entry.js +6 -6
  67. package/dist/cjs/vega-stepper.cjs.entry.js +6 -6
  68. package/dist/cjs/vega-table_8.cjs.entry.js +5 -5
  69. package/dist/cjs/vega-textarea.cjs.entry.js +3 -3
  70. package/dist/cjs/vega-time-picker_2.cjs.entry.js +8 -8
  71. package/dist/cjs/vega-toggle-switch.cjs.entry.js +3 -3
  72. package/dist/cjs/vega-tooltip_2.cjs.entry.js +11 -11
  73. package/dist/cjs/vega.cjs.js +5 -5
  74. package/dist/collection/collection-manifest.json +1 -1
  75. package/dist/collection/components/vega-image-uploader/slimmers/renderers/vega-image-uploader-actions-renderer.js +4 -1
  76. package/dist/collection/components/vega-image-uploader/vega-image-uploader.js +11 -1
  77. package/dist/collection/components/vega-input/vega-input.js +4 -4
  78. package/dist/collection/components/vega-nav/slimmers/vega-left-nav-group-hierarchy-controller.js +31 -0
  79. package/dist/collection/components/vega-nav/vega-left-nav/test/vega-left-nav-mock-data.js +147 -0
  80. package/dist/collection/components/vega-nav/vega-left-nav/vega-left-nav.js +42 -8
  81. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-initialize-selected-controller.js +56 -0
  82. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-link-click-controller.js +70 -0
  83. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-open-state-controller.js +47 -0
  84. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-other-groups-click-controller.js +60 -0
  85. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/renderers/vega-left-nav-group-renderer.js +10 -9
  86. package/dist/collection/components/vega-nav/vega-left-nav-group/vega-left-nav-group.js +21 -6
  87. package/dist/collection/components/vega-nav/vega-left-nav-link/slimmers/controllers/vega-left-nav-link-controller.js +21 -0
  88. package/dist/collection/components/vega-nav/vega-left-nav-link/slimmers/renderers/vega-left-nav-link-renderer.js +13 -1
  89. package/dist/collection/components/vega-nav/vega-left-nav-link/vega-left-nav-link.js +5 -0
  90. package/dist/collection/components/vega-rich-text-editor/dto/annotations/bold-annotation.js +6 -0
  91. package/dist/collection/components/vega-rich-text-editor/dto/annotations/code-annotation.js +6 -0
  92. package/dist/collection/components/vega-rich-text-editor/dto/annotations/horizontal-alignment-annotation.js +6 -0
  93. package/dist/collection/components/vega-rich-text-editor/dto/annotations/image-annotation.js +6 -0
  94. package/dist/collection/components/vega-rich-text-editor/dto/annotations/indent-annotation.js +6 -0
  95. package/dist/collection/components/vega-rich-text-editor/dto/annotations/italic-annotation.js +6 -0
  96. package/dist/collection/components/vega-rich-text-editor/dto/annotations/link-annotation.js +6 -0
  97. package/dist/collection/components/vega-rich-text-editor/dto/annotations/link-group-annotation.js +7 -0
  98. package/dist/collection/components/vega-rich-text-editor/dto/annotations/selection-range-annotation.js +8 -0
  99. package/dist/collection/components/vega-rich-text-editor/dto/annotations/strikethrough-annotation.js +6 -0
  100. package/dist/collection/components/vega-rich-text-editor/dto/annotations/text-color-annotation.js +6 -0
  101. package/dist/collection/components/vega-rich-text-editor/dto/annotations/text-style-annotation.js +6 -0
  102. package/dist/collection/components/vega-rich-text-editor/dto/annotations/underline-annotation.js +6 -0
  103. package/dist/collection/components/vega-rich-text-editor/dto/blocks/block.abstract.js +8 -0
  104. package/dist/collection/components/vega-rich-text-editor/dto/blocks/image-block.js +14 -0
  105. package/dist/collection/components/vega-rich-text-editor/dto/blocks/list-block.js +14 -0
  106. package/dist/collection/components/vega-rich-text-editor/dto/blocks/list-item-block.js +20 -0
  107. package/dist/collection/components/vega-rich-text-editor/dto/blocks/text-block.js +14 -0
  108. package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +47 -2
  109. package/dist/collection/components/vega-rich-text-editor/dto/editor-state.js +36 -0
  110. package/dist/collection/components/vega-rich-text-editor/dto/nodes/image-node.js +6 -0
  111. package/dist/collection/components/vega-rich-text-editor/dto/nodes/node.abstract.js +8 -0
  112. package/dist/collection/components/vega-rich-text-editor/dto/nodes/text-node.js +7 -1
  113. package/dist/collection/components/vega-rich-text-editor/dto/range.js +8 -0
  114. package/dist/collection/components/vega-rich-text-editor/dto/renderers/blocks/image-block-renderer.js +1 -1
  115. package/dist/collection/components/vega-rich-text-editor/dto/renderers/blocks/list-block-renderer.js +1 -1
  116. package/dist/collection/components/vega-rich-text-editor/dto/renderers/blocks/list-item-block-renderer.js +1 -1
  117. package/dist/collection/components/vega-rich-text-editor/dto/renderers/blocks/text-block-renderer.js +1 -1
  118. package/dist/collection/components/vega-rich-text-editor/dto/renderers/nodes/image-node-renderer.js +1 -1
  119. package/dist/collection/components/vega-rich-text-editor/dto/renderers/nodes/text-node-renderer.js +2 -2
  120. package/dist/collection/components/vega-rich-text-editor/dto/selection-state.js +17 -0
  121. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/block-to-rte-block-strategy.abstract.js +2 -2
  122. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/element-to-dto-strategy.abstract.js +3 -2
  123. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/vega-image-to-rte-image-block-strategy.js +18 -15
  124. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/history-controller.js +137 -0
  125. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/selection-controller.js +54 -15
  126. package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/value-controller.js +13 -1
  127. package/dist/collection/components/vega-rich-text-editor/test/dto/content-state.test.js +116 -0
  128. package/dist/collection/components/vega-rich-text-editor/test/dto/nodes/text-node.test.js +12 -0
  129. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-editor.js +5 -0
  130. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-image-editor/slimmers/renderers/vega-rich-text-image-editor-renderer.js +4 -0
  131. package/dist/collection/components/vega-rich-text-editor/vega-rich-text-image-editor/vega-rich-text-image-editor.js +2 -1
  132. package/dist/collection/components/vega-stepper/vega-stepper.js +2 -2
  133. package/dist/collection/helpers/event-manager/event-id/vega-internal-event-id.js +2 -0
  134. package/dist/collection/helpers/keyboard/keyboard-manager.js +25 -5
  135. package/dist/collection/helpers/keyboard/test/keyboard-manager.test.js +204 -105
  136. package/dist/collection/helpers/validator/rules/max-number-rule.js +1 -1
  137. package/dist/collection/helpers/validator/rules/min-number-rule.js +1 -1
  138. package/dist/collection/helpers/validator/test/rules/max-number-rule.test.js +2 -2
  139. package/dist/collection/helpers/validator/test/rules/min-number-rule.test.js +2 -2
  140. package/dist/esm/{app-globals-53b6125a.js → app-globals-1bb57f5e.js} +3 -3
  141. package/dist/esm/{content-state-7437e069.js → content-state-6dba6625.js} +220 -4
  142. package/dist/esm/{design-token-fb43f78a.js → design-token-070b7326.js} +1 -1
  143. package/dist/esm/{element-appender-slimmer-0a0b20e9.js → element-appender-slimmer-d196dd21.js} +2 -2
  144. package/dist/esm/{form-field-controller-slimmer-2978abd4.js → form-field-controller-slimmer-e7dc3db1.js} +2 -2
  145. package/dist/esm/{image-annotation-action-51248df9.js → image-annotation-action-0b661259.js} +1 -1
  146. package/dist/esm/{index-96374234.js → index-4aa167d6.js} +1 -1
  147. package/dist/esm/index.js +6 -6
  148. package/dist/esm/{inject-keyboard-manager-ab0bfb8b.js → inject-keyboard-manager-f513be4a.js} +1 -1
  149. package/dist/esm/{keyboard-manager-8c4ef91b.js → keyboard-manager-262be5ce.js} +25 -5
  150. package/dist/esm/{keyboard-manager-slimmer-6f5cb52a.js → keyboard-manager-slimmer-42bf9773.js} +1 -1
  151. package/dist/esm/loader.js +5 -5
  152. package/dist/esm/{min-number-rule-a6082418.js → min-number-rule-86421853.js} +2 -2
  153. package/dist/esm/{public-rules-cfc196c9.js → public-rules-f9aaa527.js} +3 -3
  154. package/dist/esm/{responsive-format-facade-ae799f25.js → responsive-format-facade-dfed6d94.js} +1 -1
  155. package/dist/esm/{rich-text-editor-required-rule-baf61553.js → rich-text-editor-required-rule-42b796eb.js} +1 -1
  156. package/dist/esm/{string-input-formatter-slimmer-8c7987ac.js → string-input-formatter-slimmer-c61f82d6.js} +2 -2
  157. package/dist/esm/{style-formatter-bf71b8e7.js → style-formatter-788dbacf.js} +1 -1
  158. package/dist/esm/{sub-state-notify-slimmer-2216c7dc.js → sub-state-notify-slimmer-4e3cf09d.js} +1 -1
  159. package/dist/esm/{sub-state-observer-slimmer-da938c88.js → sub-state-observer-slimmer-be7a6ce3.js} +1 -1
  160. package/dist/esm/vega-accordion.entry.js +4 -4
  161. package/dist/esm/vega-app-header-button.entry.js +4 -4
  162. package/dist/esm/vega-box.entry.js +5 -5
  163. package/dist/esm/vega-button-circle.entry.js +4 -4
  164. package/dist/esm/vega-button-group_2.entry.js +3 -3
  165. package/dist/esm/vega-button.entry.js +3 -3
  166. package/dist/esm/vega-calendar_3.entry.js +3 -3
  167. package/dist/esm/vega-card.entry.js +4 -4
  168. package/dist/esm/vega-carousel.entry.js +3 -3
  169. package/dist/esm/vega-checkbox_2.entry.js +3 -3
  170. package/dist/esm/vega-chip.entry.js +4 -4
  171. package/dist/esm/vega-color-picker.entry.js +3 -3
  172. package/dist/esm/vega-combo-box.entry.js +5 -5
  173. package/dist/esm/vega-date-picker_2.entry.js +10 -10
  174. package/dist/esm/vega-dialog_2.entry.js +4 -4
  175. package/dist/esm/vega-divider.entry.js +4 -4
  176. package/dist/esm/vega-dropdown_5.entry.js +8 -8
  177. package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
  178. package/dist/esm/vega-file-uploader.entry.js +3 -3
  179. package/dist/esm/vega-flag-icon.entry.js +4 -4
  180. package/dist/esm/vega-flex.entry.js +5 -5
  181. package/dist/esm/vega-font.entry.js +4 -4
  182. package/dist/esm/vega-form.entry.js +4 -4
  183. package/dist/esm/vega-grid.entry.js +4 -4
  184. package/dist/esm/vega-icon.entry.js +4 -4
  185. package/dist/esm/vega-image-uploader.entry.js +16 -7
  186. package/dist/esm/vega-input-credit-card.entry.js +3 -3
  187. package/dist/esm/vega-input-numeric.entry.js +11 -8
  188. package/dist/esm/vega-input-phone-number.entry.js +3 -3
  189. package/dist/esm/vega-input-range.entry.js +3 -3
  190. package/dist/esm/vega-input-select.entry.js +5 -5
  191. package/dist/esm/vega-input.entry.js +8 -8
  192. package/dist/esm/{vega-internal-event-id-7d1ff289.js → vega-internal-event-id-85ad403f.js} +3 -1
  193. package/dist/esm/vega-left-nav_5.entry.js +447 -194
  194. package/dist/esm/vega-loader-wrapper_2.entry.js +3 -3
  195. package/dist/esm/vega-pagination-page-selector-mobile.entry.js +1 -1
  196. package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +1 -1
  197. package/dist/esm/vega-pagination.entry.js +3 -3
  198. package/dist/esm/vega-popover_2.entry.js +11 -11
  199. package/dist/esm/vega-radio_2.entry.js +8 -5
  200. package/dist/esm/vega-rich-text-content.entry.js +12 -12
  201. package/dist/esm/vega-rich-text-editor_4.entry.js +448 -192
  202. package/dist/esm/vega-selection-chip_2.entry.js +6 -6
  203. package/dist/esm/vega-selection-tile_2.entry.js +4 -4
  204. package/dist/esm/vega-sidenav_3.entry.js +5 -5
  205. package/dist/esm/vega-signature-capture.entry.js +6 -6
  206. package/dist/esm/vega-stepper.entry.js +6 -6
  207. package/dist/esm/vega-table_8.entry.js +5 -5
  208. package/dist/esm/vega-textarea.entry.js +3 -3
  209. package/dist/esm/vega-time-picker_2.entry.js +8 -8
  210. package/dist/esm/vega-toggle-switch.entry.js +3 -3
  211. package/dist/esm/vega-tooltip_2.entry.js +11 -11
  212. package/dist/esm/vega.js +5 -5
  213. package/dist/types/components/vega-image-uploader/slimmers/renderers/vega-image-uploader-actions-renderer.d.ts +1 -0
  214. package/dist/types/components/vega-image-uploader/vega-image-uploader.d.ts +3 -0
  215. package/dist/types/components/vega-input/vega-input.d.ts +2 -2
  216. package/dist/types/components/vega-nav/interface.d.ts +11 -0
  217. package/dist/types/components/vega-nav/slimmers/vega-left-nav-group-hierarchy-controller.d.ts +15 -0
  218. package/dist/types/components/vega-nav/vega-left-nav/test/vega-left-nav-mock-data.d.ts +4 -0
  219. package/dist/types/components/vega-nav/vega-left-nav/vega-left-nav.d.ts +21 -4
  220. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-initialize-selected-controller.d.ts +20 -0
  221. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-link-click-controller.d.ts +25 -0
  222. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-open-state-controller.d.ts +27 -0
  223. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-other-groups-click-controller.d.ts +17 -0
  224. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/renderers/vega-left-nav-group-renderer.d.ts +2 -1
  225. package/dist/types/components/vega-nav/vega-left-nav-group/vega-left-nav-group.d.ts +12 -5
  226. package/dist/types/components/vega-nav/vega-left-nav-link/slimmers/controllers/vega-left-nav-link-controller.d.ts +5 -0
  227. package/dist/types/components/vega-nav/vega-left-nav-link/slimmers/renderers/vega-left-nav-link-renderer.d.ts +2 -0
  228. package/dist/types/components/vega-nav/vega-left-nav-link/vega-left-nav-link.d.ts +2 -0
  229. package/dist/types/components/vega-rich-text-editor/dto/annotations/block-annotation.abstract.d.ts +1 -0
  230. package/dist/types/components/vega-rich-text-editor/dto/annotations/bold-annotation.d.ts +4 -0
  231. package/dist/types/components/vega-rich-text-editor/dto/annotations/code-annotation.d.ts +4 -0
  232. package/dist/types/components/vega-rich-text-editor/dto/annotations/horizontal-alignment-annotation.d.ts +4 -0
  233. package/dist/types/components/vega-rich-text-editor/dto/annotations/image-annotation.d.ts +4 -0
  234. package/dist/types/components/vega-rich-text-editor/dto/annotations/indent-annotation.d.ts +4 -0
  235. package/dist/types/components/vega-rich-text-editor/dto/annotations/italic-annotation.d.ts +4 -0
  236. package/dist/types/components/vega-rich-text-editor/dto/annotations/link-annotation.d.ts +4 -0
  237. package/dist/types/components/vega-rich-text-editor/dto/annotations/link-group-annotation.d.ts +1 -0
  238. package/dist/types/components/vega-rich-text-editor/dto/annotations/node-annotation.abstract.d.ts +1 -0
  239. package/dist/types/components/vega-rich-text-editor/dto/annotations/selection-range-annotation.d.ts +6 -0
  240. package/dist/types/components/vega-rich-text-editor/dto/annotations/strikethrough-annotation.d.ts +4 -0
  241. package/dist/types/components/vega-rich-text-editor/dto/annotations/text-color-annotation.d.ts +4 -0
  242. package/dist/types/components/vega-rich-text-editor/dto/annotations/text-style-annotation.d.ts +4 -0
  243. package/dist/types/components/vega-rich-text-editor/dto/annotations/underline-annotation.d.ts +4 -0
  244. package/dist/types/components/vega-rich-text-editor/dto/blocks/block.abstract.d.ts +9 -1
  245. package/dist/types/components/vega-rich-text-editor/dto/blocks/image-block.d.ts +4 -0
  246. package/dist/types/components/vega-rich-text-editor/dto/blocks/list-block.d.ts +4 -0
  247. package/dist/types/components/vega-rich-text-editor/dto/blocks/list-item-block.d.ts +4 -0
  248. package/dist/types/components/vega-rich-text-editor/dto/blocks/text-block.d.ts +4 -0
  249. package/dist/types/components/vega-rich-text-editor/dto/content-state.d.ts +19 -1
  250. package/dist/types/components/vega-rich-text-editor/dto/editor-state.d.ts +20 -0
  251. package/dist/types/components/vega-rich-text-editor/dto/nodes/image-node.d.ts +4 -0
  252. package/dist/types/components/vega-rich-text-editor/dto/nodes/node.abstract.d.ts +9 -1
  253. package/dist/types/components/vega-rich-text-editor/dto/nodes/text-node.d.ts +4 -0
  254. package/dist/types/components/vega-rich-text-editor/dto/range.d.ts +6 -0
  255. package/dist/types/components/vega-rich-text-editor/dto/selection-state.d.ts +14 -0
  256. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/helper/element-to-dto-strategy/element-to-dto-strategy.abstract.d.ts +2 -2
  257. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/history-controller.d.ts +54 -0
  258. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/selection-controller.d.ts +14 -1
  259. package/dist/types/components/vega-rich-text-editor/slimmers/controllers/value-controller.d.ts +4 -1
  260. package/dist/types/components/vega-rich-text-editor/vega-rich-text-editor.d.ts +2 -0
  261. package/dist/types/components.d.ts +13 -11
  262. package/dist/types/helpers/event-manager/event-id/vega-internal-event-id.d.ts +2 -0
  263. package/dist/types/helpers/keyboard/keyboard-manager.d.ts +11 -1
  264. package/dist/types/types/components.type.d.ts +1 -0
  265. package/dist/types/types/ui.type.d.ts +1 -1
  266. package/dist/vega/index.esm.js +1 -1
  267. package/dist/vega/{p-2c1c88c0.entry.js → p-024cccab.entry.js} +1 -1
  268. package/dist/vega/{p-4b1a7d31.entry.js → p-07d1c3e1.entry.js} +1 -1
  269. package/dist/vega/{p-96410d71.entry.js → p-09c13382.entry.js} +1 -1
  270. package/dist/vega/{p-343b4522.entry.js → p-09f7f841.entry.js} +1 -1
  271. package/dist/vega/{p-50a076d0.entry.js → p-0a18f5f6.entry.js} +1 -1
  272. package/dist/vega/{p-b9f48611.js → p-0d355793.js} +1 -1
  273. package/dist/vega/{p-b64d5c3a.entry.js → p-10f1429e.entry.js} +1 -1
  274. package/dist/vega/p-1b3f492f.entry.js +1 -0
  275. package/dist/vega/{p-b4dfa967.entry.js → p-1d0cf3ae.entry.js} +1 -1
  276. package/dist/vega/{p-4b541ce8.entry.js → p-2198de3e.entry.js} +1 -1
  277. package/dist/vega/{p-b06e5916.entry.js → p-2491d18f.entry.js} +1 -1
  278. package/dist/vega/{p-0073c3de.entry.js → p-24e0cdcc.entry.js} +1 -1
  279. package/dist/vega/{p-1c08e94a.entry.js → p-27e3825f.entry.js} +1 -1
  280. package/dist/vega/{p-b6caa1e2.entry.js → p-292b421a.entry.js} +1 -1
  281. package/dist/vega/{p-8f80b321.entry.js → p-2ecae9fe.entry.js} +1 -1
  282. package/dist/vega/{p-410755ca.entry.js → p-2fadef27.entry.js} +1 -1
  283. package/dist/vega/{p-d6620b42.entry.js → p-31ec679b.entry.js} +1 -1
  284. package/dist/vega/{p-d6d9c300.entry.js → p-32c68611.entry.js} +1 -1
  285. package/dist/vega/{p-bab6ca81.js → p-32ca74b1.js} +1 -1
  286. package/dist/vega/{p-f9b07b5e.entry.js → p-353d32c0.entry.js} +1 -1
  287. package/dist/vega/{p-aa109e80.entry.js → p-371cc8e8.entry.js} +1 -1
  288. package/dist/vega/{p-c86a4896.entry.js → p-38fa38dc.entry.js} +1 -1
  289. package/dist/vega/{p-e1a06741.entry.js → p-472727a4.entry.js} +1 -1
  290. package/dist/vega/{p-59e9f57a.js → p-48b7f20d.js} +1 -1
  291. package/dist/vega/p-4e68dfd9.js +1 -0
  292. package/dist/vega/{p-8c32ff75.entry.js → p-4fa94b35.entry.js} +1 -1
  293. package/dist/vega/{p-1e2886b5.js → p-50e80afa.js} +1 -1
  294. package/dist/vega/p-56a0b13d.js +1 -0
  295. package/dist/vega/{p-a1bdf9a0.entry.js → p-575ca599.entry.js} +1 -1
  296. package/dist/vega/{p-bcb43c54.entry.js → p-57e813f2.entry.js} +1 -1
  297. package/dist/vega/{p-324dd09a.entry.js → p-5a8f129f.entry.js} +1 -1
  298. package/dist/vega/p-5c1eedc5.js +1 -0
  299. package/dist/vega/{p-b65de502.entry.js → p-5c3da7ed.entry.js} +1 -1
  300. package/dist/vega/{p-b2643e88.js → p-5e3a15a1.js} +1 -1
  301. package/dist/vega/p-5f377954.js +1 -1
  302. package/dist/vega/{p-611282a7.entry.js → p-65a76f19.entry.js} +1 -1
  303. package/dist/vega/{p-69cc3fa2.js → p-6cabdb36.js} +1 -1
  304. package/dist/vega/{p-79cc1f41.entry.js → p-6cc32ffa.entry.js} +1 -1
  305. package/dist/vega/{p-d7642125.js → p-72ecfd40.js} +1 -1
  306. package/dist/vega/{p-0b56725e.entry.js → p-7581d242.entry.js} +1 -1
  307. package/dist/vega/{p-213752bd.js → p-75c68f51.js} +1 -1
  308. package/dist/vega/p-7db32dc0.entry.js +1 -0
  309. package/dist/vega/{p-f0bc8f6d.js → p-7f6702f7.js} +1 -1
  310. package/dist/vega/{p-df44a712.entry.js → p-84298e28.entry.js} +1 -1
  311. package/dist/vega/p-8bc4c015.entry.js +1 -0
  312. package/dist/vega/{p-e59ff7d1.entry.js → p-971f7d3c.entry.js} +1 -1
  313. package/dist/vega/{p-1b731247.entry.js → p-9dba10f7.entry.js} +1 -1
  314. package/dist/vega/p-b1f9fca8.entry.js +1 -0
  315. package/dist/vega/{p-7594875a.entry.js → p-b3e1dc86.entry.js} +1 -1
  316. package/dist/vega/{p-d6c37085.entry.js → p-baca6dfc.entry.js} +1 -1
  317. package/dist/vega/p-bf1894ec.js +1 -0
  318. package/dist/vega/p-c5f8b3a3.entry.js +1 -0
  319. package/dist/vega/p-c6a3fe8a.entry.js +1 -0
  320. package/dist/vega/p-c754b32c.js +1 -0
  321. package/dist/vega/p-cc43a4ca.js +1 -0
  322. package/dist/vega/{p-0523efe8.entry.js → p-ccdd49be.entry.js} +1 -1
  323. package/dist/vega/p-cd205d96.js +1 -0
  324. package/dist/vega/{p-d4a61b1d.entry.js → p-d033ed44.entry.js} +1 -1
  325. package/dist/vega/{p-e5695801.entry.js → p-d6591d70.entry.js} +1 -1
  326. package/dist/vega/{p-80c86d79.js → p-d7937711.js} +1 -1
  327. package/dist/vega/{p-7bc3a42b.js → p-db4112af.js} +1 -1
  328. package/dist/vega/{p-c706de06.entry.js → p-dd33bc71.entry.js} +1 -1
  329. package/dist/vega/{p-4f7f93ef.entry.js → p-e8f16f1d.entry.js} +1 -1
  330. package/dist/vega/{p-01b4d6ba.entry.js → p-ed6cc75b.entry.js} +1 -1
  331. package/dist/vega/p-f4d3387c.entry.js +1 -0
  332. package/dist/vega/{p-bd5ca7cc.entry.js → p-f5b19d4f.entry.js} +1 -1
  333. package/dist/vega/{p-4f54ba1f.entry.js → p-f7423232.entry.js} +1 -1
  334. package/dist/vega/p-fba4bae5.js +1 -0
  335. package/dist/vega/p-fda0c179.entry.js +1 -0
  336. package/dist/vega/p-ff41dc6a.entry.js +1 -0
  337. package/dist/vega/vega.esm.js +1 -1
  338. package/package.json +1 -1
  339. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-controller.js +0 -30
  340. package/dist/collection/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-sibling-observer-controller.js +0 -48
  341. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-controller.d.ts +0 -11
  342. package/dist/types/components/vega-nav/vega-left-nav-group/slimmers/controllers/vega-left-nav-group-sibling-observer-controller.d.ts +0 -18
  343. package/dist/vega/p-08679cd9.entry.js +0 -1
  344. package/dist/vega/p-12d60f5f.js +0 -1
  345. package/dist/vega/p-214aa52e.js +0 -1
  346. package/dist/vega/p-2863aa51.entry.js +0 -1
  347. package/dist/vega/p-2e65e175.js +0 -1
  348. package/dist/vega/p-31de5cb4.entry.js +0 -1
  349. package/dist/vega/p-3d3cd394.js +0 -1
  350. package/dist/vega/p-3e285c35.js +0 -1
  351. package/dist/vega/p-8af3fc79.entry.js +0 -1
  352. package/dist/vega/p-8ee31f00.entry.js +0 -1
  353. package/dist/vega/p-952913fc.entry.js +0 -1
  354. package/dist/vega/p-ab26cad6.js +0 -1
  355. package/dist/vega/p-b07add9c.entry.js +0 -1
  356. package/dist/vega/p-b9051ad2.js +0 -1
  357. package/dist/vega/p-c2321aa8.entry.js +0 -1
  358. package/dist/vega/p-ceb9f5aa.entry.js +0 -1
  359. package/dist/vega/p-f2373487.js +0 -1
@@ -38,7 +38,7 @@ class RTEImageNodeRenderer extends RTENodeRenderer {
38
38
  render(node, renderContext) {
39
39
  const imageAnnotation = node.getAnnotationByType(NodeAnnotationTypeEnum.IMAGE);
40
40
  const { size, alt } = imageAnnotation || new ImageAnnotation('md', '');
41
- return renderContext.editable ? (h("vega-rich-text-image-editor", { style: super.getStyles(node), size: size, alt: alt, ref: (ref) => {
41
+ return renderContext.editable ? (h("vega-rich-text-image-editor", { key: node.id, style: super.getStyles(node), size: size, alt: alt, ref: (ref) => {
42
42
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaChange, (e) => this.handleChange(e, node));
43
43
  } }, this.renderImage(alt, node, renderContext))) : (this.renderImage(alt, node, renderContext));
44
44
  }
@@ -7,9 +7,9 @@ class RTETextNodeRenderer extends RTENodeRenderer {
7
7
  render(node) {
8
8
  const codeAnnotation = node.annotationMap.get(NodeAnnotationTypeEnum.CODE);
9
9
  if (codeAnnotation === null || codeAnnotation === void 0 ? void 0 : codeAnnotation.code) {
10
- return (h("code", { style: super.getStyles(node), class: super.getClasses(node), ref: (ref) => this.registerRef(ref, node) }, node.text || ZERO_WIDTH_SPACE));
10
+ return (h("code", { key: node.id, style: super.getStyles(node), class: super.getClasses(node), ref: (ref) => this.registerRef(ref, node) }, node.text || ZERO_WIDTH_SPACE));
11
11
  }
12
- return (h("span", { style: super.getStyles(node), class: super.getClasses(node), ref: (ref) => this.registerRef(ref, node) }, node.text || ZERO_WIDTH_SPACE));
12
+ return (h("span", { key: node.id, style: super.getStyles(node), class: super.getClasses(node), ref: (ref) => this.registerRef(ref, node) }, node.text || ZERO_WIDTH_SPACE));
13
13
  }
14
14
  registerRef(ref, node) {
15
15
  super.registerRef(ref, node);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Represents the state of the selection in the RTE.
3
+ */
4
+ export class RTESelectionState {
5
+ constructor(range) {
6
+ this.range = range;
7
+ }
8
+ /**
9
+ * Clones the selection state, updating the range nodes based on the provided content.
10
+ *
11
+ * @returns {RTESelectionState} A new instance of RTESelectionState with the updated range.
12
+ */
13
+ clone() {
14
+ const newRange = this.range.clone();
15
+ return new RTESelectionState(newRange);
16
+ }
17
+ }
@@ -34,7 +34,7 @@ export class BlockToRTEBlockStrategyAbstract extends ElementToDTOStrategy {
34
34
  childNodes.push({
35
35
  id: generateUUID(),
36
36
  type: 'text',
37
- text: child.textContent,
37
+ text: String(child.textContent),
38
38
  annotations: annotations,
39
39
  });
40
40
  }
@@ -67,7 +67,7 @@ export class BlockToRTEBlockStrategyAbstract extends ElementToDTOStrategy {
67
67
  * @returns {boolean} - boolean.
68
68
  */
69
69
  isInvalidTextNode(element) {
70
- if (element.nodeValue.includes('\t')) {
70
+ if (element.nodeValue && element.nodeValue.includes('\t')) {
71
71
  const value = element.nodeValue.replace(/\n|\t/gm, '');
72
72
  if (value.length === 0)
73
73
  return true;
@@ -1,3 +1,4 @@
1
+ import { isNonNullable } from '../../../../../../types/type-guard';
1
2
  /**
2
3
  * Abstract class to define strategies for processing HTML elements
3
4
  */
@@ -23,14 +24,14 @@ export class ElementToDTOStrategyOutput {
23
24
  /**
24
25
  * Transform current output and children output to DTO
25
26
  *
26
- * @returns {RTEContentBlock} - DTO.
27
+ * @returns {Nullable<RTEContentBlock>} - DTO.
27
28
  */
28
29
  toDto() {
29
30
  const currentBlock = this.currentStrategy.handle(this.currentElements);
30
31
  if (this.childrenOutput.length > 0 && currentBlock) {
31
32
  this.currentStrategy.appendChildBlocks(currentBlock, this.childrenOutput
32
33
  .map((childOutput) => childOutput.toDto())
33
- .filter(Boolean));
34
+ .filter(isNonNullable));
34
35
  }
35
36
  return currentBlock;
36
37
  }
@@ -1,6 +1,7 @@
1
1
  import { generateUUID } from '../../../../../../utils/misc';
2
2
  import { RTEImageBlock } from '../../../../dto/blocks/image-block';
3
3
  import { BlockToRTEBlockStrategyAbstract } from './block-to-rte-block-strategy.abstract';
4
+ import { isNonNullable } from '../../../../../../types/type-guard';
4
5
  /** Transform vega-rich-text-image-editor element to image block DTO */
5
6
  export class VegaImageToRTEImageBlockStrategy extends BlockToRTEBlockStrategyAbstract {
6
7
  /**
@@ -22,22 +23,24 @@ export class VegaImageToRTEImageBlockStrategy extends BlockToRTEBlockStrategyAbs
22
23
  handle(elementsArray) {
23
24
  const element = elementsArray[0];
24
25
  const image = element.querySelector('img');
25
- return RTEImageBlock.from({
26
- id: generateUUID(),
27
- type: 'image',
28
- nodes: [
29
- {
30
- id: generateUUID(),
31
- type: 'image',
32
- url: image.src,
33
- annotations: {
34
- size: element.size || 'md',
35
- alt: element.alt,
26
+ if (isNonNullable(image)) {
27
+ return RTEImageBlock.from({
28
+ id: generateUUID(),
29
+ type: 'image',
30
+ nodes: [
31
+ {
32
+ id: generateUUID(),
33
+ type: 'image',
34
+ url: image.src,
35
+ annotations: {
36
+ size: element.size || 'md',
37
+ alt: element.alt,
38
+ },
36
39
  },
37
- },
38
- ],
39
- annotations: this.generateBlockAnnotations(element),
40
- });
40
+ ],
41
+ annotations: this.generateBlockAnnotations(element),
42
+ });
43
+ }
41
44
  }
42
45
  /* istanbul ignore next */
43
46
  /**
@@ -0,0 +1,137 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { MapToComponentField, MapToComponentMethod } from 'vega-slimmer/core';
8
+ import { RTEEditorState } from '../../dto/editor-state';
9
+ import { debounce } from '../../../../utils/timer';
10
+ import { RTESelectionState } from '../../dto/selection-state';
11
+ import { KeyboardManagerSlimmer } from '../../../../helpers/slimmers/keyboard-manager-slimmer';
12
+ /**
13
+ * History controller for RTE.
14
+ */
15
+ export class HistoryController extends KeyboardManagerSlimmer {
16
+ constructor() {
17
+ super(() => this.getKeyboardShortcutOptions.call(this));
18
+ this.redoStack = [];
19
+ this.undoStack = [];
20
+ this.registerHistoryDelay = 300;
21
+ this.registerHistoryDebounced = debounce(() => {
22
+ this.internalRegisterHistory(new RTEEditorState(this.value, new RTESelectionState(this.selectionController.getCurrentRange())));
23
+ }, this.registerHistoryDelay, this);
24
+ }
25
+ /**
26
+ * Component lifecycle - [componentDidLoad]
27
+ */
28
+ registerInitState() {
29
+ if (this.value) {
30
+ this.internalRegisterHistory(new RTEEditorState(this.value, new RTESelectionState(this.selectionController.getCurrentRange())));
31
+ }
32
+ }
33
+ /**
34
+ * Restores the previous state from the undo stack.
35
+ */
36
+ async undo() {
37
+ if (this.undoStack.length > 0) {
38
+ const clonedState = this.undoStack.pop().clone();
39
+ this.redoStack.push(clonedState);
40
+ const prev = this.undoStack[this.undoStack.length - 1];
41
+ if (prev) {
42
+ await this.restoreState(prev.clone());
43
+ }
44
+ }
45
+ }
46
+ /**
47
+ * Restores the next state from the redo stack.
48
+ */
49
+ async redo() {
50
+ if (this.redoStack.length > 0) {
51
+ const clonedState = this.redoStack.pop().clone();
52
+ this.undoStack.push(clonedState);
53
+ await this.restoreState(clonedState);
54
+ }
55
+ }
56
+ /**
57
+ * Registers history based on the editor state.
58
+ *
59
+ * @param {RTEEditorState} editorState - The state to record in history.
60
+ */
61
+ registerHistory(editorState) {
62
+ // TODO: feat: add a `force` option to register history immediately when needed.
63
+ this.registerHistoryDebounced(editorState);
64
+ }
65
+ /**
66
+ * Internal function to register history immediately.
67
+ *
68
+ * @param {RTEEditorState} state - The state to record in history.
69
+ */
70
+ internalRegisterHistory(state) {
71
+ this.redoStack = []; // clear redo stack when new action happens.
72
+ this.undoStack.push(state);
73
+ }
74
+ /**
75
+ * Restores the editor state based on the provided history state.
76
+ *
77
+ * @param {RTEEditorState} state - The state to restore to.
78
+ */
79
+ async restoreState(state) {
80
+ const { content, selection } = state;
81
+ this.selectionController.setSelectionState(selection);
82
+ await this.valueController.flushChanges(content, false);
83
+ }
84
+ /**
85
+ * Returns the keyboard shortcut options for undo/redo functionality.
86
+ *
87
+ * @returns {KeyboardEventListener[]} - An array of keyboard shortcut options.
88
+ */
89
+ getKeyboardShortcutOptions() {
90
+ const baseOption = {
91
+ keyCode: 'KeyZ',
92
+ activeElementInScope: [this.vegaRichTextEditorRenderer.getRTEEditableElementRef()],
93
+ eventName: 'keydown',
94
+ modifierPressed: true,
95
+ };
96
+ return [
97
+ Object.assign(Object.assign({}, baseOption), { shiftKey: false,
98
+ /**
99
+ * Callback function for the undo action.
100
+ *
101
+ * @param {KeyboardEvent} e - The keyboard event triggered by the user.
102
+ */
103
+ callback: (e) => {
104
+ e.preventDefault();
105
+ void this.undo();
106
+ } }),
107
+ Object.assign(Object.assign({}, baseOption), { shiftKey: true,
108
+ /**
109
+ * Callback function for the redo action.
110
+ *
111
+ * @param {KeyboardEvent} e - The keyboard event triggered by the user.
112
+ */
113
+ callback: (e) => {
114
+ e.preventDefault();
115
+ void this.redo();
116
+ } }),
117
+ ];
118
+ }
119
+ }
120
+ __decorate([
121
+ MapToComponentField()
122
+ ], HistoryController.prototype, "host", void 0);
123
+ __decorate([
124
+ MapToComponentField()
125
+ ], HistoryController.prototype, "vegaRichTextEditorRenderer", void 0);
126
+ __decorate([
127
+ MapToComponentField()
128
+ ], HistoryController.prototype, "valueController", void 0);
129
+ __decorate([
130
+ MapToComponentField()
131
+ ], HistoryController.prototype, "value", void 0);
132
+ __decorate([
133
+ MapToComponentField()
134
+ ], HistoryController.prototype, "selectionController", void 0);
135
+ __decorate([
136
+ MapToComponentMethod('componentDidLoad')
137
+ ], HistoryController.prototype, "registerInitState", null);
@@ -17,8 +17,10 @@ import ChangeManager from '../../../../helpers/change-manager/change-manager';
17
17
  import domNodeSubjectFactory from '../../../../helpers/change-manager/subject/dom-node-subject/dom-node-subject-factory';
18
18
  import { VegaInternalRichTextEditorSelectionRangeChange } from '../../../../helpers/event-manager/event-id/vega-internal-event-id';
19
19
  import { Observer } from '../../../../helpers/change-manager/observer/observer';
20
+ import { RTETextNode } from '../../dto/nodes/text-node';
20
21
  import { ZERO_WIDTH_SPACE } from '../../constants/constant';
21
22
  import { RTERange } from '../../dto/range';
23
+ import { RTESelectionState } from '../../dto/selection-state';
22
24
  /**
23
25
  * The text selection controller
24
26
  */
@@ -28,7 +30,7 @@ export class SelectionController extends VegaSlimmer {
28
30
  this.currentRange = new RTERange();
29
31
  this.updateCaretPositionTaskQueue = new SynchronizeTaskQueue(1);
30
32
  this.handleSelectionWithDebounce = debounce(this.handleSelectionChange, SelectionController.SELECTION_CHANGE_DEBOUNCE_TIME, this);
31
- this.selectedNodes = [];
33
+ this.pendingRestoreSelectionNodes = [];
32
34
  /**
33
35
  * Sets the next selection state with specified start and end nodes, offsets, and a timestamp.
34
36
  *
@@ -68,6 +70,7 @@ export class SelectionController extends VegaSlimmer {
68
70
  * Watches the internal value of the editor
69
71
  */
70
72
  watchValueUpdate() {
73
+ this.prepareRestoreSelectionState();
71
74
  this.restoreSelection();
72
75
  }
73
76
  /**
@@ -102,6 +105,14 @@ export class SelectionController extends VegaSlimmer {
102
105
  getSelectedBlocks() {
103
106
  return Array.from(this.selectionMap.keys());
104
107
  }
108
+ /**
109
+ * Set the selection state
110
+ *
111
+ * @param {RTESelectionState} state - The selection state to set
112
+ */
113
+ setSelectionState(state) {
114
+ this.selectionState = state;
115
+ }
105
116
  /**
106
117
  * Sets the next selection state with specified start and end nodes, offsets, push the update task to a queue
107
118
  *
@@ -159,23 +170,15 @@ export class SelectionController extends VegaSlimmer {
159
170
  * Restore the selection to the current selected nodes
160
171
  */
161
172
  restoreSelection() {
162
- if (this.selectedNodes.length > 0) {
163
- const startNode = this.selectedNodes[0];
164
- const endNode = this.selectedNodes.length > 1 ? this.selectedNodes[this.selectedNodes.length - 1] : startNode;
165
- if (startNode === endNode && startNode.text.length === 0) {
173
+ if (this.selectionState) {
174
+ const { startNode, endNode, startOffset, endOffset } = this.selectionState.range;
175
+ if (startNode instanceof RTETextNode && startNode === endNode && startNode.text.length === 0) {
166
176
  this.enqueueSelectionRangeFutureState(startNode, ZERO_WIDTH_SPACE.length);
167
177
  }
168
178
  else {
169
- const { startContainer, endContainer, startOffset, endOffset } = this.currentRange;
170
- if (stateEntityRenderingRegistry.getDOMByEntity(startNode) === startContainer.parentElement &&
171
- stateEntityRenderingRegistry.getDOMByEntity(endNode) === endContainer.parentElement) {
172
- this.enqueueSelectionRangeFutureState(startNode, startOffset, endNode, endOffset);
173
- }
174
- else {
175
- this.enqueueSelectionRangeFutureState(startNode, 0, endNode, endNode.text.length);
176
- }
179
+ this.enqueueSelectionRangeFutureState(startNode, startOffset, endNode, endOffset);
177
180
  }
178
- this.selectedNodes = [];
181
+ this.selectionState = null;
179
182
  }
180
183
  }
181
184
  /**
@@ -263,10 +266,43 @@ export class SelectionController extends VegaSlimmer {
263
266
  */
264
267
  registerSelectionRangeChangeObserver() {
265
268
  this.selectionRangeChangeObserver = new Observer(this.isAcceptableSelectionRangeChange.bind(this), (payload) => {
266
- this.selectedNodes.push(payload.node);
269
+ this.pendingRestoreSelectionNodes.push(payload.node);
267
270
  });
268
271
  ChangeManager.register(domNodeSubjectFactory.getSubject(this.host, VegaInternalRichTextEditorSelectionRangeChange), this.selectionRangeChangeObserver);
269
272
  }
273
+ /**
274
+ * Prepare the selection state to restore
275
+ */
276
+ prepareRestoreSelectionState() {
277
+ if (this.pendingRestoreSelectionNodes.length > 0) {
278
+ const startNode = this.pendingRestoreSelectionNodes[0];
279
+ const endNode = this.pendingRestoreSelectionNodes.length > 1
280
+ ? this.pendingRestoreSelectionNodes[this.pendingRestoreSelectionNodes.length - 1]
281
+ : startNode;
282
+ const { startOffset, endOffset, endContainer, startContainer } = this.currentRange;
283
+ const nodesInCurrentRange = stateEntityRenderingRegistry.getDOMByEntity(startNode) === startContainer.parentElement &&
284
+ stateEntityRenderingRegistry.getDOMByEntity(endNode) === endContainer.parentElement;
285
+ if (nodesInCurrentRange) {
286
+ this.currentRange = this.currentRange.updateRTERange({
287
+ startNode,
288
+ endNode,
289
+ startOffset,
290
+ endOffset,
291
+ });
292
+ this.selectionState = new RTESelectionState(this.currentRange);
293
+ }
294
+ else {
295
+ this.currentRange = this.currentRange.updateRTERange({
296
+ startNode,
297
+ endNode,
298
+ startOffset: 0,
299
+ endOffset: endNode.text.length,
300
+ });
301
+ this.selectionState = new RTESelectionState(this.currentRange);
302
+ }
303
+ this.pendingRestoreSelectionNodes = [];
304
+ }
305
+ }
270
306
  }
271
307
  SelectionController.SELECTION_CHANGE_DEBOUNCE_TIME = 50;
272
308
  __decorate([
@@ -290,6 +326,9 @@ __decorate([
290
326
  __decorate([
291
327
  MapToComponentField()
292
328
  ], SelectionController.prototype, "insertCompositionTextController", void 0);
329
+ __decorate([
330
+ MapToComponentField()
331
+ ], SelectionController.prototype, "historyController", void 0);
293
332
  __decorate([
294
333
  MapToComponentMethod('connectedCallback')
295
334
  ], SelectionController.prototype, "connectedCallback", null);
@@ -14,6 +14,8 @@ import { Observer } from '../../../../helpers/change-manager/observer/observer';
14
14
  import { debounce } from '../../../../utils/timer';
15
15
  import { VegaRTEContent } from '../../dto/content-state';
16
16
  import { waitForComponentDidRender } from '../../../../helpers/common';
17
+ import { RTEEditorState } from '../../dto/editor-state';
18
+ import { RTESelectionState } from '../../dto/selection-state';
17
19
  /**
18
20
  * The value controller is responsible for updating the value of the rich text editor.
19
21
  */
@@ -64,8 +66,12 @@ export class ValueController extends VegaSlimmer {
64
66
  * Updates the value of the editor and restore the selection.
65
67
  *
66
68
  * @param {VegaRTEContent} newValue The new value to set.
69
+ * @param {boolean} recordHistory - Whether to record the change in history.
67
70
  */
68
- async flushChanges(newValue) {
71
+ async flushChanges(newValue, recordHistory = true) {
72
+ if (recordHistory) {
73
+ this.historyController.registerHistory(new RTEEditorState(newValue, new RTESelectionState(this.selectionController.getCurrentRange())));
74
+ }
69
75
  this.value = newValue.clone();
70
76
  await waitForComponentDidRender(this.host);
71
77
  }
@@ -91,6 +97,12 @@ __decorate([
91
97
  __decorate([
92
98
  MapToComponentField()
93
99
  ], ValueController.prototype, "valueController", void 0);
100
+ __decorate([
101
+ MapToComponentField()
102
+ ], ValueController.prototype, "historyController", void 0);
103
+ __decorate([
104
+ MapToComponentField()
105
+ ], ValueController.prototype, "selectionController", void 0);
94
106
  __decorate([
95
107
  MapToComponentMethod('connectedCallback')
96
108
  ], ValueController.prototype, "connectedCallback", null);
@@ -2,6 +2,8 @@ import { VegaRTEContent } from '../../dto/content-state';
2
2
  import { RTETextBlock } from '../../dto/blocks/text-block';
3
3
  import { RTEImageBlock } from '../../dto/blocks/image-block';
4
4
  import { RTEListBlock } from '../../dto/blocks/list-block';
5
+ import { BlockAnnotationTypeEnum } from '../../dto/annotations/block-annotation.abstract';
6
+ import { NodeAnnotationTypeEnum } from '../../dto/annotations/node-annotation.abstract';
5
7
  describe('content state', () => {
6
8
  it('fromJSON should work as expect', () => {
7
9
  expect(() => VegaRTEContent.fromJSON([
@@ -125,6 +127,43 @@ describe('content state', () => {
125
127
  expect(clonedContentState).not.toBe(contentState);
126
128
  expect(clonedContentState).toEqual(contentState);
127
129
  });
130
+ it('should deep clone content state', () => {
131
+ const contentState = VegaRTEContent.fromJSON([
132
+ {
133
+ id: '1',
134
+ type: 'paragraph',
135
+ annotations: {
136
+ textStyle: 'paragraph',
137
+ },
138
+ nodes: [
139
+ { id: '1-1', type: 'text', text: 'This is a paragraph', annotations: { bold: true } },
140
+ ],
141
+ },
142
+ ]);
143
+ const clonedContentState = contentState.clone(true);
144
+ expect(clonedContentState).not.toBe(contentState);
145
+ expect(clonedContentState).toEqual(contentState);
146
+ const block = contentState.blocks[0];
147
+ const clonedBlock = clonedContentState.blocks[0];
148
+ expect(clonedBlock).toEqual(block);
149
+ expect(clonedBlock).not.toBe(block);
150
+ const node = block.nodes[0];
151
+ const clonedNode = clonedBlock.nodes[0];
152
+ expect(clonedNode).toEqual(node);
153
+ expect(clonedNode).not.toBe(node);
154
+ const blockAnnotations = block.annotationMap;
155
+ const clonedBlockAnnotations = clonedBlock.annotationMap;
156
+ expect(clonedBlockAnnotations).toEqual(blockAnnotations);
157
+ expect(clonedBlockAnnotations).not.toBe(blockAnnotations);
158
+ expect(clonedBlock.getAnnotationByType(BlockAnnotationTypeEnum.TEXT_STYLE)).toEqual(block.getAnnotationByType(BlockAnnotationTypeEnum.TEXT_STYLE));
159
+ expect(clonedBlock.getAnnotationByType(BlockAnnotationTypeEnum.TEXT_STYLE)).not.toBe(block.getAnnotationByType(BlockAnnotationTypeEnum.TEXT_STYLE));
160
+ const nodeAnnotations = node.annotationMap;
161
+ const clonedNodeAnnotations = clonedNode.annotationMap;
162
+ expect(clonedNodeAnnotations).toEqual(nodeAnnotations);
163
+ expect(clonedNodeAnnotations).not.toBe(nodeAnnotations);
164
+ expect(clonedNode.getAnnotationByType(NodeAnnotationTypeEnum.BOLD)).toEqual(node.getAnnotationByType(NodeAnnotationTypeEnum.BOLD));
165
+ expect(clonedNode.getAnnotationByType(NodeAnnotationTypeEnum.BOLD)).not.toBe(node.getAnnotationByType(NodeAnnotationTypeEnum.BOLD));
166
+ });
128
167
  it('the parent property should set as properly when create VegaRTEContent', () => {
129
168
  const contentState = VegaRTEContent.fromJSON([
130
169
  {
@@ -169,4 +208,81 @@ describe('content state', () => {
169
208
  expect(nestedListBlock.parent).toEqual(listItemBlock);
170
209
  expect(nestedListItemBlock.parent).toEqual(nestedListBlock);
171
210
  });
211
+ describe('findNodeById', () => {
212
+ let content;
213
+ beforeAll(() => {
214
+ content = VegaRTEContent.fromJSON([
215
+ {
216
+ id: '1',
217
+ type: 'paragraph',
218
+ nodes: [
219
+ { id: '1-1', type: 'text', text: 'This ' },
220
+ { id: '1-2', type: 'text', text: 'is a ' },
221
+ { id: '1-3', type: 'text', text: 'paragraph.' },
222
+ ],
223
+ },
224
+ {
225
+ id: '2',
226
+ type: 'image',
227
+ nodes: [{ id: '2-1', type: 'image', url: 'img.png' }],
228
+ },
229
+ {
230
+ id: '3',
231
+ type: 'bullet-list',
232
+ blocks: [
233
+ {
234
+ id: '3-1',
235
+ type: 'list-item',
236
+ nodes: [{ id: '3-1-1', type: 'text', text: 'List item 1' }],
237
+ children: [
238
+ {
239
+ id: '3-2',
240
+ type: 'number-list',
241
+ blocks: [
242
+ {
243
+ id: '3-2-1',
244
+ type: 'list-item',
245
+ nodes: [
246
+ { id: '3-2-1-1', type: 'text', text: 'Nested list item' },
247
+ ],
248
+ },
249
+ ],
250
+ },
251
+ ],
252
+ },
253
+ ],
254
+ },
255
+ ]);
256
+ });
257
+ it('should find the node in text block', () => {
258
+ expect(content.findNodeById('1-2').toJSON()).toEqual({ id: '1-2', type: 'text', text: 'is a ' });
259
+ });
260
+ it('should find the node in image block', () => {
261
+ expect(content.findNodeById('2-1').toJSON()).toEqual({
262
+ id: '2-1',
263
+ type: 'image',
264
+ url: 'img.png',
265
+ annotations: {
266
+ size: 'md',
267
+ },
268
+ });
269
+ });
270
+ it('should find the node in list item', () => {
271
+ expect(content.findNodeById('3-1-1').toJSON()).toEqual({
272
+ id: '3-1-1',
273
+ type: 'text',
274
+ text: 'List item 1',
275
+ });
276
+ });
277
+ it('should find the node in nested list item', () => {
278
+ expect(content.findNodeById('3-2-1-1').toJSON()).toEqual({
279
+ id: '3-2-1-1',
280
+ type: 'text',
281
+ text: 'Nested list item',
282
+ });
283
+ });
284
+ it('should return null for non-existent node', () => {
285
+ expect(content.findNodeById('not-exist')).toBeNull();
286
+ });
287
+ });
172
288
  });
@@ -396,4 +396,16 @@ describe('text node', () => {
396
396
  textNode.apply(new DeleteNodeAnnotationAction(NodeAnnotationTypeEnum.BOLD));
397
397
  expect(textNode.toJSON()).toEqual({ id: '1', type: 'text', text: 'This is a text.' });
398
398
  });
399
+ it('should clone a text node with annotations correctly', () => {
400
+ const textBlock = new RTETextBlock('block-1', 'paragraph');
401
+ const textNode = new RTETextNode('1', 'This is a text.', textBlock);
402
+ textNode.apply(new BoldAnnotationAction(true));
403
+ const clonedNode = textNode.clone();
404
+ expect(textNode).toEqual(clonedNode);
405
+ expect(textNode).not.toBe(clonedNode);
406
+ expect(textNode.annotationMap).toEqual(clonedNode.annotationMap);
407
+ expect(textNode.annotationMap).not.toBe(clonedNode.annotationMap);
408
+ expect(textNode.getAnnotationByType(NodeAnnotationTypeEnum.BOLD)).toEqual(clonedNode.getAnnotationByType(NodeAnnotationTypeEnum.BOLD));
409
+ expect(textNode.getAnnotationByType(NodeAnnotationTypeEnum.BOLD)).not.toBe(clonedNode.getAnnotationByType(NodeAnnotationTypeEnum.BOLD));
410
+ });
399
411
  });
@@ -43,6 +43,7 @@ import { InsertCompositionTextController } from './slimmers/controllers/insert-c
43
43
  import { DeleteSelectedNodesController } from './slimmers/controllers/delete-selected-nodes-controller';
44
44
  import { TranslationSlimmer } from '../../helpers/slimmers/translation';
45
45
  import { VegaInternalThemeManager } from '../../helpers/theme/internal-theme-manager';
46
+ import { HistoryController } from './slimmers/controllers/history-controller';
46
47
  /**
47
48
  * @vegaVersion 2.34.0
48
49
  */
@@ -95,6 +96,7 @@ export class VegaRichTextEditor {
95
96
  this.changeEventPreventSlimmer = new ChildNodesEventPreventSlimmer([VegaChange], () => this.vegaRichTextEditorRenderer.getRichTextWrapperRef());
96
97
  this.textNodeColorController = new TextNodeColorController();
97
98
  this.deleteSelectedNodesController = new DeleteSelectedNodesController();
99
+ this.historyController = new HistoryController();
98
100
  this.richTextContentEditable = true;
99
101
  this.selectionMap = new Map();
100
102
  this.isInDarkMode = VegaInternalThemeManager.isDarkMode();
@@ -689,3 +691,6 @@ __decorate([
689
691
  __decorate([
690
692
  InjectVegaSlimmer()
691
693
  ], VegaRichTextEditor.prototype, "deleteSelectedNodesController", void 0);
694
+ __decorate([
695
+ InjectVegaSlimmer()
696
+ ], VegaRichTextEditor.prototype, "historyController", void 0);
@@ -63,6 +63,10 @@ export class VegaRichTextImageEditorRenderer extends VegaSlimmer {
63
63
  { key: 'lg', text: this.translationSlimmer.t('Lg') },
64
64
  ], selected: this.size, ref: (ref) => {
65
65
  DomNodeSubjectObserverFactory.addUniqueObserverToNode(ref, VegaChange, (e) => {
66
+ // The below line is covered in `history.spec#should register history, and undo/redo for image size change`
67
+ // Prevent handling vegaChange triggered by DOM ref reuse (e.g., undo/redo) when the image editor is not visible.
68
+ if (!this.selected)
69
+ return;
66
70
  const size = e.detail;
67
71
  this.size = size;
68
72
  this.changeEventEmitter.emit({
@@ -38,6 +38,7 @@ export class VegaRichTextImageEditor {
38
38
  *
39
39
  * @vegaVersion 2.34.0
40
40
  */
41
+ /* eslint-disable-next-line @stencil/strict-mutable */
41
42
  this.size = 'md';
42
43
  }
43
44
  render() {
@@ -75,7 +76,7 @@ export class VegaRichTextImageEditor {
75
76
  },
76
77
  "size": {
77
78
  "type": "string",
78
- "mutable": false,
79
+ "mutable": true,
79
80
  "complexType": {
80
81
  "original": "VegaRichTextImageEditorSizeType",
81
82
  "resolved": "\"lg\" | \"md\" | \"sm\"",
@@ -30,11 +30,11 @@ export class VegaStepper {
30
30
  propertyRules: [
31
31
  {
32
32
  propertyName: 'min',
33
- ruleFactory: (min) => new MinNumberRule({ minValue: min }),
33
+ ruleFactory: (min) => typeof min === 'number' ? new MinNumberRule({ minValue: min }) : null,
34
34
  },
35
35
  {
36
36
  propertyName: 'max',
37
- ruleFactory: (max) => new MaxNumberRule({ maxValue: max }),
37
+ ruleFactory: (max) => typeof max === 'number' ? new MaxNumberRule({ maxValue: max }) : null,
38
38
  },
39
39
  ],
40
40
  defaultValue: 0,
@@ -34,6 +34,8 @@ export const VegaInputSelectRenderPrefixIconInternalOverridden = new VegaInterna
34
34
  export const VegaDropdownSearchInternalOverridden = new VegaInternalEventID('VegaDropdownSearchInternalOverridden');
35
35
  export const VegaInternalSidenavLinkClick = new VegaInternalEventID('sidenavLinkClick');
36
36
  export const VegaInternalLeftNavGroupExpand = new VegaInternalEventID('leftNavGroupExpand');
37
+ export const VegaInternalLeftNavLinkSelected = new VegaInternalEventID('leftNavLinkSelected');
38
+ export const VegaInternalInitializeLeftNavLinkSelected = new VegaInternalEventID('initializeLeftNavLinkSelected');
37
39
  export const VegaInternalDropdownUpdateTarget = new VegaInternalEventID('dropdownUpdateTarget');
38
40
  export const VegaInternalRichTextEditorFlushChanges = new VegaInternalEventID('richTextEditorFlushChanges');
39
41
  export const VegaInternalRichTextEditorSelectionRangeChange = new VegaInternalEventID('richTextEditorSelectionRangeChange');