web/admin: application wizard (part 1) (#2745)

* initial

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* remove log

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* start oauth

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* use form for all type wizard pages

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* more oauth

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* basic wizard actions

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* make resets work

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* add hint in provider wizard

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* render correct icon in empty state in table page

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* improve empty state

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* more

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* add more pages

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* fix

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* add group PK to service account creation response

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* use wizard-level isValid prop

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>

* re-add old buttons

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens L
2022-06-26 00:46:40 +02:00
committed by GitHub
parent a8c04f96d2
commit 504338ea66
36 changed files with 1275 additions and 147 deletions

View File

@ -29,6 +29,10 @@ export class APIError extends Error {
}
}
export interface KeyUnknown {
[key: string]: unknown;
}
@customElement("ak-form")
export class Form<T> extends LitElement {
viewportCheck = true;
@ -101,15 +105,11 @@ export class Form<T> extends LitElement {
ironForm?.reset();
}
/**
* If this form contains a file input, and the input as been filled, this function returns
* said file.
* @returns File object or undefined
*/
getFormFile(): File | undefined {
getFormFiles(): { [key: string]: File } {
const ironForm = this.shadowRoot?.querySelector("iron-form");
const files: { [key: string]: File } = {};
if (!ironForm) {
return;
return files;
}
const elements = ironForm._getSubmittableElements();
for (let i = 0; i < elements.length; i++) {
@ -118,13 +118,18 @@ export class Form<T> extends LitElement {
if ((element.files || []).length < 1) {
continue;
}
// We already checked the length
return (element.files || [])[0];
files[element.name] = (element.files || [])[0];
}
}
return files;
}
serializeForm(form: IronFormElement): T {
serializeForm(): T | undefined {
const form = this.shadowRoot?.querySelector<IronFormElement>("iron-form");
if (!form) {
console.warn("authentik/forms: failed to find iron-form");
return;
}
const elements: HTMLInputElement[] = form._getSubmittableElements();
const json: { [key: string]: unknown } = {};
elements.forEach((element) => {
@ -189,12 +194,15 @@ export class Form<T> extends LitElement {
submit(ev: Event): Promise<unknown> | undefined {
ev.preventDefault();
const ironForm = this.shadowRoot?.querySelector("iron-form");
if (!ironForm) {
const data = this.serializeForm();
if (!data) {
return;
}
const form = this.shadowRoot?.querySelector<IronFormElement>("iron-form");
if (!form) {
console.warn("authentik/forms: failed to find iron-form");
return;
}
const data = this.serializeForm(ironForm);
return this.send(data)
.then((r) => {
showMessage({
@ -221,7 +229,7 @@ export class Form<T> extends LitElement {
throw errorMessage;
}
// assign all input-related errors to their elements
const elements: HorizontalFormElement[] = ironForm._getSubmittableElements();
const elements: HorizontalFormElement[] = form._getSubmittableElements();
elements.forEach((element) => {
const elementName = element.name;
if (!elementName) return;