@sealcode/jdd-editor 0.2.16 → 0.2.17

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 (26) hide show
  1. package/.nyc_output/d5d65fea-85bd-4682-8753-cd95b2fb397a.json +1 -0
  2. package/.nyc_output/processinfo/{0553c492-d66d-4588-be20-d4a284e17ff7.json → 75f3e742-9c3d-4937-adad-ed712149983a.json} +1 -1
  3. package/.nyc_output/processinfo/{15c7e9a9-1ea9-4c86-8310-45fa6fc6e38b.json → a331cb1e-8707-469e-95be-5bc65de3f692.json} +1 -1
  4. package/.nyc_output/processinfo/d5d65fea-85bd-4682-8753-cd95b2fb397a.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -1
  6. package/.xunit +1 -1
  7. package/@types/components.sreact.d.ts +1 -1
  8. package/@types/inputs/component-input-markdown.d.ts +6 -0
  9. package/@types/jdd-creator.d.ts +2 -2
  10. package/assets/styles/markdown-editor.css +9 -39
  11. package/coverage/clover.xml +189 -253
  12. package/dist/src/inputs/component-input-markdown.js +49 -0
  13. package/dist/src/inputs/component-input-markdown.js.map +7 -0
  14. package/dist/src/inputs/component-input.js +7 -16
  15. package/dist/src/inputs/component-input.js.map +2 -2
  16. package/package.json +1 -1
  17. package/src/inputs/component-input-markdown.ts +58 -0
  18. package/src/inputs/component-input.ts +7 -17
  19. package/.nyc_output/51efb67f-ce86-4cce-8246-d293600e6ff2.json +0 -1
  20. package/.nyc_output/processinfo/51efb67f-ce86-4cce-8246-d293600e6ff2.json +0 -1
  21. package/@types/controllers/markdown-textarea.stimulus.d.ts +0 -20
  22. package/dist/src/controllers/markdown-textarea.stimulus.js +0 -174
  23. package/dist/src/controllers/markdown-textarea.stimulus.js.map +0 -7
  24. package/src/controllers/markdown-textarea.stimulus.ts +0 -198
  25. /package/.nyc_output/{0553c492-d66d-4588-be20-d4a284e17ff7.json → 75f3e742-9c3d-4937-adad-ed712149983a.json} +0 -0
  26. /package/.nyc_output/{15c7e9a9-1ea9-4c86-8310-45fa6fc6e38b.json → a331cb1e-8707-469e-95be-5bc65de3f692.json} +0 -0
@@ -1 +0,0 @@
1
- {"parent":null,"pid":1119164,"argv":["/home/kuba/.local/share/fnm/node-versions/v21.7.3/installation/bin/node","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/node_modules/.bin/nyc","--reporter","clover","mocha","--reporter","xunit","--reporter-option","output=.xunit"],"execArgv":[],"cwd":"/home/kuba/projects/sealcode/superseal/repos/jdd-editor","time":1770320339627,"ppid":1119153,"coverageFilename":"/home/kuba/projects/sealcode/superseal/repos/jdd-editor/.nyc_output/51efb67f-ce86-4cce-8246-d293600e6ff2.json","externalId":"","uuid":"51efb67f-ce86-4cce-8246-d293600e6ff2","files":["/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/component-preview-actions.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/components.sreact.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/autogrow-textarea.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/code-snippet.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/component-debugger.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/exportable-textarea.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/input-image-preview.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/jdd-table-paste.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/json-editor.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/markdown-textarea.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/refresh-on-ts-changes.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/refresh-styles.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/submit-on-input.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/controllers/toast.stimulus.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/edit-jdd-field.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/index.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-code-with-custom-language.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-code.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-color.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-enum.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-image.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-list.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-single-reference.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-structured.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input-table.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/component-input.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/inputs/print-arg-path.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/jdd-creator.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/jdd-page.ts","/home/kuba/projects/sealcode/superseal/repos/jdd-editor/src/test.test.ts"]}
@@ -1,20 +0,0 @@
1
- import { Controller } from "stimulus";
2
- import type { default as simplemde } from "simplemde";
3
- export default class MarkdownTextarea extends Controller<HTMLTextAreaElement> {
4
- sm: simplemde;
5
- checkboxHandler: (this: HTMLElement, ev: Event) => any;
6
- resizeObserver: ResizeObserver;
7
- intersectionObserver: IntersectionObserver;
8
- mdeStarted: boolean;
9
- addCSS(): void;
10
- addJS(): Promise<void>;
11
- handleResize(): void;
12
- connect(): Promise<void>;
13
- startMDE(): Promise<void>;
14
- init(): Promise<void>;
15
- isHiddenBlock(): boolean;
16
- isInsideComponentBlock(): false | HTMLDivElement;
17
- getCheckboxThatShowsBlock(): HTMLInputElement | null;
18
- setupRefreshOnShow(): void;
19
- disconnect(): void;
20
- }
@@ -1,174 +0,0 @@
1
- import { Controller } from "stimulus";
2
- const CSS_ID = "simplemde-css";
3
- const JS_ID = "simplemde-js";
4
- class MarkdownTextarea extends Controller {
5
- constructor() {
6
- super(...arguments);
7
- this.mdeStarted = false;
8
- }
9
- addCSS() {
10
- const tag = document.querySelector(`head #${CSS_ID}`);
11
- if (!tag) {
12
- const link = document.createElement("link");
13
- link.setAttribute("rel", "stylesheet");
14
- link.setAttribute("type", "text/css");
15
- link.setAttribute("id", CSS_ID);
16
- link.setAttribute("href", "/dist/simplemde.min.css");
17
- document.head.appendChild(link);
18
- }
19
- }
20
- async addJS() {
21
- return new Promise((resolve, reject) => {
22
- const once_loaded = (e) => {
23
- e.target.setAttribute("loaded", "true");
24
- resolve();
25
- };
26
- try {
27
- const tag = document.querySelector(`head #${JS_ID}`);
28
- if (!tag) {
29
- const script = document.createElement("script");
30
- script.setAttribute("id", JS_ID);
31
- script.setAttribute("src", "/dist/simplemde.min.js");
32
- script.addEventListener("load", once_loaded);
33
- document.head.appendChild(script);
34
- } else {
35
- if (tag.getAttribute("loaded") == "true") {
36
- resolve();
37
- } else {
38
- tag.addEventListener("load", once_loaded);
39
- }
40
- }
41
- } catch (e) {
42
- reject(e);
43
- }
44
- });
45
- }
46
- handleResize() {
47
- this.sm.codemirror.refresh();
48
- }
49
- async connect() {
50
- var _a, _b;
51
- console.log("Markdown connect!", this.element);
52
- if ((_a = this.element.parentNode) == null ? void 0 : _a.querySelector(".editor-toolbar")) {
53
- return;
54
- }
55
- this.addCSS();
56
- await this.addJS();
57
- const component_block = this.isInsideComponentBlock();
58
- if (component_block) {
59
- if (this.isHiddenBlock()) {
60
- const handler = () => {
61
- var _a2;
62
- (_a2 = this.getCheckboxThatShowsBlock()) == null ? void 0 : _a2.removeEventListener(
63
- "change",
64
- handler
65
- );
66
- setTimeout(() => this.init(), 1);
67
- };
68
- (_b = this.getCheckboxThatShowsBlock()) == null ? void 0 : _b.addEventListener(
69
- "change",
70
- handler
71
- );
72
- } else {
73
- await this.init();
74
- }
75
- } else {
76
- await this.init();
77
- }
78
- }
79
- async startMDE() {
80
- if (this.mdeStarted) {
81
- return;
82
- }
83
- this.sm = new SimpleMDE({
84
- element: this.element,
85
- autoDownloadFontAwesome: false,
86
- spellChecker: false,
87
- hideIcons: ["image", "preview", "side-by-side"],
88
- status: ["words"],
89
- autosave: { enabled: false },
90
- forceSync: true,
91
- initialValue: this.element.value
92
- });
93
- this.sm.codemirror.on("change", () => {
94
- this.element.dispatchEvent(new Event("input"));
95
- });
96
- this.setupRefreshOnShow();
97
- this.resizeObserver = new ResizeObserver(() => {
98
- this.sm.codemirror.refresh();
99
- });
100
- const wrapper = this.sm.element.closest(
101
- ".grow-wrap"
102
- );
103
- this.resizeObserver.observe(wrapper);
104
- document.addEventListener(
105
- "turbo:before-morph-element",
106
- function(event) {
107
- const target = event.target;
108
- if (target == wrapper && event.detail.newElement !== void 0) {
109
- event.preventDefault();
110
- }
111
- }
112
- );
113
- this.mdeStarted = true;
114
- }
115
- async init() {
116
- this.intersectionObserver = new IntersectionObserver(
117
- (entries) => {
118
- entries.forEach((entry) => {
119
- if (entry.intersectionRatio > 0.2) {
120
- void this.startMDE();
121
- }
122
- });
123
- },
124
- {
125
- root: this.element.closest(".component-arguments"),
126
- rootMargin: "0px",
127
- threshold: 0.25
128
- }
129
- );
130
- this.intersectionObserver.observe(this.element);
131
- }
132
- isHiddenBlock() {
133
- var _a;
134
- return !((_a = this.getCheckboxThatShowsBlock()) == null ? void 0 : _a.checked);
135
- }
136
- isInsideComponentBlock() {
137
- return this.element.closest(".jdd-editor__component-block");
138
- }
139
- getCheckboxThatShowsBlock() {
140
- const block = this.isInsideComponentBlock();
141
- if (!block) {
142
- return null;
143
- }
144
- return block.querySelector(".component-collapse-toggle");
145
- }
146
- setupRefreshOnShow() {
147
- var _a;
148
- this.checkboxHandler = (e) => {
149
- const target = e.target;
150
- if (target.checked) {
151
- this.sm.codemirror.refresh();
152
- }
153
- };
154
- (_a = this.getCheckboxThatShowsBlock()) == null ? void 0 : _a.addEventListener(
155
- "change",
156
- this.checkboxHandler
157
- );
158
- }
159
- disconnect() {
160
- var _a, _b, _c;
161
- console.log("disconnecting", this.element);
162
- (_a = this.getCheckboxThatShowsBlock()) == null ? void 0 : _a.removeEventListener(
163
- "change",
164
- this.checkboxHandler
165
- );
166
- (_b = this.element.closest(".grow-wrap")) == null ? void 0 : _b.removeAttribute("data-turbo-permanent");
167
- (_c = this.resizeObserver) == null ? void 0 : _c.unobserve(this.sm.element);
168
- this.sm.toTextArea();
169
- }
170
- }
171
- export {
172
- MarkdownTextarea as default
173
- };
174
- //# sourceMappingURL=markdown-textarea.stimulus.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/controllers/markdown-textarea.stimulus.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-misused-promises */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Controller } from \"stimulus\";\nimport type { default as simplemde } from \"simplemde\";\n\nconst CSS_ID = \"simplemde-css\";\nconst JS_ID = \"simplemde-js\";\n\ndeclare const SimpleMDE: simplemde;\n\nexport default class MarkdownTextarea extends Controller<HTMLTextAreaElement> {\n\tsm: simplemde;\n\tcheckboxHandler: (this: HTMLElement, ev: Event) => any;\n\tresizeObserver: ResizeObserver;\n\tintersectionObserver: IntersectionObserver;\n\tmdeStarted = false;\n\n\taddCSS() {\n\t\tconst tag = document.querySelector(`head #${CSS_ID}`);\n\t\tif (!tag) {\n\t\t\tconst link = document.createElement(\"link\");\n\t\t\tlink.setAttribute(\"rel\", \"stylesheet\");\n\t\t\tlink.setAttribute(\"type\", \"text/css\");\n\t\t\tlink.setAttribute(\"id\", CSS_ID);\n\t\t\tlink.setAttribute(\"href\", \"/dist/simplemde.min.css\");\n\t\t\tdocument.head.appendChild(link);\n\t\t}\n\t}\n\n\tasync addJS() {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst once_loaded = (e: MouseEvent) => {\n\t\t\t\t(e.target as HTMLScriptElement).setAttribute(\"loaded\", \"true\");\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tconst tag = document.querySelector(`head #${JS_ID}`);\n\t\t\t\tif (!tag) {\n\t\t\t\t\tconst script = document.createElement(\"script\");\n\t\t\t\t\tscript.setAttribute(\"id\", JS_ID);\n\t\t\t\t\tscript.setAttribute(\"src\", \"/dist/simplemde.min.js\");\n\t\t\t\t\tscript.addEventListener(\"load\", once_loaded);\n\t\t\t\t\tdocument.head.appendChild(script);\n\t\t\t\t} else {\n\t\t\t\t\tif (tag.getAttribute(\"loaded\") == \"true\") {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag.addEventListener(\"load\", once_loaded);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\t}\n\n\thandleResize() {\n\t\tthis.sm.codemirror.refresh();\n\t}\n\n\tasync connect() {\n\t\tconsole.log(\"Markdown connect!\", this.element);\n\t\tif (this.element.parentNode?.querySelector(\".editor-toolbar\")) {\n\t\t\t//already loaded, quit;\n\t\t\treturn;\n\t\t}\n\t\tthis.addCSS();\n\t\tawait this.addJS();\n\t\tconst component_block = this.isInsideComponentBlock();\n\n\t\t// some offloading of starting the MDE, because it is slow on Chrome\n\t\tif (component_block) {\n\t\t\tif (this.isHiddenBlock()) {\n\t\t\t\tconst handler = () => {\n\t\t\t\t\tthis.getCheckboxThatShowsBlock()?.removeEventListener(\n\t\t\t\t\t\t\"change\",\n\t\t\t\t\t\thandler\n\t\t\t\t\t);\n\t\t\t\t\tsetTimeout(() => this.init(), 1);\n\t\t\t\t};\n\t\t\t\tthis.getCheckboxThatShowsBlock()?.addEventListener(\n\t\t\t\t\t\"change\",\n\t\t\t\t\thandler\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait this.init();\n\t\t\t}\n\t\t} else {\n\t\t\tawait this.init();\n\t\t}\n\t}\n\n\tasync startMDE() {\n\t\tif (this.mdeStarted) {\n\t\t\treturn;\n\t\t}\n\t\tthis.sm = new (SimpleMDE as any)({\n\t\t\telement: this.element,\n\t\t\tautoDownloadFontAwesome: false,\n\t\t\tspellChecker: false,\n\t\t\thideIcons: [\"image\", \"preview\", \"side-by-side\"],\n\t\t\tstatus: [\"words\"],\n\t\t\tautosave: { enabled: false },\n\t\t\tforceSync: true, // for autosubmit to work\n\t\t\tinitialValue: this.element.value,\n\t\t}) as simplemde;\n\t\t// this.element.closest(\".grow-wrap\").setAttribute(\"data-turbo-permanent\", \"\");\n\t\tthis.sm.codemirror.on(\"change\", () => {\n\t\t\tthis.element.dispatchEvent(new Event(\"input\"));\n\t\t});\n\t\tthis.setupRefreshOnShow();\n\t\tthis.resizeObserver = new ResizeObserver(() => {\n\t\t\tthis.sm.codemirror.refresh();\n\t\t});\n\t\tconst wrapper = (this.sm as any).element.closest(\n\t\t\t\".grow-wrap\"\n\t\t) as HTMLDivElement;\n\t\tthis.resizeObserver.observe(wrapper);\n\t\tdocument.addEventListener(\n\t\t\t\"turbo:before-morph-element\",\n\t\t\tfunction (event: BeforeUnloadEvent) {\n\t\t\t\tconst target = event.target as HTMLDivElement;\n\t\t\t\t// disallow morphing, but allow removing\n\t\t\t\tif (\n\t\t\t\t\ttarget == wrapper &&\n\t\t\t\t\t(event as any).detail.newElement !== undefined\n\t\t\t\t) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tthis.mdeStarted = true;\n\t}\n\n\tasync init() {\n\t\tthis.intersectionObserver = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\tif (entry.intersectionRatio > 0.2) {\n\t\t\t\t\t\tvoid this.startMDE();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\t{\n\t\t\t\troot: this.element.closest(\".component-arguments\"),\n\t\t\t\trootMargin: \"0px\",\n\t\t\t\tthreshold: 0.25,\n\t\t\t}\n\t\t);\n\t\tthis.intersectionObserver.observe(this.element);\n\t}\n\n\tisHiddenBlock() {\n\t\treturn !this.getCheckboxThatShowsBlock()?.checked;\n\t}\n\n\tisInsideComponentBlock(): false | HTMLDivElement {\n\t\treturn this.element.closest(\".jdd-editor__component-block\") as\n\t\t\t| HTMLDivElement\n\t\t\t| false;\n\t}\n\n\tgetCheckboxThatShowsBlock(): HTMLInputElement | null {\n\t\tconst block = this.isInsideComponentBlock();\n\t\tif (!block) {\n\t\t\treturn null;\n\t\t}\n\t\treturn block.querySelector(\".component-collapse-toggle\");\n\t}\n\n\tsetupRefreshOnShow() {\n\t\tthis.checkboxHandler = (e) => {\n\t\t\tconst target = e.target as HTMLInputElement;\n\t\t\tif (target.checked) {\n\t\t\t\tthis.sm.codemirror.refresh();\n\t\t\t}\n\t\t};\n\t\tthis.getCheckboxThatShowsBlock()?.addEventListener(\n\t\t\t\"change\",\n\t\t\tthis.checkboxHandler\n\t\t);\n\t}\n\n\tdisconnect() {\n\t\tconsole.log(\"disconnecting\", this.element);\n\t\tthis.getCheckboxThatShowsBlock()?.removeEventListener(\n\t\t\t\"change\",\n\t\t\tthis.checkboxHandler\n\t\t);\n\t\tthis.element\n\t\t\t.closest(\".grow-wrap\")\n\t\t\t?.removeAttribute(\"data-turbo-permanent\");\n\t\tthis.resizeObserver?.unobserve((this.sm as any).element as HTMLElement);\n\t\tthis.sm.toTextArea();\n\t}\n}\n"],
5
- "mappings": "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",
6
- "names": ["_a"]
7
- }
@@ -1,198 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-misused-promises */
2
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
- /* eslint-disable @typescript-eslint/no-unsafe-call */
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
5
- import { Controller } from "stimulus";
6
- import type { default as simplemde } from "simplemde";
7
-
8
- const CSS_ID = "simplemde-css";
9
- const JS_ID = "simplemde-js";
10
-
11
- declare const SimpleMDE: simplemde;
12
-
13
- export default class MarkdownTextarea extends Controller<HTMLTextAreaElement> {
14
- sm: simplemde;
15
- checkboxHandler: (this: HTMLElement, ev: Event) => any;
16
- resizeObserver: ResizeObserver;
17
- intersectionObserver: IntersectionObserver;
18
- mdeStarted = false;
19
-
20
- addCSS() {
21
- const tag = document.querySelector(`head #${CSS_ID}`);
22
- if (!tag) {
23
- const link = document.createElement("link");
24
- link.setAttribute("rel", "stylesheet");
25
- link.setAttribute("type", "text/css");
26
- link.setAttribute("id", CSS_ID);
27
- link.setAttribute("href", "/dist/simplemde.min.css");
28
- document.head.appendChild(link);
29
- }
30
- }
31
-
32
- async addJS() {
33
- return new Promise<void>((resolve, reject) => {
34
- const once_loaded = (e: MouseEvent) => {
35
- (e.target as HTMLScriptElement).setAttribute("loaded", "true");
36
- resolve();
37
- };
38
- try {
39
- const tag = document.querySelector(`head #${JS_ID}`);
40
- if (!tag) {
41
- const script = document.createElement("script");
42
- script.setAttribute("id", JS_ID);
43
- script.setAttribute("src", "/dist/simplemde.min.js");
44
- script.addEventListener("load", once_loaded);
45
- document.head.appendChild(script);
46
- } else {
47
- if (tag.getAttribute("loaded") == "true") {
48
- resolve();
49
- } else {
50
- tag.addEventListener("load", once_loaded);
51
- }
52
- }
53
- } catch (e) {
54
- reject(e);
55
- }
56
- });
57
- }
58
-
59
- handleResize() {
60
- this.sm.codemirror.refresh();
61
- }
62
-
63
- async connect() {
64
- console.log("Markdown connect!", this.element);
65
- if (this.element.parentNode?.querySelector(".editor-toolbar")) {
66
- //already loaded, quit;
67
- return;
68
- }
69
- this.addCSS();
70
- await this.addJS();
71
- const component_block = this.isInsideComponentBlock();
72
-
73
- // some offloading of starting the MDE, because it is slow on Chrome
74
- if (component_block) {
75
- if (this.isHiddenBlock()) {
76
- const handler = () => {
77
- this.getCheckboxThatShowsBlock()?.removeEventListener(
78
- "change",
79
- handler
80
- );
81
- setTimeout(() => this.init(), 1);
82
- };
83
- this.getCheckboxThatShowsBlock()?.addEventListener(
84
- "change",
85
- handler
86
- );
87
- } else {
88
- await this.init();
89
- }
90
- } else {
91
- await this.init();
92
- }
93
- }
94
-
95
- async startMDE() {
96
- if (this.mdeStarted) {
97
- return;
98
- }
99
- this.sm = new (SimpleMDE as any)({
100
- element: this.element,
101
- autoDownloadFontAwesome: false,
102
- spellChecker: false,
103
- hideIcons: ["image", "preview", "side-by-side"],
104
- status: ["words"],
105
- autosave: { enabled: false },
106
- forceSync: true, // for autosubmit to work
107
- initialValue: this.element.value,
108
- }) as simplemde;
109
- // this.element.closest(".grow-wrap").setAttribute("data-turbo-permanent", "");
110
- this.sm.codemirror.on("change", () => {
111
- this.element.dispatchEvent(new Event("input"));
112
- });
113
- this.setupRefreshOnShow();
114
- this.resizeObserver = new ResizeObserver(() => {
115
- this.sm.codemirror.refresh();
116
- });
117
- const wrapper = (this.sm as any).element.closest(
118
- ".grow-wrap"
119
- ) as HTMLDivElement;
120
- this.resizeObserver.observe(wrapper);
121
- document.addEventListener(
122
- "turbo:before-morph-element",
123
- function (event: BeforeUnloadEvent) {
124
- const target = event.target as HTMLDivElement;
125
- // disallow morphing, but allow removing
126
- if (
127
- target == wrapper &&
128
- (event as any).detail.newElement !== undefined
129
- ) {
130
- event.preventDefault();
131
- }
132
- }
133
- );
134
- this.mdeStarted = true;
135
- }
136
-
137
- async init() {
138
- this.intersectionObserver = new IntersectionObserver(
139
- (entries) => {
140
- entries.forEach((entry) => {
141
- if (entry.intersectionRatio > 0.2) {
142
- void this.startMDE();
143
- }
144
- });
145
- },
146
- {
147
- root: this.element.closest(".component-arguments"),
148
- rootMargin: "0px",
149
- threshold: 0.25,
150
- }
151
- );
152
- this.intersectionObserver.observe(this.element);
153
- }
154
-
155
- isHiddenBlock() {
156
- return !this.getCheckboxThatShowsBlock()?.checked;
157
- }
158
-
159
- isInsideComponentBlock(): false | HTMLDivElement {
160
- return this.element.closest(".jdd-editor__component-block") as
161
- | HTMLDivElement
162
- | false;
163
- }
164
-
165
- getCheckboxThatShowsBlock(): HTMLInputElement | null {
166
- const block = this.isInsideComponentBlock();
167
- if (!block) {
168
- return null;
169
- }
170
- return block.querySelector(".component-collapse-toggle");
171
- }
172
-
173
- setupRefreshOnShow() {
174
- this.checkboxHandler = (e) => {
175
- const target = e.target as HTMLInputElement;
176
- if (target.checked) {
177
- this.sm.codemirror.refresh();
178
- }
179
- };
180
- this.getCheckboxThatShowsBlock()?.addEventListener(
181
- "change",
182
- this.checkboxHandler
183
- );
184
- }
185
-
186
- disconnect() {
187
- console.log("disconnecting", this.element);
188
- this.getCheckboxThatShowsBlock()?.removeEventListener(
189
- "change",
190
- this.checkboxHandler
191
- );
192
- this.element
193
- .closest(".grow-wrap")
194
- ?.removeAttribute("data-turbo-permanent");
195
- this.resizeObserver?.unobserve((this.sm as any).element as HTMLElement);
196
- this.sm.toTextArea();
197
- }
198
- }