,
+ field: string,
+ v: unknown,
+ ) => {
+ setValue(section, { ...current, [field]: v });
+ };
return (
-
-
+ setNested("local", local, "enabled", v)}
+ />
+
+ setNested("local", local, "default_admin_username", v)
+ }
+ />
+
+ setNested("local", local, "default_admin_password", v)
+ }
+ />
-
-
-
-
+ setNested("ldap", ldap, "enabled", v)}
+ />
+ setNested("ldap", ldap, "url", v)}
+ />
+ setNested("ldap", ldap, "base_dn", v)}
+ />
+ setNested("ldap", ldap, "bind_dn", v)}
+ />
+ setNested("ldap", ldap, "bind_password", v)}
+ />
-
-
-
-
+ setNested("oidc", oidc, "enabled", v)}
+ />
+ setNested("oidc", oidc, "issuer_url", v)}
+ />
+ setNested("oidc", oidc, "client_id", v)}
+ />
+ setNested("oidc", oidc, "client_secret", v)}
+ />
+ setNested("oidc", oidc, "redirect_url", v)}
+ />
@@ -440,17 +620,9 @@ function SubSection({
);
}
-function ReadOnlyField({
- label,
- value,
-}: {
- label: string;
- value: unknown;
-}) {
+function ReadOnlyField({ label, value }: { label: string; value: unknown }) {
const display =
- value === undefined || value === null || value === ""
- ? "—"
- : String(value);
+ value === undefined || value === null || value === "" ? "—" : String(value);
return (
{label}
@@ -476,7 +648,7 @@ function EditableField({
{label}
onChange(e.target.value)}
placeholder={isRedacted ? "••••••••" : undefined}
@@ -487,6 +659,57 @@ function EditableField({
);
}
+function SelectField({
+ label,
+ value,
+ options,
+ onChange,
+}: {
+ label: string;
+ value: unknown;
+ options: string[];
+ onChange: (v: string) => void;
+}) {
+ return (
+
+
{label}
+
+
+ );
+}
+
+function CheckboxField({
+ label,
+ value,
+ onChange,
+}: {
+ label: string;
+ value: unknown;
+ onChange: (v: boolean) => void;
+}) {
+ return (
+
+
onChange(e.target.checked)}
+ style={{ accentColor: "var(--ctp-mauve)" }}
+ />
+
{label}
+
+ );
+}
+
// --- Styles ---
const cardStyle: React.CSSProperties = {