@sealcode/jdd-editor 0.1.6 → 0.1.8
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.
- package/.nyc_output/29e7bb87-9f10-462e-84d8-ec620cfa9e6b.json +1 -0
- package/.nyc_output/7d7104e8-f179-427b-b4bd-30f78397e4f1.json +1 -0
- package/.nyc_output/9bfa248d-4f8e-4d29-9c47-d1a3961c5254.json +1 -0
- package/.nyc_output/processinfo/29e7bb87-9f10-462e-84d8-ec620cfa9e6b.json +1 -0
- package/.nyc_output/processinfo/7d7104e8-f179-427b-b4bd-30f78397e4f1.json +1 -0
- package/.nyc_output/processinfo/9bfa248d-4f8e-4d29-9c47-d1a3961c5254.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/.xunit +2 -0
- package/assets/styles/components.jdd-page.css +3 -2
- package/coverage/clover.xml +846 -0
- package/dist/src/inputs/component-input.js +7 -4
- package/dist/src/inputs/component-input.js.map +2 -2
- package/lib/src/component-preview-actions.js +439 -0
- package/lib/src/component-preview-actions.js.map +7 -0
- package/lib/src/components.sreact.js +93 -0
- package/lib/src/components.sreact.js.map +7 -0
- package/{dist/src → lib/src/controllers}/autogrow-textarea.stimulus.js.map +1 -1
- package/{dist/src → lib/src/controllers}/component-debugger.stimulus.js +3 -0
- package/lib/src/controllers/component-debugger.stimulus.js.map +7 -0
- package/{dist/src → lib/src/controllers}/exportable-textarea.stimulus.js.map +1 -1
- package/{dist/src → lib/src/controllers}/input-image-preview.stimulus.js.map +1 -1
- package/{dist/src → lib/src/controllers}/jdd-table-paste.stimulus.js.map +1 -1
- package/{dist/src → lib/src/controllers}/json-editor.stimulus.js.map +1 -1
- package/{dist/src → lib/src/controllers}/markdown-textarea.stimulus.js.map +1 -1
- package/lib/src/controllers/refresh-on-ts-changes.stimulus.js +90 -0
- package/lib/src/controllers/refresh-on-ts-changes.stimulus.js.map +7 -0
- package/lib/src/controllers/refresh-styles.stimulus.js +67 -0
- package/lib/src/controllers/refresh-styles.stimulus.js.map +7 -0
- package/{dist/src → lib/src/controllers}/submit-on-input.stimulus.js.map +1 -1
- package/{dist/src → lib/src/controllers}/toast.stimulus.js.map +1 -1
- package/lib/src/edit-jdd-field.js +94 -0
- package/lib/src/edit-jdd-field.js.map +7 -0
- package/lib/src/index.js +3 -0
- package/lib/src/index.js.map +7 -0
- package/lib/src/inputs/component-input-enum.js +30 -0
- package/lib/src/inputs/component-input-enum.js.map +7 -0
- package/lib/src/inputs/component-input-image.js +63 -0
- package/lib/src/inputs/component-input-image.js.map +7 -0
- package/lib/src/inputs/component-input-list.js +74 -0
- package/lib/src/inputs/component-input-list.js.map +7 -0
- package/lib/src/inputs/component-input-single-reference.js +31 -0
- package/lib/src/inputs/component-input-single-reference.js.map +7 -0
- package/lib/src/inputs/component-input-structured.js +36 -0
- package/lib/src/inputs/component-input-structured.js.map +7 -0
- package/lib/src/inputs/component-input-table.js +228 -0
- package/lib/src/inputs/component-input-table.js.map +7 -0
- package/lib/src/inputs/component-input.js +164 -0
- package/lib/src/inputs/component-input.js.map +7 -0
- package/lib/src/inputs/print-arg-path.js +7 -0
- package/lib/src/inputs/print-arg-path.js.map +7 -0
- package/lib/src/jdd-creator.js +131 -0
- package/lib/src/jdd-creator.js.map +7 -0
- package/lib/src/jdd-page.js +339 -0
- package/lib/src/jdd-page.js.map +7 -0
- package/lib/src/test.test.js +5 -0
- package/lib/src/test.test.js.map +7 -0
- package/package.json +1 -1
- package/src/inputs/component-input.ts +9 -4
- package/dist/src/component-debugger.stimulus.js.map +0 -7
- package/lib/component-preview-actions.js +0 -286
- package/lib/component-preview-actions.js.map +0 -1
- package/lib/components.sreact.js +0 -102
- package/lib/components.sreact.js.map +0 -1
- package/lib/controllers/autogrow-textarea.stimulus.js +0 -15
- package/lib/controllers/autogrow-textarea.stimulus.js.map +0 -1
- package/lib/controllers/component-debugger.stimulus.js +0 -188
- package/lib/controllers/component-debugger.stimulus.js.map +0 -1
- package/lib/controllers/exportable-textarea.stimulus.js +0 -79
- package/lib/controllers/exportable-textarea.stimulus.js.map +0 -1
- package/lib/controllers/input-image-preview.stimulus.js +0 -28
- package/lib/controllers/input-image-preview.stimulus.js.map +0 -1
- package/lib/controllers/jdd-table-paste.stimulus.js +0 -84
- package/lib/controllers/jdd-table-paste.stimulus.js.map +0 -1
- package/lib/controllers/json-editor.stimulus.js +0 -134
- package/lib/controllers/json-editor.stimulus.js.map +0 -1
- package/lib/controllers/markdown-textarea.stimulus.js +0 -186
- package/lib/controllers/markdown-textarea.stimulus.js.map +0 -1
- package/lib/controllers/refresh-on-ts-changes.stimulus.js +0 -123
- package/lib/controllers/refresh-on-ts-changes.stimulus.js.map +0 -1
- package/lib/controllers/refresh-styles.stimulus.js +0 -66
- package/lib/controllers/refresh-styles.stimulus.js.map +0 -1
- package/lib/controllers/submit-on-input.stimulus.js +0 -48
- package/lib/controllers/submit-on-input.stimulus.js.map +0 -1
- package/lib/controllers/toast.stimulus.js +0 -16
- package/lib/controllers/toast.stimulus.js.map +0 -1
- package/lib/edit-jdd-field.js +0 -102
- package/lib/edit-jdd-field.js.map +0 -1
- package/lib/index.js +0 -19
- package/lib/index.js.map +0 -1
- package/lib/inputs/component-input-enum.js +0 -25
- package/lib/inputs/component-input-enum.js.map +0 -1
- package/lib/inputs/component-input-image.js +0 -47
- package/lib/inputs/component-input-image.js.map +0 -1
- package/lib/inputs/component-input-list.js +0 -61
- package/lib/inputs/component-input-list.js.map +0 -1
- package/lib/inputs/component-input-single-reference.js +0 -36
- package/lib/inputs/component-input-single-reference.js.map +0 -1
- package/lib/inputs/component-input-structured.js +0 -42
- package/lib/inputs/component-input-structured.js.map +0 -1
- package/lib/inputs/component-input-table.js +0 -184
- package/lib/inputs/component-input-table.js.map +0 -1
- package/lib/inputs/component-input.js +0 -133
- package/lib/inputs/component-input.js.map +0 -1
- package/lib/inputs/print-arg-path.js +0 -7
- package/lib/inputs/print-arg-path.js.map +0 -1
- package/lib/jdd-creator.js +0 -113
- package/lib/jdd-creator.js.map +0 -1
- package/lib/jdd-page.js +0 -310
- package/lib/jdd-page.js.map +0 -1
- /package/{dist/src → lib/src/controllers}/autogrow-textarea.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/exportable-textarea.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/input-image-preview.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/jdd-table-paste.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/json-editor.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/markdown-textarea.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/submit-on-input.stimulus.js +0 -0
- /package/{dist/src → lib/src/controllers}/toast.stimulus.js +0 -0
|
@@ -6,6 +6,7 @@ class ComponentDebugger extends Controller {
|
|
|
6
6
|
if (!main_form) {
|
|
7
7
|
throw new Error("No main form");
|
|
8
8
|
}
|
|
9
|
+
this.main_form = main_form;
|
|
9
10
|
document.documentElement.addEventListener("ts-rebuilt", () => {
|
|
10
11
|
this.main_form.requestSubmit();
|
|
11
12
|
});
|
|
@@ -36,6 +37,7 @@ class ComponentDebugger extends Controller {
|
|
|
36
37
|
});
|
|
37
38
|
}
|
|
38
39
|
update_width_display() {
|
|
40
|
+
console.log("uwd");
|
|
39
41
|
const preview = this.targets.find("preview");
|
|
40
42
|
const component_width = preview.offsetWidth;
|
|
41
43
|
this.sizeSelectTarget.querySelectorAll("option").forEach((e) => e.removeAttribute("selected"));
|
|
@@ -52,6 +54,7 @@ class ComponentDebugger extends Controller {
|
|
|
52
54
|
option.setAttribute("selected", "");
|
|
53
55
|
option.innerHTML = `${component_width} px`;
|
|
54
56
|
option.value = String(component_width);
|
|
57
|
+
this.sizeSelectTarget.value = String(component_width);
|
|
55
58
|
}
|
|
56
59
|
resizeHandler(e) {
|
|
57
60
|
const width_offset = this.origin_x - e.clientX;
|
|
@@ -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
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/exportable-textarea.stimulus.ts"],
|
|
4
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(\"<\", \"<\");\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
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
6
|
"names": []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/input-image-preview.stimulus.ts"],
|
|
4
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
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
6
|
"names": ["_a"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/jdd-table-paste.stimulus.ts"],
|
|
4
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
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
6
|
"names": []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/json-editor.stimulus.ts"],
|
|
4
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(\"<\", \"<\");\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
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/markdown-textarea.stimulus.ts"],
|
|
4
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\tthis.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
5
|
"mappings": "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",
|
|
6
6
|
"names": ["_a"]
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Controller } from "stimulus";
|
|
2
|
+
const APP_DOWN_ERROR_MESSAGE = "App is currently down";
|
|
3
|
+
const sleep = (time) => new Promise((resolve) => {
|
|
4
|
+
setTimeout(resolve, time);
|
|
5
|
+
});
|
|
6
|
+
async function get_status() {
|
|
7
|
+
const r = await fetch("/status.json");
|
|
8
|
+
return await r.json();
|
|
9
|
+
}
|
|
10
|
+
async function wait_for_run_id_to_change() {
|
|
11
|
+
let first_timestamp;
|
|
12
|
+
try {
|
|
13
|
+
const { started_at } = await get_status();
|
|
14
|
+
first_timestamp = started_at;
|
|
15
|
+
} catch (e) {
|
|
16
|
+
await wait_for_app_to_be_stable();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!first_timestamp) {
|
|
20
|
+
throw new Error(APP_DOWN_ERROR_MESSAGE);
|
|
21
|
+
}
|
|
22
|
+
while (true) {
|
|
23
|
+
const { started_at } = await get_status().catch(() => ({
|
|
24
|
+
started_at: first_timestamp
|
|
25
|
+
}));
|
|
26
|
+
if (started_at !== first_timestamp) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await sleep(100);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function wait_for_app_to_be_stable(n = 3) {
|
|
33
|
+
console.log("Waiting for app to be stable....");
|
|
34
|
+
let counter = 0;
|
|
35
|
+
while (true) {
|
|
36
|
+
const { status } = await get_status().catch(() => ({
|
|
37
|
+
status: "down"
|
|
38
|
+
}));
|
|
39
|
+
if (status == "running") {
|
|
40
|
+
console.log(counter);
|
|
41
|
+
counter++;
|
|
42
|
+
} else {
|
|
43
|
+
counter = 0;
|
|
44
|
+
}
|
|
45
|
+
if (counter == n) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await sleep(100);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function wait_for_app_restart() {
|
|
52
|
+
try {
|
|
53
|
+
await wait_for_run_id_to_change();
|
|
54
|
+
} catch (e) {
|
|
55
|
+
if (e.message !== APP_DOWN_ERROR_MESSAGE) {
|
|
56
|
+
throw e;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
await wait_for_app_to_be_stable();
|
|
60
|
+
}
|
|
61
|
+
class RefreshOnTSChanges extends Controller {
|
|
62
|
+
async connect() {
|
|
63
|
+
const { port, watch } = await fetch("/dist/notifier.json").then(
|
|
64
|
+
(r) => r.json()
|
|
65
|
+
);
|
|
66
|
+
if (!watch) {
|
|
67
|
+
console.warn(
|
|
68
|
+
"Not running auto refresh on watch because the build process is not running in watch mode"
|
|
69
|
+
);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const socket = new WebSocket(`ws://localhost:${port}`);
|
|
73
|
+
socket.onmessage = async (message) => {
|
|
74
|
+
const data = message.data;
|
|
75
|
+
if (typeof data === "string" && data.endsWith("-ts")) {
|
|
76
|
+
document.documentElement.classList.add("restarting");
|
|
77
|
+
await wait_for_app_restart();
|
|
78
|
+
document.documentElement.dispatchEvent(new Event("ts-rebuilt"));
|
|
79
|
+
document.documentElement.classList.remove("restarting");
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async disconnect() {
|
|
84
|
+
this.socket.close();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
RefreshOnTSChanges as default
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=refresh-on-ts-changes.stimulus.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/controllers/refresh-on-ts-changes.stimulus.ts"],
|
|
4
|
+
"sourcesContent": ["import { Controller } from \"stimulus\";\n\nconst APP_DOWN_ERROR_MESSAGE = \"App is currently down\";\n\nconst sleep = (time: number) =>\n\tnew Promise((resolve) => {\n\t\tsetTimeout(resolve, time);\n\t});\n\nasync function get_status(): Promise<{ started_at: number; status: string }> {\n\tconst r = await fetch(\"/status.json\");\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\treturn (await r.json()) as { started_at: number; status: string };\n}\n\nasync function wait_for_run_id_to_change() {\n\tlet first_timestamp: number;\n\ttry {\n\t\tconst { started_at } = await get_status();\n\t\tfirst_timestamp = started_at;\n\t} catch (e) {\n\t\tawait wait_for_app_to_be_stable();\n\t\treturn;\n\t}\n\n\tif (!first_timestamp) {\n\t\tthrow new Error(APP_DOWN_ERROR_MESSAGE);\n\t}\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst { started_at } = await get_status().catch(() => ({\n\t\t\tstarted_at: first_timestamp,\n\t\t}));\n\t\tif (started_at !== first_timestamp) {\n\t\t\treturn;\n\t\t}\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tawait sleep(100);\n\t}\n}\n\nasync function wait_for_app_to_be_stable(n = 3) {\n\t// eslint-disable-next-line no-console\n\tconsole.log(\"Waiting for app to be stable....\");\n\tlet counter = 0;\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst { status } = await get_status().catch(() => ({\n\t\t\tstatus: \"down\",\n\t\t}));\n\t\tif (status == \"running\") {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(counter);\n\t\t\tcounter++;\n\t\t} else {\n\t\t\tcounter = 0;\n\t\t}\n\t\tif (counter == n) {\n\t\t\treturn;\n\t\t}\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tawait sleep(100);\n\t}\n}\n\nasync function wait_for_app_restart() {\n\ttry {\n\t\tawait wait_for_run_id_to_change();\n\t} catch (e) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\tif (e.message !== APP_DOWN_ERROR_MESSAGE) {\n\t\t\tthrow e;\n\t\t}\n\t}\n\tawait wait_for_app_to_be_stable();\n}\n\nexport default class RefreshOnTSChanges extends Controller {\n\tsocket: WebSocket;\n\n\tasync connect() {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst { port, watch } = (await fetch(\"/dist/notifier.json\").then((r) =>\n\t\t\tr.json()\n\t\t)) as { port: number; watch: boolean };\n\t\tif (!watch) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(\n\t\t\t\t\"Not running auto refresh on watch because the build process is not running in watch mode\"\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst socket = new WebSocket(`ws://localhost:${port}`);\n\t\tsocket.onmessage = async (message) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tconst data = message.data as unknown;\n\t\t\tif (typeof data === \"string\" && data.endsWith(\"-ts\")) {\n\t\t\t\tdocument.documentElement.classList.add(\"restarting\");\n\t\t\t\tawait wait_for_app_restart();\n\t\t\t\tdocument.documentElement.dispatchEvent(new Event(\"ts-rebuilt\"));\n\t\t\t\tdocument.documentElement.classList.remove(\"restarting\");\n\t\t\t}\n\t\t};\n\t}\n\n\tasync disconnect() {\n\t\tthis.socket.close();\n\t}\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,kBAAkB;AAE3B,MAAM,yBAAyB;AAE/B,MAAM,QAAQ,CAAC,SACd,IAAI,QAAQ,CAAC,YAAY;AACxB,aAAW,SAAS,IAAI;AACzB,CAAC;AAEF,eAAe,aAA8D;AAC5E,QAAM,IAAI,MAAM,MAAM,cAAc;AAEpC,SAAQ,MAAM,EAAE,KAAK;AACtB;AAEA,eAAe,4BAA4B;AAC1C,MAAI;AACJ,MAAI;AACH,UAAM,EAAE,WAAW,IAAI,MAAM,WAAW;AACxC,sBAAkB;AAAA,EACnB,SAAS,GAAP;AACD,UAAM,0BAA0B;AAChC;AAAA,EACD;AAEA,MAAI,CAAC,iBAAiB;AACrB,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACvC;AAGA,SAAO,MAAM;AAEZ,UAAM,EAAE,WAAW,IAAI,MAAM,WAAW,EAAE,MAAM,OAAO;AAAA,MACtD,YAAY;AAAA,IACb,EAAE;AACF,QAAI,eAAe,iBAAiB;AACnC;AAAA,IACD;AAEA,UAAM,MAAM,GAAG;AAAA,EAChB;AACD;AAEA,eAAe,0BAA0B,IAAI,GAAG;AAE/C,UAAQ,IAAI,kCAAkC;AAC9C,MAAI,UAAU;AAEd,SAAO,MAAM;AAEZ,UAAM,EAAE,OAAO,IAAI,MAAM,WAAW,EAAE,MAAM,OAAO;AAAA,MAClD,QAAQ;AAAA,IACT,EAAE;AACF,QAAI,UAAU,WAAW;AAExB,cAAQ,IAAI,OAAO;AACnB;AAAA,IACD,OAAO;AACN,gBAAU;AAAA,IACX;AACA,QAAI,WAAW,GAAG;AACjB;AAAA,IACD;AAEA,UAAM,MAAM,GAAG;AAAA,EAChB;AACD;AAEA,eAAe,uBAAuB;AACrC,MAAI;AACH,UAAM,0BAA0B;AAAA,EACjC,SAAS,GAAP;AAED,QAAI,EAAE,YAAY,wBAAwB;AACzC,YAAM;AAAA,IACP;AAAA,EACD;AACA,QAAM,0BAA0B;AACjC;AAEA,MAAO,2BAAyC,WAAW;AAAA,EAG1D,MAAM,UAAU;AAEf,UAAM,EAAE,MAAM,MAAM,IAAK,MAAM,MAAM,qBAAqB,EAAE;AAAA,MAAK,CAAC,MACjE,EAAE,KAAK;AAAA,IACR;AACA,QAAI,CAAC,OAAO;AAEX,cAAQ;AAAA,QACP;AAAA,MACD;AACA;AAAA,IACD;AACA,UAAM,SAAS,IAAI,UAAU,kBAAkB,MAAM;AACrD,WAAO,YAAY,OAAO,YAAY;AAErC,YAAM,OAAO,QAAQ;AACrB,UAAI,OAAO,SAAS,YAAY,KAAK,SAAS,KAAK,GAAG;AACrD,iBAAS,gBAAgB,UAAU,IAAI,YAAY;AACnD,cAAM,qBAAqB;AAC3B,iBAAS,gBAAgB,cAAc,IAAI,MAAM,YAAY,CAAC;AAC9D,iBAAS,gBAAgB,UAAU,OAAO,YAAY;AAAA,MACvD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,aAAa;AAClB,SAAK,OAAO,MAAM;AAAA,EACnB;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Controller } from "stimulus";
|
|
2
|
+
function make_new_link(href) {
|
|
3
|
+
const new_link = document.createElement("link");
|
|
4
|
+
new_link.rel = "stylesheet";
|
|
5
|
+
new_link.href = href.split("?")[0] + `?${Math.random()}+${Math.random()}`;
|
|
6
|
+
new_link.type = "text/css";
|
|
7
|
+
return new_link;
|
|
8
|
+
}
|
|
9
|
+
function refresh_css() {
|
|
10
|
+
const actual_hrefs = new Set(
|
|
11
|
+
Array.from(document.querySelectorAll("head link[rel=stylesheet]")).map(
|
|
12
|
+
(e) => {
|
|
13
|
+
var _a;
|
|
14
|
+
return (_a = e == null ? void 0 : e.getAttribute("href")) == null ? void 0 : _a.split("?")[0];
|
|
15
|
+
}
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
return actual_hrefs.forEach((href) => {
|
|
19
|
+
var _a;
|
|
20
|
+
const new_link = make_new_link(href);
|
|
21
|
+
const to_delete_after_load = Array.from(
|
|
22
|
+
document.querySelectorAll(
|
|
23
|
+
`head link[rel=stylesheet][href^="${href}"]`
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
new_link.onload = function() {
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
to_delete_after_load.forEach((to_remove) => {
|
|
29
|
+
to_remove.remove();
|
|
30
|
+
});
|
|
31
|
+
}, 100);
|
|
32
|
+
};
|
|
33
|
+
(_a = document.querySelector("head")) == null ? void 0 : _a.appendChild(new_link);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
class RefreshStyles extends Controller {
|
|
37
|
+
async connect() {
|
|
38
|
+
const { port } = await fetch("/dist/notifier.json").then(
|
|
39
|
+
(r) => r.json()
|
|
40
|
+
);
|
|
41
|
+
try {
|
|
42
|
+
this.socket = new WebSocket(`ws://localhost:${port}`);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
console.error(e);
|
|
45
|
+
console.warn(
|
|
46
|
+
"Not enabling auto style refresh due to the above error"
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
this.socket.onmessage = async (message) => {
|
|
50
|
+
if (message.data === "css") {
|
|
51
|
+
refresh_css();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
document.documentElement.addEventListener("turbo:morph", refresh_css);
|
|
55
|
+
}
|
|
56
|
+
async disconnect() {
|
|
57
|
+
this.socket.close();
|
|
58
|
+
document.documentElement.removeEventListener(
|
|
59
|
+
"turbo:morph",
|
|
60
|
+
refresh_css
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
RefreshStyles as default
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=refresh-styles.stimulus.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/controllers/refresh-styles.stimulus.ts"],
|
|
4
|
+
"sourcesContent": ["import { Controller } from \"stimulus\";\n\nfunction make_new_link(href: string) {\n\tconst new_link = document.createElement(\"link\");\n\tnew_link.rel = \"stylesheet\";\n\tnew_link.href = href.split(\"?\")[0] + `?${Math.random()}+${Math.random()}`;\n\tnew_link.type = \"text/css\";\n\treturn new_link;\n}\n\nfunction refresh_css() {\n\tconst actual_hrefs = new Set(\n\t\tArray.from(document.querySelectorAll(\"head link[rel=stylesheet]\")).map(\n\t\t\t(e) => e?.getAttribute(\"href\")?.split(\"?\")[0]\n\t\t)\n\t);\n\treturn actual_hrefs.forEach((href: string) => {\n\t\tconst new_link = make_new_link(href);\n\t\tconst to_delete_after_load = Array.from(\n\t\t\tdocument.querySelectorAll(\n\t\t\t\t`head link[rel=stylesheet][href^=\"${href}\"]`\n\t\t\t)\n\t\t);\n\t\tnew_link.onload = function () {\n\t\t\t// delay to prevent flicker\n\t\t\tsetTimeout(() => {\n\t\t\t\tto_delete_after_load.forEach((to_remove) => {\n\t\t\t\t\tto_remove.remove();\n\t\t\t\t});\n\t\t\t}, 100);\n\t\t};\n\t\tdocument.querySelector(\"head\")?.appendChild(new_link);\n\t});\n}\n\nexport default class RefreshStyles extends Controller {\n\tsocket: WebSocket;\n\n\tasync connect() {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst { port } = await fetch(\"/dist/notifier.json\").then((r) =>\n\t\t\tr.json()\n\t\t);\n\t\ttry {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\n\t\t\tthis.socket = new WebSocket(`ws://localhost:${port as number}`);\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(\n\t\t\t\t\"Not enabling auto style refresh due to the above error\"\n\t\t\t);\n\t\t}\n\t\tthis.socket.onmessage = async (message) => {\n\t\t\tif (message.data === \"css\") {\n\t\t\t\trefresh_css();\n\t\t\t}\n\t\t};\n\t\tdocument.documentElement.addEventListener(\"turbo:morph\", refresh_css);\n\t}\n\n\tasync disconnect() {\n\t\tthis.socket.close();\n\t\tdocument.documentElement.removeEventListener(\n\t\t\t\"turbo:morph\",\n\t\t\trefresh_css\n\t\t);\n\t}\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,kBAAkB;AAE3B,SAAS,cAAc,MAAc;AACpC,QAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,WAAS,MAAM;AACf,WAAS,OAAO,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK,OAAO;AACtE,WAAS,OAAO;AAChB,SAAO;AACR;AAEA,SAAS,cAAc;AACtB,QAAM,eAAe,IAAI;AAAA,IACxB,MAAM,KAAK,SAAS,iBAAiB,2BAA2B,CAAC,EAAE;AAAA,MAClE,CAAC,MAAG;AAbP;AAaU,4CAAG,aAAa,YAAhB,mBAAyB,MAAM,KAAK;AAAA;AAAA,IAC5C;AAAA,EACD;AACA,SAAO,aAAa,QAAQ,CAAC,SAAiB;AAhB/C;AAiBE,UAAM,WAAW,cAAc,IAAI;AACnC,UAAM,uBAAuB,MAAM;AAAA,MAClC,SAAS;AAAA,QACR,oCAAoC;AAAA,MACrC;AAAA,IACD;AACA,aAAS,SAAS,WAAY;AAE7B,iBAAW,MAAM;AAChB,6BAAqB,QAAQ,CAAC,cAAc;AAC3C,oBAAU,OAAO;AAAA,QAClB,CAAC;AAAA,MACF,GAAG,GAAG;AAAA,IACP;AACA,mBAAS,cAAc,MAAM,MAA7B,mBAAgC,YAAY;AAAA,EAC7C,CAAC;AACF;AAEA,MAAO,sBAAoC,WAAW;AAAA,EAGrD,MAAM,UAAU;AAEf,UAAM,EAAE,KAAK,IAAI,MAAM,MAAM,qBAAqB,EAAE;AAAA,MAAK,CAAC,MACzD,EAAE,KAAK;AAAA,IACR;AACA,QAAI;AAGH,WAAK,SAAS,IAAI,UAAU,kBAAkB,MAAgB;AAAA,IAC/D,SAAS,GAAP;AACD,cAAQ,MAAM,CAAC;AAEf,cAAQ;AAAA,QACP;AAAA,MACD;AAAA,IACD;AACA,SAAK,OAAO,YAAY,OAAO,YAAY;AAC1C,UAAI,QAAQ,SAAS,OAAO;AAC3B,oBAAY;AAAA,MACb;AAAA,IACD;AACA,aAAS,gBAAgB,iBAAiB,eAAe,WAAW;AAAA,EACrE;AAAA,EAEA,MAAM,aAAa;AAClB,SAAK,OAAO,MAAM;AAClB,aAAS,gBAAgB;AAAA,MACxB;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/submit-on-input.stimulus.ts"],
|
|
4
4
|
"sourcesContent": ["/* eslint-disable @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-unsafe-assignment */\nimport { Controller } from \"stimulus\";\nimport { throttle } from \"throttle-debounce\";\n\nexport default class SubmitOnInput extends Controller<HTMLTextAreaElement> {\n\tsendValues: () => void;\n\n\tconnect() {\n\t\tthis.sendValues = throttle(\n\t\t\t500,\n\t\t\t() => {\n\t\t\t\tconst component_index =\n\t\t\t\t\tthis.element\n\t\t\t\t\t\t.closest(\".jdd-editor__component-block\")\n\t\t\t\t\t\t?.getAttribute(\"data-component-index\") || null;\n\t\t\t\tif (component_index == null) {\n\t\t\t\t\t// not an input within a JDD component editor\n\t\t\t\t\tthis.element.closest(\"form\")?.requestSubmit();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// During this automatic submit, we force idiomorph to only update the components edited by this input.\n\t\t\t\tconst updateOnlyPreview = (event: BeforeUnloadEvent) => {\n\t\t\t\t\tconst target = event.target as HTMLDivElement;\n\t\t\t\t\tif (\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"component-arguments\",\n\t\t\t\t\t\t\t\"component-preview__header\",\n\t\t\t\t\t\t].includes(target.id) ||\n\t\t\t\t\t\t(target.parentElement?.classList.contains(\n\t\t\t\t\t\t\t\"jdd-container\"\n\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\t!target.classList.contains(\n\t\t\t\t\t\t\t\t\"component-number-\" + component_index\n\t\t\t\t\t\t\t))\n\t\t\t\t\t) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdocument.addEventListener(\n\t\t\t\t\t\"turbo:before-morph-element\",\n\t\t\t\t\tupdateOnlyPreview\n\t\t\t\t);\n\t\t\t\tthis.element.closest(\"form\")?.requestSubmit();\n\t\t\t\tconst after_submit = () => {\n\t\t\t\t\tdocument.removeEventListener(\n\t\t\t\t\t\t\"turbo:before-morph-element\",\n\t\t\t\t\t\tupdateOnlyPreview\n\t\t\t\t\t);\n\t\t\t\t\tdocument.removeEventListener(\"turbo:morph\", after_submit);\n\t\t\t\t};\n\t\t\t\tdocument.addEventListener(\"turbo:morph\", after_submit);\n\t\t\t},\n\t\t\t{ noTrailing: false }\n\t\t);\n\t}\n\n\tmakePermanent() {\n\t\t// this prevents morphing from overwriting the input value with previous half-dane values - https://github.com/hotwired/turbo/issues/1199\n\t\tthis.element.setAttribute(\"data-turbo-permanent\", \"\");\n\t}\n\n\tmakeNotPermanent() {\n\t\tthis.element.removeAttribute(\"data-turbo-permanent\");\n\t}\n}\n"],
|
|
5
5
|
"mappings": "AACA,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AAEzB,MAAO,sBAAoC,WAAgC;AAAA,EAG1E,UAAU;AACT,SAAK,aAAa;AAAA,MACjB;AAAA,MACA,MAAM;AAVT;AAWI,cAAM,oBACL,UAAK,QACH,QAAQ,8BAA8B,MADxC,mBAEG,aAAa,4BAA2B;AAC5C,YAAI,mBAAmB,MAAM;AAE5B,qBAAK,QAAQ,QAAQ,MAAM,MAA3B,mBAA8B;AAC9B;AAAA,QACD;AAGA,cAAM,oBAAoB,CAAC,UAA6B;AAtB5D,cAAAA;AAuBK,gBAAM,SAAS,MAAM;AACrB,cACC;AAAA,YACC;AAAA,YACA;AAAA,UACD,EAAE,SAAS,OAAO,EAAE,OACnBA,MAAA,OAAO,kBAAP,gBAAAA,IAAsB,UAAU;AAAA,YAChC;AAAA,gBAEA,CAAC,OAAO,UAAU;AAAA,YACjB,sBAAsB;AAAA,UACvB,GACA;AACD,kBAAM,eAAe;AAAA,UACtB;AAAA,QACD;AACA,iBAAS;AAAA,UACR;AAAA,UACA;AAAA,QACD;AACA,mBAAK,QAAQ,QAAQ,MAAM,MAA3B,mBAA8B;AAC9B,cAAM,eAAe,MAAM;AAC1B,mBAAS;AAAA,YACR;AAAA,YACA;AAAA,UACD;AACA,mBAAS,oBAAoB,eAAe,YAAY;AAAA,QACzD;AACA,iBAAS,iBAAiB,eAAe,YAAY;AAAA,MACtD;AAAA,MACA,EAAE,YAAY,MAAM;AAAA,IACrB;AAAA,EACD;AAAA,EAEA,gBAAgB;AAEf,SAAK,QAAQ,aAAa,wBAAwB,EAAE;AAAA,EACrD;AAAA,EAEA,mBAAmB;AAClB,SAAK,QAAQ,gBAAgB,sBAAsB;AAAA,EACpD;AACD;",
|
|
6
6
|
"names": ["_a"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/controllers/toast.stimulus.ts"],
|
|
4
4
|
"sourcesContent": ["import { Controller } from \"stimulus\";\n\nexport default class Toast extends Controller {\n\tconnect() {\n\t\tconsole.log(\"connect\");\n\t\tthis.element.addEventListener(\n\t\t\t\"animationend\",\n\t\t\t({ animationName }: AnimationEvent) => {\n\t\t\t\tif (animationName == \"fade-out\") {\n\t\t\t\t\tthis.element.parentElement?.removeChild(this.element);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n}\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,kBAAkB;AAE3B,MAAO,cAA4B,WAAW;AAAA,EAC7C,UAAU;AACT,YAAQ,IAAI,SAAS;AACrB,SAAK,QAAQ;AAAA,MACZ;AAAA,MACA,CAAC,EAAE,cAAc,MAAsB;AAP1C;AAQI,YAAI,iBAAiB,YAAY;AAChC,qBAAK,QAAQ,kBAAb,mBAA4B,YAAY,KAAK;AAAA,QAC9C;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;",
|
|
6
6
|
"names": []
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import {
|
|
2
|
+
documentContainerFromStorage,
|
|
3
|
+
documentToParsed,
|
|
4
|
+
documentToStorage
|
|
5
|
+
} from "@sealcode/jdd";
|
|
6
|
+
import JDDCreator from "./jdd-creator.js";
|
|
7
|
+
import { tempstream } from "tempstream";
|
|
8
|
+
class EditJDDField extends JDDCreator {
|
|
9
|
+
async getID(ctx) {
|
|
10
|
+
const id = ctx.params["id"];
|
|
11
|
+
if (!id) {
|
|
12
|
+
throw new Error("Missing URL parameter: id");
|
|
13
|
+
}
|
|
14
|
+
return id;
|
|
15
|
+
}
|
|
16
|
+
async getItem(ctx) {
|
|
17
|
+
const {
|
|
18
|
+
items: [item]
|
|
19
|
+
} = await this.getCollection(ctx).list(ctx.$context).ids([await this.getID(ctx)]).fetch();
|
|
20
|
+
if (!item) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
"Couldn't get item of id " + await this.getID(ctx)
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
return item;
|
|
26
|
+
}
|
|
27
|
+
mount(router, path) {
|
|
28
|
+
super.mount(router, path);
|
|
29
|
+
router.post(path + "save/", async (ctx) => {
|
|
30
|
+
const { state } = await this.extractState(ctx);
|
|
31
|
+
const item = await this.getItem(ctx);
|
|
32
|
+
item.set(
|
|
33
|
+
this.getJDDFieldName(),
|
|
34
|
+
(await documentToStorage(
|
|
35
|
+
this.registry,
|
|
36
|
+
this.makeJDDContext(ctx),
|
|
37
|
+
{
|
|
38
|
+
value: state.components
|
|
39
|
+
}
|
|
40
|
+
)).value
|
|
41
|
+
);
|
|
42
|
+
await item.save(ctx.$context);
|
|
43
|
+
ctx.type = "html";
|
|
44
|
+
ctx.status = 422;
|
|
45
|
+
if (!state.messages) {
|
|
46
|
+
state.messages = [];
|
|
47
|
+
}
|
|
48
|
+
state.messages.push("Saved!");
|
|
49
|
+
ctx.body = this.render(ctx, state);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async renderHeader(_ctx, _item) {
|
|
53
|
+
return `<h1>Edit JDD</h1>`;
|
|
54
|
+
}
|
|
55
|
+
async renderPreParameterButtons(ctx) {
|
|
56
|
+
const item = await this.getItem(ctx);
|
|
57
|
+
return tempstream`<div>${this.renderHeader(ctx, item)}</div>`;
|
|
58
|
+
}
|
|
59
|
+
renderParameterButtons(state) {
|
|
60
|
+
{
|
|
61
|
+
}
|
|
62
|
+
return `<div class="jdd-editor__toolbar">
|
|
63
|
+
<input type="submit" value="Preview" />
|
|
64
|
+
<select name="component">
|
|
65
|
+
${Object.keys(this.getRegistryComponents()).map((cmp) => `<option value="${cmp}">${cmp}</option>`).join("")}
|
|
66
|
+
</select>
|
|
67
|
+
${this.makeActionButton(state, {
|
|
68
|
+
action: "add_component",
|
|
69
|
+
label: "Add component"
|
|
70
|
+
})}
|
|
71
|
+
<input type="submit" formaction="./save/" value="zapisz" />
|
|
72
|
+
</div>`;
|
|
73
|
+
}
|
|
74
|
+
async getInitialState(ctx) {
|
|
75
|
+
const article = await this.getItem(ctx);
|
|
76
|
+
const parsed_document = await documentToParsed(
|
|
77
|
+
this.registry,
|
|
78
|
+
this.makeJDDContext(ctx),
|
|
79
|
+
documentContainerFromStorage(
|
|
80
|
+
article.get(this.getJDDFieldName()) || []
|
|
81
|
+
)
|
|
82
|
+
);
|
|
83
|
+
return {
|
|
84
|
+
components: parsed_document.value.map((e) => ({
|
|
85
|
+
...e,
|
|
86
|
+
open: true
|
|
87
|
+
}))
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
EditJDDField
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=edit-jdd-field.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/edit-jdd-field.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type Router from \"@koa/router\";\nimport type { JDDocumentContainer, RawJDDocument } from \"@sealcode/jdd\";\nimport {\n\tdocumentContainerFromStorage,\n\tdocumentToParsed,\n\tdocumentToStorage,\n} from \"@sealcode/jdd\";\nimport type { Context } from \"koa\";\nimport type { Collection, CollectionItem, FieldNames } from \"sealious\";\nimport JDDCreator from \"./jdd-creator.js\";\nimport type { JDDPageState } from \"./jdd-page.js\";\nimport { tempstream } from \"tempstream\";\n\nexport abstract class EditJDDField<C extends Collection> extends JDDCreator {\n\tasync getID(ctx: Context): Promise<string> {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-unsafe-member-access\n\t\tconst id = ctx.params[\"id\"] as string;\n\t\tif (!id) {\n\t\t\tthrow new Error(\"Missing URL parameter: \" + \"id\");\n\t\t}\n\t\treturn id;\n\t}\n\n\tabstract getCollection(ctx: Context): C;\n\n\tasync getItem(ctx: Context): Promise<CollectionItem<C>> {\n\t\tconst {\n\t\t\titems: [item],\n\t\t} = await this.getCollection(ctx)\n\t\t\t.list(ctx.$context)\n\t\t\t.ids([await this.getID(ctx)])\n\t\t\t.fetch();\n\t\tif (!item) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Couldn't get item of id \" + (await this.getID(ctx))\n\t\t\t);\n\t\t}\n\t\treturn item;\n\t}\n\n\tabstract getJDDFieldName(): FieldNames<C[\"fields\"]>;\n\n\tmount(router: Router, path: string) {\n\t\tsuper.mount(router, path);\n\n\t\trouter.post(path + \"save/\", async (ctx) => {\n\t\t\tconst { state } = await this.extractState(ctx);\n\t\t\tconst item = await this.getItem(ctx);\n\n\t\t\titem.set(\n\t\t\t\tthis.getJDDFieldName(),\n\t\t\t\t(\n\t\t\t\t\tawait documentToStorage(\n\t\t\t\t\t\tthis.registry,\n\t\t\t\t\t\tthis.makeJDDContext(ctx),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue: state.components,\n\t\t\t\t\t\t} as unknown as JDDocumentContainer<\"parsed\">\n\t\t\t\t\t)\n\t\t\t\t).value as any\n\t\t\t);\n\t\t\tawait item.save(ctx.$context);\n\t\t\tctx.type = \"html\";\n\t\t\tctx.status = 422;\n\t\t\tif (!state.messages) {\n\t\t\t\tstate.messages = [];\n\t\t\t}\n\t\t\tstate.messages.push(\"Saved!\");\n\t\t\tctx.body = this.render(ctx, state);\n\t\t});\n\t}\n\n\tasync renderHeader(_ctx: Context, _item: CollectionItem<C>) {\n\t\treturn /* HTML */ `<h1>Edit JDD</h1>`;\n\t}\n\n\tasync renderPreParameterButtons(ctx: Context) {\n\t\tconst item = await this.getItem(ctx);\n\t\treturn tempstream`<div>${this.renderHeader(ctx, item)}</div>`;\n\t}\n\n\trenderParameterButtons(state: JDDPageState) {\n\t\t{\n\t\t\t/*The below button has to be here in order for it to be the default behavior */\n\t\t}\n\t\treturn `<div class=\"jdd-editor__toolbar\">\n\t\t\t\t<input type=\"submit\" value=\"Preview\" />\n\t\t\t\t<select name=\"component\">\n\t\t\t\t\t${Object.keys(this.getRegistryComponents())\n\t\t\t\t\t\t.map((cmp) => `<option value=\"${cmp}\">${cmp}</option>`)\n\t\t\t\t\t\t.join(\"\")}\n\t\t\t\t</select>\n\t\t\t\t${this.makeActionButton(state, {\n\t\t\t\t\taction: \"add_component\",\n\t\t\t\t\tlabel: \"Add component\",\n\t\t\t\t})}\n\t\t\t\t<input type=\"submit\" formaction=\"./save/\" value=\"zapisz\" />\n\t\t\t</div>`;\n\t}\n\n\tasync getInitialState(ctx: Context) {\n\t\tconst article = await this.getItem(ctx);\n\t\tconst parsed_document = await documentToParsed(\n\t\t\tthis.registry,\n\t\t\tthis.makeJDDContext(ctx),\n\t\t\tdocumentContainerFromStorage(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t(article.get(this.getJDDFieldName()) as RawJDDocument) || []\n\t\t\t)\n\t\t);\n\t\treturn {\n\t\t\tcomponents: parsed_document.value.map((e) => ({\n\t\t\t\t...e,\n\t\t\t\topen: true,\n\t\t\t})),\n\t\t};\n\t}\n\n\t// uncomment to create whitelist of allowed components\n\t// getAllowedComponents() {\n\t// \treturn [\"nice-box\"];\n\t// }\n}\n"],
|
|
5
|
+
"mappings": "AAMA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAGP,OAAO,gBAAgB;AAEvB,SAAS,kBAAkB;AAEpB,MAAe,qBAA2C,WAAW;AAAA,EAC3E,MAAM,MAAM,KAA+B;AAE1C,UAAM,KAAK,IAAI,OAAO;AACtB,QAAI,CAAC,IAAI;AACR,YAAM,IAAI,MAAM,4BAAiC;AAAA,IAClD;AACA,WAAO;AAAA,EACR;AAAA,EAIA,MAAM,QAAQ,KAA0C;AACvD,UAAM;AAAA,MACL,OAAO,CAAC,IAAI;AAAA,IACb,IAAI,MAAM,KAAK,cAAc,GAAG,EAC9B,KAAK,IAAI,QAAQ,EACjB,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,EAC3B,MAAM;AACR,QAAI,CAAC,MAAM;AACV,YAAM,IAAI;AAAA,QACT,6BAA8B,MAAM,KAAK,MAAM,GAAG;AAAA,MACnD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EAIA,MAAM,QAAgB,MAAc;AACnC,UAAM,MAAM,QAAQ,IAAI;AAExB,WAAO,KAAK,OAAO,SAAS,OAAO,QAAQ;AAC1C,YAAM,EAAE,MAAM,IAAI,MAAM,KAAK,aAAa,GAAG;AAC7C,YAAM,OAAO,MAAM,KAAK,QAAQ,GAAG;AAEnC,WAAK;AAAA,QACJ,KAAK,gBAAgB;AAAA,SAEpB,MAAM;AAAA,UACL,KAAK;AAAA,UACL,KAAK,eAAe,GAAG;AAAA,UACvB;AAAA,YACC,OAAO,MAAM;AAAA,UACd;AAAA,QACD,GACC;AAAA,MACH;AACA,YAAM,KAAK,KAAK,IAAI,QAAQ;AAC5B,UAAI,OAAO;AACX,UAAI,SAAS;AACb,UAAI,CAAC,MAAM,UAAU;AACpB,cAAM,WAAW,CAAC;AAAA,MACnB;AACA,YAAM,SAAS,KAAK,QAAQ;AAC5B,UAAI,OAAO,KAAK,OAAO,KAAK,KAAK;AAAA,IAClC,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAe,OAA0B;AAC3D,WAAkB;AAAA,EACnB;AAAA,EAEA,MAAM,0BAA0B,KAAc;AAC7C,UAAM,OAAO,MAAM,KAAK,QAAQ,GAAG;AACnC,WAAO,kBAAkB,KAAK,aAAa,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,uBAAuB,OAAqB;AAC3C;AAAA,IAEA;AACA,WAAO;AAAA;AAAA;AAAA,OAGF,OAAO,KAAK,KAAK,sBAAsB,CAAC,EACxC,IAAI,CAAC,QAAQ,kBAAkB,QAAQ,cAAc,EACrD,KAAK,EAAE;AAAA;AAAA,MAER,KAAK,iBAAiB,OAAO;AAAA,MAC9B,QAAQ;AAAA,MACR,OAAO;AAAA,IACR,CAAC;AAAA;AAAA;AAAA,EAGJ;AAAA,EAEA,MAAM,gBAAgB,KAAc;AACnC,UAAM,UAAU,MAAM,KAAK,QAAQ,GAAG;AACtC,UAAM,kBAAkB,MAAM;AAAA,MAC7B,KAAK;AAAA,MACL,KAAK,eAAe,GAAG;AAAA,MACvB;AAAA,QAEE,QAAQ,IAAI,KAAK,gBAAgB,CAAC,KAAuB,CAAC;AAAA,MAC5D;AAAA,IACD;AACA,WAAO;AAAA,MACN,YAAY,gBAAgB,MAAM,IAAI,CAAC,OAAO;AAAA,QAC7C,GAAG;AAAA,QACH,MAAM;AAAA,MACP,EAAE;AAAA,IACH;AAAA,EACD;AAMD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/lib/src/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { printArgPath } from "./print-arg-path.js";
|
|
2
|
+
function ComponentInputEnum({
|
|
3
|
+
arg_path,
|
|
4
|
+
arg,
|
|
5
|
+
value,
|
|
6
|
+
onchange
|
|
7
|
+
}) {
|
|
8
|
+
return `<div id=${`component-input-enum-${arg_path.join("-")}`}>
|
|
9
|
+
<label>
|
|
10
|
+
${arg_path.at(-1) || ""}
|
|
11
|
+
<select
|
|
12
|
+
name="${`$${printArgPath(arg_path)}`}"
|
|
13
|
+
onchange="${onchange || ""}"
|
|
14
|
+
>
|
|
15
|
+
${arg.values.map(
|
|
16
|
+
(v) => `<option
|
|
17
|
+
value="${v}"
|
|
18
|
+
${value == v ? "selected" : ""}
|
|
19
|
+
>
|
|
20
|
+
${v}
|
|
21
|
+
</option>`
|
|
22
|
+
).join("")}
|
|
23
|
+
</select>
|
|
24
|
+
</label>
|
|
25
|
+
</div>`;
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
ComponentInputEnum
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=component-input-enum.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/inputs/component-input-enum.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Enum } from \"@sealcode/jdd\";\nimport { printArgPath } from \"./print-arg-path.js\";\n\nexport function ComponentInputEnum<State, S extends string, T extends Enum<S>>({\n\targ_path,\n\targ,\n\tvalue,\n\tonchange,\n}: {\n\tstate: State;\n\targ_path: string[];\n\targ: T;\n\tvalue: string;\n\tonchange?: string;\n}) {\n\treturn /* HTML */ `<div id=${`component-input-enum-${arg_path.join(\"-\")}`}>\n\t\t<label>\n\t\t\t${arg_path.at(-1) || \"\"}\n\t\t\t<select\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}`}\"\n\t\t\t\tonchange=\"${onchange || \"\"}\"\n\t\t\t>\n\t\t\t\t${arg.values\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(v: S) => /* HTML */ `<option\n\t\t\t\t\t\t\tvalue=\"${v}\"\n\t\t\t\t\t\t\t${value == v ? \"selected\" : \"\"}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${v}\n\t\t\t\t\t\t</option>`\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")}\n\t\t\t</select>\n\t\t</label>\n\t</div>`;\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,oBAAoB;AAEtB,SAAS,mBAA+D;AAAA,EAC9E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAMG;AACF,SAAkB,WAAW,wBAAwB,SAAS,KAAK,GAAG;AAAA;AAAA,KAElE,SAAS,GAAG,EAAE,KAAK;AAAA;AAAA,YAEZ,IAAI,aAAa,QAAQ;AAAA,gBACrB,YAAY;AAAA;AAAA,MAEtB,IAAI,OACJ;AAAA,IACA,CAAC,MAAoB;AAAA,gBACX;AAAA,SACP,SAAS,IAAI,aAAa;AAAA;AAAA,SAE1B;AAAA;AAAA,EAEJ,EACC,KAAK,EAAE;AAAA;AAAA;AAAA;AAIb;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { tempstream } from "tempstream";
|
|
2
|
+
import { printArgPath } from "./print-arg-path.js";
|
|
3
|
+
import { htmlEscape } from "escape-goat";
|
|
4
|
+
function ComponentInputImage({
|
|
5
|
+
arg_path,
|
|
6
|
+
arg,
|
|
7
|
+
value,
|
|
8
|
+
ctx,
|
|
9
|
+
page,
|
|
10
|
+
state,
|
|
11
|
+
makeJDDContext
|
|
12
|
+
}) {
|
|
13
|
+
const jdd_context = makeJDDContext(ctx);
|
|
14
|
+
return tempstream`<div style="margin-bottom: 10px">
|
|
15
|
+
<label
|
|
16
|
+
style="display: flex; align-items: center; column-gap: 10px;"
|
|
17
|
+
data-controller="input-image-preview"
|
|
18
|
+
>
|
|
19
|
+
${arg_path.at(-1) || ""}
|
|
20
|
+
<div class="image-preview-container">
|
|
21
|
+
${value && jdd_context.render_image(value, {
|
|
22
|
+
container: {
|
|
23
|
+
width: 40,
|
|
24
|
+
height: 40,
|
|
25
|
+
objectFit: "cover"
|
|
26
|
+
},
|
|
27
|
+
crop: { width: 40, height: 40 },
|
|
28
|
+
style: "height: 40px; width: 40px;",
|
|
29
|
+
alt: ""
|
|
30
|
+
})}
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<input
|
|
34
|
+
type="file"
|
|
35
|
+
name="${`$${printArgPath(arg_path)}.new`}"
|
|
36
|
+
value=""
|
|
37
|
+
autocomplete="off"
|
|
38
|
+
data-action="change->input-image-preview#handleChange"
|
|
39
|
+
${arg.hasParent("list") ? "multiple" : ""}
|
|
40
|
+
/>
|
|
41
|
+
</label>
|
|
42
|
+
<div>
|
|
43
|
+
<input
|
|
44
|
+
type="hidden"
|
|
45
|
+
name="${`$${printArgPath(arg_path)}.old`}"
|
|
46
|
+
value="${htmlEscape((value == null ? void 0 : value.token) || "")}"
|
|
47
|
+
autocomplete="off"
|
|
48
|
+
/>
|
|
49
|
+
</div>
|
|
50
|
+
${page.makeActionButton(
|
|
51
|
+
state,
|
|
52
|
+
{
|
|
53
|
+
action: "remove_file",
|
|
54
|
+
label: "\u274C"
|
|
55
|
+
},
|
|
56
|
+
arg_path
|
|
57
|
+
)}
|
|
58
|
+
</div>`;
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
ComponentInputImage
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=component-input-image.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/inputs/component-input-image.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Context } from \"koa\";\nimport type { FilePointer } from \"@sealcode/file-manager\";\nimport type { Image, JDDContext } from \"@sealcode/jdd\";\nimport type { StatefulPage } from \"@sealcode/sealgen\";\nimport type { ComponentPreviewActions } from \"../component-preview-actions.js\";\nimport type { JDDPageState } from \"../jdd-page.js\";\nimport { tempstream } from \"tempstream\";\nimport { printArgPath } from \"./print-arg-path.js\";\nimport { htmlEscape } from \"escape-goat\";\n\nexport function ComponentInputImage<State extends JDDPageState>({\n\targ_path,\n\targ,\n\tvalue,\n\tctx,\n\tpage,\n\tstate,\n\tmakeJDDContext,\n}: {\n\tstate: State;\n\targ_path: string[];\n\targ: Image;\n\tvalue: FilePointer | null;\n\tpage: StatefulPage<JDDPageState, typeof ComponentPreviewActions>;\n\tctx: Context;\n\tmakeJDDContext: (ctx: Context) => JDDContext;\n}): JSX.Element {\n\tconst jdd_context = makeJDDContext(ctx);\n\treturn tempstream/* HTML */ `<div style=\"margin-bottom: 10px\">\n\t\t<label\n\t\t\tstyle=\"display: flex; align-items: center; column-gap: 10px;\"\n\t\t\tdata-controller=\"input-image-preview\"\n\t\t>\n\t\t\t${arg_path.at(-1) || \"\"}\n\t\t\t<div class=\"image-preview-container\">\n\t\t\t\t${value &&\n\t\t\t\tjdd_context.render_image(value, {\n\t\t\t\t\tcontainer: {\n\t\t\t\t\t\twidth: 40,\n\t\t\t\t\t\theight: 40,\n\t\t\t\t\t\tobjectFit: \"cover\",\n\t\t\t\t\t},\n\t\t\t\t\tcrop: { width: 40, height: 40 },\n\t\t\t\t\tstyle: \"height: 40px; width: 40px;\",\n\t\t\t\t\talt: \"\",\n\t\t\t\t})}\n\t\t\t</div>\n\n\t\t\t<input\n\t\t\t\ttype=\"file\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}.new`}\"\n\t\t\t\tvalue=\"\"\n\t\t\t\tautocomplete=\"off\"\n\t\t\t\tdata-action=\"change->input-image-preview#handleChange\"\n\t\t\t\t${arg.hasParent(\"list\") ? \"multiple\" : \"\"}\n\t\t\t/>\n\t\t</label>\n\t\t<div>\n\t\t\t<input\n\t\t\t\ttype=\"hidden\"\n\t\t\t\tname=\"${`$${printArgPath(arg_path)}.old`}\"\n\t\t\t\tvalue=\"${htmlEscape(value?.token || \"\")}\"\n\t\t\t\tautocomplete=\"off\"\n\t\t\t/>\n\t\t</div>\n\t\t${page.makeActionButton(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\taction: \"remove_file\",\n\t\t\t\tlabel: \"\u274C\",\n\t\t\t},\n\t\t\targ_path\n\t\t)}\n\t</div>`;\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAEpB,SAAS,oBAAgD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAQgB;AACf,QAAM,cAAc,eAAe,GAAG;AACtC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,KAKH,SAAS,GAAG,EAAE,KAAK;AAAA;AAAA,MAElB,SACF,YAAY,aAAa,OAAO;AAAA,IAC/B,WAAW;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,IAC9B,OAAO;AAAA,IACP,KAAK;AAAA,EACN,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKO,IAAI,aAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,MAI/B,IAAI,UAAU,MAAM,IAAI,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAM/B,IAAI,aAAa,QAAQ;AAAA,aACxB,YAAW,+BAAO,UAAS,EAAE;AAAA;AAAA;AAAA;AAAA,IAItC,KAAK;AAAA,IACN;AAAA,IACA;AAAA,MACC,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,EACD;AAAA;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|