mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-02 20:43:36 +00:00
ttt
This commit is contained in:
1
.automaker
Symbolic link
1
.automaker
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/Users/webdevcody/Workspace/automaker/.automaker
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import {
|
||||||
|
Dialog,
|
||||||
|
DialogContent,
|
||||||
|
DialogDescription,
|
||||||
|
DialogFooter,
|
||||||
|
DialogHeader,
|
||||||
|
DialogTitle,
|
||||||
|
} from "@/components/ui/dialog";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import { Trash2 } from "lucide-react";
|
||||||
|
|
||||||
|
interface DeleteAllArchivedSessionsDialogProps {
|
||||||
|
open: boolean;
|
||||||
|
onOpenChange: (open: boolean) => void;
|
||||||
|
archivedCount: number;
|
||||||
|
onConfirm: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function DeleteAllArchivedSessionsDialog({
|
||||||
|
open,
|
||||||
|
onOpenChange,
|
||||||
|
archivedCount,
|
||||||
|
onConfirm,
|
||||||
|
}: DeleteAllArchivedSessionsDialogProps) {
|
||||||
|
return (
|
||||||
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
||||||
|
<DialogContent data-testid="delete-all-archived-sessions-dialog">
|
||||||
|
<DialogHeader>
|
||||||
|
<DialogTitle>Delete All Archived Sessions</DialogTitle>
|
||||||
|
<DialogDescription>
|
||||||
|
Are you sure you want to delete all archived sessions? This action
|
||||||
|
cannot be undone.
|
||||||
|
{archivedCount > 0 && (
|
||||||
|
<span className="block mt-2 text-yellow-500">
|
||||||
|
{archivedCount} session(s) will be deleted.
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</DialogDescription>
|
||||||
|
</DialogHeader>
|
||||||
|
<DialogFooter>
|
||||||
|
<Button variant="ghost" onClick={() => onOpenChange(false)}>
|
||||||
|
Cancel
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="destructive"
|
||||||
|
onClick={onConfirm}
|
||||||
|
data-testid="confirm-delete-all-archived-sessions"
|
||||||
|
>
|
||||||
|
<Trash2 className="w-4 h-4 mr-2" />
|
||||||
|
Delete All
|
||||||
|
</Button>
|
||||||
|
</DialogFooter>
|
||||||
|
</DialogContent>
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ import type { SessionListItem } from "@/types/electron";
|
|||||||
import { useKeyboardShortcutsConfig } from "@/hooks/use-keyboard-shortcuts";
|
import { useKeyboardShortcutsConfig } from "@/hooks/use-keyboard-shortcuts";
|
||||||
import { getElectronAPI } from "@/lib/electron";
|
import { getElectronAPI } from "@/lib/electron";
|
||||||
import { DeleteSessionDialog } from "@/components/delete-session-dialog";
|
import { DeleteSessionDialog } from "@/components/delete-session-dialog";
|
||||||
|
import { DeleteAllArchivedSessionsDialog } from "@/components/delete-all-archived-sessions-dialog";
|
||||||
|
|
||||||
// Random session name generator
|
// Random session name generator
|
||||||
const adjectives = [
|
const adjectives = [
|
||||||
@@ -116,6 +117,7 @@ export function SessionManager({
|
|||||||
);
|
);
|
||||||
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
||||||
const [sessionToDelete, setSessionToDelete] = useState<SessionListItem | null>(null);
|
const [sessionToDelete, setSessionToDelete] = useState<SessionListItem | null>(null);
|
||||||
|
const [isDeleteAllArchivedDialogOpen, setIsDeleteAllArchivedDialogOpen] = useState(false);
|
||||||
|
|
||||||
// Check running state for all sessions
|
// Check running state for all sessions
|
||||||
const checkRunningSessions = async (sessionList: SessionListItem[]) => {
|
const checkRunningSessions = async (sessionList: SessionListItem[]) => {
|
||||||
@@ -314,6 +316,20 @@ export function SessionManager({
|
|||||||
setSessionToDelete(null);
|
setSessionToDelete(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Delete all archived sessions
|
||||||
|
const handleDeleteAllArchivedSessions = async () => {
|
||||||
|
const api = getElectronAPI();
|
||||||
|
if (!api?.sessions) return;
|
||||||
|
|
||||||
|
// Delete each archived session
|
||||||
|
for (const session of archivedSessions) {
|
||||||
|
await api.sessions.delete(session.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
await loadSessions();
|
||||||
|
setIsDeleteAllArchivedDialogOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
const activeSessions = sessions.filter((s) => !s.isArchived);
|
const activeSessions = sessions.filter((s) => !s.isArchived);
|
||||||
const archivedSessions = sessions.filter((s) => s.isArchived);
|
const archivedSessions = sessions.filter((s) => s.isArchived);
|
||||||
const displayedSessions =
|
const displayedSessions =
|
||||||
@@ -402,6 +418,22 @@ export function SessionManager({
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Delete All Archived button - shown at the top of archived sessions */}
|
||||||
|
{activeTab === "archived" && archivedSessions.length > 0 && (
|
||||||
|
<div className="pb-2 border-b mb-2">
|
||||||
|
<Button
|
||||||
|
variant="destructive"
|
||||||
|
size="sm"
|
||||||
|
className="w-full"
|
||||||
|
onClick={() => setIsDeleteAllArchivedDialogOpen(true)}
|
||||||
|
data-testid="delete-all-archived-sessions-button"
|
||||||
|
>
|
||||||
|
<Trash2 className="w-4 h-4 mr-2" />
|
||||||
|
Delete All Archived Sessions
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Session list */}
|
{/* Session list */}
|
||||||
{displayedSessions.map((session) => (
|
{displayedSessions.map((session) => (
|
||||||
<div
|
<div
|
||||||
@@ -574,6 +606,14 @@ export function SessionManager({
|
|||||||
session={sessionToDelete}
|
session={sessionToDelete}
|
||||||
onConfirm={confirmDeleteSession}
|
onConfirm={confirmDeleteSession}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* Delete All Archived Sessions Confirmation Dialog */}
|
||||||
|
<DeleteAllArchivedSessionsDialog
|
||||||
|
open={isDeleteAllArchivedDialogOpen}
|
||||||
|
onOpenChange={setIsDeleteAllArchivedDialogOpen}
|
||||||
|
archivedCount={archivedSessions.length}
|
||||||
|
onConfirm={handleDeleteAllArchivedSessions}
|
||||||
|
/>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user