CreateLayoutConfigurationDialog.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. "use client";
  2. import { useState } from "react";
  3. import { useRouter } from "next/navigation";
  4. import { createLayoutConfiguration } from "@/app/actions/layout-configurations";
  5. import { Button } from "@/components/ui/button";
  6. import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog";
  7. import { Input } from "@/components/ui/input";
  8. import { Label } from "@/components/ui/label";
  9. import { toast } from "@/hooks/use-toast";
  10. import { Plus } from "lucide-react";
  11. export function CreateLayoutConfigurationDialog() {
  12. const [open, setOpen] = useState(false);
  13. const [name, setName] = useState("");
  14. const [loading, setLoading] = useState(false);
  15. const router = useRouter();
  16. async function handleSubmit(e: React.FormEvent) {
  17. e.preventDefault();
  18. if (!name.trim()) {
  19. toast({
  20. title: "Error",
  21. description: "Please enter a configuration name",
  22. variant: "destructive",
  23. });
  24. return;
  25. }
  26. setLoading(true);
  27. try {
  28. const result = await createLayoutConfiguration(name.trim());
  29. if (result.success) {
  30. toast({
  31. title: "Success",
  32. description: "Layout configuration created successfully",
  33. });
  34. setOpen(false);
  35. setName("");
  36. router.refresh();
  37. } else {
  38. toast({
  39. title: "Error",
  40. description: result.error,
  41. variant: "destructive",
  42. });
  43. }
  44. } catch (error) {
  45. toast({
  46. title: "Error",
  47. description: "Failed to create layout configuration",
  48. variant: "destructive",
  49. });
  50. } finally {
  51. setLoading(false);
  52. }
  53. }
  54. return (
  55. <Dialog open={open} onOpenChange={setOpen}>
  56. <DialogTrigger asChild>
  57. <Button>
  58. <Plus className="mr-2 h-4 w-4" />
  59. Create Configuration
  60. </Button>
  61. </DialogTrigger>
  62. <DialogContent>
  63. <DialogHeader>
  64. <DialogTitle>Create New Layout Configuration</DialogTitle>
  65. <DialogDescription>
  66. Enter a name for your new layout configuration.
  67. </DialogDescription>
  68. </DialogHeader>
  69. <form onSubmit={handleSubmit}>
  70. <div className="grid gap-4 py-4">
  71. <div className="grid gap-2">
  72. <Label htmlFor="name">Configuration Name</Label>
  73. <Input
  74. id="name"
  75. value={name}
  76. onChange={(e) => setName(e.target.value)}
  77. placeholder="Enter configuration name"
  78. disabled={loading}
  79. />
  80. </div>
  81. </div>
  82. <DialogFooter>
  83. <Button type="submit" disabled={loading}>
  84. {loading ? "Creating..." : "Create"}
  85. </Button>
  86. </DialogFooter>
  87. </form>
  88. </DialogContent>
  89. </Dialog>
  90. );
  91. }