From 07b6356b38ad712447f4acc122ea77c5020184b9 Mon Sep 17 00:00:00 2001 From: Ken Sternberg <133134217+kensternberg-authentik@users.noreply.github.com> Date: Thu, 15 Feb 2024 09:08:55 -0800 Subject: [PATCH] =?UTF-8?q?web:=20fix=20save=20&=20reset=20behavior=20on?= =?UTF-8?q?=20System=20=E2=9E=B2=20Settings=20page.=20(#8528)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/admin-settings/AdminSettingsForm.ts | 25 +++++--- .../admin/admin-settings/AdminSettingsPage.ts | 63 +++++++++---------- 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/web/src/admin/admin-settings/AdminSettingsForm.ts b/web/src/admin/admin-settings/AdminSettingsForm.ts index 6460544032..c1af0fb068 100644 --- a/web/src/admin/admin-settings/AdminSettingsForm.ts +++ b/web/src/admin/admin-settings/AdminSettingsForm.ts @@ -22,25 +22,36 @@ import { AdminApi, Settings, SettingsRequest } from "@goauthentik/api"; @customElement("ak-admin-settings-form") export class AdminSettingsForm extends Form { - @property({ attribute: false }) - set settings(value: Settings) { + // + // Custom property accessors in Lit 2 require a manual call to requestUpdate(). See: + // https://lit.dev/docs/v2/components/properties/#accessors-custom + // + set settings(value: Settings | undefined) { this._settings = value; + this.requestUpdate(); + } + + @property({ type: Object }) + get settings() { + return this._settings; } private _settings?: Settings; + static get styles(): CSSResult[] { + return super.styles.concat(PFList); + } + getSuccessMessage(): string { return msg("Successfully updated settings."); } async send(data: SettingsRequest): Promise { - return new AdminApi(DEFAULT_CONFIG).adminSettingsUpdate({ + const result = await new AdminApi(DEFAULT_CONFIG).adminSettingsUpdate({ settingsRequest: data, }); - } - - static get styles(): CSSResult[] { - return super.styles.concat(PFList); + this.dispatchEvent(new CustomEvent("ak-admin-setting-changed")); + return result; } renderForm(): TemplateResult { diff --git a/web/src/admin/admin-settings/AdminSettingsPage.ts b/web/src/admin/admin-settings/AdminSettingsPage.ts index c6c8e9997e..07113a543b 100644 --- a/web/src/admin/admin-settings/AdminSettingsPage.ts +++ b/web/src/admin/admin-settings/AdminSettingsPage.ts @@ -14,8 +14,8 @@ import "@goauthentik/elements/buttons/SpinnerButton"; import "@goauthentik/elements/forms/ModalForm"; import { msg } from "@lit/localize"; -import { CSSResult, TemplateResult, html } from "lit"; -import { customElement, property } from "lit/decorators.js"; +import { html, nothing } from "lit"; +import { customElement, query, state } from "lit/decorators.js"; import PFBanner from "@patternfly/patternfly/components/Banner/banner.css"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; @@ -32,7 +32,7 @@ import { AdminApi, Settings } from "@goauthentik/api"; @customElement("ak-admin-settings") export class AdminSettingsPage extends AKElement { - static get styles(): CSSResult[] { + static get styles() { return [ PFBase, PFButton, @@ -46,41 +46,46 @@ export class AdminSettingsPage extends AKElement { PFBanner, ]; } - @property({ attribute: false }) + + @query("ak-admin-settings-form#form") + form?: AdminSettingsForm; + + @state() settings?: Settings; - loadSettings(): void { - new AdminApi(DEFAULT_CONFIG).adminSettingsRetrieve().then((settings) => { + constructor() { + super(); + AdminSettingsPage.fetchSettings().then((settings) => { this.settings = settings; }); + this.save = this.save.bind(this); + this.reset = this.reset.bind(this); + this.addEventListener("ak-admin-setting-changed", this.handleUpdate.bind(this)); } - firstUpdated(): void { - this.loadSettings(); + static async fetchSettings() { + return await new AdminApi(DEFAULT_CONFIG).adminSettingsRetrieve(); } - async save(): Promise { - const form = this.shadowRoot?.querySelector("ak-admin-settings-form"); - if (!form) { + async handleUpdate() { + this.settings = await AdminSettingsPage.fetchSettings(); + } + + async save() { + if (!this.form) { return; } - await form.submit(new Event("submit")); - this.resetForm(); + await this.form.submit(new Event("submit")); + this.settings = await AdminSettingsPage.fetchSettings(); } - resetForm(): void { - const form = this.shadowRoot?.querySelector("ak-admin-settings-form"); - if (!form) { - return; - } - this.loadSettings(); - form.settings = this.settings!; - form.resetForm(); + async reset() { + this.form?.resetForm(); } - render(): TemplateResult { + render() { if (!this.settings) { - return html``; + return nothing; } return html` @@ -93,18 +98,10 @@ export class AdminSettingsPage extends AKElement {