@compas-oscd/open-scd 0.34.13 → 0.34.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/addons/Editor.d.ts +2 -2
  2. package/dist/addons/Editor.js +4 -4
  3. package/dist/addons/Editor.js.map +1 -1
  4. package/dist/addons/History.d.ts +2 -2
  5. package/dist/addons/History.js.map +1 -1
  6. package/dist/addons/Layout.d.ts +1 -1
  7. package/dist/addons/Layout.js +2 -2
  8. package/dist/addons/Layout.js.map +1 -1
  9. package/dist/addons/Settings.d.ts +1 -1
  10. package/dist/addons/Settings.js +2 -2
  11. package/dist/addons/Settings.js.map +1 -1
  12. package/dist/addons/Waiter.js.map +1 -1
  13. package/dist/addons/editor/edit-action-to-v1-converter.d.ts +2 -2
  14. package/dist/addons/editor/edit-action-to-v1-converter.js +1 -1
  15. package/dist/addons/editor/edit-action-to-v1-converter.js.map +1 -1
  16. package/dist/addons/editor/edit-v1-to-v2-converter.d.ts +1 -1
  17. package/dist/addons/editor/edit-v1-to-v2-converter.js +1 -1
  18. package/dist/addons/editor/edit-v1-to-v2-converter.js.map +1 -1
  19. package/dist/addons/history/get-log-text.d.ts +1 -1
  20. package/dist/addons/history/get-log-text.js +1 -1
  21. package/dist/addons/history/get-log-text.js.map +1 -1
  22. package/dist/foundation/ied.d.ts +1 -1
  23. package/dist/foundation/ied.js.map +1 -1
  24. package/dist/foundation.d.ts +1 -1
  25. package/dist/foundation.js.map +1 -1
  26. package/dist/open-scd.d.ts +2 -2
  27. package/dist/open-scd.js +4 -4
  28. package/dist/open-scd.js.map +1 -1
  29. package/dist/plugin.d.ts +1 -1
  30. package/dist/plugin.js.map +1 -1
  31. package/dist/themes.d.ts +1 -1
  32. package/dist/themes.js.map +1 -1
  33. package/dist/translations/loader.js.map +1 -1
  34. package/dist/wizard-dialog.js +1 -1
  35. package/dist/wizard-dialog.js.map +1 -1
  36. package/dist/wizards.js.map +1 -1
  37. package/package.json +2 -2
  38. package/dist/src/WizardDivider.d.ts +0 -8
  39. package/dist/src/WizardDivider.js +0 -37
  40. package/dist/src/WizardDivider.js.map +0 -1
  41. package/dist/src/Wizarding.d.ts +0 -10
  42. package/dist/src/Wizarding.js +0 -38
  43. package/dist/src/Wizarding.js.map +0 -1
  44. package/dist/src/action-icon.d.ts +0 -25
  45. package/dist/src/action-icon.js +0 -220
  46. package/dist/src/action-icon.js.map +0 -1
  47. package/dist/src/action-pane.d.ts +0 -25
  48. package/dist/src/action-pane.js +0 -176
  49. package/dist/src/action-pane.js.map +0 -1
  50. package/dist/src/addons/Editor.d.ts +0 -25
  51. package/dist/src/addons/Editor.js +0 -106
  52. package/dist/src/addons/Editor.js.map +0 -1
  53. package/dist/src/addons/History.d.ts +0 -93
  54. package/dist/src/addons/History.js +0 -491
  55. package/dist/src/addons/History.js.map +0 -1
  56. package/dist/src/addons/Layout.d.ts +0 -96
  57. package/dist/src/addons/Layout.js +0 -619
  58. package/dist/src/addons/Layout.js.map +0 -1
  59. package/dist/src/addons/Settings.d.ts +0 -68
  60. package/dist/src/addons/Settings.js +0 -465
  61. package/dist/src/addons/Settings.js.map +0 -1
  62. package/dist/src/addons/Waiter.d.ts +0 -14
  63. package/dist/src/addons/Waiter.js +0 -45
  64. package/dist/src/addons/Waiter.js.map +0 -1
  65. package/dist/src/addons/Wizards.d.ts +0 -15
  66. package/dist/src/addons/Wizards.js +0 -48
  67. package/dist/src/addons/Wizards.js.map +0 -1
  68. package/dist/src/addons/editor/edit-action-to-v1-converter.d.ts +0 -3
  69. package/dist/src/addons/editor/edit-action-to-v1-converter.js +0 -96
  70. package/dist/src/addons/editor/edit-action-to-v1-converter.js.map +0 -1
  71. package/dist/src/addons/editor/edit-v1-to-v2-converter.d.ts +0 -2
  72. package/dist/src/addons/editor/edit-v1-to-v2-converter.js +0 -37
  73. package/dist/src/addons/editor/edit-v1-to-v2-converter.js.map +0 -1
  74. package/dist/src/addons/history/get-log-text.d.ts +0 -5
  75. package/dist/src/addons/history/get-log-text.js +0 -26
  76. package/dist/src/addons/history/get-log-text.js.map +0 -1
  77. package/dist/src/addons/menu-tabs/menu-tabs.d.ts +0 -22
  78. package/dist/src/addons/menu-tabs/menu-tabs.js +0 -74
  79. package/dist/src/addons/menu-tabs/menu-tabs.js.map +0 -1
  80. package/dist/src/addons/plugin-manager/custom-plugin-dialog.d.ts +0 -28
  81. package/dist/src/addons/plugin-manager/custom-plugin-dialog.js +0 -177
  82. package/dist/src/addons/plugin-manager/custom-plugin-dialog.js.map +0 -1
  83. package/dist/src/addons/plugin-manager/plugin-manager.d.ts +0 -20
  84. package/dist/src/addons/plugin-manager/plugin-manager.js +0 -165
  85. package/dist/src/addons/plugin-manager/plugin-manager.js.map +0 -1
  86. package/dist/src/filtered-list.d.ts +0 -27
  87. package/dist/src/filtered-list.js +0 -168
  88. package/dist/src/filtered-list.js.map +0 -1
  89. package/dist/src/finder-list.d.ts +0 -37
  90. package/dist/src/finder-list.js +0 -207
  91. package/dist/src/finder-list.js.map +0 -1
  92. package/dist/src/foundation/compare.d.ts +0 -79
  93. package/dist/src/foundation/compare.js +0 -273
  94. package/dist/src/foundation/compare.js.map +0 -1
  95. package/dist/src/foundation/dai.d.ts +0 -30
  96. package/dist/src/foundation/dai.js +0 -127
  97. package/dist/src/foundation/dai.js.map +0 -1
  98. package/dist/src/foundation/generators.d.ts +0 -13
  99. package/dist/src/foundation/generators.js +0 -67
  100. package/dist/src/foundation/generators.js.map +0 -1
  101. package/dist/src/foundation/ied.d.ts +0 -22
  102. package/dist/src/foundation/ied.js +0 -84
  103. package/dist/src/foundation/ied.js.map +0 -1
  104. package/dist/src/foundation/nsd.d.ts +0 -4
  105. package/dist/src/foundation/nsd.js +0 -13
  106. package/dist/src/foundation/nsd.js.map +0 -1
  107. package/dist/src/foundation/nsdoc.d.ts +0 -14
  108. package/dist/src/foundation/nsdoc.js +0 -180
  109. package/dist/src/foundation/nsdoc.js.map +0 -1
  110. package/dist/src/foundation/scl.d.ts +0 -1
  111. package/dist/src/foundation/scl.js +0 -64
  112. package/dist/src/foundation/scl.js.map +0 -1
  113. package/dist/src/foundation.d.ts +0 -230
  114. package/dist/src/foundation.js +0 -1922
  115. package/dist/src/foundation.js.map +0 -1
  116. package/dist/src/icons/compare.d.ts +0 -3
  117. package/dist/src/icons/compare.js +0 -11
  118. package/dist/src/icons/compare.js.map +0 -1
  119. package/dist/src/icons/icons.d.ts +0 -41
  120. package/dist/src/icons/icons.js +0 -611
  121. package/dist/src/icons/icons.js.map +0 -1
  122. package/dist/src/icons/ied-icons.d.ts +0 -3
  123. package/dist/src/icons/ied-icons.js +0 -11
  124. package/dist/src/icons/ied-icons.js.map +0 -1
  125. package/dist/src/icons/lnode.d.ts +0 -16
  126. package/dist/src/icons/lnode.js +0 -50
  127. package/dist/src/icons/lnode.js.map +0 -1
  128. package/dist/src/open-scd.d.ts +0 -131
  129. package/dist/src/open-scd.js +0 -483
  130. package/dist/src/open-scd.js.map +0 -1
  131. package/dist/src/oscd-filter-button.d.ts +0 -27
  132. package/dist/src/oscd-filter-button.js +0 -89
  133. package/dist/src/oscd-filter-button.js.map +0 -1
  134. package/dist/src/plain-compare-list.d.ts +0 -36
  135. package/dist/src/plain-compare-list.js +0 -132
  136. package/dist/src/plain-compare-list.js.map +0 -1
  137. package/dist/src/plugin-tag.d.ts +0 -6
  138. package/dist/src/plugin-tag.js +0 -23
  139. package/dist/src/plugin-tag.js.map +0 -1
  140. package/dist/src/plugin.d.ts +0 -23
  141. package/dist/src/plugin.events.d.ts +0 -15
  142. package/dist/src/plugin.events.js +0 -12
  143. package/dist/src/plugin.events.js.map +0 -1
  144. package/dist/src/plugin.js +0 -2
  145. package/dist/src/plugin.js.map +0 -1
  146. package/dist/src/plugins.d.ts +0 -3
  147. package/dist/src/plugins.js +0 -256
  148. package/dist/src/plugins.js.map +0 -1
  149. package/dist/src/schemas.d.ts +0 -58
  150. package/dist/src/schemas.js +0 -9325
  151. package/dist/src/schemas.js.map +0 -1
  152. package/dist/src/themes.d.ts +0 -3
  153. package/dist/src/themes.js +0 -122
  154. package/dist/src/themes.js.map +0 -1
  155. package/dist/src/translations/de.d.ts +0 -2
  156. package/dist/src/translations/de.js +0 -954
  157. package/dist/src/translations/de.js.map +0 -1
  158. package/dist/src/translations/en.d.ts +0 -963
  159. package/dist/src/translations/en.js +0 -950
  160. package/dist/src/translations/en.js.map +0 -1
  161. package/dist/src/translations/loader.d.ts +0 -12
  162. package/dist/src/translations/loader.js +0 -10
  163. package/dist/src/translations/loader.js.map +0 -1
  164. package/dist/src/wizard-checkbox.d.ts +0 -37
  165. package/dist/src/wizard-checkbox.js +0 -152
  166. package/dist/src/wizard-checkbox.js.map +0 -1
  167. package/dist/src/wizard-dialog.d.ts +0 -45
  168. package/dist/src/wizard-dialog.js +0 -374
  169. package/dist/src/wizard-dialog.js.map +0 -1
  170. package/dist/src/wizard-select.d.ts +0 -31
  171. package/dist/src/wizard-select.js +0 -115
  172. package/dist/src/wizard-select.js.map +0 -1
  173. package/dist/src/wizard-textfield.d.ts +0 -50
  174. package/dist/src/wizard-textfield.js +0 -191
  175. package/dist/src/wizard-textfield.js.map +0 -1
  176. package/dist/src/wizards.d.ts +0 -23
  177. package/dist/src/wizards.js +0 -196
  178. package/dist/src/wizards.js.map +0 -1
@@ -1,93 +0,0 @@
1
- import { TemplateResult, LitElement } from 'lit-element';
2
- import '@material/mwc-button';
3
- import '@material/mwc-dialog';
4
- import '@material/mwc-icon';
5
- import '@material/mwc-icon-button';
6
- import '@material/mwc-icon-button-toggle';
7
- import '@material/mwc-list';
8
- import '@material/mwc-list/mwc-list-item';
9
- import '@material/mwc-snackbar';
10
- import { Dialog } from '@material/mwc-dialog';
11
- import { Snackbar } from '@material/mwc-snackbar';
12
- import '../filtered-list.js';
13
- import { InfoEntry, IssueDetail, LogEntry } from '@openscd/core/foundation/deprecated/history.js';
14
- import { XMLEditor } from '@openscd/core';
15
- interface HistoryItem {
16
- title: string;
17
- message?: string;
18
- time: number;
19
- isActive: boolean;
20
- }
21
- export declare const historyStateEvent = "history-state";
22
- export interface HistoryState {
23
- editCount: number;
24
- canUndo: boolean;
25
- canRedo: boolean;
26
- }
27
- export type HistoryStateEvent = CustomEvent<HistoryState>;
28
- export declare enum HistoryUIKind {
29
- log = "log",
30
- history = "history",
31
- diagnostic = "diagnostic"
32
- }
33
- export interface HistoryUIDetail {
34
- show: boolean;
35
- kind: HistoryUIKind;
36
- }
37
- export type HistoryUIEvent = CustomEvent<HistoryUIDetail>;
38
- export declare function newHistoryUIEvent(show: boolean, kind: HistoryUIKind, eventInitDict?: CustomEventInit<Partial<HistoryUIDetail>>): HistoryUIEvent;
39
- export interface EmptyIssuesDetail {
40
- pluginSrc: string;
41
- }
42
- export type EmptyIssuesEvent = CustomEvent<EmptyIssuesDetail>;
43
- export declare function newEmptyIssuesEvent(pluginSrc: string, eventInitDict?: CustomEventInit<Partial<EmptyIssuesDetail>>): EmptyIssuesEvent;
44
- export declare class OscdHistory extends LitElement {
45
- /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */
46
- log: InfoEntry[];
47
- /** XML Editor to apply changes to the scd */
48
- editor: XMLEditor;
49
- diagnoses: Map<string, IssueDetail[]>;
50
- host: HTMLElement;
51
- latestIssue: IssueDetail;
52
- history: HistoryItem[];
53
- logUI: Dialog;
54
- historyUI: Dialog;
55
- diagnosticUI: Dialog;
56
- errorUI: Snackbar;
57
- warningUI: Snackbar;
58
- infoUI: Snackbar;
59
- issueUI: Snackbar;
60
- private unsubscribers;
61
- private onIssue;
62
- undo(): void;
63
- redo(): void;
64
- private onReset;
65
- private onInfo;
66
- private onLog;
67
- private historyUIHandler;
68
- private emptyIssuesHandler;
69
- private handleKeyPress;
70
- private updateHistory;
71
- constructor();
72
- connectedCallback(): void;
73
- disconnectedCallback(): void;
74
- renderLogEntry(entry: InfoEntry, index: number, log: LogEntry[]): TemplateResult;
75
- renderHistoryEntry(entry: HistoryItem): TemplateResult;
76
- private formatTime;
77
- private renderLog;
78
- private renderHistory;
79
- protected renderIssueEntry(issue: IssueDetail): TemplateResult;
80
- renderValidatorsIssues(issues: IssueDetail[]): TemplateResult[];
81
- private renderIssues;
82
- private renderFilterButtons;
83
- private renderLogDialog;
84
- private renderHistoryUI;
85
- render(): TemplateResult;
86
- }
87
- declare global {
88
- interface ElementEventMap {
89
- 'history-dialog-ui': CustomEvent<HistoryUIDetail>;
90
- 'empty-issues': CustomEvent<EmptyIssuesDetail>;
91
- }
92
- }
93
- export {};
@@ -1,491 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { html, state, property, query, customElement, LitElement, } from 'lit-element';
3
- import { get } from 'lit-translate';
4
- import '@material/mwc-button';
5
- import '@material/mwc-dialog';
6
- import '@material/mwc-icon';
7
- import '@material/mwc-icon-button';
8
- import '@material/mwc-icon-button-toggle';
9
- import '@material/mwc-list';
10
- import '@material/mwc-list/mwc-list-item';
11
- import '@material/mwc-snackbar';
12
- import '../filtered-list.js';
13
- import { getFilterIcon, iconColors } from '../icons/icons.js';
14
- import { getLogText } from './history/get-log-text.js';
15
- export const historyStateEvent = 'history-state';
16
- const icons = {
17
- info: 'info',
18
- warning: 'warning',
19
- error: 'report',
20
- };
21
- function getPluginName(src) {
22
- let storedPluginsString = localStorage.getItem('plugins');
23
- if (!storedPluginsString) {
24
- storedPluginsString = '[]';
25
- }
26
- const storedPlugins = JSON.parse(storedPluginsString);
27
- const wantedPlugin = storedPlugins.find((p) => p.src === src);
28
- if (!wantedPlugin) {
29
- return `pluginnotfound: ${src} in ${storedPluginsString}`;
30
- }
31
- const name = wantedPlugin.name;
32
- if (!name) {
33
- return `pluginhasnoname:${src}`;
34
- }
35
- return name;
36
- }
37
- export var HistoryUIKind;
38
- (function (HistoryUIKind) {
39
- HistoryUIKind["log"] = "log";
40
- HistoryUIKind["history"] = "history";
41
- HistoryUIKind["diagnostic"] = "diagnostic";
42
- })(HistoryUIKind || (HistoryUIKind = {}));
43
- export function newHistoryUIEvent(show, kind, eventInitDict) {
44
- return new CustomEvent('history-dialog-ui', {
45
- bubbles: true,
46
- composed: true,
47
- ...eventInitDict,
48
- detail: {
49
- show,
50
- kind,
51
- ...eventInitDict?.detail,
52
- },
53
- });
54
- }
55
- export function newEmptyIssuesEvent(pluginSrc, eventInitDict) {
56
- return new CustomEvent('empty-issues', {
57
- bubbles: true,
58
- composed: true,
59
- ...eventInitDict,
60
- detail: { pluginSrc, ...eventInitDict?.detail },
61
- });
62
- }
63
- let OscdHistory = class OscdHistory extends LitElement {
64
- onIssue(de) {
65
- const issues = this.diagnoses.get(de.detail.validatorId);
66
- if (!issues)
67
- this.diagnoses.set(de.detail.validatorId, [de.detail]);
68
- else
69
- issues?.push(de.detail);
70
- this.latestIssue = de.detail;
71
- this.issueUI.close();
72
- this.issueUI.show();
73
- }
74
- undo() {
75
- this.editor.undo();
76
- }
77
- redo() {
78
- this.editor.redo();
79
- }
80
- onReset() {
81
- this.log = [];
82
- this.editor.reset();
83
- this.updateHistory();
84
- }
85
- onInfo(detail) {
86
- const entry = {
87
- time: new Date(),
88
- ...detail,
89
- };
90
- this.log.push(entry);
91
- if (!this.logUI.open) {
92
- const ui = {
93
- error: this.errorUI,
94
- warning: this.warningUI,
95
- info: this.infoUI,
96
- }[detail.kind];
97
- ui.close();
98
- ui.show();
99
- }
100
- if (detail.kind == 'error') {
101
- this.errorUI.close(); // hack to reset timeout
102
- this.errorUI.show();
103
- }
104
- this.requestUpdate('log', []);
105
- }
106
- onLog(le) {
107
- switch (le.detail.kind) {
108
- case 'reset':
109
- this.onReset();
110
- break;
111
- case 'action':
112
- // No longer needed
113
- break;
114
- default:
115
- this.onInfo(le.detail);
116
- break;
117
- }
118
- }
119
- historyUIHandler(e) {
120
- const ui = {
121
- log: this.logUI,
122
- history: this.historyUI,
123
- diagnostic: this.diagnosticUI,
124
- }[e.detail.kind];
125
- if (e.detail.show)
126
- ui.show();
127
- else
128
- ui.close();
129
- }
130
- emptyIssuesHandler(e) {
131
- if (this.diagnoses.get(e.detail.pluginSrc))
132
- this.diagnoses.get(e.detail.pluginSrc).length = 0;
133
- }
134
- handleKeyPress(e) {
135
- const ctrlAnd = (key) => e.key === key && e.ctrlKey;
136
- if (ctrlAnd('y'))
137
- this.redo();
138
- if (ctrlAnd('z'))
139
- this.undo();
140
- if (ctrlAnd('l'))
141
- this.logUI.open ? this.logUI.close() : this.logUI.show();
142
- if (ctrlAnd('d'))
143
- this.diagnosticUI.open
144
- ? this.diagnosticUI.close()
145
- : this.diagnosticUI.show();
146
- }
147
- updateHistory() {
148
- const { past, future } = this.editor;
149
- const activeIndex = past.length - 1;
150
- const allEntries = [...past, ...future];
151
- this.history = allEntries.map((e, index) => {
152
- const { title, message } = getLogText(e.redo);
153
- return {
154
- isActive: index === activeIndex,
155
- time: e.time,
156
- title: e.title ?? title,
157
- message
158
- };
159
- });
160
- }
161
- constructor() {
162
- super();
163
- /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */
164
- this.log = [];
165
- this.diagnoses = new Map();
166
- this.history = [];
167
- this.unsubscribers = [];
168
- this.undo = this.undo.bind(this);
169
- this.redo = this.redo.bind(this);
170
- this.onLog = this.onLog.bind(this);
171
- this.onIssue = this.onIssue.bind(this);
172
- this.historyUIHandler = this.historyUIHandler.bind(this);
173
- this.emptyIssuesHandler = this.emptyIssuesHandler.bind(this);
174
- this.handleKeyPress = this.handleKeyPress.bind(this);
175
- document.onkeydown = this.handleKeyPress;
176
- }
177
- connectedCallback() {
178
- super.connectedCallback();
179
- this.unsubscribers.push(this.editor.subscribe(e => this.updateHistory()), this.editor.subscribeUndoRedo(e => this.updateHistory()));
180
- this.host.addEventListener('log', this.onLog);
181
- this.host.addEventListener('issue', this.onIssue);
182
- this.host.addEventListener('history-dialog-ui', this.historyUIHandler);
183
- this.host.addEventListener('empty-issues', this.emptyIssuesHandler);
184
- this.diagnoses.clear();
185
- }
186
- disconnectedCallback() {
187
- this.unsubscribers.forEach(u => u());
188
- }
189
- renderLogEntry(entry, index, log) {
190
- return html ` <abbr title="${entry.title}">
191
- <mwc-list-item
192
- class="${entry.kind}"
193
- graphic="icon"
194
- ?twoline=${!!entry.message}
195
- >
196
- <span>
197
- <!-- FIXME: replace tt with mwc-chip asap -->
198
- <tt>${entry.time?.toLocaleString()}</tt>
199
- ${entry.title}</span
200
- >
201
- <span slot="secondary">${entry.message}</span>
202
- <mwc-icon
203
- slot="graphic"
204
- style="--mdc-theme-text-icon-on-background:var(${iconColors[entry.kind]})"
205
- >${icons[entry.kind]}</mwc-icon
206
- >
207
- </mwc-list-item></abbr
208
- >`;
209
- }
210
- renderHistoryEntry(entry) {
211
- return html ` <abbr title="${entry.title}">
212
- <mwc-list-item
213
- ?twoline=${!!entry.message}
214
- ?activated=${entry.isActive}
215
- >
216
- <span>
217
- <tt>${this.formatTime(entry.time)}</tt>
218
- ${entry.title}
219
- </span>
220
- <span slot="secondary">${entry.message}</span>
221
- </mwc-list-item>
222
- </abbr>`;
223
- }
224
- formatTime(time) {
225
- const date = new Date(time);
226
- const hours = date.getHours();
227
- const minutes = date.getMinutes();
228
- return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
229
- }
230
- renderLog() {
231
- if (this.log.length > 0)
232
- return this.log.slice().reverse().map(this.renderLogEntry, this);
233
- else
234
- return html `<mwc-list-item disabled graphic="icon">
235
- <span>${get('log.placeholder')}</span>
236
- <mwc-icon slot="graphic">info</mwc-icon>
237
- </mwc-list-item>`;
238
- }
239
- renderHistory() {
240
- if (this.history.length > 0)
241
- return this.history.slice().reverse().map(e => this.renderHistoryEntry(e));
242
- else
243
- return html `<mwc-list-item disabled graphic="icon">
244
- <span>${get('history.placeholder')}</span>
245
- <mwc-icon slot="graphic">info</mwc-icon>
246
- </mwc-list-item>`;
247
- }
248
- renderIssueEntry(issue) {
249
- return html ` <abbr title="${issue.title + '\n' + issue.message}"
250
- ><mwc-list-item ?twoline=${!!issue.message}>
251
- <span> ${issue.title}</span>
252
- <span slot="secondary">${issue.message}</span>
253
- </mwc-list-item></abbr
254
- >`;
255
- }
256
- renderValidatorsIssues(issues) {
257
- if (issues.length === 0)
258
- return [html ``];
259
- return [
260
- html `
261
- <mwc-list-item noninteractive>
262
- ${getPluginName(issues[0].validatorId)}
263
- </mwc-list-item>
264
- `,
265
- html `<li divider padded role="separator"></li>`,
266
- ...issues.map(issue => this.renderIssueEntry(issue)),
267
- ];
268
- }
269
- renderIssues() {
270
- const issueItems = [];
271
- this.diagnoses.forEach(issues => {
272
- this.renderValidatorsIssues(issues).forEach(issueItem => issueItems.push(issueItem));
273
- });
274
- return issueItems.length
275
- ? issueItems
276
- : html `<mwc-list-item disabled graphic="icon">
277
- <span>${get('diag.placeholder')}</span>
278
- <mwc-icon slot="graphic">info</mwc-icon>
279
- </mwc-list-item>`;
280
- }
281
- renderFilterButtons() {
282
- return Object.keys(icons).map(kind => html `<mwc-icon-button-toggle id="${kind}filter" on
283
- >${getFilterIcon(kind, false)}
284
- ${getFilterIcon(kind, true)}</mwc-icon-button-toggle
285
- >`);
286
- }
287
- renderLogDialog() {
288
- return html ` <mwc-dialog id="log" heading="${get('log.name')}">
289
- ${this.renderFilterButtons()}
290
- <mwc-list id="content" wrapFocus>${this.renderLog()}</mwc-list>
291
- <mwc-button slot="primaryAction" dialogaction="close"
292
- >${get('close')}</mwc-button
293
- >
294
- </mwc-dialog>`;
295
- }
296
- renderHistoryUI() {
297
- return html ` <mwc-dialog id="history" heading="${get('history.name')}">
298
- <mwc-list id="content" wrapFocus>${this.renderHistory()}</mwc-list>
299
- <mwc-button
300
- icon="undo"
301
- label="${get('undo')}"
302
- ?disabled=${!this.editor.canUndo}
303
- @click=${this.undo}
304
- slot="secondaryAction"
305
- ></mwc-button>
306
- <mwc-button
307
- icon="redo"
308
- label="${get('redo')}"
309
- ?disabled=${!this.editor.canRedo}
310
- @click=${this.redo}
311
- slot="secondaryAction"
312
- ></mwc-button>
313
- <mwc-button slot="primaryAction" dialogaction="close"
314
- >${get('close')}</mwc-button
315
- >
316
- </mwc-dialog>`;
317
- }
318
- render() {
319
- return html `<slot></slot>
320
- <style>
321
- #log > mwc-icon-button-toggle {
322
- position: absolute;
323
- top: 8px;
324
- right: 14px;
325
- }
326
- #log > mwc-icon-button-toggle:nth-child(2) {
327
- right: 62px;
328
- }
329
- #log > mwc-icon-button-toggle:nth-child(3) {
330
- right: 110px;
331
- }
332
- #log > mwc-icon-button-toggle:nth-child(4) {
333
- right: 158px;
334
- }
335
- #content mwc-list-item.info,
336
- #content mwc-list-item.warning,
337
- #content mwc-list-item.error {
338
- display: none;
339
- }
340
- #infofilter[on] ~ #content mwc-list-item.info {
341
- display: flex;
342
- }
343
- #warningfilter[on] ~ #content mwc-list-item.warning {
344
- display: flex;
345
- }
346
- #errorfilter[on] ~ #content mwc-list-item.error {
347
- display: flex;
348
- }
349
-
350
- #infofilter[on] {
351
- color: var(--cyan);
352
- }
353
-
354
- #warningfilter[on] {
355
- color: var(--yellow);
356
- }
357
-
358
- #errorfilter[on] {
359
- color: var(--red);
360
- }
361
-
362
- #actionfilter[on] {
363
- color: var(--blue);
364
- }
365
-
366
- #log,
367
- #history {
368
- --mdc-dialog-min-width: 92vw;
369
- }
370
-
371
- #log > #filterContainer {
372
- position: absolute;
373
- top: 14px;
374
- right: 14px;
375
- }
376
- </style>
377
- ${this.renderLogDialog()} ${this.renderHistoryUI()}
378
- <mwc-dialog id="diagnostic" heading="${get('diag.name')}">
379
- <filtered-list id="content" wrapFocus>
380
- ${this.renderIssues()}
381
- </filtered-list>
382
- <mwc-button slot="primaryAction" dialogaction="close">
383
- ${get('close')}
384
- </mwc-button>
385
- </mwc-dialog>
386
-
387
- <mwc-snackbar
388
- id="info"
389
- timeoutMs="4000"
390
- labelText="${this.log
391
- .slice()
392
- .reverse()
393
- .find(le => le.kind === 'info')?.title ??
394
- get('log.snackbar.placeholder')}"
395
- >
396
- <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
397
- </mwc-snackbar>
398
- <mwc-snackbar
399
- id="warning"
400
- timeoutMs="6000"
401
- labelText="${this.log
402
- .slice()
403
- .reverse()
404
- .find(le => le.kind === 'warning')?.title ??
405
- get('log.snackbar.placeholder')}"
406
- >
407
- <mwc-button
408
- slot="action"
409
- icon="history"
410
- @click=${() => this.logUI.show()}
411
- >${get('log.snackbar.show')}</mwc-button
412
- >
413
- <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
414
- </mwc-snackbar>
415
- <mwc-snackbar
416
- id="error"
417
- timeoutMs="10000"
418
- labelText="${this.log
419
- .slice()
420
- .reverse()
421
- .find(le => le.kind === 'error')?.title ??
422
- get('log.snackbar.placeholder')}"
423
- >
424
- <mwc-button
425
- slot="action"
426
- icon="history"
427
- @click=${() => this.logUI.show()}
428
- >${get('log.snackbar.show')}</mwc-button
429
- >
430
- <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
431
- </mwc-snackbar>
432
- <mwc-snackbar
433
- id="issue"
434
- timeoutMs="10000"
435
- labelText="${this.latestIssue?.title ??
436
- get('log.snackbar.placeholder')}"
437
- >
438
- <mwc-button
439
- slot="action"
440
- icon="rule"
441
- @click=${() => this.diagnosticUI.show()}
442
- >${get('log.snackbar.show')}</mwc-button
443
- >
444
- <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
445
- </mwc-snackbar>`;
446
- }
447
- };
448
- __decorate([
449
- property({ type: Array })
450
- ], OscdHistory.prototype, "log", void 0);
451
- __decorate([
452
- property({ type: Object })
453
- ], OscdHistory.prototype, "editor", void 0);
454
- __decorate([
455
- property()
456
- ], OscdHistory.prototype, "diagnoses", void 0);
457
- __decorate([
458
- property({ type: Object })
459
- ], OscdHistory.prototype, "host", void 0);
460
- __decorate([
461
- state()
462
- ], OscdHistory.prototype, "latestIssue", void 0);
463
- __decorate([
464
- state()
465
- ], OscdHistory.prototype, "history", void 0);
466
- __decorate([
467
- query('#log')
468
- ], OscdHistory.prototype, "logUI", void 0);
469
- __decorate([
470
- query('#history')
471
- ], OscdHistory.prototype, "historyUI", void 0);
472
- __decorate([
473
- query('#diagnostic')
474
- ], OscdHistory.prototype, "diagnosticUI", void 0);
475
- __decorate([
476
- query('#error')
477
- ], OscdHistory.prototype, "errorUI", void 0);
478
- __decorate([
479
- query('#warning')
480
- ], OscdHistory.prototype, "warningUI", void 0);
481
- __decorate([
482
- query('#info')
483
- ], OscdHistory.prototype, "infoUI", void 0);
484
- __decorate([
485
- query('#issue')
486
- ], OscdHistory.prototype, "issueUI", void 0);
487
- OscdHistory = __decorate([
488
- customElement('oscd-history')
489
- ], OscdHistory);
490
- export { OscdHistory };
491
- //# sourceMappingURL=History.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"History.js","sourceRoot":"","sources":["../../../src/addons/History.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n state,\n property,\n query,\n TemplateResult,\n customElement,\n LitElement,\n} from 'lit-element';\n\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-button';\nimport '@material/mwc-dialog';\nimport '@material/mwc-icon';\nimport '@material/mwc-icon-button';\nimport '@material/mwc-icon-button-toggle';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-snackbar';\nimport { Dialog } from '@material/mwc-dialog';\nimport { Snackbar } from '@material/mwc-snackbar';\n\nimport '../filtered-list.js';\n\nimport {\n InfoDetail,\n InfoEntry,\n IssueDetail,\n IssueEvent,\n LogEntry,\n LogEntryType,\n LogEvent,\n} from '@openscd/core/foundation/deprecated/history.js';\n\nimport { getFilterIcon, iconColors } from '../icons/icons.js';\n\nimport { Plugin } from '../plugin.js';\nimport { XMLEditor } from '@openscd/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\nexport const historyStateEvent = 'history-state';\nexport interface HistoryState {\n editCount: number;\n canUndo: boolean;\n canRedo: boolean;\n}\nexport type HistoryStateEvent = CustomEvent<HistoryState>;\n\nconst icons = {\n info: 'info',\n warning: 'warning',\n error: 'report',\n};\n\nfunction getPluginName(src: string): string {\n\n let storedPluginsString = localStorage.getItem('plugins');\n if(!storedPluginsString) {\n storedPluginsString = '[]';\n }\n\n const storedPlugins = JSON.parse(storedPluginsString) as Plugin[];\n const wantedPlugin = storedPlugins.find((p: Plugin) => p.src === src);\n\n if(!wantedPlugin) {\n return `pluginnotfound: ${src} in ${storedPluginsString}`;\n }\n\n const name = wantedPlugin.name;\n\n if(!name){\n return `pluginhasnoname:${src}`;\n }\n\n return name;\n\n}\n\nexport enum HistoryUIKind {\n log = 'log',\n history = 'history',\n diagnostic = 'diagnostic',\n}\nexport interface HistoryUIDetail {\n show: boolean;\n kind: HistoryUIKind;\n}\n\nexport type HistoryUIEvent = CustomEvent<HistoryUIDetail>;\n\nexport function newHistoryUIEvent(\n show: boolean,\n kind: HistoryUIKind,\n eventInitDict?: CustomEventInit<Partial<HistoryUIDetail>>\n): HistoryUIEvent {\n return new CustomEvent<HistoryUIDetail>('history-dialog-ui', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: {\n show,\n kind,\n ...eventInitDict?.detail,\n },\n });\n}\n\nexport interface EmptyIssuesDetail {\n pluginSrc: string;\n}\n\nexport type EmptyIssuesEvent = CustomEvent<EmptyIssuesDetail>;\n\nexport function newEmptyIssuesEvent(\n pluginSrc: string,\n eventInitDict?: CustomEventInit<Partial<EmptyIssuesDetail>>\n): EmptyIssuesEvent {\n return new CustomEvent<EmptyIssuesDetail>('empty-issues', {\n bubbles: true,\n composed: true,\n ...eventInitDict,\n detail: { pluginSrc, ...eventInitDict?.detail },\n });\n}\n\n@customElement('oscd-history')\nexport class OscdHistory extends LitElement {\n /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */\n @property({ type: Array })\n log: InfoEntry[] = [];\n\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property()\n diagnoses = new Map<string, IssueDetail[]>();\n\n @property({ type: Object })\n host!: HTMLElement;\n\n @state()\n latestIssue!: IssueDetail;\n\n @state()\n history: HistoryItem[] = [];\n\n @query('#log') logUI!: Dialog;\n @query('#history') historyUI!: Dialog;\n @query('#diagnostic') diagnosticUI!: Dialog;\n @query('#error') errorUI!: Snackbar;\n @query('#warning') warningUI!: Snackbar;\n @query('#info') infoUI!: Snackbar;\n @query('#issue') issueUI!: Snackbar;\n\n private unsubscribers: (() => any)[] = [];\n\n private onIssue(de: IssueEvent): void {\n const issues = this.diagnoses.get(de.detail.validatorId);\n\n if (!issues) this.diagnoses.set(de.detail.validatorId, [de.detail]);\n else issues?.push(de.detail);\n\n this.latestIssue = de.detail;\n this.issueUI.close();\n this.issueUI.show();\n }\n\n undo(): void {\n this.editor.undo();\n }\n redo(): void {\n this.editor.redo();\n }\n\n private onReset() {\n this.log = [];\n this.editor.reset();\n this.updateHistory();\n }\n\n private onInfo(detail: InfoDetail) {\n const entry: InfoEntry = {\n time: new Date(),\n ...detail,\n };\n\n this.log.push(entry);\n if (!this.logUI.open) {\n const ui = {\n error: this.errorUI,\n warning: this.warningUI,\n info: this.infoUI,\n }[detail.kind];\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 this.diagnoses.clear();\n }\n\n disconnectedCallback(): void {\n this.unsubscribers.forEach(u => u());\n }\n\n renderLogEntry(\n entry: InfoEntry,\n index: number,\n log: LogEntry[]\n ): TemplateResult {\n return html` <abbr title=\"${entry.title}\">\n <mwc-list-item\n class=\"${entry.kind}\"\n graphic=\"icon\"\n ?twoline=${!!entry.message}\n >\n <span>\n <!-- FIXME: replace tt with mwc-chip asap -->\n <tt>${entry.time?.toLocaleString()}</tt>\n ${entry.title}</span\n >\n <span slot=\"secondary\">${entry.message}</span>\n <mwc-icon\n slot=\"graphic\"\n style=\"--mdc-theme-text-icon-on-background:var(${iconColors[\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"]}