import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import "@goauthentik/components/ak-toggle-group"; import "@goauthentik/elements/forms/HorizontalFormElement"; import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; import "@goauthentik/elements/forms/Radio"; import "@goauthentik/elements/forms/SearchSelect"; import { msg } from "@lit/localize"; import { TemplateResult, html } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { ModelEnum, PaginatedPermissionList, RbacApi, RbacRolesListRequest, Role, } from "@goauthentik/api"; interface RoleAssignData { role: string; permissions: { [key: string]: boolean; }; } @customElement("ak-rbac-role-object-permission-form") export class RoleObjectPermissionForm extends ModelForm { @property() model?: ModelEnum; @property() objectPk?: string; @state() modelPermissions?: PaginatedPermissionList; async load(): Promise { const [appLabel, modelName] = (this.model || "").split("."); this.modelPermissions = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsList({ contentTypeModel: modelName, contentTypeAppLabel: appLabel, ordering: "codename", }); } loadInstance(): Promise { throw new Error("Method not implemented."); } getSuccessMessage(): string { return msg("Successfully assigned permission."); } send(data: RoleAssignData): Promise { return new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByRolesAssign({ uuid: data.role, permissionAssignRequest: { permissions: Object.keys(data.permissions).filter((key) => data.permissions[key]), model: this.model!, objectPk: this.objectPk, }, }); } renderForm(): TemplateResult { if (!this.modelPermissions) { return html``; } return html`
=> { const args: RbacRolesListRequest = { ordering: "name", }; if (query !== undefined) { args.search = query; } const roles = await new RbacApi(DEFAULT_CONFIG).rbacRolesList(args); return roles.results; }} .renderElement=${(role: Role): string => { return role.name; }} .value=${(role: Role | undefined): string | undefined => { return role?.pk; }} > ${this.modelPermissions?.results .filter((perm) => { const [_app, model] = this.model?.split(".") || ""; return perm.codename !== `add_${model}`; }) .map((perm) => { return html` `; })}
`; } } declare global { interface HTMLElementTagNameMap { "ak-rbac-role-object-permission-form": RoleObjectPermissionForm; } }