@compas-oscd/open-scd 0.34.37 → 0.34.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/src/WizardDivider.js.map +1 -0
  2. package/dist/src/Wizarding.js.map +1 -0
  3. package/dist/src/action-icon.js.map +1 -0
  4. package/dist/src/action-pane.js.map +1 -0
  5. package/dist/src/addons/Editor.js.map +1 -0
  6. package/dist/src/addons/History.js.map +1 -0
  7. package/dist/src/addons/Layout.js.map +1 -0
  8. package/dist/src/addons/Settings.js.map +1 -0
  9. package/dist/src/addons/Waiter.js.map +1 -0
  10. package/dist/src/addons/Wizards.js.map +1 -0
  11. package/dist/src/addons/editor/edit-action-to-v1-converter.js.map +1 -0
  12. package/dist/src/addons/editor/edit-v1-to-v2-converter.js.map +1 -0
  13. package/dist/src/addons/history/get-log-text.js.map +1 -0
  14. package/dist/src/addons/menu-tabs/menu-tabs.js.map +1 -0
  15. package/dist/src/addons/plugin-manager/custom-plugin-dialog.js.map +1 -0
  16. package/dist/src/addons/plugin-manager/plugin-manager.js.map +1 -0
  17. package/dist/{filtered-list.js → src/filtered-list.js} +2 -0
  18. package/dist/src/filtered-list.js.map +1 -0
  19. package/dist/src/finder-list.js.map +1 -0
  20. package/dist/src/foundation/compare.js.map +1 -0
  21. package/dist/src/foundation/dai.js.map +1 -0
  22. package/dist/src/foundation/generators.js.map +1 -0
  23. package/dist/src/foundation/ied.js.map +1 -0
  24. package/dist/src/foundation/nsd.js.map +1 -0
  25. package/dist/src/foundation/nsdoc.js.map +1 -0
  26. package/dist/src/foundation/scl.js.map +1 -0
  27. package/dist/src/foundation.js.map +1 -0
  28. package/dist/src/icons/compare.js.map +1 -0
  29. package/dist/src/icons/icons.js.map +1 -0
  30. package/dist/src/icons/ied-icons.js.map +1 -0
  31. package/dist/src/icons/lnode.js.map +1 -0
  32. package/dist/src/index.d.ts +41 -0
  33. package/dist/{index.js → src/index.js} +19 -3
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/open-scd.js.map +1 -0
  36. package/dist/src/oscd-filter-button.js.map +1 -0
  37. package/dist/src/plain-compare-list.js.map +1 -0
  38. package/dist/src/plugin-tag.js.map +1 -0
  39. package/dist/src/plugin.events.js.map +1 -0
  40. package/dist/src/plugin.js.map +1 -0
  41. package/dist/src/plugins.js.map +1 -0
  42. package/dist/src/schemas.js.map +1 -0
  43. package/dist/src/themes.js.map +1 -0
  44. package/dist/src/translations/de.js.map +1 -0
  45. package/dist/src/translations/en.js.map +1 -0
  46. package/dist/src/translations/loader.js.map +1 -0
  47. package/dist/src/wizard-checkbox.js.map +1 -0
  48. package/dist/src/wizard-dialog.js.map +1 -0
  49. package/dist/src/wizard-select.js.map +1 -0
  50. package/dist/src/wizard-textfield.js.map +1 -0
  51. package/dist/src/wizards.js.map +1 -0
  52. package/dist/test/mock-open-scd.d.ts +22 -0
  53. package/dist/test/mock-open-scd.js +53 -0
  54. package/dist/test/mock-open-scd.js.map +1 -0
  55. package/dist/test/mock-wizard-editor.d.ts +15 -0
  56. package/dist/test/mock-wizard-editor.js +50 -0
  57. package/dist/test/mock-wizard-editor.js.map +1 -0
  58. package/package.json +6 -2
  59. package/dist/WizardDivider.js.map +0 -1
  60. package/dist/Wizarding.js.map +0 -1
  61. package/dist/action-icon.js.map +0 -1
  62. package/dist/action-pane.js.map +0 -1
  63. package/dist/addons/Editor.js.map +0 -1
  64. package/dist/addons/History.js.map +0 -1
  65. package/dist/addons/Layout.js.map +0 -1
  66. package/dist/addons/Settings.js.map +0 -1
  67. package/dist/addons/Waiter.js.map +0 -1
  68. package/dist/addons/Wizards.js.map +0 -1
  69. package/dist/addons/editor/edit-action-to-v1-converter.js.map +0 -1
  70. package/dist/addons/editor/edit-v1-to-v2-converter.js.map +0 -1
  71. package/dist/addons/history/get-log-text.js.map +0 -1
  72. package/dist/addons/menu-tabs/menu-tabs.js.map +0 -1
  73. package/dist/addons/plugin-manager/custom-plugin-dialog.js.map +0 -1
  74. package/dist/addons/plugin-manager/plugin-manager.js.map +0 -1
  75. package/dist/filtered-list.js.map +0 -1
  76. package/dist/finder-list.js.map +0 -1
  77. package/dist/foundation/compare.js.map +0 -1
  78. package/dist/foundation/dai.js.map +0 -1
  79. package/dist/foundation/generators.js.map +0 -1
  80. package/dist/foundation/ied.js.map +0 -1
  81. package/dist/foundation/nsd.js.map +0 -1
  82. package/dist/foundation/nsdoc.js.map +0 -1
  83. package/dist/foundation/scl.js.map +0 -1
  84. package/dist/foundation.js.map +0 -1
  85. package/dist/icons/compare.js.map +0 -1
  86. package/dist/icons/icons.js.map +0 -1
  87. package/dist/icons/ied-icons.js.map +0 -1
  88. package/dist/icons/lnode.js.map +0 -1
  89. package/dist/index.d.ts +0 -26
  90. package/dist/index.js.map +0 -1
  91. package/dist/open-scd.js.map +0 -1
  92. package/dist/oscd-filter-button.js.map +0 -1
  93. package/dist/plain-compare-list.js.map +0 -1
  94. package/dist/plugin-tag.js.map +0 -1
  95. package/dist/plugin.events.js.map +0 -1
  96. package/dist/plugin.js.map +0 -1
  97. package/dist/plugins.js.map +0 -1
  98. package/dist/schemas.js.map +0 -1
  99. package/dist/themes.js.map +0 -1
  100. package/dist/translations/de.js.map +0 -1
  101. package/dist/translations/en.js.map +0 -1
  102. package/dist/translations/loader.js.map +0 -1
  103. package/dist/wizard-checkbox.js.map +0 -1
  104. package/dist/wizard-dialog.js.map +0 -1
  105. package/dist/wizard-select.js.map +0 -1
  106. package/dist/wizard-textfield.js.map +0 -1
  107. package/dist/wizards.js.map +0 -1
  108. /package/dist/{WizardDivider.d.ts → src/WizardDivider.d.ts} +0 -0
  109. /package/dist/{WizardDivider.js → src/WizardDivider.js} +0 -0
  110. /package/dist/{Wizarding.d.ts → src/Wizarding.d.ts} +0 -0
  111. /package/dist/{Wizarding.js → src/Wizarding.js} +0 -0
  112. /package/dist/{action-icon.d.ts → src/action-icon.d.ts} +0 -0
  113. /package/dist/{action-icon.js → src/action-icon.js} +0 -0
  114. /package/dist/{action-pane.d.ts → src/action-pane.d.ts} +0 -0
  115. /package/dist/{action-pane.js → src/action-pane.js} +0 -0
  116. /package/dist/{addons → src/addons}/Editor.d.ts +0 -0
  117. /package/dist/{addons → src/addons}/Editor.js +0 -0
  118. /package/dist/{addons → src/addons}/History.d.ts +0 -0
  119. /package/dist/{addons → src/addons}/History.js +0 -0
  120. /package/dist/{addons → src/addons}/Layout.d.ts +0 -0
  121. /package/dist/{addons → src/addons}/Layout.js +0 -0
  122. /package/dist/{addons → src/addons}/Settings.d.ts +0 -0
  123. /package/dist/{addons → src/addons}/Settings.js +0 -0
  124. /package/dist/{addons → src/addons}/Waiter.d.ts +0 -0
  125. /package/dist/{addons → src/addons}/Waiter.js +0 -0
  126. /package/dist/{addons → src/addons}/Wizards.d.ts +0 -0
  127. /package/dist/{addons → src/addons}/Wizards.js +0 -0
  128. /package/dist/{addons → src/addons}/editor/edit-action-to-v1-converter.d.ts +0 -0
  129. /package/dist/{addons → src/addons}/editor/edit-action-to-v1-converter.js +0 -0
  130. /package/dist/{addons → src/addons}/editor/edit-v1-to-v2-converter.d.ts +0 -0
  131. /package/dist/{addons → src/addons}/editor/edit-v1-to-v2-converter.js +0 -0
  132. /package/dist/{addons → src/addons}/history/get-log-text.d.ts +0 -0
  133. /package/dist/{addons → src/addons}/history/get-log-text.js +0 -0
  134. /package/dist/{addons → src/addons}/menu-tabs/menu-tabs.d.ts +0 -0
  135. /package/dist/{addons → src/addons}/menu-tabs/menu-tabs.js +0 -0
  136. /package/dist/{addons → src/addons}/plugin-manager/custom-plugin-dialog.d.ts +0 -0
  137. /package/dist/{addons → src/addons}/plugin-manager/custom-plugin-dialog.js +0 -0
  138. /package/dist/{addons → src/addons}/plugin-manager/plugin-manager.d.ts +0 -0
  139. /package/dist/{addons → src/addons}/plugin-manager/plugin-manager.js +0 -0
  140. /package/dist/{filtered-list.d.ts → src/filtered-list.d.ts} +0 -0
  141. /package/dist/{finder-list.d.ts → src/finder-list.d.ts} +0 -0
  142. /package/dist/{finder-list.js → src/finder-list.js} +0 -0
  143. /package/dist/{foundation → src/foundation}/compare.d.ts +0 -0
  144. /package/dist/{foundation → src/foundation}/compare.js +0 -0
  145. /package/dist/{foundation → src/foundation}/dai.d.ts +0 -0
  146. /package/dist/{foundation → src/foundation}/dai.js +0 -0
  147. /package/dist/{foundation → src/foundation}/generators.d.ts +0 -0
  148. /package/dist/{foundation → src/foundation}/generators.js +0 -0
  149. /package/dist/{foundation → src/foundation}/ied.d.ts +0 -0
  150. /package/dist/{foundation → src/foundation}/ied.js +0 -0
  151. /package/dist/{foundation → src/foundation}/nsd.d.ts +0 -0
  152. /package/dist/{foundation → src/foundation}/nsd.js +0 -0
  153. /package/dist/{foundation → src/foundation}/nsdoc.d.ts +0 -0
  154. /package/dist/{foundation → src/foundation}/nsdoc.js +0 -0
  155. /package/dist/{foundation → src/foundation}/scl.d.ts +0 -0
  156. /package/dist/{foundation → src/foundation}/scl.js +0 -0
  157. /package/dist/{foundation.d.ts → src/foundation.d.ts} +0 -0
  158. /package/dist/{foundation.js → src/foundation.js} +0 -0
  159. /package/dist/{icons → src/icons}/compare.d.ts +0 -0
  160. /package/dist/{icons → src/icons}/compare.js +0 -0
  161. /package/dist/{icons → src/icons}/icons.d.ts +0 -0
  162. /package/dist/{icons → src/icons}/icons.js +0 -0
  163. /package/dist/{icons → src/icons}/ied-icons.d.ts +0 -0
  164. /package/dist/{icons → src/icons}/ied-icons.js +0 -0
  165. /package/dist/{icons → src/icons}/lnode.d.ts +0 -0
  166. /package/dist/{icons → src/icons}/lnode.js +0 -0
  167. /package/dist/{open-scd.d.ts → src/open-scd.d.ts} +0 -0
  168. /package/dist/{open-scd.js → src/open-scd.js} +0 -0
  169. /package/dist/{oscd-filter-button.d.ts → src/oscd-filter-button.d.ts} +0 -0
  170. /package/dist/{oscd-filter-button.js → src/oscd-filter-button.js} +0 -0
  171. /package/dist/{plain-compare-list.d.ts → src/plain-compare-list.d.ts} +0 -0
  172. /package/dist/{plain-compare-list.js → src/plain-compare-list.js} +0 -0
  173. /package/dist/{plugin-tag.d.ts → src/plugin-tag.d.ts} +0 -0
  174. /package/dist/{plugin-tag.js → src/plugin-tag.js} +0 -0
  175. /package/dist/{plugin.d.ts → src/plugin.d.ts} +0 -0
  176. /package/dist/{plugin.events.d.ts → src/plugin.events.d.ts} +0 -0
  177. /package/dist/{plugin.events.js → src/plugin.events.js} +0 -0
  178. /package/dist/{plugin.js → src/plugin.js} +0 -0
  179. /package/dist/{plugins.d.ts → src/plugins.d.ts} +0 -0
  180. /package/dist/{plugins.js → src/plugins.js} +0 -0
  181. /package/dist/{schemas.d.ts → src/schemas.d.ts} +0 -0
  182. /package/dist/{schemas.js → src/schemas.js} +0 -0
  183. /package/dist/{themes.d.ts → src/themes.d.ts} +0 -0
  184. /package/dist/{themes.js → src/themes.js} +0 -0
  185. /package/dist/{translations → src/translations}/de.d.ts +0 -0
  186. /package/dist/{translations → src/translations}/de.js +0 -0
  187. /package/dist/{translations → src/translations}/en.d.ts +0 -0
  188. /package/dist/{translations → src/translations}/en.js +0 -0
  189. /package/dist/{translations → src/translations}/loader.d.ts +0 -0
  190. /package/dist/{translations → src/translations}/loader.js +0 -0
  191. /package/dist/{wizard-checkbox.d.ts → src/wizard-checkbox.d.ts} +0 -0
  192. /package/dist/{wizard-checkbox.js → src/wizard-checkbox.js} +0 -0
  193. /package/dist/{wizard-dialog.d.ts → src/wizard-dialog.d.ts} +0 -0
  194. /package/dist/{wizard-dialog.js → src/wizard-dialog.js} +0 -0
  195. /package/dist/{wizard-select.d.ts → src/wizard-select.d.ts} +0 -0
  196. /package/dist/{wizard-select.js → src/wizard-select.js} +0 -0
  197. /package/dist/{wizard-textfield.d.ts → src/wizard-textfield.d.ts} +0 -0
  198. /package/dist/{wizard-textfield.js → src/wizard-textfield.js} +0 -0
  199. /package/dist/{wizards.d.ts → src/wizards.d.ts} +0 -0
  200. /package/dist/{wizards.js → src/wizards.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WizardDivider.js","sourceRoot":"","sources":["../../src/WizardDivider.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,aAAa,EACb,IAAI,EACJ,UAAU,EACV,QAAQ,GAET,MAAM,aAAa,CAAC;AAGd,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,UAAU;IAMlD,MAAM;QACJ,OAAO,IAAI,CAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;IACjE,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO,IAAI,CAAA,EAAE,CAAC;SACf;QAED,OAAO,IAAI,CAAA,sBAAsB,IAAI,CAAC,MAAM,OAAO,CAAC;IACtD,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAA,8BAA8B,CAAC;IAC5C,CAAC;;AAEM,2BAAM,GAAG,GAAG,CAAA;;;;;;;;;;GAUlB,CAAC;AA5BF;IAHC,QAAQ,CAAC;QACR,IAAI,EAAE,MAAM;KACb,CAAC;oDACc;AAJL,oBAAoB;IADhC,aAAa,CAAC,gBAAgB,CAAC;GACnB,oBAAoB,CAiChC;SAjCY,oBAAoB","sourcesContent":["import {\n css,\n customElement,\n html,\n LitElement,\n property,\n TemplateResult,\n} from 'lit-element';\n\n@customElement('wizard-divider')\nexport class WizardDividerElement extends LitElement {\n @property({\n type: String,\n })\n header?: string;\n\n render(): TemplateResult {\n return html` ${this.renderHeader()} ${this.renderSeparator()}`;\n }\n\n private renderHeader(): TemplateResult {\n if (!this.header) {\n return html``;\n }\n\n return html`<h4 class=\"header\">${this.header}</h4>`;\n }\n\n private renderSeparator(): TemplateResult {\n return html`<div role=\"separator\"></div>`;\n }\n\n static styles = css`\n div {\n height: 0px;\n margin: 10px 0px 10px 0px;\n border-top: none;\n border-right: none;\n border-left: none;\n border-image: initial;\n border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Wizarding.js","sourceRoot":"","sources":["../../src/Wizarding.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAkB,KAAK,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,aAAa,GAKd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,oBAAoB,CAAC;AAO5B,MAAM,UAAU,SAAS,CAAsC,IAAW;IACxE,MAAM,gBAAiB,SAAQ,IAAI;QAOvB,QAAQ,CAAC,EAAe;YAChC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,IAAI,MAAM,KAAK,IAAI;gBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;iBACtC,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;gBACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAC9B,CACF,CACF,CAAC;QACJ,CAAC;QAED,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAtBjB,8CAA8C;YAE9C,aAAQ,GAAoB,EAAE,CAAC;YAsB7B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,EAAE,CAC1C,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAC9B,CAAC;QACJ,CAAC;QAED,MAAM;YACJ,OAAO,IAAI,CAAA,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;iCAChB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,CAAC;QAC3E,CAAC;KACF;IAhCC;QADC,KAAK,EAAE;sDACuB;IAEP;QAAvB,KAAK,CAAC,eAAe,CAAC;sDAAyB;IAgClD,wEAAwE;IACxE,OAAO,gBAAoC,CAAC;AAC9C,CAAC","sourcesContent":["import { html, state, TemplateResult, query } from 'lit-element';\nimport {\n ifImplemented,\n LitElementConstructor,\n Mixin,\n WizardEvent,\n WizardFactory,\n} from './foundation.js';\n\nimport './wizard-dialog.js';\nimport { WizardDialog } from './wizard-dialog.js';\n\n/** `LitElement` mixin that adds a `workflow` property which [[`Wizard`]]s are\n * queued onto on incoming [[`WizardEvent`]]s, first come first displayed. */\nexport type WizardingElement = Mixin<typeof Wizarding>;\n\nexport function Wizarding<TBase extends LitElementConstructor>(Base: TBase): TBase {\n class WizardingElement extends Base {\n /** FIFO queue of [[`Wizard`]]s to display. */\n @state()\n workflow: WizardFactory[] = [];\n\n @query('wizard-dialog') wizardUI!: WizardDialog;\n\n protected onWizard(we: WizardEvent) {\n const wizard = we.detail.wizard;\n if (wizard === null) this.workflow.shift();\n else if (we.detail.subwizard) this.workflow.unshift(wizard);\n else this.workflow.push(wizard);\n this.requestUpdate('workflow');\n this.updateComplete.then(() =>\n this.wizardUI.updateComplete.then(() =>\n this.wizardUI.dialog?.updateComplete.then(() =>\n this.wizardUI.dialog?.focus()\n )\n )\n );\n }\n\n constructor(...args: any[]) {\n super(...args);\n\n this.addEventListener('wizard', this.onWizard);\n this.addEventListener('editor-action', () =>\n this.wizardUI.requestUpdate()\n );\n }\n\n render(): TemplateResult {\n return html`${ifImplemented(super.render())}\n <wizard-dialog .wizard=${this.workflow[0]?.() ?? []}></wizard-dialog>`;\n }\n }\n\n // Cast to unknown as TBase to avoid TS4094 when generating declarations\n return WizardingElement as unknown as TBase;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-icon.js","sourceRoot":"","sources":["../../src/action-icon.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,aAAa,EACb,IAAI,EACJ,UAAU,EACV,QAAQ,GAET,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AAEI,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IAAnC;;QAOL,oEAAoE;QAEpE,cAAS,GAAG,KAAK,CAAC;QAClB,yCAAyC;QAEzC,gBAAW,GAAG,KAAK,CAAC;QACpB,8CAA8C;QAE9C,gBAAW,GAAG,KAAK,CAAC;IAuLtB,CAAC;IArLC,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAA;;WAEJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,aAAa,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO;;OAEjE,CAAC;IACN,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,WAAW,IAAI,CAAC,KAAK,IAAI,OAAO;iBAC9B,IAAI,CAAC,UAAU,EAAE;gBAClB,IAAI,CAAC,KAAK,IAAI,OAAO,WAAW,CAAC;IAC/C,CAAC;;AAEM,iBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkKlB,CAAC;AAlMF;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCACZ;AAGf;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;6CACV;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CACR;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CACR;AAfT,UAAU;IADtB,aAAa,CAAC,aAAa,CAAC;GAChB,UAAU,CAsMtB;SAtMY,UAAU","sourcesContent":["import {\n css,\n customElement,\n html,\n LitElement,\n property,\n TemplateResult,\n} from 'lit-element';\nimport { nothing } from 'lit-html';\n\nimport '@material/mwc-icon';\n\n/**\n * A responsive container rendering actions in a header.\n *\n * The \"action\" slot may contain up to eight icon buttons.\n * The \"icon\" slot, if filled overrides the icon property.\n * The default slot will be rendered into the pane body in a single column.\n */\n@customElement('action-icon')\nexport class ActionIcon extends LitElement {\n /** caption text, displayed in the header */\n @property({ type: String })\n label?: string;\n /** icon name, displayed unless the \"icon\" slot is filled */\n @property({ type: String })\n icon?: string;\n /** color header with secondary theme color while focus is within */\n @property({ type: Boolean })\n secondary = false;\n /** highlight pane with dotted outline */\n @property({ type: Boolean })\n highlighted = false;\n /** disables CSS adoption to action buttons */\n @property({ type: Boolean })\n hideActions = false;\n\n async firstUpdated(): Promise<void> {\n this.tabIndex = 0;\n }\n\n private renderIcon(): TemplateResult {\n return html`<span>\n <slot name=\"icon\"\n >${this.icon ? html`<mwc-icon>${this.icon}</mwc-icon>` : nothing}</slot\n ></span\n > `;\n }\n\n render(): TemplateResult {\n return html`<header>${this.label ?? nothing}</header>\n <section>${this.renderIcon()}<slot name=\"action\"></slot></section>\n <footer>${this.label ?? nothing}</footer>`;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n outline: none;\n }\n\n section {\n align-self: center;\n }\n\n ::slotted([slot='icon']),\n mwc-icon {\n display: block;\n color: var(--mdc-theme-on-surface);\n transition: transform 150ms linear, box-shadow 200ms linear;\n outline-color: var(--mdc-theme-primary);\n outline-style: solid;\n margin: 0px;\n outline-width: 0px;\n width: 64px;\n height: 64px;\n --mdc-icon-size: 64px;\n }\n\n :host([secondary]) ::slotted([slot='icon']),\n :host([secondary]) mwc-icon {\n outline-color: var(--mdc-theme-secondary);\n }\n\n :host([highlighted]) ::slotted([slot='icon']),\n :host([highlighted]) mwc-icon {\n outline-style: dotted;\n outline-width: 2px;\n }\n\n :host(:focus-within) ::slotted([slot='icon']),\n :host(:focus-within) mwc-icon {\n outline-style: solid;\n outline-width: 4px;\n }\n\n :host(:focus-within:not([hideActions])) ::slotted([slot='icon']),\n :host(:focus-within:not([hideActions])) mwc-icon {\n transform: scale(0.8);\n transition: all 250ms linear;\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n }\n\n ::slotted([slot='icon']:hover),\n mwc-icon:hover {\n outline-style: dashed;\n outline-width: 2px;\n transition: transform 200ms linear, box-shadow 250ms linear;\n }\n\n ::slotted([slot='action']) {\n color: var(--mdc-theme-on-surface);\n transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 200ms linear;\n position: absolute;\n pointer-events: none;\n z-index: 1;\n opacity: 0;\n margin-top: -56px;\n margin-left: 8px;\n }\n\n :host(:focus-within) ::slotted([slot='action']) {\n transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 250ms linear;\n pointer-events: auto;\n opacity: 1;\n }\n\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(1)) {\n transform: translate(0px, -52px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(2)) {\n transform: translate(0px, 52px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(3)) {\n transform: translate(52px, 0px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(4)) {\n transform: translate(-52px, 0px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(5)) {\n transform: translate(52px, -52px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(6)) {\n transform: translate(-52px, 52px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(7)) {\n transform: translate(-52px, -52px);\n }\n :host(:focus-within) ::slotted([slot='action']:nth-of-type(8)) {\n transform: translate(52px, 52px);\n }\n\n footer {\n color: var(--mdc-theme-on-surface);\n font-family: 'Roboto', sans-serif;\n font-weight: 300;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0px;\n text-align: center;\n align-self: center;\n max-width: 100%;\n direction: rtl;\n }\n\n header {\n color: var(--mdc-theme-on-primary);\n background-color: var(--mdc-theme-primary);\n font-family: 'Roboto', sans-serif;\n font-weight: 500;\n font-size: 1.2em;\n position: absolute;\n text-align: center;\n align-self: center;\n max-width: 100vw;\n padding: 4px 8px;\n border-radius: 4px;\n opacity: 0;\n transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 200ms linear;\n }\n\n :host([secondary]) header {\n background-color: var(--mdc-theme-secondary);\n }\n\n :host(:hover) header {\n position: absolute;\n opacity: 1;\n transform: translate(0, -40px);\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 250ms linear;\n }\n\n :host(:focus-within) header {\n position: absolute;\n opacity: 1;\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 250ms linear;\n }\n\n :host(:focus-within:not([hideActions])) header {\n transform: translate(0, -80px);\n }\n\n :host(:focus-within[hideActions]) header {\n transform: translate(0, -40px);\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-pane.js","sourceRoot":"","sources":["../../src/action-pane.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n customElement,\n html,\n LitElement,\n property,\n TemplateResult,\n} from 'lit-element';\nimport { classMap } from 'lit-html/directives/class-map';\n\nimport '@material/mwc-icon';\nimport { nothing } from 'lit-html';\n\nfunction closestTo<E extends Element>(node: Node, selector: string): E | null {\n const closest =\n node.nodeType === Node.ELEMENT_NODE\n ? (<Element>node).closest<E>(selector)\n : null;\n\n if (closest) return closest;\n\n const root = <Document | DocumentFragment>node.getRootNode();\n\n if (root instanceof ShadowRoot) return closestTo(root.host, selector);\n\n return null;\n}\n\n/**\n * A responsive container rendering actions in a header.\n *\n * The \"action\" slot may contain up to eight icon buttons.\n * The \"icon\" slot, if filled overrides the icon property.\n * The default slot will be rendered into the pane body in a single column.\n */\n@customElement('action-pane')\nexport class ActionPane extends LitElement {\n /** caption text, displayed in the header */\n @property({ type: String })\n label?: string;\n /** icon name, displayed unless the \"icon\" slot is filled */\n @property({ type: String })\n icon?: string;\n /** color header with secondary theme color while focus is within */\n @property({ type: Boolean })\n secondary = false;\n /** highlight pane with dotted outline */\n @property({ type: Boolean })\n highlighted = false;\n /** nesting level, default (closest pane ancestor's level) + 1 */\n @property({ type: Number })\n level = 1;\n\n async firstUpdated(): Promise<void> {\n this.tabIndex = 0;\n\n const parentPane = closestTo<ActionPane>(this.parentNode!, 'action-pane');\n if (parentPane) this.level = parentPane.level + 1;\n\n this.level = Math.floor(this.level);\n }\n\n private renderHeader(): TemplateResult {\n const content = html`<span\n ><slot name=\"icon\"\n >${this.icon\n ? html`<mwc-icon>${this.icon}</mwc-icon>`\n : nothing}</slot\n ></span\n >\n ${this.label ?? nothing}\n <nav><slot name=\"action\"></slot></nav>`;\n\n const headingLevel = Math.floor(Math.max(this.level, 1));\n // Sometimes a TemplateResult is passed in as Label, not a string. So only when it's a string show a title.\n const title = typeof this.label === 'string' ? this.label : '';\n switch (headingLevel) {\n case 1:\n return html`<h1 title=\"${title}\">${content}</h1>`;\n case 2:\n return html`<h2 title=\"${title}\">${content}</h2>`;\n case 3:\n return html`<h3 title=\"${title}\">${content}</h3>`;\n default:\n return html`<h4 title=\"${title}\">${content}</h4>`;\n }\n }\n\n render(): TemplateResult {\n return html`<section\n class=\"${classMap({\n secondary: this.secondary,\n highlighted: this.highlighted,\n contrasted: this.level % 2 === 0,\n })}\"\n >\n ${this.renderHeader()}\n <div><slot></slot></div>\n </section>`;\n }\n\n static styles = css`\n :host {\n outline: none;\n }\n\n :host(:focus-within) section {\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n outline-width: 4px;\n transition: all 250ms linear;\n }\n\n section {\n background-color: var(--mdc-theme-surface);\n transition: all 200ms linear;\n outline-style: solid;\n margin: 0px;\n outline-width: 0px;\n outline-color: var(--mdc-theme-primary);\n }\n\n section.secondary {\n outline-color: var(--mdc-theme-secondary);\n }\n\n section > div {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 8px 12px 16px;\n clear: right;\n }\n\n .highlighted {\n outline-style: dotted;\n outline-width: 2px;\n }\n\n :host(:focus-within) .highlighted {\n outline-style: solid;\n }\n\n .contrasted {\n background-color: var(--mdc-theme-on-primary);\n }\n\n h1,\n h2,\n h3,\n h4 {\n color: var(--mdc-theme-on-surface);\n font-family: 'Roboto', sans-serif;\n font-weight: 300;\n overflow: clip visible;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0px;\n line-height: 52px;\n padding-left: 0.3em;\n }\n\n nav {\n float: right;\n }\n\n mwc-icon {\n vertical-align: middle;\n position: relative;\n top: -0.1em;\n --mdc-icon-size: 1em;\n }\n\n ::slotted([slot='icon']) {\n vertical-align: middle;\n position: relative;\n top: -0.1em;\n --mdc-icon-size: 1em;\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/addons/Editor.ts"],"names":[],"mappings":";AAAA,OAAO,EAGL,YAAY,EACZ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,QAAQ,EACR,UAAU,EACV,aAAa,EAEb,IAAI,GACL,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,EAGL,WAAW,EACX,gBAAgB,EAIhB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAGjE,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IAAnC;;QACL,qCAAqC;QAErC,QAAG,GAAuB,IAAI,CAAC;QAC/B,wCAAwC;QACZ,YAAO,GAAG,EAAE,CAAC;QACzC,wCAAwC;QACZ,UAAK,GAAG,EAAE,CAAC;IAmFzC,CAAC;IA1ES,QAAQ,CAAC,KAAsC;QACrD,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,eAAe,CAAC,KAAgB;QAC9B;;;;WAIG;QACH,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE;YAChC,KAAK,GAAG,qCAAqC,CAAC,KAAK,CAAC,CAAC;SACtD;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,SAAS,CAAC,KAAmB;QACzC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEtC,MAAM,IAAI,CAAC,cAAc,CAAC;QAE1B,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,aAAa,CAChB,WAAW,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,GAAG,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;SACrD,CAAC,CACH,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAa;QACnD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9E,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,eAAe,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAkB;QACxC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE5C,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzC,CAAC;CACF,CAAA;AAvFC;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;uCACA;AAEH;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAc;AAEb;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCAAY;AAEX;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAoB;AAK/C;IAHC,QAAQ,CAAC;QACR,IAAI,EAAE,MAAM;KACb,CAAC;wCACiB;AAdR,UAAU;IADtB,aAAa,CAAC,aAAa,CAAC;GAChB,UAAU,CA0FtB;SA1FY,UAAU;AA4FvB,SAAS,qBAAqB,CAAC,KAA2B;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAc,CAAC;IACzC,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,qCAAqC,CAAC,KAA2B;IACxE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAc,CAAC;IACzC,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import {\n EditEventV2,\n OpenEvent,\n newEditEvent,\n newEditEventV2,\n XMLEditor\n} from '@compas-oscd/core';\nimport {\n property,\n LitElement,\n customElement,\n TemplateResult,\n html,\n} from 'lit-element';\nimport { get } from 'lit-translate';\n\nimport {\n EditorAction,\n EditorActionEvent,\n newLogEvent,\n newValidateEvent,\n OpenDocEvent,\n Edit,\n EditEvent,\n isComplex,\n isInsert,\n isRemove,\n isUpdate,\n} from '@compas-oscd/core';\n\n\n\nimport { convertEditActiontoV1 } from './editor/edit-action-to-v1-converter.js';\nimport { convertEditV1toV2 } from './editor/edit-v1-to-v2-converter.js';\n\n@customElement('oscd-editor')\nexport class OscdEditor extends LitElement {\n /** The `XMLDocument` to be edited */\n @property({ attribute: false })\n doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** The UUID of the current [[`doc`]] */\n @property({ type: String }) docId = '';\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property({\n type: Object,\n })\n host!: HTMLElement;\n\n private onAction(event: EditorActionEvent<EditorAction>) {\n const edit = convertEditActiontoV1(event.detail.action);\n const editV2 = convertEditV1toV2(edit);\n\n this.host.dispatchEvent(newEditEventV2(editV2));\n }\n\n handleEditEvent(event: EditEvent) {\n /**\n * This is a compatibility fix for plugins based on open energy tools edit events\n * because their edit event look slightly different\n * see https://github.com/OpenEnergyTools/open-scd-core/blob/main/foundation/edit-event-v1.ts for details\n */\n if (isOpenEnergyEditEvent(event)) {\n event = convertOpenEnergyEditEventToEditEvent(event);\n }\n\n const edit = event.detail.edit;\n const editV2 = convertEditV1toV2(edit);\n\n this.host.dispatchEvent(newEditEventV2(editV2));\n }\n\n /**\n *\n * @deprecated [Move to handleOpenDoc instead]\n */\n private async onOpenDoc(event: OpenDocEvent) {\n this.doc = event.detail.doc;\n this.docName = event.detail.docName;\n this.docId = event.detail.docId ?? '';\n\n await this.updateComplete;\n\n this.dispatchEvent(newValidateEvent());\n\n this.dispatchEvent(\n newLogEvent({\n kind: 'info',\n title: get('openSCD.loaded', { name: this.docName }),\n })\n );\n }\n\n handleOpenDoc({ detail: { docName, doc } }: OpenEvent) {\n this.doc = doc;\n this.docName = docName;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n // Deprecated editor action API, use 'oscd-edit' instead.\n this.host.addEventListener('editor-action', this.onAction.bind(this));\n // Deprecated edit event API, use 'oscd-edit-v2' instead.\n this.host.addEventListener('oscd-edit', event => this.handleEditEvent(event));\n\n this.host.addEventListener('oscd-edit-v2', event => this.handleEditEventV2(event));\n this.host.addEventListener('open-doc', this.onOpenDoc);\n this.host.addEventListener('oscd-open', this.handleOpenDoc);\n }\n\n render(): TemplateResult {\n return html`<slot></slot>`;\n }\n\n async handleEditEventV2(event: EditEventV2) {\n const { edit, title, squash } = event.detail;\n\n this.editor.commit(edit, { title, squash });\n\n await this.updateComplete;\n this.dispatchEvent(newValidateEvent());\n }\n}\n\nfunction isOpenEnergyEditEvent(event: CustomEvent<unknown>): boolean {\n const eventDetail = event.detail as Edit;\n return isComplex(eventDetail) || isInsert(eventDetail) || isUpdate(eventDetail) || isRemove(eventDetail);\n}\n\nfunction convertOpenEnergyEditEventToEditEvent(event: CustomEvent<unknown>): EditEvent {\n const eventDetail = event.detail as Edit;\n return newEditEvent(eventDetail);\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"History.js","sourceRoot":"","sources":["../../../src/addons/History.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n state,\n property,\n query,\n TemplateResult,\n customElement,\n LitElement,\n} from 'lit-element';\n\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-icon';\nimport '@material/mwc-icon-button';\nimport '@material/mwc-icon-button-toggle';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-snackbar';\nimport { Dialog } from '@material/mwc-dialog';\nimport { Snackbar } from '@material/mwc-snackbar';\n\nimport '../filtered-list.js';\n\nimport {\n InfoDetail,\n InfoEntry,\n IssueDetail,\n IssueEvent,\n LogEntry,\n LogEntryType,\n LogEvent,\n} from '@compas-oscd/core';\n\nimport { getFilterIcon, iconColors } from '../icons/icons.js';\n\nimport { Plugin } from '../plugin.js';\nimport { XMLEditor } from '@compas-oscd/core';\n\nimport { getLogText } from './history/get-log-text.js';\n\nexport const historyStateEvent = 'history-state';\nexport interface HistoryState {\n editCount: number;\n canUndo: boolean;\n canRedo: boolean;\n}\n\ninterface HistoryItem {\n title: string;\n message?: string;\n time: number;\n isActive: boolean;\n}\n\nconst icons = {\n info: 'info',\n warning: 'warning',\n error: 'report',\n};\n\nfunction getPluginName(src: string): string {\n\n let storedPluginsString = localStorage.getItem('plugins');\n if(!storedPluginsString) {\n storedPluginsString = '[]';\n }\n\n const storedPlugins = JSON.parse(storedPluginsString) as Plugin[];\n const wantedPlugin = storedPlugins.find((p: Plugin) => p.src === src);\n\n if(!wantedPlugin) {\n return `pluginnotfound: ${src} in ${storedPluginsString}`;\n }\n\n const name = wantedPlugin.name;\n\n if(!name){\n return `pluginhasnoname:${src}`;\n }\n\n return name;\n\n}\n\nexport enum HistoryUIKind {\n log = 'log',\n history = 'history',\n diagnostic = 'diagnostic',\n}\nexport interface HistoryUIDetail {\n show: boolean;\n kind: HistoryUIKind;\n}\n\nexport type HistoryUIEvent = CustomEvent<HistoryUIDetail>;\n\nexport function newHistoryUIEvent(\n show: boolean,\n kind: HistoryUIKind,\n eventInitDict?: CustomEventInit<Partial<HistoryUIDetail>>\n): HistoryUIEvent {\n return new CustomEvent<HistoryUIDetail>('history-dialog-ui', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: {\n show,\n kind,\n ...eventInitDict?.detail,\n },\n });\n}\n\nexport interface EmptyIssuesDetail {\n pluginSrc: string;\n}\n\nexport type EmptyIssuesEvent = CustomEvent<EmptyIssuesDetail>;\n\nexport function newEmptyIssuesEvent(\n pluginSrc: string,\n eventInitDict?: CustomEventInit<Partial<EmptyIssuesDetail>>\n): EmptyIssuesEvent {\n return new CustomEvent<EmptyIssuesDetail>('empty-issues', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: { pluginSrc, ...eventInitDict?.detail },\n });\n}\n\n@customElement('oscd-history')\nexport class OscdHistory extends LitElement {\n /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */\n @property({ type: Array })\n log: InfoEntry[] = [];\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property()\n diagnoses = new Map<string, IssueDetail[]>();\n\n @property({ type: Object })\n host!: HTMLElement;\n\n @state()\n latestIssue!: IssueDetail;\n\n @state()\n history: HistoryItem[] = [];\n\n @query('#log') logUI!: Dialog;\n @query('#history') historyUI!: Dialog;\n @query('#diagnostic') diagnosticUI!: Dialog;\n @query('#error') errorUI!: Snackbar;\n @query('#warning') warningUI!: Snackbar;\n @query('#info') infoUI!: Snackbar;\n @query('#issue') issueUI!: Snackbar;\n\n private unsubscribers: (() => any)[] = [];\n\n private onIssue(de: IssueEvent): void {\n const issues = this.diagnoses.get(de.detail.validatorId);\n\n if (!issues) this.diagnoses.set(de.detail.validatorId, [de.detail]);\n else issues?.push(de.detail);\n\n this.latestIssue = de.detail;\n this.issueUI.close();\n this.issueUI.show();\n }\n\n undo(): void {\n this.editor.undo();\n }\n redo(): void {\n this.editor.redo();\n }\n\n private onReset() {\n this.log = [];\n this.editor.reset();\n this.updateHistory();\n }\n\n private onInfo(detail: InfoDetail) {\n const entry: InfoEntry = {\n time: new Date(),\n ...detail,\n };\n\n this.log.push(entry);\n if (!this.logUI.open) {\n const ui = {\n error: this.errorUI,\n warning: this.warningUI,\n info: this.infoUI,\n }[detail.kind as keyof typeof icons];\n\n ui.close();\n ui.show();\n }\n if (detail.kind == 'error') {\n this.errorUI.close(); // hack to reset timeout\n this.errorUI.show();\n }\n this.requestUpdate('log', []);\n }\n\n private onLog(le: LogEvent): void {\n switch (le.detail.kind) {\n case 'reset':\n this.onReset();\n break;\n case 'action':\n // No longer needed\n break;\n default:\n this.onInfo(le.detail);\n break;\n }\n }\n\n private historyUIHandler(e: HistoryUIEvent): void {\n const ui = {\n log: this.logUI,\n history: this.historyUI,\n diagnostic: this.diagnosticUI,\n }[e.detail.kind];\n\n if (e.detail.show) ui.show();\n else ui.close();\n }\n\n private emptyIssuesHandler(e: EmptyIssuesEvent): void {\n if (this.diagnoses.get(e.detail.pluginSrc))\n this.diagnoses.get(e.detail.pluginSrc)!.length = 0;\n }\n\n private handleKeyPress(e: KeyboardEvent): void {\n const ctrlAnd = (key: string) => e.key === key && e.ctrlKey;\n\n if (ctrlAnd('y')) this.redo();\n if (ctrlAnd('z')) this.undo();\n if (ctrlAnd('l')) this.logUI.open ? this.logUI.close() : this.logUI.show();\n if (ctrlAnd('d'))\n this.diagnosticUI.open\n ? this.diagnosticUI.close()\n : this.diagnosticUI.show();\n }\n\n private updateHistory(): void {\n const { past, future } = this.editor;\n\n const activeIndex = past.length - 1;\n const allEntries = [ ...past, ...future ];\n\n this.history = allEntries.map((e, index) => {\n const { title, message } = getLogText(e.redo as any);\n\n return {\n isActive: index === activeIndex,\n time: e.time,\n title: e.title ?? title,\n message\n };\n });\n }\n\n constructor() {\n super();\n this.undo = this.undo.bind(this);\n this.redo = this.redo.bind(this);\n this.onLog = this.onLog.bind(this);\n this.onIssue = this.onIssue.bind(this);\n this.historyUIHandler = this.historyUIHandler.bind(this);\n this.emptyIssuesHandler = this.emptyIssuesHandler.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n document.onkeydown = this.handleKeyPress;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n this.unsubscribers.push(\n this.editor.subscribe((_e: unknown) => this.updateHistory()),\n this.editor.subscribeUndoRedo((_e: unknown) => this.updateHistory())\n );\n\n this.host.addEventListener('log', this.onLog);\n this.host.addEventListener('issue', this.onIssue);\n this.host.addEventListener('history-dialog-ui', this.historyUIHandler);\n this.host.addEventListener('empty-issues', this.emptyIssuesHandler);\n this.diagnoses.clear();\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n renderLogEntry(\n entry: InfoEntry,\n index: number,\n log: LogEntry[]\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n class=\"${entry.kind}\"\n graphic=\"icon\"\n ?twoline=${!!entry.message}\n >\n <span>\n <!-- FIXME: replace tt with mwc-chip asap -->\n <tt>${entry.time?.toLocaleString()}</tt>\n ${entry.title}</span\n >\n <span slot=\"secondary\">${entry.message}</span>\n <mwc-icon\n slot=\"graphic\"\n style=\"--mdc-theme-text-icon-on-background:var(${iconColors[entry.kind as keyof typeof iconColors]})\"\n >${icons[entry.kind as keyof typeof icons]}</mwc-icon\n >\n </mwc-list-item></abbr\n >`;\n }\n\n renderHistoryEntry(\n entry: HistoryItem\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n ?twoline=${!!entry.message}\n ?activated=${entry.isActive}\n >\n <span>\n <tt>${this.formatTime(entry.time)}</tt>\n ${entry.title}\n </span>\n <span slot=\"secondary\">${entry.message}</span>\n </mwc-list-item>\n </abbr>`;\n }\n\n private formatTime(time: number): string {\n const date = new Date(time);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`\n }\n\n private renderLog(): TemplateResult[] | TemplateResult {\n if (this.log.length > 0)\n return this.log.slice().reverse().map(this.renderLogEntry, this);\n else\n return html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('log.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n private renderHistory(): TemplateResult[] | TemplateResult {\n if (this.history.length > 0)\n return this.history.slice().reverse().map((e: HistoryItem) => this.renderHistoryEntry(e));\n else\n return html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('history.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n protected renderIssueEntry(issue: IssueDetail): TemplateResult {\n return html` <abbr title=\"${issue.title + '\\n' + issue.message}\"\n ><mwc-list-item ?twoline=${!!issue.message}>\n <span> ${issue.title}</span>\n <span slot=\"secondary\">${issue.message}</span>\n </mwc-list-item></abbr\n >`;\n }\n\n renderValidatorsIssues(issues: IssueDetail[]): TemplateResult[] {\n if (issues.length === 0) return [html``];\n return [\n html`\n <mwc-list-item noninteractive>\n ${getPluginName(issues[0].validatorId)}\n </mwc-list-item>\n `,\n html`<li divider padded role=\"separator\"></li>`,\n ...issues.map(issue => this.renderIssueEntry(issue)),\n ];\n }\n\n private renderIssues(): TemplateResult[] | TemplateResult {\n const issueItems: TemplateResult[] = [];\n\n this.diagnoses.forEach(issues => {\n this.renderValidatorsIssues(issues).forEach(issueItem =>\n issueItems.push(issueItem)\n );\n });\n\n return issueItems.length\n ? issueItems\n : html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('diag.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n private renderFilterButtons() {\n return (<LogEntryType[]>Object.keys(icons)).map(\n kind => html`<mwc-icon-button-toggle id=\"${kind}filter\" on\n >${getFilterIcon(kind, false)}\n ${getFilterIcon(kind, true)}</mwc-icon-button-toggle\n >`\n );\n }\n\n private renderLogDialog(): TemplateResult {\n return html` <mwc-dialog id=\"log\" heading=\"${get('log.name')}\">\n ${this.renderFilterButtons()}\n <mwc-list id=\"content\" wrapFocus>${this.renderLog()}</mwc-list>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\"\n >${get('close')}</mwc-button\n >\n </mwc-dialog>`;\n }\n\n private renderHistoryUI(): TemplateResult {\n return html` <mwc-dialog id=\"history\" heading=\"${get('history.name')}\">\n <mwc-list id=\"content\" wrapFocus>${this.renderHistory()}</mwc-list>\n <mwc-button\n icon=\"undo\"\n label=\"${get('undo')}\"\n ?disabled=${!this.editor.canUndo}\n @click=${this.undo}\n slot=\"secondaryAction\"\n ></mwc-button>\n <mwc-button\n icon=\"redo\"\n label=\"${get('redo')}\"\n ?disabled=${!this.editor.canRedo}\n @click=${this.redo}\n slot=\"secondaryAction\"\n ></mwc-button>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\"\n >${get('close')}</mwc-button\n >\n </mwc-dialog>`;\n }\n\n render(): TemplateResult {\n return html`<slot></slot>\n <style>\n #log > mwc-icon-button-toggle {\n position: absolute;\n top: 8px;\n right: 14px;\n }\n #log > mwc-icon-button-toggle:nth-child(2) {\n right: 62px;\n }\n #log > mwc-icon-button-toggle:nth-child(3) {\n right: 110px;\n }\n #log > mwc-icon-button-toggle:nth-child(4) {\n right: 158px;\n }\n #content mwc-list-item.info,\n #content mwc-list-item.warning,\n #content mwc-list-item.error {\n display: none;\n }\n #infofilter[on] ~ #content mwc-list-item.info {\n display: flex;\n }\n #warningfilter[on] ~ #content mwc-list-item.warning {\n display: flex;\n }\n #errorfilter[on] ~ #content mwc-list-item.error {\n display: flex;\n }\n\n #infofilter[on] {\n color: var(--cyan);\n }\n\n #warningfilter[on] {\n color: var(--yellow);\n }\n\n #errorfilter[on] {\n color: var(--red);\n }\n\n #actionfilter[on] {\n color: var(--blue);\n }\n\n #log,\n #history {\n --mdc-dialog-min-width: 92vw;\n }\n\n #log > #filterContainer {\n position: absolute;\n top: 14px;\n right: 14px;\n }\n </style>\n ${this.renderLogDialog()} ${this.renderHistoryUI()}\n <mwc-dialog id=\"diagnostic\" heading=\"${get('diag.name')}\">\n <filtered-list id=\"content\" wrapFocus>\n ${this.renderIssues()}\n </filtered-list>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\">\n ${get('close')}\n </mwc-button>\n </mwc-dialog>\n\n <mwc-snackbar\n id=\"info\"\n timeoutMs=\"4000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'info')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"warning\"\n timeoutMs=\"6000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'warning')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"history\"\n @click=${() => this.logUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"error\"\n timeoutMs=\"10000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'error')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"history\"\n @click=${() => this.logUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"issue\"\n timeoutMs=\"10000\"\n labelText=\"${this.latestIssue?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"rule\"\n @click=${() => this.diagnosticUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>`;\n }\n}\n\ndeclare global {\n interface ElementEventMap {\n 'history-dialog-ui': CustomEvent<HistoryUIDetail>;\n 'empty-issues': CustomEvent<EmptyIssuesDetail>;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/addons/Layout.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n customElement,\n html,\n LitElement,\n property,\n state,\n TemplateResult,\n query,\n css,\n} from 'lit-element';\nimport { get } from 'lit-translate';\nimport {\n newPendingStateEvent,\n newSettingsUIEvent,\n XMLEditor,\n} from '@compas-oscd/core';\n\nimport {\n MenuItem,\n Validator,\n MenuPlugin,\n pluginIcons,\n} from '../open-scd.js';\n\nimport {\n Plugin,\n} from \"../plugin.js\"\n\nimport {\n HistoryUIKind,\n newEmptyIssuesEvent,\n newHistoryUIEvent\n} from './History.js';\nimport type { Drawer } from '@material/mwc-drawer';\nimport type { ActionDetail } from '@material/mwc-list';\nimport { List } from '@material/mwc-list';\nimport type { ListItem } from '@material/mwc-list/mwc-list-item';\n\nimport '@material/mwc-drawer';\nimport '@material/mwc-list';\nimport '@material/mwc-dialog';\nimport '@material/mwc-switch';\nimport '@material/mwc-select';\nimport '@material/mwc-textfield';\nimport { pluginTag } from '../plugin-tag.js';\n\nimport {OscdPluginManager} from \"./plugin-manager/plugin-manager.js\";\nimport \"./plugin-manager/plugin-manager.js\";\nimport {OscdCustomPluginDialog} from \"./plugin-manager/custom-plugin-dialog.js\";\nimport \"./plugin-manager/custom-plugin-dialog.js\";\nimport \"./menu-tabs/menu-tabs.js\";\nimport { TabActivatedEvent } from \"./menu-tabs/menu-tabs.js\";\n\n\n@customElement('oscd-layout')\nexport class OscdLayout extends LitElement {\n\n /** The `XMLDocument` to be edited */\n @property({ attribute: false }) doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** Index of the last [[`EditorAction`]] applied. */\n @property({ type: Number }) editCount = -1;\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n /** The plugins to render the layout. */\n @property({ type: Array }) plugins: Plugin[] = [];\n\n /** The open-scd host element */\n @property({ type: Object }) host!: HTMLElement;\n\n @state() validated: Promise<void> = Promise.resolve();\n @state() shouldValidate = false;\n @state() activeEditor: Plugin | undefined = this.calcActiveEditors()[0];\n\n @query('#menu') menuUI!: Drawer;\n @query('#menuContent') menuContent!: List;\n @query('#pluginManager') pluginUI!: OscdPluginManager;\n @query('#pluginList') pluginList!: List;\n @query('#pluginAdd') pluginDownloadUI!: OscdCustomPluginDialog;\n\n\n render(): TemplateResult {\n return html`\n <div\n @open-plugin-download=${() => this.pluginDownloadUI.show()}\n @oscd-activate-editor=${this.handleActivateEditorByEvent}\n @oscd-run-menu=${this.handleRunMenuByEvent}\n >\n <slot></slot>\n ${this.renderHeader()} ${this.renderAside()} ${this.renderMenuContent()}\n ${this.renderContent()} ${this.renderLanding()} ${this.renderPlugging()}\n </div>\n `;\n }\n\n\n private renderPlugging(): TemplateResult {\n return html` ${this.renderPluginUI()} ${this.renderDownloadUI()} `;\n }\n\n private getMenuContent(src: string) {\n const tag = pluginTag(src);\n return this.menuContent.querySelector(tag);\n }\n\n /** Renders the \"Add Custom Plug-in\" UI*/\n protected renderDownloadUI(): TemplateResult {\n return html`\n <oscd-custom-plugin-dialog id=\"pluginAdd\"></oscd-custom-plugin-dialog>\n `\n }\n\n /**\n * Renders the plug-in management UI (turning plug-ins on/off)\n */\n protected renderPluginUI(): TemplateResult {\n return html`\n <oscd-plugin-manager id=\"pluginManager\" .plugins=${this.plugins}></oscd-plugin-manager>\n `\n }\n\n // Computed properties\n\n get validators(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'validator'\n );\n }\n get menuEntries(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'menu'\n );\n }\n get topMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'top');\n }\n get middleMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'middle');\n }\n get bottomMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'bottom');\n }\n\n\n get menu(): (MenuItem | 'divider')[] {\n\n const topMenu = this.generateMenu(this.topMenu, 'top');\n const middleMenu = this.generateMenu(this.middleMenu, 'middle');\n const bottomMenu = this.generateMenu(this.bottomMenu, 'bottom');\n const validators = this.generateValidatorMenus(this.validators);\n\n if (middleMenu.length > 0) middleMenu.push('divider');\n if (bottomMenu.length > 0) bottomMenu.push('divider');\n\n return [\n 'divider',\n ...topMenu,\n 'divider',\n {\n icon: 'undo',\n name: 'undo',\n actionItem: true,\n action: (): void => {\n this.editor.undo();\n },\n disabled: (): boolean => !this.editor.canUndo,\n kind: 'static',\n content: () => html``,\n },\n {\n icon: 'redo',\n name: 'redo',\n actionItem: true,\n action: (): void => {\n this.editor.redo();\n },\n disabled: (): boolean => !this.editor.canRedo,\n kind: 'static',\n content: () => html``,\n },\n ...validators,\n {\n icon: 'list',\n name: 'menu.viewLog',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.log));\n },\n kind: 'static',\n content: () => html``,\n },\n {\n icon: 'history',\n name: 'menu.viewHistory',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.history));\n },\n kind: 'static',\n content: () => html``,\n },\n {\n icon: 'rule',\n name: 'menu.viewDiag',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.diagnostic));\n },\n kind: 'static',\n content: () => html``,\n },\n 'divider',\n ...middleMenu,\n {\n icon: 'settings',\n name: 'settings.title',\n action: (): void => {\n this.dispatchEvent(newSettingsUIEvent(true));\n },\n kind: 'static',\n content: () => html``,\n },\n ...bottomMenu,\n {\n icon: 'extension',\n name: 'plugins.heading',\n action: (): void => this.pluginUI.show(),\n kind: 'static',\n content: () => html``,\n },\n ];\n }\n\n get editors(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'editor'\n );\n }\n\n // Keyboard Shortcuts\n private handleKeyPress(e: KeyboardEvent): void {\n // currently we only handley key shortcuts when users press ctrl\n if(!e.ctrlKey){ return }\n\n const keyFunctionMap: {[key:string]: () => void} = {\n 'm': () => this.menuUI.open = !this.menuUI.open,\n 'o': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"folder_open\"]')?.click(),\n 'O': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"create_new_folder\"]')?.click(),\n 's': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"save\"]')?.click(),\n 'P': () => this.pluginUI.show(),\n }\n\n const fn = keyFunctionMap[e.key];\n if(!fn){ return; }\n\n e.preventDefault();\n fn();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.host.addEventListener('close-drawer', async () => {\n this.menuUI.open = false;\n });\n this.host.addEventListener('validate', async () => {\n this.shouldValidate = true;\n await this.validated;\n\n if (!this.shouldValidate){ return; }\n\n this.shouldValidate = false;\n\n this.validated = Promise.allSettled(\n this.menuUI\n .querySelector('mwc-list')!\n .items.filter(item => item.className === 'validator')\n .map(item => {\n const src = item.dataset.src ?? '';\n const menuContentElement = this.getMenuContent(src);\n\n if (!menuContentElement) {\n return;\n }\n\n return (menuContentElement as unknown as Validator).validate()\n })\n ).then();\n this.dispatchEvent(newPendingStateEvent(this.validated));\n });\n this.handleKeyPress = this.handleKeyPress.bind(this);\n document.onkeydown = this.handleKeyPress;\n\n document.addEventListener(\"open-plugin-download\", () => {\n this.pluginDownloadUI.show();\n });\n }\n\n\n private generateMenu(plugins:Plugin[], kind: 'top' | 'middle' | 'bottom'): (MenuItem | 'divider')[]{\n return plugins.map(plugin => {\n return {\n icon: plugin.icon || pluginIcons['menu'],\n name: plugin.name,\n src: plugin.src,\n action: ae => {\n const menuContentElement = this.getMenuContent(plugin.src);\n if (!menuContentElement) {\n return;\n }\n\n this.dispatchEvent(newPendingStateEvent((menuContentElement as unknown as MenuPlugin).run()))\n },\n disabled: (): boolean => plugin.requireDoc! && this.doc === null,\n content: () => {\n if(plugin.content){ return plugin.content(); }\n return html``;\n },\n kind: kind,\n }\n })\n }\n\n private generateValidatorMenus(plugins: Plugin[]): (MenuItem | 'divider')[] {\n return plugins.map(plugin =>{\n return {\n icon: plugin.icon || pluginIcons['validator'],\n name: plugin.name,\n src: plugin.src,\n action: ae => {\n this.dispatchEvent(newEmptyIssuesEvent(plugin.src));\n\n const menuContentElement = this.getMenuContent(plugin.src);\n if (!menuContentElement) {\n return;\n }\n\n this.dispatchEvent(newPendingStateEvent((menuContentElement as unknown as Validator).validate()))\n },\n disabled: (): boolean => this.doc === null,\n content: plugin.content ?? (() => html``),\n kind: 'validator',\n }\n });\n }\n\n private renderMenuItem(me: MenuItem | 'divider'): TemplateResult {\n const isDivider = me === 'divider';\n const hasActionItem = me !== 'divider' && me.actionItem;\n\n if (isDivider) { return html`<li divider padded role=\"separator\"></li>`; }\n if (hasActionItem){ return html``; }\n return html`\n <mwc-list-item\n class=\"${me.kind}\"\n iconid=\"${me.icon}\"\n graphic=\"icon\"\n data-name=\"${me.name}\"\n data-src=\"${me.src ?? ''}\"\n .disabled=${me.disabled?.() || !me.action}\n ><mwc-icon slot=\"graphic\">${me.icon}</mwc-icon>\n <span>${get(me.name)}</span>\n ${me.hint\n ? html`<span slot=\"secondary\"><tt>${me.hint}</tt></span>`\n : ''}\n </mwc-list-item>\n `;\n }\n\n protected renderActionItem(me: MenuItem | 'divider'): TemplateResult {\n if(me === 'divider' || !me.actionItem){ return html`` }\n\n return html`\n <mwc-icon-button\n slot=\"actionItems\"\n icon=\"${me.icon}\"\n label=\"${me.name}\"\n ?disabled=${me.disabled?.() || !me.action}\n @click=${me.action}\n ></mwc-icon-button>`;\n }\n\n private renderEditorTab({ name, icon }: Plugin): TemplateResult {\n return html`<mwc-tab label=${name} icon=${icon || 'edit'}> </mwc-tab>`;\n }\n\n /** Renders top bar which features icon buttons for undo, redo, log, scl history and diagnostics*/\n protected renderHeader(): TemplateResult {\n return html`<mwc-top-app-bar-fixed>\n <mwc-icon-button\n icon=\"menu\"\n label=\"Menu\"\n slot=\"navigationIcon\"\n @click=${() => (this.menuUI.open = true)}\n ></mwc-icon-button>\n ${this.renderTitle()}\n ${this.renderActionItems()}\n </mwc-top-app-bar-fixed>`;\n }\n\n /**\n * Renders the title section in the top bar\n * Make sure to use slot=\"title\" for the returned template\n */\n protected renderTitle(): TemplateResult {\n return html`<div slot=\"title\" id=\"title\">${this.docName}</div>`;\n }\n\n /**\n * Renders the action items for the top bar\n * Make sure to use slot=\"actionItems\" for each element\n */\n protected renderActionItems(): TemplateResult {\n return html`${this.menu.map(this.renderActionItem)}`;\n }\n\n protected renderMenuContent(): TemplateResult {\n return html`\n <div id=\"menuContent\">\n ${\n this.menu\n .filter(p => (p as MenuItem).content)\n .map(p => (p as MenuItem).content())\n }\n </div>\n `;\n }\n\n /**\n * Renders a drawer toolbar featuring the scl filename, enabled menu plugins,\n * settings, help, scl history and plug-ins management\n */\n protected renderAside(): TemplateResult {\n\n return html`\n <mwc-drawer class=\"mdc-theme--surface\" hasheader type=\"modal\" id=\"menu\">\n <span slot=\"title\">${get('menu.title')}</span>\n ${renderTitle(this.docName)}\n <mwc-list\n wrapFocus\n @action=${makeListAction(this.menu)}\n >\n ${this.menu.map(this.renderMenuItem)}\n </mwc-list>\n </mwc-drawer>\n `;\n\n function renderTitle(docName?: string){\n if(!docName) return html``;\n\n return html`<span slot=\"subtitle\">${docName}</span>`;\n }\n\n function makeListAction(menuItems : (MenuItem|'divider')[]){\n return function listAction(ae: CustomEvent<ActionDetail>){\n //FIXME: dirty hack to be fixed in open-scd-core\n // if clause not necessary when oscd... components in open-scd not list\n if (ae.target instanceof List)\n (<MenuItem>(\n menuItems.filter(\n item => item !== 'divider' && !item.actionItem\n )[ae.detail.index]\n ))?.action?.(ae);\n }\n }\n\n\n }\n\n private calcActiveEditors(){\n const hasActiveDoc = Boolean(this.doc);\n\n return this.editors\n .filter(editor => {\n // this is necessary because `requireDoc` can be undefined\n // and that is not the same as false\n const doesNotRequireDoc = editor.requireDoc === false\n return doesNotRequireDoc || hasActiveDoc\n })\n }\n\n /** Renders the enabled editor plugins and a tab bar to switch between them*/\n protected renderContent(): TemplateResult {\n\n const activeEditors = this.calcActiveEditors()\n .map(this.renderEditorTab)\n\n const hasActiveEditors = activeEditors.length > 0;\n if(!hasActiveEditors){ return html``; }\n\n return html`\n <oscd-menu-tabs\n .editors=${this.calcActiveEditors()}\n .activeEditor=${this.activeEditor}\n @oscd-editor-tab-activated=${this.handleEditorTabActivated}\n >\n </oscd-menu-tabs>\n ${renderEditorContent(this.doc, this.activeEditor, )}\n `;\n\n function renderEditorContent(doc: XMLDocument | null, activeEditor?: Plugin){\n const editor = activeEditor;\n const requireDoc = editor?.requireDoc\n if(requireDoc && !doc) { return html`` }\n\n const content = editor?.content;\n if(!content) { return html`` }\n\n return html`${content()}`;\n }\n }\n\n private handleEditorTabActivated(e: TabActivatedEvent){\n this.activeEditor = e.detail.editor\n }\n\n private handleActivateEditorByEvent(e: CustomEvent<{name: string, src: string}>): void {\n const {name, src} = e.detail;\n const editors = this.calcActiveEditors()\n const wantedEditor = editors.find(editor => editor.name === name || editor.src === src)\n if(!wantedEditor){ return; } // TODO: log error\n\n this.activeEditor = wantedEditor;\n }\n\n private handleRunMenuByEvent(e: CustomEvent<{name: string}>): void {\n\n // TODO: this is a workaround, fix it\n this.menuUI.open = true;\n const menuEntry = this.menuUI.querySelector(`[data-name=\"${e.detail.name}\"]`) as HTMLElement\n\n const menuContentElement = this.getMenuContent(menuEntry.dataset.src ?? '');\n if (!menuContentElement) {\n return;\n }\n\n (menuContentElement as unknown as MenuPlugin).run();\n }\n\n /**\n * Renders the landing buttons (open project and new project)\n * it no document loaded we display the menu item that are in the position\n * 'top' and are not disabled\n *\n * To enable replacement of this part we have to convert it to either an addon\n * or a plugin\n */\n protected renderLanding(): TemplateResult {\n if(this.doc){ return html``; }\n\n return html`\n <div class=\"landing\">\n ${renderMenuItems(this.menu, this.menuUI)}\n </div>`\n\n function renderMenuItems(menuItemsAndDividers: (MenuItem | 'divider')[], menuUI: Drawer){\n\n const menuItems = menuItemsAndDividers.filter(mi => mi !== 'divider') as MenuItem[];\n\n return menuItems.map((mi: MenuItem, index) => {\n if(mi.kind !== 'top' || mi.disabled?.()) { return html``; }\n\n return html`\n <mwc-icon-button\n class=\"landing_icon\"\n icon=\"${mi.icon}\"\n @click=\"${() => clickListItem(index)}\"\n >\n <div class=\"landing_label\">${mi.name}</div>\n </mwc-icon-button>\n `\n })\n\n function clickListItem(index:number) {\n const listItem = menuUI.querySelector('mwc-list')!.items[index];\n listItem.click();\n }\n\n }\n }\n\n\n\n\n static styles = css`\n mwc-drawer {\n position: absolute;\n top: 0;\n }\n\n mwc-top-app-bar-fixed {\n --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);\n } /* hack to fix disabled icon buttons rendering black */\n\n mwc-tab {\n background-color: var(--primary);\n --mdc-theme-primary: var(--mdc-theme-on-primary);\n }\n\n input[type='file'] {\n display: none;\n }\n\n mwc-dialog {\n --mdc-dialog-max-width: 98vw;\n }\n\n mwc-dialog > form {\n display: flex;\n flex-direction: column;\n }\n\n mwc-dialog > form > * {\n display: block;\n margin-top: 16px;\n }\n\n mwc-linear-progress {\n position: fixed;\n --mdc-linear-progress-buffer-color: var(--primary);\n --mdc-theme-primary: var(--secondary);\n left: 0px;\n top: 0px;\n width: 100%;\n pointer-events: none;\n z-index: 1000;\n }\n\n tt {\n font-family: 'Roboto Mono', monospace;\n font-weight: 300;\n }\n\n .landing {\n position: absolute;\n text-align: center;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n }\n\n .landing_icon:hover {\n box-shadow: 0 12px 17px 2px rgba(0, 0, 0, 0.14),\n 0 5px 22px 4px rgba(0, 0, 0, 0.12), 0 7px 8px -4px rgba(0, 0, 0, 0.2);\n }\n\n .landing_icon {\n margin: 12px;\n border-radius: 16px;\n width: 160px;\n height: 140px;\n text-align: center;\n color: var(--mdc-theme-on-secondary);\n background: var(--secondary);\n --mdc-icon-button-size: 100px;\n --mdc-icon-size: 100px;\n --mdc-ripple-color: rgba(0, 0, 0, 0);\n box-shadow: rgb(0 0 0 / 14%) 0px 6px 10px 0px,\n rgb(0 0 0 / 12%) 0px 1px 18px 0px, rgb(0 0 0 / 20%) 0px 3px 5px -1px;\n transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .landing_label {\n width: 160px;\n height: 50px;\n margin-top: 100px;\n margin-left: -30px;\n font-family: 'Roboto', sans-serif;\n }\n\n .plugin.menu {\n display: flex;\n }\n\n .plugin.validator {\n display: flex;\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../../src/addons/Settings.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n property,\n query,\n TemplateResult,\n customElement,\n LitElement,\n css,\n} from 'lit-element';\nimport { get, translate, registerTranslateConfig, Strings, use } from 'lit-translate';\n\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-formfield';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-select';\nimport '@material/mwc-switch';\n\nimport { Dialog } from '@material/mwc-dialog';\nimport { Select } from '@material/mwc-select';\nimport { Switch } from '@material/mwc-switch';\n\nimport { getTheme } from '../themes.js';\n\nimport { \n newLogEvent,\n Settings, \n SettingsUIEvent, \n Language,\n NsdVersions,\n NsdVersion,\n LoadNsdocEvent,\n newLoadNsdocEvent\n} from '@compas-oscd/core';\nimport { Languages, languages, loader } from '../translations/loader.js';\n\nimport '../WizardDivider.js';\nimport { WizardDialog } from '../wizard-dialog.js';\n\nimport {\n iec6185072,\n iec6185073,\n iec6185074,\n iec6185081,\n} from '../foundation/nsd.js';\nimport { initializeNsdoc, Nsdoc } from '../foundation/nsdoc.js';\n\ninterface LanguageConfig {\n loader(lang: string): Promise<Strings>;\n languages: Languages;\n}\n\nexport const defaults: Settings = {\n language: 'en',\n theme: 'light',\n mode: 'safe',\n showieds: 'off',\n 'IEC 61850-7-2': undefined,\n 'IEC 61850-7-3': undefined,\n 'IEC 61850-7-4': undefined,\n 'IEC 61850-8-1': undefined,\n};\n\n@customElement('oscd-settings')\nexport class OscdSettings extends LitElement {\n /** Current [[`Settings`]] in `localStorage`, default to [[`defaults`]]. */\n @property()\n get settings(): Settings {\n return {\n language: this.getSetting('language'),\n theme: this.getSetting('theme'),\n mode: this.getSetting('mode'),\n showieds: this.getSetting('showieds'),\n 'IEC 61850-7-2': this.getSetting('IEC 61850-7-2'),\n 'IEC 61850-7-3': this.getSetting('IEC 61850-7-3'),\n 'IEC 61850-7-4': this.getSetting('IEC 61850-7-4'),\n 'IEC 61850-8-1': this.getSetting('IEC 61850-8-1'),\n };\n }\n /** Object containing all *.nsdoc files and a function extracting element's label form them*/\n @property({ attribute: false })\n nsdoc: Nsdoc = initializeNsdoc();\n\n @property({\n type: Object,\n })\n host!: HTMLElement;\n\n @property({ type: Boolean })\n nsdUploadButton = true;\n\n @property({ type: Object })\n languageConfig: LanguageConfig = { languages, loader };\n\n /**\n * Get the versions of the current OpenSCD NSD files.\n * @returns Current version, revision and release for all current OpenSCD NSD files.\n */\n private async nsdVersions(): Promise<NsdVersions> {\n const [nsd72, nsd73, nsd74, nsd81] = await Promise.all([\n iec6185072,\n iec6185073,\n iec6185074,\n iec6185081,\n ]);\n const [nsd72Ns, nsd73Ns, nsd74Ns, nsd81Ns] = [\n nsd72.querySelector('NS'),\n nsd73.querySelector('NS'),\n nsd74.querySelector('NS'),\n nsd81.querySelector('ServiceNS'),\n ];\n\n return {\n 'IEC 61850-7-2': {\n version: nsd72Ns?.getAttribute('version') ?? undefined,\n revision: nsd72Ns?.getAttribute('revision') ?? undefined,\n release: nsd72Ns?.getAttribute('release') ?? undefined,\n },\n 'IEC 61850-7-3': {\n version: nsd73Ns?.getAttribute('version') ?? undefined,\n revision: nsd73Ns?.getAttribute('revision') ?? undefined,\n release: nsd73Ns?.getAttribute('release') ?? undefined,\n },\n 'IEC 61850-7-4': {\n version: nsd74Ns?.getAttribute('version') ?? undefined,\n revision: nsd74Ns?.getAttribute('revision') ?? undefined,\n release: nsd74Ns?.getAttribute('release') ?? undefined,\n },\n 'IEC 61850-8-1': {\n version: nsd81Ns?.getAttribute('version') ?? undefined,\n revision: nsd81Ns?.getAttribute('revision') ?? undefined,\n release: nsd81Ns?.getAttribute('release') ?? undefined,\n },\n };\n }\n\n @query('#settings')\n settingsUI!: Dialog;\n @query('#language')\n languageUI!: Select;\n @query('#dark')\n darkThemeUI!: Switch;\n @query('#mode')\n modeUI!: Switch;\n @query('#showieds')\n showiedsUI!: Switch;\n\n @query('#nsdoc-file')\n private nsdocFileUI!: HTMLInputElement;\n\n private getSetting<T extends keyof Settings>(setting: T): Settings[T] {\n return (\n <Settings[T] | null>localStorage.getItem(String(setting)) ?? defaults[setting]\n );\n }\n\n /** Update the `value` of `setting`, storing to `localStorage`. */\n setSetting<T extends keyof Settings>(setting: T, value: Settings[T]): void {\n localStorage.setItem(String(setting), <string>(<unknown>value));\n this.shadowRoot\n ?.querySelector<WizardDialog>('wizard-dialog')\n ?.requestUpdate();\n this.requestUpdate();\n }\n\n /** Remove the `setting` in `localStorage`. */\n removeSetting<T extends keyof Settings>(setting: T): void {\n localStorage.removeItem(String(setting));\n this.shadowRoot\n ?.querySelector<WizardDialog>('wizard-dialog')\n ?.requestUpdate();\n this.requestUpdate();\n\n this.nsdoc = initializeNsdoc(); // update nsdoc\n }\n\n private onClosing(ae: CustomEvent<{ action: string } | null>): void {\n if (ae.detail?.action === 'reset') {\n Object.keys(this.settings).forEach(item => localStorage.removeItem(String(item)));\n this.requestUpdate('settings');\n } else if (ae.detail?.action === 'save') {\n this.setSetting('language', <Language>this.languageUI.value);\n this.setSetting('theme', this.darkThemeUI.checked ? 'dark' : 'light');\n this.setSetting('mode', this.modeUI.checked ? 'pro' : 'safe');\n this.setSetting('showieds', this.showiedsUI.checked ? 'on' : 'off');\n this.requestUpdate('settings');\n }\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n if (changedProperties.has('settings' as string)) use(this.settings.language);\n }\n\n private renderFileSelect(): TemplateResult {\n return html`\n <input\n id=\"nsdoc-file\"\n accept=\".nsdoc\"\n type=\"file\"\n hidden\n required\n multiple\n @change=\"${(evt: Event) => this.uploadNsdocFile(evt)}}\"\n />\n <mwc-button\n label=\"${translate('settings.selectFileButton')}\"\n id=\"selectFileButton\"\n @click=${() => {\n const input = <HTMLInputElement | null>(\n this.shadowRoot!.querySelector('#nsdoc-file')\n );\n input?.click();\n }}\n >\n </mwc-button>\n `;\n }\n\n private async uploadNsdocFile(evt: Event): Promise<void> {\n const files = Array.from(\n (<HTMLInputElement | null>evt.target)?.files ?? []\n );\n\n if (files.length == 0) return;\n for (const file of files) {\n const text = await file.text();\n this.dispatchEvent(newLoadNsdocEvent(text, file.name));\n }\n\n this.nsdocFileUI.value = '';\n this.requestUpdate();\n }\n\n private async onLoadNsdoc(event: LoadNsdocEvent) {\n const nsdocElement = this.parseToXmlObject(\n event.detail.nsdoc\n ).querySelector('NSDoc');\n\n const id = nsdocElement?.getAttribute('id');\n if (!id) {\n this.dispatchEvent(\n newLogEvent({\n kind: 'error',\n title: get('settings.invalidFileNoIdFound', {\n filename: event.detail.filename,\n }),\n })\n );\n return;\n }\n\n const nsdVersions = await this.nsdVersions();\n const nsdVersion = nsdVersions[id as keyof NsdVersions];\n const nsdocVersion = {\n version: nsdocElement!.getAttribute('version') ?? '',\n revision: nsdocElement!.getAttribute('revision') ?? '',\n release: nsdocElement!.getAttribute('release') ?? '',\n };\n\n if (!this.isEqual(nsdVersion, nsdocVersion)) {\n this.dispatchEvent(\n newLogEvent({\n kind: 'warning',\n title: get('settings.invalidNsdocVersion', {\n id: id,\n filename: event.detail.filename,\n nsdVersion: `${nsdVersion.version}${nsdVersion.revision}${nsdVersion.release}`,\n nsdocVersion: `${nsdocVersion.version}${nsdocVersion.revision}${nsdocVersion.release}`,\n }),\n })\n );\n }\n\n this.setSetting(id as keyof Settings, event.detail.nsdoc);\n this.nsdoc = initializeNsdoc(); // update nsdoc\n }\n\n /**\n * Check the equality of two NsdVersions.\n * @param versionA - First version to compare.\n * @param versionB - Second version to compare.\n * @returns Are they equal or not.\n */\n private isEqual(versionA: NsdVersion, versionB: NsdVersion): boolean {\n return (\n versionA.version == versionB.version &&\n versionA.revision == versionB.revision &&\n versionA.release == versionB.release\n );\n }\n\n /**\n * Render one .nsdoc item in the Settings wizard\n * @param key - The key of the nsdoc file in the settings.\n * @returns a .nsdoc item for the Settings wizard\n */\n private renderNsdocItem<T extends keyof Settings>(key: T): TemplateResult {\n const nsdSetting = this.settings[key];\n let nsdVersion: string | undefined | null;\n let nsdRevision: string | undefined | null;\n let nsdRelease: string | undefined | null;\n\n if (nsdSetting) {\n const nsdoc = this.parseToXmlObject(nsdSetting)!.querySelector('NSDoc');\n nsdVersion = nsdoc?.getAttribute('version');\n nsdRevision = nsdoc?.getAttribute('revision');\n nsdRelease = nsdoc?.getAttribute('release');\n }\n\n return html`<mwc-list-item\n id=${key}\n graphic=\"avatar\"\n hasMeta\n twoline\n .disabled=${!nsdSetting}\n >\n <span>${key}</span>\n ${nsdSetting\n ? html`<span slot=\"secondary\"\n >${nsdVersion}${nsdRevision}${nsdRelease}</span\n >`\n : html``}\n ${nsdSetting\n ? html`<mwc-icon slot=\"graphic\" style=\"color:green;\">done</mwc-icon>`\n : html`<mwc-icon slot=\"graphic\" style=\"color:red;\">close</mwc-icon>`}\n ${nsdSetting\n ? html`<mwc-icon\n id=\"deleteNsdocItem\"\n slot=\"meta\"\n @click=${() => {\n this.removeSetting(key);\n }}\n >delete</mwc-icon\n >`\n : html``}\n </mwc-list-item>`;\n }\n\n private parseToXmlObject(text: string): XMLDocument {\n return new DOMParser().parseFromString(text, 'application/xml');\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n registerTranslateConfig({ loader: this.languageConfig.loader, empty: key => key });\n use(this.settings.language);\n\n if (this.host) {\n this.host!.addEventListener('oscd-settings', (evt: SettingsUIEvent) => {\n evt.detail.show ? this.settingsUI.show() : this.settingsUI.close();\n });\n (<any>this.host).addEventListener('load-nsdoc', (evt: LoadNsdocEvent) =>\n this.onLoadNsdoc(evt)\n );\n }\n }\n\n render(): TemplateResult {\n return html`<mwc-dialog\n id=\"settings\"\n heading=\"${translate('settings.title')}\"\n @closing=${this.onClosing}\n >\n <form>\n <mwc-select\n fixedMenuPosition\n id=\"language\"\n icon=\"language\"\n label=\"${translate('settings.language')}\"\n >\n ${Object.keys(this.languageConfig.languages).map(\n lang =>\n html`<mwc-list-item\n graphic=\"icon\"\n value=\"${lang}\"\n ?selected=${lang === this.settings.language}\n >${translate(`settings.languages.${lang}`)}</mwc-list-item\n >`\n )}\n </mwc-select>\n <mwc-formfield label=\"${translate('settings.dark')}\">\n <mwc-switch\n id=\"dark\"\n ?checked=${this.settings.theme === 'dark'}\n ></mwc-switch>\n </mwc-formfield>\n <mwc-formfield label=\"${translate('settings.mode')}\">\n <mwc-switch\n id=\"mode\"\n ?checked=${this.settings.mode === 'pro'}\n ></mwc-switch>\n </mwc-formfield>\n <mwc-formfield label=\"${translate('settings.showieds')}\">\n <mwc-switch\n id=\"showieds\"\n ?checked=${this.settings.showieds === 'on'}\n ></mwc-switch>\n </mwc-formfield>\n </form>\n <wizard-divider></wizard-divider>\n ${this.nsdUploadButton\n ? html`<section id=\"shownsdbutton\">\n <h3>${translate('settings.loadNsdTranslations')}</h3>\n ${this.renderFileSelect()}\n </section>`\n : html``}\n <mwc-list id=\"nsdocList\">\n ${this.renderNsdocItem('IEC 61850-7-2')}\n ${this.renderNsdocItem('IEC 61850-7-3')}\n ${this.renderNsdocItem('IEC 61850-7-4')}\n ${this.renderNsdocItem('IEC 61850-8-1')}\n </mwc-list>\n <mwc-button slot=\"secondaryAction\" dialogAction=\"close\">\n ${translate('cancel')}\n </mwc-button>\n <mwc-button\n style=\"--mdc-theme-primary: var(--mdc-theme-error)\"\n slot=\"secondaryAction\"\n dialogAction=\"reset\"\n >\n ${translate('reset')}\n </mwc-button>\n <mwc-button\n icon=\"save\"\n trailingIcon\n slot=\"primaryAction\"\n dialogAction=\"save\"\n >\n ${translate('save')}\n </mwc-button>\n </mwc-dialog>\n <slot></slot>\n ${getTheme(this.settings.theme)}`;\n }\n\n static styles = css`\n mwc-top-app-bar-fixed {\n --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);\n } /* hack to fix disabled icon buttons rendering black */\n\n mwc-tab {\n background-color: var(--primary);\n --mdc-theme-primary: var(--mdc-theme-on-primary);\n }\n\n input[type='file'] {\n display: none;\n }\n\n mwc-dialog {\n --mdc-dialog-max-width: 98vw;\n }\n\n mwc-dialog > form {\n display: flex;\n flex-direction: column;\n }\n\n mwc-dialog > form > * {\n display: block;\n margin-top: 16px;\n }\n\n mwc-linear-progress {\n position: fixed;\n --mdc-linear-progress-buffer-color: var(--primary);\n --mdc-theme-primary: var(--secondary);\n left: 0px;\n top: 0px;\n width: 100%;\n pointer-events: none;\n z-index: 1000;\n }\n\n tt {\n font-family: 'Roboto Mono', monospace;\n font-weight: 300;\n }\n\n .landing {\n position: absolute;\n text-align: center;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n }\n\n .landing_icon:hover {\n box-shadow: 0 12px 17px 2px rgba(0, 0, 0, 0.14),\n 0 5px 22px 4px rgba(0, 0, 0, 0.12), 0 7px 8px -4px rgba(0, 0, 0, 0.2);\n }\n\n .landing_icon {\n margin: 12px;\n border-radius: 16px;\n width: 160px;\n height: 140px;\n text-align: center;\n color: var(--mdc-theme-on-secondary);\n background: var(--secondary);\n --mdc-icon-button-size: 100px;\n --mdc-icon-size: 100px;\n --mdc-ripple-color: rgba(0, 0, 0, 0);\n box-shadow: rgb(0 0 0 / 14%) 0px 6px 10px 0px,\n rgb(0 0 0 / 12%) 0px 1px 18px 0px, rgb(0 0 0 / 20%) 0px 3px 5px -1px;\n transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .landing_label {\n width: 160px;\n height: 50px;\n margin-top: 100px;\n margin-left: -30px;\n font-family: 'Roboto', sans-serif;\n }\n\n .plugin.menu {\n display: flex;\n }\n\n .plugin.validator {\n display: flex;\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Waiter.js","sourceRoot":"","sources":["../../../src/addons/Waiter.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,IAAI,EACJ,UAAU,EACV,QAAQ,GAET,MAAM,aAAa,CAAC;AAErB,OAAO,+BAA+B,CAAC;AAKhC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IAShC,KAAK,CAAC,cAAc,CAAC,CAAkC;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QAlBV,oEAAoE;QAEpE,YAAO,GAAG,KAAK,CAAC;QAER,SAAI,GAAuB,IAAI,GAAG,EAAE,CAAC;QAC7C,wEAAwE;QACxE,aAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAavC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,GAAU,EAAE,EAAE;YACpD,IAAI,GAAG,YAAY,WAAW,EAAE;gBAC9B,IAAI,CAAC,cAAc,CAAC,GAAsC,CAAC,CAAC;aAC7D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC,GAAU,EAAE,EAAE;YACvD,IAAI,GAAG,YAAY,WAAW,EAAE;gBAC9B,IAAI,CAAC,cAAc,CAAC,GAAsC,CAAC,CAAC;aAC7D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;kBAEG,CAAC,IAAI,CAAC,OAAO;;8BAED,CAAC;IAC7B,CAAC;CACF,CAAA;AA7CC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;2CACZ;AAHL,UAAU;IADtB,aAAa,CAAC,aAAa,CAAC;GAChB,UAAU,CAgDtB;SAhDY,UAAU","sourcesContent":["import {\n customElement,\n html,\n LitElement,\n property,\n TemplateResult,\n} from 'lit-element';\n\nimport '@material/mwc-linear-progress';\n\nimport { PendingStateDetail } from '@compas-oscd/core';\n\n@customElement('oscd-waiter')\nexport class OscdWaiter extends LitElement {\n /** Whether the element is currently waiting for some async work. */\n @property({ type: Boolean })\n waiting = false;\n\n private work: Set<Promise<void>> = new Set();\n /** A promise which resolves once all currently pending work is done. */\n workDone = Promise.allSettled(this.work);\n\n private async onPendingState(e: CustomEvent<PendingStateDetail>) {\n this.waiting = true;\n this.work.add(e.detail.promise);\n this.workDone = Promise.allSettled(this.work);\n await e.detail.promise.catch((reason: unknown) => console.warn(reason));\n this.work.delete(e.detail.promise);\n this.waiting = this.work.size > 0;\n }\n\n constructor() {\n super();\n this.onPendingState = this.onPendingState.bind(this);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('pending-state', (evt: Event) => {\n if (evt instanceof CustomEvent) {\n this.onPendingState(evt as CustomEvent<PendingStateDetail>);\n }\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('pending-state', (evt: Event) => {\n if (evt instanceof CustomEvent) {\n this.onPendingState(evt as CustomEvent<PendingStateDetail>);\n }\n });\n }\n\n render(): TemplateResult {\n return html`<slot></slot>\n <mwc-linear-progress\n .closed=${!this.waiting}\n indeterminate\n ></mwc-linear-progress>`;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Wizards.js","sourceRoot":"","sources":["../../../src/addons/Wizards.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EAEL,KAAK,EACL,aAAa,EACb,UAAU,EACV,QAAQ,GACT,MAAM,aAAa,CAAC;AAGrB,OAAO,qBAAqB,CAAC;AAG7B;6EAC6E;AAEtE,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAApC;;QAML,8CAA8C;QAE9C,aAAQ,GAAoB,EAAE,CAAC;IAgCjC,CAAC;IA5BS,QAAQ,CAAC,EAAe;QAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QAChC,IAAI,MAAM,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;aACtC,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;YACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAC5B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAC9B,CACF,CACF,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,EAAE,CAC/C,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAC9B,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;+BACgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,CAAC;IAC3E,CAAC;CACF,CAAA;AApCC;IAHC,QAAQ,CAAC;QACR,IAAI,EAAE,MAAM;KACb,CAAC;yCACiB;AAInB;IADC,KAAK,EAAE;6CACuB;AAEP;IAAvB,KAAK,CAAC,eAAe,CAAC;6CAAyB;AAVrC,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAwCvB;SAxCY,WAAW","sourcesContent":["import {\n html,\n state,\n TemplateResult,\n query,\n customElement,\n LitElement,\n property,\n} from 'lit-element';\nimport { WizardEvent, WizardFactory } from '../foundation.js';\n\nimport '../wizard-dialog.js';\nimport { WizardDialog } from '../wizard-dialog.js';\n\n/** `LitElement` mixin that adds a `workflow` property which [[`Wizard`]]s are\n * queued onto on incoming [[`WizardEvent`]]s, first come first displayed. */\n@customElement('oscd-wizards')\nexport class OscdWizards extends LitElement {\n @property({\n type: Object,\n })\n host!: HTMLElement;\n\n /** FIFO queue of [[`Wizard`]]s to display. */\n @state()\n workflow: WizardFactory[] = [];\n\n @query('wizard-dialog') wizardUI!: WizardDialog;\n\n private onWizard(we: WizardEvent) {\n const wizard = we.detail.wizard;\n if (wizard === null) this.workflow.shift();\n else if (we.detail.subwizard) this.workflow.unshift(wizard);\n else this.workflow.push(wizard);\n this.requestUpdate('workflow');\n this.updateComplete.then(() =>\n this.wizardUI.updateComplete.then(() =>\n this.wizardUI.dialog?.updateComplete.then(() =>\n this.wizardUI.dialog?.focus()\n )\n )\n );\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.host.addEventListener('wizard', this.onWizard.bind(this));\n this.host.addEventListener('editor-action', () =>\n this.wizardUI.requestUpdate()\n );\n }\n\n render(): TemplateResult {\n return html`<slot></slot>\n <wizard-dialog .wizard=${this.workflow[0]?.() ?? []}></wizard-dialog>`;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-action-to-v1-converter.js","sourceRoot":"","sources":["../../../../src/addons/editor/edit-action-to-v1-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Create,\n Delete,\n EditorAction,\n isCreate,\n isDelete,\n isMove,\n isReplace,\n isSimple,\n Move,\n Replace,\n SimpleAction,\n Update,\n Edit,\n Insert,\n Remove,\n EditorUpdate,\n isEditorUpdate\n} from '@compas-oscd/core';\nimport { getReference, SCLTag } from '../../foundation.js';\n\nexport function convertEditActiontoV1(action: EditorAction): Edit {\n if (isSimple(action)) {\n return convertSimpleAction(action);\n } else {\n return action.actions.map(convertSimpleAction);\n }\n}\n\nfunction convertSimpleAction(action: SimpleAction): Edit {\n if (isCreate(action)) {\n return convertCreate(action);\n } else if (isDelete(action)) {\n return convertDelete(action);\n } else if (isEditorUpdate(action)) {\n return convertUpdate(action);\n } else if (isMove(action)) {\n return convertMove(action);\n } else if (isReplace(action)) {\n return convertReplace(action);\n }\n\n throw new Error('Unknown action type');\n}\n\nfunction convertCreate(action: Create): Insert {\n let reference: Node | null = null;\n if (\n action.new.reference === undefined &&\n action.new.element instanceof Element &&\n action.new.parent instanceof Element\n ) {\n reference = getReference(\n action.new.parent,\n <SCLTag>action.new.element.tagName\n );\n } else {\n reference = action.new.reference ?? null; \n }\n\n return {\n parent: action.new.parent,\n node: action.new.element,\n reference,\n };\n}\n\nfunction convertDelete(action: Delete): Remove {\n return {\n node: action.old.element,\n };\n}\n\nfunction convertUpdate(action: EditorUpdate): Update {\n const oldAttributesToRemove: Record<string, string | null> = {};\n Array.from(action.element.attributes).forEach(attr => {\n const attribute = attr as Attr;\n oldAttributesToRemove[attribute.name] = null;\n });\n\n const attributes = {\n ...oldAttributesToRemove,\n ...action.newAttributes,\n };\n\n return {\n element: action.element,\n attributes,\n };\n}\n\nfunction convertMove(action: Move): Insert {\n if (action.new.reference === undefined) {\n action.new.reference = getReference(\n action.new.parent,\n <SCLTag>action.old.element.tagName\n );\n }\n\n return {\n parent: action.new.parent,\n node: action.old.element,\n reference: action.new.reference ?? null,\n };\n}\n\nfunction convertReplace(action: Replace): Edit {\n const oldChildren = action.old.element.children;\n // We have to clone the children, because otherwise undoing the action would remove the children from the old element, because append removes the old parent\n const copiedChildren = Array.from(oldChildren).map(e => (e as Element).cloneNode(true));\n\n const newNode = action.new.element.cloneNode(true) as Element;\n newNode.append(...Array.from(copiedChildren));\n const parent = action.old.element.parentElement;\n\n if (!parent) {\n throw new Error('Replace action called without parent in old element');\n }\n\n const reference = action.old.element.nextSibling;\n\n const remove: Remove = { node: action.old.element };\n const insert: Insert = {\n parent,\n node: newNode,\n reference,\n };\n\n return [remove, insert];\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-v1-to-v2-converter.js","sourceRoot":"","sources":["../../../../src/addons/editor/edit-v1-to-v2-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAU,MAAM,mBAAmB,CAAC;AAEhH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;KACpC;SAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;QACzB,OAAO,IAAc,CAAC;KACvB;SAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;QACzB,OAAO,IAAc,CAAC;KACvB;SAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;QACzB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;KAC5B;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;KACtC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,UAAU,GAA2C,EAAE,CAAC;IAC9D,MAAM,YAAY,GAEd,EAAE,CAAC;IAEP,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACvD,IAAI,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;YAChC,MAAM,EAAE,GAAI,KAAkC,CAAC,YAAY,CAAC;YAC5D,IAAI,CAAC,EAAE;gBAAE,OAAO;YAEhB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;gBACrB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;aACvB;YACD,YAAY,CAAC,EAAE,CAAE,CAAC,GAAG,CAAC,GAAI,KAAkC,CAAC,KAAK,CAAC;SACpE;aAAM;YACL,UAAU,CAAC,GAAG,CAAC,GAAG,KAAsB,CAAC;SAC1C;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["import { Edit, EditV2, isComplex, isInsert, isNamespaced, isRemove, isUpdate, Update } from '@compas-oscd/core';\n\nexport function convertEditV1toV2(edit: Edit): EditV2 {\n if (isComplex(edit)) {\n return edit.map(convertEditV1toV2);\n } else if (isRemove(edit)) {\n return edit as EditV2;\n } else if (isInsert(edit)) {\n return edit as EditV2;\n } else if (isUpdate(edit)) {\n return convertUpdate(edit);\n } else {\n throw new Error('Unknown edit type');\n }\n}\n\nfunction convertUpdate(edit: Update): EditV2 {\n const attributes: Partial<Record<string, string | null>> = {};\n const attributesNS: Partial<\n Record<string, Partial<Record<string, string | null>>>\n > = {};\n\n Object.entries(edit.attributes).forEach(([key, value]) => {\n if (value && isNamespaced(value)) {\n const ns = (value as { namespaceURI: string }).namespaceURI;\n if (!ns) return;\n\n if (!attributesNS[ns]) {\n attributesNS[ns] = {};\n }\n attributesNS[ns]![key] = (value as { value: string | null }).value;\n } else {\n attributes[key] = value as string | null;\n }\n });\n\n return { element: edit.element, attributes, attributesNS };\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-log-text.js","sourceRoot":"","sources":["../../../../src/addons/history/get-log-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAuC,EAAE;IAC9E,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,GAAG,CAAC,cAAc,CAAC,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;KACpD;SAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;KACpD;SAAM,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,GAAG,CAAC,cAAc,CAAC,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;KACpD;SAAM,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/G,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;KACnD;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvB,CAAC,CAAA","sourcesContent":["import {\n EditV2,\n isInsertV2,\n isRemoveV2,\n isSetAttributesV2,\n isSetTextContentV2,\n isComplexV2\n} from '@compas-oscd/core';\nimport { get } from 'lit-translate';\n\nexport const getLogText = (edit: EditV2): { title: string, message?: string } => {\n if (isInsertV2(edit)) {\n const name = edit.node instanceof Element ?\n edit.node.tagName :\n get('editing.node');\n return { title: get('editing.created', { name }) };\n } else if (isSetAttributesV2(edit) || isSetTextContentV2(edit)) {\n const name = edit.element.tagName;\n return { title: get('editing.updated', { name }) };\n } else if (isRemoveV2(edit)) {\n const name = edit.node instanceof Element ?\n edit.node.tagName :\n get('editing.node');\n return { title: get('editing.deleted', { name }) };\n } else if (isComplexV2(edit)) {\n const message = edit.map((e: EditV2) => getLogText(e)).map(({ title }: { title: string }) => title).join(', ');\n return { title: get('editing.complex'), message };\n }\n \n return { title: '' };\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-tabs.js","sourceRoot":"","sources":["../../../../src/addons/menu-tabs/menu-tabs.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,IAAI,EACJ,UAAU,EACV,QAAQ,EAER,KAAK,EAEL,GAAG,EACJ,MAAM,aAAa,CAAC;AAErB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAQvB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QAEsB,YAAO,GAAa,EAAE,CAAC;QAUjC,mBAAc,GAAG,CAAC,CAAC;IAqCtC,CAAC;IA7C6B,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,IAAI,YAAY,CAAC,MAA0B;QACzC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC;QAClG,IAAI,CAAC,cAAc,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAAA,CAAC;IAIF,MAAM;QACJ,IAAG,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAC;YAAE,OAAO,IAAI,CAAA,EAAE,CAAC;SAAE;QAE/C,OAAO,IAAI,CAAA;;+BAEgB,IAAI,CAAC,wBAAwB;sBACtC,IAAI,CAAC,cAAc;;UAE9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,SAAS,CAAG;;KAEpC,CAAA;IACH,CAAC;IASO,wBAAwB,CAAC,CAAc;QAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEO,sBAAsB,CAAE,MAAc;QAC5C,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,oBAAoB,EAAE;YACrD,MAAM,EAAE,EAAE,MAAM,EAAE;YAClB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QACF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;;AArBM,mBAAM,GAAG,GAAG,CAAA;;;;;GAKlB,CAAA;AA9B0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;6CAAwB;AAEtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAkD;AAQpE;IAAR,KAAK,EAAE;oDAA4B;AAZzB,YAAY;IADxB,aAAa,CAAC,gBAAgB,CAAC;GACnB,YAAY,CAiDxB;SAjDY,YAAY;AAmDzB,SAAS,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAU;IACvC,OAAO,IAAI,CAAA;qBACQ,IAAI,SAAS,IAAI,IAAI,MAAM;GAC7C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAA","sourcesContent":["import {\n customElement,\n html,\n LitElement,\n property,\n query,\n state,\n TemplateResult,\n css\n} from 'lit-element';\n\nimport '@material/mwc-list';\nimport '@material/mwc-tab';\nimport '@material/mwc-tab-bar';\nimport '@material/mwc-button';\n\nimport {\n Plugin,\n} from \"../../plugin.js\"\n\n\n@customElement('oscd-menu-tabs')\nexport class OscdMenuTabs extends LitElement {\n\n @property({ type: Array }) editors: Plugin[] = [];\n _activeEditor: Plugin | undefined;\n @property({ type: Object }) get activeEditor() { return this._activeEditor; }\n set activeEditor(editor: Plugin | undefined) {\n this._activeEditor = editor;\n const editorIndex = this.editors.findIndex(e => e.name === editor?.name && e.src === editor?.src);\n this.activeTabIndex = editorIndex > -1 ? editorIndex : 0;\n this.requestUpdate();\n };\n\n @state() private activeTabIndex = 0;\n\n render(){\n if(this.editors.length === 0){ return html``; }\n\n return html`\n <mwc-tab-bar\n @MDCTabBar:activated=${this.handleActivatedEditorTab}\n activeIndex=${this.activeTabIndex}\n >\n ${ this.editors.map( EditorTab ) }\n </mwc-tab-bar>\n `\n }\n\n static styles = css`\n mwc-tab {\n background-color: var(--primary);\n --mdc-theme-primary: var(--mdc-theme-on-primary);\n }\n `\n\n private handleActivatedEditorTab(e: CustomEvent): void {\n const tabIndex = e.detail.index;\n const editor = this.editors[tabIndex];\n this.activeTabIndex = tabIndex;\n this.dispatchActivateEditor(editor);\n }\n\n private dispatchActivateEditor( editor: Plugin ){\n const newEvent = new CustomEvent(TabActivatedEventKey, {\n detail: { editor },\n composed: true,\n bubbles: true\n })\n this.dispatchEvent(newEvent)\n }\n}\n\nfunction EditorTab({ name, icon }: Plugin): TemplateResult {\n return html`\n <mwc-tab label=${name} icon=${icon || 'edit'}> </mwc-tab>\n `;\n}\n\nexport const TabActivatedEventKey = 'oscd-editor-tab-activated'\nexport type TabActivatedEvent = CustomEvent<TabActivatedEventDetail>;\nexport type TabActivatedEventDetail = { editor: Plugin }\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-plugin-dialog.js","sourceRoot":"","sources":["../../../../src/addons/plugin-manager/custom-plugin-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport {\n customElement,\n html,\n LitElement,\n query,\n TemplateResult,\n css,\n} from 'lit-element';\nimport { get } from 'lit-translate';\nimport {\n newAddExternalPluginEvent,\n pluginIcons\n} from '../../open-scd.js';\n\nimport {\n MenuPosition,\n menuPosition,\n PluginKind\n} from \"../../plugin.js\";\n\nimport type { Button } from '@material/mwc-button';\nimport type { Dialog } from '@material/mwc-dialog';\nimport { List } from '@material/mwc-list';\nimport type { ListItem } from '@material/mwc-list/mwc-list-item';\nimport type { Select } from '@material/mwc-select';\nimport type { Switch } from '@material/mwc-switch';\nimport type { TextField } from '@material/mwc-textfield';\n\nimport '@material/mwc-dialog';\nimport '@material/mwc-drawer';\nimport '@material/mwc-list';\nimport '@material/mwc-select';\nimport '@material/mwc-switch';\nimport '@material/mwc-textfield';\n\n\n@customElement('oscd-custom-plugin-dialog')\nexport class OscdCustomPluginDialog extends LitElement {\n\n @query('#dialog') dialog!: Dialog\n @query('#pluginSrcInput') pluginSrcInput!: TextField\n @query('#pluginNameInput') pluginNameInput!: TextField\n @query('#pluginKindList') pluginKindList!: List\n @query('#requireDoc') requireDoc!: Switch\n @query('#positionList') positionList!: Select\n @query('#addButton') addButton!: Button\n\n render(): TemplateResult {\n return html`\n <mwc-dialog id=\"dialog\" heading=\"${get('plugins.add.heading')}\">\n <div style=\"display: flex; flex-direction: column; row-gap: 8px;\">\n <p style=\"color:var(--mdc-theme-error);\">\n ${get('plugins.add.warning')}\n </p>\n <mwc-textfield\n label=\"${get('plugins.add.name')}\"\n helper=\"${get('plugins.add.nameHelper')}\"\n required\n id=\"pluginNameInput\"\n ></mwc-textfield>\n <mwc-list id=\"pluginKindList\">\n <mwc-radio-list-item\n id=\"editor\"\n value=\"editor\"\n hasMeta\n selected\n left\n >\n ${get('plugins.editor')}\n <mwc-icon slot=\"meta\">\n ${pluginIcons['editor']}\n </mwc-icon>\n </mwc-radio-list-item>\n <mwc-radio-list-item value=\"menu\" hasMeta left>\n ${get('plugins.menu')}\n <mwc-icon slot=\"meta\">\n ${pluginIcons['menu']}\n </mwc-icon>\n </mwc-radio-list-item>\n <div id=\"menudetails\">\n <mwc-formfield\n id=\"enabledefault\"\n label=\"${get('plugins.requireDoc')}\"\n >\n <mwc-switch id=\"requireDoc\" checked></mwc-switch>\n </mwc-formfield>\n <mwc-select id=\"positionList\" value=\"middle\" fixedpositionList>\n ${Object.values(menuPosition).map(\n menutype =>\n html`<mwc-list-item value=\"${menutype}\"\n >${get('plugins.' + menutype)}</mwc-list-item\n >`\n )}\n </mwc-select>\n </div>\n <style>\n #menudetails {\n display: none;\n padding: 20px;\n padding-left: 50px;\n }\n #pluginKindList [value=\"menu\"][selected] ~ #menudetails {\n display: grid;\n }\n #enabledefault {\n padding-bottom: 20px;\n }\n #positionList {\n max-width: 250px;\n }\n </style>\n <mwc-radio-list-item id=\"validator\" value=\"validator\" hasMeta left>\n ${get('plugins.validator')}\n <mwc-icon slot=\"meta\">\n ${pluginIcons['validator']}\n </mwc-icon>\n </mwc-radio-list-item>\n </mwc-list>\n <mwc-textfield\n label=\"${get('plugins.add.src')}\"\n helper=\"${get('plugins.add.srcHelper')}\"\n placeholder=\"http://example.com/plugin.js\"\n type=\"url\"\n required\n id=\"pluginSrcInput\">\n </mwc-textfield>\n </div>\n <mwc-button\n slot=\"secondaryAction\"\n dialogAction=\"close\"\n label=\"${get('cancel')}\">\n </mwc-button>\n <mwc-button\n id=\"addButton\"\n slot=\"primaryAction\"\n icon=\"add\"\n label=\"${get('add')}\"\n trailingIcon\n @click=${() => this.handleAddPlugin()}>\n </mwc-button>\n </mwc-dialog>\n `;\n }\n\n static styles = css`\n\n mwc-dialog {\n --mdc-dialog-max-width: 98vw;\n }\n\n mwc-dialog > form {\n display: flex;\n flex-direction: column;\n }\n\n mwc-dialog > form > * {\n display: block;\n margin-top: 16px;\n }\n `\n\n public close(){\n this.dialog.close()\n }\n\n public show(){\n this.dialog.show()\n }\n\n get open(){\n return this.dialog.open\n }\n\n private handleAddPlugin() {\n\n if (\n !(\n this.pluginSrcInput.checkValidity() &&\n this.pluginNameInput.checkValidity() &&\n this.pluginKindList.selected &&\n this.requireDoc &&\n this.positionList.selected\n )\n )\n return;\n\n this.dispatchEvent(\n newAddExternalPluginEvent({\n src: this.pluginSrcInput.value,\n name: this.pluginNameInput.value,\n kind: <PluginKind>(<ListItem>this.pluginKindList.selected).value,\n requireDoc: this.requireDoc.checked,\n position: <MenuPosition>this.positionList.value,\n active: true,\n // this is an added plugin and will be remove by reset either way\n activeByDefault: false,\n })\n );\n\n this.requestUpdate();\n this.dialog.close();\n }\n\n}\n\n\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../../../src/addons/plugin-manager/plugin-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n customElement,\n html,\n LitElement,\n property,\n query,\n TemplateResult,\n css\n} from 'lit-element';\nimport { get } from 'lit-translate';\n\nimport type { ActionDetail } from '@material/mwc-list';\nimport type { MultiSelectedEvent } from '@material/mwc-list/mwc-list-foundation.js';\nimport type { Dialog } from '@material/mwc-dialog';\nimport '@material/mwc-dialog';\nimport '@material/mwc-list';\nimport type {List} from '@material/mwc-list';\n\nimport {\n newResetPluginsEvent,\n newSetPluginsEvent,\n pluginIcons\n} from '../../open-scd.js';\n\nimport {\n MenuPosition,\n Plugin,\n} from \"../../plugin.js\";\n\n@customElement('oscd-plugin-manager')\nexport class OscdPluginManager extends LitElement {\n\n /** The plugins to render the layout. */\n @property({ type: Array }) plugins: Plugin[] = [];\n @query('#plugin-manager-root') root!: Dialog\n @query('#pluginList') pluginList!: List\n\n render(): TemplateResult {\n return html`\n <mwc-dialog\n stacked\n id=\"plugin-manager-root\"\n heading=\"${get('plugins.heading')}\"\n >\n <mwc-list\n id=\"pluginList\"\n multi\n @selected=${(e: MultiSelectedEvent) => {\n const selectedPlugins = this.pluginList.items\n .filter((item, index) => e.detail.index.has(index))\n // @ts-expect-error: we add plugin to the list item\n .map(item => item.plugin) as Plugin[]\n\n this.dispatchEvent(newSetPluginsEvent(selectedPlugins))\n }}\n >\n <mwc-list-item graphic=\"avatar\" noninteractive>\n <strong>${get(`plugins.editor`)}</strong>\n <mwc-icon slot=\"graphic\" class=\"inverted\">\n ${pluginIcons['editor']}\n </mwc-icon>\n </mwc-list-item>\n\n <li divider role=\"separator\"></li>\n\n ${this.generateEditorListItems()}\n\n <mwc-list-item graphic=\"avatar\" noninteractive>\n <strong>${get(`plugins.menu`)}</strong>\n <mwc-icon slot=\"graphic\" class=\"inverted\">\n <strong>${pluginIcons['menu']}</strong></mwc-icon>\n </mwc-list-item>\n <li divider role=\"separator\"></li>\n\n ${this.generateMenuListItems('top')}\n\n <li divider role=\"separator\" inset></li>\n\n ${this.generateValidatorListItems()}\n\n <li divider role=\"separator\" inset></li>\n\n ${this.generateMenuListItems('middle')}\n\n <li divider role=\"separator\" inset></li>\n\n ${this.generateMenuListItems('bottom')}\n\n </mwc-list>\n <mwc-button\n slot=\"secondaryAction\"\n icon=\"refresh\"\n label=\"${get('reset')}\"\n @click=${async () => {\n this.dispatchEvent(newResetPluginsEvent());\n this.requestUpdate();\n }}\n style=\"--mdc-theme-primary: var(--mdc-theme-error)\"\n >\n </mwc-button>\n <mwc-button\n slot=\"secondaryAction\"\n icon=\"\"\n label=\"${get('close')}\"\n dialogAction=\"close\">\n </mwc-button>\n <mwc-button\n outlined\n trailingIcon\n slot=\"primaryAction\"\n icon=\"library_add\"\n label=\"${get('plugins.add.heading')}&hellip;\"\n @click=${() => this.dispatchOpenCustomPluginDialogEvent()}>\n </mwc-button>\n </mwc-dialog>\n `;\n }\n\n static styles = css`\n mwc-dialog {\n --mdc-dialog-max-width: 98vw;\n }\n `\n\n public show(){\n this.root.show()\n }\n\n\n private generateEditorListItems(): TemplateResult[] {\n return this.plugins\n .filter(p => p.kind === 'editor')\n .map(this.renderPluginListItem)\n }\n\n private generateMenuListItems(position: MenuPosition): TemplateResult[] {\n return this.plugins\n .filter(p => p.kind === 'menu' && p.position === position)\n .map(this.renderPluginListItem)\n }\n\n private generateValidatorListItems(): TemplateResult[] {\n return this.plugins\n .filter(p => p.kind === 'validator')\n .map(this.renderPluginListItem)\n }\n\n private dispatchOpenCustomPluginDialogEvent(): void {\n const event = new CustomEvent('open-plugin-download', {\n bubbles: true,\n composed: true,\n });\n\n this.dispatchEvent(event);\n }\n\n private renderPluginListItem(plugin?: Plugin): TemplateResult {\n if(!plugin){ return html`` }\n\n return html`\n <mwc-check-list-item\n class=\"${plugin.official ? 'official' : 'external'}\"\n value=\"${plugin.src}\"\n .plugin=${plugin}\n ?selected=${plugin.active}\n @request-selected=${(e: CustomEvent<{source: string}>) => {\n if(e.detail.source !== 'interaction'){\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n return false;\n }\n }}\n hasMeta\n left\n >\n <mwc-icon slot=\"meta\">\n ${plugin.icon || pluginIcons[plugin.kind as keyof typeof pluginIcons]}\n </mwc-icon>\n ${plugin.name}\n </mwc-check-list-item>\n\n `;\n }\n\n}\n"]}
@@ -63,6 +63,8 @@ let FilteredList = class FilteredList extends ListBase {
63
63
  .forEach(item => (item.selected = select));
64
64
  }
65
65
  onFilterInput() {
66
+ if (!this.searchField)
67
+ return;
66
68
  Array.from(this.querySelectorAll('mwc-list-item, mwc-check-list-item, mwc-radio-list-item')).forEach(item => hideFiltered(item, this.searchField.value));
67
69
  }
68
70
  onListItemConnected(e) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filtered-list.js","sourceRoot":"","sources":["../../src/filtered-list.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n customElement,\n html,\n property,\n query,\n state,\n TemplateResult,\n unsafeCSS,\n} from 'lit-element';\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-checkbox';\nimport '@material/mwc-formfield';\nimport '@material/mwc-textfield';\nimport { CheckListItem } from '@material/mwc-list/mwc-check-list-item';\nimport { List } from '@material/mwc-list';\nimport { ListBase } from '@material/mwc-list/mwc-list-base';\nimport { ListItemBase } from '@material/mwc-list/mwc-list-item-base';\nimport { TextField } from '@material/mwc-textfield';\n\nfunction slotItem(item: Element): Element {\n if (!item.closest('filtered-list') || !item.parentElement) return item;\n if (item.parentElement instanceof FilteredList) return item;\n return slotItem(item.parentElement);\n}\n\nfunction hideFiltered(item: ListItemBase, searchText: string): void {\n const itemInnerText = item.innerText + '\\n';\n const childInnerText = Array.from(item.children)\n .map(child => (<HTMLElement>child).innerText)\n .join('\\n');\n const value = item.value;\n\n const filterTarget: string = (\n itemInnerText +\n childInnerText +\n value\n ).toUpperCase();\n\n const terms: string[] = searchText\n .toUpperCase()\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .trim()\n .split(/\\s+/g);\n\n (terms.length === 1 && terms[0] === '') ||\n terms.every(term => {\n // regexp escape\n const reTerm = new RegExp(\n `*${term}*`.replace(/\\*/g, '.*').replace(/\\?/g, '.{1}'),\n 'i'\n );\n return reTerm.test(filterTarget);\n })\n ? slotItem(item).classList.remove('hidden')\n : slotItem(item).classList.add('hidden');\n}\n\n/**\n * A mwc-list with mwc-textfield that filters the list items for given or separated terms\n */\n@customElement('filtered-list')\nexport class FilteredList extends ListBase {\n /** search mwc-textfield label property */\n @property({ type: String })\n searchFieldLabel?: string;\n /** Whether the check all option (checkbox next to search text field) is activated */\n @property({ type: Boolean })\n disableCheckAll = false;\n\n @state()\n private get existCheckListItem(): boolean {\n return this.items.some(item => item instanceof CheckListItem);\n }\n\n @state()\n private get isAllSelected(): boolean {\n return this.items\n .filter(item => !item.disabled)\n .filter(item => item instanceof CheckListItem)\n .every(checkItem => checkItem.selected);\n }\n\n @state()\n private get isSomeSelected(): boolean {\n return this.items\n .filter(item => !item.disabled)\n .filter(item => item instanceof CheckListItem)\n .some(checkItem => checkItem.selected);\n }\n\n @query('mwc-textfield') searchField!: TextField;\n\n private onCheckAll(): void {\n const select = !this.isAllSelected;\n this.items\n .filter(item => !item.disabled && !item.classList.contains('hidden'))\n .forEach(item => (item.selected = select));\n }\n\n onFilterInput(): void {\n if (!this.searchField) return;\n Array.from(\n this.querySelectorAll(\n 'mwc-list-item, mwc-check-list-item, mwc-radio-list-item'\n )\n ).forEach(item =>\n hideFiltered(item as ListItemBase, this.searchField.value)\n );\n }\n\n protected onListItemConnected(e: CustomEvent): void {\n super.onListItemConnected(e);\n this.requestUpdate();\n }\n\n protected update(\n changedProperties: Map<string | number | symbol, unknown>\n ): void {\n super.update(changedProperties);\n // regenerate filtering of text\n this.onFilterInput();\n }\n\n constructor() {\n super();\n this.addEventListener('selected', () => {\n this.requestUpdate();\n });\n }\n\n private renderCheckAll(): TemplateResult {\n return this.existCheckListItem && !this.disableCheckAll\n ? html`<mwc-formfield class=\"checkall\"\n ><mwc-checkbox\n ?indeterminate=${!this.isAllSelected && this.isSomeSelected}\n ?checked=${this.isAllSelected}\n @change=${() => {\n this.onCheckAll();\n }}\n ></mwc-checkbox\n ></mwc-formfield>`\n : html``;\n }\n\n render(): TemplateResult {\n return html`<div id=\"tfcontainer\">\n <abbr title=\"${this.searchFieldLabel ?? get('filter')}\"\n ><mwc-textfield\n label=\"${this.searchFieldLabel ?? ''}\"\n iconTrailing=\"search\"\n outlined\n @input=${() => this.onFilterInput()}\n ></mwc-textfield\n ></abbr>\n ${this.renderCheckAll()}\n </div>\n ${super.render()}`;\n }\n\n static styles = css`\n ${unsafeCSS(List.styles)}\n\n #tfcontainer {\n display: flex;\n flex: auto;\n }\n\n ::slotted(.hidden) {\n display: none;\n }\n\n abbr {\n display: flex;\n flex: auto;\n margin: 8px;\n text-decoration: none;\n border-bottom: none;\n }\n\n mwc-textfield {\n width: 100%;\n --mdc-shape-small: 28px;\n }\n\n mwc-formfield.checkall {\n padding-right: 8px;\n }\n\n .mdc-list {\n padding-inline-start: 0px;\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finder-list.js","sourceRoot":"","sources":["../../src/finder-list.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n customElement,\n html,\n LitElement,\n property,\n query,\n TemplateResult,\n} from 'lit-element';\nimport { until } from 'lit-html/directives/until';\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-icon';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport { List } from '@material/mwc-list';\nimport { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation';\nimport { ListItem } from '@material/mwc-list/mwc-list-item';\n\nimport './filtered-list.js';\nimport { depth } from './foundation.js';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nexport type Selection = { [name: string]: Selection };\n\nexport type Path = string[];\nexport interface Directory {\n path: Path;\n header?: TemplateResult;\n entries: string[];\n}\n\nconst waitingList = html`<div class=\"column\">\n <mwc-list\n ><mwc-list-item noninteractive hasMeta\n >${get('loading')}<mwc-icon slot=\"meta\">pending</mwc-icon></mwc-list-item\n ></mwc-list\n >\n</div>`;\n\n@customElement('finder-list')\nexport class FinderList extends LitElement {\n @property({ type: Object })\n selection: Selection = {};\n\n @property({ type: Boolean })\n multi = false;\n\n @property({ type: Number })\n get depth(): number {\n return depth(this.selection);\n }\n\n @property({ type: Array })\n get paths(): Path[] {\n return this.getPaths();\n }\n set paths(paths: Path[]) {\n const selection: Selection = {};\n for (const path of paths) {\n let i = selection;\n for (const name of path) {\n if (!Object.prototype.hasOwnProperty.call(i, name)) i[name] = {};\n i = i[name];\n }\n }\n this.selection = selection;\n }\n\n @property({ type: Array })\n get path(): Path {\n return this.paths[0] ?? [];\n }\n set path(path: Path) {\n this.paths = [path];\n }\n\n @property({ attribute: false })\n read: (path: Path) => Promise<Directory> = async path => {\n return {\n path,\n header: html`<h2>${'/' + path.join('/')}</h2>`,\n entries: [],\n };\n };\n\n @property({ attribute: false })\n loaded: Promise<void> = Promise.resolve();\n\n getTitle(path: string[]): string {\n return path.join('/');\n }\n\n getDisplayString(entry: string, path: string[]): string {\n return entry;\n }\n\n @query('div')\n container!: Element;\n\n private getPaths(depth?: number): Path[] {\n let paths: Path[] = Object.keys(this.selection).map(key => [key]);\n\n let i = depth ?? this.depth - 1;\n while (i-- > 0) {\n paths = paths.flatMap(path => {\n let dir = this.selection;\n for (const entry of path) dir = dir[entry]; // recursive descent\n const newPaths = Object.keys(dir).map(entry => path.concat(entry));\n return newPaths.length === 0 ? [path] : newPaths;\n });\n }\n\n return depth === undefined\n ? paths\n : paths.filter(path => path.length > depth);\n }\n\n multiSelect(event: SingleSelectedEvent, path: Path, clicked: string): void {\n let dir = this.selection;\n for (const entry of path) dir = dir[entry]; // recursive descent\n\n if (dir && dir[clicked]) delete dir[clicked];\n // deselect if selected\n else dir[clicked] = {}; // select otherwise\n }\n\n singleSelect(event: SingleSelectedEvent, path: Path, clicked: string): void {\n if (this.path[path.length] === clicked) this.path = path;\n // deselect if selected\n else this.path = path.concat(clicked); // select otherwise\n }\n\n async select(event: SingleSelectedEvent, path: Path): Promise<void> {\n const clicked = (<ListItem>(<List>event.target).selected).value;\n\n if (this.multi) this.multiSelect(event, path, clicked);\n else this.singleSelect(event, path, clicked);\n\n this.requestUpdate();\n await this.updateComplete;\n await new Promise(resolve => setTimeout(resolve, 250));\n this.container.scrollLeft = 1000 * this.depth;\n }\n\n renderDirectory(path: Path, entries: string[]): TemplateResult {\n return html`<filtered-list\n @selected=${(e: SingleSelectedEvent) => this.select(e, path)}\n searchFieldLabel=\"${this.getTitle(path)}\"\n >\n ${entries.map(\n entry =>\n html`<mwc-list-item\n value=\"${entry}\"\n ?activated=${this.getPaths(path.length)\n .map(p => JSON.stringify(p))\n .includes(JSON.stringify(path.concat(entry)))}\n >${this.getDisplayString(entry, path)}</mwc-list-item\n >`\n )}\n </filtered-list>`;\n }\n\n async renderColumn(column: number): Promise<TemplateResult> {\n const paths = this.getPaths(column);\n\n const dirs = paths.map(path => this.read(path));\n const lists: TemplateResult[] = [];\n\n for await (const { header, entries, path } of dirs) {\n if (header || entries.length > 0)\n lists.push(\n html`${ifDefined(header)} ${this.renderDirectory(path, entries)}`\n );\n }\n\n if (lists.length === 0) return html``;\n return html`<div class=\"column\">${lists}</div>`;\n }\n\n render(): TemplateResult {\n const columns = new Array(this.depth)\n .fill(0)\n .map((_, index) => this.renderColumn(index));\n this.loaded = Promise.allSettled(columns).then();\n return html`<div class=\"pane\">\n ${columns.map(column => until(column, waitingList))}\n </div>`;\n }\n\n static styles = css`\n div.pane {\n display: flex;\n flex-direction: row;\n overflow: auto;\n }\n\n h2 {\n color: var(--mdc-theme-primary);\n }\n\n section {\n display: flex;\n flex-direction: column;\n width: max-content;\n }\n\n section > mwc-list {\n margin-top: 76px;\n }\n\n a {\n font-weight: 600;\n font-variant: small-caps;\n text-transform: lowercase;\n text-decoration: none;\n color: var(--mdc-theme-primary);\n }\n\n a:link {\n color: var(--mdc-theme-error);\n }\n\n a:visited {\n color: var(--mdc-theme-secondary);\n }\n `;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/foundation/compare.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit-element';\nimport { repeat } from 'lit-html/directives/repeat';\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-icon';\n\nimport { identity } from '../foundation.js';\nimport { SVGTemplateResult } from 'lit-html';\n\nimport { attributeIcon, contentIcon, elementIcon } from '../icons/compare.js';\n\nconst diffTypeToIcon: Map<DiffType, SVGTemplateResult> = new Map<\n DiffType,\n SVGTemplateResult\n>();\n\ndiffTypeToIcon.set('Attribute', attributeIcon);\ndiffTypeToIcon.set('Content', contentIcon);\ndiffTypeToIcon.set('Element', elementIcon);\n\nexport type DiffType = 'Element' | 'Attribute' | 'Content';\n\nexport type Diff<T> =\n | { type: DiffType; oldValue: T; newValue: null }\n | { type: DiffType; oldValue: null; newValue: T }\n | { type: DiffType; oldValue: T; newValue: T };\n\n/**\n * Type to filter out a difference based on `tagName`.`attributeName`\n *\n * The matcher can be a boolean or a `consumer` that returns a boolean\n */\nexport interface DiffFilter<T> {\n [selector: string]: DiffFilterSelector<T>;\n}\n\ninterface DiffFilterSelector<T> {\n full?: DiffFilterConsumer<T>;\n attributes?: {\n [name: string]: DiffFilterConsumer<T>;\n };\n}\n\n/**\n * Consumer to match if a diff should be filtered out.\n */\ntype DiffFilterConsumer<T> = boolean | ((value: T | null) => boolean);\n\nfunction getDiffFilterSelector(\n elementToBeCompared: Element,\n rootElementToBeCompared: Element,\n filters: DiffFilter<Element>\n): DiffFilterSelector<Element> | undefined {\n const querySelector: string | undefined =\n rootElementToBeCompared === elementToBeCompared\n ? ':scope'\n : Object.keys(filters).find(selector =>\n Array.from(\n rootElementToBeCompared.querySelectorAll(selector)\n ).includes(elementToBeCompared)\n );\n\n return querySelector ? filters[querySelector!] : undefined;\n}\n\nfunction shouldFilterElement(\n element: Element,\n filter: DiffFilterSelector<Element> | undefined\n): boolean {\n if (!filter || !filter.full) {\n return false;\n }\n const consumer: DiffFilterConsumer<Element> = filter!.full!;\n\n return typeof consumer === 'boolean' ? consumer : consumer(element);\n}\n\nfunction shouldFilterAttribute(\n element: Element,\n attribute: string,\n filter: DiffFilterSelector<Element> | undefined\n): boolean {\n if (!filter || !filter.attributes || !filter.attributes![attribute]) {\n return false;\n }\n const consumer: DiffFilterConsumer<Element> = filter!.attributes![attribute];\n\n return typeof consumer === 'boolean' ? consumer : consumer(element);\n}\n\n/**\n * Returns the description of the Element that differs.\n *\n * @param element - The Element to retrieve the identifier from.\n */\nfunction describe(element: Element): string {\n const id = identity(element);\n return typeof id === 'string' ? id : get('unidentifiable');\n}\n\n/**\n * Check if there are any attribute values changed between the two elements.\n *\n * @param elementToBeCompared - The element to check for differences.\n * @param elementToCompareAgainst - The element used to check against.\n */\nexport function diffSclAttributes(\n elementToBeCompared: Element,\n elementToCompareAgainst: Element,\n filterToIgnore: DiffFilter<Element>,\n searchElementToBeCompared: Element\n): [string, Diff<string>][] {\n const attrDiffs: [string, Diff<string>][] = [];\n\n // First check if there is any text inside the element and there should be no child elements.\n const newText = elementToBeCompared.textContent?.trim() ?? '';\n const oldText = elementToCompareAgainst.textContent?.trim() ?? '';\n if (\n elementToBeCompared.childElementCount === 0 &&\n elementToCompareAgainst.childElementCount === 0 &&\n newText !== oldText\n ) {\n const shouldFilter: boolean = shouldFilterElement(\n elementToBeCompared,\n getDiffFilterSelector(\n elementToBeCompared,\n searchElementToBeCompared,\n filterToIgnore\n )\n );\n\n if (!shouldFilter) {\n attrDiffs.push([\n 'value',\n { type: 'Content', newValue: newText, oldValue: oldText },\n ]);\n }\n }\n\n // Next check if there are any difference between attributes.\n const attributeNames = new Set(\n elementToCompareAgainst\n .getAttributeNames()\n .concat(elementToBeCompared.getAttributeNames())\n );\n for (const name of attributeNames) {\n const shouldFilter: boolean = shouldFilterAttribute(\n elementToBeCompared,\n name,\n getDiffFilterSelector(\n elementToBeCompared,\n searchElementToBeCompared,\n filterToIgnore\n )\n );\n if (\n !shouldFilter &&\n elementToCompareAgainst.getAttribute(name) !==\n elementToBeCompared.getAttribute(name)\n ) {\n attrDiffs.push([\n name,\n <Diff<string>>{\n type: 'Attribute',\n newValue: elementToBeCompared.getAttribute(name),\n oldValue: elementToCompareAgainst.getAttribute(name),\n },\n ]);\n }\n }\n return attrDiffs;\n}\n\n/**\n * Function to retrieve the identity to compare 2 children on the same level.\n * This means we only need to last part of the Identity string to compare the children.\n *\n * @param element - The element to retrieve the identity from.\n */\nexport function identityForCompare(element: Element): string | number {\n let identityOfElement = identity(element);\n if (typeof identityOfElement === 'string') {\n identityOfElement = identityOfElement.split('>').pop() ?? '';\n }\n return identityOfElement;\n}\n\n/**\n * Custom method for comparing to check if 2 elements are the same. Because they are on the same level\n * we don't need to compare the full identity, we just compare the part of the Element itself.\n *\n * <b>Remark</b>Private elements are already filtered out, so we don't need to bother them.\n *\n * @param newValue - The new element to compare with the old element.\n * @param oldValue - The old element to which the new element is compared.\n */\nexport function isSame(newValue: Element, oldValue: Element): boolean {\n return (\n newValue.tagName === oldValue.tagName &&\n identityForCompare(newValue) === identityForCompare(oldValue)\n );\n}\n\n/**\n * List of all differences between children elements that both old and new element have.\n * The list contains children both elements have and children that were added or removed\n * from the new element.\n * <b>Remark</b>: Private elements are ignored.\n *\n * @param elementToBeCompared - The element to check for differences.\n * @param elementToCompareAgainst - The element used to check against.\n */\nexport function diffSclChilds(\n elementToBeCompared: Element,\n elementToCompareAgainst: Element,\n filterToIgnore: DiffFilter<Element>,\n searchElementToBeCompared: Element,\n searchElementToCompareAgainst: Element\n): Diff<Element>[] {\n const childDiffs: Diff<Element>[] = [];\n const childrenToBeCompared = Array.from(elementToBeCompared.children);\n const childrenToCompareTo = Array.from(elementToCompareAgainst.children);\n\n childrenToBeCompared.forEach(newElement => {\n if (!newElement.closest('Private')) {\n const shouldFilter: boolean = shouldFilterElement(\n newElement,\n getDiffFilterSelector(\n newElement,\n searchElementToBeCompared,\n filterToIgnore\n )\n );\n if (!shouldFilter) {\n const twinIndex = childrenToCompareTo.findIndex(ourChild =>\n isSame(newElement, ourChild)\n );\n const oldElement =\n twinIndex > -1 ? childrenToCompareTo[twinIndex] : null;\n\n if (oldElement) {\n childrenToCompareTo.splice(twinIndex, 1);\n childDiffs.push({\n type: 'Element',\n newValue: newElement,\n oldValue: oldElement,\n });\n } else {\n childDiffs.push({\n type: 'Element',\n newValue: newElement,\n oldValue: null,\n });\n }\n }\n }\n });\n childrenToCompareTo.forEach(oldElement => {\n if (!oldElement.closest('Private')) {\n const shouldFilter: boolean = shouldFilterElement(\n oldElement,\n getDiffFilterSelector(\n oldElement,\n searchElementToCompareAgainst,\n filterToIgnore\n )\n );\n if (!shouldFilter) {\n childDiffs.push({\n type: 'Element',\n newValue: null,\n oldValue: oldElement,\n });\n }\n }\n });\n return childDiffs;\n}\n\n/**\n * Generate HTML (TemplateResult) containing all the differences between the two elements passed.\n * If null is returned there are no differences between the two elements.\n *\n * @param elementToBeCompared - The element to check for differences.\n * @param elementToCompareAgainst - The element used to check against.\n */\nexport function renderDiff(\n elementToBeCompared: Element,\n elementToCompareAgainst: Element,\n filterToIgnore: DiffFilter<Element> = {}\n): TemplateResult | null {\n return renderDiffInternal(\n elementToBeCompared,\n elementToCompareAgainst,\n filterToIgnore,\n elementToBeCompared,\n elementToCompareAgainst\n );\n}\n\nfunction renderDiffInternal(\n elementToBeCompared: Element,\n elementToCompareAgainst: Element,\n filterToIgnore: DiffFilter<Element> = {},\n searchElementToBeCompared: Element,\n searchElementToCompareAgainst: Element\n): TemplateResult | null {\n // Determine the ID from the current tag. These can be numbers or strings.\n let idTitle: string | undefined = identity(elementToBeCompared).toString();\n if (idTitle === 'NaN') {\n idTitle = undefined;\n }\n\n // Set the root elements if they are not defined yet\n searchElementToBeCompared = searchElementToBeCompared || elementToBeCompared;\n searchElementToCompareAgainst =\n searchElementToCompareAgainst || elementToCompareAgainst;\n\n const attrDiffs: [string, Diff<string>][] = diffSclAttributes(\n elementToBeCompared,\n elementToCompareAgainst,\n filterToIgnore,\n searchElementToBeCompared\n );\n\n // Next check which elements are added, deleted or in both elements.\n const childDiffs: Diff<Element>[] = diffSclChilds(\n elementToBeCompared,\n elementToCompareAgainst,\n filterToIgnore,\n searchElementToBeCompared,\n searchElementToCompareAgainst\n );\n\n const childAddedOrDeleted: Diff<Element>[] = [];\n const childToCompare: Diff<Element>[] = [];\n childDiffs.forEach(diff => {\n if (!diff.oldValue || !diff.newValue) {\n childAddedOrDeleted.push(diff);\n } else {\n childToCompare.push(diff);\n }\n });\n\n // These children exist in both old and new element, let's check if there are any difference in the children.\n const childToCompareTemplates = childToCompare\n .map(diff => renderDiff(diff.newValue!, diff.oldValue!, filterToIgnore))\n .filter(result => result !== null);\n\n // If there are difference generate the HTML otherwise just return null.\n if (\n childToCompareTemplates.length > 0 ||\n attrDiffs.length > 0 ||\n childAddedOrDeleted.length > 0\n ) {\n return html` ${attrDiffs.length > 0 || childAddedOrDeleted.length > 0\n ? html`<div class=\"container container--alt\">\n <div class=\"list__container list__container--left\">\n <mwc-list multi right nonInteractive>\n ${repeat(\n attrDiffs,\n e => e,\n ([name, diff]) =>\n html`<mwc-list-item right twoLine graphic=\"icon\">\n ${diff.oldValue !== null\n ? html`\n <span>\n ${name}:\n ${diff.oldValue === '' ? '\"\"' : diff.oldValue}\n </span>\n <span slot=\"secondary\">${idTitle}</span>\n <mwc-icon slot=\"graphic\">\n ${diffTypeToIcon.get(diff.type)}\n </mwc-icon>\n `\n : ''}\n </mwc-list-item>`\n )}\n ${repeat(\n childAddedOrDeleted,\n e => e,\n diff =>\n html` <mwc-list-item right twoLine graphic=\"icon\">\n ${diff.oldValue\n ? html`\n <span>${diff.oldValue.tagName}</span>\n <span slot=\"secondary\">\n ${describe(diff.oldValue!)}\n </span>\n <mwc-icon slot=\"graphic\">\n ${diffTypeToIcon.get(diff.type)}\n </mwc-icon>\n `\n : ''}\n </mwc-list-item>`\n )}\n </mwc-list>\n </div>\n <div class=\"list__container\">\n <mwc-list multi left nonInteractive>\n ${repeat(\n attrDiffs,\n e => e,\n ([name, diff]) =>\n html` <mwc-list-item left twoLine graphic=\"icon\">\n ${diff.newValue !== null\n ? html`\n <span>\n ${name}:\n ${diff.newValue === '' ? '\"\"' : diff.newValue}\n </span>\n <span slot=\"secondary\">${idTitle}</span>\n <mwc-icon slot=\"graphic\">\n ${diffTypeToIcon.get(diff.type)}\n </mwc-icon>\n `\n : ''}\n </mwc-list-item>`\n )}\n ${repeat(\n childAddedOrDeleted,\n e => e,\n diff =>\n html` <mwc-list-item left twoLine graphic=\"icon\">\n ${diff.newValue\n ? html`\n <span>${diff.newValue.tagName}</span>\n <span slot=\"secondary\">\n ${describe(diff.newValue!)}\n </span>\n <mwc-icon slot=\"graphic\">\n ${diffTypeToIcon.get(diff.type)}\n </mwc-icon>\n `\n : ''}\n </mwc-list-item>`\n )}\n </mwc-list>\n </div>\n </div>`\n : ''}\n ${childToCompareTemplates}`;\n }\n return null;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dai.js","sourceRoot":"","sources":["../../../src/foundation/dai.ts"],"names":[],"mappings":"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","sourcesContent":["import { SCL_NAMESPACE } from '../schemas.js';\n\n/**\n * Determine which part of the Template Structure still needs to be initialized.\n * With the first call the parent will normally be the LN(0) Element to start from.\n * It will use the list to pop the first element and look if there is a DOI/SDI/DAI\n * Element available with the same name.\n *\n * @param parentElement - The element to search from for a DOI/SDI/DAI\n * @param templateStructure - The templates structure with DO/DA/BDA Elements.\n * @returns The last element initialized element or LN(0) if nothing is initialized. This Element can be used to\n * add the new element to. And the list of Template Elements that still need to be initialized.\n */\nexport function determineUninitializedStructure(\n parentElement: Element,\n templateStructure: Element[]\n): [Element, Element[]] {\n const templateElement = templateStructure.shift();\n if (templateStructure.length > 0) {\n // If there are still Template Elements we didn't reach the DAI Element, so continue checking if any DOI/SDI\n // Element is found with the same name.\n let instanceElement: Element | null;\n // DO Elements are initialized as DOI, others as SDI.\n if (templateElement!.tagName === 'DO') {\n instanceElement = parentElement.querySelector(\n `DOI[name=\"${templateElement!.getAttribute('name')}\"]`\n );\n } else {\n instanceElement = parentElement.querySelector(\n `SDI[name=\"${templateElement!.getAttribute('name')}\"]`\n );\n }\n\n if (instanceElement) {\n // If instance element found we will search one level lower again.\n // So the parent will become the instance element and the list is 1 smaller.\n return determineUninitializedStructure(\n instanceElement,\n templateStructure\n );\n } else {\n // No instance element found, so the element and all other elements still need to be\n // initialized and returned.\n templateStructure.unshift(templateElement!);\n return [parentElement, templateStructure];\n }\n } else {\n // The last template element in the list, so this should be the DA Element that only needs\n // to be initialized.\n return [parentElement, [templateElement!]];\n }\n}\n\n/**\n * Create a new instance structure defined by the array of template elements passed.\n *\n * @param uninitializedTemplateStructure - The Array of Template Elements for which new instance elements need to be\n * created.\n * @returns The Element created from the last Template Element in the Array.\n */\nexport function initializeElements(\n uninitializedTemplateStructure: Element[]\n): Element {\n const element = uninitializedTemplateStructure.shift();\n if (uninitializedTemplateStructure.length > 0) {\n // If there are more template elements left this will become a DOI or SDI Element.\n let newElement;\n // Depending on the level create a DOI or SDI Element.\n if (element!.tagName === 'DO') {\n newElement = element!.ownerDocument.createElementNS(SCL_NAMESPACE, 'DOI');\n } else {\n newElement = element!.ownerDocument.createElementNS(SCL_NAMESPACE, 'SDI');\n }\n newElement.setAttribute('name', element?.getAttribute('name') ?? '');\n\n // Create an element from the next one (last) from the shortened array.\n const childElement = initializeElements(uninitializedTemplateStructure);\n newElement.append(childElement);\n\n return newElement;\n } else {\n // Create Val Element\n const newValElement = element!.ownerDocument.createElementNS(\n SCL_NAMESPACE,\n 'Val'\n );\n const valElement = element!.querySelector('Val');\n if (valElement) {\n newValElement.textContent = valElement.textContent;\n }\n\n // Create DAI Element\n const daiElement = element!.ownerDocument.createElementNS(\n SCL_NAMESPACE,\n 'DAI'\n );\n daiElement.setAttribute('name', element?.getAttribute('name') ?? '');\n daiElement.append(newValElement);\n return daiElement;\n }\n}\n\n/**\n * Use the path configuration of a Common Data Class to search for all DO/SDO/DA/BDA Elements to create\n * a structure for which DOI/SDI/DAI Elements should be created later. Null will be returned when an invalid\n * Template Structure is described by the path.\n *\n * @param lnElement - The LN Element to use for searching the starting DO Element.\n * @param path - The (S)DO/(B)DA Elements to find in the template structure.\n * @returns List of Elements starting with the DO Element followed by one or more SDO or (B)DA Elements describing the structure.\n */\nexport function createTemplateStructure(\n lnElement: Element,\n path: string[]\n): Element[] | null {\n let templateStructure: Element[] | null = [];\n\n const doc = lnElement.ownerDocument;\n const lnType = lnElement.getAttribute('lnType') ?? '';\n let typeElement = doc.querySelector(`LNodeType[id=\"${lnType}\"]`);\n path.forEach(name => {\n // There should be a DOType or DAType set for the current element in the list.\n if (!typeElement) {\n templateStructure = null;\n return;\n }\n const dataElement = typeElement.querySelector(\n `:scope > DO[name=\"${name}\"], :scope > SDO[name=\"${name}\"], :scope > DA[name=\"${name}\"], :scope > BDA[name=\"${name}\"]`\n );\n // If there is no (S)DO/(B)DA Element found the structure is incorrect, so just stop.\n if (dataElement === null) {\n templateStructure = null;\n return;\n }\n templateStructure!.push(dataElement);\n\n if (dataElement.tagName === 'DO' || dataElement.tagName === 'SDO') {\n const type = dataElement.getAttribute('type') ?? '';\n typeElement = doc.querySelector(\n `DataTypeTemplates > DOType[id=\"${type}\"]`\n );\n } else {\n const bType = dataElement.getAttribute('bType') ?? '';\n if (bType === 'Struct') {\n const type = dataElement.getAttribute('type') ?? '';\n typeElement = doc.querySelector(\n `DataTypeTemplates > DAType[id=\"${type}\"]`\n );\n } else {\n typeElement = null;\n }\n }\n });\n return templateStructure;\n}\n"]}