feat: add support for HtmlElement props in Collapsible and Accordion components

master
Katja Lutz 2 years ago
parent fe8cf85e2a
commit e088e138ee

@ -1,15 +1,28 @@
import { createSignal, FlowComponent, JSX, mergeProps } from "solid-js"; import {
createSignal,
FlowComponent,
JSX,
mergeProps,
splitProps,
} from "solid-js";
import Collapsible from "./Collapsible"; import Collapsible from "./Collapsible";
const createAccordion = (defaultItem: number | null = 0) => { const createAccordion = (defaultItem: number | null = 0) => {
const [item, setItem] = createSignal(defaultItem); const [item, setItem] = createSignal(defaultItem);
const AccordionItem: FlowComponent<{ const AccordionItem: FlowComponent<
alignCenter?: boolean; {
label?: JSX.Element; alignCenter?: boolean;
item?: number; label?: JSX.Element;
activeTitleColor?: string; item?: number;
}> = (p) => { } & Parameters<typeof Collapsible>[0]
const props = mergeProps({ alignCenter: true, item: Math.random() }, p); > = (p) => {
const mprops = mergeProps({ alignCenter: true, item: Math.random() }, p);
const [props, rest] = splitProps(mprops, [
"alignCenter",
"item",
"label",
"children",
]);
return ( return (
<Collapsible <Collapsible
@ -25,10 +38,10 @@ const createAccordion = (defaultItem: number | null = 0) => {
{props.label} {props.label}
</div> </div>
} }
activeTitleColor={props.activeTitleColor}
onChange={(evt: any) => onChange={(evt: any) =>
setItem(evt.currentTarget.checked && props.item) setItem(evt.currentTarget.checked && props.item)
} }
{...rest}
> >
{props.children} {props.children}
</Collapsible> </Collapsible>

@ -1,4 +1,4 @@
import { FlowComponent, JSX, mergeProps } from "solid-js"; import { FlowComponent, JSX, mergeProps, onMount, splitProps } from "solid-js";
const Collapsible: FlowComponent< const Collapsible: FlowComponent<
{ {
@ -8,7 +8,15 @@ const Collapsible: FlowComponent<
label: string | JSX.Element; label: string | JSX.Element;
} & JSX.HTMLAttributes<HTMLDivElement> } & JSX.HTMLAttributes<HTMLDivElement>
> = (p) => { > = (p) => {
const props = mergeProps({ activeTitleColor: "text-black" }, p); const mprops = mergeProps({ activeTitleColor: "text-black" }, p);
let [props, rest] = splitProps(mprops, [
"activeTitleColor",
"onChange",
"value",
"label",
"class",
"children",
]);
let inputRef: HTMLInputElement = undefined!; let inputRef: HTMLInputElement = undefined!;
return ( return (
@ -19,7 +27,7 @@ const Collapsible: FlowComponent<
props.class props.class
} }
onFocus={(evt) => { onFocus={(evt) => {
if (props.value) { if (inputRef.checked) {
return; return;
} }
@ -27,6 +35,7 @@ const Collapsible: FlowComponent<
inputRef.checked = true; inputRef.checked = true;
inputRef.dispatchEvent(new InputEvent("change", { bubbles: true })); inputRef.dispatchEvent(new InputEvent("change", { bubbles: true }));
}} }}
{...rest}
> >
<input <input
ref={inputRef} ref={inputRef}

Loading…
Cancel
Save