diff --git a/pkg/app/web/src/constants/ui-text.ts b/pkg/app/web/src/constants/ui-text.ts index 131e9f484d..42260e9495 100644 --- a/pkg/app/web/src/constants/ui-text.ts +++ b/pkg/app/web/src/constants/ui-text.ts @@ -2,6 +2,9 @@ export const UI_TEXT_SAVE = "Save"; export const UI_TEXT_CANCEL = "Cancel"; export const UI_TEXT_ADD = "Add"; export const UI_TEXT_EDIT = "Edit"; +export const UI_TEXT_DISABLE = "Disable"; +export const UI_TEXT_ENABLE = "Enable"; +export const UI_TEXT_RECREATE_KEY = "Recreate Key"; export const UI_TEXT_REFRESH = "REFRESH"; export const UI_TEXT_CLOSE = "Close"; export const UI_TEXT_DELETE = "Delete"; diff --git a/pkg/app/web/src/pages/settings/piped.tsx b/pkg/app/web/src/pages/settings/piped/index.tsx similarity index 51% rename from pkg/app/web/src/pages/settings/piped.tsx rename to pkg/app/web/src/pages/settings/piped/index.tsx index e83a6e1bc9..452c777a16 100644 --- a/pkg/app/web/src/pages/settings/piped.tsx +++ b/pkg/app/web/src/pages/settings/piped/index.tsx @@ -5,10 +5,7 @@ import { DialogContent, DialogTitle, Divider, - IconButton, makeStyles, - Menu, - MenuItem, Paper, Table, TableBody, @@ -18,23 +15,24 @@ import { TableRow, TextField, Toolbar, - Typography, } from "@material-ui/core"; import { Add as AddIcon, Close as CloseIcon, - MoreVert as MoreVertIcon, FilterList as FilterIcon, } from "@material-ui/icons"; -import clsx from "clsx"; -import dayjs from "dayjs"; import React, { FC, memo, useCallback, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; -import { AddPipedDrawer } from "../../components/add-piped-drawer"; -import { EditPipedDrawer } from "../../components/edit-piped-drawer"; -import { PipedFilter, FilterValues } from "../../components/piped-filter"; -import { UI_TEXT_FILTER, UI_TEXT_HIDE_FILTER } from "../../constants/ui-text"; -import { AppState } from "../../modules"; +import { AddPipedDrawer } from "../../../components/add-piped-drawer"; +import { EditPipedDrawer } from "../../../components/edit-piped-drawer"; +import { FilterValues, PipedFilter } from "../../../components/piped-filter"; +import { + UI_TEXT_ADD, + UI_TEXT_CLOSE, + UI_TEXT_FILTER, + UI_TEXT_HIDE_FILTER, +} from "../../../constants/ui-text"; +import { AppState } from "../../../modules"; import { clearRegisteredPipedInfo, disablePiped, @@ -44,20 +42,16 @@ import { recreatePipedKey, RegisteredPiped, selectAll, -} from "../../modules/pipeds"; -import { AppDispatch } from "../../store"; +} from "../../../modules/pipeds"; +import { AppDispatch } from "../../../store"; +import { PipedTableRow } from "./piped-table-row"; -const useStyles = makeStyles((theme) => ({ - disabledItem: { - background: theme.palette.grey[200], - }, +const useStyles = makeStyles(() => ({ toolbarSpacer: { flexGrow: 1, }, })); -const ITEM_HEIGHT = 48; - const usePipeds = (filterValues: FilterValues): Piped[] => { const pipeds = useSelector((state) => selectAll(state.pipeds) @@ -78,13 +72,10 @@ export const SettingsPipedPage: FC = memo(function SettingsPipedPage() { const classes = useStyles(); const [openFilter, setOpenFilter] = useState(false); const [isOpenForm, setIsOpenForm] = useState(false); - const [actionTarget, setActionTarget] = useState(null); const [editPipedId, setEditPipedId] = useState(null); const [filterValues, setFilterValues] = useState({ enabled: true, }); - const [anchorEl, setAnchorEl] = useState(null); - const isOpenMenu = Boolean(anchorEl); const dispatch = useDispatch(); const pipeds = usePipeds(filterValues); @@ -92,33 +83,33 @@ export const SettingsPipedPage: FC = memo(function SettingsPipedPage() { (state) => state.pipeds.registeredPiped ); - const handleMenuOpen = useCallback( - (event: React.MouseEvent, piped: Piped): void => { - setActionTarget(piped); - setAnchorEl(event.currentTarget); + const handleDisable = useCallback( + (id: string) => { + dispatch(disablePiped({ pipedId: id })).then(() => { + dispatch(fetchPipeds(true)); + }); }, - [] + [dispatch] + ); + const handleEnable = useCallback( + (id: string) => { + dispatch(enablePiped({ pipedId: id })).then(() => { + dispatch(fetchPipeds(true)); + }); + }, + [dispatch] ); - const closeMenu = useCallback(() => { - setAnchorEl(null); - setTimeout(() => { - setActionTarget(null); - }, 200); - }, []); - - const handleDisableClick = useCallback(() => { - closeMenu(); - if (!actionTarget) { - return; - } - - const act = actionTarget.disabled ? enablePiped : disablePiped; + const handleRecreate = useCallback( + (id: string) => { + dispatch(recreatePipedKey({ pipedId: id })); + }, + [dispatch] + ); - dispatch(act({ pipedId: actionTarget.id })).then(() => { - dispatch(fetchPipeds(true)); - }); - }, [dispatch, actionTarget, closeMenu]); + const handleEdit = useCallback((id: string) => { + setEditPipedId(id); + }, []); const handleClose = useCallback(() => { setIsOpenForm(false); @@ -129,20 +120,6 @@ export const SettingsPipedPage: FC = memo(function SettingsPipedPage() { dispatch(fetchPipeds(true)); }, [dispatch]); - const handleRecreate = useCallback(() => { - if (actionTarget) { - dispatch(recreatePipedKey({ pipedId: actionTarget.id })); - } - closeMenu(); - }, [dispatch, actionTarget, closeMenu]); - - const handleEdit = useCallback(() => { - if (actionTarget) { - setEditPipedId(actionTarget.id); - } - closeMenu(); - }, [actionTarget, closeMenu]); - const handleEditClose = useCallback(() => { setEditPipedId(null); }, []); @@ -155,7 +132,7 @@ export const SettingsPipedPage: FC = memo(function SettingsPipedPage() { startIcon={} onClick={() => setIsOpenForm(true)} > - ADD + {UI_TEXT_ADD}
diff --git a/pkg/app/web/src/pages/settings/piped/piped-table-row.tsx b/pkg/app/web/src/pages/settings/piped/piped-table-row.tsx new file mode 100644 index 0000000000..bdf616238a --- /dev/null +++ b/pkg/app/web/src/pages/settings/piped/piped-table-row.tsx @@ -0,0 +1,153 @@ +import { + IconButton, + makeStyles, + Menu, + MenuItem, + TableCell, + TableRow, + Typography, +} from "@material-ui/core"; +import { MoreVert as MoreVertIcon } from "@material-ui/icons"; +import clsx from "clsx"; +import dayjs from "dayjs"; +import React, { FC, memo, useCallback, useState } from "react"; +import { useSelector } from "react-redux"; +import { + UI_TEXT_EDIT, + UI_TEXT_DISABLE, + UI_TEXT_ENABLE, + UI_TEXT_RECREATE_KEY, +} from "../../../constants/ui-text"; +import { AppState } from "../../../modules"; +import { Piped, selectById } from "../../../modules/pipeds"; + +const useStyles = makeStyles((theme) => ({ + disabledItem: { + background: theme.palette.grey[200], + }, +})); + +interface Props { + pipedId: string; + onEdit: (id: string) => void; + onRecreateKey: (id: string) => void; + onDisable: (id: string) => void; + onEnable: (id: string) => void; +} + +const ITEM_HEIGHT = 48; +const menuStyle = { + style: { + maxHeight: ITEM_HEIGHT * 4.5, + width: "20ch", + }, +}; + +export const PipedTableRow: FC = memo(function PipedTableRow({ + pipedId, + onEnable, + onDisable, + onEdit, + onRecreateKey, +}) { + const classes = useStyles(); + const piped = useSelector((state) => + selectById(state.pipeds, pipedId) + ); + const [anchorEl, setAnchorEl] = useState(null); + + const handleMenuOpen = useCallback( + (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }, + [] + ); + + const handleMenuClose = useCallback(() => { + setAnchorEl(null); + }, []); + + const handleEdit = useCallback(() => { + setAnchorEl(null); + onEdit(pipedId); + }, [pipedId, onEdit]); + + const handleRecreate = useCallback(() => { + setAnchorEl(null); + onRecreateKey(pipedId); + }, [pipedId, onRecreateKey]); + + const handleEnable = useCallback(() => { + setAnchorEl(null); + onEnable(pipedId); + }, [pipedId, onEnable]); + + const handleDisable = useCallback(() => { + setAnchorEl(null); + onDisable(pipedId); + }, [pipedId, onDisable]); + + if (!piped) { + return null; + } + + return ( + <> + + + + {`${piped.name} (${piped.id.slice(0, 8)})`} + + + {piped.version} + + + {piped.desc} + + + + {piped.startedAt === 0 + ? "Not Yet Started" + : dayjs(piped.startedAt * 1000).fromNow()} + + + + + + + + + + {piped.disabled ? ( + {UI_TEXT_ENABLE} + ) : ( + [ + + {UI_TEXT_EDIT} + , + + {UI_TEXT_RECREATE_KEY} + , + + {UI_TEXT_DISABLE} + , + ] + )} + + + ); +});