import "@goauthentik/admin/groups/MemberSelectModal"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { first } from "@goauthentik/common/utils"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/SearchSelect"; import "@goauthentik/elements/chips/Chip"; import "@goauthentik/elements/chips/ChipGroup"; import "@goauthentik/elements/forms/HorizontalFormElement"; import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; import { UserOption } from "@goauthentik/elements/user/utils"; import YAML from "yaml"; import { t } from "@lingui/macro"; import { CSSResult, TemplateResult, css, html } from "lit"; import { customElement } from "lit/decorators.js"; import { ifDefined } from "lit/directives/if-defined.js"; import { until } from "lit/directives/until.js"; import { CoreApi, CoreGroupsListRequest, Group, User } from "@goauthentik/api"; @customElement("ak-group-form") export class GroupForm extends ModelForm { static get styles(): CSSResult[] { return super.styles.concat(css` .pf-c-button.pf-m-control { height: 100%; } .pf-c-form-control { height: auto !important; } `); } loadInstance(pk: string): Promise { return new CoreApi(DEFAULT_CONFIG).coreGroupsRetrieve({ groupUuid: pk, }); } getSuccessMessage(): string { if (this.instance) { return t`Successfully updated group.`; } else { return t`Successfully created group.`; } } send = (data: Group): Promise => { if (this.instance?.pk) { return new CoreApi(DEFAULT_CONFIG).coreGroupsUpdate({ groupUuid: this.instance.pk, groupRequest: data, }); } else { data.users = Array.from(this.instance?.users || []); return new CoreApi(DEFAULT_CONFIG).coreGroupsCreate({ groupRequest: data, }); } }; renderForm(): TemplateResult { return html`

${t`Users added to this group will be superusers.`}

=> { const args: CoreGroupsListRequest = { ordering: "name", }; if (query !== undefined) { args.search = query; } const groups = await new CoreApi(DEFAULT_CONFIG).coreGroupsList(args); return groups.results; }} .renderElement=${(group: Group): string => { return group.name; }} .value=${(group: Group | undefined): string | undefined => { return group?.pk; }} .selected=${(group: Group): boolean => { return group.pk === this.instance?.parent; }} ?blankable=${true} >
{ // Because the model only has the IDs, map the user list to IDs const ids = items.map((u) => u.pk || 0); if (!this.instance) this.instance = {} as Group; this.instance.users = Array.from(this.instance?.users || []).concat( ids, ); this.requestUpdate(); return Promise.resolve(); }} >
${until( new CoreApi(DEFAULT_CONFIG) .coreUsersList({ ordering: "username", }) .then((users) => { return users.results.map((user) => { const selected = Array.from( this.instance?.users || [], ).some((su) => { return su == user.pk; }); if (!selected) return; return html` { if (!this.instance) return; const users = Array.from( this.instance?.users || [], ); const idx = users.indexOf(user.pk || 0); users.splice(idx, 1); this.instance.users = users; this.requestUpdate(); }} > ${UserOption(user)} `; }); }), html``, )}

${t`Set custom attributes using YAML or JSON.`}

`; } }