web: Replace  calls to rootInterface()?.tenant? with a contextual this.tenant object (#7778)
				
					
				
			* This commit abstracts access to the object `rootInterface()?.config?` into a single accessor,
`authentikConfig`, that can be mixed into any AKElement object that requires access to it.
Since access to `rootInterface()?.config?` is _universally_ used for a single (and repetitive)
boolean check, a separate accessor has been provided that converts all calls of the form:
``` javascript
rootInterface()?.config?.capabilities.includes(CapabilitiesEnum.CanImpersonate)
```
into:
``` javascript
this.can(CapabilitiesEnum.CanImpersonate)
```
It does this via a Mixin, `WithCapabilitiesConfig`, which understands that these calls only make
sense in the context of a running, fully configured authentik instance, and that their purpose is to
inform authentik components of a user’s capabilities. The latter is why I don’t feel uncomfortable
turning a function call into a method; we should make it explicit that this is a relationship
between components.
The mixin has a single single field, `[WCC.capabilitiesConfig]`, where its association with the
upper-level configuration is made. If that syntax looks peculiar to you, good! I’ve used an explict
unique symbol as the field name; it is inaccessable an innumerable in the object list. The debugger
shows it only as:
    Symbol(): {
        cacheTimeout: 300
        cacheTimeoutFlows: 300
        cacheTimeoutPolicies: 300
        cacheTimeoutReputation: 300
        capabilities: (5) ['can_save_media', 'can_geo_ip', 'can_impersonate', 'can_debug', 'is_enterprise']
    }
Since you can’t reference it by identity, you can’t write to it. Until every browser supports actual
private fields, this is the best we can do; it does guarantee that field name collisions are
impossible, which is a win.
The mixin takes a second optional boolean; setting this to true will cause any web component using
the mixin to automatically schedule a re-render if the capabilities list changes.
The mixin is also generic; despite the "...into a Lit-Context" in the title, the internals of the
Mixin can be replaced with anything so long as the signature of `.can()` is preserved.
Because this work builds off the work I did to give the Sidebar access to the configuration without
ad-hoc retrieval or prop-drilling, it wasn’t necessary to create a new context for it. That will be
necessary for the following:
TODO:
``` javascript
rootInterface()?.uiConfig;
rootInterface()?.tenant;
me();
```
* This commit abstracts access to the object `rootInterface()?.tenant?` into a single accessor,
`tenant`, that can be mixed into any AKElement object that requires access to it.
Like `WithCapabilitiesConfig` and `WithAuthentikConfig`, this one is named `WithTenantConfig`.
TODO:
``` javascript
rootInterface()?.uiConfig;
me();
```
* web: Added a README with a description of the applications' "mental model," essentially an architectural description.
* web: prettier did a thing
* web: prettier had opinions about the README
* web: Jens requested that subscription be  by default, and it's the right call.
* web: Jens requested that the default subscription state for contexts be , and it's the right call.
* web: prettier having opinions after merging with dependent branch
* web: prettier still having opinions.
			
			
This commit is contained in:
		@ -2,14 +2,15 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
			
		||||
import { EVENT_REFRESH } from "@goauthentik/common/constants";
 | 
			
		||||
import { MessageLevel } from "@goauthentik/common/messages";
 | 
			
		||||
import { refreshMe } from "@goauthentik/common/users";
 | 
			
		||||
import { AKElement, rootInterface } from "@goauthentik/elements/Base";
 | 
			
		||||
import { AKElement } from "@goauthentik/elements/Base";
 | 
			
		||||
import { WithTenantConfig } from "@goauthentik/elements/Interface/tenantProvider";
 | 
			
		||||
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
 | 
			
		||||
import { StageHost } from "@goauthentik/flow/stages/base";
 | 
			
		||||
import "@goauthentik/user/user-settings/details/stages/prompt/PromptStage";
 | 
			
		||||
 | 
			
		||||
import { msg } from "@lit/localize";
 | 
			
		||||
import { CSSResult, TemplateResult, html } from "lit";
 | 
			
		||||
import { customElement, property, state } from "lit/decorators.js";
 | 
			
		||||
import { customElement, property } from "lit/decorators.js";
 | 
			
		||||
import { unsafeHTML } from "lit/directives/unsafe-html.js";
 | 
			
		||||
 | 
			
		||||
import PFButton from "@patternfly/patternfly/components/Button/button.css";
 | 
			
		||||
@ -21,7 +22,6 @@ import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
			
		||||
import {
 | 
			
		||||
    ChallengeChoices,
 | 
			
		||||
    ChallengeTypes,
 | 
			
		||||
    CurrentTenant,
 | 
			
		||||
    FlowChallengeResponseRequest,
 | 
			
		||||
    FlowErrorChallenge,
 | 
			
		||||
    FlowsApi,
 | 
			
		||||
@ -31,13 +31,13 @@ import {
 | 
			
		||||
} from "@goauthentik/api";
 | 
			
		||||
 | 
			
		||||
@customElement("ak-user-settings-flow-executor")
 | 
			
		||||
export class UserSettingsFlowExecutor extends AKElement implements StageHost {
 | 
			
		||||
export class UserSettingsFlowExecutor
 | 
			
		||||
    extends WithTenantConfig(AKElement, true)
 | 
			
		||||
    implements StageHost
 | 
			
		||||
{
 | 
			
		||||
    @property()
 | 
			
		||||
    flowSlug?: string;
 | 
			
		||||
 | 
			
		||||
    @state()
 | 
			
		||||
    tenant?: CurrentTenant;
 | 
			
		||||
 | 
			
		||||
    private _challenge?: ChallengeTypes;
 | 
			
		||||
 | 
			
		||||
    @property({ attribute: false })
 | 
			
		||||
@ -87,7 +87,6 @@ export class UserSettingsFlowExecutor extends AKElement implements StageHost {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    firstUpdated(): void {
 | 
			
		||||
        this.tenant = rootInterface()?.tenant;
 | 
			
		||||
        this.flowSlug = this.tenant?.flowUserSettings;
 | 
			
		||||
        if (!this.flowSlug) {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user