Files
Trilium/apps/client/src/widgets/react/FormRadioGroup.tsx

56 lines
1.9 KiB
TypeScript
Raw Normal View History

import type { ComponentChildren } from "preact";
import { useUniqueName } from "./hooks";
2025-08-03 21:18:18 +03:00
interface FormRadioProps {
name: string;
currentValue?: string;
values: {
value: string;
label: string | ComponentChildren;
inlineDescription?: string | ComponentChildren;
2025-08-03 21:18:18 +03:00
}[];
onChange(newValue: string): void;
}
export default function FormRadioGroup({ values, ...restProps }: FormRadioProps) {
2025-08-03 21:18:18 +03:00
return (
<div role="group">
{(values || []).map(({ value, label, inlineDescription }) => (
2025-08-14 17:54:52 +03:00
<div className="form-checkbox">
<FormRadio
value={value}
label={label} inlineDescription={inlineDescription}
labelClassName="form-check-label"
{...restProps}
/>
2025-08-03 21:18:18 +03:00
</div>
))}
</div>
2025-08-03 21:18:18 +03:00
);
}
export function FormInlineRadioGroup({ values, ...restProps }: FormRadioProps) {
return (
<div role="group">
{values.map(({ value, label }) => (<FormRadio value={value} label={label} {...restProps} />))}
</div>
)
}
function FormRadio({ name, value, label, currentValue, onChange, labelClassName, inlineDescription }: Omit<FormRadioProps, "values"> & { value: string, label: ComponentChildren, inlineDescription?: ComponentChildren, labelClassName?: string }) {
return (
<label className={`tn-radio ${labelClassName ?? ""}`}>
<input
className="form-check-input"
type="radio"
name={useUniqueName(name)}
value={value}
checked={value === currentValue}
onChange={e => onChange((e.target as HTMLInputElement).value)}
/>
{inlineDescription ?
<><strong>{label}</strong> - {inlineDescription}</>
: label}
</label>
)
2025-08-03 21:18:18 +03:00
}