
* web: Add InvalidationFlow to Radius Provider dialogues
## What
- Bugfix: adds the InvalidationFlow to the Radius Provider dialogues
- Repairs: `{"invalidation_flow":["This field is required."]}` message, which was *not* propagated
to the Notification.
- Nitpick: Pretties `?foo=${true}` expressions: `s/\?([^=]+)=\$\{true\}/\1/`
## Note
Yes, I know I'm going to have to do more magic when we harmonize the forms, and no, I didn't add the
Property Mappings to the wizard, and yes, I know I'm going to have pain with the *new* version of
the wizard. But this is a serious bug; you can't make Radius servers with *either* of the current
dialogues at the moment.
* This (temporary) change is needed to prevent the unit tests from failing.
\# What
\# Why
\# How
\# Designs
\# Test Steps
\# Other Notes
* Revert "This (temporary) change is needed to prevent the unit tests from failing."
This reverts commit dddde09be5
.
* web/admin: Provide `hidden` text and textarea components
## Details
This commit provides two new elements (technically, since they're API-unaware), one for `<input
type="text">`, and one for `<textarea>`, that provide for the ability to create fields that are (or
can be) hidden. A new boolean attribute, `revealed`, shows the state of the component (the content
is therefore *not* revealed by default).
It also includes a third new element, `ak-visibility-toggle`, that creates a hide/show toggle with
all the right icons, styling, and eventing. It's straightforward, and isolating it improved the
DX of everything that uses that feature by quite a bit.
Storybook stories (with autodoc documentation) have been provided for `ak-hidden-text-input`,
`ak-hidden-textarea-input`, and `ak-visibility-toggle`.
## Maintenance Notice
As a maintenance detail, the field `ak-private-text` has been renamed `ak-secret-text` to reflect
its usage, and the places where it was used have all been changed to reflect that update.
* web/component: embed styling (for now) to handle the lightDom/shadowDom/slot conflicts in HorizontalLightComponent and HorizontalFormElement
* Comments and Types. I really shouldn't have to catch this stuff with my eyeballs.
* fix typo
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
---------
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
129 lines
3.5 KiB
TypeScript
129 lines
3.5 KiB
TypeScript
import { css, html } from "lit";
|
|
import { customElement, property, query } from "lit/decorators.js";
|
|
import { classMap } from "lit/directives/class-map.js";
|
|
import { ifDefined } from "lit/directives/if-defined.js";
|
|
|
|
import { AkHiddenTextInput, type AkHiddenTextInputProps } from "./ak-hidden-text-input.js";
|
|
|
|
export interface AkHiddenTextAreaInputProps extends AkHiddenTextInputProps {
|
|
/**
|
|
* Number of visible text lines (rows)
|
|
*/
|
|
rows?: number;
|
|
|
|
/**
|
|
* Number of visible character width (cols)
|
|
*/
|
|
cols?: number;
|
|
|
|
/**
|
|
* How the textarea can be resized
|
|
*/
|
|
resize?: "none" | "both" | "horizontal" | "vertical";
|
|
|
|
/**
|
|
* Whether text should wrap
|
|
*/
|
|
wrap?: "soft" | "hard" | "off";
|
|
}
|
|
|
|
/**
|
|
* @element ak-hidden-text-input
|
|
* @class AkHiddenTextInput
|
|
*
|
|
* A text-input field with a visibility control, so you can show/hide sensitive fields.
|
|
*
|
|
* ## CSS Parts
|
|
* @csspart container - The main container div
|
|
* @csspart input - The input element
|
|
* @csspart toggle - The visibility toggle button
|
|
*
|
|
*/
|
|
@customElement("ak-hidden-textarea-input")
|
|
export class AkHiddenTextAreaInput
|
|
extends AkHiddenTextInput<HTMLTextAreaElement>
|
|
implements AkHiddenTextAreaInputProps
|
|
{
|
|
/* These are mostly just forwarded to the textarea component. */
|
|
|
|
/**
|
|
* @property
|
|
* @attribute
|
|
*/
|
|
@property({ type: Number })
|
|
rows?: number = 4;
|
|
|
|
/**
|
|
* @property
|
|
* @attribute
|
|
*/
|
|
@property({ type: Number })
|
|
cols?: number;
|
|
|
|
/**
|
|
* @property
|
|
* @attribute
|
|
*
|
|
* You want `resize=true` so that the resize value is visible in the component tag, activating
|
|
* the CSS associated with these values.
|
|
*/
|
|
@property({ type: String, reflect: true })
|
|
resize?: "none" | "both" | "horizontal" | "vertical" = "vertical";
|
|
|
|
/**
|
|
* @property
|
|
* @attribute
|
|
*/
|
|
@property({ type: String })
|
|
wrap?: "soft" | "hard" | "off" = "soft";
|
|
|
|
@query("#main > textarea")
|
|
protected inputField!: HTMLTextAreaElement;
|
|
|
|
get displayValue() {
|
|
const value = this.value ?? "";
|
|
if (this.revealed) {
|
|
return value;
|
|
}
|
|
|
|
return value
|
|
.split("\n")
|
|
.reduce((acc: string[], line: string) => [...acc, "*".repeat(line.length)], [])
|
|
.join("\n");
|
|
}
|
|
|
|
// TODO: Because of the peculiarities of how HorizontalLightComponent works, keeping its content
|
|
// in the LightDom so the inner components actually inherit styling, the normal `css` options
|
|
// aren't available. Embedding styles is bad styling, and we'll fix it in the next style
|
|
// refresh.
|
|
protected override renderInputField(setValue: (ev: InputEvent) => void, code: boolean) {
|
|
const wrap = this.revealed ? this.wrap : "soft";
|
|
|
|
return html`
|
|
<textarea
|
|
style="flex: 1 1 auto; min-width: 0;"
|
|
part="textarea"
|
|
@input=${setValue}
|
|
placeholder=${ifDefined(this.placeholder)}
|
|
rows=${ifDefined(this.rows)}
|
|
cols=${ifDefined(this.cols)}
|
|
wrap=${ifDefined(wrap)}
|
|
class=${classMap({
|
|
"pf-c-form-control": true,
|
|
"pf-m-monospace": code,
|
|
})}
|
|
spellcheck=${code ? "false" : "true"}
|
|
?required=${this.required}
|
|
>
|
|
${this.displayValue}</textarea
|
|
>
|
|
`;
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
"ak-hidden-textarea-input": AkHiddenTextAreaInput;
|
|
}
|
|
}
|