// Portions of this file are Copyright 2021 Google LLC, and licensed under GPL2+. See COPYING. import { CSSProperties, useContext } from 'react'; import { ModelContext, FSContext } from './contexts'; import { Dropdown } from 'primereact/dropdown'; import { Slider } from 'primereact/slider'; import { Checkbox } from 'primereact/checkbox'; import { InputNumber } from 'primereact/inputnumber'; import { InputText } from 'primereact/inputtext'; import { Fieldset } from 'primereact/fieldset'; import { Parameter } from '../state/customizer-types'; import { Button } from 'primereact/button'; export default function CustomizerPanel({className, style}: {className?: string, style?: CSSProperties}) { const model = useContext(ModelContext); if (!model) throw new Error('No model'); const state = model.state; const handleChange = (name: string, value: any) => { model.setVar(name, value); }; const groupedParameters = (state.parameterSet?.parameters ?? []).reduce((acc, param) => { if (!acc[param.group]) { acc[param.group] = []; } acc[param.group].push(param); return acc; }, {} as { [key: string]: any[] }); const groups = Object.entries(groupedParameters); const collapsedTabSet = new Set(state.view.collapsedCustomizerTabs ?? []); const setTabOpen = (name: string, open: boolean) => { if (open) { collapsedTabSet.delete(name); } else { collapsedTabSet.add(name) } model.mutate(s => s.view.collapsedCustomizerTabs = Array.from(collapsedTabSet)); } return (
{groups.map(([group, params]) => (
setTabOpen(group, false)} onExpand={() => setTabOpen(group, true)} collapsed={collapsedTabSet.has(group)} key={group} legend={group} toggleable={true}> {params.map((param) => ( ))}
))}
); }; function ParameterInput({param, value, className, style, handleChange}: {param: Parameter, value: any, className?: string, style?: CSSProperties, handleChange: (key: string, value: any) => void}) { return (
{param.caption}
{param.type === 'number' && 'options' in param && ( handleChange(param.name, e.value)} optionLabel="name" optionValue="value" /> )} {param.type === 'string' && param.options && ( handleChange(param.name, e.value)} optionLabel="name" optionValue="value" /> )} {param.type === 'boolean' && ( handleChange(param.name, e.checked)} /> )} {!Array.isArray(param.initial) && param.type === 'number' && !('options' in param) && ( handleChange(param.name, e.value)} /> )} {param.type === 'string' && !param.options && ( handleChange(param.name, e.target.value)} /> )} {Array.isArray(param.initial) && 'min' in param && (
{param.initial.map((_, index) => ( { const newArray = [...(value ?? param.initial)]; newArray[index] = e.value; handleChange(param.name, newArray); }} /> ))}
)}
{!Array.isArray(param.initial) && param.type === 'number' && param.min !== undefined && ( handleChange(param.name, e.value)} /> )}
); }