From 8c80ab6f761a5927da334066b331374f169e083d Mon Sep 17 00:00:00 2001 From: dcore94 Date: Wed, 27 Sep 2023 12:14:35 +0200 Subject: [PATCH] added support for mulitichoice enum --- ccp/js/inputwidgetcontroller.js | 81 ++++++++++++++++++++++++--- ccp/js/inputwidgeteditorcontroller.js | 42 ++++++++------ 2 files changed, 99 insertions(+), 24 deletions(-) diff --git a/ccp/js/inputwidgetcontroller.js b/ccp/js/inputwidgetcontroller.js index 33a82d9..3163288 100644 --- a/ccp/js/inputwidgetcontroller.js +++ b/ccp/js/inputwidgetcontroller.js @@ -9,10 +9,15 @@ class CCPInputWidgetController extends HTMLElement { connectedCallback(){ this.#data = JSON.parse(this.getAttribute("input")) - if(this.isEnum()){ + if(this.isChecklist()){ + const opts = this.#data.schema.enum.join(",") - this.innerHTML += `` + this.innerHTML += `` + } else if(this.isEnum()){ + + const opts = this.#data.schema.enum.join(",") + this.innerHTML += `` }else if(this.isCode()){ this.innerHTML += `` @@ -46,7 +51,11 @@ class CCPInputWidgetController extends HTMLElement { return this.firstElementChild.name } - isEnum(input){ + isChecklist(){ + return this.isEnum() && (this.#data.schema.format === "checklist") + } + + isEnum(){ return (this.#data.schema.type === "string") && ("enum" in this.#data.schema) } @@ -117,6 +126,11 @@ class CCPBaseInputWidgetController extends HTMLElement{ this.value = Array(Math.max(this.#minOccurs,1)).fill(this.#default) } + setValue(v){ + this.#value = v + this.render() + } + set value(v){ const actual = Array.isArray(v) ? v : [v] if(actual.length < this.#minOccurs || actual.length > this.#maxOccurs){ @@ -272,6 +286,55 @@ class CCPEnumInputWidgetController extends CCPBaseInputWidgetController{ } window.customElements.define('d4s-ccp-input-enum', CCPEnumInputWidgetController); +class CCPChecklistInputWidgetController extends CCPBaseInputWidgetController{ + + constructor(){ + super() + } + + connectedCallback(){ + this.rootdoc.addEventListener("change", ev=>{ + if(ev.target.getAttribute("name") === this.name){ + const index = Number(ev.target.getAttribute("data-index")) + + const elems = Array.prototype.slice.call(ev.currentTarget.querySelectorAll(`input[name='${this.name}'][data-index='${index}']`)) + + this.value[index] = elems.filter(e=>e.checked).map(e=>e.value).join(",") + } + }) + } + + buildOpts(index, selections){ + return this.options.map(o=>` +
+ + -1 ? 'checked' : ''}/>
+ `).join("\n") + } + + content(){ + if(this.value.length === 1){ + const opts = this.buildOpts(0, this.value.length ? this.value[0].split(",") : []) + return ` +
+ ${opts} +
+ ` + } + var out = + this.value.map((c,i)=>{ + const opts = this.buildOpts(i, c.split(",")) + return ` +
+ ${opts} +
+ ` + }).join("\n") + return out + } +} +window.customElements.define('d4s-ccp-input-checklist', CCPChecklistInputWidgetController); + class CCPTextAreaWidgetController extends CCPBaseInputWidgetController{ constructor(){ @@ -382,15 +445,19 @@ class CCPSecretInputWidgetController extends CCPBaseInputWidgetController{ content(){ if(this.value.length <= 1){ return ` - - 👁 +
+ + 👁 +
` } var out = this.value.map((c,i)=>{ return ` - - 👁 +
+ + 👁 +
` }).join("\n") return out diff --git a/ccp/js/inputwidgeteditorcontroller.js b/ccp/js/inputwidgeteditorcontroller.js index 9da3f80..2b8ea66 100644 --- a/ccp/js/inputwidgeteditorcontroller.js +++ b/ccp/js/inputwidgeteditorcontroller.js @@ -65,27 +65,27 @@ class CCPInputWidgetEditorController extends HTMLElement{ this.innerHTML = `
- + ${ input.id !== 'ccpimage' ? this.renderDeleteButton() : ''}
- +
- +
- @@ -94,13 +94,19 @@ class CCPInputWidgetEditorController extends HTMLElement{
- +
- + +
+
+
+ +
+
@@ -108,7 +114,7 @@ class CCPInputWidgetEditorController extends HTMLElement{
- @@ -116,32 +122,34 @@ class CCPInputWidgetEditorController extends HTMLElement{ +
- -
-
-
- -
- +
- + Comma separated list of options
+
+ + +
${this.renderDefaultByType()} - 👁 + 👁
@@ -176,7 +184,7 @@ class CCPInputWidgetEditorController extends HTMLElement{ } else if(ename === "format"){ this.#input.schema.format = val - this.render(this.#input, this.#index, true) + //this.render(this.#input, this.#index, true) /*this.querySelector("div[name=input-default] span[name=password_toggle]").classList.add("d-none") this.querySelector("div[name=input-default] input[name=default]").type = "" if(this.#input.schema.format === "secret"){