@tiny-mce-umbraco/backoffice 16.0.0-rc2 → 16.0.0-rc2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +1 -0
  2. package/dist-cms/README.md +1 -0
  3. package/dist-cms/api/client.gen.d.ts +13 -0
  4. package/dist-cms/api/client.gen.d.ts.map +1 -0
  5. package/dist-cms/api/client.gen.js +5 -0
  6. package/dist-cms/api/index.d.ts +3 -0
  7. package/dist-cms/api/index.d.ts.map +1 -0
  8. package/dist-cms/api/index.js +3 -0
  9. package/dist-cms/api/sdk.gen.d.ts +19 -0
  10. package/dist-cms/api/sdk.gen.d.ts.map +1 -0
  11. package/dist-cms/api/sdk.gen.js +16 -0
  12. package/dist-cms/api/types.gen.d.ts +72 -0
  13. package/dist-cms/api/types.gen.d.ts.map +1 -0
  14. package/dist-cms/api/types.gen.js +7 -0
  15. package/dist-cms/components/constants.d.ts +2 -0
  16. package/dist-cms/components/constants.d.ts.map +1 -0
  17. package/dist-cms/components/constants.js +1 -0
  18. package/dist-cms/components/index.d.ts +6 -0
  19. package/dist-cms/components/index.d.ts.map +1 -0
  20. package/dist-cms/components/index.js +5 -0
  21. package/dist-cms/components/input-tiny-mce/index.d.ts +7 -0
  22. package/dist-cms/components/input-tiny-mce/index.d.ts.map +1 -0
  23. package/dist-cms/components/input-tiny-mce/index.js +6 -0
  24. package/dist-cms/components/input-tiny-mce/input-tiny-mce.defaults.d.ts +5 -0
  25. package/dist-cms/components/input-tiny-mce/input-tiny-mce.defaults.d.ts.map +1 -0
  26. package/dist-cms/components/input-tiny-mce/input-tiny-mce.defaults.js +159 -0
  27. package/dist-cms/components/input-tiny-mce/input-tiny-mce.element.d.ts +37 -0
  28. package/dist-cms/components/input-tiny-mce/input-tiny-mce.element.d.ts.map +1 -0
  29. package/dist-cms/components/input-tiny-mce/input-tiny-mce.element.js +449 -0
  30. package/dist-cms/components/input-tiny-mce/input-tiny-mce.handlers.d.ts +3 -0
  31. package/dist-cms/components/input-tiny-mce/input-tiny-mce.handlers.d.ts.map +1 -0
  32. package/dist-cms/components/input-tiny-mce/input-tiny-mce.handlers.js +8 -0
  33. package/dist-cms/components/input-tiny-mce/input-tiny-mce.languages.d.ts +2 -0
  34. package/dist-cms/components/input-tiny-mce/input-tiny-mce.languages.d.ts.map +1 -0
  35. package/dist-cms/components/input-tiny-mce/input-tiny-mce.languages.js +78 -0
  36. package/dist-cms/components/input-tiny-mce/input-tiny-mce.sanitizer.d.ts +9 -0
  37. package/dist-cms/components/input-tiny-mce/input-tiny-mce.sanitizer.d.ts.map +1 -0
  38. package/dist-cms/components/input-tiny-mce/input-tiny-mce.sanitizer.js +47 -0
  39. package/dist-cms/components/input-tiny-mce/tiny-mce-plugin.d.ts +24 -0
  40. package/dist-cms/components/input-tiny-mce/tiny-mce-plugin.d.ts.map +1 -0
  41. package/dist-cms/components/input-tiny-mce/tiny-mce-plugin.js +16 -0
  42. package/dist-cms/components/manifests.d.ts +2 -0
  43. package/dist-cms/components/manifests.d.ts.map +1 -0
  44. package/dist-cms/components/manifests.js +2 -0
  45. package/dist-cms/components/stylesheet-rule-input/constants.d.ts +3 -0
  46. package/dist-cms/components/stylesheet-rule-input/constants.d.ts.map +1 -0
  47. package/dist-cms/components/stylesheet-rule-input/constants.js +2 -0
  48. package/dist-cms/components/stylesheet-rule-input/manifests.d.ts +3 -0
  49. package/dist-cms/components/stylesheet-rule-input/manifests.d.ts.map +1 -0
  50. package/dist-cms/components/stylesheet-rule-input/manifests.js +9 -0
  51. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-input.element.d.ts +18 -0
  52. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-input.element.d.ts.map +1 -0
  53. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-input.element.js +119 -0
  54. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-settings-modal.element.d.ts +12 -0
  55. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-settings-modal.element.d.ts.map +1 -0
  56. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-settings-modal.element.js +142 -0
  57. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-settings-modal.token.d.ts +7 -0
  58. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-settings-modal.token.d.ts.map +1 -0
  59. package/dist-cms/components/stylesheet-rule-input/stylesheet-rule-settings-modal.token.js +9 -0
  60. package/dist-cms/components/stylesheet-rule-ref/stylesheet-rule-ref.element.d.ts +16 -0
  61. package/dist-cms/components/stylesheet-rule-ref/stylesheet-rule-ref.element.d.ts.map +1 -0
  62. package/dist-cms/components/stylesheet-rule-ref/stylesheet-rule-ref.element.js +24 -0
  63. package/dist-cms/constants.d.ts +2 -0
  64. package/dist-cms/constants.d.ts.map +1 -0
  65. package/dist-cms/constants.js +1 -0
  66. package/dist-cms/entry-points/entry-point.d.ts +4 -0
  67. package/dist-cms/entry-points/entry-point.d.ts.map +1 -0
  68. package/dist-cms/entry-points/entry-point.js +25 -0
  69. package/dist-cms/entry-points/manifest.d.ts +2 -0
  70. package/dist-cms/entry-points/manifest.d.ts.map +1 -0
  71. package/dist-cms/entry-points/manifest.js +8 -0
  72. package/dist-cms/external/tinymce/index.d.ts +22 -0
  73. package/dist-cms/external/tinymce/index.d.ts.map +1 -0
  74. package/dist-cms/external/tinymce/index.js +18 -0
  75. package/dist-cms/icons/icons.d.ts +6 -0
  76. package/dist-cms/icons/icons.d.ts.map +1 -0
  77. package/dist-cms/icons/icons.js +1 -0
  78. package/dist-cms/icons/manifests.d.ts +2 -0
  79. package/dist-cms/icons/manifests.d.ts.map +1 -0
  80. package/dist-cms/icons/manifests.js +8 -0
  81. package/dist-cms/index.d.ts +5 -0
  82. package/dist-cms/index.d.ts.map +1 -0
  83. package/dist-cms/index.js +3 -0
  84. package/dist-cms/localizations/ar.d.ts +4 -0
  85. package/dist-cms/localizations/ar.d.ts.map +1 -0
  86. package/dist-cms/localizations/ar.js +5 -0
  87. package/dist-cms/localizations/bs.d.ts +4 -0
  88. package/dist-cms/localizations/bs.d.ts.map +1 -0
  89. package/dist-cms/localizations/bs.js +5 -0
  90. package/dist-cms/localizations/cs.d.ts +4 -0
  91. package/dist-cms/localizations/cs.d.ts.map +1 -0
  92. package/dist-cms/localizations/cs.js +5 -0
  93. package/dist-cms/localizations/cy.d.ts +4 -0
  94. package/dist-cms/localizations/cy.d.ts.map +1 -0
  95. package/dist-cms/localizations/cy.js +5 -0
  96. package/dist-cms/localizations/da.d.ts +4 -0
  97. package/dist-cms/localizations/da.d.ts.map +1 -0
  98. package/dist-cms/localizations/da.js +5 -0
  99. package/dist-cms/localizations/de.d.ts +4 -0
  100. package/dist-cms/localizations/de.d.ts.map +1 -0
  101. package/dist-cms/localizations/de.js +5 -0
  102. package/dist-cms/localizations/en.d.ts +4 -0
  103. package/dist-cms/localizations/en.d.ts.map +1 -0
  104. package/dist-cms/localizations/en.js +5 -0
  105. package/dist-cms/localizations/fr.d.ts +4 -0
  106. package/dist-cms/localizations/fr.d.ts.map +1 -0
  107. package/dist-cms/localizations/fr.js +5 -0
  108. package/dist-cms/localizations/hr.d.ts +4 -0
  109. package/dist-cms/localizations/hr.d.ts.map +1 -0
  110. package/dist-cms/localizations/hr.js +5 -0
  111. package/dist-cms/localizations/it.d.ts +4 -0
  112. package/dist-cms/localizations/it.d.ts.map +1 -0
  113. package/dist-cms/localizations/it.js +5 -0
  114. package/dist-cms/localizations/manifests.d.ts +2 -0
  115. package/dist-cms/localizations/manifests.d.ts.map +1 -0
  116. package/dist-cms/localizations/manifests.js +97 -0
  117. package/dist-cms/localizations/nl.d.ts +4 -0
  118. package/dist-cms/localizations/nl.d.ts.map +1 -0
  119. package/dist-cms/localizations/nl.js +5 -0
  120. package/dist-cms/localizations/tr.d.ts +4 -0
  121. package/dist-cms/localizations/tr.d.ts.map +1 -0
  122. package/dist-cms/localizations/tr.js +5 -0
  123. package/dist-cms/manifests.d.ts +2 -0
  124. package/dist-cms/manifests.d.ts.map +1 -0
  125. package/dist-cms/manifests.js +16 -0
  126. package/dist-cms/plugins/core/a11ychecker.tinymce-api.d.ts +6 -0
  127. package/dist-cms/plugins/core/a11ychecker.tinymce-api.d.ts.map +1 -0
  128. package/dist-cms/plugins/core/a11ychecker.tinymce-api.js +7 -0
  129. package/dist-cms/plugins/core/ai-assistant.tinymce-api.d.ts +9 -0
  130. package/dist-cms/plugins/core/ai-assistant.tinymce-api.d.ts.map +1 -0
  131. package/dist-cms/plugins/core/ai-assistant.tinymce-api.js +41 -0
  132. package/dist-cms/plugins/core/ai-request-factory.d.ts +2 -0
  133. package/dist-cms/plugins/core/ai-request-factory.d.ts.map +1 -0
  134. package/dist-cms/plugins/core/ai-request-factory.js +33 -0
  135. package/dist-cms/plugins/core/basic.tinymce-api.d.ts +6 -0
  136. package/dist-cms/plugins/core/basic.tinymce-api.d.ts.map +1 -0
  137. package/dist-cms/plugins/core/basic.tinymce-api.js +7 -0
  138. package/dist-cms/plugins/manifests.d.ts +3 -0
  139. package/dist-cms/plugins/manifests.d.ts.map +1 -0
  140. package/dist-cms/plugins/manifests.js +506 -0
  141. package/dist-cms/plugins/tiny-mce-block-picker.plugin.d.ts +8 -0
  142. package/dist-cms/plugins/tiny-mce-block-picker.plugin.d.ts.map +1 -0
  143. package/dist-cms/plugins/tiny-mce-block-picker.plugin.js +99 -0
  144. package/dist-cms/plugins/tiny-mce-code-editor.plugin.d.ts +7 -0
  145. package/dist-cms/plugins/tiny-mce-code-editor.plugin.d.ts.map +1 -0
  146. package/dist-cms/plugins/tiny-mce-code-editor.plugin.js +42 -0
  147. package/dist-cms/plugins/tiny-mce-embeddedmedia.plugin.d.ts +7 -0
  148. package/dist-cms/plugins/tiny-mce-embeddedmedia.plugin.d.ts.map +1 -0
  149. package/dist-cms/plugins/tiny-mce-embeddedmedia.plugin.js +74 -0
  150. package/dist-cms/plugins/tiny-mce-mediapicker.plugin.d.ts +7 -0
  151. package/dist-cms/plugins/tiny-mce-mediapicker.plugin.d.ts.map +1 -0
  152. package/dist-cms/plugins/tiny-mce-mediapicker.plugin.js +224 -0
  153. package/dist-cms/plugins/tiny-mce-multi-url-picker.plugin.d.ts +8 -0
  154. package/dist-cms/plugins/tiny-mce-multi-url-picker.plugin.d.ts.map +1 -0
  155. package/dist-cms/plugins/tiny-mce-multi-url-picker.plugin.js +172 -0
  156. package/dist-cms/plugins/tinymce-plugin.extension.d.ts +70 -0
  157. package/dist-cms/plugins/tinymce-plugin.extension.d.ts.map +1 -0
  158. package/dist-cms/plugins/tinymce-plugin.extension.js +1 -0
  159. package/dist-cms/plugins/types.d.ts +2 -0
  160. package/dist-cms/plugins/types.d.ts.map +1 -0
  161. package/dist-cms/plugins/types.js +1 -0
  162. package/dist-cms/property-editors/configEditor/property-editor-ui-tiny-mce-config-editor.element.d.ts +23 -0
  163. package/dist-cms/property-editors/configEditor/property-editor-ui-tiny-mce-config-editor.element.d.ts.map +1 -0
  164. package/dist-cms/property-editors/configEditor/property-editor-ui-tiny-mce-config-editor.element.js +102 -0
  165. package/dist-cms/property-editors/constants.d.ts +2 -0
  166. package/dist-cms/property-editors/constants.d.ts.map +1 -0
  167. package/dist-cms/property-editors/constants.js +1 -0
  168. package/dist-cms/property-editors/manifests.d.ts +2 -0
  169. package/dist-cms/property-editors/manifests.d.ts.map +1 -0
  170. package/dist-cms/property-editors/manifests.js +37 -0
  171. package/dist-cms/property-editors/plugin/property-editor-ui-tiny-mce-plugin-configuration.element.d.ts +25 -0
  172. package/dist-cms/property-editors/plugin/property-editor-ui-tiny-mce-plugin-configuration.element.d.ts.map +1 -0
  173. package/dist-cms/property-editors/plugin/property-editor-ui-tiny-mce-plugin-configuration.element.js +212 -0
  174. package/dist-cms/property-editors/tiny-mce/constants.d.ts +2 -0
  175. package/dist-cms/property-editors/tiny-mce/constants.d.ts.map +1 -0
  176. package/dist-cms/property-editors/tiny-mce/constants.js +1 -0
  177. package/dist-cms/property-editors/tiny-mce/manifests.d.ts +2 -0
  178. package/dist-cms/property-editors/tiny-mce/manifests.d.ts.map +1 -0
  179. package/dist-cms/property-editors/tiny-mce/manifests.js +149 -0
  180. package/dist-cms/property-editors/tiny-mce/property-editor-ui-tiny-mce.element.d.ts +16 -0
  181. package/dist-cms/property-editors/tiny-mce/property-editor-ui-tiny-mce.element.d.ts.map +1 -0
  182. package/dist-cms/property-editors/tiny-mce/property-editor-ui-tiny-mce.element.js +79 -0
  183. package/dist-cms/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.d.ts +25 -0
  184. package/dist-cms/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.d.ts.map +1 -0
  185. package/dist-cms/property-editors/toolbar/property-editor-ui-tiny-mce-toolbar-configuration.element.js +201 -0
  186. package/dist-cms/stylesheets/entity-actions/manifests.d.ts +2 -0
  187. package/dist-cms/stylesheets/entity-actions/manifests.d.ts.map +1 -0
  188. package/dist-cms/stylesheets/entity-actions/manifests.js +15 -0
  189. package/dist-cms/stylesheets/entity-actions/rte-stylesheet-create-option-action.d.ts +7 -0
  190. package/dist-cms/stylesheets/entity-actions/rte-stylesheet-create-option-action.d.ts.map +1 -0
  191. package/dist-cms/stylesheets/entity-actions/rte-stylesheet-create-option-action.js +8 -0
  192. package/dist-cms/stylesheets/manifests.d.ts +2 -0
  193. package/dist-cms/stylesheets/manifests.d.ts.map +1 -0
  194. package/dist-cms/stylesheets/manifests.js +3 -0
  195. package/dist-cms/stylesheets/stylesheet-rule-manager.d.ts +20 -0
  196. package/dist-cms/stylesheets/stylesheet-rule-manager.d.ts.map +1 -0
  197. package/dist-cms/stylesheets/stylesheet-rule-manager.js +57 -0
  198. package/dist-cms/stylesheets/workspace-views/manifests.d.ts +2 -0
  199. package/dist-cms/stylesheets/workspace-views/manifests.d.ts.map +1 -0
  200. package/dist-cms/stylesheets/workspace-views/manifests.js +22 -0
  201. package/dist-cms/stylesheets/workspace-views/stylesheet-rich-text-rule-workspace-view.element.d.ts +18 -0
  202. package/dist-cms/stylesheets/workspace-views/stylesheet-rich-text-rule-workspace-view.element.d.ts.map +1 -0
  203. package/dist-cms/stylesheets/workspace-views/stylesheet-rich-text-rule-workspace-view.element.js +100 -0
  204. package/dist-cms/tinymce.d.ts +2 -0
  205. package/dist-cms/tinymce.d.ts.map +1 -0
  206. package/dist-cms/tinymce.js +1 -0
  207. package/dist-cms/types.d.ts +6 -0
  208. package/dist-cms/types.d.ts.map +1 -0
  209. package/dist-cms/types.js +1 -0
  210. package/dist-cms/utils/index.d.ts +26 -0
  211. package/dist-cms/utils/index.d.ts.map +1 -0
  212. package/dist-cms/utils/index.js +108 -0
  213. package/package.json +10 -4
  214. package/dist/tiny-mce-umbraco.d.ts +0 -252
@@ -0,0 +1,74 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _UmbTinyMceEmbeddedMediaPlugin_instances, _UmbTinyMceEmbeddedMediaPlugin_onAction, _UmbTinyMceEmbeddedMediaPlugin_insertInEditor, _UmbTinyMceEmbeddedMediaPlugin_showModal;
7
+ import { UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js';
8
+ import { umbOpenModal } from '@umbraco-cms/backoffice/modal';
9
+ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api';
10
+ import { UMB_EMBEDDED_MEDIA_MODAL } from '@umbraco-cms/backoffice/embedded-media';
11
+ class UmbTinyMceEmbeddedMediaPlugin extends UmbTinyMcePluginBase {
12
+ constructor(args) {
13
+ super(args);
14
+ _UmbTinyMceEmbeddedMediaPlugin_instances.add(this);
15
+ const localize = new UmbLocalizationController(args.host);
16
+ this.editor.ui.registry.addToggleButton('umbembeddialog', {
17
+ icon: 'embed',
18
+ tooltip: localize.term('general_embed'),
19
+ onAction: () => __classPrivateFieldGet(this, _UmbTinyMceEmbeddedMediaPlugin_instances, "m", _UmbTinyMceEmbeddedMediaPlugin_onAction).call(this),
20
+ onSetup: function (api) {
21
+ const changed = args.editor.selection.selectorChangedWithUnbind('div.umb-embed-holder', (state) => api.setActive(state));
22
+ return () => changed.unbind();
23
+ },
24
+ });
25
+ }
26
+ }
27
+ _UmbTinyMceEmbeddedMediaPlugin_instances = new WeakSet(), _UmbTinyMceEmbeddedMediaPlugin_onAction = function _UmbTinyMceEmbeddedMediaPlugin_onAction() {
28
+ // Get the selected element
29
+ // Check nodename is a DIV and the claslist contains 'umb-embed-holder'
30
+ const selectedElm = this.editor.selection.getNode();
31
+ let modify = {
32
+ width: 360,
33
+ height: 240,
34
+ };
35
+ if (selectedElm.nodeName.toUpperCase() === 'DIV' && selectedElm.classList.contains('umb-embed-holder')) {
36
+ // See if we can go and get the attributes
37
+ const url = this.editor.dom.getAttrib(selectedElm, 'data-embed-url');
38
+ const embedWidth = this.editor.dom.getAttrib(selectedElm, 'data-embed-width');
39
+ const embedHeight = this.editor.dom.getAttrib(selectedElm, 'data-embed-height');
40
+ const constrain = this.editor.dom.getAttrib(selectedElm, 'data-embed-constrain') === 'true';
41
+ modify = {
42
+ url,
43
+ constrain,
44
+ width: parseInt(embedWidth) || modify.width,
45
+ height: parseInt(embedHeight) || modify.height,
46
+ };
47
+ }
48
+ __classPrivateFieldGet(this, _UmbTinyMceEmbeddedMediaPlugin_instances, "m", _UmbTinyMceEmbeddedMediaPlugin_showModal).call(this, selectedElm, modify);
49
+ }, _UmbTinyMceEmbeddedMediaPlugin_insertInEditor = function _UmbTinyMceEmbeddedMediaPlugin_insertInEditor(embed, activeElement) {
50
+ // Wrap HTML preview content here in a DIV with non-editable class of .mceNonEditable
51
+ // This turns it into a selectable/cutable block to move about
52
+ const wrapper = this.editor.dom.create('div', {
53
+ class: 'mceNonEditable umb-embed-holder',
54
+ 'data-embed-url': embed.url ?? '',
55
+ 'data-embed-height': embed.height,
56
+ 'data-embed-width': embed.width,
57
+ 'data-embed-constrain': embed.constrain ?? false,
58
+ contenteditable: false,
59
+ }, embed.markup);
60
+ // Only replace if activeElement is an Embed element.
61
+ if (activeElement?.nodeName.toUpperCase() === 'DIV' && activeElement.classList.contains('umb-embed-holder')) {
62
+ activeElement.replaceWith(wrapper); // directly replaces the html node
63
+ }
64
+ else {
65
+ this.editor.selection.setNode(wrapper);
66
+ }
67
+ }, _UmbTinyMceEmbeddedMediaPlugin_showModal = async function _UmbTinyMceEmbeddedMediaPlugin_showModal(selectedElm, embeddedMediaModalData) {
68
+ const result = await umbOpenModal(this, UMB_EMBEDDED_MEDIA_MODAL, { data: embeddedMediaModalData }).catch(() => undefined);
69
+ if (!result)
70
+ return;
71
+ __classPrivateFieldGet(this, _UmbTinyMceEmbeddedMediaPlugin_instances, "m", _UmbTinyMceEmbeddedMediaPlugin_insertInEditor).call(this, result, selectedElm);
72
+ this.editor.dispatch('Change');
73
+ };
74
+ export default UmbTinyMceEmbeddedMediaPlugin;
@@ -0,0 +1,7 @@
1
+ import { UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js';
2
+ import type { TinyMcePluginArguments } from '../components/input-tiny-mce/tiny-mce-plugin.js';
3
+ export default class UmbTinyMceMediaPickerPlugin extends UmbTinyMcePluginBase {
4
+ #private;
5
+ constructor(args: TinyMcePluginArguments);
6
+ }
7
+ //# sourceMappingURL=tiny-mce-mediapicker.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiny-mce-mediapicker.plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/tiny-mce-mediapicker.plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AA0B9F,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,oBAAoB;;gBAIhE,IAAI,EAAE,sBAAsB;CAoOxC"}
@@ -0,0 +1,224 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _UmbTinyMceMediaPickerPlugin_instances, _UmbTinyMceMediaPickerPlugin_modalManager, _UmbTinyMceMediaPickerPlugin_temporaryFileRepository, _UmbTinyMceMediaPickerPlugin_onAction, _UmbTinyMceMediaPickerPlugin_showMediaPicker, _UmbTinyMceMediaPickerPlugin_showMediaCaptionAltText, _UmbTinyMceMediaPickerPlugin_insertInEditor, _UmbTinyMceMediaPickerPlugin_uploadImageHandler;
13
+ import { sizeImageInEditor, uploadBlobImages } from '../utils/index.js';
14
+ import { UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js';
15
+ import { getGuidFromUdi } from '@umbraco-cms/backoffice/utils';
16
+ import { UmbId } from '@umbraco-cms/backoffice/id';
17
+ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api';
18
+ import { UmbTemporaryFileRepository } from '@umbraco-cms/backoffice/temporary-file';
19
+ import { UMB_MEDIA_PICKER_MODAL, UMB_MEDIA_CAPTION_ALT_TEXT_MODAL } from '@umbraco-cms/backoffice/media';
20
+ import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
21
+ class UmbTinyMceMediaPickerPlugin extends UmbTinyMcePluginBase {
22
+ constructor(args) {
23
+ super(args);
24
+ _UmbTinyMceMediaPickerPlugin_instances.add(this);
25
+ _UmbTinyMceMediaPickerPlugin_modalManager.set(this, void 0);
26
+ _UmbTinyMceMediaPickerPlugin_temporaryFileRepository.set(this, void 0);
27
+ _UmbTinyMceMediaPickerPlugin_uploadImageHandler.set(this, (blobInfo, progress) => {
28
+ return new Promise((resolve, reject) => {
29
+ progress(0);
30
+ const id = UmbId.new();
31
+ const fileBlob = blobInfo.blob();
32
+ const file = new File([fileBlob], blobInfo.filename(), { type: fileBlob.type });
33
+ document.dispatchEvent(new CustomEvent('rte.file.uploading', { composed: true, bubbles: true }));
34
+ __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_temporaryFileRepository, "f")
35
+ .upload(id, file, (evt) => {
36
+ progress((evt.loaded / evt.total) * 100);
37
+ })
38
+ .then((response) => {
39
+ if (response.error) {
40
+ reject(response.error);
41
+ return;
42
+ }
43
+ // Put temp location into localstorage (used to update the img with data-tmpimg later on)
44
+ const blobUri = window.URL.createObjectURL(fileBlob);
45
+ sessionStorage.setItem(`tinymce__${blobUri}`, id);
46
+ resolve(blobUri);
47
+ })
48
+ .catch(reject)
49
+ .finally(() => {
50
+ progress(100);
51
+ document.dispatchEvent(new CustomEvent('rte.file.uploaded', { composed: true, bubbles: true }));
52
+ });
53
+ });
54
+ });
55
+ const localize = new UmbLocalizationController(args.host);
56
+ __classPrivateFieldSet(this, _UmbTinyMceMediaPickerPlugin_temporaryFileRepository, new UmbTemporaryFileRepository(args.host), "f");
57
+ this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => {
58
+ __classPrivateFieldSet(this, _UmbTinyMceMediaPickerPlugin_modalManager, instance, "f");
59
+ });
60
+ this.editor.ui.registry.addToggleButton('umbmediapicker', {
61
+ icon: 'image',
62
+ tooltip: localize.term('general_mediaPicker'),
63
+ onAction: () => __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_instances, "m", _UmbTinyMceMediaPickerPlugin_onAction).call(this),
64
+ onSetup: (api) => {
65
+ const changed = this.editor.selection.selectorChangedWithUnbind('img[data-udi]', (state) => api.setActive(state));
66
+ return () => changed.unbind();
67
+ },
68
+ });
69
+ // Register global options for the editor
70
+ this.editor.options.register('maxImageSize', { processor: 'number', default: 500 });
71
+ // Adjust Editor settings to allow pasting images
72
+ // but only if the umbmediapicker button is present
73
+ const toolbar = this.configuration?.getValueByAlias('toolbar');
74
+ if (toolbar?.includes('umbmediapicker')) {
75
+ this.editor.options.set('paste_data_images', true);
76
+ this.editor.options.set('automatic_uploads', false);
77
+ this.editor.options.set('images_upload_handler', __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_uploadImageHandler, "f"));
78
+ // This allows images to be pasted in & stored as Base64 until they get uploaded to server
79
+ this.editor.options.set('images_replace_blob_uris', true);
80
+ // Listen for SetContent to update images
81
+ this.editor.on('SetContent', async (e) => {
82
+ const content = e.content;
83
+ // Handle images that are pasted in
84
+ uploadBlobImages(this.editor, content);
85
+ });
86
+ }
87
+ }
88
+ }
89
+ _UmbTinyMceMediaPickerPlugin_modalManager = new WeakMap(), _UmbTinyMceMediaPickerPlugin_temporaryFileRepository = new WeakMap(), _UmbTinyMceMediaPickerPlugin_uploadImageHandler = new WeakMap(), _UmbTinyMceMediaPickerPlugin_instances = new WeakSet(), _UmbTinyMceMediaPickerPlugin_onAction =
90
+ /*
91
+ async #observeCurrentUser() {
92
+ if (!this.#currentUserContext) return;
93
+
94
+ this.observe(this.#currentUserContext.currentUser, (currentUser) => (this.#currentUser = currentUser));
95
+ }
96
+ */
97
+ async function _UmbTinyMceMediaPickerPlugin_onAction() {
98
+ const selectedElm = this.editor.selection.getNode();
99
+ let currentTarget = {};
100
+ if (selectedElm.nodeName === 'IMG') {
101
+ const img = selectedElm;
102
+ const hasUdi = img.hasAttribute('data-udi');
103
+ const hasDataTmpImg = img.hasAttribute('data-tmpimg');
104
+ currentTarget = {
105
+ altText: img.alt,
106
+ url: img.src,
107
+ caption: img.dataset.caption,
108
+ };
109
+ if (hasUdi) {
110
+ currentTarget['udi'] = img.dataset.udi;
111
+ }
112
+ else {
113
+ currentTarget['id'] = img.getAttribute('rel') ?? undefined;
114
+ }
115
+ if (hasDataTmpImg) {
116
+ currentTarget['tmpimg'] = img.dataset.tmpimg;
117
+ }
118
+ }
119
+ __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_instances, "m", _UmbTinyMceMediaPickerPlugin_showMediaPicker).call(this, currentTarget);
120
+ }, _UmbTinyMceMediaPickerPlugin_showMediaPicker = async function _UmbTinyMceMediaPickerPlugin_showMediaPicker(currentTarget) {
121
+ /*
122
+ let startNodeId;
123
+ let startNodeIsVirtual;
124
+
125
+ if (!this.configuration?.getByAlias('startNodeId')) {
126
+ if (this.configuration?.getValueByAlias<boolean>('ignoreUserStartNodes') === true) {
127
+ startNodeId = -1;
128
+ startNodeIsVirtual = true;
129
+ } else {
130
+ startNodeId = this.#currentUser?.mediaStartNodeIds?.length !== 1 ? -1 : this.#currentUser?.mediaStartNodeIds[0];
131
+ startNodeIsVirtual = this.#currentUser?.mediaStartNodeIds?.length !== 1;
132
+ }
133
+ }
134
+ */
135
+ const modalHandler = __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_modalManager, "f")?.open(this, UMB_MEDIA_PICKER_MODAL, {
136
+ data: {
137
+ multiple: false,
138
+ //startNodeIsVirtual,
139
+ },
140
+ value: {
141
+ selection: currentTarget.udi ? [getGuidFromUdi(currentTarget.udi)] : [],
142
+ },
143
+ });
144
+ if (!modalHandler)
145
+ return;
146
+ const { selection } = await modalHandler.onSubmit().catch(() => ({ selection: undefined }));
147
+ if (!selection?.length)
148
+ return;
149
+ __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_instances, "m", _UmbTinyMceMediaPickerPlugin_showMediaCaptionAltText).call(this, selection[0], currentTarget);
150
+ this.editor.dispatch('Change');
151
+ }, _UmbTinyMceMediaPickerPlugin_showMediaCaptionAltText = async function _UmbTinyMceMediaPickerPlugin_showMediaCaptionAltText(mediaUnique, currentTarget) {
152
+ if (!mediaUnique)
153
+ return;
154
+ const modalHandler = __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_modalManager, "f")?.open(this, UMB_MEDIA_CAPTION_ALT_TEXT_MODAL, {
155
+ data: { mediaUnique },
156
+ value: {
157
+ url: '',
158
+ altText: currentTarget.altText,
159
+ caption: currentTarget.caption,
160
+ },
161
+ });
162
+ const mediaData = await modalHandler?.onSubmit().catch(() => null);
163
+ if (!mediaData)
164
+ return;
165
+ const media = {
166
+ altText: mediaData?.altText,
167
+ caption: mediaData?.caption,
168
+ url: mediaData?.url,
169
+ udi: 'umb://media/' + mediaUnique?.replace(/-/g, ''),
170
+ };
171
+ __classPrivateFieldGet(this, _UmbTinyMceMediaPickerPlugin_instances, "m", _UmbTinyMceMediaPickerPlugin_insertInEditor).call(this, media);
172
+ }, _UmbTinyMceMediaPickerPlugin_insertInEditor = async function _UmbTinyMceMediaPickerPlugin_insertInEditor(media) {
173
+ if (!media)
174
+ return;
175
+ // We need to create a NEW DOM <img> element to insert
176
+ // setting an attribute of ID to __mcenew, so we can gather a reference to the node, to be able to update its size accordingly to the size of the image.
177
+ const img = {
178
+ alt: media.altText,
179
+ src: media.url ? media.url : 'nothing.jpg',
180
+ id: '__mcenew',
181
+ 'data-udi': media.udi,
182
+ 'data-caption': media.caption,
183
+ };
184
+ const newImage = this.editor.dom.createHTML('img', img);
185
+ const parentElement = this.editor.selection.getNode().parentElement;
186
+ if (img['data-caption'] && parentElement) {
187
+ const figCaption = this.editor.dom.createHTML('figcaption', {}, img['data-caption']);
188
+ const combined = newImage + figCaption;
189
+ if (parentElement.nodeName !== 'FIGURE') {
190
+ const fragment = this.editor.dom.createHTML('figure', {}, combined);
191
+ this.editor.selection.setContent(fragment);
192
+ }
193
+ else {
194
+ parentElement.innerHTML = combined;
195
+ }
196
+ }
197
+ else if (parentElement?.nodeName === 'FIGURE' && parentElement.parentElement) {
198
+ //if caption is removed, remove the figure element
199
+ parentElement.parentElement.innerHTML = newImage;
200
+ }
201
+ else {
202
+ this.editor.selection.setContent(newImage);
203
+ }
204
+ // Using settimeout to wait for a DoM-render, so we can find the new element by ID.
205
+ setTimeout(() => {
206
+ const imgElm = this.editor.dom.get('__mcenew');
207
+ if (!imgElm)
208
+ return;
209
+ this.editor.dom.setAttrib(imgElm, 'id', null);
210
+ // When image is loaded we are ready to call sizeImageInEditor.
211
+ const onImageLoaded = () => {
212
+ sizeImageInEditor(this.editor, imgElm, img.src);
213
+ this.editor.dispatch('Change');
214
+ };
215
+ // Check if image already is loaded.
216
+ if (imgElm.complete === true) {
217
+ onImageLoaded();
218
+ }
219
+ else {
220
+ imgElm.onload = onImageLoaded;
221
+ }
222
+ });
223
+ };
224
+ export default UmbTinyMceMediaPickerPlugin;
@@ -0,0 +1,8 @@
1
+ import { UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js';
2
+ import type { TinyMcePluginArguments } from '../components/input-tiny-mce/tiny-mce-plugin.js';
3
+ export default class UmbTinyMceMultiUrlPickerPlugin extends UmbTinyMcePluginBase {
4
+ #private;
5
+ constructor(args: TinyMcePluginArguments);
6
+ showDialog(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=tiny-mce-multi-url-picker.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiny-mce-multi-url-picker.plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/tiny-mce-multi-url-picker.plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AAEvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAiB9F,MAAM,CAAC,OAAO,OAAO,8BAA+B,SAAQ,oBAAoB;;gBAKnE,IAAI,EAAE,sBAAsB;IA0BlC,UAAU;CAmKhB"}
@@ -0,0 +1,172 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _UmbTinyMceMultiUrlPickerPlugin_instances, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, _UmbTinyMceMultiUrlPickerPlugin_openLinkPicker, _UmbTinyMceMultiUrlPickerPlugin_createElemAttributes, _UmbTinyMceMultiUrlPickerPlugin_insertLink, _UmbTinyMceMultiUrlPickerPlugin_updateLink;
13
+ import { umbOpenModal } from '@umbraco-cms/backoffice/modal';
14
+ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api';
15
+ import { UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js';
16
+ import { UMB_LINK_PICKER_MODAL } from '@umbraco-cms/backoffice/multi-url-picker';
17
+ class UmbTinyMceMultiUrlPickerPlugin extends UmbTinyMcePluginBase {
18
+ constructor(args) {
19
+ super(args);
20
+ _UmbTinyMceMultiUrlPickerPlugin_instances.add(this);
21
+ _UmbTinyMceMultiUrlPickerPlugin_linkPickerData.set(this, void 0);
22
+ _UmbTinyMceMultiUrlPickerPlugin_anchorElement.set(this, void 0);
23
+ const localize = new UmbLocalizationController(args.host);
24
+ this.editor.ui.registry.addToggleButton('link', {
25
+ icon: 'link',
26
+ tooltip: localize.term('general_addEditLink'),
27
+ onAction: () => this.showDialog(),
28
+ onSetup: (api) => {
29
+ const changed = this.editor.selection.selectorChangedWithUnbind('a', (state) => api.setActive(state));
30
+ return () => changed.unbind();
31
+ },
32
+ });
33
+ this.editor.ui.registry.addToggleButton('unlink', {
34
+ icon: 'unlink',
35
+ tooltip: localize.term('general_removeLink'),
36
+ onAction: () => args.editor.execCommand('unlink'),
37
+ onSetup: (api) => {
38
+ const changed = this.editor.selection.selectorChangedWithUnbind('a', (state) => api.setActive(state));
39
+ return () => changed.unbind();
40
+ },
41
+ });
42
+ }
43
+ async showDialog() {
44
+ const selectedElm = this.editor.selection.getNode();
45
+ __classPrivateFieldSet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, this.editor.dom.getParent(selectedElm, 'a[href]'), "f");
46
+ if (!__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f")) {
47
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_openLinkPicker).call(this, { name: this.editor.selection.getContent({ format: 'text' }) });
48
+ return;
49
+ }
50
+ let url = __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").getAttribute('href') ?? __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").href ?? '';
51
+ const queryString = __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").getAttribute('data-anchor') ?? '';
52
+ if (queryString && url.endsWith(queryString)) {
53
+ url = url.substring(0, url.indexOf(queryString));
54
+ }
55
+ const currentTarget = {
56
+ name: __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").title || __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").textContent,
57
+ target: __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").target,
58
+ queryString: queryString,
59
+ type: __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f").type ?? 'external',
60
+ unique: url.includes('localLink:') ? url.substring(url.indexOf(':') + 1, url.indexOf('}')) : null,
61
+ url: url,
62
+ };
63
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_openLinkPicker).call(this, currentTarget);
64
+ }
65
+ }
66
+ _UmbTinyMceMultiUrlPickerPlugin_linkPickerData = new WeakMap(), _UmbTinyMceMultiUrlPickerPlugin_anchorElement = new WeakMap(), _UmbTinyMceMultiUrlPickerPlugin_instances = new WeakSet(), _UmbTinyMceMultiUrlPickerPlugin_openLinkPicker = async function _UmbTinyMceMultiUrlPickerPlugin_openLinkPicker(currentTarget) {
67
+ const linkPickerData = await umbOpenModal(this, UMB_LINK_PICKER_MODAL, {
68
+ data: {
69
+ config: {},
70
+ index: null,
71
+ isNew: currentTarget?.url === undefined,
72
+ },
73
+ value: {
74
+ link: currentTarget ?? {},
75
+ },
76
+ }).catch(() => undefined);
77
+ if (!linkPickerData)
78
+ return;
79
+ // TODO: This is a workaround for the issue where the link picker modal is returning a frozen object, and we need to extract the link into smaller parts to avoid the frozen object issue.
80
+ __classPrivateFieldSet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, { link: { ...linkPickerData.link } }, "f");
81
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_updateLink).call(this);
82
+ }, _UmbTinyMceMultiUrlPickerPlugin_createElemAttributes = function _UmbTinyMceMultiUrlPickerPlugin_createElemAttributes() {
83
+ const link = __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link;
84
+ const anchor = {
85
+ href: link.url ?? '',
86
+ title: link.name ?? link.url ?? '',
87
+ target: link.target,
88
+ type: link.type ?? 'external',
89
+ rel: link.target === '_blank' ? 'noopener' : null,
90
+ };
91
+ if (link.queryString) {
92
+ anchor['data-anchor'] = link.queryString;
93
+ if (link.queryString.startsWith('?')) {
94
+ anchor.href += !anchor.href ? '/' + link.queryString : link.queryString;
95
+ }
96
+ else if (link.queryString.startsWith('#')) {
97
+ anchor.href += link.queryString;
98
+ }
99
+ }
100
+ return anchor;
101
+ }, _UmbTinyMceMultiUrlPickerPlugin_insertLink = function _UmbTinyMceMultiUrlPickerPlugin_insertLink() {
102
+ if (__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f")) {
103
+ this.editor.dom.setAttribs(__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f"), __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_createElemAttributes).call(this));
104
+ this.editor.selection.select(__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_anchorElement, "f"));
105
+ this.editor.execCommand('mceEndTyping');
106
+ return;
107
+ }
108
+ // If there is no selected content, we can't insert a link
109
+ // as TinyMCE needs selected content for this, so instead we
110
+ // create a new dom element and insert it, using the chosen
111
+ // link name as the content.
112
+ if (this.editor.selection.getContent() !== '') {
113
+ this.editor.execCommand('CreateLink', false, __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_createElemAttributes).call(this));
114
+ return;
115
+ }
116
+ // Using the target url as a fallback, as href might be confusing with a local link
117
+ const linkContent = typeof __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.name !== 'undefined' && __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.name !== ''
118
+ ? __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.name
119
+ : __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url;
120
+ // only insert if link has content
121
+ if (linkContent) {
122
+ const domElement = this.editor.dom.createHTML('a', __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_createElemAttributes).call(this), linkContent);
123
+ this.editor.execCommand('mceInsertContent', false, domElement);
124
+ }
125
+ }, _UmbTinyMceMultiUrlPickerPlugin_updateLink = function _UmbTinyMceMultiUrlPickerPlugin_updateLink() {
126
+ // if an anchor exists, check that it is appropriately prefixed
127
+ if (__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.queryString &&
128
+ !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.queryString.startsWith('?') &&
129
+ !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.queryString.startsWith('#')) {
130
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.queryString =
131
+ (__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.queryString.startsWith('=') ? '#' : '?') + __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.queryString;
132
+ }
133
+ // the href might be an external url, so check the value for an anchor/qs
134
+ // href has the anchor re-appended later, hence the reset here to avoid duplicating the anchor
135
+ if (__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f") && !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.queryString) {
136
+ const urlParts = __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url?.split(/(#|\?)/);
137
+ if (urlParts?.length === 3) {
138
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url = urlParts[0];
139
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.queryString = urlParts[1] + urlParts[2];
140
+ }
141
+ }
142
+ if (!__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url &&
143
+ !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.queryString &&
144
+ !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.unique) {
145
+ this.editor.execCommand('unlink');
146
+ return;
147
+ }
148
+ //if we have an id, it must be a locallink:id
149
+ if (__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.unique) {
150
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url = '/{localLink:' + __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.unique + '}';
151
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_insertLink).call(this);
152
+ return;
153
+ }
154
+ if (!__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url) {
155
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url = '';
156
+ }
157
+ // Is email and not //user@domain.com and protocol (e.g. mailto:, sip:) is not specified
158
+ if (__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url.includes('@') &&
159
+ !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url.includes('//') &&
160
+ !__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url.includes(':')) {
161
+ // assume it's a mailto link
162
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url = 'mailto:' + __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url;
163
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_insertLink).call(this);
164
+ return;
165
+ }
166
+ // Is www. prefixed
167
+ if (/^\s*www\./i.test(__classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f")?.link.url)) {
168
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url = 'http://' + __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_linkPickerData, "f").link.url;
169
+ }
170
+ __classPrivateFieldGet(this, _UmbTinyMceMultiUrlPickerPlugin_instances, "m", _UmbTinyMceMultiUrlPickerPlugin_insertLink).call(this);
171
+ };
172
+ export default UmbTinyMceMultiUrlPickerPlugin;
@@ -0,0 +1,70 @@
1
+ import type { ManifestApi } from '@umbraco-cms/backoffice/extension-api';
2
+ import type { RawEditorOptions } from '@umbraco-cms/backoffice/external/tinymce';
3
+ import type { UmbTinyMcePluginBase } from '../components/input-tiny-mce/tiny-mce-plugin.js';
4
+ export interface MetaTinyMcePlugin {
5
+ /**
6
+ * If the plugin adds toolbar buttons, this property can be used to configure the buttons.
7
+ * This configuration will be used on the Rich Text Editor configuration page.
8
+ */
9
+ plugins?: string[];
10
+ /**
11
+ * If the plugin adds toolbar buttons, this property can be used to configure the buttons.
12
+ * This configuration will be used on the Rich Text Editor configuration page.
13
+ */
14
+ toolbar?: Array<{
15
+ /**
16
+ * The alias of the toolbar button that will be configured in the TinyMCE editor.
17
+ * @see [TinyMCE Toolbar](https://www.tiny.cloud/docs/tinymce/6/toolbar-configuration-options/) for more information.
18
+ */
19
+ alias: string;
20
+ /**
21
+ * The label of the option shown on the Rich Text Editor configuration page.
22
+ */
23
+ label: string;
24
+ /**
25
+ * The icon shown on the Rich Text Editor configuration page. The icon has to be a part of TinyMCE's icon set.
26
+ * @optional
27
+ * @see [TinyMCE Icon Set](https://www.tiny.cloud/docs/tinymce/6/editor-icon-identifiers/) for available default icons.
28
+ */
29
+ icon?: string;
30
+ /**
31
+ * If this is a TinyMCE plugin that can be enabled/disabled
32
+ */
33
+ isplugin?: boolean;
34
+ /**
35
+ * Name of the plugin this is a part of (links to the plugin for property editor UI)
36
+ */
37
+ pluginAlias?: string;
38
+ }>;
39
+ /**
40
+ * @title Sets the default configuration for the TinyMCE editor.
41
+ * @description This configuration will be used when the editor is initialized. See the [TinyMCE Configuration](https://www.tiny.cloud/docs/configure/) for more information.
42
+ * @optional
43
+ * @TJS-type object
44
+ * @examples [
45
+ * {
46
+ * "plugins": "wordcount",
47
+ * "statusbar": true
48
+ * }
49
+ * ]
50
+ */
51
+ config?: RawEditorOptions;
52
+ }
53
+ /**
54
+ * The manifest for a TinyMCE plugin.
55
+ * The plugin will be loaded into the TinyMCE editor.
56
+ * A plugin can add things like buttons, menu items, context menu items, etc. through the TinyMCE API.
57
+ * A plugin can also add custom commands to the editor.
58
+ * A plugin can also modify the behavior of the editor.
59
+ * @see [TinyMCE Plugin](https://www.tiny.cloud/docs/tinymce/6/apis/tinymce.plugin/) for more information.
60
+ */
61
+ export interface ManifestTinyMcePlugin extends ManifestApi<UmbTinyMcePluginBase> {
62
+ type: 'tinyMcePlugin';
63
+ meta?: MetaTinyMcePlugin;
64
+ }
65
+ declare global {
66
+ interface UmbExtensionManifestMap {
67
+ umbTinyMcePlugin: ManifestTinyMcePlugin;
68
+ }
69
+ }
70
+ //# sourceMappingURL=tinymce-plugin.extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tinymce-plugin.extension.d.ts","sourceRoot":"","sources":["../../src/plugins/tinymce-plugin.extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AAE5F,MAAM,WAAW,iBAAiB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QACf;;;WAGG;QACH,KAAK,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QAEd;;;;WAIG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QAEnB;;WAEG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAEH;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAsB,SAAQ,WAAW,CAAC,oBAAoB,CAAC;IAC/E,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CACzB;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,uBAAuB;QAChC,gBAAgB,EAAE,qBAAqB,CAAC;KACxC;CACD"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export type * from './tinymce-plugin.extension.js';
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA,mBAAmB,+BAA+B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
2
+ import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit';
3
+ import type { UmbPropertyEditorUiElement, UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor';
4
+ /**
5
+ * @element umb-property-editor-ui-tiny-mce-config-editor
6
+ */
7
+ export declare class UmbPropertyEditorUITinyMceConfigEditorElement extends UmbLitElement implements UmbPropertyEditorUiElement {
8
+ #private;
9
+ set value(value: JSON | null);
10
+ get value(): JSON;
11
+ config?: UmbPropertyEditorConfigCollection;
12
+ private _customConfig;
13
+ protected firstUpdated(_changedProperties: PropertyValueMap<unknown>): Promise<void>;
14
+ render(): import("lit-html").TemplateResult<1>;
15
+ static readonly styles: import("lit").CSSResult[];
16
+ }
17
+ export default UmbPropertyEditorUITinyMceConfigEditorElement;
18
+ declare global {
19
+ interface HTMLElementTagNameMap {
20
+ 'umb-property-editor-ui-tiny-mce-config-editor': UmbPropertyEditorUITinyMceConfigEditorElement;
21
+ }
22
+ }
23
+ //# sourceMappingURL=property-editor-ui-tiny-mce-config-editor.element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-editor-ui-tiny-mce-config-editor.element.d.ts","sourceRoot":"","sources":["../../../src/property-editors/configEditor/property-editor-ui-tiny-mce-config-editor.element.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EACX,0BAA0B,EAC1B,iCAAiC,EACjC,MAAM,yCAAyC,CAAC;AAKjD;;GAEG;AACH,qBACa,6CAA8C,SAAQ,aAAc,YAAW,0BAA0B;;IAErH,IACI,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAI3B;IACD,IAAI,KAAK,IAAI,IAAI,CAEhB;IAGD,MAAM,CAAC,EAAE,iCAAiC,CAAC;IAG3C,OAAO,CAAC,aAAa,CAA0B;cAEtB,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,OAAO,CAAC;IAqC1E,MAAM;IASf,gBAAyB,MAAM,4BAY7B;CACF;AAED,eAAe,6CAA6C,CAAC;AAE7D,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,+CAA+C,EAAE,6CAA6C,CAAC;KAC/F;CACD"}