@compas-oscd/open-scd 0.34.0 → 0.34.1

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 (233) hide show
  1. package/dist/WizardDivider.js +37 -0
  2. package/dist/WizardDivider.js.map +1 -0
  3. package/dist/Wizarding.js +38 -0
  4. package/dist/Wizarding.js.map +1 -0
  5. package/dist/action-icon.js +220 -0
  6. package/dist/action-icon.js.map +1 -0
  7. package/dist/action-pane.js +176 -0
  8. package/dist/action-pane.js.map +1 -0
  9. package/dist/addons/Editor.js +106 -0
  10. package/dist/addons/Editor.js.map +1 -0
  11. package/dist/addons/History.js +490 -0
  12. package/dist/addons/History.js.map +1 -0
  13. package/dist/addons/Layout.js +619 -0
  14. package/dist/addons/Layout.js.map +1 -0
  15. package/dist/addons/Settings.js +465 -0
  16. package/dist/addons/Settings.js.map +1 -0
  17. package/dist/addons/Waiter.js +45 -0
  18. package/dist/addons/Waiter.js.map +1 -0
  19. package/dist/addons/Wizards.js +48 -0
  20. package/dist/addons/Wizards.js.map +1 -0
  21. package/dist/addons/editor/edit-action-to-v1-converter.js +96 -0
  22. package/dist/addons/editor/edit-action-to-v1-converter.js.map +1 -0
  23. package/dist/addons/editor/edit-v1-to-v2-converter.js +37 -0
  24. package/dist/addons/editor/edit-v1-to-v2-converter.js.map +1 -0
  25. package/dist/addons/history/get-log-text.js +26 -0
  26. package/dist/addons/history/get-log-text.js.map +1 -0
  27. package/dist/addons/menu-tabs/menu-tabs.js +74 -0
  28. package/dist/addons/menu-tabs/menu-tabs.js.map +1 -0
  29. package/dist/addons/plugin-manager/custom-plugin-dialog.js +177 -0
  30. package/dist/addons/plugin-manager/custom-plugin-dialog.js.map +1 -0
  31. package/dist/addons/plugin-manager/plugin-manager.js +165 -0
  32. package/dist/addons/plugin-manager/plugin-manager.js.map +1 -0
  33. package/dist/core/api/api.js +7 -0
  34. package/dist/core/api/api.js.map +1 -0
  35. package/dist/core/api/editor/subject.js +22 -0
  36. package/dist/core/api/editor/subject.js.map +1 -0
  37. package/dist/core/api/editor/xml-editor.js +82 -0
  38. package/dist/core/api/editor/xml-editor.js.map +1 -0
  39. package/dist/core/api/plugin-state-api.js +27 -0
  40. package/dist/core/api/plugin-state-api.js.map +1 -0
  41. package/dist/core/foundation/cyrb64.js +26 -0
  42. package/dist/core/foundation/cyrb64.js.map +1 -0
  43. package/dist/core/foundation/deprecated/edit-event.js +44 -0
  44. package/dist/core/foundation/deprecated/edit-event.js.map +1 -0
  45. package/dist/core/foundation/deprecated/editor.js +94 -0
  46. package/dist/core/foundation/deprecated/editor.js.map +1 -0
  47. package/dist/core/foundation/deprecated/history.js +17 -0
  48. package/dist/core/foundation/deprecated/history.js.map +1 -0
  49. package/dist/core/foundation/deprecated/open-event.js +9 -0
  50. package/dist/core/foundation/deprecated/open-event.js.map +1 -0
  51. package/dist/core/foundation/deprecated/settings.js +19 -0
  52. package/dist/core/foundation/deprecated/settings.js.map +1 -0
  53. package/dist/core/foundation/deprecated/validation.js +8 -0
  54. package/dist/core/foundation/deprecated/validation.js.map +1 -0
  55. package/dist/core/foundation/deprecated/waiter.js +12 -0
  56. package/dist/core/foundation/deprecated/waiter.js.map +1 -0
  57. package/dist/core/foundation/edit-completed-event.js +11 -0
  58. package/dist/core/foundation/edit-completed-event.js.map +1 -0
  59. package/dist/core/foundation/edit-event.js +8 -0
  60. package/dist/core/foundation/edit-event.js.map +1 -0
  61. package/dist/core/foundation/edit.js +31 -0
  62. package/dist/core/foundation/edit.js.map +1 -0
  63. package/dist/core/foundation/handle-edit.js +151 -0
  64. package/dist/core/foundation/handle-edit.js.map +1 -0
  65. package/dist/core/foundation/open-event.js +8 -0
  66. package/dist/core/foundation/open-event.js.map +1 -0
  67. package/dist/core/foundation/plugin.js +2 -0
  68. package/dist/core/foundation/plugin.js.map +1 -0
  69. package/dist/core/foundation.js +14 -0
  70. package/dist/core/foundation.js.map +1 -0
  71. package/dist/core/locales.js +21 -0
  72. package/dist/core/locales.js.map +1 -0
  73. package/dist/filtered-list.js +168 -0
  74. package/dist/filtered-list.js.map +1 -0
  75. package/dist/finder-list.js +207 -0
  76. package/dist/finder-list.js.map +1 -0
  77. package/dist/foundation/compare.js +273 -0
  78. package/dist/foundation/compare.js.map +1 -0
  79. package/dist/foundation/dai.js +127 -0
  80. package/dist/foundation/dai.js.map +1 -0
  81. package/dist/foundation/generators.js +67 -0
  82. package/dist/foundation/generators.js.map +1 -0
  83. package/dist/foundation/ied.js +84 -0
  84. package/dist/foundation/ied.js.map +1 -0
  85. package/dist/foundation/nsd.js +13 -0
  86. package/dist/foundation/nsd.js.map +1 -0
  87. package/dist/foundation/nsdoc.js +180 -0
  88. package/dist/foundation/nsdoc.js.map +1 -0
  89. package/dist/foundation/scl.js +64 -0
  90. package/dist/foundation/scl.js.map +1 -0
  91. package/dist/foundation.js +1922 -0
  92. package/dist/foundation.js.map +1 -0
  93. package/dist/icons/compare.js +11 -0
  94. package/dist/icons/compare.js.map +1 -0
  95. package/dist/icons/icons.js +611 -0
  96. package/dist/icons/icons.js.map +1 -0
  97. package/dist/icons/ied-icons.js +11 -0
  98. package/dist/icons/ied-icons.js.map +1 -0
  99. package/dist/icons/lnode.js +50 -0
  100. package/dist/icons/lnode.js.map +1 -0
  101. package/dist/open-scd.js +483 -0
  102. package/dist/open-scd.js.map +1 -0
  103. package/dist/openscd/src/WizardDivider.js +37 -0
  104. package/dist/openscd/src/WizardDivider.js.map +1 -0
  105. package/dist/openscd/src/Wizarding.js +38 -0
  106. package/dist/openscd/src/Wizarding.js.map +1 -0
  107. package/dist/openscd/src/action-icon.js +220 -0
  108. package/dist/openscd/src/action-icon.js.map +1 -0
  109. package/dist/openscd/src/action-pane.js +176 -0
  110. package/dist/openscd/src/action-pane.js.map +1 -0
  111. package/dist/openscd/src/addons/Editor.js +106 -0
  112. package/dist/openscd/src/addons/Editor.js.map +1 -0
  113. package/dist/openscd/src/addons/History.js +490 -0
  114. package/dist/openscd/src/addons/History.js.map +1 -0
  115. package/dist/openscd/src/addons/Layout.js +619 -0
  116. package/dist/openscd/src/addons/Layout.js.map +1 -0
  117. package/dist/openscd/src/addons/Settings.js +465 -0
  118. package/dist/openscd/src/addons/Settings.js.map +1 -0
  119. package/dist/openscd/src/addons/Waiter.js +45 -0
  120. package/dist/openscd/src/addons/Waiter.js.map +1 -0
  121. package/dist/openscd/src/addons/Wizards.js +48 -0
  122. package/dist/openscd/src/addons/Wizards.js.map +1 -0
  123. package/dist/openscd/src/addons/editor/edit-action-to-v1-converter.js +96 -0
  124. package/dist/openscd/src/addons/editor/edit-action-to-v1-converter.js.map +1 -0
  125. package/dist/openscd/src/addons/editor/edit-v1-to-v2-converter.js +37 -0
  126. package/dist/openscd/src/addons/editor/edit-v1-to-v2-converter.js.map +1 -0
  127. package/dist/openscd/src/addons/history/get-log-text.js +26 -0
  128. package/dist/openscd/src/addons/history/get-log-text.js.map +1 -0
  129. package/dist/openscd/src/addons/menu-tabs/menu-tabs.js +74 -0
  130. package/dist/openscd/src/addons/menu-tabs/menu-tabs.js.map +1 -0
  131. package/dist/openscd/src/addons/plugin-manager/custom-plugin-dialog.js +177 -0
  132. package/dist/openscd/src/addons/plugin-manager/custom-plugin-dialog.js.map +1 -0
  133. package/dist/openscd/src/addons/plugin-manager/plugin-manager.js +165 -0
  134. package/dist/openscd/src/addons/plugin-manager/plugin-manager.js.map +1 -0
  135. package/dist/openscd/src/filtered-list.js +168 -0
  136. package/dist/openscd/src/filtered-list.js.map +1 -0
  137. package/dist/openscd/src/finder-list.js +207 -0
  138. package/dist/openscd/src/finder-list.js.map +1 -0
  139. package/dist/openscd/src/foundation/compare.js +273 -0
  140. package/dist/openscd/src/foundation/compare.js.map +1 -0
  141. package/dist/openscd/src/foundation/dai.js +127 -0
  142. package/dist/openscd/src/foundation/dai.js.map +1 -0
  143. package/dist/openscd/src/foundation/generators.js +67 -0
  144. package/dist/openscd/src/foundation/generators.js.map +1 -0
  145. package/dist/openscd/src/foundation/ied.js +84 -0
  146. package/dist/openscd/src/foundation/ied.js.map +1 -0
  147. package/dist/openscd/src/foundation/nsd.js +13 -0
  148. package/dist/openscd/src/foundation/nsd.js.map +1 -0
  149. package/dist/openscd/src/foundation/nsdoc.js +180 -0
  150. package/dist/openscd/src/foundation/nsdoc.js.map +1 -0
  151. package/dist/openscd/src/foundation/scl.js +64 -0
  152. package/dist/openscd/src/foundation/scl.js.map +1 -0
  153. package/dist/openscd/src/foundation.js +1922 -0
  154. package/dist/openscd/src/foundation.js.map +1 -0
  155. package/dist/openscd/src/icons/compare.js +11 -0
  156. package/dist/openscd/src/icons/compare.js.map +1 -0
  157. package/dist/openscd/src/icons/icons.js +611 -0
  158. package/dist/openscd/src/icons/icons.js.map +1 -0
  159. package/dist/openscd/src/icons/ied-icons.js +11 -0
  160. package/dist/openscd/src/icons/ied-icons.js.map +1 -0
  161. package/dist/openscd/src/icons/lnode.js +50 -0
  162. package/dist/openscd/src/icons/lnode.js.map +1 -0
  163. package/dist/openscd/src/open-scd.js +483 -0
  164. package/dist/openscd/src/open-scd.js.map +1 -0
  165. package/dist/openscd/src/oscd-filter-button.js +89 -0
  166. package/dist/openscd/src/oscd-filter-button.js.map +1 -0
  167. package/dist/openscd/src/plain-compare-list.js +132 -0
  168. package/dist/openscd/src/plain-compare-list.js.map +1 -0
  169. package/dist/openscd/src/plugin-tag.js +23 -0
  170. package/dist/openscd/src/plugin-tag.js.map +1 -0
  171. package/dist/openscd/src/plugin.events.js +12 -0
  172. package/dist/openscd/src/plugin.events.js.map +1 -0
  173. package/dist/openscd/src/plugin.js +2 -0
  174. package/dist/openscd/src/plugin.js.map +1 -0
  175. package/dist/openscd/src/plugins.js +256 -0
  176. package/dist/openscd/src/plugins.js.map +1 -0
  177. package/dist/openscd/src/schemas.js +9325 -0
  178. package/dist/openscd/src/schemas.js.map +1 -0
  179. package/dist/openscd/src/themes.js +122 -0
  180. package/dist/openscd/src/themes.js.map +1 -0
  181. package/dist/openscd/src/translations/de.js +954 -0
  182. package/dist/openscd/src/translations/de.js.map +1 -0
  183. package/dist/openscd/src/translations/en.js +950 -0
  184. package/dist/openscd/src/translations/en.js.map +1 -0
  185. package/dist/openscd/src/translations/loader.js +10 -0
  186. package/dist/openscd/src/translations/loader.js.map +1 -0
  187. package/dist/openscd/src/wizard-checkbox.js +152 -0
  188. package/dist/openscd/src/wizard-checkbox.js.map +1 -0
  189. package/dist/openscd/src/wizard-dialog.js +374 -0
  190. package/dist/openscd/src/wizard-dialog.js.map +1 -0
  191. package/dist/openscd/src/wizard-select.js +115 -0
  192. package/dist/openscd/src/wizard-select.js.map +1 -0
  193. package/dist/openscd/src/wizard-textfield.js +191 -0
  194. package/dist/openscd/src/wizard-textfield.js.map +1 -0
  195. package/dist/openscd/src/wizards.js +196 -0
  196. package/dist/openscd/src/wizards.js.map +1 -0
  197. package/dist/oscd-filter-button.js +89 -0
  198. package/dist/oscd-filter-button.js.map +1 -0
  199. package/dist/plain-compare-list.js +132 -0
  200. package/dist/plain-compare-list.js.map +1 -0
  201. package/dist/plugin-tag.js +23 -0
  202. package/dist/plugin-tag.js.map +1 -0
  203. package/dist/plugin.events.js +12 -0
  204. package/dist/plugin.events.js.map +1 -0
  205. package/dist/plugin.js +2 -0
  206. package/dist/plugin.js.map +1 -0
  207. package/dist/plugins.js +256 -0
  208. package/dist/plugins.js.map +1 -0
  209. package/dist/schemas.js +9325 -0
  210. package/dist/schemas.js.map +1 -0
  211. package/dist/themes.js +122 -0
  212. package/dist/themes.js.map +1 -0
  213. package/dist/translations/de.js +954 -0
  214. package/dist/translations/de.js.map +1 -0
  215. package/dist/translations/en.js +950 -0
  216. package/dist/translations/en.js.map +1 -0
  217. package/dist/translations/loader.js +10 -0
  218. package/dist/translations/loader.js.map +1 -0
  219. package/dist/wizard-checkbox.js +152 -0
  220. package/dist/wizard-checkbox.js.map +1 -0
  221. package/dist/wizard-dialog.js +374 -0
  222. package/dist/wizard-dialog.js.map +1 -0
  223. package/dist/wizard-select.js +115 -0
  224. package/dist/wizard-select.js.map +1 -0
  225. package/dist/wizard-textfield.js +191 -0
  226. package/dist/wizard-textfield.js.map +1 -0
  227. package/dist/wizards.js +196 -0
  228. package/dist/wizards.js.map +1 -0
  229. package/dist/xml/src/foundation.js +67 -0
  230. package/dist/xml/src/foundation.js.map +1 -0
  231. package/dist/xml/src/index.js +2 -0
  232. package/dist/xml/src/index.js.map +1 -0
  233. package/package.json +99 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../core/foundation/deprecated/validation.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,aAAqC;IAErC,OAAO,IAAI,WAAW,CAAO,UAAU,EAAE;QACvC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,aAAa;KACjB,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** Represents a request for validation. */\nexport type ValidateEvent = CustomEvent<void>;\nexport function newValidateEvent(\n eventInitDict?: CustomEventInit<void>\n): ValidateEvent {\n return new CustomEvent<void>('validate', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n });\n}\n\n\ndeclare global {\n interface ElementEventMap {\n ['validate']: ValidateEvent;\n }\n }\n "]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @deprecated
3
+ */
4
+ export function newPendingStateEvent(promise, eventInitDict) {
5
+ return new CustomEvent('pending-state', {
6
+ bubbles: true,
7
+ composed: true,
8
+ ...eventInitDict,
9
+ detail: { promise, ...eventInitDict?.detail },
10
+ });
11
+ }
12
+ //# sourceMappingURL=waiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waiter.js","sourceRoot":"","sources":["../../../../../core/foundation/deprecated/waiter.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAsB,EACtB,aAA4D;IAE5D,OAAO,IAAI,WAAW,CAAqB,eAAe,EAAE;QAC1D,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,aAAa;QAChB,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** Represents some work pending completion, upon which `promise` resolves. */\nexport interface PendingStateDetail {\n promise: Promise<void>;\n}\nexport type PendingStateEvent = CustomEvent<PendingStateDetail>;\n\n/**\n * @deprecated\n */\nexport function newPendingStateEvent(\n promise: Promise<void>,\n eventInitDict?: CustomEventInit<Partial<PendingStateDetail>>\n): PendingStateEvent {\n return new CustomEvent<PendingStateDetail>('pending-state', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: { promise, ...eventInitDict?.detail },\n });\n}\n\ndeclare global {\n interface ElementEventMap {\n ['pending-state']: PendingStateEvent;\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ export function newEditCompletedEvent(edit, initiator = 'user') {
2
+ return new CustomEvent('oscd-edit-completed', {
3
+ bubbles: true,
4
+ composed: true,
5
+ detail: {
6
+ edit: edit,
7
+ initiator: initiator,
8
+ },
9
+ });
10
+ }
11
+ //# sourceMappingURL=edit-completed-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-completed-event.js","sourceRoot":"","sources":["../../../../core/foundation/edit-completed-event.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,qBAAqB,CACnC,IAAyB,EACzB,YAAuB,MAAM;IAE7B,OAAO,IAAI,WAAW,CAAsB,qBAAqB,EAAE;QACjE,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,SAAS;SACrB;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { Edit, Initiator } from './deprecated/edit-event.js';\n\nimport { EditorAction } from './deprecated/editor.js';\n\nexport type EditCompletedDetail = {\n edit: Edit | EditorAction;\n initiator: Initiator;\n};\n\n/** Represents the intent to open `doc` with filename `docName`. */\nexport type EditCompletedEvent = CustomEvent<EditCompletedDetail>;\n\nexport function newEditCompletedEvent(\n edit: Edit | EditorAction,\n initiator: Initiator = 'user'\n): EditCompletedEvent {\n return new CustomEvent<EditCompletedDetail>('oscd-edit-completed', {\n bubbles: true,\n composed: true,\n detail: {\n edit: edit,\n initiator: initiator,\n },\n });\n}\n\ndeclare global {\n interface ElementEventMap {\n ['oscd-edit-completed']: EditCompletedEvent;\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export function newEditEventV2(edit, options) {
2
+ return new CustomEvent('oscd-edit-v2', {
3
+ composed: true,
4
+ bubbles: true,
5
+ detail: { ...options, edit },
6
+ });
7
+ }
8
+ //# sourceMappingURL=edit-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-event.js","sourceRoot":"","sources":["../../../../core/foundation/edit-event.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,cAAc,CAC5B,IAAO,EACP,OAA4B;IAE5B,OAAO,IAAI,WAAW,CAAkB,cAAc,EAAE;QACtD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { EditV2 } from './edit.js';\n\nexport type EditDetailV2<E extends EditV2 = EditV2> = EditEventOptionsV2 & {\n edit: E;\n};\n\nexport type EditEventV2<E extends EditV2 = EditV2> = CustomEvent<\n EditDetailV2<E>\n>;\n\ntype BaseEditEventOptionsV2 = {\n title?: string;\n squash?: boolean;\n}\n\nexport type EditEventOptionsV2 = BaseEditEventOptionsV2 & {\n createHistoryEntry?: boolean;\n};\n\nexport function newEditEventV2<E extends EditV2>(\n edit: E,\n options?: EditEventOptionsV2\n): EditEventV2<E> {\n return new CustomEvent<EditDetailV2<E>>('oscd-edit-v2', {\n composed: true,\n bubbles: true,\n detail: { ...options, edit },\n });\n}\n\ndeclare global {\n interface ElementEventMap {\n ['oscd-edit-v2']: EditEventV2;\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ export function isComplexV2(edit) {
2
+ return edit instanceof Array;
3
+ }
4
+ export function isSetTextContentV2(edit) {
5
+ return (edit.element !== undefined &&
6
+ edit.textContent !== undefined);
7
+ }
8
+ export function isRemoveV2(edit) {
9
+ return (edit.parent === undefined && edit.node !== undefined);
10
+ }
11
+ export function isSetAttributesV2(edit) {
12
+ return (edit.element !== undefined &&
13
+ edit.attributes !== undefined &&
14
+ edit.attributesNS !== undefined);
15
+ }
16
+ export function isInsertV2(edit) {
17
+ return (edit.parent !== undefined &&
18
+ edit.node !== undefined &&
19
+ edit.reference !== undefined);
20
+ }
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ export function isEditV2(edit) {
23
+ if (isComplexV2(edit)) {
24
+ return !edit.some((e) => !isEditV2(e));
25
+ }
26
+ return (isSetAttributesV2(edit) ||
27
+ isSetTextContentV2(edit) ||
28
+ isInsertV2(edit) ||
29
+ isRemoveV2(edit));
30
+ }
31
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../../core/foundation/edit.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,YAAY,KAAK,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,CACJ,IAAyB,CAAC,OAAO,KAAK,SAAS;QAC/C,IAAyB,CAAC,WAAW,KAAK,SAAS,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,CACJ,IAAiB,CAAC,MAAM,KAAK,SAAS,IAAK,IAAiB,CAAC,IAAI,KAAK,SAAS,CACjF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,CACJ,IAAwB,CAAC,OAAO,KAAK,SAAS;QAC9C,IAAwB,CAAC,UAAU,KAAK,SAAS;QACjD,IAAwB,CAAC,YAAY,KAAK,SAAS,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,CACJ,IAAiB,CAAC,MAAM,KAAK,SAAS;QACtC,IAAiB,CAAC,IAAI,KAAK,SAAS;QACpC,IAAiB,CAAC,SAAS,KAAK,SAAS,CAC3C,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,QAAQ,CAAC,IAAS;IAChC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KACxC;IAED,OAAO,CACL,iBAAiB,CAAC,IAAI,CAAC;QACvB,kBAAkB,CAAC,IAAI,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,CACjB,CAAC;AACJ,CAAC","sourcesContent":["/** Intent to `parent.insertBefore(node, reference)` */\nexport type InsertV2 = {\n parent: Node;\n node: Node;\n reference: Node | null;\n};\n\n/** Intent to remove a `node` from its `ownerDocument` */\nexport type RemoveV2 = {\n node: Node;\n};\n\n/** Intent to set the `textContent` of `element` */\nexport type SetTextContentV2 = {\n element: Element;\n textContent: string;\n};\n\n/** Intent to set or remove (if `null`) `attributes`(-`NS`) on `element` */\nexport type SetAttributesV2 = {\n element: Element;\n attributes: Partial<Record<string, string | null>>;\n attributesNS: Partial<Record<string, Partial<Record<string, string | null>>>>;\n};\n\n/** Intent to change some XMLDocuments */\nexport type EditV2 =\n | InsertV2\n | SetAttributesV2\n | SetTextContentV2\n | RemoveV2\n | EditV2[];\n\nexport function isComplexV2(edit: EditV2): edit is EditV2[] {\n return edit instanceof Array;\n}\n\nexport function isSetTextContentV2(edit: EditV2): edit is SetTextContentV2 {\n return (\n (edit as SetTextContentV2).element !== undefined &&\n (edit as SetTextContentV2).textContent !== undefined\n );\n}\n\nexport function isRemoveV2(edit: EditV2): edit is RemoveV2 {\n return (\n (edit as InsertV2).parent === undefined && (edit as RemoveV2).node !== undefined\n );\n}\n\nexport function isSetAttributesV2(edit: EditV2): edit is SetAttributesV2 {\n return (\n (edit as SetAttributesV2).element !== undefined &&\n (edit as SetAttributesV2).attributes !== undefined &&\n (edit as SetAttributesV2).attributesNS !== undefined\n );\n}\n\nexport function isInsertV2(edit: EditV2): edit is InsertV2 {\n return (\n (edit as InsertV2).parent !== undefined &&\n (edit as InsertV2).node !== undefined &&\n (edit as InsertV2).reference !== undefined\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isEditV2(edit: any): edit is EditV2 {\n if (isComplexV2(edit)) {\n return !edit.some((e) => !isEditV2(e));\n }\n \n return (\n isSetAttributesV2(edit) ||\n isSetTextContentV2(edit) ||\n isInsertV2(edit) ||\n isRemoveV2(edit)\n );\n}\n"]}
@@ -0,0 +1,151 @@
1
+ import { isComplexV2, isInsertV2, isRemoveV2, isSetAttributesV2, isSetTextContentV2, } from './edit.js';
2
+ function handleSetTextContent({ element, textContent, }) {
3
+ const { childNodes } = element;
4
+ const restoreChildNodes = Array.from(childNodes).map((node) => ({
5
+ parent: element,
6
+ node,
7
+ reference: null,
8
+ }));
9
+ element.textContent = textContent;
10
+ const undoTextContent = { element, textContent: '' };
11
+ return [undoTextContent, ...restoreChildNodes];
12
+ }
13
+ function uniqueNSPrefix(element, ns) {
14
+ let i = 1;
15
+ const attributes = Array.from(element.attributes);
16
+ const hasSamePrefix = (attribute) => attribute.prefix === `ens${i}` && attribute.namespaceURI !== ns;
17
+ const nsOrNull = new Set([null, ns]);
18
+ const differentNamespace = (prefix) => !nsOrNull.has(element.lookupNamespaceURI(prefix));
19
+ while (differentNamespace(`ens${i}`) || attributes.find(hasSamePrefix))
20
+ i += 1;
21
+ return `ens${i}`;
22
+ }
23
+ const xmlAttributeName = /^(?!xml|Xml|xMl|xmL|XMl|xML|XmL|XML)[A-Za-z_][A-Za-z0-9-_.]*(:[A-Za-z_][A-Za-z0-9-_.]*)?$/;
24
+ function validName(name) {
25
+ return xmlAttributeName.test(name);
26
+ }
27
+ function handleSetAttributes({ element, attributes, attributesNS, }) {
28
+ const oldAttributes = { ...attributes };
29
+ const oldAttributesNS = { ...attributesNS };
30
+ // save element's non-prefixed attributes for undo
31
+ Object.keys(attributes)
32
+ .reverse()
33
+ .forEach((name) => {
34
+ oldAttributes[name] = element.getAttribute(name);
35
+ });
36
+ // change element's non-prefixed attributes
37
+ for (const entry of Object.entries(attributes)) {
38
+ try {
39
+ const [name, value] = entry;
40
+ if (value === null)
41
+ element.removeAttribute(name);
42
+ else
43
+ element.setAttribute(name, value);
44
+ }
45
+ catch (_e) {
46
+ // undo nothing if update didn't work on this attribute
47
+ delete oldAttributes[entry[0]];
48
+ }
49
+ }
50
+ // save element's namespaced attributes for undo
51
+ Object.entries(attributesNS).forEach(([ns, attrs]) => {
52
+ Object.keys(attrs)
53
+ .filter(validName)
54
+ .reverse()
55
+ .forEach((name) => {
56
+ oldAttributesNS[ns] = {
57
+ ...oldAttributesNS[ns],
58
+ [name]: element.getAttributeNS(ns, name.split(':').pop()),
59
+ };
60
+ });
61
+ Object.keys(attrs)
62
+ .filter((name) => !validName(name))
63
+ .forEach((name) => {
64
+ delete oldAttributesNS[ns][name];
65
+ });
66
+ });
67
+ // change element's namespaced attributes
68
+ for (const nsEntry of Object.entries(attributesNS)) {
69
+ const [ns, attrs] = nsEntry;
70
+ for (const entry of Object.entries(attrs).filter(([name]) => validName(name))) {
71
+ try {
72
+ const [name, value] = entry;
73
+ if (value === null) {
74
+ element.removeAttributeNS(ns, name.split(':').pop());
75
+ }
76
+ else {
77
+ let qualifiedName = name;
78
+ if (!qualifiedName.includes(':')) {
79
+ let prefix = element.lookupPrefix(ns);
80
+ if (!prefix)
81
+ prefix = uniqueNSPrefix(element, ns);
82
+ qualifiedName = `${prefix}:${name}`;
83
+ }
84
+ element.setAttributeNS(ns, qualifiedName, value);
85
+ }
86
+ }
87
+ catch (_e) {
88
+ delete oldAttributesNS[ns][entry[0]];
89
+ }
90
+ }
91
+ }
92
+ return {
93
+ element,
94
+ attributes: oldAttributes,
95
+ attributesNS: oldAttributesNS,
96
+ };
97
+ }
98
+ function handleRemove({ node }) {
99
+ const { parentNode: parent, nextSibling: reference } = node;
100
+ node.parentNode?.removeChild(node);
101
+ if (parent)
102
+ return {
103
+ node,
104
+ parent,
105
+ reference,
106
+ };
107
+ return [];
108
+ }
109
+ function handleInsert({ parent, node, reference, }) {
110
+ try {
111
+ const { parentNode, nextSibling } = node;
112
+ /**
113
+ * This is a workaround for converted edit api v1 events,
114
+ * because if multiple edits are converted, they are converted before the changes from the previous edits are applied to the document
115
+ * so if you first remove an element and then add a clone with changed attributes, the reference will be the element to remove since it hasnt been removed yet
116
+ */
117
+ if (!parent.contains(reference)) {
118
+ reference = null;
119
+ }
120
+ parent.insertBefore(node, reference);
121
+ if (parentNode) {
122
+ // undo: move child node back to original place
123
+ return {
124
+ node,
125
+ parent: parentNode,
126
+ reference: nextSibling,
127
+ };
128
+ }
129
+ // undo: remove orphaned node
130
+ return { node };
131
+ }
132
+ catch (_e) {
133
+ // undo nothing if insert doesn't work on these nodes
134
+ return [];
135
+ }
136
+ }
137
+ /** Applies an Edit, returning the corresponding 'undo' Edit. */
138
+ export function handleEditV2(edit) {
139
+ if (isInsertV2(edit))
140
+ return handleInsert(edit);
141
+ if (isRemoveV2(edit))
142
+ return handleRemove(edit);
143
+ if (isSetAttributesV2(edit))
144
+ return handleSetAttributes(edit);
145
+ if (isSetTextContentV2(edit))
146
+ return handleSetTextContent(edit);
147
+ if (isComplexV2(edit))
148
+ return edit.map((edit) => handleEditV2(edit)).reverse();
149
+ return [];
150
+ }
151
+ //# sourceMappingURL=handle-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-edit.js","sourceRoot":"","sources":["../../../../core/foundation/handle-edit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EditV2,\n InsertV2,\n isComplexV2,\n isInsertV2,\n isRemoveV2,\n isSetAttributesV2,\n isSetTextContentV2,\n RemoveV2,\n SetAttributesV2,\n SetTextContentV2,\n} from './edit.js';\n\nfunction handleSetTextContent({\n element,\n textContent,\n}: SetTextContentV2): (SetTextContentV2 | InsertV2)[] {\n const { childNodes } = element;\n \n const restoreChildNodes: InsertV2[] = Array.from(childNodes).map((node) => ({\n parent: element,\n node,\n reference: null,\n }));\n \n element.textContent = textContent;\n \n const undoTextContent: SetTextContentV2 = { element, textContent: '' };\n \n return [undoTextContent, ...restoreChildNodes];\n}\n\nfunction uniqueNSPrefix(element: Element, ns: string): string {\n let i = 1;\n const attributes = Array.from(element.attributes);\n const hasSamePrefix = (attribute: Attr) =>\n attribute.prefix === `ens${i}` && attribute.namespaceURI !== ns;\n const nsOrNull = new Set([null, ns]);\n const differentNamespace = (prefix: string) =>\n !nsOrNull.has(element.lookupNamespaceURI(prefix));\n while (differentNamespace(`ens${i}`) || attributes.find(hasSamePrefix))\n i += 1;\n return `ens${i}`;\n}\n\nconst xmlAttributeName = /^(?!xml|Xml|xMl|xmL|XMl|xML|XmL|XML)[A-Za-z_][A-Za-z0-9-_.]*(:[A-Za-z_][A-Za-z0-9-_.]*)?$/;\n\nfunction validName(name: string): boolean {\n return xmlAttributeName.test(name);\n}\n\nfunction handleSetAttributes({\n element,\n attributes,\n attributesNS,\n}: SetAttributesV2): SetAttributesV2 {\n const oldAttributes = { ...attributes };\n const oldAttributesNS = { ...attributesNS };\n \n // save element's non-prefixed attributes for undo\n Object.keys(attributes)\n .reverse()\n .forEach((name) => {\n oldAttributes[name] = element.getAttribute(name);\n });\n \n // change element's non-prefixed attributes\n for (const entry of Object.entries(attributes)) {\n try {\n const [name, value] = entry as [string, string | null];\n if (value === null) element.removeAttribute(name);\n else element.setAttribute(name, value);\n } catch (_e) {\n // undo nothing if update didn't work on this attribute\n delete oldAttributes[entry[0]];\n }\n }\n \n // save element's namespaced attributes for undo\n Object.entries(attributesNS).forEach(([ns, attrs]) => {\n Object.keys(attrs!)\n .filter(validName)\n .reverse()\n .forEach((name) => {\n oldAttributesNS[ns] = {\n ...oldAttributesNS[ns],\n [name]: element.getAttributeNS(ns, name.split(':').pop()!),\n };\n });\n Object.keys(attrs!)\n .filter((name) => !validName(name))\n .forEach((name) => {\n delete oldAttributesNS[ns]![name];\n });\n });\n \n // change element's namespaced attributes\n for (const nsEntry of Object.entries(attributesNS)) {\n const [ns, attrs] = nsEntry as [\n string,\n Partial<Record<string, string | null>>,\n ];\n for (const entry of Object.entries(attrs).filter(([name]) =>\n validName(name),\n )) {\n try {\n const [name, value] = entry as [string, string | null];\n if (value === null) {\n element.removeAttributeNS(ns, name.split(':').pop()!);\n } else {\n let qualifiedName = name;\n if (!qualifiedName.includes(':')) {\n let prefix = element.lookupPrefix(ns);\n if (!prefix) prefix = uniqueNSPrefix(element, ns);\n qualifiedName = `${prefix}:${name}`;\n }\n element.setAttributeNS(ns, qualifiedName, value);\n }\n } catch (_e) {\n delete oldAttributesNS[ns]![entry[0]];\n }\n }\n}\n\nreturn {\n element,\n attributes: oldAttributes,\n attributesNS: oldAttributesNS,\n};\n}\n\nfunction handleRemove({ node }: RemoveV2): InsertV2 | [] {\n const { parentNode: parent, nextSibling: reference } = node;\n node.parentNode?.removeChild(node);\n if (parent)\n return {\n node,\n parent,\n reference,\n };\n return [];\n}\n\nfunction handleInsert({\n parent,\n node,\n reference,\n}: InsertV2): InsertV2 | RemoveV2 | [] {\n try {\n const { parentNode, nextSibling } = node;\n\n /**\n * This is a workaround for converted edit api v1 events,\n * because if multiple edits are converted, they are converted before the changes from the previous edits are applied to the document\n * so if you first remove an element and then add a clone with changed attributes, the reference will be the element to remove since it hasnt been removed yet\n */\n if (!parent.contains(reference)) {\n reference = null;\n }\n\n parent.insertBefore(node, reference);\n\n if (parentNode) {\n // undo: move child node back to original place\n return {\n node,\n parent: parentNode,\n reference: nextSibling,\n };\n }\n\n // undo: remove orphaned node\n return { node };\n } catch (_e) {\n // undo nothing if insert doesn't work on these nodes\n return [];\n }\n}\n\n/** Applies an Edit, returning the corresponding 'undo' Edit. */\nexport function handleEditV2(edit: EditV2): EditV2 {\n if (isInsertV2(edit)) return handleInsert(edit);\n if (isRemoveV2(edit)) return handleRemove(edit);\n if (isSetAttributesV2(edit)) return handleSetAttributes(edit);\n if (isSetTextContentV2(edit)) return handleSetTextContent(edit);\n if (isComplexV2(edit)) return edit.map((edit) => handleEditV2(edit)).reverse();\n \n return [];\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export function newOpenEvent(doc, docName) {
2
+ return new CustomEvent('oscd-open', {
3
+ bubbles: true,
4
+ composed: true,
5
+ detail: { doc, docName },
6
+ });
7
+ }
8
+ //# sourceMappingURL=open-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-event.js","sourceRoot":"","sources":["../../../../core/foundation/open-event.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,OAAe;IAC5D,OAAO,IAAI,WAAW,CAAa,WAAW,EAAE;QAC9C,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["export type OpenDetail = {\n doc: XMLDocument;\n docName: string;\n};\n\n/** Represents the intent to open `doc` with filename `docName`. */\nexport type OpenEvent = CustomEvent<OpenDetail>;\n\nexport function newOpenEvent(doc: XMLDocument, docName: string): OpenEvent {\n return new CustomEvent<OpenDetail>('oscd-open', {\n bubbles: true,\n composed: true,\n detail: { doc, docName },\n });\n}\n\ndeclare global {\n interface ElementEventMap {\n ['oscd-open']: OpenEvent;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export const menuPosition = ['top', 'middle', 'bottom'];
2
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../../core/foundation/plugin.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC","sourcesContent":["import { targetLocales } from '../locales.js';\n\nexport type Plugin = {\n // name defines the name of the plugin\n name: string;\n // src defines the path to the plugins source file\n src: string;\n // kind defines the type of the plugin\n kind: PluginKind;\n // activeByDefault configures if the plugin should be active by default\n // this is will be user when users resets the plugins\n activeByDefault: boolean;\n // icon stores the icon name of the Material Icon\n icon?: string;\n // active shows if the plugin currently is active\n active?: boolean;\n // requireDoc shows if the plugin requires a document to be loaded\n requireDoc?: boolean;\n // position defines the position of menu plugins\n position?: MenuPosition\n translations?: Record<(typeof targetLocales)[number], string>;\n};\n\nexport type PluginSet = { menu: Plugin[]; editor: Plugin[] };\nexport type PluginKind = 'editor' | 'menu' | 'validator';\nexport const menuPosition = ['top', 'middle', 'bottom'] as const;\nexport type MenuPosition = (typeof menuPosition)[number];\n\n"]}
@@ -0,0 +1,14 @@
1
+ export { newOpenEvent } from './foundation/open-event.js';
2
+ export { newEditEvent, isComplex, isInsert, isNamespaced, isUpdate, isRemove, } from './foundation/deprecated/edit-event.js';
3
+ export { isEditV2, isRemoveV2, isInsertV2, isComplexV2, isSetAttributesV2, isSetTextContentV2 } from './foundation/edit.js';
4
+ export { newEditEventV2 } from './foundation/edit-event.js';
5
+ export { handleEditV2 } from './foundation/handle-edit.js';
6
+ export { cyrb64 } from './foundation/cyrb64.js';
7
+ export { newEditCompletedEvent } from './foundation/edit-completed-event.js';
8
+ /** @returns the cartesian product of `arrays` */
9
+ export function crossProduct(...arrays) {
10
+ return arrays.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())), [[]]);
11
+ }
12
+ export { OscdApi } from './api/api.js';
13
+ export { XMLEditor } from './api/editor/xml-editor.js';
14
+ //# sourceMappingURL=foundation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation.js","sourceRoot":"","sources":["../../../core/foundation.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EACL,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,MAAM,uCAAuC,CAAC;AAkB/C,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAIhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAO7E,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAI,GAAG,MAAa;IAC9C,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1D,CAAC,EAAE,CAAC,CACL,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC","sourcesContent":["import { LitElement } from 'lit';\n\n/** Constructor type for defining `LitElement` mixins. */\nexport type LitElementConstructor = new (...args: any[]) => LitElement;\n\nexport { newOpenEvent } from './foundation/open-event.js';\nexport type { OpenEvent, OpenDetail } from './foundation/open-event.js';\n\nexport {\n newEditEvent,\n isComplex,\n isInsert,\n isNamespaced,\n isUpdate,\n isRemove,\n} from './foundation/deprecated/edit-event.js';\nexport type {\n EditEvent,\n Edit,\n Insert,\n AttributeValue,\n NamespacedAttributeValue,\n Update,\n Remove,\n} from './foundation/deprecated/edit-event.js';\n\nexport type {\n EditV2,\n InsertV2,\n RemoveV2,\n SetTextContentV2,\n SetAttributesV2,\n} from './foundation/edit.js';\nexport {\n isEditV2,\n isRemoveV2,\n isInsertV2,\n isComplexV2,\n isSetAttributesV2,\n isSetTextContentV2\n} from './foundation/edit.js';\nexport type {\n EditEventV2,\n EditEventOptionsV2,\n EditDetailV2\n} from './foundation/edit-event.js';\nexport { newEditEventV2 } from './foundation/edit-event.js';\n\nexport { handleEditV2 } from './foundation/handle-edit.js';\n\nexport { cyrb64 } from './foundation/cyrb64.js';\n\nexport type { Plugin, PluginSet } from './foundation/plugin.js';\n\nexport { newEditCompletedEvent } from './foundation/edit-completed-event.js';\n\nexport type {\n EditCompletedEvent,\n EditCompletedDetail,\n} from './foundation/edit-completed-event.js';\n\n/** @returns the cartesian product of `arrays` */\nexport function crossProduct<T>(...arrays: T[][]): T[][] {\n return arrays.reduce<T[][]>(\n (a, b) => <T[][]>a.flatMap(d => b.map(e => [d, e].flat())),\n [[]]\n );\n}\n\nexport { OscdApi } from './api/api.js';\n\nexport { XMLEditor } from './api/editor/xml-editor.js';\n"]}
@@ -0,0 +1,21 @@
1
+ // Do not modify this file by hand!
2
+ // Re-generate this file by running lit-localize.
3
+ /**
4
+ * The locale code that templates in this source code are written in.
5
+ */
6
+ export const sourceLocale = `en`;
7
+ /**
8
+ * The other locale codes that this application is localized into. Sorted
9
+ * lexicographically.
10
+ */
11
+ export const targetLocales = [
12
+ `de`,
13
+ ];
14
+ /**
15
+ * All valid project locale codes. Sorted lexicographically.
16
+ */
17
+ export const allLocales = [
18
+ `de`,
19
+ `en`,
20
+ ];
21
+ //# sourceMappingURL=locales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../core/locales.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,iDAAiD;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI;CACI,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI;IACJ,IAAI;CACI,CAAC","sourcesContent":["// Do not modify this file by hand!\n// Re-generate this file by running lit-localize.\n\n/**\n * The locale code that templates in this source code are written in.\n */\nexport const sourceLocale = `en`;\n\n/**\n * The other locale codes that this application is localized into. Sorted\n * lexicographically.\n */\nexport const targetLocales = [\n `de`,\n] as const;\n\n/**\n * All valid project locale codes. Sorted lexicographically.\n */\nexport const allLocales = [\n `de`,\n `en`,\n] as const;\n"]}
@@ -0,0 +1,168 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, customElement, html, property, query, state, unsafeCSS, } from 'lit-element';
3
+ import { get } from 'lit-translate';
4
+ import '@material/mwc-checkbox';
5
+ import '@material/mwc-formfield';
6
+ import '@material/mwc-textfield';
7
+ import { CheckListItem } from '@material/mwc-list/mwc-check-list-item';
8
+ import { List } from '@material/mwc-list';
9
+ import { ListBase } from '@material/mwc-list/mwc-list-base';
10
+ function slotItem(item) {
11
+ if (!item.closest('filtered-list') || !item.parentElement)
12
+ return item;
13
+ if (item.parentElement instanceof FilteredList)
14
+ return item;
15
+ return slotItem(item.parentElement);
16
+ }
17
+ function hideFiltered(item, searchText) {
18
+ const itemInnerText = item.innerText + '\n';
19
+ const childInnerText = Array.from(item.children)
20
+ .map(child => child.innerText)
21
+ .join('\n');
22
+ const value = item.value;
23
+ const filterTarget = (itemInnerText +
24
+ childInnerText +
25
+ value).toUpperCase();
26
+ const terms = searchText
27
+ .toUpperCase()
28
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
29
+ .trim()
30
+ .split(/\s+/g);
31
+ (terms.length === 1 && terms[0] === '') ||
32
+ terms.every(term => {
33
+ // regexp escape
34
+ const reTerm = new RegExp(`*${term}*`.replace(/\*/g, '.*').replace(/\?/g, '.{1}'), 'i');
35
+ return reTerm.test(filterTarget);
36
+ })
37
+ ? slotItem(item).classList.remove('hidden')
38
+ : slotItem(item).classList.add('hidden');
39
+ }
40
+ /**
41
+ * A mwc-list with mwc-textfield that filters the list items for given or separated terms
42
+ */
43
+ let FilteredList = class FilteredList extends ListBase {
44
+ get existCheckListItem() {
45
+ return this.items.some(item => item instanceof CheckListItem);
46
+ }
47
+ get isAllSelected() {
48
+ return this.items
49
+ .filter(item => !item.disabled)
50
+ .filter(item => item instanceof CheckListItem)
51
+ .every(checkItem => checkItem.selected);
52
+ }
53
+ get isSomeSelected() {
54
+ return this.items
55
+ .filter(item => !item.disabled)
56
+ .filter(item => item instanceof CheckListItem)
57
+ .some(checkItem => checkItem.selected);
58
+ }
59
+ onCheckAll() {
60
+ const select = !this.isAllSelected;
61
+ this.items
62
+ .filter(item => !item.disabled && !item.classList.contains('hidden'))
63
+ .forEach(item => (item.selected = select));
64
+ }
65
+ onFilterInput() {
66
+ Array.from(this.querySelectorAll('mwc-list-item, mwc-check-list-item, mwc-radio-list-item')).forEach(item => hideFiltered(item, this.searchField.value));
67
+ }
68
+ onListItemConnected(e) {
69
+ super.onListItemConnected(e);
70
+ this.requestUpdate();
71
+ }
72
+ update(changedProperties) {
73
+ super.update(changedProperties);
74
+ // regenerate filtering of text
75
+ this.onFilterInput();
76
+ }
77
+ constructor() {
78
+ super();
79
+ /** Whether the check all option (checkbox next to search text field) is activated */
80
+ this.disableCheckAll = false;
81
+ this.addEventListener('selected', () => {
82
+ this.requestUpdate();
83
+ });
84
+ }
85
+ renderCheckAll() {
86
+ return this.existCheckListItem && !this.disableCheckAll
87
+ ? html `<mwc-formfield class="checkall"
88
+ ><mwc-checkbox
89
+ ?indeterminate=${!this.isAllSelected && this.isSomeSelected}
90
+ ?checked=${this.isAllSelected}
91
+ @change=${() => {
92
+ this.onCheckAll();
93
+ }}
94
+ ></mwc-checkbox
95
+ ></mwc-formfield>`
96
+ : html ``;
97
+ }
98
+ render() {
99
+ return html `<div id="tfcontainer">
100
+ <abbr title="${this.searchFieldLabel ?? get('filter')}"
101
+ ><mwc-textfield
102
+ label="${this.searchFieldLabel ?? ''}"
103
+ iconTrailing="search"
104
+ outlined
105
+ @input=${() => this.onFilterInput()}
106
+ ></mwc-textfield
107
+ ></abbr>
108
+ ${this.renderCheckAll()}
109
+ </div>
110
+ ${super.render()}`;
111
+ }
112
+ };
113
+ FilteredList.styles = css `
114
+ ${unsafeCSS(List.styles)}
115
+
116
+ #tfcontainer {
117
+ display: flex;
118
+ flex: auto;
119
+ }
120
+
121
+ ::slotted(.hidden) {
122
+ display: none;
123
+ }
124
+
125
+ abbr {
126
+ display: flex;
127
+ flex: auto;
128
+ margin: 8px;
129
+ text-decoration: none;
130
+ border-bottom: none;
131
+ }
132
+
133
+ mwc-textfield {
134
+ width: 100%;
135
+ --mdc-shape-small: 28px;
136
+ }
137
+
138
+ mwc-formfield.checkall {
139
+ padding-right: 8px;
140
+ }
141
+
142
+ .mdc-list {
143
+ padding-inline-start: 0px;
144
+ }
145
+ `;
146
+ __decorate([
147
+ property({ type: String })
148
+ ], FilteredList.prototype, "searchFieldLabel", void 0);
149
+ __decorate([
150
+ property({ type: Boolean })
151
+ ], FilteredList.prototype, "disableCheckAll", void 0);
152
+ __decorate([
153
+ state()
154
+ ], FilteredList.prototype, "existCheckListItem", null);
155
+ __decorate([
156
+ state()
157
+ ], FilteredList.prototype, "isAllSelected", null);
158
+ __decorate([
159
+ state()
160
+ ], FilteredList.prototype, "isSomeSelected", null);
161
+ __decorate([
162
+ query('mwc-textfield')
163
+ ], FilteredList.prototype, "searchField", void 0);
164
+ FilteredList = __decorate([
165
+ customElement('filtered-list')
166
+ ], FilteredList);
167
+ export { FilteredList };
168
+ //# sourceMappingURL=filtered-list.js.map
@@ -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 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"]}