@sealcode/jdd-editor 0.1.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 (192) hide show
  1. package/.arcconfig +12 -0
  2. package/.arclint +18 -0
  3. package/.eslintrc.js +37 -0
  4. package/.mocharc.js +6 -0
  5. package/.nycrc +6 -0
  6. package/.prettierrc +14 -0
  7. package/@types/component-preview-actions.d.ts +43 -0
  8. package/@types/components.sreact.d.ts +48 -0
  9. package/@types/controllers/autogrow-textarea.stimulus.d.ts +5 -0
  10. package/@types/controllers/component-debugger.stimulus.d.ts +28 -0
  11. package/@types/controllers/exportable-textarea.stimulus.d.ts +7 -0
  12. package/@types/controllers/input-image-preview.stimulus.d.ts +5 -0
  13. package/@types/controllers/jdd-table-paste.stimulus.d.ts +8 -0
  14. package/@types/controllers/json-editor.stimulus.d.ts +9 -0
  15. package/@types/controllers/markdown-textarea.stimulus.d.ts +20 -0
  16. package/@types/controllers/refresh-on-ts-changes.stimulus.d.ts +6 -0
  17. package/@types/controllers/refresh-styles.stimulus.d.ts +6 -0
  18. package/@types/controllers/submit-on-input.stimulus.d.ts +7 -0
  19. package/@types/controllers/toast.stimulus.d.ts +4 -0
  20. package/@types/edit-jdd-field.d.ts +22 -0
  21. package/@types/index.d.ts +2 -0
  22. package/@types/inputs/component-input-enum.d.ts +8 -0
  23. package/@types/inputs/component-input-image.d.ts +15 -0
  24. package/@types/inputs/component-input-list.d.ts +15 -0
  25. package/@types/inputs/component-input-single-reference.d.ts +11 -0
  26. package/@types/inputs/component-input-structured.d.ts +15 -0
  27. package/@types/inputs/component-input-table.d.ts +15 -0
  28. package/@types/inputs/component-input.d.ts +16 -0
  29. package/@types/inputs/print-arg-path.d.ts +1 -0
  30. package/@types/jdd-creator.d.ts +49 -0
  31. package/@types/jdd-page.d.ts +85 -0
  32. package/assets/icons/table-add-column-right.svg +1 -0
  33. package/assets/icons/table-add-row-below.svg +1 -0
  34. package/assets/icons/table-add-row-header-below.svg +1 -0
  35. package/assets/icons/table-delete-column.svg +1 -0
  36. package/assets/icons/table-delete-row.svg +1 -0
  37. package/assets/icons/table-move-column-right.svg +1 -0
  38. package/assets/icons/table-move-row-down.svg +1 -0
  39. package/assets/icons/table-move-row-up.svg +1 -0
  40. package/assets/styles/component-admin-table.jdd-page.css +11 -0
  41. package/assets/styles/component-debugger.jdd-page.css +71 -0
  42. package/assets/styles/components.jdd-page.css +286 -0
  43. package/assets/styles/grow-wrap.css +33 -0
  44. package/assets/styles/markdown-editor.css +42 -0
  45. package/dist/src/autogrow-textarea.stimulus.js +13 -0
  46. package/dist/src/autogrow-textarea.stimulus.js.map +7 -0
  47. package/dist/src/component-debugger.stimulus.js +190 -0
  48. package/dist/src/component-debugger.stimulus.js.map +7 -0
  49. package/dist/src/component-preview-actions.js +439 -0
  50. package/dist/src/component-preview-actions.js.map +7 -0
  51. package/dist/src/components.sreact.js +93 -0
  52. package/dist/src/components.sreact.js.map +7 -0
  53. package/dist/src/controllers/autogrow-textarea.stimulus.js +13 -0
  54. package/dist/src/controllers/autogrow-textarea.stimulus.js.map +7 -0
  55. package/dist/src/controllers/component-debugger.stimulus.js +193 -0
  56. package/dist/src/controllers/component-debugger.stimulus.js.map +7 -0
  57. package/dist/src/controllers/exportable-textarea.stimulus.js +71 -0
  58. package/dist/src/controllers/exportable-textarea.stimulus.js.map +7 -0
  59. package/dist/src/controllers/input-image-preview.stimulus.js +30 -0
  60. package/dist/src/controllers/input-image-preview.stimulus.js.map +7 -0
  61. package/dist/src/controllers/jdd-table-paste.stimulus.js +78 -0
  62. package/dist/src/controllers/jdd-table-paste.stimulus.js.map +7 -0
  63. package/dist/src/controllers/json-editor.stimulus.js +114 -0
  64. package/dist/src/controllers/json-editor.stimulus.js.map +7 -0
  65. package/dist/src/controllers/markdown-textarea.stimulus.js +174 -0
  66. package/dist/src/controllers/markdown-textarea.stimulus.js.map +7 -0
  67. package/dist/src/controllers/refresh-on-ts-changes.stimulus.js +90 -0
  68. package/dist/src/controllers/refresh-on-ts-changes.stimulus.js.map +7 -0
  69. package/dist/src/controllers/refresh-styles.stimulus.js +67 -0
  70. package/dist/src/controllers/refresh-styles.stimulus.js.map +7 -0
  71. package/dist/src/controllers/submit-on-input.stimulus.js +55 -0
  72. package/dist/src/controllers/submit-on-input.stimulus.js.map +7 -0
  73. package/dist/src/controllers/toast.stimulus.js +19 -0
  74. package/dist/src/controllers/toast.stimulus.js.map +7 -0
  75. package/dist/src/edit-jdd-field.js +94 -0
  76. package/dist/src/edit-jdd-field.js.map +7 -0
  77. package/dist/src/exportable-textarea.stimulus.js +71 -0
  78. package/dist/src/exportable-textarea.stimulus.js.map +7 -0
  79. package/dist/src/index.js +3 -0
  80. package/dist/src/index.js.map +7 -0
  81. package/dist/src/input-image-preview.stimulus.js +30 -0
  82. package/dist/src/input-image-preview.stimulus.js.map +7 -0
  83. package/dist/src/inputs/component-input-enum.js +30 -0
  84. package/dist/src/inputs/component-input-enum.js.map +7 -0
  85. package/dist/src/inputs/component-input-image.js +58 -0
  86. package/dist/src/inputs/component-input-image.js.map +7 -0
  87. package/dist/src/inputs/component-input-list.js +74 -0
  88. package/dist/src/inputs/component-input-list.js.map +7 -0
  89. package/dist/src/inputs/component-input-single-reference.js +31 -0
  90. package/dist/src/inputs/component-input-single-reference.js.map +7 -0
  91. package/dist/src/inputs/component-input-structured.js +36 -0
  92. package/dist/src/inputs/component-input-structured.js.map +7 -0
  93. package/dist/src/inputs/component-input-table.js +228 -0
  94. package/dist/src/inputs/component-input-table.js.map +7 -0
  95. package/dist/src/inputs/component-input.js +129 -0
  96. package/dist/src/inputs/component-input.js.map +7 -0
  97. package/dist/src/inputs/print-arg-path.js +7 -0
  98. package/dist/src/inputs/print-arg-path.js.map +7 -0
  99. package/dist/src/jdd-creator.js +131 -0
  100. package/dist/src/jdd-creator.js.map +7 -0
  101. package/dist/src/jdd-page.js +339 -0
  102. package/dist/src/jdd-page.js.map +7 -0
  103. package/dist/src/jdd-table-paste.stimulus.js +78 -0
  104. package/dist/src/jdd-table-paste.stimulus.js.map +7 -0
  105. package/dist/src/json-editor.stimulus.js +114 -0
  106. package/dist/src/json-editor.stimulus.js.map +7 -0
  107. package/dist/src/markdown-textarea.stimulus.js +174 -0
  108. package/dist/src/markdown-textarea.stimulus.js.map +7 -0
  109. package/dist/src/submit-on-input.stimulus.js +55 -0
  110. package/dist/src/submit-on-input.stimulus.js.map +7 -0
  111. package/dist/src/toast.stimulus.js +19 -0
  112. package/dist/src/toast.stimulus.js.map +7 -0
  113. package/esbuild.cjs +20 -0
  114. package/esbuild.js +23 -0
  115. package/jenkins.sanity.sh +3 -0
  116. package/lib/component-preview-actions.js +286 -0
  117. package/lib/component-preview-actions.js.map +1 -0
  118. package/lib/components.sreact.js +102 -0
  119. package/lib/components.sreact.js.map +1 -0
  120. package/lib/controllers/autogrow-textarea.stimulus.js +15 -0
  121. package/lib/controllers/autogrow-textarea.stimulus.js.map +1 -0
  122. package/lib/controllers/component-debugger.stimulus.js +188 -0
  123. package/lib/controllers/component-debugger.stimulus.js.map +1 -0
  124. package/lib/controllers/exportable-textarea.stimulus.js +79 -0
  125. package/lib/controllers/exportable-textarea.stimulus.js.map +1 -0
  126. package/lib/controllers/input-image-preview.stimulus.js +28 -0
  127. package/lib/controllers/input-image-preview.stimulus.js.map +1 -0
  128. package/lib/controllers/jdd-table-paste.stimulus.js +84 -0
  129. package/lib/controllers/jdd-table-paste.stimulus.js.map +1 -0
  130. package/lib/controllers/json-editor.stimulus.js +134 -0
  131. package/lib/controllers/json-editor.stimulus.js.map +1 -0
  132. package/lib/controllers/markdown-textarea.stimulus.js +186 -0
  133. package/lib/controllers/markdown-textarea.stimulus.js.map +1 -0
  134. package/lib/controllers/refresh-on-ts-changes.stimulus.js +123 -0
  135. package/lib/controllers/refresh-on-ts-changes.stimulus.js.map +1 -0
  136. package/lib/controllers/refresh-styles.stimulus.js +66 -0
  137. package/lib/controllers/refresh-styles.stimulus.js.map +1 -0
  138. package/lib/controllers/submit-on-input.stimulus.js +48 -0
  139. package/lib/controllers/submit-on-input.stimulus.js.map +1 -0
  140. package/lib/controllers/toast.stimulus.js +16 -0
  141. package/lib/controllers/toast.stimulus.js.map +1 -0
  142. package/lib/edit-jdd-field.js +102 -0
  143. package/lib/edit-jdd-field.js.map +1 -0
  144. package/lib/index.js +19 -0
  145. package/lib/index.js.map +1 -0
  146. package/lib/inputs/component-input-enum.js +25 -0
  147. package/lib/inputs/component-input-enum.js.map +1 -0
  148. package/lib/inputs/component-input-image.js +47 -0
  149. package/lib/inputs/component-input-image.js.map +1 -0
  150. package/lib/inputs/component-input-list.js +61 -0
  151. package/lib/inputs/component-input-list.js.map +1 -0
  152. package/lib/inputs/component-input-single-reference.js +36 -0
  153. package/lib/inputs/component-input-single-reference.js.map +1 -0
  154. package/lib/inputs/component-input-structured.js +42 -0
  155. package/lib/inputs/component-input-structured.js.map +1 -0
  156. package/lib/inputs/component-input-table.js +184 -0
  157. package/lib/inputs/component-input-table.js.map +1 -0
  158. package/lib/inputs/component-input.js +133 -0
  159. package/lib/inputs/component-input.js.map +1 -0
  160. package/lib/inputs/print-arg-path.js +7 -0
  161. package/lib/inputs/print-arg-path.js.map +1 -0
  162. package/lib/jdd-creator.js +113 -0
  163. package/lib/jdd-creator.js.map +1 -0
  164. package/lib/jdd-page.js +310 -0
  165. package/lib/jdd-page.js.map +1 -0
  166. package/package.json +61 -0
  167. package/src/component-preview-actions.ts +520 -0
  168. package/src/components.sreact.ts +100 -0
  169. package/src/controllers/autogrow-textarea.stimulus.ts +13 -0
  170. package/src/controllers/component-debugger.stimulus.ts +247 -0
  171. package/src/controllers/exportable-textarea.stimulus.ts +77 -0
  172. package/src/controllers/input-image-preview.stimulus.ts +29 -0
  173. package/src/controllers/jdd-table-paste.stimulus.ts +89 -0
  174. package/src/controllers/json-editor.stimulus.ts +127 -0
  175. package/src/controllers/markdown-textarea.stimulus.ts +198 -0
  176. package/src/controllers/refresh-on-ts-changes.stimulus.ts +112 -0
  177. package/src/controllers/refresh-styles.stimulus.ts +70 -0
  178. package/src/controllers/submit-on-input.stimulus.ts +66 -0
  179. package/src/controllers/toast.stimulus.ts +15 -0
  180. package/src/edit-jdd-field.ts +127 -0
  181. package/src/index.ts +2 -0
  182. package/src/inputs/component-input-enum.ts +36 -0
  183. package/src/inputs/component-input-image.ts +70 -0
  184. package/src/inputs/component-input-list.ts +91 -0
  185. package/src/inputs/component-input-single-reference.ts +45 -0
  186. package/src/inputs/component-input-structured.ts +51 -0
  187. package/src/inputs/component-input-table.ts +262 -0
  188. package/src/inputs/component-input.ts +158 -0
  189. package/src/inputs/print-arg-path.ts +3 -0
  190. package/src/jdd-creator.ts +151 -0
  191. package/src/jdd-page.ts +439 -0
  192. package/tsconfig.json +24 -0
@@ -0,0 +1,193 @@
1
+ import { Controller } from "stimulus";
2
+ class ComponentDebugger extends Controller {
3
+ connect() {
4
+ var _a;
5
+ const main_form = (_a = document.querySelector("#component-debugger")) == null ? void 0 : _a.closest("form");
6
+ if (!main_form) {
7
+ throw new Error("No main form");
8
+ }
9
+ this.main_form = main_form;
10
+ document.documentElement.addEventListener("ts-rebuilt", () => {
11
+ this.main_form.requestSubmit();
12
+ });
13
+ this.main_form.addEventListener("turbo:submit-end", () => {
14
+ this.main_form.querySelectorAll("input[type=file]").forEach((input) => input.value = "");
15
+ });
16
+ window.addEventListener("load", () => {
17
+ this.update_width_display();
18
+ });
19
+ document.addEventListener("turbo:render", () => {
20
+ });
21
+ const gutter = this.gutterTarget;
22
+ gutter.addEventListener("mousedown", (e) => {
23
+ this.origin_x = e.clientX;
24
+ const resizable = this.targets.find("preview");
25
+ this.origin_width = resizable.getBoundingClientRect().width;
26
+ const handler = (e2) => this.resizeHandler(e2);
27
+ document.addEventListener("mousemove", handler);
28
+ const remove_move_listener = () => {
29
+ document.removeEventListener("mousemove", handler);
30
+ document.removeEventListener("mouseup", remove_move_listener);
31
+ document.dispatchEvent(
32
+ new Event("component-debugger--resize-done")
33
+ );
34
+ };
35
+ document.addEventListener("mouseup", remove_move_listener);
36
+ e.preventDefault();
37
+ });
38
+ }
39
+ update_width_display() {
40
+ console.log("uwd");
41
+ const preview = this.targets.find("preview");
42
+ const component_width = preview.offsetWidth;
43
+ this.sizeSelectTarget.querySelectorAll("option").forEach((e) => e.removeAttribute("selected"));
44
+ let option = this.sizeSelectTarget.querySelector("option.dynamic");
45
+ if (!option) {
46
+ option = document.createElement("option");
47
+ option.classList.add("dynamic");
48
+ option.setAttribute("selected", "");
49
+ this.sizeSelectTarget.insertBefore(
50
+ option,
51
+ this.sizeSelectTarget.childNodes[0]
52
+ );
53
+ }
54
+ option.setAttribute("selected", "");
55
+ option.innerHTML = `${component_width} px`;
56
+ option.value = String(component_width);
57
+ this.sizeSelectTarget.value = String(component_width);
58
+ }
59
+ resizeHandler(e) {
60
+ const width_offset = this.origin_x - e.clientX;
61
+ const new_width = Math.max(this.origin_width + width_offset, 1);
62
+ this.setPreviewWidth(new_width);
63
+ this.update_width_display();
64
+ document.dispatchEvent(new Event("component-debugger--resize"));
65
+ }
66
+ setPreviewWidth(width) {
67
+ var _a;
68
+ (_a = document.getElementById("component-debugger")) == null ? void 0 : _a.style.setProperty(
69
+ "--resizable-column-width",
70
+ width.toString() + "px"
71
+ );
72
+ this.update_width_display();
73
+ }
74
+ handleWidthDropdown() {
75
+ const value = this.sizeSelectTarget.value;
76
+ this.setPreviewWidth(parseInt(value));
77
+ }
78
+ handleBlockHover(e) {
79
+ var _a, _b;
80
+ const index = parseInt(
81
+ ((_a = e.target.closest(".jdd-editor__component-block")) == null ? void 0 : _a.getAttribute("data-component-index")) || "0"
82
+ );
83
+ (_b = this.element.querySelector(`.component-number-${index}`)) == null ? void 0 : _b.classList.add("highlighted");
84
+ }
85
+ handleBlockUnhover(e) {
86
+ var _a;
87
+ const index = parseInt(
88
+ ((_a = e.target.closest(".jdd-editor__component-block")) == null ? void 0 : _a.getAttribute("data-component-index")) || ""
89
+ );
90
+ this.element.querySelectorAll(`.component-number-${index}.highlighted`).forEach((e2) => e2.classList.remove("highlighted"));
91
+ }
92
+ componentBlockTargetConnected(block_element) {
93
+ const index = parseInt(
94
+ block_element.getAttribute("data-component-index") || "0"
95
+ );
96
+ block_element.addEventListener("focusin", () => {
97
+ this.scrollToComponentPreview(index);
98
+ });
99
+ const summary = block_element.querySelector("summary");
100
+ if (summary) {
101
+ summary.addEventListener(
102
+ "mouseenter",
103
+ this.handleBlockHover.bind(this)
104
+ );
105
+ summary.addEventListener(
106
+ "mouseleave",
107
+ this.handleBlockUnhover.bind(this)
108
+ );
109
+ }
110
+ }
111
+ previewTargetConnected(preview_element) {
112
+ preview_element.addEventListener("click", ({ target }) => {
113
+ var _a;
114
+ if (!(target instanceof HTMLElement)) {
115
+ return;
116
+ }
117
+ const closest = target.closest(".jdd-component");
118
+ if (!closest) {
119
+ return;
120
+ }
121
+ const index = parseInt(
122
+ String(
123
+ (_a = Array.from(closest.classList).find((c) => c.startsWith("component-number-"))) == null ? void 0 : _a.replace("component-number-", "")
124
+ )
125
+ );
126
+ if (isNaN(index)) {
127
+ return;
128
+ }
129
+ this.focusComponentBlock(index);
130
+ });
131
+ }
132
+ focusComponentBlock(index) {
133
+ var _a;
134
+ const block = this.componentBlockTargets[index];
135
+ if (!block) {
136
+ return;
137
+ }
138
+ this.checkboxTargets[index].checked = true;
139
+ this.checkboxTargets[index].dispatchEvent(new Event("change"));
140
+ block.scrollIntoView({ behavior: "smooth" });
141
+ (_a = block.querySelector(
142
+ ".component-preview-parameters input"
143
+ )) == null ? void 0 : _a.focus();
144
+ }
145
+ getIndex(block_element) {
146
+ const index = parseInt(
147
+ String(block_element.getAttribute("data-component-index"))
148
+ );
149
+ return index;
150
+ }
151
+ labelClicked(element) {
152
+ var _a, _b;
153
+ const block_element = element.target.closest(
154
+ `[data-component-debugger-target="componentBlock"]`
155
+ );
156
+ const index = this.getIndex(block_element);
157
+ if (!((_b = (_a = this.checkboxTargets) == null ? void 0 : _a[index]) == null ? void 0 : _b.checked)) {
158
+ this.scrollToComponentPreview(index);
159
+ }
160
+ }
161
+ getPreviewElementForComponentIndex(index) {
162
+ const element = this.element.querySelector(
163
+ `.component-number-${index}`
164
+ );
165
+ return element;
166
+ }
167
+ scrollToComponentPreview(index) {
168
+ const element = this.getPreviewElementForComponentIndex(index);
169
+ if (!element) {
170
+ return;
171
+ }
172
+ const preview_element = this.element.querySelector(".component-preview");
173
+ if (!preview_element) {
174
+ throw new Error("Missing preview element!");
175
+ }
176
+ if (element.clientHeight > preview_element.clientHeight) {
177
+ preview_element.scrollTop = element.offsetTop - 44;
178
+ } else {
179
+ preview_element.scrollTop = element.offsetTop - (preview_element.clientHeight - element.clientHeight) / 2 - 44;
180
+ }
181
+ }
182
+ }
183
+ ComponentDebugger.targets = [
184
+ "gutter",
185
+ "componentBlock",
186
+ "checkbox",
187
+ "preview",
188
+ "sizeSelect"
189
+ ];
190
+ export {
191
+ ComponentDebugger as default
192
+ };
193
+ //# sourceMappingURL=component-debugger.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/controllers/component-debugger.stimulus.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\n/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\nimport { Controller } from \"stimulus\";\n\nexport default class ComponentDebugger extends Controller {\n\tdeclare sizeSelectTarget: HTMLSelectElement;\n\tdeclare gutterTarget: HTMLDivElement;\n\tdeclare checkboxTarget: HTMLInputElement;\n\tdeclare checkboxTargets: HTMLInputElement[];\n\tdeclare previewTarget: HTMLDivElement;\n\tdeclare componentBlockTargets: HTMLDivElement[];\n\tstatic targets = [\n\t\t\"gutter\",\n\t\t\"componentBlock\",\n\t\t\"checkbox\",\n\t\t\"preview\",\n\t\t\"sizeSelect\",\n\t];\n\n\tid: string;\n\tmain_form: HTMLFormElement;\n\torigin_x: number;\n\torigin_width: number;\n\n\tconnect() {\n\t\tconst main_form = document\n\t\t\t.querySelector(\"#component-debugger\")\n\t\t\t?.closest(\"form\");\n\t\tif (!main_form) {\n\t\t\tthrow new Error(\"No main form\");\n\t\t}\n\t\tthis.main_form = main_form;\n\t\tdocument.documentElement.addEventListener(\"ts-rebuilt\", () => {\n\t\t\tthis.main_form.requestSubmit();\n\t\t});\n\t\tthis.main_form.addEventListener(\"turbo:submit-end\", () => {\n\t\t\t// this clears the values of file inputs, so they don't get unecessarily\n\t\t\t// re-uploaded on future submissions - the file is alreade there on the server\n\t\t\tthis.main_form\n\t\t\t\t.querySelectorAll(\"input[type=file]\")\n\t\t\t\t.forEach((input: HTMLInputElement) => (input.value = \"\"));\n\t\t});\n\n\t\twindow.addEventListener(\"load\", () => {\n\t\t\tthis.update_width_display();\n\t\t});\n\t\tdocument.addEventListener(\"turbo:render\", () => {\n\t\t\t// not calling that to see if that improves performance\n\t\t\t// console.log(\"UWD because of render event\");\n\t\t\t// this.update_width_display();\n\t\t});\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst gutter = this.gutterTarget;\n\t\tgutter.addEventListener(\"mousedown\", (e) => {\n\t\t\tthis.origin_x = e.clientX;\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tconst resizable = this.targets.find(\"preview\") as HTMLSpanElement;\n\t\t\tthis.origin_width = resizable.getBoundingClientRect().width;\n\t\t\tconst handler = (e: MouseEvent) => this.resizeHandler(e);\n\t\t\tdocument.addEventListener(\"mousemove\", handler);\n\t\t\tconst remove_move_listener = () => {\n\t\t\t\tdocument.removeEventListener(\"mousemove\", handler);\n\t\t\t\tdocument.removeEventListener(\"mouseup\", remove_move_listener);\n\t\t\t\tdocument.dispatchEvent(\n\t\t\t\t\tnew Event(\"component-debugger--resize-done\")\n\t\t\t\t);\n\t\t\t};\n\t\t\tdocument.addEventListener(\"mouseup\", remove_move_listener);\n\t\t\te.preventDefault();\n\t\t});\n\t}\n\n\tupdate_width_display() {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconsole.log(\"uwd\");\n\t\tconst preview = this.targets.find(\"preview\") as HTMLSpanElement;\n\t\tconst component_width = preview.offsetWidth;\n\t\tthis.sizeSelectTarget\n\t\t\t.querySelectorAll(\"option\")\n\t\t\t.forEach((e) => e.removeAttribute(\"selected\"));\n\t\tlet option: HTMLOptionElement | null =\n\t\t\tthis.sizeSelectTarget.querySelector(\"option.dynamic\");\n\t\tif (!option) {\n\t\t\toption = document.createElement(\"option\");\n\t\t\toption.classList.add(\"dynamic\");\n\t\t\toption.setAttribute(\"selected\", \"\");\n\t\t\tthis.sizeSelectTarget.insertBefore(\n\t\t\t\toption,\n\t\t\t\tthis.sizeSelectTarget.childNodes[0]!\n\t\t\t);\n\t\t}\n\t\toption.setAttribute(\"selected\", \"\");\n\t\toption.innerHTML = `${component_width} px`;\n\t\toption.value = String(component_width);\n\t\tthis.sizeSelectTarget.value = String(component_width);\n\t}\n\n\tresizeHandler(e: MouseEvent) {\n\t\tconst width_offset = this.origin_x - e.clientX;\n\t\tconst new_width = Math.max(this.origin_width + width_offset, 1);\n\t\tthis.setPreviewWidth(new_width);\n\t\tthis.update_width_display();\n\t\tdocument.dispatchEvent(new Event(\"component-debugger--resize\"));\n\t}\n\n\tsetPreviewWidth(width: number) {\n\t\tdocument\n\t\t\t.getElementById(\"component-debugger\")\n\t\t\t?.style.setProperty(\n\t\t\t\t\"--resizable-column-width\",\n\t\t\t\twidth.toString() + \"px\"\n\t\t\t);\n\t\tthis.update_width_display();\n\t}\n\n\thandleWidthDropdown() {\n\t\tconst value = this.sizeSelectTarget.value;\n\t\tthis.setPreviewWidth(parseInt(value));\n\t}\n\n\thandleBlockHover(e: MouseEvent) {\n\t\tconst index = parseInt(\n\t\t\t(e.target as HTMLDivElement)\n\t\t\t\t.closest(\".jdd-editor__component-block\")\n\t\t\t\t?.getAttribute(\"data-component-index\") || \"0\"\n\t\t);\n\t\tthis.element\n\t\t\t.querySelector(`.component-number-${index}`)\n\t\t\t?.classList.add(\"highlighted\");\n\t}\n\n\thandleBlockUnhover(e: MouseEvent) {\n\t\tconst index = parseInt(\n\t\t\t(e.target as HTMLDivElement)\n\t\t\t\t.closest(\".jdd-editor__component-block\")\n\t\t\t\t?.getAttribute(\"data-component-index\") || \"\"\n\t\t);\n\t\tthis.element\n\t\t\t.querySelectorAll(`.component-number-${index}.highlighted`)\n\t\t\t.forEach((e) => e.classList.remove(\"highlighted\"));\n\t}\n\n\tcomponentBlockTargetConnected(block_element: HTMLDivElement) {\n\t\tconst index = parseInt(\n\t\t\tblock_element.getAttribute(\"data-component-index\") || \"0\"\n\t\t);\n\t\tblock_element.addEventListener(\"focusin\", () => {\n\t\t\tthis.scrollToComponentPreview(index);\n\t\t});\n\n\t\tconst summary = block_element.querySelector(\"summary\");\n\t\tif (summary) {\n\t\t\tsummary.addEventListener(\n\t\t\t\t\"mouseenter\",\n\t\t\t\tthis.handleBlockHover.bind(this)\n\t\t\t);\n\t\t\tsummary.addEventListener(\n\t\t\t\t\"mouseleave\",\n\t\t\t\tthis.handleBlockUnhover.bind(this)\n\t\t\t);\n\t\t}\n\t}\n\n\tpreviewTargetConnected(preview_element: HTMLDivElement) {\n\t\tpreview_element.addEventListener(\"click\", ({ target }) => {\n\t\t\tif (!(target instanceof HTMLElement)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst closest = target.closest(\".jdd-component\");\n\t\t\tif (!closest) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst index = parseInt(\n\t\t\t\tString(\n\t\t\t\t\tArray.from(closest.classList)\n\t\t\t\t\t\t.find((c) => c.startsWith(\"component-number-\"))\n\t\t\t\t\t\t?.replace(\"component-number-\", \"\")\n\t\t\t\t)\n\t\t\t);\n\t\t\tif (isNaN(index)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.focusComponentBlock(index);\n\t\t});\n\t}\n\n\tfocusComponentBlock(index: number) {\n\t\tconst block = this.componentBlockTargets[index];\n\t\tif (!block) {\n\t\t\treturn;\n\t\t}\n\t\tthis.checkboxTargets[index]!.checked = true;\n\t\tthis.checkboxTargets[index]!.dispatchEvent(new Event(\"change\")); // to help with refreshing markdown editor\n\t\tblock.scrollIntoView({ behavior: \"smooth\" });\n\t\t(\n\t\t\tblock.querySelector(\n\t\t\t\t\".component-preview-parameters input\"\n\t\t\t) as HTMLInputElement\n\t\t)?.focus();\n\t}\n\n\tgetIndex(block_element: HTMLDivElement) {\n\t\tconst index = parseInt(\n\t\t\tString(block_element.getAttribute(\"data-component-index\"))\n\t\t);\n\t\treturn index;\n\t}\n\n\tlabelClicked(element: MouseEvent) {\n\t\tconst block_element = (element.target as HTMLDivElement).closest(\n\t\t\t`[data-component-debugger-target=\"componentBlock\"]`\n\t\t) as HTMLDivElement;\n\t\tconst index = this.getIndex(block_element);\n\t\tif (!this.checkboxTargets?.[index]?.checked) {\n\t\t\tthis.scrollToComponentPreview(index);\n\t\t}\n\t}\n\n\tgetPreviewElementForComponentIndex(index: number) {\n\t\tconst element = this.element.querySelector(\n\t\t\t`.component-number-${index}`\n\t\t) as HTMLDialogElement;\n\t\treturn element;\n\t}\n\n\tscrollToComponentPreview(index: number) {\n\t\tconst element = this.getPreviewElementForComponentIndex(index);\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\t\tconst preview_element =\n\t\t\tthis.element.querySelector(\".component-preview\");\n\t\tif (!preview_element) {\n\t\t\tthrow new Error(\"Missing preview element!\");\n\t\t}\n\t\tif (element.clientHeight > preview_element.clientHeight) {\n\t\t\tpreview_element.scrollTop = element.offsetTop - 44;\n\t\t} else {\n\t\t\tpreview_element.scrollTop =\n\t\t\t\telement.offsetTop -\n\t\t\t\t(preview_element.clientHeight - element.clientHeight) / 2 -\n\t\t\t\t44;\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["e"]
7
+ }
@@ -0,0 +1,71 @@
1
+ import { Controller } from "stimulus";
2
+ function download(data, filename, type) {
3
+ const file = new Blob([data], { type });
4
+ const a = document.createElement("a"), url = URL.createObjectURL(file);
5
+ a.href = url;
6
+ a.download = filename;
7
+ document.body.appendChild(a);
8
+ a.click();
9
+ setTimeout(function() {
10
+ document.body.removeChild(a);
11
+ window.URL.revokeObjectURL(url);
12
+ }, 0);
13
+ }
14
+ class ExportableTextarea extends Controller {
15
+ connect() {
16
+ console.log("exportable", this.element);
17
+ this.element.removeAttribute("open");
18
+ this.element.addEventListener(
19
+ "turbo:before-morph-attribute",
20
+ (event) => {
21
+ if (event.target == this.element && event.detail.attributeName == "open") {
22
+ event.preventDefault();
23
+ }
24
+ }
25
+ );
26
+ }
27
+ async copy(e) {
28
+ e.preventDefault();
29
+ const textarea = this.element.querySelector("textarea");
30
+ if (!textarea) {
31
+ throw new Error("Couldn't find the textarea");
32
+ }
33
+ await navigator.clipboard.writeText(textarea.value);
34
+ e.target.textContent = "Copied";
35
+ await sleep(1e3);
36
+ e.target.textContent = "Copy";
37
+ }
38
+ async download(e) {
39
+ e.preventDefault();
40
+ const textarea = this.element.querySelector("textarea");
41
+ if (!textarea) {
42
+ throw new Error("Couldn't find the textarea");
43
+ }
44
+ download(
45
+ textarea.value,
46
+ String(Date.now()) + ".json",
47
+ "application/json"
48
+ );
49
+ }
50
+ async import(e) {
51
+ var _a;
52
+ e.preventDefault();
53
+ const file_input = this.element.querySelector(
54
+ "input[type='file']"
55
+ );
56
+ const file = (_a = file_input.files) == null ? void 0 : _a[0];
57
+ if (file) {
58
+ const text = await file.text();
59
+ const textarea = this.element.querySelector("textarea");
60
+ textarea.innerHTML = text.replaceAll("<", "&lt;");
61
+ textarea.dispatchEvent(new Event("change"));
62
+ }
63
+ }
64
+ }
65
+ function sleep(n) {
66
+ return new Promise((resolve) => setTimeout(resolve, n));
67
+ }
68
+ export {
69
+ ExportableTextarea as default
70
+ };
71
+ //# sourceMappingURL=exportable-textarea.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/controllers/exportable-textarea.stimulus.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { Controller } from \"stimulus\";\n\nfunction download(data: string, filename: string, type: string) {\n\tconst file = new Blob([data], { type: type });\n\tconst a = document.createElement(\"a\"),\n\t\turl = URL.createObjectURL(file);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function () {\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 0);\n}\n\nexport default class ExportableTextarea extends Controller<HTMLDetailsElement> {\n\tconnect() {\n\t\tconsole.log(\"exportable\", this.element);\n\t\tthis.element.removeAttribute(\"open\");\n\t\tthis.element.addEventListener(\n\t\t\t\"turbo:before-morph-attribute\",\n\t\t\t(event: CustomEvent<{ attributeName: string }>) => {\n\t\t\t\tif (\n\t\t\t\t\tevent.target == this.element &&\n\t\t\t\t\tevent.detail.attributeName == \"open\"\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}\n\n\tasync copy(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tconst textarea = this.element.querySelector(\"textarea\");\n\t\tif (!textarea) {\n\t\t\tthrow new Error(\"Couldn't find the textarea\");\n\t\t}\n\t\tawait navigator.clipboard.writeText(textarea.value);\n\t\t(e.target as HTMLButtonElement).textContent = \"Copied\";\n\t\tawait sleep(1000);\n\t\t(e.target as HTMLButtonElement).textContent = \"Copy\";\n\t}\n\n\tasync download(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tconst textarea = this.element.querySelector(\"textarea\");\n\t\tif (!textarea) {\n\t\t\tthrow new Error(\"Couldn't find the textarea\");\n\t\t}\n\t\tdownload(\n\t\t\ttextarea.value,\n\t\t\tString(Date.now()) + \".json\",\n\t\t\t\"application/json\"\n\t\t);\n\t}\n\n\tasync import(e: MouseEvent) {\n\t\te.preventDefault();\n\t\tconst file_input = this.element.querySelector(\n\t\t\t\"input[type='file']\"\n\t\t) as HTMLInputElement;\n\t\tconst file = file_input.files?.[0];\n\t\tif (file) {\n\t\t\tconst text = await file.text();\n\t\t\tconst textarea = this.element.querySelector(\"textarea\");\n\t\t\ttextarea!.innerHTML = text.replaceAll(\"<\", \"&lt;\");\n\t\t\ttextarea!.dispatchEvent(new Event(\"change\"));\n\t\t}\n\t}\n}\n\nfunction sleep(n: number) {\n\treturn new Promise((resolve) => setTimeout(resolve, n));\n}\n"],
5
+ "mappings": "AACA,SAAS,kBAAkB;AAE3B,SAAS,SAAS,MAAc,UAAkB,MAAc;AAC/D,QAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAW,CAAC;AAC5C,QAAM,IAAI,SAAS,cAAc,GAAG,GACnC,MAAM,IAAI,gBAAgB,IAAI;AAC/B,IAAE,OAAO;AACT,IAAE,WAAW;AACb,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAM;AACR,aAAW,WAAY;AACtB,aAAS,KAAK,YAAY,CAAC;AAC3B,WAAO,IAAI,gBAAgB,GAAG;AAAA,EAC/B,GAAG,CAAC;AACL;AAEA,MAAO,2BAAyC,WAA+B;AAAA,EAC9E,UAAU;AACT,YAAQ,IAAI,cAAc,KAAK,OAAO;AACtC,SAAK,QAAQ,gBAAgB,MAAM;AACnC,SAAK,QAAQ;AAAA,MACZ;AAAA,MACA,CAAC,UAAkD;AAClD,YACC,MAAM,UAAU,KAAK,WACrB,MAAM,OAAO,iBAAiB,QAC7B;AACD,gBAAM,eAAe;AAAA,QACtB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,KAAK,GAAe;AACzB,MAAE,eAAe;AACjB,UAAM,WAAW,KAAK,QAAQ,cAAc,UAAU;AACtD,QAAI,CAAC,UAAU;AACd,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC7C;AACA,UAAM,UAAU,UAAU,UAAU,SAAS,KAAK;AAClD,IAAC,EAAE,OAA6B,cAAc;AAC9C,UAAM,MAAM,GAAI;AAChB,IAAC,EAAE,OAA6B,cAAc;AAAA,EAC/C;AAAA,EAEA,MAAM,SAAS,GAAe;AAC7B,MAAE,eAAe;AACjB,UAAM,WAAW,KAAK,QAAQ,cAAc,UAAU;AACtD,QAAI,CAAC,UAAU;AACd,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC7C;AACA;AAAA,MACC,SAAS;AAAA,MACT,OAAO,KAAK,IAAI,CAAC,IAAI;AAAA,MACrB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,OAAO,GAAe;AA3D7B;AA4DE,MAAE,eAAe;AACjB,UAAM,aAAa,KAAK,QAAQ;AAAA,MAC/B;AAAA,IACD;AACA,UAAM,QAAO,gBAAW,UAAX,mBAAmB;AAChC,QAAI,MAAM;AACT,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAM,WAAW,KAAK,QAAQ,cAAc,UAAU;AACtD,eAAU,YAAY,KAAK,WAAW,KAAK,MAAM;AACjD,eAAU,cAAc,IAAI,MAAM,QAAQ,CAAC;AAAA,IAC5C;AAAA,EACD;AACD;AAEA,SAAS,MAAM,GAAW;AACzB,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AACvD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,30 @@
1
+ import { Controller } from "stimulus";
2
+ class InputImagePreview extends Controller {
3
+ handleChange() {
4
+ var _a, _b, _c, _d;
5
+ let img = this.element.querySelector("img");
6
+ if (!img) {
7
+ img = document.createElement("img");
8
+ img.setAttribute("style", "height: 40px; width: 40px");
9
+ (_a = this.element.querySelector(".image-preview-container")) == null ? void 0 : _a.appendChild(img);
10
+ }
11
+ window.URL.revokeObjectURL(img.src);
12
+ const file = (_c = (_b = this.element.querySelector("input")) == null ? void 0 : _b.files) == null ? void 0 : _c[0];
13
+ if (!file) {
14
+ console.warn("No file");
15
+ return;
16
+ }
17
+ const new_url = window.URL.createObjectURL(file);
18
+ img.src = new_url;
19
+ img.parentNode;
20
+ (_d = img.parentElement) == null ? void 0 : _d.querySelectorAll("source").forEach((e) => {
21
+ var _a2;
22
+ return (_a2 = e.parentNode) == null ? void 0 : _a2.removeChild(e);
23
+ });
24
+ img.style.aspectRatio = "1";
25
+ }
26
+ }
27
+ export {
28
+ InputImagePreview as default
29
+ };
30
+ //# sourceMappingURL=input-image-preview.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/controllers/input-image-preview.stimulus.ts"],
4
+ "sourcesContent": ["import { Controller } from \"stimulus\";\n\nexport default class InputImagePreview extends Controller {\n\tid: string;\n\n\thandleChange() {\n\t\tlet img = this.element.querySelector(\"img\");\n\t\tif (!img) {\n\t\t\timg = document.createElement(\"img\");\n\t\t\timg.setAttribute(\"style\", \"height: 40px; width: 40px\");\n\t\t\tthis.element\n\t\t\t\t.querySelector(\".image-preview-container\")\n\t\t\t\t?.appendChild(img);\n\t\t}\n\t\twindow.URL.revokeObjectURL(img.src);\n\t\tconst file = this.element.querySelector(\"input\")?.files?.[0];\n\t\tif (!file) {\n\t\t\tconsole.warn(\"No file\");\n\t\t\treturn;\n\t\t}\n\t\tconst new_url = window.URL.createObjectURL(file);\n\t\timg.src = new_url;\n\t\timg.parentNode;\n\t\timg.parentElement\n\t\t\t?.querySelectorAll(\"source\")\n\t\t\t.forEach((e) => e.parentNode?.removeChild(e));\n\t\timg.style.aspectRatio = \"1\";\n\t}\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAE3B,MAAO,0BAAwC,WAAW;AAAA,EAGzD,eAAe;AALhB;AAME,QAAI,MAAM,KAAK,QAAQ,cAAc,KAAK;AAC1C,QAAI,CAAC,KAAK;AACT,YAAM,SAAS,cAAc,KAAK;AAClC,UAAI,aAAa,SAAS,2BAA2B;AACrD,iBAAK,QACH,cAAc,0BAA0B,MAD1C,mBAEG,YAAY;AAAA,IAChB;AACA,WAAO,IAAI,gBAAgB,IAAI,GAAG;AAClC,UAAM,QAAO,gBAAK,QAAQ,cAAc,OAAO,MAAlC,mBAAqC,UAArC,mBAA6C;AAC1D,QAAI,CAAC,MAAM;AACV,cAAQ,KAAK,SAAS;AACtB;AAAA,IACD;AACA,UAAM,UAAU,OAAO,IAAI,gBAAgB,IAAI;AAC/C,QAAI,MAAM;AACV,QAAI;AACJ,cAAI,kBAAJ,mBACG,iBAAiB,UAClB,QAAQ,CAAC,MAAG;AAzBhB,UAAAA;AAyBmB,cAAAA,MAAA,EAAE,eAAF,gBAAAA,IAAc,YAAY;AAAA;AAC3C,QAAI,MAAM,cAAc;AAAA,EACzB;AACD;",
6
+ "names": ["_a"]
7
+ }
@@ -0,0 +1,78 @@
1
+ import { Controller } from "stimulus";
2
+ import TurndownService from "turndown";
3
+ import objectPath from "object-path";
4
+ const turndownService = new TurndownService();
5
+ class jdd_table_paste_stimulus_default extends Controller {
6
+ connect() {
7
+ this.element.addEventListener("click", async () => {
8
+ const clipboardContents = await navigator.clipboard.read();
9
+ for (const item of clipboardContents) {
10
+ if (!item.types.includes("text/html")) {
11
+ alert(
12
+ "Nie mo\u017Cna skopiowa\u0107 tabeli - nie znaleziono danych HTML"
13
+ );
14
+ return;
15
+ }
16
+ const blob = await item.getType("text/html");
17
+ const html = await blob.text();
18
+ const div = document.createElement("div");
19
+ div.innerHTML = html;
20
+ const table = div.querySelector("table");
21
+ if (!table) {
22
+ alert("No table in clipboard");
23
+ }
24
+ const rows = Array.from(
25
+ (table == null ? void 0 : table.querySelectorAll("tr")) || []
26
+ ).map((tr) => {
27
+ const cells = Array.from(tr.querySelectorAll("td"));
28
+ return {
29
+ type: "row",
30
+ cells: cells.map(
31
+ (cell) => turndownService.turndown(cell)
32
+ )
33
+ };
34
+ });
35
+ const form = this.element.closest("form");
36
+ const json_textarea = document.getElementById(
37
+ "component-debugger-json-textarea"
38
+ );
39
+ if (!json_textarea) {
40
+ console.error(
41
+ "Could not find json textarea with the jdd state"
42
+ );
43
+ return;
44
+ }
45
+ if (!form) {
46
+ throw new Error("Not inside a form");
47
+ }
48
+ const handler = () => {
49
+ document.removeEventListener("turbo:morph", handler);
50
+ const state = JSON.parse(json_textarea.value);
51
+ objectPath.set(state, this.argpathValue, {
52
+ rows
53
+ });
54
+ json_textarea.childNodes[0].textContent = JSON.stringify(state);
55
+ setTimeout(() => {
56
+ const submitter_button = document.createElement("button");
57
+ submitter_button.setAttribute(
58
+ "formaction",
59
+ "./?action=replace_state&action_args=W10="
60
+ );
61
+ form.appendChild(submitter_button);
62
+ form.requestSubmit(submitter_button);
63
+ submitter_button.remove();
64
+ }, 0);
65
+ };
66
+ document.addEventListener("turbo:morph", handler);
67
+ form.requestSubmit();
68
+ }
69
+ });
70
+ }
71
+ }
72
+ jdd_table_paste_stimulus_default.values = {
73
+ argpath: String
74
+ };
75
+ export {
76
+ jdd_table_paste_stimulus_default as default
77
+ };
78
+ //# sourceMappingURL=jdd-table-paste.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/controllers/jdd-table-paste.stimulus.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable @typescript-eslint/no-misused-promises */\nimport { Controller } from \"stimulus\";\nimport TurndownService from \"turndown\";\nimport objectPath from \"object-path\";\n\nconst turndownService = new TurndownService();\n\nexport default class extends Controller<HTMLButtonElement> {\n\tdeclare argpathValue: string;\n\tstatic values = {\n\t\targpath: String,\n\t};\n\n\tconnect() {\n\t\tthis.element.addEventListener(\"click\", async () => {\n\t\t\tconst clipboardContents = await navigator.clipboard.read();\n\t\t\tfor (const item of clipboardContents) {\n\t\t\t\tif (!item.types.includes(\"text/html\")) {\n\t\t\t\t\talert(\n\t\t\t\t\t\t\"Nie mo\u017Cna skopiowa\u0107 tabeli - nie znaleziono danych HTML\"\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst blob = await item.getType(\"text/html\");\n\t\t\t\tconst html = await blob.text();\n\t\t\t\tconst div = document.createElement(\"div\");\n\t\t\t\tdiv.innerHTML = html;\n\t\t\t\tconst table = div.querySelector(\"table\");\n\t\t\t\tif (!table) {\n\t\t\t\t\talert(\"No table in clipboard\");\n\t\t\t\t}\n\t\t\t\tconst rows = Array.from(\n\t\t\t\t\ttable?.querySelectorAll(\"tr\") || []\n\t\t\t\t).map((tr) => {\n\t\t\t\t\tconst cells = Array.from(tr.querySelectorAll(\"td\"));\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"row\",\n\t\t\t\t\t\tcells: cells.map((cell) =>\n\t\t\t\t\t\t\tturndownService.turndown(cell)\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst form = this.element.closest(\"form\");\n\t\t\t\tconst json_textarea = document.getElementById(\n\t\t\t\t\t\"component-debugger-json-textarea\"\n\t\t\t\t) as HTMLTextAreaElement;\n\t\t\t\tif (!json_textarea) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Could not find json textarea with the jdd state\"\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!form) {\n\t\t\t\t\tthrow new Error(\"Not inside a form\");\n\t\t\t\t}\n\t\t\t\tconst handler = () => {\n\t\t\t\t\tdocument.removeEventListener(\"turbo:morph\", handler);\n\t\t\t\t\tconst state = JSON.parse(json_textarea.value) as unknown;\n\t\t\t\t\tobjectPath.set(state as object, this.argpathValue, {\n\t\t\t\t\t\trows,\n\t\t\t\t\t});\n\n\t\t\t\t\tjson_textarea.childNodes[0]!.textContent =\n\t\t\t\t\t\tJSON.stringify(state);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// async in order to give a chance for UI state to update after changing the iframe value\n\t\t\t\t\t\tconst submitter_button =\n\t\t\t\t\t\t\tdocument.createElement(\"button\");\n\t\t\t\t\t\tsubmitter_button.setAttribute(\n\t\t\t\t\t\t\t\"formaction\",\n\t\t\t\t\t\t\t\"./?action=replace_state&action_args=W10=\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tform.appendChild(submitter_button);\n\t\t\t\t\t\tform.requestSubmit(submitter_button);\n\t\t\t\t\t\tsubmitter_button.remove();\n\t\t\t\t\t}, 0);\n\t\t\t\t};\n\n\t\t\t\tdocument.addEventListener(\"turbo:morph\", handler);\n\t\t\t\tform.requestSubmit(); // to get the newest json first, there may be some\n\t\t\t\t// unsent changes\n\t\t\t}\n\t\t});\n\t}\n}\n"],
5
+ "mappings": "AAIA,SAAS,kBAAkB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,gBAAgB;AAEvB,MAAM,kBAAkB,IAAI,gBAAgB;AAE5C,MAAO,yCAAsB,WAA8B;AAAA,EAM1D,UAAU;AACT,SAAK,QAAQ,iBAAiB,SAAS,YAAY;AAClD,YAAM,oBAAoB,MAAM,UAAU,UAAU,KAAK;AACzD,iBAAW,QAAQ,mBAAmB;AACrC,YAAI,CAAC,KAAK,MAAM,SAAS,WAAW,GAAG;AACtC;AAAA,YACC;AAAA,UACD;AACA;AAAA,QACD;AACA,cAAM,OAAO,MAAM,KAAK,QAAQ,WAAW;AAC3C,cAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,cAAM,MAAM,SAAS,cAAc,KAAK;AACxC,YAAI,YAAY;AAChB,cAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,YAAI,CAAC,OAAO;AACX,gBAAM,uBAAuB;AAAA,QAC9B;AACA,cAAM,OAAO,MAAM;AAAA,WAClB,+BAAO,iBAAiB,UAAS,CAAC;AAAA,QACnC,EAAE,IAAI,CAAC,OAAO;AACb,gBAAM,QAAQ,MAAM,KAAK,GAAG,iBAAiB,IAAI,CAAC;AAClD,iBAAO;AAAA,YACN,MAAM;AAAA,YACN,OAAO,MAAM;AAAA,cAAI,CAAC,SACjB,gBAAgB,SAAS,IAAI;AAAA,YAC9B;AAAA,UACD;AAAA,QACD,CAAC;AAED,cAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM;AACxC,cAAM,gBAAgB,SAAS;AAAA,UAC9B;AAAA,QACD;AACA,YAAI,CAAC,eAAe;AACnB,kBAAQ;AAAA,YACP;AAAA,UACD;AACA;AAAA,QACD;AACA,YAAI,CAAC,MAAM;AACV,gBAAM,IAAI,MAAM,mBAAmB;AAAA,QACpC;AACA,cAAM,UAAU,MAAM;AACrB,mBAAS,oBAAoB,eAAe,OAAO;AACnD,gBAAM,QAAQ,KAAK,MAAM,cAAc,KAAK;AAC5C,qBAAW,IAAI,OAAiB,KAAK,cAAc;AAAA,YAClD;AAAA,UACD,CAAC;AAED,wBAAc,WAAW,GAAI,cAC5B,KAAK,UAAU,KAAK;AACrB,qBAAW,MAAM;AAEhB,kBAAM,mBACL,SAAS,cAAc,QAAQ;AAChC,6BAAiB;AAAA,cAChB;AAAA,cACA;AAAA,YACD;AACA,iBAAK,YAAY,gBAAgB;AACjC,iBAAK,cAAc,gBAAgB;AACnC,6BAAiB,OAAO;AAAA,UACzB,GAAG,CAAC;AAAA,QACL;AAEA,iBAAS,iBAAiB,eAAe,OAAO;AAChD,aAAK,cAAc;AAAA,MAEpB;AAAA,IACD,CAAC;AAAA,EACF;AACD;AA9EO,iCAEC,SAAS;AAAA,EACf,SAAS;AACV;",
6
+ "names": []
7
+ }
@@ -0,0 +1,114 @@
1
+ import { Controller } from "stimulus";
2
+ const JS_ID = "codemirror-js";
3
+ const JS_PATH = "/dist/codemirror.js";
4
+ const JS_MODE_ID = "codemirror-js-mode-js";
5
+ const JS_MODE_PATH = "/dist/codemirror-javascript-mode.js";
6
+ const CSS_ID = "codemirror-css";
7
+ const CSS_PATH = "/dist/codemirror.css";
8
+ class JSONEditor extends Controller {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.saving = false;
12
+ }
13
+ addCSS() {
14
+ const tag = document.querySelector(`head #${CSS_ID}`);
15
+ if (!tag) {
16
+ const link = document.createElement("link");
17
+ link.setAttribute("rel", "stylesheet");
18
+ link.setAttribute("type", "text/css");
19
+ link.setAttribute("id", CSS_ID);
20
+ link.setAttribute("href", CSS_PATH);
21
+ document.head.appendChild(link);
22
+ }
23
+ }
24
+ async addJS(js_id, js_path) {
25
+ return new Promise((resolve, reject) => {
26
+ const once_loaded = (e) => {
27
+ e.target.setAttribute("loaded", "true");
28
+ resolve();
29
+ };
30
+ try {
31
+ const tag = document.querySelector(`head #${js_id}`);
32
+ if (!tag) {
33
+ const script = document.createElement("script");
34
+ script.setAttribute("id", js_id);
35
+ script.setAttribute("src", js_path);
36
+ script.addEventListener("load", once_loaded);
37
+ document.head.appendChild(script);
38
+ } else {
39
+ if (tag.getAttribute("loaded") == "true") {
40
+ resolve();
41
+ } else {
42
+ tag.addEventListener("load", once_loaded);
43
+ }
44
+ }
45
+ } catch (e) {
46
+ reject(e);
47
+ }
48
+ });
49
+ }
50
+ async connect() {
51
+ var _a, _b;
52
+ if ((_a = this.element.parentNode) == null ? void 0 : _a.querySelector(".CodeMirror")) {
53
+ return;
54
+ }
55
+ this.addCSS();
56
+ await this.addJS(JS_ID, JS_PATH);
57
+ await this.addJS(JS_MODE_ID, JS_MODE_PATH);
58
+ this.cm = CodeMirror.fromTextArea(this.element, {
59
+ mode: {
60
+ name: "javascript",
61
+ json: true
62
+ },
63
+ theme: "default",
64
+ addModeClass: true,
65
+ lineWrapping: true
66
+ });
67
+ this.cm.on("change", () => {
68
+ this.saving = true;
69
+ this.element.innerHTML = this.cm.getValue().replace("<", "&lt;");
70
+ this.saving = false;
71
+ });
72
+ this.cm.getWrapperElement().setAttribute("data-turbo-permanent", "");
73
+ const observer = new MutationObserver((mutation) => {
74
+ console.log("DETECTED TEXTAREA MUTATION CHANGE!", mutation);
75
+ if (!this.saving) {
76
+ if (this.cm.getValue() != this.element.innerHTML) {
77
+ console.log(
78
+ "SETTING CM VALUE TO",
79
+ this.element.innerHTML.slice(0, 100)
80
+ );
81
+ this.cm.setValue(this.element.innerHTML);
82
+ }
83
+ }
84
+ });
85
+ observer.observe(this.element, {
86
+ characterData: true,
87
+ subtree: true
88
+ });
89
+ this.element.addEventListener("change", () => {
90
+ console.log("DETECTED TEXTAREA CHANGE!");
91
+ if (!this.saving) {
92
+ if (this.cm.getValue() != this.element.innerHTML) {
93
+ console.log(
94
+ "SETTING CM VALUE TO",
95
+ this.element.innerHTML.slice(0, 100)
96
+ );
97
+ this.cm.setValue(this.element.innerHTML);
98
+ }
99
+ }
100
+ });
101
+ (_b = this.element.closest("details")) == null ? void 0 : _b.addEventListener("toggle", (event) => {
102
+ if (event.target.open) {
103
+ this.cm.refresh();
104
+ }
105
+ });
106
+ }
107
+ async disconnect() {
108
+ console.log("DISCONNECTING JSON EDITOR");
109
+ }
110
+ }
111
+ export {
112
+ JSONEditor as default
113
+ };
114
+ //# sourceMappingURL=json-editor.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/controllers/json-editor.stimulus.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport { Controller } from \"stimulus\";\n\nconst JS_ID = \"codemirror-js\";\nconst JS_PATH = \"/dist/codemirror.js\";\n\nconst JS_MODE_ID = \"codemirror-js-mode-js\";\nconst JS_MODE_PATH = \"/dist/codemirror-javascript-mode.js\";\n\nconst CSS_ID = \"codemirror-css\";\nconst CSS_PATH = \"/dist/codemirror.css\";\n\ndeclare const CodeMirror: any;\n\nexport default class JSONEditor extends Controller<HTMLTextAreaElement> {\n\tcm: any;\n\tsaving = 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\", CSS_PATH);\n\t\t\tdocument.head.appendChild(link);\n\t\t}\n\t}\n\n\tasync addJS(js_id: string, js_path: string) {\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\", js_path);\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\tasync connect() {\n\t\tif (this.element.parentNode?.querySelector(\".CodeMirror\")) {\n\t\t\t//already loaded, quit;\n\t\t\treturn;\n\t\t}\n\t\tthis.addCSS();\n\t\tawait this.addJS(JS_ID, JS_PATH);\n\t\tawait this.addJS(JS_MODE_ID, JS_MODE_PATH);\n\t\tthis.cm = CodeMirror.fromTextArea(this.element, {\n\t\t\tmode: {\n\t\t\t\tname: \"javascript\",\n\t\t\t\tjson: true,\n\t\t\t},\n\t\t\ttheme: \"default\",\n\t\t\taddModeClass: true,\n\t\t\tlineWrapping: true,\n\t\t});\n\t\tthis.cm.on(\"change\", () => {\n\t\t\tthis.saving = true;\n\t\t\tthis.element.innerHTML = this.cm.getValue().replace(\"<\", \"&lt;\");\n\t\t\tthis.saving = false;\n\t\t});\n\t\t// to prevent morhping from removing the element\n\t\tthis.cm.getWrapperElement().setAttribute(\"data-turbo-permanent\", \"\");\n\t\tconst observer = new MutationObserver((mutation) => {\n\t\t\tconsole.log(\"DETECTED TEXTAREA MUTATION CHANGE!\", mutation);\n\t\t\tif (!this.saving) {\n\t\t\t\tif (this.cm.getValue() != this.element.innerHTML) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"SETTING CM VALUE TO\",\n\t\t\t\t\t\tthis.element.innerHTML.slice(0, 100)\n\t\t\t\t\t);\n\t\t\t\t\tthis.cm.setValue(this.element.innerHTML);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tobserver.observe(this.element, {\n\t\t\tcharacterData: true,\n\t\t\tsubtree: true,\n\t\t});\n\n\t\tthis.element.addEventListener(\"change\", () => {\n\t\t\tconsole.log(\"DETECTED TEXTAREA CHANGE!\");\n\t\t\tif (!this.saving) {\n\t\t\t\tif (this.cm.getValue() != this.element.innerHTML) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"SETTING CM VALUE TO\",\n\t\t\t\t\t\tthis.element.innerHTML.slice(0, 100)\n\t\t\t\t\t);\n\t\t\t\t\tthis.cm.setValue(this.element.innerHTML);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.element\n\t\t\t.closest(\"details\")\n\t\t\t?.addEventListener(\"toggle\", (event: MouseEvent) => {\n\t\t\t\tif ((event.target as HTMLDetailsElement).open) {\n\t\t\t\t\tthis.cm.refresh();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tasync disconnect() {\n\t\tconsole.log(\"DISCONNECTING JSON EDITOR\");\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }