Files
authentik/web/src/admin/rbac/RoleObjectPermissionTable.ts
Simonyi Gergő 44fb59eb18 rbac: fix RoleObjectPermissionTable not showing add_user_to_group (#14312)
fix RoleObjectPermissionTable not showing `add_user_to_group`
2025-05-02 17:42:19 +02:00

130 lines
5.1 KiB
TypeScript

import "@goauthentik/admin/rbac/RoleObjectPermissionForm";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import "@goauthentik/elements/forms/DeleteBulkForm";
import "@goauthentik/elements/forms/ModalForm";
import { PaginatedResponse, Table, TableColumn } from "@goauthentik/elements/table/Table";
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<RoleAssignedObjectPermission> {
@property()
model?: RbacPermissionsAssignedByRolesListModelEnum;
@property()
objectPk?: string | number;
@state()
modelPermissions?: PaginatedPermissionList;
checkbox = true;
clearOnRefresh = true;
async apiEndpoint(): Promise<PaginatedResponse<RoleAssignedObjectPermission>> {
const perms = await new RbacApi(DEFAULT_CONFIG).rbacPermissionsAssignedByRolesList({
...(await this.defaultEndpointConfig()),
// TODO: better default
model: this.model || RbacPermissionsAssignedByRolesListModelEnum.AuthentikCoreUser,
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 !== `add_${this.model?.split(".")[1]}`;
});
this.modelPermissions = modelPermissions;
return perms;
}
columns(): TableColumn[] {
const baseColumns = [new TableColumn(msg("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`<ak-forms-modal>
<span slot="submit"> ${msg("Assign")} </span>
<span slot="header"> ${msg("Assign permission to role")} </span>
<ak-rbac-role-object-permission-form
model=${ifDefined(this.model)}
objectPk=${ifDefined(this.objectPk)}
slot="form"
>
</ak-rbac-role-object-permission-form>
<button slot="trigger" class="pf-c-button pf-m-primary">
${msg("Assign to new role")}
</button>
</ak-forms-modal>`;
}
renderToolbarSelected(): TemplateResult {
const disabled = this.selectedElements.length < 1;
return html`<ak-forms-delete-bulk
objectLabel=${msg("Permission(s)")}
.objects=${this.selectedElements}
.metadata=${(item: RoleAssignedObjectPermission) => {
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}`;
}),
},
});
}}
>
<button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
${msg("Delete")}
</button>
</ak-forms-delete-bulk>`;
}
row(item: RoleAssignedObjectPermission): TemplateResult[] {
const baseRow = [html` <a href="#/identity/roles/${item.rolePk}">${item.name}</a>`];
this.modelPermissions?.results.forEach((perm) => {
const granted =
item.permissions.filter((uperm) => uperm.codename === perm.codename).length > 0;
baseRow.push(
html`${granted
? html`<pf-tooltip position="top" content=${msg("Directly assigned")}
><i class="fas fa-check pf-m-success"></i
></pf-tooltip>`
: html`<i class="fas fa-times pf-m-danger"></i>`} `,
);
});
return baseRow;
}
}
declare global {
interface HTMLElementTagNameMap {
"ak-rbac-role-object-permission-table": RoleAssignedObjectPermissionTable;
}
}