{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/components/demo/lively-simulation-log-view.js"],"names":["Morph","_","DEFAULT_INTERVAL","LivelySimulationLogView","initialize","get","cell","getCell","clearLog","updateLogTable","initializeInterval","interval","attachedCallback","registerLogTable","detachedCallback","log","timestamp","entry","logs","timestampedEntry","assign","mapValues","push","logTable","getInterval","setFromJSO","filter","iLog","selector","shadowRoot","querySelector","isFocused","isChildFocused","child","doc","document","getRootNode"],"mappings":"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","file":"lively-simulation-log-view.js","sourcesContent":["/*MD\n  ![](https://lively-kernel.org/lively4/lively4-core/demos/lively-simulation/screenshots/log-view.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_INTERVAL = 1;\n\nexport default class LivelySimulationLogView extends Morph {\n  \n  // life cycle\n  initialize() {\n    this.logs = [];\n    this.get('#clearLog').addEventListener('click', () => { \n      const cell = this.getCell();\n      if (cell.clearLog) cell.clearLog();\n    });\n    this.get('#interval').addEventListener('change', () => this.updateLogTable());\n  }\n  \n  initializeInterval(interval = DEFAULT_INTERVAL) {\n    this.get('#interval').value = interval;\n  }\n  \n  attachedCallback() {\n    this.registerLogTable();\n  }\n  \n  detachedCallback() {\n    this.logTableUpdater.dispose();\n    this.visibilityUpdater.dispose();\n  }\n  \n  // aexpr\n  registerLogTable() {\n    this.logTableUpdater = aexpr(() => this.logs.length).onChange(() => this.updateLogTable());\n    this.visibilityUpdater = aexpr(() => this.classList.contains('active')).onChange(() => this.updateLogTable());\n  }\n  \n  \n  // other\n  log(timestamp, entry) {\n    const { logs } = this;\n    const timestampedEntry = _.assign({ timestamp }, _.mapValues(entry, 'value'));\n    logs.push(timestampedEntry);\n  }\n  \n  clearLog() {\n    this.logs = [];\n  }\n  \n  updateLogTable() {\n    if (!this.classList.contains('active')) return;\n    const logTable = this.get('#logTable');\n    const interval = this.getInterval();\n    logTable.setFromJSO(_.filter(this.logs, (_, iLog) => !(iLog % interval)));\n    logTable.scrollTop = logTable.scrollHeight;\n  }\n  \n  get(selector) {\n    const { shadowRoot } = this;\n    return shadowRoot.querySelector(selector);\n  }\n  \n  getInterval() {\n    return parseInt(this.get('#interval').value) || DEFAULT_INTERVAL;\n  }\n  \n  isFocused() {\n    return this.isChildFocused(this.get('#interval'));\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  getCell() {\n    return this.getRootNode().host;\n  }\n}"]}