From 1256ba042993018cadfae0b20b15a11e9998165d Mon Sep 17 00:00:00 2001 From: binwiederhier <pheckel@datto.com> Date: Mon, 2 Jan 2023 10:46:37 -0500 Subject: [PATCH] Reserved topics dialog --- web/public/static/langs/en.json | 4 ++ web/src/components/Preferences.js | 110 +++++++++++++++++++++++++----- 2 files changed, 97 insertions(+), 17 deletions(-) diff --git a/web/public/static/langs/en.json b/web/public/static/langs/en.json index b9d261a3..e4982fe7 100644 --- a/web/public/static/langs/en.json +++ b/web/public/static/langs/en.json @@ -250,6 +250,10 @@ "prefs_access_table_perms_private": "Only I can publish and subscribe", "prefs_access_table_perms_public_read": "I can publish, everyone can subscribe", "prefs_access_table_perms_public": "Everyone can publish and subscribe", + "prefs_access_dialog_title_add": "Reserve topic", + "prefs_access_dialog_title_edit": "Edit reserved topic", + "prefs_access_dialog_topic_label": "Topic", + "prefs_access_dialog_access_label": "Access", "priority_min": "min", "priority_low": "low", "priority_default": "default", diff --git a/web/src/components/Preferences.js b/web/src/components/Preferences.js index 54628fcd..49d54889 100644 --- a/web/src/components/Preferences.js +++ b/web/src/components/Preferences.js @@ -5,7 +5,7 @@ import { CardContent, FormControl, Select, - Stack, + Stack, styled, Table, TableBody, TableCell, @@ -41,6 +41,9 @@ import accountApi, {UnauthorizedError} from "../app/AccountApi"; import {Pref, PrefGroup} from "./Pref"; import {useOutletContext} from "react-router-dom"; import LockIcon from "@mui/icons-material/Lock"; +import {Public, PublicOff} from "@mui/icons-material"; +import ListItemIcon from "@mui/material/ListItemIcon"; +import ListItemText from "@mui/material/ListItemText"; const Preferences = () => { return ( @@ -515,14 +518,14 @@ const Access = () => { </CardContent> <CardActions> <Button onClick={handleAddClick}>{t("prefs_access_add_button")}</Button> - {/*<UserDialog - key={`userEditDialog${dialogKey}`} - open={dialogOpen} - user={dialogUser} - users={props.users} - onCancel={handleDialogCancel} - onSubmit={handleDialogSubmit} - />*/} + <AccessDialog + key={`accessAddDialog${dialogKey}`} + open={dialogOpen} + entry={null} + entries={account.access} + onCancel={handleDialogCancel} + onSubmit={handleDialogSubmit} + /> </CardActions> </Card> ); @@ -532,11 +535,11 @@ const AccessTable = (props) => { const { t } = useTranslation(); const [dialogKey, setDialogKey] = useState(0); const [dialogOpen, setDialogOpen] = useState(false); - const [dialogUser, setDialogUser] = useState(null); + const [dialogEntry, setDialogEntry] = useState(null); - const handleEditClick = (user) => { + const handleEditClick = (entry) => { setDialogKey(prev => prev+1); - setDialogUser(user); + setDialogEntry(entry); setDialogOpen(true); }; @@ -584,18 +587,91 @@ const AccessTable = (props) => { </TableRow> ))} </TableBody> - {/*<UserDialog - key={`userEditDialog${dialogKey}`} + <AccessDialog + key={`accessEditDialog${dialogKey}`} open={dialogOpen} - user={dialogUser} - users={props.users} + entry={dialogEntry} + entries={props.entries} onCancel={handleDialogCancel} onSubmit={handleDialogSubmit} - />*/} + /> </Table> ); }; +const AccessDialog = (props) => { + const { t } = useTranslation(); + const [topic, setTopic] = useState(""); + const [access, setAccess] = useState("private"); + const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); + const editMode = props.entry !== null; + const addButtonEnabled = (() => { + // FIXME + })(); + const handleSubmit = async () => { + props.onSubmit({ + topic: topic, + // FIXME + }) + }; + useEffect(() => { + if (editMode) { + setTopic(props.topic); + //setAccess(props.access); + } + }, [editMode, props]); + return ( + <Dialog open={props.open} onClose={props.onCancel} maxWidth="xs" fullWidth fullScreen={fullScreen}> + <DialogTitle>{editMode ? t("prefs_access_dialog_title_edit") : t("prefs_access_dialog_title_add")}</DialogTitle> + <DialogContent> + {!editMode && <TextField + autoFocus + margin="dense" + id="topic" + label={t("prefs_access_dialog_topic_label")} + aria-label={t("prefs_access_dialog_topic_label")} + value={topic} + onChange={ev => setTopic(ev.target.value)} + type="url" + fullWidth + variant="standard" + />} + <FormControl fullWidth variant="standard"> + <Select + value={access} + onChange={(ev) => setAccess(ev.target.value)} + aria-label={t("prefs_access_dialog_access_label")} + sx={{ + marginTop: 1, + "& .MuiSelect-select": { + display: 'flex', + alignItems: 'center' + } + }} + > + <MenuItem value="private"> + <ListItemIcon><LockIcon /></ListItemIcon> + <ListItemText primary={t("prefs_access_table_perms_private")} /> + </MenuItem> + <MenuItem value="public-read"> + <ListItemIcon><PublicOff /></ListItemIcon> + <ListItemText primary={t("prefs_access_table_perms_public_read")} /> + </MenuItem> + <MenuItem value="public"> + <ListItemIcon><Public /></ListItemIcon> + <ListItemText primary={t("prefs_access_table_perms_public")} /> + </MenuItem> + </Select> + </FormControl> + </DialogContent> + <DialogActions> + <Button onClick={props.onCancel}>{t("prefs_users_dialog_button_cancel")}</Button> + <Button onClick={handleSubmit} disabled={!addButtonEnabled}>{editMode ? t("prefs_users_dialog_button_save") : t("prefs_users_dialog_button_add")}</Button> + </DialogActions> + </Dialog> + ); +}; + const maybeUpdateAccountSettings = async (payload) => { if (!session.exists()) { return;