import { Text, Box, Heading, Image, Center, Button, Flex, VStack, Divider, useToast, FormControl, FormLabel, FormHelperText, Input, FormErrorMessage, HStack, Wrap, useMediaQuery, Avatar, Textarea, Table, Thead, Tr, Th, Tbody, Td, IconButton, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, Select, NumberInput, NumberInputField, NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper,AlertDialog, AlertDialogOverlay, AlertDialogContent, AlertDialogHeader, AlertDialogBody, AlertDialogFooter } from "@chakra-ui/react" import Card from "components/card" import PageContainer from "layouts/page-container" import Sidebar from "layouts/sidebar/sidebar" import React, { useEffect, useState } from "react" import { settingLinks } from "src/data/links" import { requestApi } from "utils/axios/request" import { config } from "configs/config" import { getSvgIcon } from "components/svg-icon" import { Navbar, NavbarType } from "src/types/user" import { cloneDeep } from "lodash" import { IDType } from "src/types/id" import { Story } from "src/types/story" const UserNavbarPage = () => { return ( <> ) } export default UserNavbarPage export const NavbarEditor = ({ orgID = "" }) => { const [navbars, setNavbars]: [Navbar[], any] = useState([]) const [series, setSeries]: [Story[], any] = useState([]) const [currentNavbar, setCurrentNavbar]: [Navbar, any] = useState(null) const { isOpen, onOpen, onClose } = useDisclosure() const toast = useToast() useEffect(() => { getNavbars() getSeries() }, []) const getNavbars = async () => { const res = await requestApi.get(`/user/navbars/${orgID ? orgID : 0}`) setNavbars(res.data) } const getSeries = async () => { let res if (orgID) { res = await requestApi.get(`/story/posts/org/${orgID}?type=${IDType.Series}`) } else { res = await requestApi.get(`/story/posts/editor?type=${IDType.Series}`) } setSeries(res.data) } const submitNavbar = async () => { if (!currentNavbar.label || !currentNavbar.value) { toast({ description: "值不能为空", status: "error", duration: 2000, isClosable: true, }) return } if (currentNavbar.label.length > config.user.navbarMaxLen) { toast({ description: `Label长度不能超过${config.user.navbarMaxLen}`, status: "error", duration: 2000, isClosable: true, }) return } if (orgID) { await requestApi.post(`/org/navbar/${orgID}`, currentNavbar) } else { await requestApi.post(`/user/navbar`, currentNavbar) } setCurrentNavbar(null) onClose() getNavbars() } const onAddNavbar = () => { setCurrentNavbar({ weight: 0, type: NavbarType.Link, label: "", value: "https://" }) onOpen() } const onEditNavbar = nav => { setCurrentNavbar(nav) onOpen() } const onNavbarChange = () => { const nv = cloneDeep(currentNavbar) setCurrentNavbar(nv) } const onNvTypeChange = v => { const tp = parseInt(v); currentNavbar.type = tp if (tp === NavbarType.Link) { currentNavbar.value = "" } else { currentNavbar.value = series[0].id } onNavbarChange() } const getSeriesTitle = id => { for (const s of series) { if (s.id === id) { return s.title } } return "" } const onDeleteNavbar = async id => { await requestApi.delete(`/${orgID ? 'org' : 'user'}/navbar/${id}`) getNavbars() } return ( <> 菜单设置 { navbars.map((nv, i) => ) }
Label Type Value Weight
{currentNavbar && {currentNavbar.label ? "编辑菜单项" : "新建菜单项"} Label { currentNavbar.label = e.currentTarget.value; onNavbarChange() }}> Type Value {currentNavbar.type === NavbarType.Link ? { currentNavbar.value = e.currentTarget.value; onNavbarChange() }} /> : } Weight { currentNavbar.weight = parseInt(e); onNavbarChange() }}> } ) } const NV = ({ nv, onEdit, onDelete, getSeriesTitle }) => { const [isOpen, setIsOpen] = React.useState(false) const onClose = () => setIsOpen(false) const cancelRef = React.useRef() return ( <> {nv.label} {nv.type === NavbarType.Link ? "link" : "series"} {nv.type === NavbarType.Link ? nv.value : getSeriesTitle(nv.value)} {nv.weight} onEdit(nv)} /> setIsOpen(true)} /> 删除菜单 - {nv.label} Are you sure? You can't undo this action afterwards. ) }