{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/src/babylonian-programming-editor/ui/form-widget.js"],"names":["InputWidget","InputField","abstract","defaultInstance","FormWidget","constructor","editor","location","kind","instances","customInstances","changeCallback","deleteCallback","_keys","_nameElement","_elements","Map","_instances","_customInstances","_prescript","_postscript","_getFormElementForKey","key","has","set","_makeFormElementForKey","element","get","input","options","_getOptions","_changeCallback","label","id","_getNameElement","className","style","cssText","_getAdditionalFormElements","_addFormElements","form","_element","appendChild","elementsToAdd","forEach","e","push","length","shift","_update","_onExpandClicked","classList","toggle","_onPrePostscriptClicked","comp","lively","openComponentInWindow","setup","name","keys","prescript","postscript","value","concat","filter","i","code","values","reduce","acc","k","Object","fireChange","valuesArray","map"],"mappings":"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","file":"form-widget.js","sourcesContent":["import InputWidget from \"./input-widget.js\";\nimport InputField from \"./input-field.js\";\nimport { abstract } from \"../utils/utils.js\";\nimport { defaultInstance } from \"../utils/defaults.js\";\n\n\nexport default class FormWidget extends InputWidget {\n  constructor(editor, location, kind, instances, customInstances, changeCallback, deleteCallback) {\n    super(editor, location, kind, changeCallback, deleteCallback);\n    this._keys = []; // [key]\n    this._nameElement = null; // InputField\n    this._elements = new Map(); // Map(key, {element, input})\n\n    this._instances = instances; // [Instance]\n    this._customInstances = customInstances; // [CustomInstance]\n\n    this._prescript = \"\"\n    this._postscript = \"\"\n  }\n\n  // UI Generators\n\n  _getFormElementForKey(key) {\n    if(!this._elements.has(key)) {\n      this._elements.set(key, this._makeFormElementForKey(key));\n    }\n    const element = this._elements.get(key);\n    element.input.options = this._getOptions();\n    return this._elements.get(key);\n  }\n\n  _makeFormElementForKey(key) {\n    // Textfield\n    const input = new InputField(this, key, \"null\", this._changeCallback);\n\n    // Label\n    const label = <label\n                    for={input.id}\n                  >{key + \":\"}</label>\n\n    return {\n      element: <span class=\"space-before\">\n                 {label}\n                 {input.element}\n               </span>,\n      input: input\n    };\n  }\n\n  _getNameElement(className, style) {\n    if(!this._nameElement) {\n      const input =  new InputField(this,\n                                    \"__name\",\n                                    \"name\",\n                                    this._changeCallback,\n                                    className,\n                                    style,\n                                    false);\n\n      this._nameElement = input;\n    }\n\n   this._nameElement.style.cssText = style;\n\n    return this._nameElement;\n  }\n\n  _getAdditionalFormElements() {\n    return [];\n  }\n\n  _addFormElements() {\n    const form = <div class=\"form\"></div>;\n    this._element.appendChild(form);\n\n    const elementsToAdd = [];\n    this._getAdditionalFormElements().forEach(e => elementsToAdd.push(e.element));\n    this._keys.forEach(key => elementsToAdd.push(this._getFormElementForKey(key).element));\n\n    while(elementsToAdd.length) {\n      form.appendChild(elementsToAdd.shift());\n    }\n  }\n\n  _update() {\n    abstract();\n  }\n\n  _onExpandClicked() {\n    this._element.classList.toggle(\"expanded\");\n  }\n\n  async _onPrePostscriptClicked() {\n    let comp = await lively.openComponentInWindow(\"pre-post-script-editor\");\n    comp.setup(this.name, this.keys, this.prescript, this.postscript, (value) => {\n      this._prescript = value.prescript;\n      this._postscript = value.postscript;\n      this._changeCallback();\n    });\n  }\n\n  _getOptions() {\n    return [defaultInstance()].concat(this._instances)\n                              .concat(this._customInstances)\n                              .filter(i => i.id !== this.id);\n  }\n\n  // Getters and Setters\n\n  get code() {\n    abstract();\n  }\n\n  get keys() {\n    return this._keys;\n  }\n\n  set keys(keys) {\n    this._keys = keys;\n    this._update();\n  }\n\n  get name() {\n    if(this._nameElement) {\n      return this._nameElement.value;\n    } else {\n      return \"\";\n    }\n  }\n\n  set name(name) {\n    this._nameElement.value = name;\n  }\n\n  get prescript() {\n    return this._prescript;\n  }\n\n  set prescript(prescript) {\n    this._prescript = prescript ? prescript : \"\";\n  }\n\n  get postscript() {\n    return this._postscript;\n  }\n\n  set postscript(postscript) {\n    this._postscript = postscript ? postscript : \"\";\n  }\n\n  get values() {\n    return this._keys.reduce((acc, k) => {\n      acc[k] = this._elements.get(k).input.value;\n      return acc;\n    }, {});\n  }\n\n  set values(values) {\n    this.keys = Object.keys(values);\n    for(let key of this._keys) {\n      this._elements.get(key).input.value = values[key];\n      this._elements.get(key).input.fireChange();\n    }\n  }\n\n  get valuesArray() {\n    return this._keys.map(k => this._elements.get(k).input.value);\n  }\n\n}\n"]}