settings values json instead of strings

This commit is contained in:
2024-04-11 14:41:03 -04:00
parent 3851b7f289
commit 3888e7fcde
9 changed files with 111 additions and 47 deletions

View File

@@ -12,7 +12,9 @@ import {
TableHead,
TableContainer,
TableRow,
Tabs, TextField
Tabs, TextField,
Autocomplete,
Chip
} from "@mui/material";
import {Link} from "react-router-dom";
import {
@@ -69,6 +71,7 @@ export default function SettingsView(props) {
// data
const [fetchSettings, setFetchSettings] = useState(true);
const [settings, setSettings] = useState(null);
const [extra, setExtra] = useState({});
const [uncategorizedKeys, setUncategorizedKeys] = useState([]);
// ui
@@ -194,12 +197,9 @@ export default function SettingsView(props) {
setFetchSettings(true);
setNewKey("");
setChanged(false);
setExtra({});
}, []);
if (settings === null) {
return <CircularProgress />
}
const parseBool = (v) => v !== undefined && (v === true || v === 1 || ["true", "1", "yes"].includes(v.toString().toLowerCase()));
const renderTextInput = (key_name, disabled=false, props={}) => {
@@ -271,14 +271,54 @@ export default function SettingsView(props) {
</SettingsFormGroup>
}
const renderTextValuesInput = (key_name, disabled=false, props={}) => {
const finishTyping = () => {
console.log("finishTyping", key_name);
setExtra({...extra, [key_name]: ""});
if (extra[key_name]) {
setSettings({...settings, [key_name]: [...settings[key_name], extra[key_name]]});
}
}
return <SettingsFormGroup key={"form-" + key_name} {...props}>
<FormLabel disabled={disabled}>{L("settings." + key_name)}</FormLabel>
<Autocomplete
clearIcon={false}
options={[]}
freeSolo
multiple
value={settings[key_name]}
onChange={(e, v) => setSettings({...settings, [key_name]: v})}
renderTags={(values, props) =>
values.map((option, index) => (
<Chip label={option} {...props({ index })} />
))
}
renderInput={(params) => <TextField
{...params}
value={extra[key_name] ?? ""}
onChange={e => setExtra({...extra, [key_name]: e.target.value.trim()})}
onKeyDown={e => {
if (["Enter", "Tab", " "].includes(e.key)) {
e.preventDefault();
e.stopPropagation();
finishTyping();
}
}}
onBlur={finishTyping} />}
/>
</SettingsFormGroup>
}
const renderTab = () => {
if (selectedTab === "general") {
return [
renderTextInput("site_name"),
renderTextInput("base_url"),
renderTextInput("trusted_domains"),
renderTextValuesInput("trusted_domains"),
renderCheckBox("user_registration_enabled"),
renderTextInput("allowed_extensions"),
renderTextValuesInput("allowed_extensions"),
renderSelection("time_zone", TIME_ZONES),
];
} else if (selectedTab === "mail") {
@@ -373,6 +413,10 @@ export default function SettingsView(props) {
}
}
if (settings === null) {
return <CircularProgress />
}
return <>
<div className={"content-header"}>
<div className={"container-fluid"}>