generated from meinberg-sync/mbg-plugin-template
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmbg-ied-editor.js
124 lines (109 loc) · 3.49 KB
/
mbg-ied-editor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { LitElement, html, css } from 'lit';
import { repeat } from 'lit/directives/repeat.js';
import { IedEditor } from './ied-editor.js';
import '@material/web/icon/icon.js';
customElements.define('ied-editor', IedEditor);
function meinbergFirst(a, b) {
if (a.toLowerCase().startsWith('meinberg')) return -1;
if (b.toLowerCase().startsWith('meinberg')) return 1;
return 0;
}
export default class MbgIedEditor extends LitElement {
static properties = {
doc: {},
editCount: { type: Number },
};
get ied() {
const selector = this.shadowRoot.querySelector('#ied-selector');
if (!selector) return null;
return this.doc.querySelector(`IED[name="${selector.value}"]`);
}
render() {
const iedsByManufacturer = [];
this.doc?.querySelectorAll(':root > IED').forEach(ied => {
const manufacturer = ied.getAttribute('manufacturer');
if (!iedsByManufacturer[manufacturer])
iedsByManufacturer[manufacturer] = [];
iedsByManufacturer[manufacturer].push(ied);
});
const manufacturers = Object.keys(iedsByManufacturer).sort(meinbergFirst);
return html`
<main>
<select
name="ieds"
id="ied-selector"
@change=${() => this.requestUpdate()}
>
<option value="">Select IED</option>
${repeat(
manufacturers,
manufacturer => manufacturer,
manufacturer => html`
<optgroup label="${manufacturer}">
${repeat(
iedsByManufacturer[manufacturer],
ied => ied,
ied => html`
<option value="${ied.getAttribute('name')}">
${ied.getAttribute('name')}
</option>
`,
)}
</optgroup>
`,
)}
</select>
<md-icon class="dropdown-icon">arrow_drop_down</md-icon>
${this.ied &&
html`<ied-editor
.doc=${this.doc}
.ied=${this.ied}
.editCount=${this.editCount}
></ied-editor>`}
</main>
`;
}
static styles = css`
* {
--oscd-primary: var(--oscd-theme-primary, #2aa198);
--oscd-secondary: var(--oscd-theme-secondary, #6c71c4);
--oscd-error: var(--oscd-theme-error, #dc322f);
--oscd-base03: var(--oscd-theme-base03, #002b36);
--oscd-base02: var(--oscd-theme-base02, #073642);
--oscd-base01: var(--oscd-theme-base01, #586e75);
--oscd-base00: var(--oscd-theme-base00, #657b83);
--oscd-base0: var(--oscd-theme-base0, #839496);
--oscd-base1: var(--oscd-theme-base1, #93a1a1);
--oscd-base2: var(--oscd-theme-base2, #eee8d5);
--oscd-base3: var(--oscd-theme-base3, #fdf6e3);
--oscd-text-font: var(--oscd-theme-text-font, 'Roboto');
--oscd-icon-font: var(--oscd-theme-icon-font, 'Material Icons');
}
main {
margin: 1rem;
background-color: var(--oscd-base2);
color: var(--oscd-base01);
font-family: var(--oscd-text-font);
}
#ied-selector {
margin-bottom: 1rem;
appearance: none;
padding: 16px 32px 16px 16px;
text-align: left;
font-size: 18px;
background-color: var(--oscd-base3);
color: var(--oscd-base00);
border: none;
border-bottom: 1px solid var(--oscd-base0);
border-radius: 4px 4px 0 0;
}
#ied-selector:focus {
outline: none;
}
.dropdown-icon {
position: relative;
left: -34px;
top: 6px;
}
`;
}