{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-jsx/src/client/reactive/components/rewritten/conduit/rpComponents/reactiveMorph.js"],"names":["_","DiffDOM","Morph","ReactiveMorph","aexpr","untagged","diffDom","filterOuterDiff","t1","t2","props","attachedCallback","isDummy","resolve","hookRender","detachedCallback","disposeAExpr","registerForms","register","registerButtons","query","eventListenerType","from","node","name","funcName","replace","c","toUpperCase","Function","removeEventListener","addEventListener","addAExpr","_render","nextHtmlDocPromise","htmlDoc","nextHtmlDoc","lastValue","prevHtmlDoc","differentialUpdate","assignProperties","get","differentialUpdateOnShadowRoot","differentialUpdateOnThis","clone","cloneNode","appendChild","createTextNode","diff","root","wrapped","to","webComponentsOnly","includeNative","forEach","key","zip","f","t","render","mapFalseToEmptyString","Node","isFalse","remove","child","value","group","has","toDispose","flatten","values","dispose"],"mappings":"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","file":"reactiveMorph.js","sourcesContent":["'enable aexpr';\n\nimport _ from 'src/external/lodash/lodash.js';\nimport { DiffDOM } from 'src/external/diffDom.js';\nimport Morph from 'src/components/widgets/lively-morph.js';\n\nexport default class ReactiveMorph extends Morph {\n  \n  /* properties */\n  get aexpr() { \n    return this._aexpr || (this._aexpr = { untagged: [] });\n  }\n  \n  get diffDom() {\n    return this._diffDom || (this._diffDom = new DiffDOM({\n      filterOuterDiff: (t1, t2) => this.filterOuterDiff(t1, t2)\n    }));\n  }\n  \n  get props() {\n    return this._props || (this._props = {});\n  }\n\n  /* component lifecycle */\n  attachedCallback() {\n    if(this.isDummy()) return Promise.resolve();\n    return this.hookRender();\n  }\n\n  detachedCallback() {\n    this.disposeAExpr();\n  }\n \n  /* form binding */\n  registerForms() {\n    this.register('form', 'submit');\n  }\n  \n  registerButtons() {\n    this.register(':not(form):not(fieldset) > button', 'click');\n  }\n  \n  register(query, eventListenerType) {\n    Array.from((this.shadowRoot || this).querySelectorAll(query)).forEach(node => {\n      var name = node.id;\n      if (name) {\n        var funcName = name.replace(/^./, c => 'on'+ c.toUpperCase());\n        if (this[funcName] instanceof Function) {\n          node.removeEventListener(eventListenerType, this[funcName]);\n          this[funcName] = this[funcName].bind(this);\n          node.addEventListener(eventListenerType, this[funcName]);\n        }\n      }\n    });\n  }\n\n  /* Render */  \n  hookRender() {\n    this.addAExpr(aexpr(() => this._render())\n                .onChange(nextHtmlDocPromise => \n                      Promise.resolve(nextHtmlDocPromise)\n                        .then(htmlDoc => this.lastResolvedRender = htmlDoc)));\n    this.addAExpr(aexpr(() => this.lastResolvedRender)\n                  .onChange((nextHtmlDoc, { lastValue: prevHtmlDoc }) => {\n      if ((nextHtmlDoc && nextHtmlDoc.outerHTML) !== (prevHtmlDoc && prevHtmlDoc.outerHTML)) {\n        this.differentialUpdate(nextHtmlDoc);\n        this.registerButtons();\n        this.registerForms();\n      } else if (this.tagName !== 'LINK-RP19' && nextHtmlDoc && prevHtmlDoc)\n        this.assignProperties(nextHtmlDoc, this.shadowRoot ? this.get('#root') : this.lastChild, true);\n    }));\n    return Promise\n      .resolve(this._render())\n      .then(nextHtmlDoc => this.lastResolvedRender = nextHtmlDoc)\n      .then(htmlDoc => this.differentialUpdate(htmlDoc)) \n      .then(() => { \n        this.registerButtons(); \n        this.registerForms(); \n      });\n  }\n\n  differentialUpdate(nextHtmlDoc) {\n    // console.log(`diff ${this.localName}`);\n    if (this.shadowRoot)\n      this.differentialUpdateOnShadowRoot(nextHtmlDoc);\n    else\n      this.differentialUpdateOnThis(nextHtmlDoc);\n  }\n\n  differentialUpdateOnThis(nextHtmlDoc) {\n    const clone = this.cloneNode();\n    clone.appendChild(nextHtmlDoc || document.createTextNode(''));\n    const diff = this.diffDom.diff(this, clone);\n    if (diff.length && this.diffDom.apply(this, diff) && nextHtmlDoc)\n      this.assignProperties(nextHtmlDoc, this.lastChild);\n  }\n\n  differentialUpdateOnShadowRoot(nextHtmlDoc) {\n    const root = this.get('#root');\n    if (!root) throw Error('DIV with id \"root\" is missing!');\n    const wrapped = (\n      <div id='root'>\n        { nextHtmlDoc || '' }\n      </div>\n    );\n    const diff = this.diffDom.diff(root, wrapped);\n    if(diff.length && this.diffDom.apply(root, diff))\n      this.assignProperties(wrapped, root);\n  }\n\n  assignProperties(from, to, webComponentsOnly = false) {\n    const includeNative = ['onclick', 'onkeydown', 'onblur', '_props'];\n    // const excludeNative = ['elementMetaData', '_aexpr', '_lively4created', '_diffDom'];\n    // const keysToCopy = [..._.difference(_.keys(from), excludeNative), ...includeNative];\n    if (!webComponentsOnly || from.tagName.includes('-'))\n      _.forEach(includeNative, key =>\n        to[key] = from[key]);\n    if (from.tagName === 'ROUTER-RP19' || !from.tagName.includes('-'))\n      _.zip([...from.children], [...to.children])\n        .forEach(([f, t]) => f && t && this.assignProperties(f, t));\n  }\n  \n  render() { return (<div />); } \n  \n  _render() {\n    return Promise.resolve(this.render())\n            .then(htmlDoc => this.mapFalseToEmptyString(htmlDoc))\n  }\n  \n  mapFalseToEmptyString(htmlDoc) {\n    if (!htmlDoc || !htmlDoc.nodeType) return htmlDoc;\n    if (htmlDoc.nodeType === Node.TEXT_NODE && this.isFalse(htmlDoc.textContent))\n      htmlDoc.remove();\n    else\n      _([...htmlDoc.childNodes]).forEach(child =>\n        this.mapFalseToEmptyString(child));\n    return htmlDoc;\n  }\n  \n  /* DiffDOM */ \n  filterOuterDiff(t1, t2) {\n    if (t1.nodeName === 'TEXTAREA')\n      t2.value = t1.value;\n    if (t1.nodeName === 'LINK-RP19') return;\n    if (t1.nodeName === t2.nodeName && \n        t1.nodeName !== this.tagName &&\n        t1.nodeName.includes('-')) {\n      t1.innerDone = true;\n    }\n  }\n  \n  /* conditionals */\n  isDummy(node = this) {\n    return !!node.parentNode && (\n      node.parentNode.getAttribute('id') === 'livelySpawnArea' || \n      node.parentNode.tagName === 'ROUTER-RP19'\n    )\n  }\n  \n  isFalse(value) {\n    return !value || \n      value === 'undefined' || \n      value === 'false' || \n      value === 'null';\n  }\n  \n  /* aexpr helper */\n  addAExpr(aexpr, group) {\n    if (group && !_.has(this.aexpr, group)) \n      this.aexpr[group] = [];\n    this.aexpr[group || 'untagged'].push(aexpr);\n  }\n  \n  disposeAExpr(group) {\n    const toDispose = group ? this.aexpr[group] || [] : _.flatten(_.values(this.aexpr));\n    toDispose.forEach(aexpr => aexpr.dispose())\n  }\n}"]}