From c44aa2a20446720735824c5a963b15e758f1351e Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Sat, 10 Apr 2021 20:13:35 +0200 Subject: [PATCH] web/elements: add TableModal for selecting objects in a modal Signed-off-by: Jens Langhammer --- web/src/elements/buttons/ModalButton.ts | 36 +++++------ web/src/elements/table/TableModal.ts | 80 +++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 18 deletions(-) create mode 100644 web/src/elements/table/TableModal.ts diff --git a/web/src/elements/buttons/ModalButton.ts b/web/src/elements/buttons/ModalButton.ts index dc58f8e4b..e552ef617 100644 --- a/web/src/elements/buttons/ModalButton.ts +++ b/web/src/elements/buttons/ModalButton.ts @@ -13,6 +13,23 @@ import PFContent from "@patternfly/patternfly/components/Content/content.css"; import AKGlobal from "../../authentik.css"; import { PFSize } from "../Spinner"; +export const MODAL_BUTTON_STYLES = css` + :host { + text-align: left; + font-size: var(--pf-global--FontSize--md); + } + .pf-c-modal-box.pf-m-lg { + overflow-y: auto; + } + .pf-c-modal-box > .pf-c-button + * { + margin-right: 0; + } + /* fix multiple selects height */ + select[multiple] { + height: 15em; + } +`; + @customElement("ak-modal-button") export class ModalButton extends LitElement { @property() @@ -22,24 +39,7 @@ export class ModalButton extends LitElement { open = false; static get styles(): CSSResult[] { - return [PFBase, PFButton, PFModalBox, PFForm, PFFormControl, PFBullseye, PFBackdrop, PFPage, PFStack, PFCard, PFContent, AKGlobal].concat( - css` - :host { - text-align: left; - font-size: var(--pf-global--FontSize--md); - } - .pf-c-modal-box.pf-m-lg { - overflow-y: auto; - } - .pf-c-modal-box > .pf-c-button + * { - margin-right: 0; - } - /* fix multiple selects height */ - select[multiple] { - height: 15em; - } - ` - ); + return [PFBase, PFButton, PFModalBox, PFForm, PFFormControl, PFBullseye, PFBackdrop, PFPage, PFStack, PFCard, PFContent, AKGlobal, MODAL_BUTTON_STYLES]; } constructor() { diff --git a/web/src/elements/table/TableModal.ts b/web/src/elements/table/TableModal.ts new file mode 100644 index 000000000..9dc614608 --- /dev/null +++ b/web/src/elements/table/TableModal.ts @@ -0,0 +1,80 @@ +import { CSSResult, LitElement, property } from "lit-element"; +import { html, TemplateResult } from "lit-html"; +import { Table } from "./Table"; +import PFModalBox from "@patternfly/patternfly/components/ModalBox/modal-box.css"; +import PFBullseye from "@patternfly/patternfly/layouts/Bullseye/bullseye.css"; +import PFBackdrop from "@patternfly/patternfly/components/Backdrop/backdrop.css"; +import PFStack from "@patternfly/patternfly/layouts/Stack/stack.css"; +import PFPage from "@patternfly/patternfly/components/Page/page.css"; +import PFContent from "@patternfly/patternfly/components/Content/content.css"; +import AKGlobal from "../../authentik.css"; +import { PFSize } from "../Spinner"; +import { MODAL_BUTTON_STYLES } from "../buttons/ModalButton"; + +export abstract class TableModal extends Table { + @property() + size: PFSize = PFSize.Large; + + @property({ type: Boolean }) + open = false; + + static get styles(): CSSResult[] { + return super.styles.concat(PFModalBox, PFBullseye, PFContent, PFBackdrop, PFPage, PFStack, AKGlobal, MODAL_BUTTON_STYLES); + } + + constructor() { + super(); + window.addEventListener("keyup", (e) => { + if (e.code === "Escape") { + this.resetForms(); + this.open = false; + } + }); + } + + resetForms(): void { + this.querySelectorAll("[slot=form]").forEach(form => { + form.reset(); + }); + } + + onClick(): void { + this.open = true; + this.querySelectorAll("*").forEach(child => { + if ("requestUpdate" in child) { + (child as LitElement).requestUpdate(); + } + }); + } + + renderModalInner(): TemplateResult { + return this.renderTable(); + } + + renderModal(): TemplateResult { + return html`
+
+ +
+
`; + } + + render(): TemplateResult { + return html` this.onClick()}> + ${this.open ? this.renderModal() : ""}`; + } +}