@compas-oscd/open-scd 0.34.2 → 0.34.3

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 (160) hide show
  1. package/dist/src/WizardDivider.d.ts +8 -0
  2. package/dist/src/WizardDivider.js +37 -0
  3. package/dist/src/WizardDivider.js.map +1 -0
  4. package/dist/src/Wizarding.d.ts +10 -0
  5. package/dist/src/Wizarding.js +38 -0
  6. package/dist/src/Wizarding.js.map +1 -0
  7. package/dist/src/action-icon.d.ts +25 -0
  8. package/dist/src/action-icon.js +220 -0
  9. package/dist/src/action-icon.js.map +1 -0
  10. package/dist/src/action-pane.d.ts +25 -0
  11. package/dist/src/action-pane.js +176 -0
  12. package/dist/src/action-pane.js.map +1 -0
  13. package/dist/src/addons/Editor.d.ts +25 -0
  14. package/dist/src/addons/Editor.js +106 -0
  15. package/dist/src/addons/Editor.js.map +1 -0
  16. package/dist/src/addons/History.d.ts +86 -0
  17. package/dist/src/addons/History.js +490 -0
  18. package/dist/src/addons/History.js.map +1 -0
  19. package/dist/src/addons/Layout.d.ts +96 -0
  20. package/dist/src/addons/Layout.js +619 -0
  21. package/dist/src/addons/Layout.js.map +1 -0
  22. package/dist/src/addons/Settings.d.ts +68 -0
  23. package/dist/src/addons/Settings.js +465 -0
  24. package/dist/src/addons/Settings.js.map +1 -0
  25. package/dist/src/addons/Waiter.d.ts +14 -0
  26. package/dist/src/addons/Waiter.js +45 -0
  27. package/dist/src/addons/Waiter.js.map +1 -0
  28. package/dist/src/addons/Wizards.d.ts +15 -0
  29. package/dist/src/addons/Wizards.js +48 -0
  30. package/dist/src/addons/Wizards.js.map +1 -0
  31. package/dist/src/addons/editor/edit-action-to-v1-converter.d.ts +3 -0
  32. package/dist/src/addons/editor/edit-action-to-v1-converter.js +96 -0
  33. package/dist/src/addons/editor/edit-action-to-v1-converter.js.map +1 -0
  34. package/dist/src/addons/editor/edit-v1-to-v2-converter.d.ts +2 -0
  35. package/dist/src/addons/editor/edit-v1-to-v2-converter.js +37 -0
  36. package/dist/src/addons/editor/edit-v1-to-v2-converter.js.map +1 -0
  37. package/dist/src/addons/history/get-log-text.d.ts +5 -0
  38. package/dist/src/addons/history/get-log-text.js +26 -0
  39. package/dist/src/addons/history/get-log-text.js.map +1 -0
  40. package/dist/src/addons/menu-tabs/menu-tabs.d.ts +22 -0
  41. package/dist/src/addons/menu-tabs/menu-tabs.js +74 -0
  42. package/dist/src/addons/menu-tabs/menu-tabs.js.map +1 -0
  43. package/dist/src/addons/plugin-manager/custom-plugin-dialog.d.ts +28 -0
  44. package/dist/src/addons/plugin-manager/custom-plugin-dialog.js +177 -0
  45. package/dist/src/addons/plugin-manager/custom-plugin-dialog.js.map +1 -0
  46. package/dist/src/addons/plugin-manager/plugin-manager.d.ts +20 -0
  47. package/dist/src/addons/plugin-manager/plugin-manager.js +165 -0
  48. package/dist/src/addons/plugin-manager/plugin-manager.js.map +1 -0
  49. package/dist/src/filtered-list.d.ts +27 -0
  50. package/dist/src/filtered-list.js +168 -0
  51. package/dist/src/filtered-list.js.map +1 -0
  52. package/dist/src/finder-list.d.ts +37 -0
  53. package/dist/src/finder-list.js +207 -0
  54. package/dist/src/finder-list.js.map +1 -0
  55. package/dist/src/foundation/compare.d.ts +79 -0
  56. package/dist/src/foundation/compare.js +273 -0
  57. package/dist/src/foundation/compare.js.map +1 -0
  58. package/dist/src/foundation/dai.d.ts +30 -0
  59. package/dist/src/foundation/dai.js +127 -0
  60. package/dist/src/foundation/dai.js.map +1 -0
  61. package/dist/src/foundation/generators.d.ts +13 -0
  62. package/dist/src/foundation/generators.js +67 -0
  63. package/dist/src/foundation/generators.js.map +1 -0
  64. package/dist/src/foundation/ied.d.ts +22 -0
  65. package/dist/src/foundation/ied.js +84 -0
  66. package/dist/src/foundation/ied.js.map +1 -0
  67. package/dist/src/foundation/nsd.d.ts +4 -0
  68. package/dist/src/foundation/nsd.js +13 -0
  69. package/dist/src/foundation/nsd.js.map +1 -0
  70. package/dist/src/foundation/nsdoc.d.ts +14 -0
  71. package/dist/src/foundation/nsdoc.js +180 -0
  72. package/dist/src/foundation/nsdoc.js.map +1 -0
  73. package/dist/src/foundation/scl.d.ts +1 -0
  74. package/dist/src/foundation/scl.js +64 -0
  75. package/dist/src/foundation/scl.js.map +1 -0
  76. package/dist/src/foundation.d.ts +230 -0
  77. package/dist/src/foundation.js +1922 -0
  78. package/dist/src/foundation.js.map +1 -0
  79. package/dist/src/icons/compare.d.ts +3 -0
  80. package/dist/src/icons/compare.js +11 -0
  81. package/dist/src/icons/compare.js.map +1 -0
  82. package/dist/src/icons/icons.d.ts +41 -0
  83. package/dist/src/icons/icons.js +611 -0
  84. package/dist/src/icons/icons.js.map +1 -0
  85. package/dist/src/icons/ied-icons.d.ts +3 -0
  86. package/dist/src/icons/ied-icons.js +11 -0
  87. package/dist/src/icons/ied-icons.js.map +1 -0
  88. package/dist/src/icons/lnode.d.ts +16 -0
  89. package/dist/src/icons/lnode.js +50 -0
  90. package/dist/src/icons/lnode.js.map +1 -0
  91. package/dist/src/open-scd.d.ts +131 -0
  92. package/dist/src/open-scd.js +483 -0
  93. package/dist/src/open-scd.js.map +1 -0
  94. package/dist/src/oscd-filter-button.d.ts +27 -0
  95. package/dist/src/oscd-filter-button.js +89 -0
  96. package/dist/src/oscd-filter-button.js.map +1 -0
  97. package/dist/src/plain-compare-list.d.ts +36 -0
  98. package/dist/src/plain-compare-list.js +132 -0
  99. package/dist/src/plain-compare-list.js.map +1 -0
  100. package/dist/src/plugin-tag.d.ts +6 -0
  101. package/dist/src/plugin-tag.js +23 -0
  102. package/dist/src/plugin-tag.js.map +1 -0
  103. package/dist/src/plugin.d.ts +23 -0
  104. package/dist/src/plugin.events.d.ts +15 -0
  105. package/dist/src/plugin.events.js +12 -0
  106. package/dist/src/plugin.events.js.map +1 -0
  107. package/dist/src/plugin.js +2 -0
  108. package/dist/src/plugin.js.map +1 -0
  109. package/dist/src/plugins.d.ts +3 -0
  110. package/dist/src/plugins.js +256 -0
  111. package/dist/src/plugins.js.map +1 -0
  112. package/dist/src/schemas.d.ts +58 -0
  113. package/dist/src/schemas.js +9325 -0
  114. package/dist/src/schemas.js.map +1 -0
  115. package/dist/src/themes.d.ts +3 -0
  116. package/dist/src/themes.js +122 -0
  117. package/dist/src/themes.js.map +1 -0
  118. package/dist/src/translations/de.d.ts +2 -0
  119. package/dist/src/translations/de.js +954 -0
  120. package/dist/src/translations/de.js.map +1 -0
  121. package/dist/src/translations/en.d.ts +963 -0
  122. package/dist/src/translations/en.js +950 -0
  123. package/dist/src/translations/en.js.map +1 -0
  124. package/dist/src/translations/loader.d.ts +12 -0
  125. package/dist/src/translations/loader.js +10 -0
  126. package/dist/src/translations/loader.js.map +1 -0
  127. package/dist/src/wizard-checkbox.d.ts +37 -0
  128. package/dist/src/wizard-checkbox.js +152 -0
  129. package/dist/src/wizard-checkbox.js.map +1 -0
  130. package/dist/src/wizard-dialog.d.ts +45 -0
  131. package/dist/src/wizard-dialog.js +374 -0
  132. package/dist/src/wizard-dialog.js.map +1 -0
  133. package/dist/src/wizard-select.d.ts +31 -0
  134. package/dist/src/wizard-select.js +115 -0
  135. package/dist/src/wizard-select.js.map +1 -0
  136. package/dist/src/wizard-textfield.d.ts +50 -0
  137. package/dist/src/wizard-textfield.js +191 -0
  138. package/dist/src/wizard-textfield.js.map +1 -0
  139. package/dist/src/wizards.d.ts +23 -0
  140. package/dist/src/wizards.js +196 -0
  141. package/dist/src/wizards.js.map +1 -0
  142. package/dist/test/foundation.d.ts +34 -0
  143. package/dist/test/foundation.js +55 -0
  144. package/dist/test/foundation.js.map +1 -0
  145. package/dist/test/mock-editor-logger.d.ts +16 -0
  146. package/dist/test/mock-editor-logger.js +53 -0
  147. package/dist/test/mock-editor-logger.js.map +1 -0
  148. package/dist/test/mock-edits.d.ts +7 -0
  149. package/dist/test/mock-edits.js +12 -0
  150. package/dist/test/mock-edits.js.map +1 -0
  151. package/dist/test/mock-open-scd.d.ts +22 -0
  152. package/dist/test/mock-open-scd.js +53 -0
  153. package/dist/test/mock-open-scd.js.map +1 -0
  154. package/dist/test/mock-plugins.d.ts +33 -0
  155. package/dist/test/mock-plugins.js +239 -0
  156. package/dist/test/mock-plugins.js.map +1 -0
  157. package/dist/test/mock-wizard-editor.d.ts +15 -0
  158. package/dist/test/mock-wizard-editor.js +50 -0
  159. package/dist/test/mock-wizard-editor.js.map +1 -0
  160. package/package.json +42 -22
@@ -0,0 +1,177 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement, html, LitElement, query, css, } from 'lit-element';
3
+ import { get } from 'lit-translate';
4
+ import { newAddExternalPluginEvent, pluginIcons } from '../../open-scd.js';
5
+ import { menuPosition } from "../../plugin.js";
6
+ import '@material/mwc-dialog';
7
+ import '@material/mwc-drawer';
8
+ import '@material/mwc-list';
9
+ import '@material/mwc-select';
10
+ import '@material/mwc-switch';
11
+ import '@material/mwc-textfield';
12
+ let OscdCustomPluginDialog = class OscdCustomPluginDialog extends LitElement {
13
+ render() {
14
+ return html `
15
+ <mwc-dialog id="dialog" heading="${get('plugins.add.heading')}">
16
+ <div style="display: flex; flex-direction: column; row-gap: 8px;">
17
+ <p style="color:var(--mdc-theme-error);">
18
+ ${get('plugins.add.warning')}
19
+ </p>
20
+ <mwc-textfield
21
+ label="${get('plugins.add.name')}"
22
+ helper="${get('plugins.add.nameHelper')}"
23
+ required
24
+ id="pluginNameInput"
25
+ ></mwc-textfield>
26
+ <mwc-list id="pluginKindList">
27
+ <mwc-radio-list-item
28
+ id="editor"
29
+ value="editor"
30
+ hasMeta
31
+ selected
32
+ left
33
+ >
34
+ ${get('plugins.editor')}
35
+ <mwc-icon slot="meta">
36
+ ${pluginIcons['editor']}
37
+ </mwc-icon>
38
+ </mwc-radio-list-item>
39
+ <mwc-radio-list-item value="menu" hasMeta left>
40
+ ${get('plugins.menu')}
41
+ <mwc-icon slot="meta">
42
+ ${pluginIcons['menu']}
43
+ </mwc-icon>
44
+ </mwc-radio-list-item>
45
+ <div id="menudetails">
46
+ <mwc-formfield
47
+ id="enabledefault"
48
+ label="${get('plugins.requireDoc')}"
49
+ >
50
+ <mwc-switch id="requireDoc" checked></mwc-switch>
51
+ </mwc-formfield>
52
+ <mwc-select id="positionList" value="middle" fixedpositionList>
53
+ ${Object.values(menuPosition).map(menutype => html `<mwc-list-item value="${menutype}"
54
+ >${get('plugins.' + menutype)}</mwc-list-item
55
+ >`)}
56
+ </mwc-select>
57
+ </div>
58
+ <style>
59
+ #menudetails {
60
+ display: none;
61
+ padding: 20px;
62
+ padding-left: 50px;
63
+ }
64
+ #pluginKindList [value="menu"][selected] ~ #menudetails {
65
+ display: grid;
66
+ }
67
+ #enabledefault {
68
+ padding-bottom: 20px;
69
+ }
70
+ #positionList {
71
+ max-width: 250px;
72
+ }
73
+ </style>
74
+ <mwc-radio-list-item id="validator" value="validator" hasMeta left>
75
+ ${get('plugins.validator')}
76
+ <mwc-icon slot="meta">
77
+ ${pluginIcons['validator']}
78
+ </mwc-icon>
79
+ </mwc-radio-list-item>
80
+ </mwc-list>
81
+ <mwc-textfield
82
+ label="${get('plugins.add.src')}"
83
+ helper="${get('plugins.add.srcHelper')}"
84
+ placeholder="http://example.com/plugin.js"
85
+ type="url"
86
+ required
87
+ id="pluginSrcInput">
88
+ </mwc-textfield>
89
+ </div>
90
+ <mwc-button
91
+ slot="secondaryAction"
92
+ dialogAction="close"
93
+ label="${get('cancel')}">
94
+ </mwc-button>
95
+ <mwc-button
96
+ id="addButton"
97
+ slot="primaryAction"
98
+ icon="add"
99
+ label="${get('add')}"
100
+ trailingIcon
101
+ @click=${() => this.handleAddPlugin()}>
102
+ </mwc-button>
103
+ </mwc-dialog>
104
+ `;
105
+ }
106
+ close() {
107
+ this.dialog.close();
108
+ }
109
+ show() {
110
+ this.dialog.show();
111
+ }
112
+ get open() {
113
+ return this.dialog.open;
114
+ }
115
+ handleAddPlugin() {
116
+ if (!(this.pluginSrcInput.checkValidity() &&
117
+ this.pluginNameInput.checkValidity() &&
118
+ this.pluginKindList.selected &&
119
+ this.requireDoc &&
120
+ this.positionList.selected))
121
+ return;
122
+ this.dispatchEvent(newAddExternalPluginEvent({
123
+ src: this.pluginSrcInput.value,
124
+ name: this.pluginNameInput.value,
125
+ kind: this.pluginKindList.selected.value,
126
+ requireDoc: this.requireDoc.checked,
127
+ position: this.positionList.value,
128
+ active: true,
129
+ // this is an added plugin and will be remove by reset either way
130
+ activeByDefault: false,
131
+ }));
132
+ this.requestUpdate();
133
+ this.dialog.close();
134
+ }
135
+ };
136
+ OscdCustomPluginDialog.styles = css `
137
+
138
+ mwc-dialog {
139
+ --mdc-dialog-max-width: 98vw;
140
+ }
141
+
142
+ mwc-dialog > form {
143
+ display: flex;
144
+ flex-direction: column;
145
+ }
146
+
147
+ mwc-dialog > form > * {
148
+ display: block;
149
+ margin-top: 16px;
150
+ }
151
+ `;
152
+ __decorate([
153
+ query('#dialog')
154
+ ], OscdCustomPluginDialog.prototype, "dialog", void 0);
155
+ __decorate([
156
+ query('#pluginSrcInput')
157
+ ], OscdCustomPluginDialog.prototype, "pluginSrcInput", void 0);
158
+ __decorate([
159
+ query('#pluginNameInput')
160
+ ], OscdCustomPluginDialog.prototype, "pluginNameInput", void 0);
161
+ __decorate([
162
+ query('#pluginKindList')
163
+ ], OscdCustomPluginDialog.prototype, "pluginKindList", void 0);
164
+ __decorate([
165
+ query('#requireDoc')
166
+ ], OscdCustomPluginDialog.prototype, "requireDoc", void 0);
167
+ __decorate([
168
+ query('#positionList')
169
+ ], OscdCustomPluginDialog.prototype, "positionList", void 0);
170
+ __decorate([
171
+ query('#addButton')
172
+ ], OscdCustomPluginDialog.prototype, "addButton", void 0);
173
+ OscdCustomPluginDialog = __decorate([
174
+ customElement('oscd-custom-plugin-dialog')
175
+ ], OscdCustomPluginDialog);
176
+ export { OscdCustomPluginDialog };
177
+ //# sourceMappingURL=custom-plugin-dialog.js.map
@@ -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,20 @@
1
+ import { LitElement, TemplateResult } from 'lit-element';
2
+ import type { Dialog } from '@material/mwc-dialog';
3
+ import '@material/mwc-dialog';
4
+ import '@material/mwc-list';
5
+ import type { List } from '@material/mwc-list';
6
+ import { Plugin } from "../../plugin.js";
7
+ export declare class OscdPluginManager extends LitElement {
8
+ /** The plugins to render the layout. */
9
+ plugins: Plugin[];
10
+ root: Dialog;
11
+ pluginList: List;
12
+ render(): TemplateResult;
13
+ static styles: import("lit-element").CSSResult;
14
+ show(): void;
15
+ private generateEditorListItems;
16
+ private generateMenuListItems;
17
+ private generateValidatorListItems;
18
+ private dispatchOpenCustomPluginDialogEvent;
19
+ private renderPluginListItem;
20
+ }
@@ -0,0 +1,165 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement, html, LitElement, property, query, css } from 'lit-element';
3
+ import { get } from 'lit-translate';
4
+ import '@material/mwc-dialog';
5
+ import '@material/mwc-list';
6
+ import { newResetPluginsEvent, newSetPluginsEvent, pluginIcons } from '../../open-scd.js';
7
+ let OscdPluginManager = class OscdPluginManager extends LitElement {
8
+ constructor() {
9
+ super(...arguments);
10
+ /** The plugins to render the layout. */
11
+ this.plugins = [];
12
+ }
13
+ render() {
14
+ return html `
15
+ <mwc-dialog
16
+ stacked
17
+ id="plugin-manager-root"
18
+ heading="${get('plugins.heading')}"
19
+ >
20
+ <mwc-list
21
+ id="pluginList"
22
+ multi
23
+ @selected=${(e) => {
24
+ const selectedPlugins = this.pluginList.items
25
+ .filter((item, index) => e.detail.index.has(index))
26
+ // @ts-expect-error: we add plugin to the list item
27
+ .map(item => item.plugin);
28
+ this.dispatchEvent(newSetPluginsEvent(selectedPlugins));
29
+ }}
30
+ >
31
+ <mwc-list-item graphic="avatar" noninteractive>
32
+ <strong>${get(`plugins.editor`)}</strong>
33
+ <mwc-icon slot="graphic" class="inverted">
34
+ ${pluginIcons['editor']}
35
+ </mwc-icon>
36
+ </mwc-list-item>
37
+
38
+ <li divider role="separator"></li>
39
+
40
+ ${this.generateEditorListItems()}
41
+
42
+ <mwc-list-item graphic="avatar" noninteractive>
43
+ <strong>${get(`plugins.menu`)}</strong>
44
+ <mwc-icon slot="graphic" class="inverted">
45
+ <strong>${pluginIcons['menu']}</strong></mwc-icon>
46
+ </mwc-list-item>
47
+ <li divider role="separator"></li>
48
+
49
+ ${this.generateMenuListItems('top')}
50
+
51
+ <li divider role="separator" inset></li>
52
+
53
+ ${this.generateValidatorListItems()}
54
+
55
+ <li divider role="separator" inset></li>
56
+
57
+ ${this.generateMenuListItems('middle')}
58
+
59
+ <li divider role="separator" inset></li>
60
+
61
+ ${this.generateMenuListItems('bottom')}
62
+
63
+ </mwc-list>
64
+ <mwc-button
65
+ slot="secondaryAction"
66
+ icon="refresh"
67
+ label="${get('reset')}"
68
+ @click=${async () => {
69
+ this.dispatchEvent(newResetPluginsEvent());
70
+ this.requestUpdate();
71
+ }}
72
+ style="--mdc-theme-primary: var(--mdc-theme-error)"
73
+ >
74
+ </mwc-button>
75
+ <mwc-button
76
+ slot="secondaryAction"
77
+ icon=""
78
+ label="${get('close')}"
79
+ dialogAction="close">
80
+ </mwc-button>
81
+ <mwc-button
82
+ outlined
83
+ trailingIcon
84
+ slot="primaryAction"
85
+ icon="library_add"
86
+ label="${get('plugins.add.heading')}&hellip;"
87
+ @click=${() => this.dispatchOpenCustomPluginDialogEvent()}>
88
+ </mwc-button>
89
+ </mwc-dialog>
90
+ `;
91
+ }
92
+ show() {
93
+ this.root.show();
94
+ }
95
+ generateEditorListItems() {
96
+ return this.plugins
97
+ .filter(p => p.kind === 'editor')
98
+ .map(this.renderPluginListItem);
99
+ }
100
+ generateMenuListItems(position) {
101
+ return this.plugins
102
+ .filter(p => p.kind === 'menu' && p.position === position)
103
+ .map(this.renderPluginListItem);
104
+ }
105
+ generateValidatorListItems() {
106
+ return this.plugins
107
+ .filter(p => p.kind === 'validator')
108
+ .map(this.renderPluginListItem);
109
+ }
110
+ dispatchOpenCustomPluginDialogEvent() {
111
+ const event = new CustomEvent('open-plugin-download', {
112
+ bubbles: true,
113
+ composed: true,
114
+ });
115
+ this.dispatchEvent(event);
116
+ }
117
+ renderPluginListItem(plugin) {
118
+ if (!plugin) {
119
+ return html ``;
120
+ }
121
+ return html `
122
+ <mwc-check-list-item
123
+ class="${plugin.official ? 'official' : 'external'}"
124
+ value="${plugin.src}"
125
+ .plugin=${plugin}
126
+ ?selected=${plugin.active}
127
+ @request-selected=${(e) => {
128
+ if (e.detail.source !== 'interaction') {
129
+ e.preventDefault();
130
+ e.stopPropagation();
131
+ e.stopImmediatePropagation();
132
+ return false;
133
+ }
134
+ }}
135
+ hasMeta
136
+ left
137
+ >
138
+ <mwc-icon slot="meta">
139
+ ${plugin.icon || pluginIcons[plugin.kind]}
140
+ </mwc-icon>
141
+ ${plugin.name}
142
+ </mwc-check-list-item>
143
+
144
+ `;
145
+ }
146
+ };
147
+ OscdPluginManager.styles = css `
148
+ mwc-dialog {
149
+ --mdc-dialog-max-width: 98vw;
150
+ }
151
+ `;
152
+ __decorate([
153
+ property({ type: Array })
154
+ ], OscdPluginManager.prototype, "plugins", void 0);
155
+ __decorate([
156
+ query('#plugin-manager-root')
157
+ ], OscdPluginManager.prototype, "root", void 0);
158
+ __decorate([
159
+ query('#pluginList')
160
+ ], OscdPluginManager.prototype, "pluginList", void 0);
161
+ OscdPluginManager = __decorate([
162
+ customElement('oscd-plugin-manager')
163
+ ], OscdPluginManager);
164
+ export { OscdPluginManager };
165
+ //# sourceMappingURL=plugin-manager.js.map
@@ -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]}\n </mwc-icon>\n ${plugin.name}\n </mwc-check-list-item>\n\n `;\n }\n\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import { TemplateResult } from 'lit-element';
2
+ import '@material/mwc-checkbox';
3
+ import '@material/mwc-formfield';
4
+ import '@material/mwc-textfield';
5
+ import { ListBase } from '@material/mwc-list/mwc-list-base';
6
+ import { TextField } from '@material/mwc-textfield';
7
+ /**
8
+ * A mwc-list with mwc-textfield that filters the list items for given or separated terms
9
+ */
10
+ export declare class FilteredList extends ListBase {
11
+ /** search mwc-textfield label property */
12
+ searchFieldLabel?: string;
13
+ /** Whether the check all option (checkbox next to search text field) is activated */
14
+ disableCheckAll: boolean;
15
+ private get existCheckListItem();
16
+ private get isAllSelected();
17
+ private get isSomeSelected();
18
+ searchField: TextField;
19
+ private onCheckAll;
20
+ onFilterInput(): void;
21
+ protected onListItemConnected(e: CustomEvent): void;
22
+ protected update(changedProperties: Map<string | number | symbol, unknown>): void;
23
+ constructor();
24
+ private renderCheckAll;
25
+ render(): TemplateResult;
26
+ static styles: import("lit-element").CSSResult;
27
+ }
@@ -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"]}
@@ -0,0 +1,37 @@
1
+ import { LitElement, TemplateResult } from 'lit-element';
2
+ import '@material/mwc-icon';
3
+ import '@material/mwc-list';
4
+ import '@material/mwc-list/mwc-list-item';
5
+ import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation';
6
+ import './filtered-list.js';
7
+ export type Selection = {
8
+ [name: string]: Selection;
9
+ };
10
+ export type Path = string[];
11
+ export interface Directory {
12
+ path: Path;
13
+ header?: TemplateResult;
14
+ entries: string[];
15
+ }
16
+ export declare class FinderList extends LitElement {
17
+ selection: Selection;
18
+ multi: boolean;
19
+ get depth(): number;
20
+ get paths(): Path[];
21
+ set paths(paths: Path[]);
22
+ get path(): Path;
23
+ set path(path: Path);
24
+ read: (path: Path) => Promise<Directory>;
25
+ loaded: Promise<void>;
26
+ getTitle(path: string[]): string;
27
+ getDisplayString(entry: string, path: string[]): string;
28
+ container: Element;
29
+ private getPaths;
30
+ multiSelect(event: SingleSelectedEvent, path: Path, clicked: string): void;
31
+ singleSelect(event: SingleSelectedEvent, path: Path, clicked: string): void;
32
+ select(event: SingleSelectedEvent, path: Path): Promise<void>;
33
+ renderDirectory(path: Path, entries: string[]): TemplateResult;
34
+ renderColumn(column: number): Promise<TemplateResult>;
35
+ render(): TemplateResult;
36
+ static styles: import("lit-element").CSSResult;
37
+ }