diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 01eec46e842ac..9b88bb96dc0b8 100644 Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ diff --git a/tools/server/webui/src/components/Header.tsx b/tools/server/webui/src/components/Header.tsx index 45775ff7a6258..e75f0c66f0f8a 100644 --- a/tools/server/webui/src/components/Header.tsx +++ b/tools/server/webui/src/components/Header.tsx @@ -3,7 +3,7 @@ import StorageUtils from '../utils/storage'; import { useAppContext } from '../utils/app.context'; import { classNames } from '../utils/misc'; import daisyuiThemes from 'daisyui/theme/object'; -import { THEMES } from '../Config'; +import { THEMES } from '../utils/initConfig'; import { Cog8ToothIcon, MoonIcon, @@ -66,7 +66,7 @@ export default function Header() { auto - {THEMES.map((theme) => ( + {THEMES.map((theme: string) => (
  • ( - JSON.parse(JSON.stringify(config)) - ); + const [localConfig, setLocalConfig] = useState({ ...config }); - const resetConfig = () => { - if (window.confirm('Are you sure you want to reset all settings?')) { - setLocalConfig(CONFIG_DEFAULT); - } + const resetConfig = async () => { + if (!window.confirm('Reset all settings from server defaults?')) return; + localStorage.removeItem('config'); + saveConfig({} as AppConfig); + setLocalConfig({} as AppConfig); + console.info('[Config] Reset to empty (server fallback)'); }; const handleSave = () => { // copy the local config to prevent direct mutation - const newConfig: typeof CONFIG_DEFAULT = JSON.parse( - JSON.stringify(localConfig) - ); + const newConfig: AppConfig = JSON.parse(JSON.stringify(localConfig)); // validate the config for (const key in newConfig) { const value = newConfig[key as SettKey]; - const mustBeBoolean = isBoolean(CONFIG_DEFAULT[key as SettKey]); - const mustBeString = isString(CONFIG_DEFAULT[key as SettKey]); - const mustBeNumeric = isNumeric(CONFIG_DEFAULT[key as SettKey]); + const mustBeBoolean = typeof config[key as SettKey] === 'boolean'; + const mustBeString = typeof config[key as SettKey] === 'string'; + const mustBeNumeric = typeof config[key as SettKey] === 'number'; if (mustBeString) { if (!isString(value)) { alert(`Value for ${key} must be string`); @@ -392,6 +390,7 @@ export default function SettingDialog({ value={localConfig[field.key]} onChange={onChange(field.key)} label={field.label as string} + defaultValue={config[field.key]} /> ); } else if (field.type === SettingInputType.LONG_INPUT) { @@ -402,6 +401,7 @@ export default function SettingDialog({ value={localConfig[field.key].toString()} onChange={onChange(field.key)} label={field.label as string} + defaultValue={config[field.key]} /> ); } else if (field.type === SettingInputType.CHECKBOX) { @@ -455,18 +455,20 @@ function SettingsModalLongInput({ value, onChange, label, + defaultValue, }: { configKey: SettKey; value: string; onChange: (value: string) => void; label?: string; + defaultValue: string | number | boolean; }) { return (