@parhelia/core 0.1.12767 → 0.1.12772
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PageHeader.js +1 -1
- package/dist/components/PageHeader.js.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts +12 -0
- package/dist/components/ui/breadcrumb.js +32 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/editor/ContentTree.js +2 -1
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/ai/AgentBanners.js +1 -1
- package/dist/editor/ai/AgentBanners.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +243 -50
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/agentDiagnostics.d.ts +56 -1
- package/dist/editor/ai/agentDiagnostics.js +207 -0
- package/dist/editor/ai/agentDiagnostics.js.map +1 -1
- package/dist/editor/ai/agentDiagnostics.test.d.ts +1 -0
- package/dist/editor/ai/agentDiagnostics.test.js +372 -0
- package/dist/editor/ai/agentDiagnostics.test.js.map +1 -0
- package/dist/editor/ai-image-editor/AiImageEditorDialog.js +5 -2
- package/dist/editor/ai-image-editor/AiImageEditorDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.js +6 -3
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/hooks/useEditorWebSocket.d.ts +12 -0
- package/dist/editor/client/hooks/useEditorWebSocket.js +27 -0
- package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
- package/dist/editor/personalization/RuleParameterInput.js +12 -1
- package/dist/editor/personalization/RuleParameterInput.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +9 -0
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/agentSubscriptionRegistry.d.ts +1 -0
- package/dist/editor/services/agentSubscriptionRegistry.js +6 -0
- package/dist/editor/services/agentSubscriptionRegistry.js.map +1 -1
- package/dist/editor/services/agentSubscriptionRegistry.test.js +18 -1
- package/dist/editor/services/agentSubscriptionRegistry.test.js.map +1 -1
- package/dist/editor/settings/SettingsBreadcrumb.d.ts +7 -0
- package/dist/editor/settings/SettingsBreadcrumb.js +9 -0
- package/dist/editor/settings/SettingsBreadcrumb.js.map +1 -0
- package/dist/editor/settings/SettingsHeaderActionsContext.d.ts +5 -0
- package/dist/editor/settings/SettingsHeaderActionsContext.js +13 -0
- package/dist/editor/settings/SettingsHeaderActionsContext.js.map +1 -0
- package/dist/editor/settings/SettingsView.js +16 -8
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplateSelector.d.ts +18 -0
- package/dist/editor/settings/panels/ProjectTemplateSelector.js +57 -0
- package/dist/editor/settings/panels/ProjectTemplateSelector.js.map +1 -0
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +81 -67
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/types.d.ts +6 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsView.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"SettingsView.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { ProjectTemplate } from "../../../task-board/types";
|
|
3
|
+
type StepState = "loading" | "success" | "error";
|
|
4
|
+
interface ProjectTemplateSelectorProps {
|
|
5
|
+
templates: ProjectTemplate[];
|
|
6
|
+
selectedTemplate: ProjectTemplate | null;
|
|
7
|
+
selectedTemplateId: string | null;
|
|
8
|
+
state: StepState;
|
|
9
|
+
error: string | null;
|
|
10
|
+
deleting: boolean;
|
|
11
|
+
statusBadge?: ReactNode;
|
|
12
|
+
onSelectTemplate: (template: ProjectTemplate) => Promise<boolean>;
|
|
13
|
+
onCreateTemplate: () => Promise<void>;
|
|
14
|
+
onRefreshTemplates: () => Promise<void>;
|
|
15
|
+
onDeleteTemplate: (template: ProjectTemplate) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function ProjectTemplateSelector({ templates, selectedTemplate, selectedTemplateId, state, error, deleting, statusBadge, onSelectTemplate, onCreateTemplate, onRefreshTemplates, onDeleteTemplate, }: ProjectTemplateSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { AlertCircle, ChevronDown, GitBranch, Plus, RefreshCw, Search, Trash2, } from "lucide-react";
|
|
5
|
+
import { Badge } from "../../../components/ui/badge";
|
|
6
|
+
import { Button } from "../../../components/ui/button";
|
|
7
|
+
import { Input } from "../../../components/ui/input";
|
|
8
|
+
import { Popover, PopoverContent, PopoverTrigger, } from "../../../components/ui/popover";
|
|
9
|
+
import { cn } from "../../../lib/utils";
|
|
10
|
+
import { ParheliaIconWhite } from "../../ui/ParheliaIconWhite";
|
|
11
|
+
function getTemplateSummary(template) {
|
|
12
|
+
if (!template) {
|
|
13
|
+
return "Select a template to start editing";
|
|
14
|
+
}
|
|
15
|
+
const summaryParts = [`${template.taskTemplates.length} task templates`];
|
|
16
|
+
if (template.defaultCostLimit != null) {
|
|
17
|
+
summaryParts.push(`Default budget: ${template.defaultCostLimit}`);
|
|
18
|
+
}
|
|
19
|
+
return summaryParts.join(" - ");
|
|
20
|
+
}
|
|
21
|
+
export function ProjectTemplateSelector({ templates, selectedTemplate, selectedTemplateId, state, error, deleting, statusBadge, onSelectTemplate, onCreateTemplate, onRefreshTemplates, onDeleteTemplate, }) {
|
|
22
|
+
const [open, setOpen] = useState(false);
|
|
23
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
24
|
+
const filteredTemplates = useMemo(() => {
|
|
25
|
+
const query = searchQuery.trim().toLowerCase();
|
|
26
|
+
if (!query)
|
|
27
|
+
return templates;
|
|
28
|
+
return templates.filter((template) => {
|
|
29
|
+
const description = template.description?.toLowerCase() ?? "";
|
|
30
|
+
return (template.name.toLowerCase().includes(query) ||
|
|
31
|
+
description.includes(query) ||
|
|
32
|
+
template.taskTemplates.some((task) => task.title.toLowerCase().includes(query)));
|
|
33
|
+
});
|
|
34
|
+
}, [searchQuery, templates]);
|
|
35
|
+
const selectorTitle = selectedTemplate?.name?.trim() || "Project Templates";
|
|
36
|
+
const selectorSummary = getTemplateSummary(selectedTemplate);
|
|
37
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "data-testid": "project-template-selector-trigger", className: "group flex min-w-0 items-center gap-2 rounded-md px-2 py-0.5 text-left hover:bg-slate-100/70", title: "Select project template", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-semibold text-slate-900", children: selectorTitle }), _jsxs("div", { className: "mt-0.5 flex min-h-[20px] flex-wrap items-center gap-2 text-[11px] text-slate-500", children: [_jsx("span", { className: "truncate", children: selectorSummary }), statusBadge] })] }), _jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-slate-500 group-hover:text-slate-700" })] }) }), _jsxs(PopoverContent, { align: "start", sideOffset: 8, className: "w-[calc(100vw-2rem)] max-w-[560px] p-0", "data-testid": "project-template-selector-popover", children: [_jsxs("div", { className: "border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold tracking-wider text-slate-500 uppercase", children: "Project Templates" }), state === "loading" ? (_jsx(RefreshCw, { className: "h-3.5 w-3.5 animate-spin text-amber-600", strokeWidth: 1.5 })) : null, state === "error" ? (_jsx(AlertCircle, { className: "h-3.5 w-3.5 text-red-600", strokeWidth: 1.5 })) : null] }), _jsxs("div", { className: "mt-2", children: [_jsx("div", { className: "truncate text-sm font-semibold text-slate-900", children: selectedTemplate
|
|
38
|
+
? `Project Templates: ${selectedTemplate.name}`
|
|
39
|
+
: "Project Templates" }), _jsx("p", { className: "mt-1 text-xs text-slate-500", children: selectorSummary })] })] }), _jsxs("div", { className: "border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => void onRefreshTemplates(), disabled: state === "loading" || deleting, "data-testid": "project-template-refresh-button", children: _jsx(RefreshCw, { className: cn("h-4 w-4", state === "loading" && "animate-spin"), strokeWidth: 1.5 }) }), _jsxs(Button, { size: "sm", onClick: () => void onCreateTemplate(), "data-testid": "project-template-create-button", children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Create Template"] })] }), _jsxs("div", { className: "relative mt-2", children: [_jsx(Search, { className: "pointer-events-none absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-slate-400", strokeWidth: 1.5 }), _jsx(Input, { type: "text", placeholder: "Search templates...", value: searchQuery, onChange: (event) => setSearchQuery(event.target.value), className: "pl-9 text-xs md:text-xs", "data-testid": "project-template-search-input" })] }), error ? (_jsx("div", { className: "mt-2 rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: error })) : null] }), _jsx("div", { className: "max-h-[360px] overflow-y-auto p-2", children: filteredTemplates.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: [_jsx(GitBranch, { className: "mb-4 h-10 w-10 text-gray-300", strokeWidth: 1.2 }), _jsx("p", { className: "text-xs text-gray-500", children: searchQuery
|
|
40
|
+
? "No templates match your search"
|
|
41
|
+
: "No project templates found" })] })) : (_jsx("div", { className: "flex flex-col gap-1", children: filteredTemplates.map((template) => {
|
|
42
|
+
const isSelected = selectedTemplateId === template.id;
|
|
43
|
+
return (_jsxs("div", { className: "relative", children: [_jsx("button", { type: "button", onClick: async () => {
|
|
44
|
+
const didSelect = await onSelectTemplate(template);
|
|
45
|
+
if (didSelect) {
|
|
46
|
+
setOpen(false);
|
|
47
|
+
}
|
|
48
|
+
}, "data-testid": `project-template-list-item-${template.id}`, className: cn("w-full rounded-lg border p-3 pr-12 text-left transition-colors", isSelected
|
|
49
|
+
? "border-slate-300 bg-slate-50"
|
|
50
|
+
: "border-transparent hover:border-slate-200 hover:bg-slate-50/60"), children: _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [template.isSystem ? (_jsx("span", { title: "System template", className: "inline-flex", "aria-label": "System template", children: _jsx(ParheliaIconWhite, { size: 14, className: "shrink-0 invert" }) })) : null, _jsx("span", { className: "truncate text-sm font-medium text-slate-800", children: template.name }), template.disabled ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })) : null, template.hideFromCreateDialog ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Hidden" })) : null, template.openInWizardMode ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Wizard" })) : null] }), template.description ? (_jsx("div", { className: "mt-1 line-clamp-2 text-xs text-slate-500", children: template.description })) : null, _jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-2 text-xs text-slate-500", children: [_jsxs("span", { children: [template.taskTemplates.length, " task templates"] }), template.defaultCostLimit != null ? (_jsxs("span", { children: ["Default budget: ", template.defaultCostLimit] })) : null] })] }) }), !template.isSystem ? (_jsx(Button, { type: "button", variant: "ghost", size: "iconXs", className: "absolute top-2.5 right-2.5 text-gray-400 hover:text-red-600", "data-testid": `project-template-card-delete-button-${template.id}`, "aria-label": `Delete ${template.name}`, disabled: deleting, onClick: (event) => {
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
event.stopPropagation();
|
|
53
|
+
onDeleteTemplate(template);
|
|
54
|
+
}, children: _jsx(Trash2, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }) })) : null] }, template.id));
|
|
55
|
+
}) })) })] })] }));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ProjectTemplateSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectTemplateSelector.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/ProjectTemplateSelector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
3
|
-
import {
|
|
3
|
+
import { ChevronLeft, CopyPlus, CornerDownRight, GitBranch, Link2, Plus, LayoutTemplate, RefreshCw, Settings2, Shield, Trash2, X, } from "lucide-react";
|
|
4
4
|
import { toast } from "sonner";
|
|
5
5
|
import { Button } from "../../../components/ui/button";
|
|
6
6
|
import { Dialog, DialogContent, DialogFooter, } from "../../../components/ui/dialog";
|
|
@@ -20,12 +20,14 @@ import { getAiProfilesErrorMessage, loadAiProfiles, } from "../../services/aiSer
|
|
|
20
20
|
import { updateAgentContext } from "../../services/agentService";
|
|
21
21
|
import { useEditContext } from "../../client/editContext";
|
|
22
22
|
import { ItemNameDialog, } from "../../ui/ItemNameDialogNew";
|
|
23
|
+
import { SimpleTabs } from "../../ui/SimpleTabs";
|
|
23
24
|
import { isTypingEventTarget } from "../../utils/keyboardNavigation";
|
|
24
25
|
import { cn } from "../../../lib/utils";
|
|
25
26
|
import { AgentProfileEditorPanel, } from "./AgentProfileEditorPanel";
|
|
26
27
|
import { ProjectTemplateAgentPanel } from "./ProjectTemplateAgentPanel";
|
|
28
|
+
import { ProjectTemplateSelector } from "./ProjectTemplateSelector";
|
|
29
|
+
import { useRequiredSettingsHeaderActions } from "../SettingsHeaderActionsContext";
|
|
27
30
|
import { useSearchParams } from "../../client/navigation";
|
|
28
|
-
import { ParheliaIconWhite } from "../../ui/ParheliaIconWhite";
|
|
29
31
|
// Query param for deep-linking the selected project template (settings reload).
|
|
30
32
|
const SELECTED_PROJECT_TEMPLATE_QUERY_PARAM = "projectTemplateId";
|
|
31
33
|
const PRIORITY_OPTIONS = [
|
|
@@ -378,7 +380,6 @@ export function ProjectTemplatesPanel() {
|
|
|
378
380
|
const [state, setState] = useState("loading");
|
|
379
381
|
const [templates, setTemplates] = useState([]);
|
|
380
382
|
const [error, setError] = useState(null);
|
|
381
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
382
383
|
const [selectedTemplateId, setSelectedTemplateId] = useState(null);
|
|
383
384
|
const [draftTemplate, setDraftTemplate] = useState(null);
|
|
384
385
|
const [selectedTaskId, setSelectedTaskId] = useState(null);
|
|
@@ -397,14 +398,15 @@ export function ProjectTemplatesPanel() {
|
|
|
397
398
|
const [creatingChildTask, setCreatingChildTask] = useState(false);
|
|
398
399
|
const [dependencyPickerOpen, setDependencyPickerOpen] = useState(false);
|
|
399
400
|
const [selectedDependencyId, setSelectedDependencyId] = useState(null);
|
|
400
|
-
const [
|
|
401
|
+
const [activeDetailTab, setActiveDetailTab] = useState("tasks");
|
|
401
402
|
const [templateAgentId, setTemplateAgentId] = useState(null);
|
|
402
403
|
const [templateAgentLoading, setTemplateAgentLoading] = useState(false);
|
|
403
404
|
const [templateAgentResetting, setTemplateAgentResetting] = useState(false);
|
|
404
405
|
const [templateAgentError, setTemplateAgentError] = useState(null);
|
|
405
406
|
const [duplicatingAgentProfile, setDuplicatingAgentProfile] = useState(false);
|
|
406
|
-
const [mobileView, setMobileView] = useState("
|
|
407
|
+
const [mobileView, setMobileView] = useState("detail");
|
|
407
408
|
const [editingAgentProfile, setEditingAgentProfile] = useState(null);
|
|
409
|
+
const setSettingsHeaderActions = useRequiredSettingsHeaderActions();
|
|
408
410
|
const autosaveTimeoutRef = useRef(null);
|
|
409
411
|
const lastPersistedSignatureRef = useRef(null);
|
|
410
412
|
const latestDraftSignatureRef = useRef(null);
|
|
@@ -442,9 +444,9 @@ export function ProjectTemplatesPanel() {
|
|
|
442
444
|
}, [draftTemplate]);
|
|
443
445
|
useEffect(() => {
|
|
444
446
|
if (draftTemplate && !draftTemplate.name.trim()) {
|
|
445
|
-
|
|
447
|
+
setActiveDetailTab("basic");
|
|
446
448
|
}
|
|
447
|
-
}, [draftTemplate
|
|
449
|
+
}, [draftTemplate]);
|
|
448
450
|
const selectTemplate = useCallback((template) => {
|
|
449
451
|
// Re-selecting the currently-selected template while a save is in flight
|
|
450
452
|
// or the draft has unsaved changes would clobber the optimistic state
|
|
@@ -470,6 +472,7 @@ export function ProjectTemplatesPanel() {
|
|
|
470
472
|
setDraftTemplate(clonedTemplate);
|
|
471
473
|
setEditingAgentProfile(null);
|
|
472
474
|
setSelectedTaskId(getSelectedTaskIdForTemplate(clonedTemplate, preferredTaskId));
|
|
475
|
+
setActiveDetailTab(clonedTemplate && !clonedTemplate.name.trim() ? "basic" : "tasks");
|
|
473
476
|
setIsDirty(false);
|
|
474
477
|
setSaveError(null);
|
|
475
478
|
lastPersistedSignatureRef.current = persistedSignature;
|
|
@@ -482,17 +485,13 @@ export function ProjectTemplatesPanel() {
|
|
|
482
485
|
});
|
|
483
486
|
}
|
|
484
487
|
}, [editContext, searchParams]);
|
|
485
|
-
const handleMobileBackToList = useCallback(() => {
|
|
486
|
-
setMobileView("list");
|
|
487
|
-
selectTemplate(null);
|
|
488
|
-
}, [selectTemplate]);
|
|
489
488
|
const handleMobileBackFromAgent = useCallback(() => {
|
|
490
489
|
setEditingAgentProfile(null);
|
|
491
490
|
setMobileView("detail");
|
|
492
491
|
}, []);
|
|
493
492
|
useEffect(() => {
|
|
494
493
|
if (!isMobile) {
|
|
495
|
-
setMobileView("
|
|
494
|
+
setMobileView("detail");
|
|
496
495
|
}
|
|
497
496
|
}, [isMobile]);
|
|
498
497
|
useEffect(() => {
|
|
@@ -587,16 +586,6 @@ export function ProjectTemplatesPanel() {
|
|
|
587
586
|
}
|
|
588
587
|
return byId;
|
|
589
588
|
}, [aiProfiles]);
|
|
590
|
-
const filteredTemplates = useMemo(() => {
|
|
591
|
-
const query = searchQuery.trim().toLowerCase();
|
|
592
|
-
if (!query)
|
|
593
|
-
return templates;
|
|
594
|
-
return templates.filter((template) => {
|
|
595
|
-
return (template.name.toLowerCase().includes(query) ||
|
|
596
|
-
template.description?.toLowerCase().includes(query) ||
|
|
597
|
-
template.taskTemplates.some((task) => task.title.toLowerCase().includes(query)));
|
|
598
|
-
});
|
|
599
|
-
}, [searchQuery, templates]);
|
|
600
589
|
const selectedTask = useMemo(() => draftTemplate?.taskTemplates.find((task) => task.id === selectedTaskId) ??
|
|
601
590
|
null, [draftTemplate, selectedTaskId]);
|
|
602
591
|
const dependencyTasks = useMemo(() => {
|
|
@@ -1184,12 +1173,13 @@ export function ProjectTemplatesPanel() {
|
|
|
1184
1173
|
const handleSelectTemplate = useCallback(async (template) => {
|
|
1185
1174
|
const canContinue = await flushPendingSave({ showErrorToast: true });
|
|
1186
1175
|
if (!canContinue) {
|
|
1187
|
-
return;
|
|
1176
|
+
return false;
|
|
1188
1177
|
}
|
|
1189
1178
|
selectTemplate(template);
|
|
1190
1179
|
if (isMobile) {
|
|
1191
1180
|
setMobileView("detail");
|
|
1192
1181
|
}
|
|
1182
|
+
return true;
|
|
1193
1183
|
}, [flushPendingSave, selectTemplate, isMobile]);
|
|
1194
1184
|
const handleRefreshTemplates = useCallback(async () => {
|
|
1195
1185
|
const canContinue = await flushPendingSave({ showErrorToast: true });
|
|
@@ -1559,18 +1549,28 @@ export function ProjectTemplatesPanel() {
|
|
|
1559
1549
|
selectedDependencyId,
|
|
1560
1550
|
selectedTaskId,
|
|
1561
1551
|
]);
|
|
1562
|
-
const
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1552
|
+
const templateSelector = useMemo(() => (_jsx(ProjectTemplateSelector, { templates: templates, selectedTemplate: draftTemplate, selectedTemplateId: selectedTemplateId, state: state, error: error, deleting: deleting, statusBadge: headerStatusBadge, onSelectTemplate: handleSelectTemplate, onCreateTemplate: handleCreateTemplate, onRefreshTemplates: handleRefreshTemplates, onDeleteTemplate: handleDeleteTemplate })), [
|
|
1553
|
+
deleting,
|
|
1554
|
+
draftTemplate,
|
|
1555
|
+
error,
|
|
1556
|
+
handleCreateTemplate,
|
|
1557
|
+
handleDeleteTemplate,
|
|
1558
|
+
handleRefreshTemplates,
|
|
1559
|
+
handleSelectTemplate,
|
|
1560
|
+
headerStatusBadge,
|
|
1561
|
+
selectedTemplateId,
|
|
1562
|
+
state,
|
|
1563
|
+
templates,
|
|
1564
|
+
]);
|
|
1565
|
+
const desktopTemplateSelector = useMemo(() => !isMobile ? (_jsxs("div", { className: "flex w-full max-w-[40rem] items-center justify-end gap-2", children: [_jsx("div", { className: "min-w-0 flex-1 max-w-[32rem]", children: templateSelector }), draftTemplate && !draftTemplate.isSystem ? (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => handleDeleteTemplate(), disabled: deleting, "data-testid": "project-template-delete-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), deleting ? "Deleting..." : "Delete"] })) : null] })) : null, [deleting, draftTemplate, handleDeleteTemplate, isMobile, templateSelector]);
|
|
1566
|
+
useEffect(() => {
|
|
1567
|
+
if (!setSettingsHeaderActions)
|
|
1568
|
+
return;
|
|
1569
|
+
setSettingsHeaderActions(desktopTemplateSelector);
|
|
1570
|
+
return () => {
|
|
1571
|
+
setSettingsHeaderActions(null);
|
|
1572
|
+
};
|
|
1573
|
+
}, [desktopTemplateSelector, setSettingsHeaderActions]);
|
|
1574
1574
|
const renderTemplateTaskEditorMain = () => {
|
|
1575
1575
|
if (!draftTemplate) {
|
|
1576
1576
|
return null;
|
|
@@ -1590,7 +1590,7 @@ export function ProjectTemplatesPanel() {
|
|
|
1590
1590
|
}));
|
|
1591
1591
|
return nextLayout;
|
|
1592
1592
|
} }) }));
|
|
1593
|
-
const taskPane = (_jsx("div", { className: "flex h-full min-h-0 flex-col overflow-hidden", "data-testid": "project-template-task-detail-pane", children: !selectedTask ? (_jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: _jsx("div", { className: "rounded-lg border border-dashed border-gray-200 bg-gray-50 p-6 text-center text-xs text-gray-500", children: "Select a task node to edit its details." }) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "shrink-0 border-b border-gray-100 bg-white px-4 pt-4 pb-3", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold text-gray-900", "data-testid": "project-template-selected-task-title", children: selectedTask.title || "Untitled Task" }), selectedTask.taskType === "DecisionPoint" ? (_jsx(Badge, { variant: "outline", className: "border-violet-200 bg-violet-50 text-[10px] uppercase text-violet-700", children: "Decision Point" })) : null, selectedTask.disabled ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })) : null] }), _jsx("div", { className: "text-xs text-gray-500", children: "Configure task details, assignment, and dependencies." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: handleDeleteSelectedTask, "data-testid": "project-template-remove-task-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), "Remove Task"] })] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 pt-3 pb-4", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", children: "Task title" }), _jsx(Input, { value: selectedTask.title, onChange: (event) => updateSelectedTask((currentTask) => ({
|
|
1593
|
+
const taskPane = (_jsx("div", { className: "flex h-full min-h-0 flex-col overflow-hidden", "data-testid": "project-template-task-detail-pane", children: !selectedTask ? (_jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: _jsx("div", { className: "rounded-lg border border-dashed border-gray-200 bg-gray-50 p-6 text-center text-xs text-gray-500", children: "Select a task node to edit its details." }) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "shrink-0 border-b border-gray-100 bg-white px-4 pt-4 pb-3", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold text-gray-900", "data-testid": "project-template-selected-task-title", children: selectedTask.title || "Untitled Task" }), selectedTask.taskType === "DecisionPoint" ? (_jsx(Badge, { variant: "outline", className: "border-violet-200 bg-violet-50 text-[10px] uppercase text-violet-700", children: "Decision Point" })) : null, selectedTask.disabled ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })) : null] }), _jsx("div", { className: "text-xs text-gray-500", children: "Configure task details, assignment, and dependencies." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: handleDeleteSelectedTask, "data-testid": "project-template-remove-task-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), "Remove Task"] })] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 pt-3 pb-4", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-task-title-input", children: "Task title" }), _jsx(Input, { id: "project-template-task-title-input", value: selectedTask.title, onChange: (event) => updateSelectedTask((currentTask) => ({
|
|
1594
1594
|
...currentTask,
|
|
1595
1595
|
title: event.target.value,
|
|
1596
1596
|
})), placeholder: "Task title", className: "text-xs md:text-xs", "data-testid": "project-template-task-title-input" })] }), _jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", children: "Description" }), _jsx(Textarea, { className: "text-xs", value: selectedTask.description ?? "", onChange: (event) => updateSelectedTask((currentTask) => ({
|
|
@@ -1652,43 +1652,57 @@ export function ProjectTemplatesPanel() {
|
|
|
1652
1652
|
},
|
|
1653
1653
|
] }) }));
|
|
1654
1654
|
};
|
|
1655
|
-
const detailContent =
|
|
1655
|
+
const detailContent = (_jsxs("div", { className: "flex h-full flex-col bg-gray-50/40", "data-testid": "project-template-detail-pane", children: [isMobile ? (_jsxs("div", { className: cn("gap-3 border-b border-gray-200 bg-white px-5 pt-1 pb-0.5", isMobile
|
|
1656
1656
|
? "grid grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3"
|
|
1657
|
-
: "flex items-center justify-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1657
|
+
: "flex items-center justify-end"), "data-testid": "project-template-detail-pane-header", children: [isMobile ? _jsx("div", { className: "min-w-0", children: templateSelector }) : null, _jsx("div", { className: "flex shrink-0 items-center gap-1.5 self-center bg-white pl-1", children: draftTemplate &&
|
|
1658
|
+
!draftTemplate.isSystem &&
|
|
1659
|
+
(isMobile ? (_jsx(Button, { variant: "outline", size: "icon", className: "h-9 w-9 shrink-0", onClick: () => handleDeleteTemplate(), disabled: deleting, "aria-label": deleting ? "Deleting template" : "Delete template", title: deleting ? "Deleting…" : "Delete template", "data-testid": "project-template-delete-button", children: deleting ? (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin", strokeWidth: 1.5 })) : (_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 })) })) : null) })] })) : null, draftTemplate ? ((() => {
|
|
1660
|
+
const detailTabs = [
|
|
1661
|
+
{
|
|
1662
|
+
id: "project-template-tab-basic-settings",
|
|
1663
|
+
label: "Basic Settings",
|
|
1664
|
+
content: null,
|
|
1665
|
+
testId: "project-template-tab-basic-settings",
|
|
1666
|
+
},
|
|
1667
|
+
{
|
|
1668
|
+
id: "project-template-tab-task-editor",
|
|
1669
|
+
label: "Task Editor",
|
|
1670
|
+
content: null,
|
|
1671
|
+
testId: "project-template-tab-task-editor",
|
|
1672
|
+
},
|
|
1673
|
+
];
|
|
1674
|
+
const basicSettingsContent = (_jsxs("div", { className: "grid gap-4 overflow-y-auto p-4 md:grid-cols-2", "data-testid": "project-template-basic-settings-panel", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-name-input", children: "Template name" }), _jsx(Input, { id: "project-template-name-input", value: draftTemplate.name, onChange: (event) => applyDraftChange((currentTemplate) => ({
|
|
1675
|
+
...currentTemplate,
|
|
1676
|
+
name: event.target.value,
|
|
1677
|
+
})), placeholder: "Project template name", className: "text-xs md:text-xs", "data-testid": "project-template-name-input" })] }), _jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-description-input", children: "Description" }), _jsx(Textarea, { id: "project-template-description-input", className: "text-xs", value: draftTemplate.description ?? "", onChange: (event) => applyDraftChange((currentTemplate) => ({
|
|
1678
|
+
...currentTemplate,
|
|
1679
|
+
description: event.target.value,
|
|
1680
|
+
})), rows: 4, placeholder: "Describe when to use this template", "data-testid": "project-template-description-input" })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-default-cost-limit-input", children: "Default cost limit" }), _jsx(Input, { id: "project-template-default-cost-limit-input", type: "number", value: draftTemplate.defaultCostLimit ?? "", onChange: (event) => applyDraftChange((currentTemplate) => ({
|
|
1681
|
+
...currentTemplate,
|
|
1682
|
+
defaultCostLimit: event.target.value.trim() === ""
|
|
1683
|
+
? null
|
|
1684
|
+
: Number(event.target.value),
|
|
1685
|
+
})), placeholder: "0", className: "text-xs md:text-xs", "data-testid": "project-template-default-cost-limit-input" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Disabled" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "Makes the template unavailable for project creation and template resolution." })] }), _jsx(Switch, { checked: draftTemplate.disabled === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
|
|
1686
|
+
...currentTemplate,
|
|
1687
|
+
disabled: checked,
|
|
1688
|
+
})), className: "data-[state=checked]:bg-amber-600 data-[state=checked]:shadow-inner dark:data-[state=checked]:bg-amber-600", "aria-label": "Disable this project template", "data-testid": "project-template-disabled-switch" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Hide from create dialog" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "Keeps the template active, but removes it from the create project dialog." })] }), _jsx(Switch, { checked: draftTemplate.hideFromCreateDialog === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
|
|
1689
|
+
...currentTemplate,
|
|
1690
|
+
hideFromCreateDialog: checked,
|
|
1691
|
+
})), "aria-label": "Hide this project template from the create dialog", "data-testid": "project-template-hide-from-create-dialog-switch" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Open in wizard mode" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "New projects created from this template start in taskboard wizard mode." })] }), _jsx(Switch, { checked: draftTemplate.openInWizardMode === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
|
|
1692
|
+
...currentTemplate,
|
|
1693
|
+
openInWizardMode: checked,
|
|
1694
|
+
})), "aria-label": "Open new projects from this template in wizard mode", "data-testid": "project-template-open-in-wizard-mode-switch" })] })] }));
|
|
1695
|
+
const taskEditorContent = (_jsx("div", { className: "flex h-full min-h-0 flex-1 flex-col overflow-hidden", children: renderTemplateTaskEditorMain() }));
|
|
1696
|
+
return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-y-contain p-5 md:overflow-hidden", children: [_jsx("div", { className: "flex shrink-0 flex-col gap-5 md:max-h-[50vh] md:min-h-0 md:overflow-y-auto md:overscroll-y-contain", children: saveError && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 px-4 py-3 text-xs text-red-700", children: saveError })) }), _jsxs("section", { className: "flex min-h-0 flex-1 flex-col rounded-lg border border-gray-200 bg-white shadow-sm md:overflow-hidden", children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-3 border-b border-gray-100 px-4 py-3", children: [_jsx("div", { className: "min-w-0 flex-1", children: _jsx(SimpleTabs, { tabs: detailTabs, activeTab: activeDetailTab === "basic" ? 0 : 1, setActiveTab: (index) => setActiveDetailTab(index === 0 ? "basic" : "tasks"), hideContent: true, variant: "elegant", className: "w-full justify-start gap-6" }) }), activeDetailTab === "tasks" ? (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => void handleOpenCreateTaskDialog(), disabled: creatingTask, "data-testid": "project-template-add-task-button", children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Add Task"] })) : null] }), _jsx("div", { className: "flex flex-col min-h-0 flex-1 overflow-hidden", children: activeDetailTab === "basic"
|
|
1697
|
+
? basicSettingsContent
|
|
1698
|
+
: taskEditorContent })] })] }));
|
|
1699
|
+
})()) : (_jsx("div", { className: "flex min-h-0 flex-1 items-center justify-center p-5", children: _jsxs("div", { className: "max-w-sm rounded-lg border border-dashed border-gray-300 bg-white p-8 text-center", children: [_jsx(GitBranch, { className: "mx-auto mb-3 h-10 w-10 text-gray-300", strokeWidth: 1.2 }), _jsx("h3", { className: "text-xs font-semibold text-gray-900", children: "Select a project template" }), _jsx("p", { className: "mt-1 text-xs text-gray-500", children: "Choose a template from the dropdown or create a new one to start editing." })] }) }))] }));
|
|
1679
1700
|
const agentPanelContent = (_jsx(ProjectTemplateAgentPanel, { templateName: draftTemplate?.name ?? null, agentId: templateAgentId, loading: templateAgentLoading, resetting: templateAgentResetting, error: templateAgentError, onStartOver: () => void handleResetTemplateAgent(), headerStart: isMobile ? (_jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "gap-1 px-2", onClick: handleMobileBackFromAgent, "data-testid": "project-template-mobile-back-from-agent", children: _jsx(ChevronLeft, { className: "h-5 w-5", strokeWidth: 1.5 }) })) : undefined }));
|
|
1680
1701
|
const rightPanelContent = editingAgentProfile ? (_jsx(AgentProfileEditorPanel, { agent: editingAgentProfile, onClose: handleCloseEditingAgentProfile, actions: _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => void handleDuplicateAssignedAgentProfile(), disabled: !selectedAgentProfileId ||
|
|
1681
1702
|
!editContext ||
|
|
1682
1703
|
duplicatingAgentProfile ||
|
|
1683
1704
|
editingAgentProfile.id !== selectedAgentProfileId, "data-testid": "project-template-task-duplicate-agent-profile-button", children: [_jsx(CopyPlus, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), duplicatingAgentProfile ? "Duplicating..." : "Duplicate"] }) })) : (agentPanelContent);
|
|
1684
1705
|
const panels = [
|
|
1685
|
-
{
|
|
1686
|
-
name: "project-template-list",
|
|
1687
|
-
defaultSize: 360,
|
|
1688
|
-
content: listContent,
|
|
1689
|
-
className: "overflow-hidden",
|
|
1690
|
-
hidden: isMobile && mobileView !== "list",
|
|
1691
|
-
},
|
|
1692
1706
|
{
|
|
1693
1707
|
name: "project-template-detail",
|
|
1694
1708
|
defaultSize: "auto",
|
|
@@ -1705,7 +1719,7 @@ export function ProjectTemplatesPanel() {
|
|
|
1705
1719
|
hidden: isMobile && mobileView !== "agent",
|
|
1706
1720
|
},
|
|
1707
1721
|
];
|
|
1708
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-full", "data-testid": "project-template-editor", onKeyDownCapture: handleProjectTemplateEditorKeyDownCapture, children: _jsx(Splitter, { panels: panels, localStorageKey: "settings-project-templates-panel-splitter-
|
|
1722
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-full", "data-testid": "project-template-editor", onKeyDownCapture: handleProjectTemplateEditorKeyDownCapture, children: _jsx(Splitter, { panels: panels, localStorageKey: "settings-project-templates-panel-splitter-v3", direction: "horizontal", className: "h-full" }) }), _jsx(Dialog, { open: isCreateTaskDialogOpen, onOpenChange: (open) => {
|
|
1709
1723
|
setIsCreateTaskDialogOpen(open);
|
|
1710
1724
|
if (!open) {
|
|
1711
1725
|
setNewTaskDependencySourceId(null);
|