{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-croquet/src/components/demo/lively-simulation-state.js"],"names":["Morph","_","DEFAULT_STATE","LivelySimulationState","constructor","initialize","initializeEntries","initializeSaveDiscard","entries","get","addEventListener","handleFocusIn","initializeState","state","setStateFromJSON","save","handleSaveDiscard","discard","entriesToStateJSON","handleDelete","entry","remove","hasEmptyEntry","addEmptyEntry","setState","entriesToState","codeView","getCodeView","preCompile","clearError","message","setError","getState","selector","shadowRoot","querySelector","stateWithUnits","mapValues","key","unit","isObject","value","updateEntries","json","parse","error","status","isFocused","some","querySelectorAll","input","isChildFocused","child","doc","document","map","getKey","getValue","getUnit","filteredEntries","reject","isEmpty","trim","entriesAsJson","stringify","fromPairs","join","entriesState","isEqual","keys","updateEntryValues","replaceEntries","forEach","setValue","toFixed","ensureEmpty","newEntries","toPairs","createEntry","appendChild","focus","getRootNode"],"mappings":"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","file":"lively-simulation-state.js","sourcesContent":["/*MD\n  ![](https://lively-kernel.org/lively4/lively4-core/demos/lively-simulation/screenshots/state.png){width=500px}\nMD*/\n\n\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport _ from 'src/external/lodash/lodash.js';\n\nconst DEFAULT_STATE = '{}';\n\nexport default class LivelySimulationState extends Morph {\n\n  constructor() {\n    super();\n    this.state = DEFAULT_STATE;\n  }\n  \n  // life cycle\n  initialize() {\n    this.initializeEntries();\n    this.initializeSaveDiscard();\n  }\n  \n  initializeEntries() {\n    const entries = this.get('#entries');\n    entries.addEventListener('focusin', () => this.handleFocusIn());\n  }\n\n  initializeState(state = DEFAULT_STATE) {\n    this.isEditing = false;\n    this.setStateFromJSON(state);\n  }\n\n  initializeSaveDiscard() {\n    const save = this.get('#save');\n    save.addEventListener('click', () => this.handleSaveDiscard(true));\n    const discard = this.get('#discard');\n    discard.addEventListener('click', () => this.handleSaveDiscard(false));\n  }\n\n  // event listener\n  handleFocusIn() {\n    if (!this.isEditing) {\n      this.isEditing = true;\n      this.checkpoint = this.entriesToStateJSON();\n      this.get('#saveDiscard').classList.add('show');\n      this.get('#entries').classList.add('edit');\n    }\n  }\n\n  handleSaveDiscard(save) {\n    this.get('#saveDiscard').classList.remove('show');\n    this.get('#entries').classList.remove('edit');\n    this.isEditing = false;\n    if (save) this.save();\n    else this.discard();\n  }\n  \n  handleDelete(entry) {\n    entry.remove();\n    if (!this.hasEmptyEntry()) this.addEmptyEntry();\n  }\n\n  // other\n  save() {\n    try {\n      this.setState(this.entriesToState());\n      const codeView = this.getCodeView();\n      if (codeView && codeView.preCompile) codeView.preCompile(); \n      this.clearError();\n    } catch ({ message }) {\n      this.setError(message);\n    }\n  }\n\n  discard() {\n    this.setStateFromJSON(this.checkpoint);\n  }\n\n  getState() {\n    return this.state;\n  }\n\n  get(selector) {\n    const { shadowRoot } = this;\n    return shadowRoot.querySelector(selector);\n  }\n\n  setState(state) {\n    const stateWithUnits = _.mapValues(state, (entry, key) => ({\n      unit: _.isObject(entry) ? _.get(entry, 'unit', '') : this.state[key] && this.state[key].unit || '',\n      value: _.isObject(entry) ? _.get(entry, 'value', 0) : entry\n    }));\n    this.state = stateWithUnits;\n    if (this.isEditing) return;\n    this.updateEntries();\n  }\n\n  setStateFromJSON(json) {\n    const state = JSON.parse(json);\n    this.setState(state);\n  }\n\n  setError(error) {\n    const status = this.get('#status');\n    status.innerText = error;\n    status.classList.add('error');\n  }\n\n  clearError() {\n    const status = this.get('#status');\n    status.innerText = '';\n    status.classList.remove('error');\n  }\n\n  isFocused() {\n    const { shadowRoot } = this;\n    return _.some(shadowRoot.querySelectorAll('input'), input => this.isChildFocused(input));\n  }\n\n  isChildFocused(child, doc = document) {\n    if (doc.activeElement === child) return true;\n    if (doc.activeElement && doc.activeElement.shadowRoot)\n\t\t\treturn this.isChildFocused(child, doc.activeElement.shadowRoot)\n    return false;\n  }\n  \n  entriesToState() {\n    const json = this.entriesToStateJSON();\n    return json && JSON.parse(json);\n  }\n  \n  entriesToStateJSON() {\n    const entries = _.map([...this.get('#entries').children], entry => ([\n      entry.getKey(), \n      {\n        value: isNaN(entry.getValue()) ? entry.getValue() : parseFloat(entry.getValue()),\n        unit: entry.getUnit()\n      }\n    ]));\n    const filteredEntries = _.reject(entries, ([ key ]) => _.isEmpty(key.trim()));\n    const entriesAsJson = _.map(filteredEntries, (entry) => JSON.stringify(_.fromPairs([entry])).slice(1, -1));\n    return `{\n      ${\n        _.join(entriesAsJson, ',\\n')\n      }\n    }`;\n  }\n  \n  updateEntries() {\n    const { state } = this;\n    const entriesState = this.entriesToState();\n    if (_.isEqual(state, entriesState) && this.hasEmptyEntry()) return;\n    if (_.isEqual(_.keys(state), _.keys(entriesState))) this.updateEntryValues();\n    else this.replaceEntries();\n  }\n  \n  updateEntryValues() {\n    const { state } = this;\n    if (_.isEqual(state, {})) return this.addEmptyEntry();\n    const entries = _.reject([...this.get('#entries').children], entry => _.isEmpty(entry.getKey().trim()));\n    _.forEach(entries, entry => {\n      const value = state[entry.getKey()].value;\n      entry.setValue(isNaN(value) ? value : parseFloat(value.toFixed(3)));\n    });\n    this.ensureEmpty();\n  }\n  \n  replaceEntries() {\n    const { state } = this;\n    const entries = this.get('#entries');\n    entries.innerHTML = ''; // no diffing, just plain remove all + add\n    const newEntries = _.map(_.toPairs(state), ([key, { unit, value }]) => this.createEntry(key, isNaN(value) ? value : parseFloat(value.toFixed(3)), unit));\n    _.forEach(newEntries, (entry) => entries.appendChild(entry));\n    this.addEmptyEntry();\n  }\n  \n  hasEmptyEntry() {\n    return _.some([...this.get('#entries').children], entry => _.isEmpty(entry.getKey().trim()) && _.isEmpty(entry.getValue().trim()));\n  }\n  \n  addEmptyEntry() {\n    const entries = this.get('#entries');\n    entries.appendChild(this.createEntry('', '', ''));\n  }\n  \n  ensureEmpty(entry) {\n    if (!this.hasEmptyEntry()) this.addEmptyEntry();\n    if (entry) entry.focus();\n  }\n  \n  createEntry(key, value, unit) {\n    const entry = (\n      <div class='entry'>\n        <input value={String(key)} placeholder='Name' />\n        <input value={String(value)} placeholder='Value' />\n        <input value={String(unit)} placeholder='Unit' />\n        <i class=\"fa fa-times\"></i>\n      </div>\n    );\n    entry.children[0].addEventListener('input', () => this.ensureEmpty(entry));\n    entry.children[1].addEventListener('input', () => this.ensureEmpty(entry));\n    entry.children[2].addEventListener('input', () => this.ensureEmpty(entry));\n    entry.children[3].addEventListener('mousedown', () => this.handleDelete(entry));\n    entry.getKey = () => entry.children[0].value;\n    entry.getValue = () => entry.children[1].value;\n    entry.getUnit = () => entry.children[2].value;\n    entry.setValue = (value) => entry.children[1].value = value;\n    return entry;\n  }\n  \n  getCodeView() {\n    return this.getRootNode().host;\n  }\n}\n"]}