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 { adminLinks, 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" import PageContainer1 from "layouts/page-container1" const UserNavbarPage = () => { 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("/navbars") setNavbars(res.data) } const getSeries = async () => { const 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 } await requestApi.post(`/navbar`, currentNavbar) setCurrentNavbar(null) onClose() getNavbars() } const onAddNavbar = () => { setCurrentNavbar({ weight: 0, type: NavbarType.Link, label: "", value: "" }) onOpen() } const onEditNavbar = nav => { setCurrentNavbar(nav) onOpen() } const onNavbarChange = () => { const nv = cloneDeep(currentNavbar) setCurrentNavbar(nv) } const onDeleteNavbar = async id => { requestApi.delete(`/navbar/${id}`) setTimeout( () => getNavbars(),300) } return ( <> 菜单设置 { navbars.map((nv,i) => ) }
Label Value Weight
{currentNavbar && {currentNavbar.label ? "编辑菜单项" : "新建菜单项"} Label { currentNavbar.label = e.currentTarget.value; onNavbarChange() }}> Value { currentNavbar.value = e.currentTarget.value; onNavbarChange() }} placeholder="enter a url, e.g /search/posts"/> Weight { currentNavbar.weight = parseInt(e); onNavbarChange() }}> } ) } export default UserNavbarPage const NV = ({ nv, onEdit, onDelete }) => { const [isOpen, setIsOpen] = React.useState(false) const onClose = () => setIsOpen(false) const cancelRef = React.useRef() return ( <> {nv.label} {nv.value} {nv.weight} onEdit(nv)}/> setIsOpen(true)} /> 删除菜单 - {nv.label} Are you sure? You can't undo this action afterwards. ) }