AutoLoop / components /node-editor /workflow-settings-dialog.tsx
shubhjn's picture
feat: Introduce a comprehensive automation and content management system with workflow management, social media integration, and email capabilities.
b8dc207
import { useState } from "react";
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { AutomationWorkflow } from "@/types";
interface WorkflowSettingsDialogProps {
workflow: Partial<AutomationWorkflow>;
onSave: (updates: Partial<AutomationWorkflow>) => void;
open: boolean;
onOpenChange: (open: boolean) => void;
}
const TIMEZONES = [
"UTC",
"America/New_York",
"America/Chicago",
"America/Denver",
"America/Los_Angeles",
"Europe/London",
"Europe/Paris",
"Europe/Berlin",
"Asia/Tokyo",
"Asia/Singapore",
"Asia/Dubai",
"Australia/Sydney",
];
function WorkflowSettingsForm({ workflow, onSave }: { workflow: Partial<AutomationWorkflow>, onSave: (updates: Partial<AutomationWorkflow>) => void }) {
const [name, setName] = useState(workflow.name || "");
const [description, setDescription] = useState(workflow.description || "");
const [timezone, setTimezone] = useState(workflow.timezone || "UTC");
const handleSave = () => {
onSave({
name,
description,
timezone
});
};
return (
<>
<div className="grid gap-4 py-4">
<div className="grid gap-2">
<Label htmlFor="name">Name</Label>
<Input
id="name"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="My Awesome Workflow"
/>
</div>
<div className="grid gap-2">
<Label htmlFor="description">Description</Label>
<Textarea
id="description"
value={description}
onChange={(e) => setDescription(e.target.value)}
placeholder="What does this workflow do?"
/>
</div>
<div className="grid gap-2">
<Label htmlFor="timezone">Timezone</Label>
<Select value={timezone} onValueChange={setTimezone}>
<SelectTrigger>
<SelectValue placeholder="Select timezone" />
</SelectTrigger>
<SelectContent>
{TIMEZONES.map((tz) => (
<SelectItem key={tz} value={tz}>
{tz}
</SelectItem>
))}
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground">
Used for scheduling and delay calculations.
</p>
</div>
</div>
<DialogFooter>
<Button onClick={handleSave}>Save Changes</Button>
</DialogFooter>
</>
);
}
export function WorkflowSettingsDialog({ workflow, onSave, open, onOpenChange }: WorkflowSettingsDialogProps) {
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogTitle>Workflow Settings</DialogTitle>
<DialogDescription>
Configure global settings for this workflow.
</DialogDescription>
</DialogHeader>
{/*
We conditionally render the form only when open is true (or relying on Dialog content mounting behavior).
However, to guarantee fresh state initialization from props every time it opens,
we force re-mounting by keying it with 'open'.
Actually, if DialogContent unmounts on close, we are good.
Shadcn DialogContent usually stays mounted but hidden? No, it uses Radix Dialog Portal.
Let's use a key to be safe.
*/}
{open && (
<WorkflowSettingsForm
key={open ? 'open' : 'closed'}
workflow={workflow}
onSave={(updates) => {
onSave(updates);
onOpenChange(false);
}}
/>
)}
</DialogContent>
</Dialog>
);
}