// 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]) => (
))}
);
};
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)}
/>
)}
);
}