import { DEFAULT_CONFIG } from "@goauthentik/app/common/api/config"; import { PaginatedResponse, Table, TableColumn } from "@goauthentik/app/elements/table/Table"; import "@goauthentik/elements/forms/DeleteBulkForm"; import "@goauthentik/elements/forms/ModalForm"; import "@goauthentik/elements/rbac/RoleObjectPermissionForm"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; import { msg } from "@lit/localize"; import { TemplateResult, html } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { ifDefined } from "lit/directives/if-defined.js"; import { PaginatedPermissionList, RbacApi, RbacPermissionsAssignedByRolesListModelEnum, RoleAssignedObjectPermission, } from "@goauthentik/api"; @customElement("ak-rbac-role-object-permission-table") export class RoleAssignedObjectPermissionTable extends Table { @property() model?: RbacPermissionsAssignedByRolesListModelEnum; @property() objectPk?: string | number; @state() modelPermissions?: PaginatedPermissionList; checkbox = true; async apiEndpoint(page: number): Promise> { const perms = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByRolesList({ page: page, // TODO: better default model: this.model || RbacPermissionsAssignedByRolesListModelEnum.CoreUser, objectPk: this.objectPk?.toString(), }); const [appLabel, modelName] = (this.model || "").split("."); const modelPermissions = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsList({ contentTypeModel: modelName, contentTypeAppLabel: appLabel, ordering: "codename", }); modelPermissions.results = modelPermissions.results.filter((value) => { return !value.codename.startsWith("add_"); }); this.modelPermissions = modelPermissions; return perms; } columns(): TableColumn[] { const baseColumns = [new TableColumn("User", "user")]; // We don't check pagination since models shouldn't need to have that many permissions? this.modelPermissions?.results.forEach((perm) => { baseColumns.push(new TableColumn(perm.name, perm.codename)); }); return baseColumns; } renderObjectCreate(): TemplateResult { return html` ${msg("Assign")} ${msg("Assign permission to role")} `; } renderToolbarSelected(): TemplateResult { const disabled = this.selectedElements.length < 1; return html` { return [{ key: msg("Permission"), value: item.name }]; }} .delete=${(item: RoleAssignedObjectPermission) => { return new RbacApi( DEFAULT_CONFIG, ).rbacPermissionsAssignedByRolesUnassignPartialUpdate({ uuid: item.rolePk, patchedPermissionAssignRequest: { objectPk: this.objectPk?.toString(), model: this.model, permissions: item.permissions.map((perm) => { return `${perm.appLabel}.${perm.codename}`; }), }, }); }} > `; } row(item: RoleAssignedObjectPermission): TemplateResult[] { const baseRow = [html` ${item.name}`]; this.modelPermissions?.results.forEach((perm) => { const granted = item.permissions.filter((uperm) => uperm.codename === perm.codename).length > 0; baseRow.push(html` { console.log(granted); }} class="pf-m-link" > ${granted ? html`` : html`X`} `); }); return baseRow; } }