blob: 52d2d4bdd27b5a932151ee3b9c8572b5912e9275 [file] [log] [blame]
/**
* @module auto-assign-sk
* @description <h2><code>auto-assign-sk</code></h2>
*
* <p>
* This element pops up a dialog with OK and Cancel buttons. Its open method returns a Promise
* which will resolve with selected incidents when the user clicks OK or resolve to undefined
* when the user clicks Cancel. The promise will be rejected if there is an error condition.
* </p>
*
*/
import { html, TemplateResult } from 'lit/html.js';
import { define } from '../../../elements-sk/modules/define';
import { $$ } from '../../../infra-sk/modules/dom';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import { Incident } from '../json';
export class AutoAssignSk extends ElementSk {
private dialog: HTMLDialogElement | null = null;
private resolve: ((value: string[] | undefined) => void) | null = null;
private incidents: Incident[] = [];
private selected: string[] = [];
private static template = (ele: AutoAssignSk) =>
html`<dialog>${ele.displayDialogContents()}</dialog>`;
constructor() {
super(AutoAssignSk.template);
}
connectedCallback(): void {
super.connectedCallback();
this._render();
this.dialog = $$('dialog', this);
}
/**
* Display the dialog.
*
* @param incidents List of incidents to choose from.
* @returns Returns a Promise that resolves on OK, and rejects on Cancel.
*
*/
public open(incidents: Incident[]): Promise<string[] | undefined> {
this.incidents = incidents;
this._render();
this.dialog!.showModal();
const select = $$('select', this) as HTMLSelectElement;
if (select) {
select.focus();
this.selected = [];
Array.from(select.selectedOptions).forEach((option) => {
this.selected.push(option.value);
});
}
return new Promise((resolve) => {
this.resolve = resolve;
});
}
private displayDialogContents(): TemplateResult {
if (Object.keys(this.incidents).length === 0) {
return html`
<h2>No unassigned active alerts found</h2>
<br />
<div class="buttons">
<button @click=${this.dismiss}>OK</button>
</div>
`;
}
return html`
<h2>The selected active alerts will be auto-assigned to owners</h2>
<select size="10" @input=${this.input} @keyup=${this.keyup} multiple>
${this.incidents.map((incident: Incident) =>
this.displayIncident(incident)
)}
</select>
<div class="buttons">
<button @click=${this.dismiss}>Cancel</button>
<button @click=${this.confirm}>OK</button>
</div>
`;
}
private displayIncident(incident: Incident): TemplateResult {
let display = incident.params.alertname;
const abbr = incident.params.abbr;
if (abbr) {
display += ` ${abbr}`;
}
if (display.length > 33) {
display = `${display.slice(0, 30)}...`;
}
display += ` -> ${incident.params.owner}`;
return html`<option value=${incident.key} selected>${display}</option>`;
}
private input(e: Event): void {
this.selected = [];
Array.from((e.target as HTMLSelectElement).selectedOptions).forEach(
(option) => {
this.selected.push(option.value);
}
);
}
private dismiss(): void {
this.dialog!.close();
this.resolve!(undefined);
}
private confirm(): void {
this.dialog!.close();
this.resolve!(this.selected);
}
private keyup(e: KeyboardEvent): void {
if (e.key === 'Enter') {
this.confirm();
}
}
}
define('auto-assign-sk', AutoAssignSk);