// ScriptManager — 脚本库主组件 // Logan.Li import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Plus, Search, RotateCcw, Trash2, FileCode } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Checkbox } from '@/components/ui/checkbox'; import { toast } from 'sonner'; import { useConfirm } from '@/components/ui/confirm-dialog'; import { scriptApi } from '@/api'; import type { ScriptRuntimeInfo } from '@/api/task/script'; import { usePermission } from '@/hooks/usePermission'; import { type Script, mapScript, scriptTypes, genCode, availableScriptTypes, } from './script-helpers'; import { ScriptRuntimeBanner } from './ScriptRuntimeBanner'; import type { ScriptFormData } from './ScriptFormDialog'; import ScriptFormDialog from './ScriptFormDialog'; import { ScriptTable } from './ScriptTable'; import { PageShell } from '@/components/layout/PageShell'; import { ContentPanel } from '@/components/layout/ContentPanel'; import { PageEmpty } from '@/components/layout/PageEmpty'; import type { JsonData } from '@/types/common'; export function ScriptManager() { const { t } = useTranslation(); const _confirm = useConfirm(); const { hasAnyPermission, isAdmin } = usePermission(); const canWrite = isAdmin || hasAnyPermission(['auto:script', 'auto:cron', 'auto:ansible']); const [scripts, setScripts] = useState([]); const [runtime, setRuntime] = useState(null); const [runtimeLoading, setRuntimeLoading] = useState(true); const [loading, setLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [typeFilter, setTypeFilter] = useState('all'); const [selectedIds, setSelectedIds] = useState([]); const [editorOpen, setEditorOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [selectedScript, setSelectedScript] = useState