import { useState, useEffect, useRef } from "react" import { Button } from "@/components/ui/button" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { DataItemForm } from "@/app/view/components/DataItemForm" import { ViewFormItem } from "@/app/view/components/ViewFormItem" import { nanoid } from "nanoid" interface ViewEditorProps { open: boolean onOpenChange: (open: boolean) => void data?: { id?: string title?: string data?: { items: any[] } views?: any[] } onSave: (data: any) => void } export const ViewEditor = ({ open, onOpenChange, data, onSave }: ViewEditorProps) => { const [title, setTitle] = useState('') const [dataItems, setDataItems] = useState([]) const [views, setViews] = useState([]) const dataItemsScrollRef = useRef(null) const viewsScrollRef = useRef(null) const isUpdate = !!data?.id useEffect(() => { if (open) { setTitle(data?.title || '') setDataItems(data?.data?.items || []) setViews(data?.views || []) } }, [open, data]) const handleAddDataItem = () => { setDataItems([...dataItems, { type: 'api', api: { url: '' } }]) // 异步滚动到底部,使用 smooth 平滑滚动 setTimeout(() => { if (dataItemsScrollRef.current) { dataItemsScrollRef.current.scrollTo({ top: dataItemsScrollRef.current.scrollHeight, behavior: 'smooth' }) } }, 0) } const handleUpdateDataItem = (index: number, item: any) => { const newItems = [...dataItems] newItems[index] = item setDataItems(newItems) } const handleRemoveDataItem = (index: number) => { setDataItems(dataItems.filter((_, i) => i !== index)) } const handleAddView = () => { setViews([...views, { id: nanoid(16), title: '', query: '' }]) // 异步滚动到底部,使用 smooth 平滑滚动 setTimeout(() => { if (viewsScrollRef.current) { viewsScrollRef.current.scrollTo({ top: viewsScrollRef.current.scrollHeight, behavior: 'smooth' }) } }, 0) } const handleUpdateView = (index: number, view: any) => { const newViews = [...views] newViews[index] = view setViews(newViews) } const handleRemoveView = (index: number) => { setViews(views.filter((_, i) => i !== index)) } const handleSave = () => { const pickData = dataItems.map(item => { if (item.type === 'api') { delete item.api.query } if (item.type === 'worker') { delete item.worker.worker } if (item.type === 'context') { delete item.context.router } if (item.type === 'page') { } return item }) const viewData = { id: data?.id, title, data: { items: pickData }, views } onSave(viewData) onOpenChange(false) } const handleClose = () => { onOpenChange(false) } return ( {isUpdate ? '编辑视图' : '新增视图'}
{/* 固定的视图标题 */}
setTitle(e.target.value)} placeholder="输入视图标题" />
{/* Tabs 容器 */} 数据项配置 视图配置 {/* 数据项配置 Tab */}

数据项配置 (data.items)

{dataItems.length === 0 ? (
暂无数据项,点击"添加数据项"开始配置
) : ( dataItems.map((item, index) => ( handleUpdateDataItem(index, newItem)} onRemove={() => handleRemoveDataItem(index)} /> )) )}
{/* 视图配置 Tab */}

视图配置 (views)

{views.length === 0 ? (
暂无视图,点击"添加视图"开始配置
) : ( views.map((view, index) => ( handleUpdateView(index, newView)} onRemove={() => handleRemoveView(index)} /> )) )}
) }