AddFieldDialog.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. "use client";
  2. import { useState } from "react";
  3. import { Button } from "@/components/ui/button";
  4. import {
  5. Dialog,
  6. DialogContent,
  7. DialogDescription,
  8. DialogFooter,
  9. DialogHeader,
  10. DialogTitle,
  11. } from "@/components/ui/dialog";
  12. import { Input } from "@/components/ui/input";
  13. import { Label } from "@/components/ui/label";
  14. import {
  15. Select,
  16. SelectContent,
  17. SelectItem,
  18. SelectTrigger,
  19. SelectValue,
  20. } from "@/components/ui/select";
  21. import { createLayoutSectionField } from "@/app/actions/layout-configurations";
  22. interface AddFieldDialogProps {
  23. sectionId: number;
  24. open: boolean;
  25. onOpenChange: (open: boolean) => void;
  26. onSuccess: () => void;
  27. }
  28. export function AddFieldDialog({
  29. sectionId,
  30. open,
  31. onOpenChange,
  32. onSuccess,
  33. }: AddFieldDialogProps) {
  34. const [loading, setLoading] = useState(false);
  35. const [formData, setFormData] = useState({
  36. name: "",
  37. dataType: "STRING",
  38. dataTypeFormat: "",
  39. cellPosition: "",
  40. importTableColumnName: "",
  41. importColumnOrderNumber: 0,
  42. });
  43. const handleSubmit = async (e: React.FormEvent) => {
  44. e.preventDefault();
  45. setLoading(true);
  46. try {
  47. const result = await createLayoutSectionField(sectionId, {
  48. ...formData,
  49. importColumnOrderNumber: parseInt(formData.importColumnOrderNumber.toString()),
  50. });
  51. if (result.success) {
  52. onSuccess();
  53. setFormData({
  54. name: "",
  55. dataType: "STRING",
  56. dataTypeFormat: "",
  57. cellPosition: "",
  58. importTableColumnName: "",
  59. importColumnOrderNumber: 0,
  60. });
  61. }
  62. } catch (error) {
  63. console.error("Error adding field:", error);
  64. } finally {
  65. setLoading(false);
  66. }
  67. };
  68. return (
  69. <Dialog open={open} onOpenChange={onOpenChange}>
  70. <DialogContent className="sm:max-w-[425px]">
  71. <DialogHeader>
  72. <DialogTitle>Add New Field</DialogTitle>
  73. <DialogDescription>
  74. Add a new field to this section configuration.
  75. </DialogDescription>
  76. </DialogHeader>
  77. <form onSubmit={handleSubmit}>
  78. <div className="grid gap-4 py-4">
  79. <div className="grid gap-2">
  80. <Label htmlFor="name">Field Name</Label>
  81. <Input
  82. id="name"
  83. value={formData.name}
  84. onChange={(e) => setFormData({ ...formData, name: e.target.value })}
  85. required
  86. />
  87. </div>
  88. <div className="grid gap-2">
  89. <Label htmlFor="dataType">Data Type</Label>
  90. <Select
  91. value={formData.dataType}
  92. onValueChange={(value) => setFormData({ ...formData, dataType: value })}
  93. >
  94. <SelectTrigger>
  95. <SelectValue />
  96. </SelectTrigger>
  97. <SelectContent>
  98. <SelectItem value="STRING">String</SelectItem>
  99. <SelectItem value="NUMBER">Number</SelectItem>
  100. <SelectItem value="DATE">Date</SelectItem>
  101. <SelectItem value="BOOLEAN">Boolean</SelectItem>
  102. <SelectItem value="EMAIL">Email</SelectItem>
  103. </SelectContent>
  104. </Select>
  105. </div>
  106. <div className="grid gap-2">
  107. <Label htmlFor="dataTypeFormat">Data Type Format</Label>
  108. <Input
  109. id="dataTypeFormat"
  110. value={formData.dataTypeFormat}
  111. onChange={(e) => setFormData({ ...formData, dataTypeFormat: e.target.value })}
  112. placeholder="e.g., YYYY-MM-DD"
  113. />
  114. </div>
  115. <div className="grid gap-2">
  116. <Label htmlFor="cellPosition">Cell Position</Label>
  117. <Input
  118. id="cellPosition"
  119. value={formData.cellPosition}
  120. onChange={(e) => setFormData({ ...formData, cellPosition: e.target.value })}
  121. required
  122. placeholder="e.g., A1"
  123. />
  124. </div>
  125. <div className="grid gap-2">
  126. <Label htmlFor="importTableColumnName">Import Column Name</Label>
  127. <Input
  128. id="importTableColumnName"
  129. value={formData.importTableColumnName}
  130. onChange={(e) => setFormData({ ...formData, importTableColumnName: e.target.value })}
  131. required
  132. />
  133. </div>
  134. <div className="grid gap-2">
  135. <Label htmlFor="importColumnOrderNumber">Column Order</Label>
  136. <Input
  137. id="importColumnOrderNumber"
  138. type="number"
  139. value={formData.importColumnOrderNumber}
  140. onChange={(e) => setFormData({ ...formData, importColumnOrderNumber: parseInt(e.target.value) || 0 })}
  141. required
  142. min={0}
  143. />
  144. </div>
  145. </div>
  146. <DialogFooter>
  147. <Button type="button" variant="outline" onClick={() => onOpenChange(false)}>
  148. Cancel
  149. </Button>
  150. <Button type="submit" disabled={loading}>
  151. {loading ? "Adding..." : "Add Field"}
  152. </Button>
  153. </DialogFooter>
  154. </form>
  155. </DialogContent>
  156. </Dialog>
  157. );
  158. }