@compas-oscd/open-scd 0.34.43 → 0.34.45
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.
- package/dist/addons/Editor.d.ts +5 -2
- package/dist/addons/Editor.js +30 -7
- package/dist/addons/Editor.js.map +1 -1
- package/dist/addons/History.d.ts +3 -1
- package/dist/addons/History.js +11 -4
- package/dist/addons/History.js.map +1 -1
- package/dist/addons/Layout.d.ts +1 -1
- package/dist/addons/Layout.js +4 -2
- package/dist/addons/Layout.js.map +1 -1
- package/dist/open-scd.d.ts +1 -1
- package/dist/open-scd.js +2 -2
- package/dist/open-scd.js.map +1 -1
- package/dist/themes.js +28 -0
- package/dist/themes.js.map +1 -1
- package/dist/wizard-select.js +1 -0
- package/dist/wizard-select.js.map +1 -1
- package/package.json +6 -1
package/dist/addons/Editor.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { EditEventV2, OpenEvent
|
|
1
|
+
import { EditEventV2, OpenEvent } from '@compas-oscd/core';
|
|
2
2
|
import { LitElement, TemplateResult } from 'lit-element';
|
|
3
3
|
import { EditEvent } from '@compas-oscd/core';
|
|
4
|
+
import type { XMLEditor } from '@openscd/oscd-editor';
|
|
4
5
|
export declare class OscdEditor extends LitElement {
|
|
5
6
|
/** The `XMLDocument` to be edited */
|
|
6
7
|
doc: XMLDocument | null;
|
|
@@ -11,6 +12,7 @@ export declare class OscdEditor extends LitElement {
|
|
|
11
12
|
/** XML Editor to apply changes to the scd */
|
|
12
13
|
editor: XMLEditor;
|
|
13
14
|
host: HTMLElement;
|
|
15
|
+
private unsubscribers;
|
|
14
16
|
private onAction;
|
|
15
17
|
handleEditEvent(event: EditEvent): void;
|
|
16
18
|
/**
|
|
@@ -20,6 +22,7 @@ export declare class OscdEditor extends LitElement {
|
|
|
20
22
|
private onOpenDoc;
|
|
21
23
|
handleOpenDoc({ detail: { docName, doc } }: OpenEvent): void;
|
|
22
24
|
connectedCallback(): void;
|
|
25
|
+
disconnectedCallback(): void;
|
|
23
26
|
render(): TemplateResult;
|
|
24
|
-
handleEditEventV2(event: EditEventV2):
|
|
27
|
+
handleEditEventV2(event: EditEventV2): void;
|
|
25
28
|
}
|
package/dist/addons/Editor.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { newEditEvent, newEditEventV2 } from '@compas-oscd/core';
|
|
2
|
+
import { newEditEvent, newEditEventV2, } from '@compas-oscd/core';
|
|
3
3
|
import { property, LitElement, customElement, html, } from 'lit-element';
|
|
4
4
|
import { get } from 'lit-translate';
|
|
5
|
+
import { isSimple, } from '@compas-oscd/core';
|
|
5
6
|
import { newLogEvent } from '@compas-oscd/core';
|
|
6
7
|
import { newValidateEvent } from '@compas-oscd/core';
|
|
7
8
|
import { isComplex, isInsert, isRemove, isUpdate, } from '@compas-oscd/core';
|
|
@@ -16,11 +17,28 @@ let OscdEditor = class OscdEditor extends LitElement {
|
|
|
16
17
|
this.docName = '';
|
|
17
18
|
/** The UUID of the current [[`doc`]] */
|
|
18
19
|
this.docId = '';
|
|
20
|
+
this.unsubscribers = [];
|
|
19
21
|
}
|
|
20
22
|
onAction(event) {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
const action = event.detail.action;
|
|
24
|
+
if (!isSimple(action)) {
|
|
25
|
+
// For complex editor actions, apply each sub-action individually with squash
|
|
26
|
+
// so they appear as a single history entry but DOM references are resolved
|
|
27
|
+
// correctly after each prior edit is already applied.
|
|
28
|
+
action.actions.forEach((simpleAction, index) => {
|
|
29
|
+
const edit = convertEditActiontoV1(simpleAction);
|
|
30
|
+
const editV2 = convertEditV1toV2(edit);
|
|
31
|
+
this.host.dispatchEvent(newEditEventV2(editV2, {
|
|
32
|
+
squash: index > 0,
|
|
33
|
+
title: index === 0 ? action.title : undefined,
|
|
34
|
+
}));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const edit = convertEditActiontoV1(action);
|
|
39
|
+
const editV2 = convertEditV1toV2(edit);
|
|
40
|
+
this.host.dispatchEvent(newEditEventV2(editV2));
|
|
41
|
+
}
|
|
24
42
|
}
|
|
25
43
|
handleEditEvent(event) {
|
|
26
44
|
/**
|
|
@@ -56,6 +74,10 @@ let OscdEditor = class OscdEditor extends LitElement {
|
|
|
56
74
|
}
|
|
57
75
|
connectedCallback() {
|
|
58
76
|
super.connectedCallback();
|
|
77
|
+
this.unsubscribers.push(this.editor.subscribe(async () => {
|
|
78
|
+
await this.updateComplete;
|
|
79
|
+
this.dispatchEvent(newValidateEvent());
|
|
80
|
+
}));
|
|
59
81
|
// Deprecated editor action API, use 'oscd-edit' instead.
|
|
60
82
|
this.host.addEventListener('editor-action', this.onAction.bind(this));
|
|
61
83
|
// Deprecated edit event API, use 'oscd-edit-v2' instead.
|
|
@@ -64,14 +86,15 @@ let OscdEditor = class OscdEditor extends LitElement {
|
|
|
64
86
|
this.host.addEventListener('open-doc', this.onOpenDoc);
|
|
65
87
|
this.host.addEventListener('oscd-open', this.handleOpenDoc);
|
|
66
88
|
}
|
|
89
|
+
disconnectedCallback() {
|
|
90
|
+
this.unsubscribers.forEach(u => u());
|
|
91
|
+
}
|
|
67
92
|
render() {
|
|
68
93
|
return html `<slot></slot>`;
|
|
69
94
|
}
|
|
70
|
-
|
|
95
|
+
handleEditEventV2(event) {
|
|
71
96
|
const { edit, title, squash } = event.detail;
|
|
72
97
|
this.editor.commit(edit, { title, squash });
|
|
73
|
-
await this.updateComplete;
|
|
74
|
-
this.dispatchEvent(newValidateEvent());
|
|
75
98
|
}
|
|
76
99
|
};
|
|
77
100
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../src/addons/Editor.ts"],"names":[],"mappings":";AAAA,OAAO,EAGL,YAAY,EACZ,cAAc,
|
|
1
|
+
{"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../src/addons/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EditEventV2,\n OpenEvent,\n newEditEvent,\n newEditEventV2,\n} from '@compas-oscd/core';\nimport {\n property,\n LitElement,\n customElement,\n TemplateResult,\n html,\n} from 'lit-element';\nimport { get } from 'lit-translate';\n\nimport {\n EditorAction,\n EditorActionEvent,\n isSimple,\n} from '@compas-oscd/core';\n\nimport { newLogEvent } from '@compas-oscd/core';\nimport { newValidateEvent } from '@compas-oscd/core';\nimport { OpenDocEvent } from '@compas-oscd/core';\n\nimport {\n Edit,\n EditEvent,\n isComplex,\n isInsert,\n isRemove,\n isUpdate,\n} from '@compas-oscd/core';\n\nimport { convertEditActiontoV1 } from './editor/edit-action-to-v1-converter.js';\nimport { convertEditV1toV2 } from './editor/edit-v1-to-v2-converter.js';\n\nimport type { XMLEditor } from '@openscd/oscd-editor';\n\n@customElement('oscd-editor')\nexport class OscdEditor extends LitElement {\n /** The `XMLDocument` to be edited */\n @property({ attribute: false })\n doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** The UUID of the current [[`doc`]] */\n @property({ type: String }) docId = '';\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property({\n type: Object,\n })\n host!: HTMLElement;\n\n private unsubscribers: (() => any)[] = [];\n\n private onAction(event: EditorActionEvent<EditorAction>) {\n const action = event.detail.action;\n\n if (!isSimple(action)) {\n // For complex editor actions, apply each sub-action individually with squash\n // so they appear as a single history entry but DOM references are resolved\n // correctly after each prior edit is already applied.\n action.actions.forEach((simpleAction, index) => {\n const edit = convertEditActiontoV1(simpleAction);\n const editV2 = convertEditV1toV2(edit);\n this.host.dispatchEvent(newEditEventV2(editV2, {\n squash: index > 0,\n title: index === 0 ? action.title : undefined,\n }));\n });\n } else {\n const edit = convertEditActiontoV1(action);\n const editV2 = convertEditV1toV2(edit);\n this.host.dispatchEvent(newEditEventV2(editV2));\n }\n }\n\n handleEditEvent(event: EditEvent) {\n /**\n * This is a compatibility fix for plugins based on open energy tools edit events\n * because their edit event look slightly different\n * see https://github.com/OpenEnergyTools/open-scd-core/blob/main/foundation/edit-event-v1.ts for details\n */\n if (isOpenEnergyEditEvent(event)) {\n event = convertOpenEnergyEditEventToEditEvent(event);\n }\n\n const edit = event.detail.edit;\n const editV2 = convertEditV1toV2(edit);\n\n this.host.dispatchEvent(newEditEventV2(editV2));\n }\n\n /**\n *\n * @deprecated [Move to handleOpenDoc instead]\n */\n private async onOpenDoc(event: OpenDocEvent) {\n this.doc = event.detail.doc;\n this.docName = event.detail.docName;\n this.docId = event.detail.docId ?? '';\n\n await this.updateComplete;\n\n this.dispatchEvent(newValidateEvent());\n\n this.dispatchEvent(\n newLogEvent({\n kind: 'info',\n title: get('openSCD.loaded', { name: this.docName }),\n })\n );\n }\n\n handleOpenDoc({ detail: { docName, doc } }: OpenEvent) {\n this.doc = doc;\n this.docName = docName;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n this.unsubscribers.push(\n this.editor.subscribe(async () => {\n await this.updateComplete;\n this.dispatchEvent(newValidateEvent());\n })\n );\n\n // Deprecated editor action API, use 'oscd-edit' instead.\n this.host.addEventListener('editor-action', this.onAction.bind(this));\n // Deprecated edit event API, use 'oscd-edit-v2' instead.\n this.host.addEventListener('oscd-edit', event => this.handleEditEvent(event));\n\n this.host.addEventListener('oscd-edit-v2', event => this.handleEditEventV2(event));\n this.host.addEventListener('open-doc', this.onOpenDoc);\n this.host.addEventListener('oscd-open', this.handleOpenDoc);\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n render(): TemplateResult {\n return html`<slot></slot>`;\n }\n\n handleEditEventV2(event: EditEventV2) {\n const { edit, title, squash } = event.detail;\n this.editor.commit(edit, { title, squash });\n }\n}\n\nfunction isOpenEnergyEditEvent(event: CustomEvent<unknown>): boolean {\n const eventDetail = event.detail as Edit;\n return isComplex(eventDetail) || isInsert(eventDetail) || isUpdate(eventDetail) || isRemove(eventDetail);\n}\n\nfunction convertOpenEnergyEditEventToEditEvent(event: CustomEvent<unknown>): EditEvent {\n const eventDetail = event.detail as Edit;\n return newEditEvent(eventDetail);\n}\n"]}
|
package/dist/addons/History.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { Dialog } from '@material/mwc-dialog';
|
|
|
11
11
|
import { Snackbar } from '@material/mwc-snackbar';
|
|
12
12
|
import '../filtered-list.js';
|
|
13
13
|
import { InfoEntry, IssueDetail, LogEntry } from '@compas-oscd/core';
|
|
14
|
-
import { XMLEditor } from '@
|
|
14
|
+
import { XMLEditor } from '@openscd/oscd-editor';
|
|
15
15
|
interface HistoryItem {
|
|
16
16
|
title: string;
|
|
17
17
|
message?: string;
|
|
@@ -43,6 +43,8 @@ export declare class OscdHistory extends LitElement {
|
|
|
43
43
|
host: HTMLElement;
|
|
44
44
|
latestIssue: IssueDetail;
|
|
45
45
|
history: HistoryItem[];
|
|
46
|
+
get canRedo(): boolean;
|
|
47
|
+
get canUndo(): boolean;
|
|
46
48
|
logUI: Dialog;
|
|
47
49
|
historyUI: Dialog;
|
|
48
50
|
diagnosticUI: Dialog;
|
package/dist/addons/History.js
CHANGED
|
@@ -60,6 +60,12 @@ export function newEmptyIssuesEvent(pluginSrc, eventInitDict) {
|
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
let OscdHistory = class OscdHistory extends LitElement {
|
|
63
|
+
get canRedo() {
|
|
64
|
+
return this.editor.future.length >= 1;
|
|
65
|
+
}
|
|
66
|
+
get canUndo() {
|
|
67
|
+
return this.editor.past.length >= 1;
|
|
68
|
+
}
|
|
63
69
|
onIssue(de) {
|
|
64
70
|
const issues = this.diagnoses.get(de.detail.validatorId);
|
|
65
71
|
if (!issues)
|
|
@@ -79,7 +85,8 @@ let OscdHistory = class OscdHistory extends LitElement {
|
|
|
79
85
|
onReset() {
|
|
80
86
|
this.log = [];
|
|
81
87
|
this.diagnoses.clear();
|
|
82
|
-
this.editor.
|
|
88
|
+
this.editor.past = [];
|
|
89
|
+
this.editor.future = [];
|
|
83
90
|
this.updateHistory();
|
|
84
91
|
}
|
|
85
92
|
onInfo(detail) {
|
|
@@ -176,7 +183,7 @@ let OscdHistory = class OscdHistory extends LitElement {
|
|
|
176
183
|
}
|
|
177
184
|
connectedCallback() {
|
|
178
185
|
super.connectedCallback();
|
|
179
|
-
this.unsubscribers.push(this.editor.subscribe(
|
|
186
|
+
this.unsubscribers.push(this.editor.subscribe(() => this.updateHistory()));
|
|
180
187
|
this.host.addEventListener('log', this.onLog);
|
|
181
188
|
this.host.addEventListener('issue', this.onIssue);
|
|
182
189
|
this.host.addEventListener('history-dialog-ui', this.historyUIHandler);
|
|
@@ -298,14 +305,14 @@ let OscdHistory = class OscdHistory extends LitElement {
|
|
|
298
305
|
<mwc-button
|
|
299
306
|
icon="undo"
|
|
300
307
|
label="${get('undo')}"
|
|
301
|
-
?disabled=${!this.
|
|
308
|
+
?disabled=${!this.canUndo}
|
|
302
309
|
@click=${this.undo}
|
|
303
310
|
slot="secondaryAction"
|
|
304
311
|
></mwc-button>
|
|
305
312
|
<mwc-button
|
|
306
313
|
icon="redo"
|
|
307
314
|
label="${get('redo')}"
|
|
308
|
-
?disabled=${!this.
|
|
315
|
+
?disabled=${!this.canRedo}
|
|
309
316
|
@click=${this.redo}
|
|
310
317
|
slot="secondaryAction"
|
|
311
318
|
></mwc-button>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/addons/History.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EAEL,aAAa,EACb,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,kCAAkC,CAAC;AAC1C,OAAO,wBAAwB,CAAC;AAIhC,OAAO,qBAAqB,CAAC;AAY7B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK9D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AASvD,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,SAAS,aAAa,CAAC,GAAW;IAEhC,IAAI,mBAAmB,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAG,CAAC,mBAAmB,EAAE;QACvB,mBAAmB,GAAG,IAAI,CAAC;KAC5B;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAa,CAAC;IAClE,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAEtE,IAAG,CAAC,YAAY,EAAE;QAChB,OAAO,mBAAmB,GAAG,OAAO,mBAAmB,EAAE,CAAC;KAC3D;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAE/B,IAAG,CAAC,IAAI,EAAC;QACP,OAAO,mBAAmB,GAAG,EAAE,CAAC;KACjC;IAED,OAAO,IAAI,CAAC;AAEd,CAAC;AAED,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,oCAAmB,CAAA;IACnB,0CAAyB,CAAA;AAC3B,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAQD,MAAM,UAAU,iBAAiB,CAC/B,IAAa,EACb,IAAmB,EACnB,aAAyD;IAEzD,OAAO,IAAI,WAAW,CAAkB,mBAAmB,EAAE;QAC3D,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,aAAa;QAChB,MAAM,EAAE;YACN,IAAI;YACJ,IAAI;YACJ,GAAG,aAAa,EAAE,MAAM;SACzB;KACF,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,aAA2D;IAE3D,OAAO,IAAI,WAAW,CAAoB,cAAc,EAAE;QACxD,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,aAAa;QAChB,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAGM,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IA8BjC,OAAO,CAAC,EAAc;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;;YAC/D,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAE7B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,MAAM,CAAC,MAAkB;QAC/B,MAAM,KAAK,GAAc;YACvB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACpB,MAAM,EAAE,GAAG;gBACT,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,IAAI,EAAE,IAAI,CAAC,MAAM;aAClB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEf,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,CAAC,IAAI,EAAE,CAAC;SACX;QACD,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,EAAE;YAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,wBAAwB;YAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SACrB;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,EAAY;QACxB,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;YACtB,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM;YACR,KAAK,QAAQ;gBACX,mBAAmB;gBACnB,MAAM;YACR;gBACE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACvB,MAAM;SACT;IACH,CAAC;IAEO,gBAAgB,CAAC,CAAiB;QACxC,MAAM,EAAE,GAAG;YACT,GAAG,EAAE,IAAI,CAAC,KAAK;YACf,OAAO,EAAE,IAAI,CAAC,SAAS;YACvB,UAAU,EAAE,IAAI,CAAC,YAAY;SAC9B,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI;YAAE,EAAE,CAAC,IAAI,EAAE,CAAC;;YACxB,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAEO,kBAAkB,CAAC,CAAmB;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC;IAEO,cAAc,CAAC,CAAgB;QACrC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC;QAE5D,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3E,IAAI,OAAO,CAAC,GAAG,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,IAAI;gBACpB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;gBAC3B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAEO,aAAa;QACnB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAErC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,CAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAE,CAAC;QAE1C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,IAAW,CAAC,CAAC;YAErD,OAAO;gBACL,QAAQ,EAAE,KAAK,KAAK,WAAW;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK;gBACvB,OAAO;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QA3IV,mEAAmE;QAEnE,QAAG,GAAgB,EAAE,CAAC;QAMtB,cAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;QAS7C,YAAO,GAAkB,EAAE,CAAC;QAUpB,kBAAa,GAAkB,EAAE,CAAC;QAiHxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3C,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAChD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CACzD,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACtE,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CACZ,KAAgB,EAChB,KAAa,EACb,GAAe;QAEf,OAAO,IAAI,CAAA,iBAAiB,KAAK,CAAC,KAAK;;iBAE1B,KAAK,CAAC,IAAI;;mBAER,CAAC,CAAC,KAAK,CAAC,OAAO;;;;gBAIlB,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE;YAChC,KAAK,CAAC,KAAK;;iCAEU,KAAK,CAAC,OAAO;;;2DAGa,UAAU,CACzD,KAAK,CAAC,IAAI,CACX;aACE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;;;MAGxB,CAAC;IACL,CAAC;IAED,kBAAkB,CAChB,KAAkB;QAElB,OAAO,IAAI,CAAA,iBAAiB,KAAK,CAAC,KAAK;;mBAExB,CAAC,CAAC,KAAK,CAAC,OAAO;qBACb,KAAK,CAAC,QAAQ;;;gBAGnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/B,KAAK,CAAC,KAAK;;iCAEU,KAAK,CAAC,OAAO;;YAElC,CAAC;IACX,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;IACtF,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;;YAEjE,OAAO,IAAI,CAAA;gBACD,GAAG,CAAC,iBAAiB,CAAC;;uBAEf,CAAC;IACtB,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;;YAE3E,OAAO,IAAI,CAAA;gBACD,GAAG,CAAC,qBAAqB,CAAC;;uBAEnB,CAAC;IACtB,CAAC;IAES,gBAAgB,CAAC,KAAkB;QAC3C,OAAO,IAAI,CAAA,iBAAiB,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO;iCACjC,CAAC,CAAC,KAAK,CAAC,OAAO;iBAC/B,KAAK,CAAC,KAAK;iCACK,KAAK,CAAC,OAAO;;MAExC,CAAC;IACL,CAAC;IAED,sBAAsB,CAAC,MAAqB;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAA,EAAE,CAAC,CAAC;QACzC,OAAO;YACL,IAAI,CAAA;;YAEE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;;OAEzC;YACD,IAAI,CAAA,2CAA2C;YAC/C,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SACrD,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC9B,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CACtD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,MAAM;YACtB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,IAAI,CAAA;kBACM,GAAG,CAAC,kBAAkB,CAAC;;yBAEhB,CAAC;IACxB,CAAC;IAEO,mBAAmB;QACzB,OAAwB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,GAAG,CAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA,+BAA+B,IAAI;WAC1C,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;UAC3B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;QAC3B,CACH,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAA,kCAAkC,GAAG,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,mBAAmB,EAAE;yCACO,IAAI,CAAC,SAAS,EAAE;;WAE9C,GAAG,CAAC,OAAO,CAAC;;kBAEL,CAAC;IACjB,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAA,sCAAsC,GAAG,CAAC,cAAc,CAAC;yCAC/B,IAAI,CAAC,aAAa,EAAE;;;iBAG5C,GAAG,CAAC,MAAM,CAAC;oBACR,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;iBACvB,IAAI,CAAC,IAAI;;;;;iBAKT,GAAG,CAAC,MAAM,CAAC;oBACR,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;iBACvB,IAAI,CAAC,IAAI;;;;WAIf,GAAG,CAAC,OAAO,CAAC;;kBAEL,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0DP,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;6CACX,GAAG,CAAC,WAAW,CAAC;;YAEjD,IAAI,CAAC,YAAY,EAAE;;;YAGnB,GAAG,CAAC,OAAO,CAAC;;;;;;;qBAOH,IAAI,CAAC,GAAG;aAClB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK;YACxC,GAAG,CAAC,0BAA0B,CAAC;;;;;;;qBAOlB,IAAI,CAAC,GAAG;aAClB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,KAAK;YAC3C,GAAG,CAAC,0BAA0B,CAAC;;;;;mBAKpB,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;aAC7B,GAAG,CAAC,mBAAmB,CAAC;;;;;;;qBAOhB,IAAI,CAAC,GAAG;aAClB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK;YACzC,GAAG,CAAC,0BAA0B,CAAC;;;;;mBAKpB,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;aAC7B,GAAG,CAAC,mBAAmB,CAAC;;;;;;;qBAOhB,IAAI,CAAC,WAAW,EAAE,KAAK;YACpC,GAAG,CAAC,0BAA0B,CAAC;;;;;mBAKpB,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;aACpC,GAAG,CAAC,mBAAmB,CAAC;;;sBAGf,CAAC;IACrB,CAAC;CACF,CAAA;AAhcC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;wCACJ;AAGM;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAoB;AAG/C;IADC,QAAQ,EAAE;8CACkC;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCACR;AAGnB;IADC,KAAK,EAAE;gDACkB;AAG1B;IADC,KAAK,EAAE;4CACoB;AAEb;IAAd,KAAK,CAAC,MAAM,CAAC;0CAAgB;AACX;IAAlB,KAAK,CAAC,UAAU,CAAC;8CAAoB;AAChB;IAArB,KAAK,CAAC,aAAa,CAAC;iDAAuB;AAC3B;IAAhB,KAAK,CAAC,QAAQ,CAAC;4CAAoB;AACjB;IAAlB,KAAK,CAAC,UAAU,CAAC;8CAAsB;AACxB;IAAf,KAAK,CAAC,OAAO,CAAC;2CAAmB;AACjB;IAAhB,KAAK,CAAC,QAAQ,CAAC;4CAAoB;AA1BzB,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAmcvB;SAncY,WAAW","sourcesContent":["import {\n html,\n state,\n property,\n query,\n TemplateResult,\n customElement,\n LitElement,\n} from 'lit-element';\n\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-icon';\nimport '@material/mwc-icon-button';\nimport '@material/mwc-icon-button-toggle';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-snackbar';\nimport { Dialog } from '@material/mwc-dialog';\nimport { Snackbar } from '@material/mwc-snackbar';\n\nimport '../filtered-list.js';\n\nimport {\n InfoDetail,\n InfoEntry,\n IssueDetail,\n IssueEvent,\n LogEntry,\n LogEntryType,\n LogEvent,\n} from '@compas-oscd/core';\n\nimport { getFilterIcon, iconColors } from '../icons/icons.js';\n\nimport { Plugin } from '../plugin.js';\nimport { XMLEditor } from '@compas-oscd/core';\n\nimport { getLogText } from './history/get-log-text.js';\n\ninterface HistoryItem {\n title: string;\n message?: string;\n time: number;\n isActive: boolean;\n}\n\nconst icons = {\n info: 'info',\n warning: 'warning',\n error: 'report',\n};\n\nfunction getPluginName(src: string): string {\n\n let storedPluginsString = localStorage.getItem('plugins');\n if(!storedPluginsString) {\n storedPluginsString = '[]';\n }\n\n const storedPlugins = JSON.parse(storedPluginsString) as Plugin[];\n const wantedPlugin = storedPlugins.find((p: Plugin) => p.src === src);\n\n if(!wantedPlugin) {\n return `pluginnotfound: ${src} in ${storedPluginsString}`;\n }\n\n const name = wantedPlugin.name;\n\n if(!name){\n return `pluginhasnoname:${src}`;\n }\n\n return name;\n\n}\n\nexport enum HistoryUIKind {\n log = 'log',\n history = 'history',\n diagnostic = 'diagnostic',\n}\nexport interface HistoryUIDetail {\n show: boolean;\n kind: HistoryUIKind;\n}\n\nexport type HistoryUIEvent = CustomEvent<HistoryUIDetail>;\n\nexport function newHistoryUIEvent(\n show: boolean,\n kind: HistoryUIKind,\n eventInitDict?: CustomEventInit<Partial<HistoryUIDetail>>\n): HistoryUIEvent {\n return new CustomEvent<HistoryUIDetail>('history-dialog-ui', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: {\n show,\n kind,\n ...eventInitDict?.detail,\n },\n });\n}\n\nexport interface EmptyIssuesDetail {\n pluginSrc: string;\n}\n\nexport type EmptyIssuesEvent = CustomEvent<EmptyIssuesDetail>;\n\nexport function newEmptyIssuesEvent(\n pluginSrc: string,\n eventInitDict?: CustomEventInit<Partial<EmptyIssuesDetail>>\n): EmptyIssuesEvent {\n return new CustomEvent<EmptyIssuesDetail>('empty-issues', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: { pluginSrc, ...eventInitDict?.detail },\n });\n}\n\n@customElement('oscd-history')\nexport class OscdHistory extends LitElement {\n /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */\n @property({ type: Array })\n log: InfoEntry[] = [];\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property()\n diagnoses = new Map<string, IssueDetail[]>();\n\n @property({ type: Object })\n host!: HTMLElement;\n\n @state()\n latestIssue!: IssueDetail;\n\n @state()\n history: HistoryItem[] = [];\n\n @query('#log') logUI!: Dialog;\n @query('#history') historyUI!: Dialog;\n @query('#diagnostic') diagnosticUI!: Dialog;\n @query('#error') errorUI!: Snackbar;\n @query('#warning') warningUI!: Snackbar;\n @query('#info') infoUI!: Snackbar;\n @query('#issue') issueUI!: Snackbar;\n\n private unsubscribers: (() => any)[] = [];\n\n private onIssue(de: IssueEvent): void {\n const issues = this.diagnoses.get(de.detail.validatorId);\n\n if (!issues) this.diagnoses.set(de.detail.validatorId, [de.detail]);\n else issues?.push(de.detail);\n\n this.latestIssue = de.detail;\n this.issueUI.close();\n this.issueUI.show();\n }\n\n undo(): void {\n this.editor.undo();\n }\n redo(): void {\n this.editor.redo();\n }\n\n private onReset() {\n this.log = [];\n this.diagnoses.clear();\n this.editor.reset();\n this.updateHistory();\n }\n\n private onInfo(detail: InfoDetail) {\n const entry: InfoEntry = {\n time: new Date(),\n ...detail,\n };\n\n this.log.push(entry);\n if (!this.logUI.open) {\n const ui = {\n error: this.errorUI,\n warning: this.warningUI,\n info: this.infoUI,\n }[detail.kind];\n\n ui.close();\n ui.show();\n }\n if (detail.kind == 'error') {\n this.errorUI.close(); // hack to reset timeout\n this.errorUI.show();\n }\n this.requestUpdate('log', []);\n }\n\n private onLog(le: LogEvent): void {\n switch (le.detail.kind) {\n case 'reset':\n this.onReset();\n break;\n case 'action':\n // No longer needed\n break;\n default:\n this.onInfo(le.detail);\n break;\n }\n }\n\n private historyUIHandler(e: HistoryUIEvent): void {\n const ui = {\n log: this.logUI,\n history: this.historyUI,\n diagnostic: this.diagnosticUI,\n }[e.detail.kind];\n\n if (e.detail.show) ui.show();\n else ui.close();\n }\n\n private emptyIssuesHandler(e: EmptyIssuesEvent): void {\n if (this.diagnoses.get(e.detail.pluginSrc))\n this.diagnoses.get(e.detail.pluginSrc)!.length = 0;\n }\n\n private handleKeyPress(e: KeyboardEvent): void {\n const ctrlAnd = (key: string) => e.key === key && e.ctrlKey;\n\n if (ctrlAnd('y')) this.redo();\n if (ctrlAnd('z')) this.undo();\n if (ctrlAnd('l')) this.logUI.open ? this.logUI.close() : this.logUI.show();\n if (ctrlAnd('d'))\n this.diagnosticUI.open\n ? this.diagnosticUI.close()\n : this.diagnosticUI.show();\n }\n\n private updateHistory(): void {\n const { past, future } = this.editor;\n\n const activeIndex = past.length - 1;\n const allEntries = [ ...past, ...future ];\n\n this.history = allEntries.map((e, index) => {\n const { title, message } = getLogText(e.redo as any);\n\n return {\n isActive: index === activeIndex,\n time: e.time,\n title: e.title ?? title,\n message\n };\n });\n }\n\n constructor() {\n super();\n this.undo = this.undo.bind(this);\n this.redo = this.redo.bind(this);\n this.onLog = this.onLog.bind(this);\n this.onIssue = this.onIssue.bind(this);\n this.historyUIHandler = this.historyUIHandler.bind(this);\n this.emptyIssuesHandler = this.emptyIssuesHandler.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n document.onkeydown = this.handleKeyPress;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n this.unsubscribers.push(\n this.editor.subscribe(e => this.updateHistory()),\n this.editor.subscribeUndoRedo(e => this.updateHistory())\n );\n\n this.host.addEventListener('log', this.onLog);\n this.host.addEventListener('issue', this.onIssue);\n this.host.addEventListener('history-dialog-ui', this.historyUIHandler);\n this.host.addEventListener('empty-issues', this.emptyIssuesHandler);\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n renderLogEntry(\n entry: InfoEntry,\n index: number,\n log: LogEntry[]\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n class=\"${entry.kind}\"\n graphic=\"icon\"\n ?twoline=${!!entry.message}\n >\n <span>\n <!-- FIXME: replace tt with mwc-chip asap -->\n <tt>${entry.time?.toLocaleString()}</tt>\n ${entry.title}</span\n >\n <span slot=\"secondary\">${entry.message}</span>\n <mwc-icon\n slot=\"graphic\"\n style=\"--mdc-theme-text-icon-on-background:var(${iconColors[\n entry.kind\n ]})\"\n >${icons[entry.kind]}</mwc-icon\n >\n </mwc-list-item></abbr\n >`;\n }\n\n renderHistoryEntry(\n entry: HistoryItem\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n ?twoline=${!!entry.message}\n ?activated=${entry.isActive}\n >\n <span>\n <tt>${this.formatTime(entry.time)}</tt>\n ${entry.title}\n </span>\n <span slot=\"secondary\">${entry.message}</span>\n </mwc-list-item>\n </abbr>`;\n }\n\n private formatTime(time: number): string {\n const date = new Date(time);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`\n }\n\n private renderLog(): TemplateResult[] | TemplateResult {\n if (this.log.length > 0)\n return this.log.slice().reverse().map(this.renderLogEntry, this);\n else\n return html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('log.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n private renderHistory(): TemplateResult[] | TemplateResult {\n if (this.history.length > 0)\n return this.history.slice().reverse().map(e => this.renderHistoryEntry(e));\n else\n return html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('history.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n protected renderIssueEntry(issue: IssueDetail): TemplateResult {\n return html` <abbr title=\"${issue.title + '\\n' + issue.message}\"\n ><mwc-list-item ?twoline=${!!issue.message}>\n <span> ${issue.title}</span>\n <span slot=\"secondary\">${issue.message}</span>\n </mwc-list-item></abbr\n >`;\n }\n\n renderValidatorsIssues(issues: IssueDetail[]): TemplateResult[] {\n if (issues.length === 0) return [html``];\n return [\n html`\n <mwc-list-item noninteractive>\n ${getPluginName(issues[0].validatorId)}\n </mwc-list-item>\n `,\n html`<li divider padded role=\"separator\"></li>`,\n ...issues.map(issue => this.renderIssueEntry(issue)),\n ];\n }\n\n private renderIssues(): TemplateResult[] | TemplateResult {\n const issueItems: TemplateResult[] = [];\n\n this.diagnoses.forEach(issues => {\n this.renderValidatorsIssues(issues).forEach(issueItem =>\n issueItems.push(issueItem)\n );\n });\n\n return issueItems.length\n ? issueItems\n : html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('diag.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n private renderFilterButtons() {\n return (<LogEntryType[]>Object.keys(icons)).map(\n kind => html`<mwc-icon-button-toggle id=\"${kind}filter\" on\n >${getFilterIcon(kind, false)}\n ${getFilterIcon(kind, true)}</mwc-icon-button-toggle\n >`\n );\n }\n\n private renderLogDialog(): TemplateResult {\n return html` <mwc-dialog id=\"log\" heading=\"${get('log.name')}\">\n ${this.renderFilterButtons()}\n <mwc-list id=\"content\" wrapFocus>${this.renderLog()}</mwc-list>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\"\n >${get('close')}</mwc-button\n >\n </mwc-dialog>`;\n }\n\n private renderHistoryUI(): TemplateResult {\n return html` <mwc-dialog id=\"history\" heading=\"${get('history.name')}\">\n <mwc-list id=\"content\" wrapFocus>${this.renderHistory()}</mwc-list>\n <mwc-button\n icon=\"undo\"\n label=\"${get('undo')}\"\n ?disabled=${!this.editor.canUndo}\n @click=${this.undo}\n slot=\"secondaryAction\"\n ></mwc-button>\n <mwc-button\n icon=\"redo\"\n label=\"${get('redo')}\"\n ?disabled=${!this.editor.canRedo}\n @click=${this.redo}\n slot=\"secondaryAction\"\n ></mwc-button>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\"\n >${get('close')}</mwc-button\n >\n </mwc-dialog>`;\n }\n\n render(): TemplateResult {\n return html`<slot></slot>\n <style>\n #log > mwc-icon-button-toggle {\n position: absolute;\n top: 8px;\n right: 14px;\n }\n #log > mwc-icon-button-toggle:nth-child(2) {\n right: 62px;\n }\n #log > mwc-icon-button-toggle:nth-child(3) {\n right: 110px;\n }\n #log > mwc-icon-button-toggle:nth-child(4) {\n right: 158px;\n }\n #content mwc-list-item.info,\n #content mwc-list-item.warning,\n #content mwc-list-item.error {\n display: none;\n }\n #infofilter[on] ~ #content mwc-list-item.info {\n display: flex;\n }\n #warningfilter[on] ~ #content mwc-list-item.warning {\n display: flex;\n }\n #errorfilter[on] ~ #content mwc-list-item.error {\n display: flex;\n }\n\n #infofilter[on] {\n color: var(--cyan);\n }\n\n #warningfilter[on] {\n color: var(--yellow);\n }\n\n #errorfilter[on] {\n color: var(--red);\n }\n\n #actionfilter[on] {\n color: var(--blue);\n }\n\n #log,\n #history {\n --mdc-dialog-min-width: 92vw;\n }\n\n #log > #filterContainer {\n position: absolute;\n top: 14px;\n right: 14px;\n }\n </style>\n ${this.renderLogDialog()} ${this.renderHistoryUI()}\n <mwc-dialog id=\"diagnostic\" heading=\"${get('diag.name')}\">\n <filtered-list id=\"content\" wrapFocus>\n ${this.renderIssues()}\n </filtered-list>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\">\n ${get('close')}\n </mwc-button>\n </mwc-dialog>\n\n <mwc-snackbar\n id=\"info\"\n timeoutMs=\"4000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'info')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"warning\"\n timeoutMs=\"6000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'warning')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"history\"\n @click=${() => this.logUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"error\"\n timeoutMs=\"10000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'error')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"history\"\n @click=${() => this.logUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"issue\"\n timeoutMs=\"10000\"\n labelText=\"${this.latestIssue?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"rule\"\n @click=${() => this.diagnosticUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>`;\n }\n}\n\ndeclare global {\n interface ElementEventMap {\n 'history-dialog-ui': CustomEvent<HistoryUIDetail>;\n 'empty-issues': CustomEvent<EmptyIssuesDetail>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/addons/History.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EAEL,aAAa,EACb,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,sBAAsB,CAAC;AAC9B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,kCAAkC,CAAC;AAC1C,OAAO,wBAAwB,CAAC;AAIhC,OAAO,qBAAqB,CAAC;AAY7B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK9D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AASvD,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,SAAS,aAAa,CAAC,GAAW;IAEhC,IAAI,mBAAmB,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAG,CAAC,mBAAmB,EAAE;QACvB,mBAAmB,GAAG,IAAI,CAAC;KAC5B;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAa,CAAC;IAClE,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAEtE,IAAG,CAAC,YAAY,EAAE;QAChB,OAAO,mBAAmB,GAAG,OAAO,mBAAmB,EAAE,CAAC;KAC3D;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAE/B,IAAG,CAAC,IAAI,EAAC;QACP,OAAO,mBAAmB,GAAG,EAAE,CAAC;KACjC;IAED,OAAO,IAAI,CAAC;AAEd,CAAC;AAED,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,oCAAmB,CAAA;IACnB,0CAAyB,CAAA;AAC3B,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAQD,MAAM,UAAU,iBAAiB,CAC/B,IAAa,EACb,IAAmB,EACnB,aAAyD;IAEzD,OAAO,IAAI,WAAW,CAAkB,mBAAmB,EAAE;QAC3D,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,aAAa;QAChB,MAAM,EAAE;YACN,IAAI;YACJ,IAAI;YACJ,GAAG,aAAa,EAAE,MAAM;SACzB;KACF,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,aAA2D;IAE3D,OAAO,IAAI,WAAW,CAAoB,cAAc,EAAE;QACxD,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,GAAG,aAAa;QAChB,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAGM,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAoBzC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACtC,CAAC;IAYO,OAAO,CAAC,EAAc;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;;YAC/D,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAE7B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,MAAM,CAAC,MAAkB;QAC/B,MAAM,KAAK,GAAc;YACvB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACpB,MAAM,EAAE,GAAG;gBACT,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,IAAI,EAAE,IAAI,CAAC,MAAM;aAClB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEf,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,CAAC,IAAI,EAAE,CAAC;SACX;QACD,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,EAAE;YAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,wBAAwB;YAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SACrB;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,EAAY;QACxB,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;YACtB,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM;YACR,KAAK,QAAQ;gBACX,mBAAmB;gBACnB,MAAM;YACR;gBACE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACvB,MAAM;SACT;IACH,CAAC;IAEO,gBAAgB,CAAC,CAAiB;QACxC,MAAM,EAAE,GAAG;YACT,GAAG,EAAE,IAAI,CAAC,KAAK;YACf,OAAO,EAAE,IAAI,CAAC,SAAS;YACvB,UAAU,EAAE,IAAI,CAAC,YAAY;SAC9B,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI;YAAE,EAAE,CAAC,IAAI,EAAE,CAAC;;YACxB,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAEO,kBAAkB,CAAC,CAAmB;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACvD,CAAC;IAEO,cAAc,CAAC,CAAgB;QACrC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC;QAE5D,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3E,IAAI,OAAO,CAAC,GAAG,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,IAAI;gBACpB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;gBAC3B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAEO,aAAa;QACnB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAErC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,CAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAE,CAAC;QAE1C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,IAAW,CAAC,CAAC;YAErD,OAAO;gBACL,QAAQ,EAAE,KAAK,KAAK,WAAW;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK;gBACvB,OAAO;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QApJV,mEAAmE;QAEnE,QAAG,GAAgB,EAAE,CAAC;QAMtB,cAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;QAS7C,YAAO,GAAkB,EAAE,CAAC;QAkBpB,kBAAa,GAAkB,EAAE,CAAC;QAkHxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3C,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CACzB,IAAI,CAAC,aAAa,EAAE,CACrB,CACF,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACtE,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CACZ,KAAgB,EAChB,KAAa,EACb,GAAe;QAEf,OAAO,IAAI,CAAA,iBAAiB,KAAK,CAAC,KAAK;;iBAE1B,KAAK,CAAC,IAAI;;mBAER,CAAC,CAAC,KAAK,CAAC,OAAO;;;;gBAIlB,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE;YAChC,KAAK,CAAC,KAAK;;iCAEU,KAAK,CAAC,OAAO;;;2DAGa,UAAU,CACzD,KAAK,CAAC,IAAI,CACX;aACE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;;;MAGxB,CAAC;IACL,CAAC;IAED,kBAAkB,CAChB,KAAkB;QAElB,OAAO,IAAI,CAAA,iBAAiB,KAAK,CAAC,KAAK;;mBAExB,CAAC,CAAC,KAAK,CAAC,OAAO;qBACb,KAAK,CAAC,QAAQ;;;gBAGnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/B,KAAK,CAAC,KAAK;;iCAEU,KAAK,CAAC,OAAO;;YAElC,CAAC;IACX,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;IACtF,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;;YAEjE,OAAO,IAAI,CAAA;gBACD,GAAG,CAAC,iBAAiB,CAAC;;uBAEf,CAAC;IACtB,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;;YAE3E,OAAO,IAAI,CAAA;gBACD,GAAG,CAAC,qBAAqB,CAAC;;uBAEnB,CAAC;IACtB,CAAC;IAES,gBAAgB,CAAC,KAAkB;QAC3C,OAAO,IAAI,CAAA,iBAAiB,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO;iCACjC,CAAC,CAAC,KAAK,CAAC,OAAO;iBAC/B,KAAK,CAAC,KAAK;iCACK,KAAK,CAAC,OAAO;;MAExC,CAAC;IACL,CAAC;IAED,sBAAsB,CAAC,MAAqB;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAA,EAAE,CAAC,CAAC;QACzC,OAAO;YACL,IAAI,CAAA;;YAEE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;;OAEzC;YACD,IAAI,CAAA,2CAA2C;YAC/C,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SACrD,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC9B,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CACtD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,MAAM;YACtB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,IAAI,CAAA;kBACM,GAAG,CAAC,kBAAkB,CAAC;;yBAEhB,CAAC;IACxB,CAAC;IAEO,mBAAmB;QACzB,OAAwB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,GAAG,CAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA,+BAA+B,IAAI;WAC1C,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;UAC3B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;QAC3B,CACH,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAA,kCAAkC,GAAG,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,mBAAmB,EAAE;yCACO,IAAI,CAAC,SAAS,EAAE;;WAE9C,GAAG,CAAC,OAAO,CAAC;;kBAEL,CAAC;IACjB,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAA,sCAAsC,GAAG,CAAC,cAAc,CAAC;yCAC/B,IAAI,CAAC,aAAa,EAAE;;;iBAG5C,GAAG,CAAC,MAAM,CAAC;oBACR,CAAC,IAAI,CAAC,OAAO;iBAChB,IAAI,CAAC,IAAI;;;;;iBAKT,GAAG,CAAC,MAAM,CAAC;oBACR,CAAC,IAAI,CAAC,OAAO;iBAChB,IAAI,CAAC,IAAI;;;;WAIf,GAAG,CAAC,OAAO,CAAC;;kBAEL,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0DP,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;6CACX,GAAG,CAAC,WAAW,CAAC;;YAEjD,IAAI,CAAC,YAAY,EAAE;;;YAGnB,GAAG,CAAC,OAAO,CAAC;;;;;;;qBAOH,IAAI,CAAC,GAAG;aAClB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK;YACxC,GAAG,CAAC,0BAA0B,CAAC;;;;;;;qBAOlB,IAAI,CAAC,GAAG;aAClB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,KAAK;YAC3C,GAAG,CAAC,0BAA0B,CAAC;;;;;mBAKpB,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;aAC7B,GAAG,CAAC,mBAAmB,CAAC;;;;;;;qBAOhB,IAAI,CAAC,GAAG;aAClB,KAAK,EAAE;aACP,OAAO,EAAE;aACT,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK;YACzC,GAAG,CAAC,0BAA0B,CAAC;;;;;mBAKpB,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;aAC7B,GAAG,CAAC,mBAAmB,CAAC;;;;;;;qBAOhB,IAAI,CAAC,WAAW,EAAE,KAAK;YACpC,GAAG,CAAC,0BAA0B,CAAC;;;;;mBAKpB,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;aACpC,GAAG,CAAC,mBAAmB,CAAC;;;sBAGf,CAAC;IACrB,CAAC;CACF,CAAA;AA1cC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;wCACJ;AAGM;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAoB;AAG/C;IADC,QAAQ,EAAE;8CACkC;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCACR;AAGnB;IADC,KAAK,EAAE;gDACkB;AAG1B;IADC,KAAK,EAAE;4CACoB;AAUb;IAAd,KAAK,CAAC,MAAM,CAAC;0CAAgB;AACX;IAAlB,KAAK,CAAC,UAAU,CAAC;8CAAoB;AAChB;IAArB,KAAK,CAAC,aAAa,CAAC;iDAAuB;AAC3B;IAAhB,KAAK,CAAC,QAAQ,CAAC;4CAAoB;AACjB;IAAlB,KAAK,CAAC,UAAU,CAAC;8CAAsB;AACxB;IAAf,KAAK,CAAC,OAAO,CAAC;2CAAmB;AACjB;IAAhB,KAAK,CAAC,QAAQ,CAAC;4CAAoB;AAlCzB,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA6cvB;SA7cY,WAAW","sourcesContent":["import {\n html,\n state,\n property,\n query,\n TemplateResult,\n customElement,\n LitElement,\n} from 'lit-element';\n\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-icon';\nimport '@material/mwc-icon-button';\nimport '@material/mwc-icon-button-toggle';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-snackbar';\nimport { Dialog } from '@material/mwc-dialog';\nimport { Snackbar } from '@material/mwc-snackbar';\n\nimport '../filtered-list.js';\n\nimport {\n InfoDetail,\n InfoEntry,\n IssueDetail,\n IssueEvent,\n LogEntry,\n LogEntryType,\n LogEvent,\n} from '@compas-oscd/core';\n\nimport { getFilterIcon, iconColors } from '../icons/icons.js';\n\nimport { Plugin } from '../plugin.js';\nimport { XMLEditor } from '@openscd/oscd-editor';\n\nimport { getLogText } from './history/get-log-text.js';\n\ninterface HistoryItem {\n title: string;\n message?: string;\n time: number;\n isActive: boolean;\n}\n\nconst icons = {\n info: 'info',\n warning: 'warning',\n error: 'report',\n};\n\nfunction getPluginName(src: string): string {\n\n let storedPluginsString = localStorage.getItem('plugins');\n if(!storedPluginsString) {\n storedPluginsString = '[]';\n }\n\n const storedPlugins = JSON.parse(storedPluginsString) as Plugin[];\n const wantedPlugin = storedPlugins.find((p: Plugin) => p.src === src);\n\n if(!wantedPlugin) {\n return `pluginnotfound: ${src} in ${storedPluginsString}`;\n }\n\n const name = wantedPlugin.name;\n\n if(!name){\n return `pluginhasnoname:${src}`;\n }\n\n return name;\n\n}\n\nexport enum HistoryUIKind {\n log = 'log',\n history = 'history',\n diagnostic = 'diagnostic',\n}\nexport interface HistoryUIDetail {\n show: boolean;\n kind: HistoryUIKind;\n}\n\nexport type HistoryUIEvent = CustomEvent<HistoryUIDetail>;\n\nexport function newHistoryUIEvent(\n show: boolean,\n kind: HistoryUIKind,\n eventInitDict?: CustomEventInit<Partial<HistoryUIDetail>>\n): HistoryUIEvent {\n return new CustomEvent<HistoryUIDetail>('history-dialog-ui', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: {\n show,\n kind,\n ...eventInitDict?.detail,\n },\n });\n}\n\nexport interface EmptyIssuesDetail {\n pluginSrc: string;\n}\n\nexport type EmptyIssuesEvent = CustomEvent<EmptyIssuesDetail>;\n\nexport function newEmptyIssuesEvent(\n pluginSrc: string,\n eventInitDict?: CustomEventInit<Partial<EmptyIssuesDetail>>\n): EmptyIssuesEvent {\n return new CustomEvent<EmptyIssuesDetail>('empty-issues', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: { pluginSrc, ...eventInitDict?.detail },\n });\n}\n\n@customElement('oscd-history')\nexport class OscdHistory extends LitElement {\n /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */\n @property({ type: Array })\n log: InfoEntry[] = [];\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property()\n diagnoses = new Map<string, IssueDetail[]>();\n\n @property({ type: Object })\n host!: HTMLElement;\n\n @state()\n latestIssue!: IssueDetail;\n\n @state()\n history: HistoryItem[] = [];\n\n get canRedo(): boolean {\n return this.editor.future.length >= 1;\n }\n\n get canUndo(): boolean {\n return this.editor.past.length >= 1;\n }\n\n @query('#log') logUI!: Dialog;\n @query('#history') historyUI!: Dialog;\n @query('#diagnostic') diagnosticUI!: Dialog;\n @query('#error') errorUI!: Snackbar;\n @query('#warning') warningUI!: Snackbar;\n @query('#info') infoUI!: Snackbar;\n @query('#issue') issueUI!: Snackbar;\n\n private unsubscribers: (() => any)[] = [];\n\n private onIssue(de: IssueEvent): void {\n const issues = this.diagnoses.get(de.detail.validatorId);\n\n if (!issues) this.diagnoses.set(de.detail.validatorId, [de.detail]);\n else issues?.push(de.detail);\n\n this.latestIssue = de.detail;\n this.issueUI.close();\n this.issueUI.show();\n }\n\n undo(): void {\n this.editor.undo();\n }\n redo(): void {\n this.editor.redo();\n }\n\n private onReset() {\n this.log = [];\n this.diagnoses.clear();\n this.editor.past = [];\n this.editor.future = [];\n this.updateHistory();\n }\n\n private onInfo(detail: InfoDetail) {\n const entry: InfoEntry = {\n time: new Date(),\n ...detail,\n };\n\n this.log.push(entry);\n if (!this.logUI.open) {\n const ui = {\n error: this.errorUI,\n warning: this.warningUI,\n info: this.infoUI,\n }[detail.kind];\n\n ui.close();\n ui.show();\n }\n if (detail.kind == 'error') {\n this.errorUI.close(); // hack to reset timeout\n this.errorUI.show();\n }\n this.requestUpdate('log', []);\n }\n\n private onLog(le: LogEvent): void {\n switch (le.detail.kind) {\n case 'reset':\n this.onReset();\n break;\n case 'action':\n // No longer needed\n break;\n default:\n this.onInfo(le.detail);\n break;\n }\n }\n\n private historyUIHandler(e: HistoryUIEvent): void {\n const ui = {\n log: this.logUI,\n history: this.historyUI,\n diagnostic: this.diagnosticUI,\n }[e.detail.kind];\n\n if (e.detail.show) ui.show();\n else ui.close();\n }\n\n private emptyIssuesHandler(e: EmptyIssuesEvent): void {\n if (this.diagnoses.get(e.detail.pluginSrc))\n this.diagnoses.get(e.detail.pluginSrc)!.length = 0;\n }\n\n private handleKeyPress(e: KeyboardEvent): void {\n const ctrlAnd = (key: string) => e.key === key && e.ctrlKey;\n\n if (ctrlAnd('y')) this.redo();\n if (ctrlAnd('z')) this.undo();\n if (ctrlAnd('l')) this.logUI.open ? this.logUI.close() : this.logUI.show();\n if (ctrlAnd('d'))\n this.diagnosticUI.open\n ? this.diagnosticUI.close()\n : this.diagnosticUI.show();\n }\n\n private updateHistory(): void {\n const { past, future } = this.editor;\n\n const activeIndex = past.length - 1;\n const allEntries = [ ...past, ...future ];\n\n this.history = allEntries.map((e, index) => {\n const { title, message } = getLogText(e.redo as any);\n\n return {\n isActive: index === activeIndex,\n time: e.time,\n title: e.title ?? title,\n message\n };\n });\n }\n\n constructor() {\n super();\n this.undo = this.undo.bind(this);\n this.redo = this.redo.bind(this);\n this.onLog = this.onLog.bind(this);\n this.onIssue = this.onIssue.bind(this);\n this.historyUIHandler = this.historyUIHandler.bind(this);\n this.emptyIssuesHandler = this.emptyIssuesHandler.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n document.onkeydown = this.handleKeyPress;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n this.unsubscribers.push(\n this.editor.subscribe(() =>\n this.updateHistory()\n )\n );\n\n this.host.addEventListener('log', this.onLog);\n this.host.addEventListener('issue', this.onIssue);\n this.host.addEventListener('history-dialog-ui', this.historyUIHandler);\n this.host.addEventListener('empty-issues', this.emptyIssuesHandler);\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n renderLogEntry(\n entry: InfoEntry,\n index: number,\n log: LogEntry[]\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n class=\"${entry.kind}\"\n graphic=\"icon\"\n ?twoline=${!!entry.message}\n >\n <span>\n <!-- FIXME: replace tt with mwc-chip asap -->\n <tt>${entry.time?.toLocaleString()}</tt>\n ${entry.title}</span\n >\n <span slot=\"secondary\">${entry.message}</span>\n <mwc-icon\n slot=\"graphic\"\n style=\"--mdc-theme-text-icon-on-background:var(${iconColors[\n entry.kind\n ]})\"\n >${icons[entry.kind]}</mwc-icon\n >\n </mwc-list-item></abbr\n >`;\n }\n\n renderHistoryEntry(\n entry: HistoryItem\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n ?twoline=${!!entry.message}\n ?activated=${entry.isActive}\n >\n <span>\n <tt>${this.formatTime(entry.time)}</tt>\n ${entry.title}\n </span>\n <span slot=\"secondary\">${entry.message}</span>\n </mwc-list-item>\n </abbr>`;\n }\n\n private formatTime(time: number): string {\n const date = new Date(time);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`\n }\n\n private renderLog(): TemplateResult[] | TemplateResult {\n if (this.log.length > 0)\n return this.log.slice().reverse().map(this.renderLogEntry, this);\n else\n return html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('log.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n private renderHistory(): TemplateResult[] | TemplateResult {\n if (this.history.length > 0)\n return this.history.slice().reverse().map(e => this.renderHistoryEntry(e));\n else\n return html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('history.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n protected renderIssueEntry(issue: IssueDetail): TemplateResult {\n return html` <abbr title=\"${issue.title + '\\n' + issue.message}\"\n ><mwc-list-item ?twoline=${!!issue.message}>\n <span> ${issue.title}</span>\n <span slot=\"secondary\">${issue.message}</span>\n </mwc-list-item></abbr\n >`;\n }\n\n renderValidatorsIssues(issues: IssueDetail[]): TemplateResult[] {\n if (issues.length === 0) return [html``];\n return [\n html`\n <mwc-list-item noninteractive>\n ${getPluginName(issues[0].validatorId)}\n </mwc-list-item>\n `,\n html`<li divider padded role=\"separator\"></li>`,\n ...issues.map(issue => this.renderIssueEntry(issue)),\n ];\n }\n\n private renderIssues(): TemplateResult[] | TemplateResult {\n const issueItems: TemplateResult[] = [];\n\n this.diagnoses.forEach(issues => {\n this.renderValidatorsIssues(issues).forEach(issueItem =>\n issueItems.push(issueItem)\n );\n });\n\n return issueItems.length\n ? issueItems\n : html`<mwc-list-item disabled graphic=\"icon\">\n <span>${get('diag.placeholder')}</span>\n <mwc-icon slot=\"graphic\">info</mwc-icon>\n </mwc-list-item>`;\n }\n\n private renderFilterButtons() {\n return (<LogEntryType[]>Object.keys(icons)).map(\n kind => html`<mwc-icon-button-toggle id=\"${kind}filter\" on\n >${getFilterIcon(kind, false)}\n ${getFilterIcon(kind, true)}</mwc-icon-button-toggle\n >`\n );\n }\n\n private renderLogDialog(): TemplateResult {\n return html` <mwc-dialog id=\"log\" heading=\"${get('log.name')}\">\n ${this.renderFilterButtons()}\n <mwc-list id=\"content\" wrapFocus>${this.renderLog()}</mwc-list>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\"\n >${get('close')}</mwc-button\n >\n </mwc-dialog>`;\n }\n\n private renderHistoryUI(): TemplateResult {\n return html` <mwc-dialog id=\"history\" heading=\"${get('history.name')}\">\n <mwc-list id=\"content\" wrapFocus>${this.renderHistory()}</mwc-list>\n <mwc-button\n icon=\"undo\"\n label=\"${get('undo')}\"\n ?disabled=${!this.canUndo}\n @click=${this.undo}\n slot=\"secondaryAction\"\n ></mwc-button>\n <mwc-button\n icon=\"redo\"\n label=\"${get('redo')}\"\n ?disabled=${!this.canRedo}\n @click=${this.redo}\n slot=\"secondaryAction\"\n ></mwc-button>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\"\n >${get('close')}</mwc-button\n >\n </mwc-dialog>`;\n }\n\n render(): TemplateResult {\n return html`<slot></slot>\n <style>\n #log > mwc-icon-button-toggle {\n position: absolute;\n top: 8px;\n right: 14px;\n }\n #log > mwc-icon-button-toggle:nth-child(2) {\n right: 62px;\n }\n #log > mwc-icon-button-toggle:nth-child(3) {\n right: 110px;\n }\n #log > mwc-icon-button-toggle:nth-child(4) {\n right: 158px;\n }\n #content mwc-list-item.info,\n #content mwc-list-item.warning,\n #content mwc-list-item.error {\n display: none;\n }\n #infofilter[on] ~ #content mwc-list-item.info {\n display: flex;\n }\n #warningfilter[on] ~ #content mwc-list-item.warning {\n display: flex;\n }\n #errorfilter[on] ~ #content mwc-list-item.error {\n display: flex;\n }\n\n #infofilter[on] {\n color: var(--cyan);\n }\n\n #warningfilter[on] {\n color: var(--yellow);\n }\n\n #errorfilter[on] {\n color: var(--red);\n }\n\n #actionfilter[on] {\n color: var(--blue);\n }\n\n #log,\n #history {\n --mdc-dialog-min-width: 92vw;\n }\n\n #log > #filterContainer {\n position: absolute;\n top: 14px;\n right: 14px;\n }\n </style>\n ${this.renderLogDialog()} ${this.renderHistoryUI()}\n <mwc-dialog id=\"diagnostic\" heading=\"${get('diag.name')}\">\n <filtered-list id=\"content\" wrapFocus>\n ${this.renderIssues()}\n </filtered-list>\n <mwc-button slot=\"primaryAction\" dialogaction=\"close\">\n ${get('close')}\n </mwc-button>\n </mwc-dialog>\n\n <mwc-snackbar\n id=\"info\"\n timeoutMs=\"4000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'info')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"warning\"\n timeoutMs=\"6000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'warning')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"history\"\n @click=${() => this.logUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"error\"\n timeoutMs=\"10000\"\n labelText=\"${this.log\n .slice()\n .reverse()\n .find(le => le.kind === 'error')?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"history\"\n @click=${() => this.logUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>\n <mwc-snackbar\n id=\"issue\"\n timeoutMs=\"10000\"\n labelText=\"${this.latestIssue?.title ??\n get('log.snackbar.placeholder')}\"\n >\n <mwc-button\n slot=\"action\"\n icon=\"rule\"\n @click=${() => this.diagnosticUI.show()}\n >${get('log.snackbar.show')}</mwc-button\n >\n <mwc-icon-button icon=\"close\" slot=\"dismiss\"></mwc-icon-button>\n </mwc-snackbar>`;\n }\n}\n\ndeclare global {\n interface ElementEventMap {\n 'history-dialog-ui': CustomEvent<HistoryUIDetail>;\n 'empty-issues': CustomEvent<EmptyIssuesDetail>;\n }\n}\n"]}
|
package/dist/addons/Layout.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LitElement, TemplateResult } from 'lit-element';
|
|
2
|
-
import { XMLEditor } from '@
|
|
2
|
+
import { XMLEditor } from '@openscd/oscd-editor';
|
|
3
3
|
import { MenuItem, OpenSCD } from '../open-scd.js';
|
|
4
4
|
import { Plugin, ContentContext } from "../plugin.js";
|
|
5
5
|
import type { Drawer } from '@material/mwc-drawer';
|
package/dist/addons/Layout.js
CHANGED
|
@@ -120,6 +120,8 @@ let OscdLayout = class OscdLayout extends LitElement {
|
|
|
120
120
|
const middleMenu = this.generateMenu(this.middleMenu, 'middle');
|
|
121
121
|
const bottomMenu = this.generateMenu(this.bottomMenu, 'bottom');
|
|
122
122
|
const validators = this.generateValidatorMenus(this.validators);
|
|
123
|
+
const canUndo = this.editor.past.length > 0;
|
|
124
|
+
const canRedo = this.editor.future.length > 0;
|
|
123
125
|
if (middleMenu.length > 0)
|
|
124
126
|
middleMenu.push('divider');
|
|
125
127
|
if (bottomMenu.length > 0)
|
|
@@ -135,7 +137,7 @@ let OscdLayout = class OscdLayout extends LitElement {
|
|
|
135
137
|
action: () => {
|
|
136
138
|
this.editor.undo();
|
|
137
139
|
},
|
|
138
|
-
disabled: () => !
|
|
140
|
+
disabled: () => !canUndo,
|
|
139
141
|
kind: 'static',
|
|
140
142
|
content: { tag: '' },
|
|
141
143
|
},
|
|
@@ -146,7 +148,7 @@ let OscdLayout = class OscdLayout extends LitElement {
|
|
|
146
148
|
action: () => {
|
|
147
149
|
this.editor.redo();
|
|
148
150
|
},
|
|
149
|
-
disabled: () => !
|
|
151
|
+
disabled: () => !canRedo,
|
|
150
152
|
kind: 'static',
|
|
151
153
|
content: { tag: '' },
|
|
152
154
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/addons/Layout.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n customElement,\n html,\n LitElement,\n property,\n state,\n TemplateResult,\n query,\n css,\n} from 'lit-element';\nimport { get } from 'lit-translate';\nimport { classMap } from 'lit-html/directives/class-map.js';\nimport { newPendingStateEvent } from '@compas-oscd/core';\nimport { newSettingsUIEvent } from '@compas-oscd/core';\nimport { XMLEditor, OscdApi } from '@compas-oscd/core';\nimport {\n MenuItem,\n Validator,\n MenuPlugin,\n pluginIcons,\n OpenSCD\n} from '../open-scd.js';\n\nimport {\n Plugin,\n ContentContext,\n PluginKind\n} from \"../plugin.js\"\n\nimport {\n HistoryUIKind,\n newEmptyIssuesEvent,\n newHistoryUIEvent\n} from './History.js';\nimport type { Drawer } from '@material/mwc-drawer';\nimport type { ActionDetail } from '@material/mwc-list';\nimport { List } from '@material/mwc-list';\nimport type { ListItem } from '@material/mwc-list/mwc-list-item';\n\nimport '@material/mwc-drawer';\nimport '@material/mwc-list';\nimport '@material/mwc-dialog';\nimport '@material/mwc-switch';\nimport '@material/mwc-select';\nimport '@material/mwc-textfield';\nimport { pluginTag } from '../plugin-tag.js';\n\nimport {OscdPluginManager} from \"./plugin-manager/plugin-manager.js\";\nimport \"./plugin-manager/plugin-manager.js\";\nimport {OscdCustomPluginDialog} from \"./plugin-manager/custom-plugin-dialog.js\";\nimport \"./plugin-manager/custom-plugin-dialog.js\";\nimport \"./menu-tabs/menu-tabs.js\";\nimport { TabActivatedEvent } from \"./menu-tabs/menu-tabs.js\";\n\n/**\n * This is a template literal tag function. See:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates\n *\n * Passes its arguments to LitElement's `html` tag after combining the first and\n * last expressions with the first two and last two static strings.\n * Throws unless the first and last expressions are identical strings.\n *\n * We need this to get around the expression location limitations documented in\n * https://lit.dev/docs/templates/expressions/#expression-locations\n *\n * After upgrading to Lit 2 we can use their static HTML functions instead:\n * https://lit.dev/docs/api/static-html/\n */\nfunction staticTagHtml(\n oldStrings: ReadonlyArray<string>,\n ...oldArgs: unknown[]\n): TemplateResult {\n const args = [...oldArgs];\n const firstArg = args.shift();\n const lastArg = args.pop();\n\n if (firstArg !== lastArg)\n throw new Error(\n `Opening tag <${firstArg}> does not match closing tag </${lastArg}>.`\n );\n\n const strings = [...oldStrings] as string[] & { raw: string[] };\n const firstString = strings.shift();\n const secondString = strings.shift();\n\n const lastString = strings.pop();\n const penultimateString = strings.pop();\n\n strings.unshift(`${firstString}${firstArg}${secondString}`);\n strings.push(`${penultimateString}${lastArg}${lastString}`);\n\n return html(<TemplateStringsArray>strings, ...args);\n}\n\ninterface RenderAblePlugin {\n src?: string;\n kind: string;\n content?: ContentContext;\n}\n\n@customElement('oscd-layout')\nexport class OscdLayout extends LitElement {\n\n /** The `XMLDocument` to be edited */\n @property({ attribute: false }) doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** Index of the last [[`EditorAction`]] applied. */\n @property({ type: Number }) editCount = -1;\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n /** The plugins to render the layout. */\n @property({ type: Array }) plugins: Plugin[] = [];\n\n /** The open-scd host element */\n @property({ type: Object }) host!: OpenSCD;\n\n @state() validated: Promise<void> = Promise.resolve();\n @state() shouldValidate = false;\n @state() activeEditor: Plugin | undefined = this.calcActiveEditors()[0];\n\n @query('#menu') menuUI!: Drawer;\n @query('#menuContent') menuContent!: List;\n @query('#pluginManager') pluginUI!: OscdPluginManager;\n @query('#pluginList') pluginList!: List;\n @query('#pluginAdd') pluginDownloadUI!: OscdCustomPluginDialog;\n\n\n render(): TemplateResult {\n return html`\n <div\n @open-plugin-download=${() => this.pluginDownloadUI.show()}\n @oscd-activate-editor=${this.handleActivateEditorByEvent}\n @oscd-run-menu=${this.handleRunMenuByEvent}\n >\n <slot></slot>\n ${this.renderHeader()} ${this.renderAside()} ${this.renderMenuContent()}\n ${this.renderContent()} ${this.renderLanding()} ${this.renderPlugging()}\n </div>\n `;\n }\n\n protected componentHtml(strings: TemplateStringsArray, ...values: unknown[]): TemplateResult {\n return html(strings, ...values);\n }\n\n\n private renderPlugging(): TemplateResult {\n return html` ${this.renderPluginUI()} ${this.renderDownloadUI()} `;\n }\n\n private getMenuContent(src: string) {\n const tag = pluginTag(src);\n return this.menuContent.querySelector(tag);\n }\n\n /** Renders the \"Add Custom Plug-in\" UI*/\n protected renderDownloadUI(): TemplateResult {\n return html`\n <oscd-custom-plugin-dialog id=\"pluginAdd\"></oscd-custom-plugin-dialog>\n `\n }\n\n /**\n * Renders the plug-in management UI (turning plug-ins on/off)\n */\n protected renderPluginUI(): TemplateResult {\n return html`\n <oscd-plugin-manager id=\"pluginManager\" .plugins=${this.plugins}></oscd-plugin-manager>\n `\n }\n\n // Computed properties\n\n get validators(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'validator'\n );\n }\n get menuEntries(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'menu'\n );\n }\n get topMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'top');\n }\n get middleMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'middle');\n }\n get bottomMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'bottom');\n }\n\n\n get menu(): (MenuItem | 'divider')[] {\n\n const topMenu = this.generateMenu(this.topMenu, 'top');\n const middleMenu = this.generateMenu(this.middleMenu, 'middle');\n const bottomMenu = this.generateMenu(this.bottomMenu, 'bottom');\n const validators = this.generateValidatorMenus(this.validators);\n\n if (middleMenu.length > 0) middleMenu.push('divider');\n if (bottomMenu.length > 0) bottomMenu.push('divider');\n\n return [\n 'divider',\n ...topMenu,\n 'divider',\n {\n icon: 'undo',\n name: 'undo',\n actionItem: true,\n action: (): void => {\n this.editor.undo();\n },\n disabled: (): boolean => !this.editor.canUndo,\n kind: 'static',\n content: { tag: '' },\n },\n {\n icon: 'redo',\n name: 'redo',\n actionItem: true,\n action: (): void => {\n this.editor.redo();\n },\n disabled: (): boolean => !this.editor.canRedo,\n kind: 'static',\n content: { tag: '' },\n },\n ...validators,\n {\n icon: 'list',\n name: 'menu.viewLog',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.log));\n },\n kind: 'static',\n content: { tag: '' },\n },\n {\n icon: 'history',\n name: 'menu.viewHistory',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.history));\n },\n kind: 'static',\n content: { tag: '' },\n },\n {\n icon: 'rule',\n name: 'menu.viewDiag',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.diagnostic));\n },\n kind: 'static',\n content: { tag: '' },\n },\n 'divider',\n ...middleMenu,\n {\n icon: 'settings',\n name: 'settings.title',\n action: (): void => {\n this.dispatchEvent(newSettingsUIEvent(true));\n },\n kind: 'static',\n content: { tag: '' },\n },\n ...bottomMenu,\n {\n icon: 'extension',\n name: 'plugins.heading',\n action: (): void => this.pluginUI.show(),\n kind: 'static',\n content: { tag: '' },\n },\n ];\n }\n\n get editors(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'editor'\n );\n }\n\n // Keyboard Shortcuts\n private handleKeyPress(e: KeyboardEvent): void {\n // currently we only handley key shortcuts when users press ctrl\n if(!e.ctrlKey){ return }\n\n const keyFunctionMap: {[key:string]: () => void} = {\n 'm': () => this.menuUI.open = !this.menuUI.open,\n 'o': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"folder_open\"]')?.click(),\n 'O': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"create_new_folder\"]')?.click(),\n 's': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"save\"]')?.click(),\n 'P': () => this.pluginUI.show(),\n }\n\n const fn = keyFunctionMap[e.key];\n if(!fn){ return; }\n\n e.preventDefault();\n fn();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.host.addEventListener('close-drawer', async () => {\n this.menuUI.open = false;\n });\n this.host.addEventListener('validate', async () => {\n this.shouldValidate = true;\n await this.validated;\n\n if (!this.shouldValidate){ return; }\n\n this.shouldValidate = false;\n\n this.validated = Promise.allSettled(\n this.menuUI\n .querySelector('mwc-list')!\n .items.filter(item => item.className === 'validator')\n .map(item => {\n const src = item.dataset.src ?? '';\n const menuContentElement = this.getMenuContent(src);\n\n if (!menuContentElement) {\n return;\n }\n\n return (menuContentElement as unknown as Validator).validate()\n })\n ).then();\n this.dispatchEvent(newPendingStateEvent(this.validated));\n });\n this.handleKeyPress = this.handleKeyPress.bind(this);\n document.onkeydown = this.handleKeyPress;\n\n document.addEventListener(\"open-plugin-download\", () => {\n this.pluginDownloadUI.show();\n });\n }\n\n\n private generateMenu(plugins:Plugin[], kind: 'top' | 'middle' | 'bottom'): (MenuItem | 'divider')[]{\n return plugins.map(plugin => {\n return {\n icon: plugin.icon || pluginIcons['menu'],\n name: plugin.name,\n src: plugin.src,\n action: ae => {\n const menuContentElement = this.getMenuContent(plugin.src);\n if (!menuContentElement) {\n return;\n }\n\n this.dispatchEvent(newPendingStateEvent((menuContentElement as unknown as MenuPlugin).run()))\n },\n disabled: (): boolean => plugin.requireDoc! && this.doc === null,\n content: plugin.content ?? { tag: '' },\n kind: kind,\n }\n })\n }\n\n private generateValidatorMenus(plugins: Plugin[]): (MenuItem | 'divider')[] {\n return plugins.map(plugin =>{\n return {\n icon: plugin.icon || pluginIcons['validator'],\n name: plugin.name,\n src: plugin.src,\n action: ae => {\n this.dispatchEvent(newEmptyIssuesEvent(plugin.src));\n\n const menuContentElement = this.getMenuContent(plugin.src);\n if (!menuContentElement) {\n return;\n }\n\n this.dispatchEvent(newPendingStateEvent((menuContentElement as unknown as Validator).validate()))\n },\n disabled: (): boolean => this.doc === null,\n content: plugin.content ?? { tag: '' },\n kind: 'validator',\n }\n });\n }\n\n private renderMenuItem(me: MenuItem | 'divider'): TemplateResult {\n const isDivider = me === 'divider';\n const hasActionItem = me !== 'divider' && me.actionItem;\n\n if (isDivider) { return html`<li divider padded role=\"separator\"></li>`; }\n if (hasActionItem){ return html``; }\n return html`\n <mwc-list-item\n class=\"${me.kind}\"\n iconid=\"${me.icon}\"\n graphic=\"icon\"\n data-name=\"${me.name}\"\n data-src=\"${me.src ?? ''}\"\n .disabled=${me.disabled?.() || !me.action}\n ><mwc-icon slot=\"graphic\">${me.icon}</mwc-icon>\n <span>${get(me.name)}</span>\n ${me.hint\n ? html`<span slot=\"secondary\"><tt>${me.hint}</tt></span>`\n : ''}\n </mwc-list-item>\n `;\n }\n\n protected renderActionItem(me: MenuItem | 'divider'): TemplateResult {\n if(me === 'divider' || !me.actionItem){ return html`` }\n\n return html`\n <mwc-icon-button\n slot=\"actionItems\"\n icon=\"${me.icon}\"\n label=\"${me.name}\"\n ?disabled=${me.disabled?.() || !me.action}\n @click=${me.action}\n ></mwc-icon-button>`;\n }\n\n private renderEditorTab({ name, icon }: Plugin): TemplateResult {\n return html`<mwc-tab label=${name} icon=${icon || 'edit'}> </mwc-tab>`;\n }\n\n /** Renders top bar which features icon buttons for undo, redo, log, scl history and diagnostics*/\n protected renderHeader(): TemplateResult {\n return html`<mwc-top-app-bar-fixed>\n <mwc-icon-button\n icon=\"menu\"\n label=\"Menu\"\n slot=\"navigationIcon\"\n @click=${() => (this.menuUI.open = true)}\n ></mwc-icon-button>\n ${this.renderTitle()}\n ${this.renderActionItems()}\n </mwc-top-app-bar-fixed>`;\n }\n\n /**\n * Renders the title section in the top bar\n * Make sure to use slot=\"title\" for the returned template\n */\n protected renderTitle(): TemplateResult {\n return html`<div slot=\"title\" id=\"title\">${this.docName}</div>`;\n }\n\n /**\n * Renders the action items for the top bar\n * Make sure to use slot=\"actionItems\" for each element\n */\n protected renderActionItems(): TemplateResult {\n return html`${this.menu.map(this.renderActionItem)}`;\n }\n\n protected renderMenuContent(): TemplateResult {\n return html`\n <div id=\"menuContent\">\n ${\n this.menu\n .filter(p => (p as MenuItem).content)\n .map(p => this.renderPluginContent((p as MenuItem)))\n }\n </div>\n `;\n }\n\n /**\n * Renders a drawer toolbar featuring the scl filename, enabled menu plugins,\n * settings, help, scl history and plug-ins management\n */\n protected renderAside(): TemplateResult {\n\n return html`\n <mwc-drawer class=\"mdc-theme--surface\" hasheader type=\"modal\" id=\"menu\">\n <span slot=\"title\">${get('menu.title')}</span>\n ${renderTitle(this.docName)}\n <mwc-list\n wrapFocus\n @action=${makeListAction(this.menu)}\n >\n ${this.menu.map(this.renderMenuItem)}\n </mwc-list>\n </mwc-drawer>\n `;\n\n function renderTitle(docName?: string){\n if(!docName) return html``;\n\n return html`<span slot=\"subtitle\">${docName}</span>`;\n }\n\n function makeListAction(menuItems : (MenuItem|'divider')[]){\n return function listAction(ae: CustomEvent<ActionDetail>){\n //FIXME: dirty hack to be fixed in open-scd-core\n // if clause not necessary when oscd... components in open-scd not list\n if (ae.target instanceof List)\n (<MenuItem>(\n menuItems.filter(\n item => item !== 'divider' && !item.actionItem\n )[ae.detail.index]\n ))?.action?.(ae);\n }\n }\n\n\n }\n\n private calcActiveEditors(){\n const hasActiveDoc = Boolean(this.doc);\n\n return this.editors\n .filter(editor => {\n // this is necessary because `requireDoc` can be undefined\n // and that is not the same as false\n const doesNotRequireDoc = editor.requireDoc === false\n return doesNotRequireDoc || hasActiveDoc\n })\n }\n\n /** Renders the enabled editor plugins and a tab bar to switch between them*/\n protected renderContent(): TemplateResult {\n\n const activeEditors = this.calcActiveEditors()\n .map(this.renderEditorTab)\n\n const hasActiveEditors = activeEditors.length > 0;\n if(!hasActiveEditors){ return html``; }\n\n const renderEditorContent = (doc: XMLDocument | null, activeEditor?: Plugin) => {\n const editor = activeEditor;\n const requireDoc = editor?.requireDoc\n if(requireDoc && !doc) { return html`` }\n\n const tag = editor?.content?.tag;\n if(!tag) { return html`` }\n\n return this.renderPluginContent(editor);\n }\n\n return html`\n <oscd-menu-tabs\n .editors=${this.calcActiveEditors()}\n .activeEditor=${this.activeEditor}\n @oscd-editor-tab-activated=${this.handleEditorTabActivated}\n >\n </oscd-menu-tabs>\n ${renderEditorContent(this.doc, this.activeEditor, )}\n `;\n }\n\n private handleEditorTabActivated(e: TabActivatedEvent){\n this.activeEditor = e.detail.editor\n }\n\n private handleActivateEditorByEvent(e: CustomEvent<{name: string, src: string}>): void {\n const {name, src} = e.detail;\n const editors = this.calcActiveEditors()\n const wantedEditor = editors.find(editor => editor.name === name || editor.src === src)\n if(!wantedEditor){ return; } // TODO: log error\n\n this.activeEditor = wantedEditor;\n }\n\n private handleRunMenuByEvent(e: CustomEvent<{name: string}>): void {\n\n // TODO: this is a workaround, fix it\n this.menuUI.open = true;\n const menuEntry = this.menuUI.querySelector(`[data-name=\"${e.detail.name}\"]`) as HTMLElement\n\n const menuContentElement = this.getMenuContent(menuEntry.dataset.src ?? '');\n if (!menuContentElement) {\n return;\n }\n\n (menuContentElement as unknown as MenuPlugin).run();\n }\n\n /**\n * Renders the landing buttons (open project and new project)\n * it no document loaded we display the menu item that are in the position\n * 'top' and are not disabled\n *\n * To enable replacement of this part we have to convert it to either an addon\n * or a plugin\n */\n protected renderLanding(): TemplateResult {\n if(this.doc){ return html``; }\n\n return html`\n <div class=\"landing\">\n ${renderMenuItems(this.menu, this.menuUI)}\n </div>`\n\n function renderMenuItems(menuItemsAndDividers: (MenuItem | 'divider')[], menuUI: Drawer){\n\n const menuItems = menuItemsAndDividers.filter(mi => mi !== 'divider') as MenuItem[];\n\n return menuItems.map((mi: MenuItem, index) => {\n if(mi.kind !== 'top' || mi.disabled?.()) { return html``; }\n\n return html`\n <mwc-icon-button\n class=\"landing_icon\"\n icon=\"${mi.icon}\"\n @click=\"${() => clickListItem(index)}\"\n >\n <div class=\"landing_label\">${mi.name}</div>\n </mwc-icon-button>\n `\n })\n\n function clickListItem(index:number) {\n const listItem = menuUI.querySelector('mwc-list')!.items[index];\n listItem.click();\n }\n\n }\n }\n\n protected renderPluginContent(plugin: RenderAblePlugin): TemplateResult {\n const tag = plugin.content?.tag ?? '';\n\n if (!tag) {\n return html``;\n }\n\n const osdcApi = new OscdApi(tag);\n return staticTagHtml`<${tag}\n .doc=${this.doc}\n .docName=${this.docName}\n .editCount=${this.editCount}\n .plugins=${this.host.storedPlugins}\n .docId=${this.host.docId}\n .pluginId=${plugin.src}\n .nsdoc=${this.host.nsdoc}\n .docs=${this.host.docs}\n .locale=${this.host.locale}\n .oscdApi=${osdcApi}\n .editor=${this.editor}\n class=\"${classMap({\n plugin: true,\n menu: plugin.kind === 'menu',\n validator: plugin.kind === 'validator',\n editor: plugin.kind === 'editor',\n })}\"\n ></${tag}>`\n }\n\n\n\n\n static styles = css`\n mwc-drawer {\n position: absolute;\n top: 0;\n }\n\n mwc-top-app-bar-fixed {\n --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);\n } /* hack to fix disabled icon buttons rendering black */\n\n mwc-tab {\n background-color: var(--primary);\n --mdc-theme-primary: var(--mdc-theme-on-primary);\n }\n\n input[type='file'] {\n display: none;\n }\n\n mwc-dialog {\n --mdc-dialog-max-width: 98vw;\n }\n\n mwc-dialog > form {\n display: flex;\n flex-direction: column;\n }\n\n mwc-dialog > form > * {\n display: block;\n margin-top: 16px;\n }\n\n mwc-linear-progress {\n position: fixed;\n --mdc-linear-progress-buffer-color: var(--primary);\n --mdc-theme-primary: var(--secondary);\n left: 0px;\n top: 0px;\n width: 100%;\n pointer-events: none;\n z-index: 1000;\n }\n\n tt {\n font-family: 'Roboto Mono', monospace;\n font-weight: 300;\n }\n\n #menuContent {\n height: 0px;\n }\n\n .landing {\n position: absolute;\n text-align: center;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n }\n\n .landing_icon:hover {\n box-shadow: 0 12px 17px 2px rgba(0, 0, 0, 0.14),\n 0 5px 22px 4px rgba(0, 0, 0, 0.12), 0 7px 8px -4px rgba(0, 0, 0, 0.2);\n }\n\n .landing_icon {\n margin: 12px;\n border-radius: 16px;\n width: 160px;\n height: 140px;\n text-align: center;\n color: var(--mdc-theme-on-secondary);\n background: var(--secondary);\n --mdc-icon-button-size: 100px;\n --mdc-icon-size: 100px;\n --mdc-ripple-color: rgba(0, 0, 0, 0);\n box-shadow: rgb(0 0 0 / 14%) 0px 6px 10px 0px,\n rgb(0 0 0 / 12%) 0px 1px 18px 0px, rgb(0 0 0 / 20%) 0px 3px 5px -1px;\n transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .landing_label {\n width: 160px;\n height: 50px;\n margin-top: 100px;\n margin-left: -30px;\n font-family: 'Roboto', sans-serif;\n }\n\n .plugin.menu {\n display: flex;\n }\n\n .plugin.validator {\n display: flex;\n }\n `;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/addons/Layout.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n customElement,\n html,\n LitElement,\n property,\n state,\n TemplateResult,\n query,\n css,\n} from 'lit-element';\nimport { get } from 'lit-translate';\nimport { classMap } from 'lit-html/directives/class-map.js';\nimport { newPendingStateEvent } from '@compas-oscd/core';\nimport { newSettingsUIEvent } from '@compas-oscd/core';\nimport { OscdApi } from '@compas-oscd/core';\nimport { XMLEditor } from '@openscd/oscd-editor';\nimport {\n MenuItem,\n Validator,\n MenuPlugin,\n pluginIcons,\n OpenSCD\n} from '../open-scd.js';\n\nimport {\n Plugin,\n ContentContext,\n PluginKind\n} from \"../plugin.js\"\n\nimport {\n HistoryUIKind,\n newEmptyIssuesEvent,\n newHistoryUIEvent\n} from './History.js';\nimport type { Drawer } from '@material/mwc-drawer';\nimport type { ActionDetail } from '@material/mwc-list';\nimport { List } from '@material/mwc-list';\nimport type { ListItem } from '@material/mwc-list/mwc-list-item';\n\nimport '@material/mwc-drawer';\nimport '@material/mwc-list';\nimport '@material/mwc-dialog';\nimport '@material/mwc-switch';\nimport '@material/mwc-select';\nimport '@material/mwc-textfield';\nimport { pluginTag } from '../plugin-tag.js';\n\nimport {OscdPluginManager} from \"./plugin-manager/plugin-manager.js\";\nimport \"./plugin-manager/plugin-manager.js\";\nimport {OscdCustomPluginDialog} from \"./plugin-manager/custom-plugin-dialog.js\";\nimport \"./plugin-manager/custom-plugin-dialog.js\";\nimport \"./menu-tabs/menu-tabs.js\";\nimport { TabActivatedEvent } from \"./menu-tabs/menu-tabs.js\";\n\n/**\n * This is a template literal tag function. See:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates\n *\n * Passes its arguments to LitElement's `html` tag after combining the first and\n * last expressions with the first two and last two static strings.\n * Throws unless the first and last expressions are identical strings.\n *\n * We need this to get around the expression location limitations documented in\n * https://lit.dev/docs/templates/expressions/#expression-locations\n *\n * After upgrading to Lit 2 we can use their static HTML functions instead:\n * https://lit.dev/docs/api/static-html/\n */\nfunction staticTagHtml(\n oldStrings: ReadonlyArray<string>,\n ...oldArgs: unknown[]\n): TemplateResult {\n const args = [...oldArgs];\n const firstArg = args.shift();\n const lastArg = args.pop();\n\n if (firstArg !== lastArg)\n throw new Error(\n `Opening tag <${firstArg}> does not match closing tag </${lastArg}>.`\n );\n\n const strings = [...oldStrings] as string[] & { raw: string[] };\n const firstString = strings.shift();\n const secondString = strings.shift();\n\n const lastString = strings.pop();\n const penultimateString = strings.pop();\n\n strings.unshift(`${firstString}${firstArg}${secondString}`);\n strings.push(`${penultimateString}${lastArg}${lastString}`);\n\n return html(<TemplateStringsArray>strings, ...args);\n}\n\ninterface RenderAblePlugin {\n src?: string;\n kind: string;\n content?: ContentContext;\n}\n\n@customElement('oscd-layout')\nexport class OscdLayout extends LitElement {\n\n /** The `XMLDocument` to be edited */\n @property({ attribute: false }) doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** Index of the last [[`EditorAction`]] applied. */\n @property({ type: Number }) editCount = -1;\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n /** The plugins to render the layout. */\n @property({ type: Array }) plugins: Plugin[] = [];\n\n /** The open-scd host element */\n @property({ type: Object }) host!: OpenSCD;\n\n @state() validated: Promise<void> = Promise.resolve();\n @state() shouldValidate = false;\n @state() activeEditor: Plugin | undefined = this.calcActiveEditors()[0];\n\n @query('#menu') menuUI!: Drawer;\n @query('#menuContent') menuContent!: List;\n @query('#pluginManager') pluginUI!: OscdPluginManager;\n @query('#pluginList') pluginList!: List;\n @query('#pluginAdd') pluginDownloadUI!: OscdCustomPluginDialog;\n\n\n render(): TemplateResult {\n return html`\n <div\n @open-plugin-download=${() => this.pluginDownloadUI.show()}\n @oscd-activate-editor=${this.handleActivateEditorByEvent}\n @oscd-run-menu=${this.handleRunMenuByEvent}\n >\n <slot></slot>\n ${this.renderHeader()} ${this.renderAside()} ${this.renderMenuContent()}\n ${this.renderContent()} ${this.renderLanding()} ${this.renderPlugging()}\n </div>\n `;\n }\n\n protected componentHtml(strings: TemplateStringsArray, ...values: unknown[]): TemplateResult {\n return html(strings, ...values);\n }\n\n\n private renderPlugging(): TemplateResult {\n return html` ${this.renderPluginUI()} ${this.renderDownloadUI()} `;\n }\n\n private getMenuContent(src: string) {\n const tag = pluginTag(src);\n return this.menuContent.querySelector(tag);\n }\n\n /** Renders the \"Add Custom Plug-in\" UI*/\n protected renderDownloadUI(): TemplateResult {\n return html`\n <oscd-custom-plugin-dialog id=\"pluginAdd\"></oscd-custom-plugin-dialog>\n `\n }\n\n /**\n * Renders the plug-in management UI (turning plug-ins on/off)\n */\n protected renderPluginUI(): TemplateResult {\n return html`\n <oscd-plugin-manager id=\"pluginManager\" .plugins=${this.plugins}></oscd-plugin-manager>\n `\n }\n\n // Computed properties\n\n get validators(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'validator'\n );\n }\n get menuEntries(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'menu'\n );\n }\n get topMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'top');\n }\n get middleMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'middle');\n }\n get bottomMenu(): Plugin[] {\n return this.menuEntries.filter(plugin => plugin.position === 'bottom');\n }\n\n\n get menu(): (MenuItem | 'divider')[] {\n\n const topMenu = this.generateMenu(this.topMenu, 'top');\n const middleMenu = this.generateMenu(this.middleMenu, 'middle');\n const bottomMenu = this.generateMenu(this.bottomMenu, 'bottom');\n const validators = this.generateValidatorMenus(this.validators);\n const canUndo = this.editor.past.length > 0;\n const canRedo = this.editor.future.length > 0;\n\n if (middleMenu.length > 0) middleMenu.push('divider');\n if (bottomMenu.length > 0) bottomMenu.push('divider');\n\n return [\n 'divider',\n ...topMenu,\n 'divider',\n {\n icon: 'undo',\n name: 'undo',\n actionItem: true,\n action: (): void => {\n this.editor.undo();\n },\n disabled: (): boolean => !canUndo,\n kind: 'static',\n content: { tag: '' },\n },\n {\n icon: 'redo',\n name: 'redo',\n actionItem: true,\n action: (): void => {\n this.editor.redo();\n },\n disabled: (): boolean => !canRedo,\n kind: 'static',\n content: { tag: '' },\n },\n ...validators,\n {\n icon: 'list',\n name: 'menu.viewLog',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.log));\n },\n kind: 'static',\n content: { tag: '' },\n },\n {\n icon: 'history',\n name: 'menu.viewHistory',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.history));\n },\n kind: 'static',\n content: { tag: '' },\n },\n {\n icon: 'rule',\n name: 'menu.viewDiag',\n actionItem: true,\n action: (): void => {\n this.dispatchEvent(newHistoryUIEvent(true, HistoryUIKind.diagnostic));\n },\n kind: 'static',\n content: { tag: '' },\n },\n 'divider',\n ...middleMenu,\n {\n icon: 'settings',\n name: 'settings.title',\n action: (): void => {\n this.dispatchEvent(newSettingsUIEvent(true));\n },\n kind: 'static',\n content: { tag: '' },\n },\n ...bottomMenu,\n {\n icon: 'extension',\n name: 'plugins.heading',\n action: (): void => this.pluginUI.show(),\n kind: 'static',\n content: { tag: '' },\n },\n ];\n }\n\n get editors(): Plugin[] {\n return this.plugins.filter(\n plugin => plugin.active && plugin.kind === 'editor'\n );\n }\n\n // Keyboard Shortcuts\n private handleKeyPress(e: KeyboardEvent): void {\n // currently we only handley key shortcuts when users press ctrl\n if(!e.ctrlKey){ return }\n\n const keyFunctionMap: {[key:string]: () => void} = {\n 'm': () => this.menuUI.open = !this.menuUI.open,\n 'o': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"folder_open\"]')?.click(),\n 'O': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"create_new_folder\"]')?.click(),\n 's': () => this.menuUI.querySelector<ListItem>('mwc-list-item[iconid=\"save\"]')?.click(),\n 'P': () => this.pluginUI.show(),\n }\n\n const fn = keyFunctionMap[e.key];\n if(!fn){ return; }\n\n e.preventDefault();\n fn();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.host.addEventListener('close-drawer', async () => {\n this.menuUI.open = false;\n });\n this.host.addEventListener('validate', async () => {\n this.shouldValidate = true;\n await this.validated;\n\n if (!this.shouldValidate){ return; }\n\n this.shouldValidate = false;\n\n this.validated = Promise.allSettled(\n this.menuUI\n .querySelector('mwc-list')!\n .items.filter(item => item.className === 'validator')\n .map(item => {\n const src = item.dataset.src ?? '';\n const menuContentElement = this.getMenuContent(src);\n\n if (!menuContentElement) {\n return;\n }\n\n return (menuContentElement as unknown as Validator).validate()\n })\n ).then();\n this.dispatchEvent(newPendingStateEvent(this.validated));\n });\n this.handleKeyPress = this.handleKeyPress.bind(this);\n document.onkeydown = this.handleKeyPress;\n\n document.addEventListener(\"open-plugin-download\", () => {\n this.pluginDownloadUI.show();\n });\n }\n\n\n private generateMenu(plugins:Plugin[], kind: 'top' | 'middle' | 'bottom'): (MenuItem | 'divider')[]{\n return plugins.map(plugin => {\n return {\n icon: plugin.icon || pluginIcons['menu'],\n name: plugin.name,\n src: plugin.src,\n action: ae => {\n const menuContentElement = this.getMenuContent(plugin.src);\n if (!menuContentElement) {\n return;\n }\n\n this.dispatchEvent(newPendingStateEvent((menuContentElement as unknown as MenuPlugin).run()))\n },\n disabled: (): boolean => plugin.requireDoc! && this.doc === null,\n content: plugin.content ?? { tag: '' },\n kind: kind,\n }\n })\n }\n\n private generateValidatorMenus(plugins: Plugin[]): (MenuItem | 'divider')[] {\n return plugins.map(plugin =>{\n return {\n icon: plugin.icon || pluginIcons['validator'],\n name: plugin.name,\n src: plugin.src,\n action: ae => {\n this.dispatchEvent(newEmptyIssuesEvent(plugin.src));\n\n const menuContentElement = this.getMenuContent(plugin.src);\n if (!menuContentElement) {\n return;\n }\n\n this.dispatchEvent(newPendingStateEvent((menuContentElement as unknown as Validator).validate()))\n },\n disabled: (): boolean => this.doc === null,\n content: plugin.content ?? { tag: '' },\n kind: 'validator',\n }\n });\n }\n\n private renderMenuItem(me: MenuItem | 'divider'): TemplateResult {\n const isDivider = me === 'divider';\n const hasActionItem = me !== 'divider' && me.actionItem;\n\n if (isDivider) { return html`<li divider padded role=\"separator\"></li>`; }\n if (hasActionItem){ return html``; }\n return html`\n <mwc-list-item\n class=\"${me.kind}\"\n iconid=\"${me.icon}\"\n graphic=\"icon\"\n data-name=\"${me.name}\"\n data-src=\"${me.src ?? ''}\"\n .disabled=${me.disabled?.() || !me.action}\n ><mwc-icon slot=\"graphic\">${me.icon}</mwc-icon>\n <span>${get(me.name)}</span>\n ${me.hint\n ? html`<span slot=\"secondary\"><tt>${me.hint}</tt></span>`\n : ''}\n </mwc-list-item>\n `;\n }\n\n protected renderActionItem(me: MenuItem | 'divider'): TemplateResult {\n if(me === 'divider' || !me.actionItem){ return html`` }\n\n return html`\n <mwc-icon-button\n slot=\"actionItems\"\n icon=\"${me.icon}\"\n label=\"${me.name}\"\n ?disabled=${me.disabled?.() || !me.action}\n @click=${me.action}\n ></mwc-icon-button>`;\n }\n\n private renderEditorTab({ name, icon }: Plugin): TemplateResult {\n return html`<mwc-tab label=${name} icon=${icon || 'edit'}> </mwc-tab>`;\n }\n\n /** Renders top bar which features icon buttons for undo, redo, log, scl history and diagnostics*/\n protected renderHeader(): TemplateResult {\n return html`<mwc-top-app-bar-fixed>\n <mwc-icon-button\n icon=\"menu\"\n label=\"Menu\"\n slot=\"navigationIcon\"\n @click=${() => (this.menuUI.open = true)}\n ></mwc-icon-button>\n ${this.renderTitle()}\n ${this.renderActionItems()}\n </mwc-top-app-bar-fixed>`;\n }\n\n /**\n * Renders the title section in the top bar\n * Make sure to use slot=\"title\" for the returned template\n */\n protected renderTitle(): TemplateResult {\n return html`<div slot=\"title\" id=\"title\">${this.docName}</div>`;\n }\n\n /**\n * Renders the action items for the top bar\n * Make sure to use slot=\"actionItems\" for each element\n */\n protected renderActionItems(): TemplateResult {\n return html`${this.menu.map(this.renderActionItem)}`;\n }\n\n protected renderMenuContent(): TemplateResult {\n return html`\n <div id=\"menuContent\">\n ${\n this.menu\n .filter(p => (p as MenuItem).content)\n .map(p => this.renderPluginContent((p as MenuItem)))\n }\n </div>\n `;\n }\n\n /**\n * Renders a drawer toolbar featuring the scl filename, enabled menu plugins,\n * settings, help, scl history and plug-ins management\n */\n protected renderAside(): TemplateResult {\n\n return html`\n <mwc-drawer class=\"mdc-theme--surface\" hasheader type=\"modal\" id=\"menu\">\n <span slot=\"title\">${get('menu.title')}</span>\n ${renderTitle(this.docName)}\n <mwc-list\n wrapFocus\n @action=${makeListAction(this.menu)}\n >\n ${this.menu.map(this.renderMenuItem)}\n </mwc-list>\n </mwc-drawer>\n `;\n\n function renderTitle(docName?: string){\n if(!docName) return html``;\n\n return html`<span slot=\"subtitle\">${docName}</span>`;\n }\n\n function makeListAction(menuItems : (MenuItem|'divider')[]){\n return function listAction(ae: CustomEvent<ActionDetail>){\n //FIXME: dirty hack to be fixed in open-scd-core\n // if clause not necessary when oscd... components in open-scd not list\n if (ae.target instanceof List)\n (<MenuItem>(\n menuItems.filter(\n item => item !== 'divider' && !item.actionItem\n )[ae.detail.index]\n ))?.action?.(ae);\n }\n }\n\n\n }\n\n private calcActiveEditors(){\n const hasActiveDoc = Boolean(this.doc);\n\n return this.editors\n .filter(editor => {\n // this is necessary because `requireDoc` can be undefined\n // and that is not the same as false\n const doesNotRequireDoc = editor.requireDoc === false\n return doesNotRequireDoc || hasActiveDoc\n })\n }\n\n /** Renders the enabled editor plugins and a tab bar to switch between them*/\n protected renderContent(): TemplateResult {\n\n const activeEditors = this.calcActiveEditors()\n .map(this.renderEditorTab)\n\n const hasActiveEditors = activeEditors.length > 0;\n if(!hasActiveEditors){ return html``; }\n\n const renderEditorContent = (doc: XMLDocument | null, activeEditor?: Plugin) => {\n const editor = activeEditor;\n const requireDoc = editor?.requireDoc\n if(requireDoc && !doc) { return html`` }\n\n const tag = editor?.content?.tag;\n if(!tag) { return html`` }\n\n return this.renderPluginContent(editor);\n }\n\n return html`\n <oscd-menu-tabs\n .editors=${this.calcActiveEditors()}\n .activeEditor=${this.activeEditor}\n @oscd-editor-tab-activated=${this.handleEditorTabActivated}\n >\n </oscd-menu-tabs>\n ${renderEditorContent(this.doc, this.activeEditor, )}\n `;\n }\n\n private handleEditorTabActivated(e: TabActivatedEvent){\n this.activeEditor = e.detail.editor\n }\n\n private handleActivateEditorByEvent(e: CustomEvent<{name: string, src: string}>): void {\n const {name, src} = e.detail;\n const editors = this.calcActiveEditors()\n const wantedEditor = editors.find(editor => editor.name === name || editor.src === src)\n if(!wantedEditor){ return; } // TODO: log error\n\n this.activeEditor = wantedEditor;\n }\n\n private handleRunMenuByEvent(e: CustomEvent<{name: string}>): void {\n\n // TODO: this is a workaround, fix it\n this.menuUI.open = true;\n const menuEntry = this.menuUI.querySelector(`[data-name=\"${e.detail.name}\"]`) as HTMLElement\n\n const menuContentElement = this.getMenuContent(menuEntry.dataset.src ?? '');\n if (!menuContentElement) {\n return;\n }\n\n (menuContentElement as unknown as MenuPlugin).run();\n }\n\n /**\n * Renders the landing buttons (open project and new project)\n * it no document loaded we display the menu item that are in the position\n * 'top' and are not disabled\n *\n * To enable replacement of this part we have to convert it to either an addon\n * or a plugin\n */\n protected renderLanding(): TemplateResult {\n if(this.doc){ return html``; }\n\n return html`\n <div class=\"landing\">\n ${renderMenuItems(this.menu, this.menuUI)}\n </div>`\n\n function renderMenuItems(menuItemsAndDividers: (MenuItem | 'divider')[], menuUI: Drawer){\n\n const menuItems = menuItemsAndDividers.filter(mi => mi !== 'divider') as MenuItem[];\n\n return menuItems.map((mi: MenuItem, index) => {\n if(mi.kind !== 'top' || mi.disabled?.()) { return html``; }\n\n return html`\n <mwc-icon-button\n class=\"landing_icon\"\n icon=\"${mi.icon}\"\n @click=\"${() => clickListItem(index)}\"\n >\n <div class=\"landing_label\">${mi.name}</div>\n </mwc-icon-button>\n `\n })\n\n function clickListItem(index:number) {\n const listItem = menuUI.querySelector('mwc-list')!.items[index];\n listItem.click();\n }\n\n }\n }\n\n protected renderPluginContent(plugin: RenderAblePlugin): TemplateResult {\n const tag = plugin.content?.tag ?? '';\n\n if (!tag) {\n return html``;\n }\n\n const osdcApi = new OscdApi(tag);\n return staticTagHtml`<${tag}\n .doc=${this.doc}\n .docName=${this.docName}\n .editCount=${this.editCount}\n .plugins=${this.host.storedPlugins}\n .docId=${this.host.docId}\n .pluginId=${plugin.src}\n .nsdoc=${this.host.nsdoc}\n .docs=${this.host.docs}\n .locale=${this.host.locale}\n .oscdApi=${osdcApi}\n .editor=${this.editor}\n class=\"${classMap({\n plugin: true,\n menu: plugin.kind === 'menu',\n validator: plugin.kind === 'validator',\n editor: plugin.kind === 'editor',\n })}\"\n ></${tag}>`\n }\n\n\n\n\n static styles = css`\n mwc-drawer {\n position: absolute;\n top: 0;\n }\n\n mwc-top-app-bar-fixed {\n --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);\n } /* hack to fix disabled icon buttons rendering black */\n\n mwc-tab {\n background-color: var(--primary);\n --mdc-theme-primary: var(--mdc-theme-on-primary);\n }\n\n input[type='file'] {\n display: none;\n }\n\n mwc-dialog {\n --mdc-dialog-max-width: 98vw;\n }\n\n mwc-dialog > form {\n display: flex;\n flex-direction: column;\n }\n\n mwc-dialog > form > * {\n display: block;\n margin-top: 16px;\n }\n\n mwc-linear-progress {\n position: fixed;\n --mdc-linear-progress-buffer-color: var(--primary);\n --mdc-theme-primary: var(--secondary);\n left: 0px;\n top: 0px;\n width: 100%;\n pointer-events: none;\n z-index: 1000;\n }\n\n tt {\n font-family: 'Roboto Mono', monospace;\n font-weight: 300;\n }\n\n #menuContent {\n height: 0px;\n }\n\n .landing {\n position: absolute;\n text-align: center;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n }\n\n .landing_icon:hover {\n box-shadow: 0 12px 17px 2px rgba(0, 0, 0, 0.14),\n 0 5px 22px 4px rgba(0, 0, 0, 0.12), 0 7px 8px -4px rgba(0, 0, 0, 0.2);\n }\n\n .landing_icon {\n margin: 12px;\n border-radius: 16px;\n width: 160px;\n height: 140px;\n text-align: center;\n color: var(--mdc-theme-on-secondary);\n background: var(--secondary);\n --mdc-icon-button-size: 100px;\n --mdc-icon-size: 100px;\n --mdc-ripple-color: rgba(0, 0, 0, 0);\n box-shadow: rgb(0 0 0 / 14%) 0px 6px 10px 0px,\n rgb(0 0 0 / 12%) 0px 1px 18px 0px, rgb(0 0 0 / 20%) 0px 3px 5px -1px;\n transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .landing_label {\n width: 160px;\n height: 50px;\n margin-top: 100px;\n margin-left: -30px;\n font-family: 'Roboto', sans-serif;\n }\n\n .plugin.menu {\n display: flex;\n }\n\n .plugin.validator {\n display: flex;\n }\n `;\n}\n"]}
|
package/dist/open-scd.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ import '@material/mwc-list/mwc-radio-list-item';
|
|
|
16
16
|
import '@material/mwc-select';
|
|
17
17
|
import '@material/mwc-switch';
|
|
18
18
|
import '@material/mwc-textfield';
|
|
19
|
+
import { XMLEditor } from '@openscd/oscd-editor';
|
|
19
20
|
import './addons/Settings.js';
|
|
20
21
|
import './addons/Waiter.js';
|
|
21
22
|
import './addons/Wizards.js';
|
|
@@ -25,7 +26,6 @@ import './addons/Layout.js';
|
|
|
25
26
|
import { ActionDetail } from '@material/mwc-list';
|
|
26
27
|
import { Nsdoc } from './foundation/nsdoc.js';
|
|
27
28
|
import type { PluginSet, Plugin as CorePlugin } from '@compas-oscd/core';
|
|
28
|
-
import { XMLEditor } from '@compas-oscd/core';
|
|
29
29
|
import { MenuPosition, PluginKind, Plugin, ContentContext } from "./plugin.js";
|
|
30
30
|
import { ConfigurePluginEvent } from './plugin.events.js';
|
|
31
31
|
export declare class OpenSCD extends LitElement {
|
package/dist/open-scd.js
CHANGED
|
@@ -17,6 +17,7 @@ import '@material/mwc-list/mwc-radio-list-item';
|
|
|
17
17
|
import '@material/mwc-select';
|
|
18
18
|
import '@material/mwc-switch';
|
|
19
19
|
import '@material/mwc-textfield';
|
|
20
|
+
import { XMLEditor } from '@openscd/oscd-editor';
|
|
20
21
|
import { newOpenDocEvent } from '@compas-oscd/core';
|
|
21
22
|
import { newPendingStateEvent } from '@compas-oscd/core';
|
|
22
23
|
import './addons/Settings.js';
|
|
@@ -27,7 +28,6 @@ import './addons/History.js';
|
|
|
27
28
|
import './addons/Layout.js';
|
|
28
29
|
import { officialPlugins as builtinPlugins } from './plugins.js';
|
|
29
30
|
import { initializeNsdoc } from './foundation/nsdoc.js';
|
|
30
|
-
import { XMLEditor } from '@compas-oscd/core';
|
|
31
31
|
import { newConfigurePluginEvent } from './plugin.events.js';
|
|
32
32
|
import { newLogEvent } from '@compas-oscd/core';
|
|
33
33
|
import { pluginTag } from './plugin-tag.js';
|
|
@@ -148,7 +148,7 @@ export class OpenSCD extends LitElement {
|
|
|
148
148
|
connectedCallback() {
|
|
149
149
|
super.connectedCallback();
|
|
150
150
|
this.loadPlugins();
|
|
151
|
-
this.unsubscribers.push(this.editor.subscribe(
|
|
151
|
+
this.unsubscribers.push(this.editor.subscribe(() => this.editCount++));
|
|
152
152
|
// TODO: let Lit handle the event listeners, move to render()
|
|
153
153
|
this.addEventListener('reset-plugins', this.resetPlugins);
|
|
154
154
|
}
|
package/dist/open-scd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-scd.js","sourceRoot":"","sources":["../src/open-scd.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n LitElement,\n property,\n state,\n TemplateResult,\n} from 'lit-element';\n\nimport '@material/mwc-icon';\nimport '@material/mwc-icon-button';\nimport '@material/mwc-linear-progress';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-tab';\nimport '@material/mwc-tab-bar';\nimport '@material/mwc-top-app-bar-fixed';\nimport '@material/mwc-drawer';\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-formfield';\nimport '@material/mwc-list/mwc-check-list-item';\nimport '@material/mwc-list/mwc-radio-list-item';\nimport '@material/mwc-select';\nimport '@material/mwc-switch';\nimport '@material/mwc-textfield';\n\nimport { newOpenDocEvent } from '@compas-oscd/core';\nimport { newPendingStateEvent } from '@compas-oscd/core';\n\nimport './addons/Settings.js';\nimport './addons/Waiter.js';\nimport './addons/Wizards.js';\nimport './addons/Editor.js';\nimport './addons/History.js';\nimport './addons/Layout.js';\n\nimport { ActionDetail } from '@material/mwc-list';\n\nimport { officialPlugins as builtinPlugins } from './plugins.js';\nimport { initializeNsdoc, Nsdoc } from './foundation/nsdoc.js';\nimport type {\n PluginSet,\n Plugin as CorePlugin,\n EditCompletedEvent,\n} from '@compas-oscd/core';\nimport { OscdApi, XMLEditor } from '@compas-oscd/core';\n\nimport { InstalledOfficialPlugin, MenuPosition, PluginKind, Plugin, ContentContext } from \"./plugin.js\"\nimport { ConfigurePluginEvent, ConfigurePluginDetail, newConfigurePluginEvent } from './plugin.events.js';\nimport { newLogEvent } from '@compas-oscd/core';\nimport { pluginTag } from './plugin-tag.js';\n\n\n\nexport class OpenSCD extends LitElement {\n\n render(): TemplateResult {\n return html`<oscd-waiter>\n <oscd-settings .host=${this}>\n <oscd-wizards .host=${this}>\n <oscd-history\n .host=${this}\n .editor=${this.editor}\n >\n <oscd-editor\n .doc=${this.doc}\n .docName=${this.docName}\n .docId=${this.docId}\n .host=${this}\n .editCount=${this.editCount}\n .editor=${this.editor}\n >\n <oscd-layout\n @add-external-plugin=${this.handleAddExternalPlugin}\n @oscd-configure-plugin=${this.handleConfigurationPluginEvent}\n @set-plugins=${ (e: SetPluginsEvent) => this.setPlugins(e.detail.selectedPlugins) }\n .host=${this}\n .doc=${this.doc}\n .docName=${this.docName}\n .editCount=${this.editCount}\n .plugins=${this.storedPlugins}\n .editor=${this.editor}\n >\n </oscd-layout>\n </oscd-editor>\n </oscd-history>\n </oscd-wizards>\n </oscd-settings>\n </oscd-waiter>`;\n }\n\n\n @property({ attribute: false })\n doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** The UUID of the current [[`doc`]] */\n @property({ type: String }) docId = '';\n\n editor = new XMLEditor();\n\n /** Object containing all *.nsdoc files and a function extracting element's label form them*/\n @property({ attribute: false })\n nsdoc: Nsdoc = initializeNsdoc();\n\n private currentSrc = '';\n /** The current file's URL. `blob:` URLs are *revoked after parsing*! */\n @property({ type: String })\n get src(): string {\n return this.currentSrc;\n }\n\n set src(value: string) {\n this.currentSrc = value;\n this.dispatchEvent(newPendingStateEvent(this.loadDoc(value)));\n }\n\n @state() storedPlugins: Plugin[] = [];\n\n @state() private editCount = -1;\n\n private unsubscribers: (() => any)[] = [];\n\n /** Loads and parses an `XMLDocument` after [[`src`]] has changed. */\n private async loadDoc(src: string): Promise<void> {\n const response = await fetch(src);\n const text = await response.text();\n if (!text) return;\n\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n const docName = src;\n this.dispatchEvent(newOpenDocEvent(doc, docName));\n\n if (src.startsWith('blob:')) URL.revokeObjectURL(src);\n }\n\n /**\n *\n * @deprecated Use `handleConfigurationPluginEvent` instead\n */\n public handleAddExternalPlugin(e: AddExternalPluginEvent){\n this.addExternalPlugin(e.detail.plugin);\n const {name, kind} = e.detail.plugin\n\n const event = newConfigurePluginEvent(name,kind, e.detail.plugin)\n\n this.handleConfigurationPluginEvent(event)\n }\n\n\n public handleConfigurationPluginEvent(e: ConfigurePluginEvent){\n const { name, kind, config } = e.detail;\n\n const hasPlugin = this.hasPlugin(name, kind);\n const hasConfig = config !== null;\n const isChangeEvent = hasPlugin && hasConfig;\n const isRemoveEvent = hasPlugin && !hasConfig;\n const isAddEvent = !hasPlugin && hasConfig;\n\n // the `&& config`is only because typescript\n // cannot infer that `isChangeEvent` and `isAddEvent` implies `config !== null`\n if(isChangeEvent && config){\n this.changePlugin(config);\n\n }else if(isRemoveEvent){\n this.removePlugin(name, kind);\n\n }else if(isAddEvent && config){\n this.addPlugin(config);\n\n }else{\n const event = newLogEvent({\n kind: \"error\",\n title: \"Invalid plugin configuration event\",\n message: JSON.stringify({name, kind, config}),\n });\n this.dispatchEvent(event);\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.loadPlugins();\n\n this.unsubscribers.push(\n this.editor.subscribe(e => this.editCount++),\n this.editor.subscribeUndoRedo(e => this.editCount++)\n );\n\n // TODO: let Lit handle the event listeners, move to render()\n this.addEventListener('reset-plugins', this.resetPlugins);\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n\n /**\n *\n * @param name\n * @param kind\n * @returns the index of the plugin in the stored plugin list\n */\n private findPluginIndex(name: string, kind: PluginKind): number {\n return this.storedPlugins.findIndex(p => p.name === name && p.kind === kind);\n }\n\n private hasPlugin(name: string, kind: PluginKind): boolean {\n return this.findPluginIndex(name, kind) > -1;\n }\n\n private removePlugin(name: string, kind: PluginKind) {\n const newPlugins = this.storedPlugins.filter(\n p => p.name !== name || p.kind !== kind\n );\n this.updateStoredPlugins(newPlugins);\n }\n\n private addPlugin(plugin: Plugin) {\n const newPlugins = [...this.storedPlugins, plugin];\n this.updateStoredPlugins(newPlugins);\n }\n\n /**\n *\n * @param plugin\n * @throws if the plugin is not found\n */\n private changePlugin(plugin: Plugin) {\n const storedPlugins = this.storedPlugins;\n const {name, kind} = plugin;\n const pluginIndex = this.findPluginIndex(name, kind);\n\n if(pluginIndex < 0) {\n const event = newLogEvent({\n kind: \"error\",\n title: \"Plugin not found, stopping change process\",\n message: JSON.stringify({name, kind}),\n })\n this.dispatchEvent(event);\n return;\n }\n\n const pluginToChange = storedPlugins[pluginIndex]\n const changedPlugin = {...pluginToChange, ...plugin}\n const newPlugins = [...storedPlugins]\n newPlugins.splice(pluginIndex, 1, changedPlugin)\n\n // this.storePlugins(newPlugins);\n this.updateStoredPlugins(newPlugins);\n }\n\n private resetPlugins(): void {\n const builtInPlugins = this.getBuiltInPlugins()\n const allPlugins = [...builtInPlugins, ...this.parsedPlugins]\n\n const newPluginConfigs = allPlugins.map(plugin => {\n return {\n ...plugin,\n active: plugin.activeByDefault ?? false,\n }\n })\n\n this.storePlugins(newPluginConfigs)\n }\n\n /**\n * @prop {PluginSet} plugins - Set of plugins that are used by OpenSCD\n */\n @property({ type: Object }) plugins: PluginSet = { menu: [], editor: [] };\n get parsedPlugins(): Plugin[] {\n const menuPlugins: Plugin[] = this.plugins.menu.map((plugin) => {\n let newPosition: MenuPosition | undefined = plugin.position as MenuPosition;\n if(typeof plugin.position === 'number') {\n newPosition = undefined\n }\n\n return {\n ...plugin,\n position: newPosition,\n kind: 'menu' as PluginKind,\n active: plugin.active ?? false,\n }\n })\n\n const editorPlugins: Plugin[] = this.plugins.editor.map((plugin) => {\n const editorPlugin: Plugin = {\n ...plugin,\n position: undefined,\n kind: 'editor' as PluginKind,\n active: plugin.active ?? false,\n }\n return editorPlugin\n })\n\n const allPlugnis = [...menuPlugins, ...editorPlugins]\n return allPlugnis\n }\n\n\n\n private updateStoredPlugins(newPlugins: Plugin[]) {\n //\n // Generate content of each plugin\n //\n const plugins = newPlugins.map(plugin => {\n const isInstalled = plugin.src && plugin.active\n if(!isInstalled) { return plugin }\n\n return this.addContent(plugin)\n })\n\n //\n // Merge built-in plugins\n //\n const mergedPlugins = plugins.map(plugin => {\n const isBuiltIn = !plugin?.official\n if (!isBuiltIn){ return plugin };\n\n const builtInPlugin = [...this.getBuiltInPlugins(), ...this.parsedPlugins]\n .find(p => p.src === plugin.src);\n\n return <Plugin>{\n ...builtInPlugin,\n ...plugin,\n };\n })\n this.storePlugins(mergedPlugins);\n }\n\n private storePlugins(plugins: Plugin[]) {\n this.storedPlugins = plugins\n const pluginConfigs = JSON.stringify(plugins.map(withoutContent))\n localStorage.setItem('plugins', pluginConfigs);\n }\n private getPluginConfigsFromLocalStorage(): Plugin[] {\n const pluginsConfigStr = localStorage.getItem('plugins') ?? '[]'\n return JSON.parse(pluginsConfigStr) as Plugin[]\n }\n\n\n public get locale(): string {\n return navigator.language || 'en-US';\n }\n\n get docs(): Record<string, XMLDocument> {\n const docs: Record<string, XMLDocument> = {};\n\n if (this.doc) {\n docs[this.docName] = this.doc;\n }\n\n return docs;\n }\n\n private setPlugins(selectedPlugins: Plugin[]) {\n\n const newPlugins: Plugin[] = this.storedPlugins.map((storedPlugin) => {\n const isSelected = selectedPlugins.some( (selectedPlugin) => {\n return selectedPlugin.name === storedPlugin.name\n && selectedPlugin.src === storedPlugin.src\n })\n return {\n ...storedPlugin,\n active: isSelected\n }\n })\n\n this.updateStoredPlugins(newPlugins);\n }\n\n private loadPlugins(){\n const localPluginConfigs = this.getPluginConfigsFromLocalStorage()\n\n const overwritesOfBultInPlugins = localPluginConfigs.filter((p) => {\n return this.getBuiltInPlugins().some(b => b.src === p.src)\n })\n\n const userInstalledPlugins = localPluginConfigs.filter((p) => {\n return !this.getBuiltInPlugins().some(b => b.src === p.src)\n })\n const mergedBuiltInPlugins = this.getBuiltInPlugins().map((builtInPlugin) => {\n let overwrite = overwritesOfBultInPlugins.find(p => p.src === builtInPlugin.src)\n\n const mergedPlugin: Plugin = {\n ...builtInPlugin,\n ...overwrite,\n active: overwrite?.active ?? builtInPlugin.activeByDefault,\n }\n\n return mergedPlugin\n })\n\n const mergedPlugins = [...mergedBuiltInPlugins, ...userInstalledPlugins]\n\n this.updateStoredPlugins(mergedPlugins)\n }\n\n private async addExternalPlugin(\n plugin: Omit<Plugin, 'content'>\n ): Promise<void> {\n if (this.storedPlugins.some(p => p.src === plugin.src)) return;\n\n const newPlugins: Omit<Plugin, 'content'>[] = this.storedPlugins;\n newPlugins.push(plugin);\n this.storePlugins(newPlugins);\n }\n\n protected getBuiltInPlugins(): CorePlugin[] {\n return builtinPlugins\n }\n\n private addContent(plugin: Omit<Plugin, 'content'>): Plugin {\n const tag = this.pluginTag(plugin.src);\n\n if (!this.loadedPlugins.has(tag)) {\n this.loadedPlugins.add(tag);\n import(plugin.src).then((mod) => {\n customElements.define(tag, mod.default)\n })\n }\n return {\n ...plugin,\n content: {\n tag\n },\n };\n }\n\n @state() private loadedPlugins = new Set<string>();\n\n // PLUGGING INTERFACES\n @state() private pluginTags = new Map<string, string>();\n\n private pluginTag(uri: string): string {\n if (!this.pluginTags.has(uri)) {\n const tag = pluginTag(uri);\n this.pluginTags.set(uri, tag);\n }\n\n return this.pluginTags.get(uri)!;\n }\n\n\n}\n\ndeclare global {\n interface ElementEventMap {\n 'reset-plugins': CustomEvent;\n 'add-external-plugin': CustomEvent<AddExternalPluginDetail>;\n 'set-plugins': CustomEvent<SetPluginsDetail>;\n }\n}\n\n\n// HOSTING INTERFACES\n\nexport interface MenuItem {\n icon: string;\n name: string;\n src?: string;\n hint?: string;\n actionItem?: boolean;\n action?: (event: CustomEvent<ActionDetail>) => void;\n disabled?: () => boolean;\n content: ContentContext;\n kind: string;\n}\n\nexport interface Validator {\n validate: () => Promise<void>;\n}\n\nexport interface MenuPlugin {\n run: () => Promise<void>;\n}\n\nexport function newResetPluginsEvent(): CustomEvent {\n return new CustomEvent('reset-plugins', { bubbles: true, composed: true });\n}\n\nexport interface AddExternalPluginDetail {\n plugin: Omit<Plugin, 'content'>;\n}\n\nexport type AddExternalPluginEvent = CustomEvent<AddExternalPluginDetail>;\n\nexport function newAddExternalPluginEvent(\n plugin: Omit<Plugin, 'content'>\n): AddExternalPluginEvent {\n return new CustomEvent<AddExternalPluginDetail>('add-external-plugin', {\n bubbles: true,\n composed: true,\n detail: { plugin },\n });\n}\n\nexport interface SetPluginsDetail {\n selectedPlugins: Plugin[];\n}\n\nexport type SetPluginsEvent = CustomEvent<SetPluginsDetail>;\n\nexport function newSetPluginsEvent(selectedPlugins: Plugin[]): SetPluginsEvent {\n return new CustomEvent<SetPluginsDetail>('set-plugins', {\n bubbles: true,\n composed: true,\n detail: { selectedPlugins },\n });\n}\n\n\n\nfunction withoutContent<P extends Plugin | InstalledOfficialPlugin>(\n plugin: P\n): P {\n return { ...plugin, content: undefined };\n}\n\nexport const pluginIcons: Record<PluginKind | MenuPosition, string> = {\n editor: 'tab',\n menu: 'play_circle',\n validator: 'rule_folder',\n top: 'play_circle',\n middle: 'play_circle',\n bottom: 'play_circle',\n};\n\nconst menuOrder: (PluginKind | MenuPosition)[] = [\n 'editor',\n 'top',\n 'validator',\n 'middle',\n 'bottom',\n];\n\nfunction menuCompare(a: Plugin, b: Plugin): -1 | 0 | 1 {\n if (a.kind === b.kind && a.position === b.position) return 0;\n const earlier = menuOrder.find(kind =>\n [a.kind, b.kind, a.position, b.position].includes(kind)\n );\n return [a.kind, a.position].includes(earlier) ? -1 : 1;\n}\n\nfunction compareNeedsDoc(a: Plugin, b: Plugin): -1 | 0 | 1 {\n if (a.requireDoc === b.requireDoc) return 0;\n return a.requireDoc ? 1 : -1;\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"open-scd.js","sourceRoot":"","sources":["../src/open-scd.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n LitElement,\n property,\n state,\n TemplateResult,\n} from 'lit-element';\n\nimport '@material/mwc-icon';\nimport '@material/mwc-icon-button';\nimport '@material/mwc-linear-progress';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-tab';\nimport '@material/mwc-tab-bar';\nimport '@material/mwc-top-app-bar-fixed';\nimport '@material/mwc-drawer';\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-formfield';\nimport '@material/mwc-list/mwc-check-list-item';\nimport '@material/mwc-list/mwc-radio-list-item';\nimport '@material/mwc-select';\nimport '@material/mwc-switch';\nimport '@material/mwc-textfield';\n\nimport { XMLEditor } from '@openscd/oscd-editor';\n\nimport { newOpenDocEvent } from '@compas-oscd/core';\nimport { newPendingStateEvent } from '@compas-oscd/core';\n\nimport './addons/Settings.js';\nimport './addons/Waiter.js';\nimport './addons/Wizards.js';\nimport './addons/Editor.js';\nimport './addons/History.js';\nimport './addons/Layout.js';\n\nimport { ActionDetail } from '@material/mwc-list';\n\nimport { officialPlugins as builtinPlugins } from './plugins.js';\nimport { initializeNsdoc, Nsdoc } from './foundation/nsdoc.js';\nimport type {\n PluginSet,\n Plugin as CorePlugin,\n EditCompletedEvent,\n} from '@compas-oscd/core';\n\nimport { InstalledOfficialPlugin, MenuPosition, PluginKind, Plugin, ContentContext } from \"./plugin.js\"\nimport { ConfigurePluginEvent, ConfigurePluginDetail, newConfigurePluginEvent } from './plugin.events.js';\nimport { newLogEvent } from '@compas-oscd/core';\nimport { pluginTag } from './plugin-tag.js';\n\n\n\nexport class OpenSCD extends LitElement {\n\n render(): TemplateResult {\n return html`<oscd-waiter>\n <oscd-settings .host=${this}>\n <oscd-wizards .host=${this}>\n <oscd-history\n .host=${this}\n .editor=${this.editor}\n >\n <oscd-editor\n .doc=${this.doc}\n .docName=${this.docName}\n .docId=${this.docId}\n .host=${this}\n .editCount=${this.editCount}\n .editor=${this.editor}\n >\n <oscd-layout\n @add-external-plugin=${this.handleAddExternalPlugin}\n @oscd-configure-plugin=${this.handleConfigurationPluginEvent}\n @set-plugins=${ (e: SetPluginsEvent) => this.setPlugins(e.detail.selectedPlugins) }\n .host=${this}\n .doc=${this.doc}\n .docName=${this.docName}\n .editCount=${this.editCount}\n .plugins=${this.storedPlugins}\n .editor=${this.editor}\n >\n </oscd-layout>\n </oscd-editor>\n </oscd-history>\n </oscd-wizards>\n </oscd-settings>\n </oscd-waiter>`;\n }\n\n\n @property({ attribute: false })\n doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** The UUID of the current [[`doc`]] */\n @property({ type: String }) docId = '';\n\n editor = new XMLEditor();\n\n /** Object containing all *.nsdoc files and a function extracting element's label form them*/\n @property({ attribute: false })\n nsdoc: Nsdoc = initializeNsdoc();\n\n private currentSrc = '';\n /** The current file's URL. `blob:` URLs are *revoked after parsing*! */\n @property({ type: String })\n get src(): string {\n return this.currentSrc;\n }\n\n set src(value: string) {\n this.currentSrc = value;\n this.dispatchEvent(newPendingStateEvent(this.loadDoc(value)));\n }\n\n @state() storedPlugins: Plugin[] = [];\n\n @state() private editCount = -1;\n\n private unsubscribers: (() => any)[] = [];\n\n /** Loads and parses an `XMLDocument` after [[`src`]] has changed. */\n private async loadDoc(src: string): Promise<void> {\n const response = await fetch(src);\n const text = await response.text();\n if (!text) return;\n\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n const docName = src;\n this.dispatchEvent(newOpenDocEvent(doc, docName));\n\n if (src.startsWith('blob:')) URL.revokeObjectURL(src);\n }\n\n /**\n *\n * @deprecated Use `handleConfigurationPluginEvent` instead\n */\n public handleAddExternalPlugin(e: AddExternalPluginEvent){\n this.addExternalPlugin(e.detail.plugin);\n const {name, kind} = e.detail.plugin\n\n const event = newConfigurePluginEvent(name,kind, e.detail.plugin)\n\n this.handleConfigurationPluginEvent(event)\n }\n\n\n public handleConfigurationPluginEvent(e: ConfigurePluginEvent){\n const { name, kind, config } = e.detail;\n\n const hasPlugin = this.hasPlugin(name, kind);\n const hasConfig = config !== null;\n const isChangeEvent = hasPlugin && hasConfig;\n const isRemoveEvent = hasPlugin && !hasConfig;\n const isAddEvent = !hasPlugin && hasConfig;\n\n // the `&& config`is only because typescript\n // cannot infer that `isChangeEvent` and `isAddEvent` implies `config !== null`\n if(isChangeEvent && config){\n this.changePlugin(config);\n\n }else if(isRemoveEvent){\n this.removePlugin(name, kind);\n\n }else if(isAddEvent && config){\n this.addPlugin(config);\n\n }else{\n const event = newLogEvent({\n kind: \"error\",\n title: \"Invalid plugin configuration event\",\n message: JSON.stringify({name, kind, config}),\n });\n this.dispatchEvent(event);\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.loadPlugins();\n\n this.unsubscribers.push(\n this.editor.subscribe(() => this.editCount++),\n );\n\n // TODO: let Lit handle the event listeners, move to render()\n this.addEventListener('reset-plugins', this.resetPlugins);\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n\n /**\n *\n * @param name\n * @param kind\n * @returns the index of the plugin in the stored plugin list\n */\n private findPluginIndex(name: string, kind: PluginKind): number {\n return this.storedPlugins.findIndex(p => p.name === name && p.kind === kind);\n }\n\n private hasPlugin(name: string, kind: PluginKind): boolean {\n return this.findPluginIndex(name, kind) > -1;\n }\n\n private removePlugin(name: string, kind: PluginKind) {\n const newPlugins = this.storedPlugins.filter(\n p => p.name !== name || p.kind !== kind\n );\n this.updateStoredPlugins(newPlugins);\n }\n\n private addPlugin(plugin: Plugin) {\n const newPlugins = [...this.storedPlugins, plugin];\n this.updateStoredPlugins(newPlugins);\n }\n\n /**\n *\n * @param plugin\n * @throws if the plugin is not found\n */\n private changePlugin(plugin: Plugin) {\n const storedPlugins = this.storedPlugins;\n const {name, kind} = plugin;\n const pluginIndex = this.findPluginIndex(name, kind);\n\n if(pluginIndex < 0) {\n const event = newLogEvent({\n kind: \"error\",\n title: \"Plugin not found, stopping change process\",\n message: JSON.stringify({name, kind}),\n })\n this.dispatchEvent(event);\n return;\n }\n\n const pluginToChange = storedPlugins[pluginIndex]\n const changedPlugin = {...pluginToChange, ...plugin}\n const newPlugins = [...storedPlugins]\n newPlugins.splice(pluginIndex, 1, changedPlugin)\n\n // this.storePlugins(newPlugins);\n this.updateStoredPlugins(newPlugins);\n }\n\n private resetPlugins(): void {\n const builtInPlugins = this.getBuiltInPlugins()\n const allPlugins = [...builtInPlugins, ...this.parsedPlugins]\n\n const newPluginConfigs = allPlugins.map(plugin => {\n return {\n ...plugin,\n active: plugin.activeByDefault ?? false,\n }\n })\n\n this.storePlugins(newPluginConfigs)\n }\n\n /**\n * @prop {PluginSet} plugins - Set of plugins that are used by OpenSCD\n */\n @property({ type: Object }) plugins: PluginSet = { menu: [], editor: [] };\n get parsedPlugins(): Plugin[] {\n const menuPlugins: Plugin[] = this.plugins.menu.map((plugin) => {\n let newPosition: MenuPosition | undefined = plugin.position as MenuPosition;\n if(typeof plugin.position === 'number') {\n newPosition = undefined\n }\n\n return {\n ...plugin,\n position: newPosition,\n kind: 'menu' as PluginKind,\n active: plugin.active ?? false,\n }\n })\n\n const editorPlugins: Plugin[] = this.plugins.editor.map((plugin) => {\n const editorPlugin: Plugin = {\n ...plugin,\n position: undefined,\n kind: 'editor' as PluginKind,\n active: plugin.active ?? false,\n }\n return editorPlugin\n })\n\n const allPlugnis = [...menuPlugins, ...editorPlugins]\n return allPlugnis\n }\n\n\n\n private updateStoredPlugins(newPlugins: Plugin[]) {\n //\n // Generate content of each plugin\n //\n const plugins = newPlugins.map(plugin => {\n const isInstalled = plugin.src && plugin.active\n if(!isInstalled) { return plugin }\n\n return this.addContent(plugin)\n })\n\n //\n // Merge built-in plugins\n //\n const mergedPlugins = plugins.map(plugin => {\n const isBuiltIn = !plugin?.official\n if (!isBuiltIn){ return plugin };\n\n const builtInPlugin = [...this.getBuiltInPlugins(), ...this.parsedPlugins]\n .find(p => p.src === plugin.src);\n\n return <Plugin>{\n ...builtInPlugin,\n ...plugin,\n };\n })\n this.storePlugins(mergedPlugins);\n }\n\n private storePlugins(plugins: Plugin[]) {\n this.storedPlugins = plugins\n const pluginConfigs = JSON.stringify(plugins.map(withoutContent))\n localStorage.setItem('plugins', pluginConfigs);\n }\n private getPluginConfigsFromLocalStorage(): Plugin[] {\n const pluginsConfigStr = localStorage.getItem('plugins') ?? '[]'\n return JSON.parse(pluginsConfigStr) as Plugin[]\n }\n\n\n public get locale(): string {\n return navigator.language || 'en-US';\n }\n\n get docs(): Record<string, XMLDocument> {\n const docs: Record<string, XMLDocument> = {};\n\n if (this.doc) {\n docs[this.docName] = this.doc;\n }\n\n return docs;\n }\n\n private setPlugins(selectedPlugins: Plugin[]) {\n\n const newPlugins: Plugin[] = this.storedPlugins.map((storedPlugin) => {\n const isSelected = selectedPlugins.some( (selectedPlugin) => {\n return selectedPlugin.name === storedPlugin.name\n && selectedPlugin.src === storedPlugin.src\n })\n return {\n ...storedPlugin,\n active: isSelected\n }\n })\n\n this.updateStoredPlugins(newPlugins);\n }\n\n private loadPlugins(){\n const localPluginConfigs = this.getPluginConfigsFromLocalStorage()\n\n const overwritesOfBultInPlugins = localPluginConfigs.filter((p) => {\n return this.getBuiltInPlugins().some(b => b.src === p.src)\n })\n\n const userInstalledPlugins = localPluginConfigs.filter((p) => {\n return !this.getBuiltInPlugins().some(b => b.src === p.src)\n })\n const mergedBuiltInPlugins = this.getBuiltInPlugins().map((builtInPlugin) => {\n let overwrite = overwritesOfBultInPlugins.find(p => p.src === builtInPlugin.src)\n\n const mergedPlugin: Plugin = {\n ...builtInPlugin,\n ...overwrite,\n active: overwrite?.active ?? builtInPlugin.activeByDefault,\n }\n\n return mergedPlugin\n })\n\n const mergedPlugins = [...mergedBuiltInPlugins, ...userInstalledPlugins]\n\n this.updateStoredPlugins(mergedPlugins)\n }\n\n private async addExternalPlugin(\n plugin: Omit<Plugin, 'content'>\n ): Promise<void> {\n if (this.storedPlugins.some(p => p.src === plugin.src)) return;\n\n const newPlugins: Omit<Plugin, 'content'>[] = this.storedPlugins;\n newPlugins.push(plugin);\n this.storePlugins(newPlugins);\n }\n\n protected getBuiltInPlugins(): CorePlugin[] {\n return builtinPlugins\n }\n\n private addContent(plugin: Omit<Plugin, 'content'>): Plugin {\n const tag = this.pluginTag(plugin.src);\n\n if (!this.loadedPlugins.has(tag)) {\n this.loadedPlugins.add(tag);\n import(plugin.src).then((mod) => {\n customElements.define(tag, mod.default)\n })\n }\n return {\n ...plugin,\n content: {\n tag\n },\n };\n }\n\n @state() private loadedPlugins = new Set<string>();\n\n // PLUGGING INTERFACES\n @state() private pluginTags = new Map<string, string>();\n\n private pluginTag(uri: string): string {\n if (!this.pluginTags.has(uri)) {\n const tag = pluginTag(uri);\n this.pluginTags.set(uri, tag);\n }\n\n return this.pluginTags.get(uri)!;\n }\n\n\n}\n\ndeclare global {\n interface ElementEventMap {\n 'reset-plugins': CustomEvent;\n 'add-external-plugin': CustomEvent<AddExternalPluginDetail>;\n 'set-plugins': CustomEvent<SetPluginsDetail>;\n }\n}\n\n\n// HOSTING INTERFACES\n\nexport interface MenuItem {\n icon: string;\n name: string;\n src?: string;\n hint?: string;\n actionItem?: boolean;\n action?: (event: CustomEvent<ActionDetail>) => void;\n disabled?: () => boolean;\n content: ContentContext;\n kind: string;\n}\n\nexport interface Validator {\n validate: () => Promise<void>;\n}\n\nexport interface MenuPlugin {\n run: () => Promise<void>;\n}\n\nexport function newResetPluginsEvent(): CustomEvent {\n return new CustomEvent('reset-plugins', { bubbles: true, composed: true });\n}\n\nexport interface AddExternalPluginDetail {\n plugin: Omit<Plugin, 'content'>;\n}\n\nexport type AddExternalPluginEvent = CustomEvent<AddExternalPluginDetail>;\n\nexport function newAddExternalPluginEvent(\n plugin: Omit<Plugin, 'content'>\n): AddExternalPluginEvent {\n return new CustomEvent<AddExternalPluginDetail>('add-external-plugin', {\n bubbles: true,\n composed: true,\n detail: { plugin },\n });\n}\n\nexport interface SetPluginsDetail {\n selectedPlugins: Plugin[];\n}\n\nexport type SetPluginsEvent = CustomEvent<SetPluginsDetail>;\n\nexport function newSetPluginsEvent(selectedPlugins: Plugin[]): SetPluginsEvent {\n return new CustomEvent<SetPluginsDetail>('set-plugins', {\n bubbles: true,\n composed: true,\n detail: { selectedPlugins },\n });\n}\n\n\n\nfunction withoutContent<P extends Plugin | InstalledOfficialPlugin>(\n plugin: P\n): P {\n return { ...plugin, content: undefined };\n}\n\nexport const pluginIcons: Record<PluginKind | MenuPosition, string> = {\n editor: 'tab',\n menu: 'play_circle',\n validator: 'rule_folder',\n top: 'play_circle',\n middle: 'play_circle',\n bottom: 'play_circle',\n};\n\nconst menuOrder: (PluginKind | MenuPosition)[] = [\n 'editor',\n 'top',\n 'validator',\n 'middle',\n 'bottom',\n];\n\nfunction menuCompare(a: Plugin, b: Plugin): -1 | 0 | 1 {\n if (a.kind === b.kind && a.position === b.position) return 0;\n const earlier = menuOrder.find(kind =>\n [a.kind, b.kind, a.position, b.position].includes(kind)\n );\n return [a.kind, a.position].includes(earlier) ? -1 : 1;\n}\n\nfunction compareNeedsDoc(a: Plugin, b: Plugin): -1 | 0 | 1 {\n if (a.requireDoc === b.requireDoc) return 0;\n return a.requireDoc ? 1 : -1;\n}\n\n"]}
|
package/dist/themes.js
CHANGED
|
@@ -52,6 +52,34 @@ export function getTheme(theme) {
|
|
|
52
52
|
|
|
53
53
|
--oscd-text-font: var(--oscd-theme-text-font, 'Roboto');
|
|
54
54
|
--oscd-icon-font: var(--oscd-theme-icon-font, 'Material Icons');
|
|
55
|
+
|
|
56
|
+
/* Fallbacks for Material Design variables */
|
|
57
|
+
--md-sys-color-primary: var(--oscd-primary);
|
|
58
|
+
--md-sys-color-on-primary: var(--oscd-base3);
|
|
59
|
+
--md-sys-color-secondary: var(--oscd-secondary);
|
|
60
|
+
--md-sys-color-on-secondary: var(--oscd-base3);
|
|
61
|
+
--md-sys-color-secondary-container: var(--oscd-base2);
|
|
62
|
+
--md-sys-color-surface: var(--oscd-base3);
|
|
63
|
+
--md-sys-color-on-surface: var(--oscd-base00);
|
|
64
|
+
--md-sys-color-surface-variant: var(--oscd-base3);
|
|
65
|
+
--md-sys-color-on-surface-variant: var(--oscd-base00);
|
|
66
|
+
--md-sys-color-surface-bright: var(--oscd-base2);
|
|
67
|
+
--md-sys-color-surface-container: var(--oscd-base3);
|
|
68
|
+
--md-sys-color-surface-container-high: var(--oscd-base3);
|
|
69
|
+
--md-sys-color-surface-container-highest: var(--oscd-base3);
|
|
70
|
+
--md-sys-color-outline-variant: var(--oscd-primary);
|
|
71
|
+
--md-sys-color-scrim: #000000;
|
|
72
|
+
--md-sys-color-error: var(--oscd-error);
|
|
73
|
+
--md-sys-color-on-error: var(--oscd-base3);
|
|
74
|
+
--md-icon-button-disabled-icon-color: var(--oscd-base3);
|
|
75
|
+
/* --md-menu-item-selected-label-text-color: var(--oscd-base01); */
|
|
76
|
+
--md-icon-button-disabled-icon-color: var(--oscd-base3);
|
|
77
|
+
|
|
78
|
+
/* textfield */ disabled-label-text-color
|
|
79
|
+
--md-filled-text-field-container-color: var(--oscd-base2);
|
|
80
|
+
--md-filled-text-field-disabled-container-color: var(--oscd-base3);
|
|
81
|
+
--md-filled-text-field-disabled-input-text-color: var(--oscd-base00);
|
|
82
|
+
--md-filled-text-field-disabled-label-text-color: var(--oscd-base00);
|
|
55
83
|
}
|
|
56
84
|
|
|
57
85
|
.mdc-drawer span.mdc-drawer__title {
|
package/dist/themes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,aAAa,CAAC;AAGnD,MAAM,UAAU,QAAQ,CAAC,KAAwB;IAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,IAAI,CAAA;MACP,MAAM,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,aAAa,CAAC;AAGnD,MAAM,UAAU,QAAQ,CAAC,KAAwB;IAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,IAAI,CAAA;MACP,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FhB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAsC;IACpD,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,qBAAqB;CAC7B,CAAC;AAEF,MAAM,MAAM,GAA8C;IACxD,KAAK,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;GAqBV;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;GAqBT;CACF,CAAC","sourcesContent":["import { html, TemplateResult } from 'lit-element';\nimport { Settings } from '@compas-oscd/core';\n\nexport function getTheme(theme: Settings['theme']): TemplateResult {\n document.body.style.cssText = bodyStyles[theme];\n return html`\n ${themes[theme]}\n <style>\n * {\n --primary: var(--cyan);\n --secondary: var(--violet);\n --mdc-theme-primary: var(--primary);\n --mdc-theme-secondary: var(--secondary);\n --mdc-theme-background: var(--base3);\n --mdc-theme-surface: var(--base3);\n --mdc-theme-on-primary: var(--base2);\n --mdc-theme-on-secondary: var(--base2);\n --mdc-theme-on-background: var(--base00);\n --mdc-theme-on-surface: var(--base00);\n --mdc-theme-text-primary-on-background: var(--base01);\n --mdc-theme-text-secondary-on-background: var(--base00);\n --mdc-theme-text-icon-on-background: var(--base00);\n --mdc-theme-error: var(--red);\n\n --mdc-button-disabled-ink-color: var(--base1);\n\n --mdc-drawer-heading-ink-color: var(--base00);\n\n --mdc-text-field-fill-color: var(--base2);\n --mdc-text-field-disabled-fill-color: var(--base3);\n --mdc-text-field-ink-color: var(--base00);\n --mdc-text-field-label-ink-color: var(--base00);\n\n --mdc-select-fill-color: var(--base2);\n --mdc-select-disabled-fill-color: var(--base3);\n --mdc-select-ink-color: var(--base00);\n\n --mdc-dialog-heading-ink-color: var(--base00);\n\n --mdc-icon-font: 'Material Icons Outlined';\n\n --oscd-primary: var(--oscd-theme-primary, var(--cyan));\n --oscd-secondary: var(--oscd-theme-secondary, var(--violet));\n --oscd-error: var(--oscd-theme-error, var(--red));\n\n --oscd-base03: var(--oscd-theme-base03, var(--base03));\n --oscd-base02: var(--oscd-theme-base02, var(--base02));\n --oscd-base01: var(--oscd-theme-base01, var(--base01));\n --oscd-base00: var(--oscd-theme-base00, var(--base00));\n --oscd-base0: var(--oscd-theme-base0, var(--base0));\n --oscd-base1: var(--oscd-theme-base1, var(--base1));\n --oscd-base2: var(--oscd-theme-base2, var(--base2));\n --oscd-base3: var(--oscd-theme-base3, var(--base3));\n\n --oscd-text-font: var(--oscd-theme-text-font, 'Roboto');\n --oscd-icon-font: var(--oscd-theme-icon-font, 'Material Icons');\n\n /* Fallbacks for Material Design variables */\n --md-sys-color-primary: var(--oscd-primary);\n --md-sys-color-on-primary: var(--oscd-base3);\n --md-sys-color-secondary: var(--oscd-secondary);\n --md-sys-color-on-secondary: var(--oscd-base3);\n --md-sys-color-secondary-container: var(--oscd-base2);\n --md-sys-color-surface: var(--oscd-base3);\n --md-sys-color-on-surface: var(--oscd-base00);\n --md-sys-color-surface-variant: var(--oscd-base3);\n --md-sys-color-on-surface-variant: var(--oscd-base00);\n --md-sys-color-surface-bright: var(--oscd-base2);\n --md-sys-color-surface-container: var(--oscd-base3);\n --md-sys-color-surface-container-high: var(--oscd-base3);\n --md-sys-color-surface-container-highest: var(--oscd-base3);\n --md-sys-color-outline-variant: var(--oscd-primary);\n --md-sys-color-scrim: #000000;\n --md-sys-color-error: var(--oscd-error);\n --md-sys-color-on-error: var(--oscd-base3);\n --md-icon-button-disabled-icon-color: var(--oscd-base3);\n /* --md-menu-item-selected-label-text-color: var(--oscd-base01); */\n --md-icon-button-disabled-icon-color: var(--oscd-base3);\n\n /* textfield */ disabled-label-text-color\n --md-filled-text-field-container-color: var(--oscd-base2);\n --md-filled-text-field-disabled-container-color: var(--oscd-base3);\n --md-filled-text-field-disabled-input-text-color: var(--oscd-base00);\n --md-filled-text-field-disabled-label-text-color: var(--oscd-base00);\n }\n\n .mdc-drawer span.mdc-drawer__title {\n color: var(--mdc-theme-text-primary-on-background) !important;\n }\n\n abbr {\n text-decoration: none;\n border-bottom: none;\n }\n\n mwc-textfield[iconTrailing='search'] {\n --mdc-shape-small: 28px;\n }\n </style>\n `;\n}\n\nconst bodyStyles: Record<Settings['theme'], string> = {\n dark: 'background: #073642',\n light: 'background: #eee8d5',\n};\n\nconst themes: Record<Settings['theme'], TemplateResult> = {\n light: html`\n <style>\n * {\n --base03: #002b36;\n --base02: #073642;\n --base01: #586e75;\n --base00: #657b83;\n --base0: #839496;\n --base1: #93a1a1;\n --base2: #eee8d5;\n --base3: #fdf6e3;\n --yellow: #b58900;\n --orange: #cb4b16;\n --red: #dc322f;\n --magenta: #d33682;\n --violet: #6c71c4;\n --blue: #268bd2;\n --cyan: #2aa198;\n --green: #859900;\n }\n </style>\n `,\n dark: html`\n <style>\n * {\n --base03: #fdf6e3;\n --base02: #eee8d5;\n --base01: #93a1a1;\n --base00: #839496;\n --base0: #657b83;\n --base1: #586e75;\n --base2: #073642;\n --base3: #002b36;\n --yellow: #b58900;\n --orange: #cb4b16;\n --red: #dc322f;\n --magenta: #d33682;\n --violet: #6c71c4;\n --blue: #268bd2;\n --cyan: #2aa198;\n --green: #859900;\n }\n </style>\n `,\n};\n"]}
|
package/dist/wizard-select.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard-select.js","sourceRoot":"","sources":["../src/wizard-select.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EAEL,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,sBAAsB,CAAC;AAE9B,OAAO,sBAAsB,CAAC;AAG9B;;0EAE0E;AAEnE,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAmB1C,IAAY,IAAI;QACd,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,IAAY,IAAI,CAAC,KAAc;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QACpD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;YACzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IACD,qEAAqE;IAErE,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACvC,CAAC;IACD,IAAI,UAAU,CAAC,KAAoB;QACjC,IAAI,KAAK,KAAK,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;aAChC;YACH,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;IACH,CAAC;IAgBO,MAAM;QACZ,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,8BAA8B;IAChC,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO;YAAE,OAAO,IAAI,CAAC;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QA7EV,UAAK,GAAG,EAAE,CAAC;QAEX,UAAK,GAAG,EAAE,CAAC;QAMX,uBAAkB,GAAG,KAAK,CAAC;QAE3B,aAAQ,GAAG,KAAK,CAAC;QAEjB,6CAA6C;QAE7C,aAAQ,GAAG,KAAK,CAAC;QACT,WAAM,GAAG,KAAK,CAAC;QAuBvB,mEAAmE;QAEnE,iBAAY,GAAG,EAAE,CAAC;QAClB,uDAAuD;QAEvD,mBAAc,GAAa,EAAE,CAAC;QAE9B,kFAAkF;QAC1E,mBAAc,GAAG,KAAK,CAAC;QAKvB,WAAM,GAAkB,IAAI,CAAC;QA4BnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,IAAI,CAAA;;mBAEE,CAAC,IAAI,CAAC,IAAI;oBACT,IAAI,CAAC,cAAc;kBACrB,GAAG,EAAE;gBACb,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC;YACxC,CAAC;qBACY,CAAC;SACjB;QACD,OAAO,IAAI,CAAA,EAAE,CAAC;IAChB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA
|
|
1
|
+
{"version":3,"file":"wizard-select.js","sourceRoot":"","sources":["../src/wizard-select.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n customElement,\n html,\n state,\n property,\n query,\n TemplateResult,\n LitElement,\n} from 'lit-element';\nimport { ifDefined } from 'lit-html/directives/if-defined.js';\n\nimport '@material/mwc-switch';\nimport { Switch } from '@material/mwc-switch';\nimport '@material/mwc-select';\nimport { Select } from '@material/mwc-select';\n\n/** A potentially `nullable` `Select`.\n *\n * NB: Use `maybeValue: string | null` instead of `value` if `nullable`!*/\n@customElement('wizard-select')\nexport class WizardSelect extends LitElement {\n @property({ type: String })\n value = '';\n @property({ type: String })\n label = '';\n @property({ type: String })\n helper: string | undefined;\n @property({ type: String })\n validationMessage: string | undefined;\n @property({ type: Boolean })\n dialogInitialFocus = false;\n @property({ type: Boolean })\n disabled = false;\n\n /** Whether [[`maybeValue`]] may be `null` */\n @property({ type: Boolean })\n nullable = false;\n private isNull = false;\n @state()\n private get null(): boolean {\n return this.nullable && this.isNull;\n }\n private set null(value: boolean) {\n if (!this.nullable || value === this.isNull) return;\n this.isNull = value;\n if (this.null) this.disable();\n else this.enable();\n }\n /** Replacement for `value`, can only be `null` if [[`nullable`]]. */\n @property({ type: String })\n get maybeValue(): string | null {\n return this.null ? null : this.value;\n }\n set maybeValue(value: string | null) {\n if (value === null) this.null = true;\n else {\n this.null = false;\n this.value = value;\n }\n }\n /** The default `value` displayed if [[`maybeValue`]] is `null`. */\n @property({ type: String })\n defaultValue = '';\n /** Additional values that cause validation to fail. */\n @property({ type: Array })\n reservedValues: string[] = [];\n\n // FIXME: workaround to allow disable of the whole component - need basic refactor\n private disabledSwitch = false;\n\n @query('mwc-select') select!: Select;\n @query('mwc-switch') nullSwitch?: Switch;\n\n private nulled: string | null = null;\n\n private enable(): void {\n if (this.nulled === null) return;\n this.value = this.nulled;\n this.nulled = null;\n this.disabled = false;\n }\n\n private disable(): void {\n if (this.nulled !== null) return;\n this.nulled = this.value;\n this.value = this.defaultValue;\n this.disabled = true;\n }\n\n async firstUpdated(): Promise<void> {\n // await super.firstUpdated();\n }\n\n checkValidity(): boolean {\n if (this.nullable && !this.nullSwitch?.checked) return true;\n return this.select.checkValidity();\n }\n\n constructor() {\n super();\n\n this.disabledSwitch = this.hasAttribute('disabled');\n }\n\n renderSwitch(): TemplateResult {\n if (this.nullable) {\n return html`<mwc-switch\n style=\"margin-left: 12px;\"\n ?checked=${!this.null}\n ?disabled=${this.disabledSwitch}\n @change=${() => {\n this.null = !this.nullSwitch!.checked;\n }}\n ></mwc-switch>`;\n }\n return html``;\n }\n\n render(): TemplateResult {\n return html`\n <div style=\"display: flex; flex-direction: row;\">\n <div style=\"flex: auto;\">\n <mwc-select\n style=\"width: 100%;\"\n .value=${this.value}\n .disabled=${this.disabled}\n label=${this.label}\n helper=\"${ifDefined(this.helper)}\"\n validationMessage=\"${ifDefined(this.validationMessage)}\"\n @change=\"${(e: Event) => this.value = (e.target as HTMLInputElement).value}\"\n >\n <slot></slot>\n </mwc-select>\n </div>\n <div style=\"display: flex; align-items: center; height: 56px;\">\n ${this.renderSwitch()}\n </div>\n </div>\n `;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@compas-oscd/open-scd",
|
|
3
|
-
"version": "0.34.
|
|
3
|
+
"version": "0.34.45",
|
|
4
4
|
"repository": "https://github.com/openscd/open-scd.git",
|
|
5
5
|
"directory": "packages/openscd",
|
|
6
6
|
"description": "A bottom-up substation configuration designer for projects described using SCL `IEC 61850-6` Edition 2 or greater.",
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
],
|
|
23
23
|
"exports": {
|
|
24
24
|
".": "./dist/index.js",
|
|
25
|
+
"./open-scd.js": "./dist/open-scd.js",
|
|
26
|
+
"./open-scd.component.js": "./dist/open-scd.component.js",
|
|
25
27
|
"./dist/plugin.js": "./dist/plugin.js",
|
|
26
28
|
"./dist/plugin-tag.js": "./dist/plugin-tag.js",
|
|
27
29
|
"./dist/foundation/nsdoc.js": "./dist/foundation/nsdoc.js",
|
|
@@ -38,6 +40,8 @@
|
|
|
38
40
|
"./dist/action-icon.js": "./dist/action-icon.js",
|
|
39
41
|
"./dist/plain-compare-list.js": "./dist/plain-compare-list.js",
|
|
40
42
|
"./filtered-list.js": "./dist/filtered-list.js",
|
|
43
|
+
"./dist/finder-list.js": "./dist/finder-list.js",
|
|
44
|
+
"./dist/foundation/dai.js": "./dist/foundation/dai.js",
|
|
41
45
|
"./dist/wizard-textfield.js": "./dist/wizard-textfield.js",
|
|
42
46
|
"./dist/wizard-checkbox.js": "./dist/wizard-checkbox.js",
|
|
43
47
|
"./dist/wizard-select.js": "./dist/wizard-select.js",
|
|
@@ -69,6 +73,7 @@
|
|
|
69
73
|
"@material/mwc-textfield": "0.22.1",
|
|
70
74
|
"@material/mwc-top-app-bar-fixed": "0.22.1",
|
|
71
75
|
"@openscd/oscd-api": "^0.1.5",
|
|
76
|
+
"@openscd/oscd-editor": "^1.8.0",
|
|
72
77
|
"ace-custom-element": "^1.6.5",
|
|
73
78
|
"lit": "^2.2.7",
|
|
74
79
|
"lit-translate": "^1.2.1",
|