diff --git a/frontend/src/pages/ScriptLibraryPage.tsx b/frontend/src/pages/ScriptLibraryPage.tsx index 3ba882a3..c550957e 100644 --- a/frontend/src/pages/ScriptLibraryPage.tsx +++ b/frontend/src/pages/ScriptLibraryPage.tsx @@ -1,12 +1,15 @@ import { useState, useEffect } from 'react' import { Link } from 'react-router-dom' -import { Terminal, Settings, Wand2 } from 'lucide-react' +import { Terminal, Settings, Wand2, FileUp } from 'lucide-react' import { useScriptGeneratorStore } from '@/store/scriptGeneratorStore' import { usePermissions } from '@/hooks/usePermissions' import { ScriptFilterBar } from '@/components/scripts/ScriptFilterBar' import { ScriptTemplateList } from '@/components/scripts/ScriptTemplateList' import { ScriptConfigurePane } from '@/components/scripts/ScriptConfigurePane' import { ScriptPreview } from '@/components/scripts/ScriptPreview' +import { ParameterizeAndSavePanel } from '@/components/scripts/ParameterizeAndSavePanel' +import { scriptsApi } from '@/api' +import type { ScriptParameter } from '@/types' type LibraryTab = 'mine' | 'team' @@ -23,8 +26,35 @@ export default function ScriptLibraryPage() { const clearOutput = useScriptGeneratorStore(s => s.clearOutput) const selectedTemplate = useScriptGeneratorStore(s => s.selectedTemplate) + const categories = useScriptGeneratorStore(s => s.categories) + const { isEngineer } = usePermissions() const canGenerate = isEngineer + const [showImportPanel, setShowImportPanel] = useState(false) + + const handleImportSave = async (payload: { + name: string + description: string | undefined + category_id: string | undefined + share_with_team: boolean + script_body: string + parameters_schema: { parameters: ScriptParameter[] } + }) => { + const categoryId = payload.category_id || categories[0]?.id + if (!categoryId) { + throw new Error('No categories available. Please create a category first.') + } + await scriptsApi.createTemplate({ + category_id: categoryId, + name: payload.name, + description: payload.description, + script_body: payload.script_body, + parameters_schema: payload.parameters_schema, + }) + setShowImportPanel(false) + const filters = activeTab === 'mine' ? { mine: true } : { shared: true } + loadTemplates(filters) + } useEffect(() => { loadCategories().then(() => { @@ -70,13 +100,23 @@ export default function ScriptLibraryPage() { Browse PowerShell templates, fill in parameters, and generate ready-to-run scripts.
{isEngineer && ( - -