@oicl/openbridge-webcomponents-full-bundle 2.0.0-next.148 → 2.0.0-next.150
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/bundle/openbridge-webcomponents.bundle.js +4561 -3882
- package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
- package/custom-elements.json +535 -21
- package/dist/components/alert-list-details-experimental/alert-list-details-experimental.css.js +94 -0
- package/dist/components/alert-list-details-experimental/alert-list-details-experimental.css.js.map +1 -0
- package/dist/components/alert-list-details-experimental/alert-list-details-experimental.d.ts +72 -0
- package/dist/components/alert-list-details-experimental/alert-list-details-experimental.d.ts.map +1 -0
- package/dist/components/alert-list-details-experimental/alert-list-details-experimental.js +396 -0
- package/dist/components/alert-list-details-experimental/alert-list-details-experimental.js.map +1 -0
- package/dist/components/icon-button/icon-button.d.ts +3 -0
- package/dist/components/icon-button/icon-button.d.ts.map +1 -1
- package/dist/components/icon-button/icon-button.js +6 -0
- package/dist/components/icon-button/icon-button.js.map +1 -1
- package/dist/components/table/table.css.js +43 -0
- package/dist/components/table/table.css.js.map +1 -1
- package/dist/components/table/table.d.ts +31 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table/table.js +124 -11
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/top-bar/top-bar.d.ts.map +1 -1
- package/dist/components/top-bar/top-bar.js +8 -0
- package/dist/components/top-bar/top-bar.js.map +1 -1
- package/dist/generated/locales/es-419.d.ts +11 -1
- package/dist/generated/locales/es-419.d.ts.map +1 -1
- package/dist/generated/locales/es-419.js +11 -1
- package/dist/generated/locales/es-419.js.map +1 -1
- package/dist/generated/locales/fi-FI.d.ts +11 -1
- package/dist/generated/locales/fi-FI.d.ts.map +1 -1
- package/dist/generated/locales/fi-FI.js +11 -1
- package/dist/generated/locales/fi-FI.js.map +1 -1
- package/dist/integration-systems/integration-bar/integration-bar.d.ts +8 -8
- package/dist/integration-systems/integration-bar/integration-bar.d.ts.map +1 -1
- package/dist/integration-systems/integration-bar/integration-bar.js +13 -1
- package/dist/integration-systems/integration-bar/integration-bar.js.map +1 -1
- package/dist/integration-systems/integration-bar-dropdown/integration-bar-dropdown.d.ts +72 -7
- package/dist/integration-systems/integration-bar-dropdown/integration-bar-dropdown.d.ts.map +1 -1
- package/dist/integration-systems/integration-bar-dropdown/integration-bar-dropdown.js +99 -41
- package/dist/integration-systems/integration-bar-dropdown/integration-bar-dropdown.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/components/alert-list-details-experimental/alert-list-details-experimental.css +70 -0
- package/src/components/alert-list-details-experimental/alert-list-details-experimental.stories.ts +510 -0
- package/src/components/alert-list-details-experimental/alert-list-details-experimental.ts +457 -0
- package/src/components/icon-button/icon-button.spec.ts +52 -0
- package/src/components/icon-button/icon-button.ts +7 -0
- package/src/components/table/table.css +42 -0
- package/src/components/table/table.stories.ts +279 -0
- package/src/components/table/table.ts +177 -13
- package/src/components/top-bar/top-bar.ts +10 -0
- package/src/generated/locales/es-419.ts +11 -1
- package/src/generated/locales/fi-FI.ts +11 -1
- package/src/integration-systems/integration-bar/integration-bar.ts +21 -9
- package/src/integration-systems/integration-bar-dropdown/integration-bar-dropdown.stories.ts +70 -3
- package/src/integration-systems/integration-bar-dropdown/integration-bar-dropdown.ts +138 -52
- package/src/types.ts +6 -4
package/dist/components/alert-list-details-experimental/alert-list-details-experimental.css.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { css } from "lit";
|
|
2
|
+
const compentStyle = css`* {
|
|
3
|
+
-webkit-tap-highlight-color: transparent;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.wrapper {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
height: 100%;
|
|
10
|
+
width: 100%;
|
|
11
|
+
user-select: none;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.alert-list {
|
|
15
|
+
min-height: 0;
|
|
16
|
+
flex-grow: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.spacer {
|
|
20
|
+
flex-grow: 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.action {
|
|
24
|
+
display: flex;
|
|
25
|
+
height: var(--app-components-tool-bar-touch-target-size);
|
|
26
|
+
padding: 0px var(--app-components-alert-toolbar-margin-horizontal);
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
align-items: center;
|
|
29
|
+
flex-shrink: 0;
|
|
30
|
+
flex-grow: 0;
|
|
31
|
+
border-top: 1px solid var(--border-divider-color);
|
|
32
|
+
background: var(--container-section-color);
|
|
33
|
+
box-shadow: var(--shadow-flat);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.action .btn-group {
|
|
37
|
+
display: flex;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
obc-table::part(grid) {
|
|
41
|
+
grid-template-columns: 1fr repeat(4, min-content);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.wrapper.small obc-table::part(grid) {
|
|
45
|
+
grid-template-columns: 1fr min-content var(
|
|
46
|
+
--app-components-alert-table-row-ack-container-width-small
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.empty-list {
|
|
51
|
+
display: flex;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
height: 100%;
|
|
56
|
+
gap: var(--app-components-alert-menu-button-spacing);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.empty-list .icon {
|
|
60
|
+
height: 96px;
|
|
61
|
+
width: 96px;
|
|
62
|
+
color: var(--on-flat-neutral-color);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.empty-list .empty-title {
|
|
66
|
+
color: var(--element-active-color);
|
|
67
|
+
font-family: var(--global-typography-font-family);
|
|
68
|
+
font-weight: var(--global-typography-ui-body-active-font-weight);
|
|
69
|
+
font-size: var(--global-typography-ui-body-active-font-size);
|
|
70
|
+
line-height: var(--global-typography-ui-body-active-line-height);
|
|
71
|
+
font-feature-settings:
|
|
72
|
+
"liga" off,
|
|
73
|
+
"clig" off,
|
|
74
|
+
"ss04" on;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.empty-list .empty-description {
|
|
78
|
+
color: var(--element-neutral-color);
|
|
79
|
+
font-family: var(--global-typography-font-family);
|
|
80
|
+
font-weight: var(--global-typography-ui-body-font-weight);
|
|
81
|
+
font-size: var(--global-typography-ui-body-font-size);
|
|
82
|
+
line-height: var(--global-typography-ui-body-line-height);
|
|
83
|
+
font-feature-settings:
|
|
84
|
+
"liga" off,
|
|
85
|
+
"clig" off,
|
|
86
|
+
"ss04" on;
|
|
87
|
+
max-width: 344px;
|
|
88
|
+
text-align: center;
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
export {
|
|
92
|
+
compentStyle as default
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=alert-list-details-experimental.css.js.map
|
package/dist/components/alert-list-details-experimental/alert-list-details-experimental.css.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-list-details-experimental.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { Alert } from '../../types.js';
|
|
3
|
+
import '../icon-button/icon-button.js';
|
|
4
|
+
import '../button/button.js';
|
|
5
|
+
import '../../icons/icon-silence-iec.js';
|
|
6
|
+
import '../../icons/icon-alerts.js';
|
|
7
|
+
import '../../icons/icon-alerts-shelf.js';
|
|
8
|
+
import '../../icons/icon-alerts-active.js';
|
|
9
|
+
import '../../icons/icon-alarm-rectified-iec.js';
|
|
10
|
+
import '../../icons/icon-unacknowledged.js';
|
|
11
|
+
import '../../icons/icon-alarm-noack-iec.js';
|
|
12
|
+
import '../../icons/icon-warning-noack-iec.js';
|
|
13
|
+
import '../alert-icon/alert-icon.js';
|
|
14
|
+
import '../scrollbar/scrollbar.js';
|
|
15
|
+
export declare enum AlertListMode {
|
|
16
|
+
UNACKED = "unacked",
|
|
17
|
+
ALL = "all",
|
|
18
|
+
SHELVED = "shelved",
|
|
19
|
+
BLOCKED = "blocked",
|
|
20
|
+
RECTIFIED = "rectified"
|
|
21
|
+
}
|
|
22
|
+
export type ObcAckClickEvent = CustomEvent<{
|
|
23
|
+
alert: Alert;
|
|
24
|
+
}>;
|
|
25
|
+
export type ObcRowClickEvent = CustomEvent<{
|
|
26
|
+
alert: Alert;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function getAlertListModeData(selectedMode: AlertListMode): {
|
|
29
|
+
name: AlertListMode;
|
|
30
|
+
title: string;
|
|
31
|
+
emptyTitle: string;
|
|
32
|
+
emptyIcon: import('lit-html').TemplateResult<1>;
|
|
33
|
+
filter: (alert: Alert) => boolean;
|
|
34
|
+
};
|
|
35
|
+
export declare function canAckFilter(filter: (alert: Alert) => boolean): (alert: Alert) => boolean;
|
|
36
|
+
/**
|
|
37
|
+
* @availableWhen timeFormatter showTime==true
|
|
38
|
+
* @property defaultExpanded - Whether groups start expanded. Set false to open the list collapsed.
|
|
39
|
+
* @fires {ObcAckClickEvent} ack-click - Fired when the user clicks the "ACK" button.
|
|
40
|
+
* @fires {ObcRowClickEvent} row-click - Fired when the user clicks a row.
|
|
41
|
+
* @experimental
|
|
42
|
+
*/
|
|
43
|
+
export declare class ObcAlertListDetailsExperimental extends LitElement {
|
|
44
|
+
selectedMode: AlertListMode;
|
|
45
|
+
alerts: Alert[];
|
|
46
|
+
showTime: boolean;
|
|
47
|
+
timeFormatter: (time: Date) => string;
|
|
48
|
+
small: boolean;
|
|
49
|
+
/** Whether groups start expanded. Set false to open the list collapsed. */
|
|
50
|
+
defaultExpanded: boolean;
|
|
51
|
+
private alertList;
|
|
52
|
+
private expansionOverrides;
|
|
53
|
+
private alertByRowId;
|
|
54
|
+
getVisibleAlerts(): Alert[];
|
|
55
|
+
private onRowClick;
|
|
56
|
+
private onCellButtonClick;
|
|
57
|
+
private onExpandToggle;
|
|
58
|
+
private isExpanded;
|
|
59
|
+
private get columns();
|
|
60
|
+
private get metadata();
|
|
61
|
+
private get filteredAlerts();
|
|
62
|
+
private buildVisibleRows;
|
|
63
|
+
private buildRowCells;
|
|
64
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
65
|
+
static styles: import('lit').CSSResult;
|
|
66
|
+
}
|
|
67
|
+
declare global {
|
|
68
|
+
interface HTMLElementTagNameMap {
|
|
69
|
+
'obc-alert-list-details-experimental': ObcAlertListDetailsExperimental;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=alert-list-details-experimental.d.ts.map
|
package/dist/components/alert-list-details-experimental/alert-list-details-experimental.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-list-details-experimental.d.ts","sourceRoot":"","sources":["../../../src/components/alert-list-details-experimental/alert-list-details-experimental.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAkB,MAAM,KAAK,CAAC;AAKhD,OAAO,+BAA+B,CAAC;AACvC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,iCAAiC,CAAC;AACzC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,yCAAyC,CAAC;AACjD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,uCAAuC,CAAC;AAC/C,OAAO,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,EAMN,MAAM,gBAAgB,CAAC;AAgBxB,OAAO,2BAA2B,CAAC;AAEnC,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,SAAS,cAAc;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACzC,KAAK,EAAE,KAAK,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACzC,KAAK,EAAE,KAAK,CAAC;CACd,CAAC,CAAC;AAEH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,aAAa;;;;;oBAO1C,KAAK;EAuC1B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,IACpD,OAAO,KAAK,aAKrB;AAED;;;;;;GAMG;AACH,qBACa,+BAAgC,SAAQ,UAAU;IACnC,YAAY,EAAE,aAAa,CAAqB;IACjD,MAAM,EAAE,KAAK,EAAE,CAAM;IACnB,QAAQ,EAAE,OAAO,CAAS;IACvB,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAEV;IAC9B,KAAK,EAAE,OAAO,CAAS;IACL,eAAe,EAAE,OAAO,CAAQ;IAG7E,OAAO,CAAC,SAAS,CAAY;IAEpB,OAAO,CAAC,kBAAkB,CAA8B;IAEjE,OAAO,CAAC,YAAY,CAA4B;IAEzC,gBAAgB,IAAI,KAAK,EAAE;IAelC,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,UAAU;IAIlB,OAAO,KAAK,OAAO,GAkFlB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,CAAC,gBAAgB;IAiFxB,OAAO,CAAC,aAAa;IAkEZ,MAAM;IA0Bf,OAAgB,MAAM,0BAA2B;CAClD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qCAAqC,EAAE,+BAA+B,CAAC;KACxE;CACF"}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { unsafeCSS, LitElement, html } from "lit";
|
|
2
|
+
import { customElement } from "../../decorator.js";
|
|
3
|
+
import compentStyle from "./alert-list-details-experimental.css.js";
|
|
4
|
+
import { msg } from "@lit/localize";
|
|
5
|
+
import { property, query, state } from "lit/decorators.js";
|
|
6
|
+
import "../icon-button/icon-button.js";
|
|
7
|
+
import "../button/button.js";
|
|
8
|
+
import "../../icons/icon-silence-iec.js";
|
|
9
|
+
import "../../icons/icon-alerts.js";
|
|
10
|
+
import "../../icons/icon-alerts-shelf.js";
|
|
11
|
+
import "../../icons/icon-alerts-active.js";
|
|
12
|
+
import "../../icons/icon-alarm-rectified-iec.js";
|
|
13
|
+
import "../../icons/icon-unacknowledged.js";
|
|
14
|
+
import "../../icons/icon-alarm-noack-iec.js";
|
|
15
|
+
import "../../icons/icon-warning-noack-iec.js";
|
|
16
|
+
import "../alert-icon/alert-icon.js";
|
|
17
|
+
import { isAcknowledged, isActive, comparePriorityAlerts, isShelved, isBlocked } from "../../types.js";
|
|
18
|
+
import { requiresAcknowledgement, usesAlarmNoAckIcon, excludedFromUnackedFilter } from "../../alert-severity.js";
|
|
19
|
+
import { ObcTableCellType } from "../table/table.js";
|
|
20
|
+
import "../scrollbar/scrollbar.js";
|
|
21
|
+
var __defProp = Object.defineProperty;
|
|
22
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
23
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
24
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
25
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
26
|
+
if (decorator = decorators[i])
|
|
27
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
28
|
+
if (kind && result) __defProp(target, key, result);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
var AlertListMode = /* @__PURE__ */ ((AlertListMode2) => {
|
|
32
|
+
AlertListMode2["UNACKED"] = "unacked";
|
|
33
|
+
AlertListMode2["ALL"] = "all";
|
|
34
|
+
AlertListMode2["SHELVED"] = "shelved";
|
|
35
|
+
AlertListMode2["BLOCKED"] = "blocked";
|
|
36
|
+
AlertListMode2["RECTIFIED"] = "rectified";
|
|
37
|
+
return AlertListMode2;
|
|
38
|
+
})(AlertListMode || {});
|
|
39
|
+
function getAlertListModeData(selectedMode) {
|
|
40
|
+
if (selectedMode === "all")
|
|
41
|
+
return {
|
|
42
|
+
name: "all",
|
|
43
|
+
title: msg("All"),
|
|
44
|
+
emptyTitle: msg("No active alerts"),
|
|
45
|
+
emptyIcon: html`<obi-alerts></obi-alerts>`,
|
|
46
|
+
filter: (alert) => !isShelved(alert) && isActive(alert)
|
|
47
|
+
};
|
|
48
|
+
else if (selectedMode === "unacked")
|
|
49
|
+
return {
|
|
50
|
+
name: "unacked",
|
|
51
|
+
title: msg("Unacked"),
|
|
52
|
+
emptyTitle: msg("No unacknowledged alerts"),
|
|
53
|
+
emptyIcon: html`<obi-unacknowledged></obi-unacknowledged>`,
|
|
54
|
+
filter: (alert) => !isAcknowledged(alert) && isActive(alert) && !excludedFromUnackedFilter(alert.type) && !isShelved(alert)
|
|
55
|
+
};
|
|
56
|
+
else if (selectedMode === "shelved")
|
|
57
|
+
return {
|
|
58
|
+
name: "shelved",
|
|
59
|
+
title: msg("Shelved"),
|
|
60
|
+
emptyTitle: msg("No shelved alerts"),
|
|
61
|
+
emptyIcon: html`<obi-alerts-shelf></obi-alerts-shelf>`,
|
|
62
|
+
filter: (alert) => isShelved(alert)
|
|
63
|
+
};
|
|
64
|
+
else if (selectedMode === "blocked")
|
|
65
|
+
return {
|
|
66
|
+
name: "blocked",
|
|
67
|
+
title: msg("Blocked"),
|
|
68
|
+
emptyTitle: msg("No blocked alerts"),
|
|
69
|
+
emptyIcon: html`<obi-alerts-active></obi-alerts-active>`,
|
|
70
|
+
filter: (alert) => isBlocked(alert)
|
|
71
|
+
};
|
|
72
|
+
else if (selectedMode === "rectified")
|
|
73
|
+
return {
|
|
74
|
+
name: "rectified",
|
|
75
|
+
title: msg("Rectified"),
|
|
76
|
+
emptyTitle: msg("No rectified alerts"),
|
|
77
|
+
emptyIcon: html`<obi-alarm-rectified-iec></obi-alarm-rectified-iec>`,
|
|
78
|
+
filter: (alert) => !isActive(alert)
|
|
79
|
+
};
|
|
80
|
+
else throw new Error("Invalid selected mode");
|
|
81
|
+
}
|
|
82
|
+
function canAckFilter(filter) {
|
|
83
|
+
return (alert) => !isAcknowledged(alert) && !alert.noAck && !excludedFromUnackedFilter(alert.type) && filter(alert);
|
|
84
|
+
}
|
|
85
|
+
let ObcAlertListDetailsExperimental = class extends LitElement {
|
|
86
|
+
constructor() {
|
|
87
|
+
super(...arguments);
|
|
88
|
+
this.selectedMode = "all";
|
|
89
|
+
this.alerts = [];
|
|
90
|
+
this.showTime = false;
|
|
91
|
+
this.timeFormatter = (time) => time.toLocaleTimeString(void 0, { hour12: false });
|
|
92
|
+
this.small = false;
|
|
93
|
+
this.defaultExpanded = true;
|
|
94
|
+
this.expansionOverrides = /* @__PURE__ */ new Map();
|
|
95
|
+
this.alertByRowId = /* @__PURE__ */ new Map();
|
|
96
|
+
}
|
|
97
|
+
getVisibleAlerts() {
|
|
98
|
+
const seen = /* @__PURE__ */ new Set();
|
|
99
|
+
return this.alertList.getAllVisibleRows().map((rowId) => this.alertByRowId.get(rowId)).filter((alert) => alert !== void 0).filter((alert) => {
|
|
100
|
+
if (seen.has(alert.id)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
seen.add(alert.id);
|
|
104
|
+
return true;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
onRowClick(e) {
|
|
108
|
+
const row = this.alertByRowId.get(e.detail.row.id);
|
|
109
|
+
if (row) {
|
|
110
|
+
this.dispatchEvent(
|
|
111
|
+
new CustomEvent("row-click", { detail: { alert: row } })
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
onCellButtonClick(e) {
|
|
116
|
+
const row = this.alertByRowId.get(e.detail.rowId);
|
|
117
|
+
if (row) {
|
|
118
|
+
this.dispatchEvent(
|
|
119
|
+
new CustomEvent("ack-click", {
|
|
120
|
+
detail: { alert: row },
|
|
121
|
+
bubbles: false
|
|
122
|
+
})
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
onExpandToggle(e) {
|
|
127
|
+
const overrides = new Map(this.expansionOverrides);
|
|
128
|
+
overrides.set(e.detail.rowId, e.detail.expanded);
|
|
129
|
+
this.expansionOverrides = overrides;
|
|
130
|
+
}
|
|
131
|
+
isExpanded(rowId) {
|
|
132
|
+
return this.expansionOverrides.get(rowId) ?? this.defaultExpanded;
|
|
133
|
+
}
|
|
134
|
+
get columns() {
|
|
135
|
+
if (this.small) {
|
|
136
|
+
const columns = [
|
|
137
|
+
{
|
|
138
|
+
label: "Status",
|
|
139
|
+
key: "status",
|
|
140
|
+
sortDirection: "desc",
|
|
141
|
+
sortable: true,
|
|
142
|
+
compareFunction: (_a, _b, aRow, bRow) => {
|
|
143
|
+
const aAlert = this.alertByRowId.get(aRow.id);
|
|
144
|
+
const bAlert = this.alertByRowId.get(bRow.id);
|
|
145
|
+
if (aAlert && bAlert) {
|
|
146
|
+
return comparePriorityAlerts(aAlert, bAlert);
|
|
147
|
+
}
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
];
|
|
152
|
+
if (this.showTime) {
|
|
153
|
+
columns.push({
|
|
154
|
+
label: "Activated",
|
|
155
|
+
key: "time"
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
columns.push({
|
|
159
|
+
label: "ACK-status",
|
|
160
|
+
key: "action"
|
|
161
|
+
});
|
|
162
|
+
return columns;
|
|
163
|
+
} else {
|
|
164
|
+
const columns = [
|
|
165
|
+
{
|
|
166
|
+
label: "Status",
|
|
167
|
+
key: "status",
|
|
168
|
+
sortDirection: "desc",
|
|
169
|
+
sortable: true,
|
|
170
|
+
compareFunction: (_a, _b, aRow, bRow) => {
|
|
171
|
+
const aAlert = this.alertByRowId.get(aRow.id);
|
|
172
|
+
const bAlert = this.alertByRowId.get(bRow.id);
|
|
173
|
+
if (aAlert && bAlert) {
|
|
174
|
+
return comparePriorityAlerts(aAlert, bAlert);
|
|
175
|
+
}
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
label: "ACK-status",
|
|
181
|
+
key: "action",
|
|
182
|
+
dividerRight: true
|
|
183
|
+
}
|
|
184
|
+
];
|
|
185
|
+
if (this.showTime) {
|
|
186
|
+
columns.push({
|
|
187
|
+
label: "Activated",
|
|
188
|
+
key: "time",
|
|
189
|
+
sortable: true,
|
|
190
|
+
compareFunction: (_a, _b, aRow, bRow) => {
|
|
191
|
+
const aAlert = this.alertByRowId.get(aRow.id);
|
|
192
|
+
const bAlert = this.alertByRowId.get(bRow.id);
|
|
193
|
+
if (aAlert && bAlert) {
|
|
194
|
+
const aTime = new Date(aAlert.time);
|
|
195
|
+
const bTime = new Date(bAlert.time);
|
|
196
|
+
return aTime.getTime() - bTime.getTime();
|
|
197
|
+
}
|
|
198
|
+
return 0;
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
columns.push({
|
|
203
|
+
label: "Tag ID",
|
|
204
|
+
key: "tagId",
|
|
205
|
+
sortable: true,
|
|
206
|
+
compareFunction: (a, b) => {
|
|
207
|
+
const aText = a?.type === ObcTableCellType.Regular ? String(a.text ?? "") : "";
|
|
208
|
+
const bText = b?.type === ObcTableCellType.Regular ? String(b.text ?? "") : "";
|
|
209
|
+
return aText.localeCompare(bText);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
return columns;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
get metadata() {
|
|
216
|
+
return getAlertListModeData(this.selectedMode);
|
|
217
|
+
}
|
|
218
|
+
get filteredAlerts() {
|
|
219
|
+
return this.alerts.filter(this.metadata.filter);
|
|
220
|
+
}
|
|
221
|
+
buildVisibleRows() {
|
|
222
|
+
const alerts = this.filteredAlerts;
|
|
223
|
+
const alertIds = new Set(alerts.map((alert) => alert.id));
|
|
224
|
+
const membersByGroupId = /* @__PURE__ */ new Map();
|
|
225
|
+
const roots = [];
|
|
226
|
+
for (const alert of alerts) {
|
|
227
|
+
const groupIds = (alert.memberOf ?? []).filter(
|
|
228
|
+
(groupId) => groupId !== alert.id && alertIds.has(groupId)
|
|
229
|
+
);
|
|
230
|
+
if (groupIds.length === 0) {
|
|
231
|
+
roots.push(alert);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
for (const groupId of groupIds) {
|
|
235
|
+
const members = membersByGroupId.get(groupId) ?? [];
|
|
236
|
+
members.push(alert);
|
|
237
|
+
membersByGroupId.set(groupId, members);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const reachable = /* @__PURE__ */ new Set();
|
|
241
|
+
const markReachable = (alert) => {
|
|
242
|
+
if (reachable.has(alert.id)) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
reachable.add(alert.id);
|
|
246
|
+
for (const member of membersByGroupId.get(alert.id) ?? []) {
|
|
247
|
+
markReachable(member);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
roots.forEach(markReachable);
|
|
251
|
+
for (const alert of alerts) {
|
|
252
|
+
if (!reachable.has(alert.id)) {
|
|
253
|
+
roots.push(alert);
|
|
254
|
+
markReachable(alert);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const rows = [];
|
|
258
|
+
this.alertByRowId = /* @__PURE__ */ new Map();
|
|
259
|
+
const visit = (alert, level, parentRowId, ancestors) => {
|
|
260
|
+
const segment = encodeURIComponent(alert.id);
|
|
261
|
+
const rowId = parentRowId === void 0 ? segment : `${parentRowId}/${segment}`;
|
|
262
|
+
const members = membersByGroupId.get(alert.id) ?? [];
|
|
263
|
+
const expandableMembers = members.filter(
|
|
264
|
+
(member) => !ancestors.has(member.id)
|
|
265
|
+
);
|
|
266
|
+
const expanded = this.isExpanded(rowId);
|
|
267
|
+
this.alertByRowId.set(rowId, alert);
|
|
268
|
+
rows.push({
|
|
269
|
+
...this.buildRowCells(alert),
|
|
270
|
+
id: rowId,
|
|
271
|
+
parentId: parentRowId,
|
|
272
|
+
level,
|
|
273
|
+
expandable: expandableMembers.length > 0,
|
|
274
|
+
expanded
|
|
275
|
+
});
|
|
276
|
+
if (!expanded) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const nextAncestors = new Set(ancestors).add(alert.id);
|
|
280
|
+
for (const member of expandableMembers) {
|
|
281
|
+
visit(member, level + 1, rowId, nextAncestors);
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
for (const alert of roots) {
|
|
285
|
+
visit(alert, 0, void 0, /* @__PURE__ */ new Set());
|
|
286
|
+
}
|
|
287
|
+
return rows;
|
|
288
|
+
}
|
|
289
|
+
buildRowCells(alert) {
|
|
290
|
+
let action = {
|
|
291
|
+
type: ObcTableCellType.Regular
|
|
292
|
+
};
|
|
293
|
+
if (!isAcknowledged(alert) && isActive(alert) && requiresAcknowledgement(alert.type)) {
|
|
294
|
+
if (alert.noAck) {
|
|
295
|
+
const icon = usesAlarmNoAckIcon(alert.type) ? html`<obi-alarm-noack-iec usecsscolor></obi-alarm-noack-iec>` : html`<obi-warning-noack-iec usecsscolor></obi-warning-noack-iec>`;
|
|
296
|
+
action = {
|
|
297
|
+
type: ObcTableCellType.Regular,
|
|
298
|
+
largeIcon: true,
|
|
299
|
+
icon,
|
|
300
|
+
align: "center"
|
|
301
|
+
};
|
|
302
|
+
} else {
|
|
303
|
+
action = {
|
|
304
|
+
type: ObcTableCellType.Button,
|
|
305
|
+
text: msg("ACK")
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const status = {
|
|
310
|
+
type: ObcTableCellType.Regular,
|
|
311
|
+
largeIcon: true,
|
|
312
|
+
text: alert.text,
|
|
313
|
+
title: alert.source,
|
|
314
|
+
noWrap: true,
|
|
315
|
+
icon: html`<obc-alert-icon
|
|
316
|
+
.type=${alert.type}
|
|
317
|
+
.acknowledged=${isAcknowledged(alert)}
|
|
318
|
+
.active=${isActive(alert)}
|
|
319
|
+
></obc-alert-icon>`
|
|
320
|
+
};
|
|
321
|
+
const time = this.showTime ? {
|
|
322
|
+
type: ObcTableCellType.Regular,
|
|
323
|
+
text: this.timeFormatter(alert.time),
|
|
324
|
+
align: "center",
|
|
325
|
+
neutral: true
|
|
326
|
+
} : void 0;
|
|
327
|
+
const tagId = this.small ? void 0 : {
|
|
328
|
+
type: ObcTableCellType.Regular,
|
|
329
|
+
text: "#" + alert.id,
|
|
330
|
+
align: "right"
|
|
331
|
+
};
|
|
332
|
+
return {
|
|
333
|
+
status,
|
|
334
|
+
time,
|
|
335
|
+
action,
|
|
336
|
+
tagId
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
render() {
|
|
340
|
+
const selectedList = this.metadata;
|
|
341
|
+
const data = this.buildVisibleRows();
|
|
342
|
+
return html`
|
|
343
|
+
<div class="wrapper ${this.small ? "small" : ""}">
|
|
344
|
+
${data.length > 0 ? html` <obc-table
|
|
345
|
+
class="alert-list"
|
|
346
|
+
.data=${data}
|
|
347
|
+
.columns=${this.columns}
|
|
348
|
+
.striped=${true}
|
|
349
|
+
.showHeader=${!this.small}
|
|
350
|
+
@row-click=${this.onRowClick}
|
|
351
|
+
@cell-button-click=${this.onCellButtonClick}
|
|
352
|
+
@expand-toggle=${this.onExpandToggle}
|
|
353
|
+
></obc-table>
|
|
354
|
+
<div class="spacer"></div>` : html` <div class="empty-list">
|
|
355
|
+
<div class="icon">${selectedList.emptyIcon}</div>
|
|
356
|
+
<div class="empty-title">${selectedList.emptyTitle}</div>
|
|
357
|
+
</div>`}
|
|
358
|
+
</div>
|
|
359
|
+
`;
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
ObcAlertListDetailsExperimental.styles = unsafeCSS(compentStyle);
|
|
363
|
+
__decorateClass([
|
|
364
|
+
property({ type: String })
|
|
365
|
+
], ObcAlertListDetailsExperimental.prototype, "selectedMode", 2);
|
|
366
|
+
__decorateClass([
|
|
367
|
+
property({ type: Array })
|
|
368
|
+
], ObcAlertListDetailsExperimental.prototype, "alerts", 2);
|
|
369
|
+
__decorateClass([
|
|
370
|
+
property({ type: Boolean })
|
|
371
|
+
], ObcAlertListDetailsExperimental.prototype, "showTime", 2);
|
|
372
|
+
__decorateClass([
|
|
373
|
+
property({ attribute: false })
|
|
374
|
+
], ObcAlertListDetailsExperimental.prototype, "timeFormatter", 2);
|
|
375
|
+
__decorateClass([
|
|
376
|
+
property({ type: Boolean })
|
|
377
|
+
], ObcAlertListDetailsExperimental.prototype, "small", 2);
|
|
378
|
+
__decorateClass([
|
|
379
|
+
property({ type: Boolean, attribute: false })
|
|
380
|
+
], ObcAlertListDetailsExperimental.prototype, "defaultExpanded", 2);
|
|
381
|
+
__decorateClass([
|
|
382
|
+
query("obc-table")
|
|
383
|
+
], ObcAlertListDetailsExperimental.prototype, "alertList", 2);
|
|
384
|
+
__decorateClass([
|
|
385
|
+
state()
|
|
386
|
+
], ObcAlertListDetailsExperimental.prototype, "expansionOverrides", 2);
|
|
387
|
+
ObcAlertListDetailsExperimental = __decorateClass([
|
|
388
|
+
customElement("obc-alert-list-details-experimental")
|
|
389
|
+
], ObcAlertListDetailsExperimental);
|
|
390
|
+
export {
|
|
391
|
+
AlertListMode,
|
|
392
|
+
ObcAlertListDetailsExperimental,
|
|
393
|
+
canAckFilter,
|
|
394
|
+
getAlertListModeData
|
|
395
|
+
};
|
|
396
|
+
//# sourceMappingURL=alert-list-details-experimental.js.map
|
package/dist/components/alert-list-details-experimental/alert-list-details-experimental.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-list-details-experimental.js","sources":["../../../src/components/alert-list-details-experimental/alert-list-details-experimental.ts"],"sourcesContent":["import {LitElement, html, unsafeCSS} from 'lit';\nimport {customElement} from '../../decorator.js';\nimport compentStyle from './alert-list-details-experimental.css?inline';\nimport {msg} from '@lit/localize';\nimport {property, query, state} from 'lit/decorators.js';\nimport '../icon-button/icon-button.js';\nimport '../button/button.js';\nimport '../../icons/icon-silence-iec.js';\nimport '../../icons/icon-alerts.js';\nimport '../../icons/icon-alerts-shelf.js';\nimport '../../icons/icon-alerts-active.js';\nimport '../../icons/icon-alarm-rectified-iec.js';\nimport '../../icons/icon-unacknowledged.js';\nimport '../../icons/icon-alarm-noack-iec.js';\nimport '../../icons/icon-warning-noack-iec.js';\nimport '../alert-icon/alert-icon.js';\nimport {\n Alert,\n comparePriorityAlerts,\n isActive,\n isAcknowledged,\n isBlocked,\n isShelved,\n} from '../../types.js';\nimport {\n excludedFromUnackedFilter,\n requiresAcknowledgement,\n usesAlarmNoAckIcon,\n} from '../../alert-severity.js';\nimport {\n ObcTable,\n ObcTableCellClickEvent,\n ObcTableCellData,\n ObcTableCellType,\n ObcTableExpandToggleEvent,\n ObcTableRowClickEvent,\n ObcTableRow,\n ObcTableColumn,\n} from '../table/table.js';\nimport '../scrollbar/scrollbar.js';\n\nexport enum AlertListMode {\n UNACKED = 'unacked',\n ALL = 'all',\n SHELVED = 'shelved',\n BLOCKED = 'blocked',\n RECTIFIED = 'rectified',\n}\n\nexport type ObcAckClickEvent = CustomEvent<{\n alert: Alert;\n}>;\n\nexport type ObcRowClickEvent = CustomEvent<{\n alert: Alert;\n}>;\n\nexport function getAlertListModeData(selectedMode: AlertListMode) {\n if (selectedMode === AlertListMode.ALL)\n return {\n name: AlertListMode.ALL,\n title: msg('All'),\n emptyTitle: msg('No active alerts'),\n emptyIcon: html`<obi-alerts></obi-alerts>`,\n filter: (alert: Alert) => !isShelved(alert) && isActive(alert),\n };\n else if (selectedMode === AlertListMode.UNACKED)\n return {\n name: AlertListMode.UNACKED,\n title: msg('Unacked'),\n emptyTitle: msg('No unacknowledged alerts'),\n emptyIcon: html`<obi-unacknowledged></obi-unacknowledged>`,\n filter: (alert: Alert) =>\n !isAcknowledged(alert) &&\n isActive(alert) &&\n !excludedFromUnackedFilter(alert.type) &&\n !isShelved(alert),\n };\n else if (selectedMode === AlertListMode.SHELVED)\n return {\n name: AlertListMode.SHELVED,\n title: msg('Shelved'),\n emptyTitle: msg('No shelved alerts'),\n emptyIcon: html`<obi-alerts-shelf></obi-alerts-shelf>`,\n filter: (alert: Alert) => isShelved(alert),\n };\n else if (selectedMode === AlertListMode.BLOCKED)\n return {\n name: AlertListMode.BLOCKED,\n title: msg('Blocked'),\n emptyTitle: msg('No blocked alerts'),\n emptyIcon: html`<obi-alerts-active></obi-alerts-active>`,\n filter: (alert: Alert) => isBlocked(alert),\n };\n else if (selectedMode === AlertListMode.RECTIFIED)\n return {\n name: AlertListMode.RECTIFIED,\n title: msg('Rectified'),\n emptyTitle: msg('No rectified alerts'),\n emptyIcon: html`<obi-alarm-rectified-iec></obi-alarm-rectified-iec>`,\n filter: (alert: Alert) => !isActive(alert),\n };\n else throw new Error('Invalid selected mode');\n}\n\nexport function canAckFilter(filter: (alert: Alert) => boolean) {\n return (alert: Alert) =>\n !isAcknowledged(alert) &&\n !alert.noAck &&\n !excludedFromUnackedFilter(alert.type) &&\n filter(alert);\n}\n\n/**\n * @availableWhen timeFormatter showTime==true\n * @property defaultExpanded - Whether groups start expanded. Set false to open the list collapsed.\n * @fires {ObcAckClickEvent} ack-click - Fired when the user clicks the \"ACK\" button.\n * @fires {ObcRowClickEvent} row-click - Fired when the user clicks a row.\n * @experimental\n */\n@customElement('obc-alert-list-details-experimental')\nexport class ObcAlertListDetailsExperimental extends LitElement {\n @property({type: String}) selectedMode: AlertListMode = AlertListMode.ALL;\n @property({type: Array}) alerts: Alert[] = [];\n @property({type: Boolean}) showTime: boolean = false;\n @property({attribute: false}) timeFormatter: (time: Date) => string = (\n time: Date\n ) => time.toLocaleTimeString(undefined, {hour12: false});\n @property({type: Boolean}) small: boolean = false;\n @property({type: Boolean, attribute: false}) defaultExpanded: boolean = true;\n\n @query('obc-table')\n private alertList!: ObcTable;\n\n @state() private expansionOverrides = new Map<string, boolean>();\n\n private alertByRowId = new Map<string, Alert>();\n\n public getVisibleAlerts(): Alert[] {\n const seen = new Set<string>();\n return this.alertList\n .getAllVisibleRows()\n .map((rowId) => this.alertByRowId.get(rowId))\n .filter((alert): alert is Alert => alert !== undefined)\n .filter((alert) => {\n if (seen.has(alert.id)) {\n return false;\n }\n seen.add(alert.id);\n return true;\n });\n }\n\n private onRowClick(e: ObcTableRowClickEvent) {\n const row = this.alertByRowId.get(e.detail.row.id);\n if (row) {\n this.dispatchEvent(\n new CustomEvent('row-click', {detail: {alert: row}}) as ObcRowClickEvent\n );\n }\n }\n\n private onCellButtonClick(e: ObcTableCellClickEvent) {\n const row = this.alertByRowId.get(e.detail.rowId);\n if (row) {\n this.dispatchEvent(\n new CustomEvent('ack-click', {\n detail: {alert: row},\n bubbles: false,\n }) as ObcAckClickEvent\n );\n }\n }\n\n private onExpandToggle(e: ObcTableExpandToggleEvent) {\n const overrides = new Map(this.expansionOverrides);\n overrides.set(e.detail.rowId, e.detail.expanded);\n this.expansionOverrides = overrides;\n }\n\n private isExpanded(rowId: string) {\n return this.expansionOverrides.get(rowId) ?? this.defaultExpanded;\n }\n\n private get columns() {\n if (this.small) {\n const columns: ObcTableColumn<ObcTableCellData, ObcTableRow>[] = [\n {\n label: 'Status',\n key: 'status',\n sortDirection: 'desc',\n sortable: true,\n compareFunction: (_a, _b, aRow, bRow) => {\n const aAlert = this.alertByRowId.get(aRow.id);\n const bAlert = this.alertByRowId.get(bRow.id);\n if (aAlert && bAlert) {\n return comparePriorityAlerts(aAlert, bAlert);\n }\n return 0;\n },\n },\n ];\n if (this.showTime) {\n columns.push({\n label: 'Activated',\n key: 'time',\n });\n }\n columns.push({\n label: 'ACK-status',\n key: 'action',\n });\n return columns;\n } else {\n const columns: ObcTableColumn<ObcTableCellData, ObcTableRow>[] = [\n {\n label: 'Status',\n key: 'status',\n sortDirection: 'desc',\n sortable: true,\n compareFunction: (_a, _b, aRow, bRow) => {\n const aAlert = this.alertByRowId.get(aRow.id);\n const bAlert = this.alertByRowId.get(bRow.id);\n if (aAlert && bAlert) {\n return comparePriorityAlerts(aAlert, bAlert);\n }\n return 0;\n },\n },\n {\n label: 'ACK-status',\n key: 'action',\n dividerRight: true,\n },\n ];\n if (this.showTime) {\n columns.push({\n label: 'Activated',\n key: 'time',\n sortable: true,\n compareFunction: (_a, _b, aRow, bRow) => {\n const aAlert = this.alertByRowId.get(aRow.id);\n const bAlert = this.alertByRowId.get(bRow.id);\n if (aAlert && bAlert) {\n const aTime = new Date(aAlert.time);\n const bTime = new Date(bAlert.time);\n return aTime.getTime() - bTime.getTime();\n }\n return 0;\n },\n });\n }\n columns.push({\n label: 'Tag ID',\n key: 'tagId',\n sortable: true,\n compareFunction: (a, b) => {\n const aText =\n a?.type === ObcTableCellType.Regular ? String(a.text ?? '') : '';\n const bText =\n b?.type === ObcTableCellType.Regular ? String(b.text ?? '') : '';\n return aText.localeCompare(bText);\n },\n });\n return columns;\n }\n }\n\n private get metadata() {\n return getAlertListModeData(this.selectedMode);\n }\n\n private get filteredAlerts() {\n return this.alerts.filter(this.metadata.filter);\n }\n\n private buildVisibleRows(): ObcTableRow[] {\n const alerts = this.filteredAlerts;\n const alertIds = new Set(alerts.map((alert) => alert.id));\n const membersByGroupId = new Map<string, Alert[]>();\n const roots: Alert[] = [];\n for (const alert of alerts) {\n const groupIds = (alert.memberOf ?? []).filter(\n (groupId) => groupId !== alert.id && alertIds.has(groupId)\n );\n if (groupIds.length === 0) {\n roots.push(alert);\n continue;\n }\n for (const groupId of groupIds) {\n const members = membersByGroupId.get(groupId) ?? [];\n members.push(alert);\n membersByGroupId.set(groupId, members);\n }\n }\n\n const reachable = new Set<string>();\n const markReachable = (alert: Alert) => {\n if (reachable.has(alert.id)) {\n return;\n }\n reachable.add(alert.id);\n for (const member of membersByGroupId.get(alert.id) ?? []) {\n markReachable(member);\n }\n };\n roots.forEach(markReachable);\n for (const alert of alerts) {\n if (!reachable.has(alert.id)) {\n roots.push(alert);\n markReachable(alert);\n }\n }\n\n const rows: ObcTableRow[] = [];\n this.alertByRowId = new Map();\n const visit = (\n alert: Alert,\n level: number,\n parentRowId: string | undefined,\n ancestors: Set<string>\n ) => {\n const segment = encodeURIComponent(alert.id);\n const rowId =\n parentRowId === undefined ? segment : `${parentRowId}/${segment}`;\n const members = membersByGroupId.get(alert.id) ?? [];\n // A member can name a group that is also its own descendant.\n const expandableMembers = members.filter(\n (member) => !ancestors.has(member.id)\n );\n const expanded = this.isExpanded(rowId);\n\n this.alertByRowId.set(rowId, alert);\n rows.push({\n ...this.buildRowCells(alert),\n id: rowId,\n parentId: parentRowId,\n level,\n expandable: expandableMembers.length > 0,\n expanded,\n });\n\n if (!expanded) {\n return;\n }\n const nextAncestors = new Set(ancestors).add(alert.id);\n for (const member of expandableMembers) {\n visit(member, level + 1, rowId, nextAncestors);\n }\n };\n\n for (const alert of roots) {\n visit(alert, 0, undefined, new Set());\n }\n return rows;\n }\n\n private buildRowCells(\n alert: Alert\n ): Record<string, ObcTableCellData | undefined> {\n let action: ObcTableCellData = {\n type: ObcTableCellType.Regular,\n };\n if (\n !isAcknowledged(alert) &&\n isActive(alert) &&\n requiresAcknowledgement(alert.type)\n ) {\n if (alert.noAck) {\n const icon = usesAlarmNoAckIcon(alert.type)\n ? html`<obi-alarm-noack-iec usecsscolor></obi-alarm-noack-iec>`\n : html`<obi-warning-noack-iec usecsscolor></obi-warning-noack-iec>`;\n action = {\n type: ObcTableCellType.Regular,\n largeIcon: true,\n icon,\n align: 'center',\n };\n } else {\n action = {\n type: ObcTableCellType.Button,\n text: msg('ACK'),\n };\n }\n }\n\n const status: ObcTableCellData = {\n type: ObcTableCellType.Regular,\n largeIcon: true,\n text: alert.text,\n title: alert.source,\n noWrap: true,\n icon: html`<obc-alert-icon\n .type=${alert.type}\n .acknowledged=${isAcknowledged(alert)}\n .active=${isActive(alert)}\n ></obc-alert-icon>`,\n };\n\n const time: ObcTableCellData | undefined = this.showTime\n ? {\n type: ObcTableCellType.Regular,\n text: this.timeFormatter(alert.time),\n align: 'center',\n neutral: true,\n }\n : undefined;\n\n const tagId: ObcTableCellData | undefined = this.small\n ? undefined\n : {\n type: ObcTableCellType.Regular,\n text: '#' + alert.id,\n align: 'right',\n };\n return {\n status,\n time,\n action,\n tagId,\n };\n }\n\n override render() {\n const selectedList = this.metadata;\n const data = this.buildVisibleRows();\n\n return html`\n <div class=\"wrapper ${this.small ? 'small' : ''}\">\n ${data.length > 0\n ? html` <obc-table\n class=\"alert-list\"\n .data=${data}\n .columns=${this.columns}\n .striped=${true}\n .showHeader=${!this.small}\n @row-click=${this.onRowClick}\n @cell-button-click=${this.onCellButtonClick}\n @expand-toggle=${this.onExpandToggle}\n ></obc-table>\n <div class=\"spacer\"></div>`\n : html` <div class=\"empty-list\">\n <div class=\"icon\">${selectedList.emptyIcon}</div>\n <div class=\"empty-title\">${selectedList.emptyTitle}</div>\n </div>`}\n </div>\n `;\n }\n\n static override styles = unsafeCSS(compentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-alert-list-details-experimental': ObcAlertListDetailsExperimental;\n }\n}\n"],"names":["AlertListMode"],"mappings":"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"}
|
|
@@ -89,6 +89,7 @@ export declare enum IconButtonVariant {
|
|
|
89
89
|
* If undefined, no progress indicator is shown.
|
|
90
90
|
* @property hasLabel - If true, displays a label below the icon using the `label` slot.
|
|
91
91
|
* @property showDivider - If false, and cornerLeft or cornerRight is true, the divider is not shown.
|
|
92
|
+
* @property ariaLabel - Accessible name forwarded to the inner `<button>`, mapped to the `aria-label` attribute. `aria-labelledby` is not supported: ID references cannot cross the shadow boundary.
|
|
92
93
|
* @slot - Icon slot (default): Place an icon such as <obi-search> here.
|
|
93
94
|
* @slot label - Optional label shown below the icon when `hasLabel` is true.
|
|
94
95
|
* @fires click - Fired when the button is clicked (if not disabled).
|
|
@@ -120,6 +121,8 @@ export declare class ObcIconButton extends LitElement {
|
|
|
120
121
|
hasLabel: boolean;
|
|
121
122
|
/** If false, and cornerLeft or cornerRight is true, the divider is not shown. */
|
|
122
123
|
showDivider: boolean;
|
|
124
|
+
/** Accessible name forwarded to the inner `<button>`, mapped to the `aria-label` attribute. `aria-labelledby` is not supported: ID references cannot cross the shadow boundary. */
|
|
125
|
+
ariaLabel: string | null;
|
|
123
126
|
get progressSpinner(): import('lit-html').TemplateResult<1> | typeof nothing;
|
|
124
127
|
render(): import('lit-html').TemplateResult<1>;
|
|
125
128
|
static styles: import('lit').CSSResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/icon-button/icon-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAQ,OAAO,EAAY,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/icon-button/icon-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAQ,OAAO,EAAY,MAAM,KAAK,CAAC;AAQzD;;;;;;GAMG;AACH,oBAAY,iBAAiB;IAC3B,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,WAAW,gBAAgB;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkFG;AACH,qBACa,aAAc,SAAQ,UAAU;IAC3C;;;;;OAKG;IACuB,OAAO,EAAE,iBAAiB,CACzB;IAEA,SAAS,UAAS;IAElB,UAAU,UAAS;IAEnB,WAAW,UAAS;IAEpB,WAAW,UAAS;IAEpB,IAAI,UAAS;IAEb,QAAQ,UAAS;IAElB,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAa;IAExC,QAAQ,EAAE,OAAO,CAAS;IAER,WAAW,UAAQ;IAIvD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEzC,IAAI,eAAe,0DAoDlB;IAEQ,MAAM;IAkCf,OAAgB,MAAM,0BAAwB;CAC/C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
|