import "@goauthentik/admin/groups/RelatedGroupList"; import "@goauthentik/admin/users/UserActiveForm"; import "@goauthentik/admin/users/UserChart"; import "@goauthentik/admin/users/UserForm"; import "@goauthentik/admin/users/UserPasswordForm"; import "@goauthentik/app/admin/users/UserAssignedGlobalPermissionsTable"; import "@goauthentik/app/admin/users/UserAssignedObjectPermissionsTable"; import { renderRecoveryEmailRequest, requestRecoveryLink, } from "@goauthentik/app/admin/users/UserListPage"; import { me } from "@goauthentik/app/common/users"; import "@goauthentik/app/elements/rbac/ObjectPermissionsPage"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import "@goauthentik/components/events/ObjectChangelog"; import "@goauthentik/components/events/UserEvents"; import { AKElement, rootInterface } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import { PFColor } from "@goauthentik/elements/Label"; import "@goauthentik/elements/PageHeader"; import { PFSize } from "@goauthentik/elements/Spinner"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/SpinnerButton"; import "@goauthentik/elements/forms/ModalForm"; import "@goauthentik/elements/oauth/UserRefreshList"; import "@goauthentik/elements/user/SessionList"; import "@goauthentik/elements/user/UserConsentList"; import { msg, str } from "@lit/localize"; import { css, html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; import PFCard from "@patternfly/patternfly/components/Card/card.css"; import PFContent from "@patternfly/patternfly/components/Content/content.css"; import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; import PFGrid from "@patternfly/patternfly/layouts/Grid/grid.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css"; import PFSizing from "@patternfly/patternfly/utilities/Sizing/sizing.css"; import { CapabilitiesEnum, CoreApi, RbacPermissionsAssignedByUsersListModelEnum, SessionUser, User, } from "@goauthentik/api"; import "./UserDevicesTable"; @customElement("ak-user-view") export class UserViewPage extends AKElement { @property({ type: Number }) set userId(id: number) { me().then((me) => { this.me = me; new CoreApi(DEFAULT_CONFIG) .coreUsersRetrieve({ id: id, }) .then((user) => { this.user = user; }); }); } @property({ attribute: false }) user?: User; @state() me?: SessionUser; static get styles() { return [ PFBase, PFPage, PFButton, PFDisplay, PFGrid, PFContent, PFCard, PFDescriptionList, PFSizing, css` .ak-button-collection { display: flex; flex-direction: column; gap: 0.375rem; max-width: 12rem; } .ak-button-collection > * { flex: 1 0 100%; } #reset-password-button { margin-right: 0; } #ak-email-recovery-request, #update-password-request .pf-c-button, #ak-email-recovery-request .pf-c-button { margin: 0; width: 100%; } `, ]; } constructor() { super(); this.addEventListener(EVENT_REFRESH, () => { if (!this.user?.pk) return; this.userId = this.user?.pk; }); } render() { return html` ${this.renderBody()}`; } renderUserCard() { if (!this.user) { return nothing; } const user = this.user; const canImpersonate = rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanImpersonate) && this.user.pk !== this.me?.user.pk; return html`
${msg("User Info")}
${msg("Username")}
${user.username}
${msg("Name")}
${user.name}
${msg("Email")}
${user.email || "-"}
${msg("Last login")}
${user.lastLogin?.toLocaleString()}
${msg("Active")}
${msg("Superuser")}
${msg("Actions")}
${msg("Update")} ${msg("Update User")} { return new CoreApi(DEFAULT_CONFIG).coreUsersPartialUpdate({ id: user.pk, patchedUserRequest: { isActive: !user.isActive, }, }); }} > ${canImpersonate ? html` { return new CoreApi(DEFAULT_CONFIG) .coreUsersImpersonateCreate({ id: user.pk, }) .then(() => { window.location.href = "/"; }); }} > ${msg("Impersonate")} ` : nothing}
${msg("Recovery")}
${msg("Update password")} ${msg("Update password")} requestRecoveryLink(user)} > ${msg("Create Recovery Link")} ${user.email ? renderRecoveryEmailRequest(user) : nothing}
`; } renderBody() { if (!this.user) { return nothing; } return html`
${this.renderUserCard()}
${msg("Actions over the last week (per 8 hours)")}
${msg("Notes")}
${Object.hasOwn(this.user?.attributes || {}, "notes") ? html`${this.user.attributes?.notes}` : html`

${msg( "Edit the notes attribute of this user to add notes here.", )}

`}
${msg("Changelog")}
${msg("Assigned global permissions")}
${msg("Assigned object permissions")}
`; } }