{"version":3,"file":"index.module.mjs","sources":["../src/store.js","../src/index.js"],"sourcesContent":["export default class Store {\n  constructor(controller) {\n    this.controller = controller;\n  }\n\n  get key() {\n    return this.controller.storeKeyValue;\n  }\n\n  get nodes() {\n    return this.controller.nodes;\n  }\n\n  get openedNodes() {\n    return this.controller.openedNodes;\n  }\n\n  load() {\n    if (!this.key) return;\n\n    let ids = this.constructor.load(this.key);\n    if (!ids) return;\n\n    let idSet = new Set(ids);\n    this.nodes.reverse().forEach(node => {\n      if (idSet.has(node.getAttribute('data-node-id'))) {\n        this.controller.show(node)\n      } else {\n        this.controller.hide(node);\n      }\n    });\n  }\n\n  save() {\n    if (!this.key) return;\n\n    let ids = this.openedNodes.map(node => node.getAttribute('data-node-id'));\n    this.constructor.save(this.key, ids);\n  }\n\n  static load(key) {\n    let json = sessionStorage.getItem(key);\n    try {\n      return JSON.parse(json)\n    } catch(error) {\n      console.error(error);\n      return null;\n    }\n  }\n\n  static save(key, value) {\n    try {\n      sessionStorage.setItem(key, JSON.stringify(value));\n    } catch(error) {\n      console.error(error);\n      return null;\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport '@kanety/stimulus-static-actions';\nimport Store from './store';\nimport './index.scss';\n\nexport default class extends Controller {\n  static values = {\n    marginLeft: { type: Number, default: 20 },\n    storeKey: String\n  };\n  static actions = [\n    ['element', 'click->toggle']\n  ];\n\n  get nodes() {\n    return this.scope.findAllElements('tr[data-node-id]');\n  }\n\n  get openedNodes() {\n    return this.scope.findAllElements('tr[data-node-id]:not(.st-tree-table__node--closed)');\n  }\n\n  connect() {\n    this.init();\n    this.store = new Store(this);\n    this.store.load();\n  }\n\n  init() {\n    this.nodes.forEach(node => {\n      let icon = node.querySelector('a[href=\"#icon\"]');\n      if (icon && !icon.style.marginLeft && this.marginLeftValue) {\n        icon.style.marginLeft = (this.depth(node) - 1) * this.marginLeftValue + 'px';\n      }\n      if (!this.hasChildren(node)) {\n        node.classList.add('st-tree-table__node--leaf', 'st-tree-table__node--closed')\n      }\n      if (node.matches('.st-tree-table__node--closed')) {\n        this.hide(node);\n      }\n    });\n  }\n\n  toggle(e) {\n    if (!e.target.matches('a[href=\"#icon\"]')) return;\n\n    let node = e.target.closest('tr');\n    if (!node.matches('.st-tree-table__node--closed')) {\n      this.close(node);\n    } else {\n      this.open(node);\n    }\n\n    e.preventDefault();\n  }\n\n  expand(e) {\n    this.nodes.forEach(node => this.show(node));\n    this.store.save();\n    e.preventDefault();\n  }\n\n  collapse(e) {\n    this.nodes.forEach(node => this.hide(node));\n    this.store.save();\n    e.preventDefault();\n  }\n\n  open(node) {\n    this.show(node);\n    this.store.save();\n\n    this.dispatch('opened', { detail: { node: node } });\n  }\n\n  show(node) {\n    node.classList.remove('st-tree-table__node--closed')\n    this.showDescs(node);\n  }\n\n  showDescs(node) {\n    let children = this.children(node);\n    children.forEach(child => {\n      child.classList.remove('st-tree-table__node--hidden');\n      if (!child.matches('.st-tree-table__node--closed')) {\n        this.showDescs(child);\n      }\n    });\n  }\n\n  close(node) {\n    this.hide(node);\n    this.store.save();\n\n    this.dispatch('closed', { detail: { node: node } });\n  }\n\n  hide(node) {\n    node.classList.add('st-tree-table__node--closed');\n    this.hideDescs(node);\n  }\n\n  hideDescs(node) {\n    let children = this.children(node);\n    children.forEach(child => {\n      child.classList.add('st-tree-table__node--hidden');\n      this.hideDescs(child);\n    });\n  }\n\n  parent(node) {\n    let pid = node.getAttribute('data-node-pid');\n    return this.scope.findElement(`tr[data-node-id=\"${pid}\"]`);\n  }\n\n  children(node) {\n    let id = node.getAttribute('data-node-id');\n    return this.scope.findAllElements(`tr[data-node-pid=\"${id}\"]`);\n  }\n\n  hasChildren(node) {\n    return this.children(node).length != 0;\n  }\n\n  depth(node) {\n    let parent = this.parent(node);\n    if (parent) {\n      return this.depth(parent) + 1;\n    } else {\n      return 1;\n    }\n  }\n}\n"],"names":["Store","constructor","controller","this","key","storeKeyValue","nodes","openedNodes","load","ids","idSet","Set","reverse","forEach","node","has","getAttribute","show","hide","save","map","json","sessionStorage","getItem","JSON","parse","error","console","value","setItem","stringify","_Class","Controller","scope","findAllElements","connect","init","store","icon","querySelector","style","marginLeft","marginLeftValue","depth","hasChildren","classList","add","matches","toggle","e","target","closest","open","close","preventDefault","expand","collapse","dispatch","detail","remove","showDescs","children","child","hideDescs","parent","pid","findElement","id","length","values","type","Number","default","storeKey","String","actions"],"mappings":"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"}