EditFieldDialog.tsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. "use client";
  2. import { useState, useEffect } 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 { updateLayoutSectionField } from "@/app/actions/layout-configurations";
  22. interface LayoutSectionField {
  23. id: number;
  24. name: string;
  25. dataType: string;
  26. dataTypeFormat: string | null;
  27. cellPosition: string;
  28. importTableColumnName: string;
  29. importColumnOrderNumber: number;
  30. }
  31. interface EditFieldDialogProps {
  32. field: LayoutSectionField | null;
  33. open: boolean;
  34. onOpenChange: (open: boolean) => void;
  35. onSuccess: () => void;
  36. }
  37. export function EditFieldDialog({
  38. field,
  39. open,
  40. onOpenChange,
  41. onSuccess,
  42. }: EditFieldDialogProps) {
  43. const [loading, setLoading] = useState(false);
  44. const [formData, setFormData] = useState({
  45. name: "",
  46. dataType: "STRING",
  47. dataTypeFormat: "",
  48. cellPosition: "",
  49. importTableColumnName: "",
  50. importColumnOrderNumber: 0,
  51. });
  52. useEffect(() => {
  53. if (field) {
  54. setFormData({
  55. name: field.name,
  56. dataType: field.dataType,
  57. dataTypeFormat: field.dataTypeFormat || "",
  58. cellPosition: field.cellPosition,
  59. importTableColumnName: field.importTableColumnName,
  60. importColumnOrderNumber: field.importColumnOrderNumber,
  61. });
  62. }
  63. }, [field]);
  64. const handleSubmit = async (e: React.FormEvent) => {
  65. e.preventDefault();
  66. if (!field) return;
  67. setLoading(true);
  68. try {
  69. const result = await updateLayoutSectionField(field.id, {
  70. name: formData.name,
  71. dataType: formData.dataType,
  72. dataTypeFormat: formData.dataTypeFormat || undefined,
  73. cellPosition: formData.cellPosition,
  74. importTableColumnName: formData.importTableColumnName,
  75. importColumnOrderNumber: parseInt(formData.importColumnOrderNumber.toString()),
  76. });
  77. if (result.success) {
  78. onSuccess();
  79. setFormData({
  80. name: "",
  81. dataType: "STRING",
  82. dataTypeFormat: "",
  83. cellPosition: "",
  84. importTableColumnName: "",
  85. importColumnOrderNumber: 0,
  86. });
  87. }
  88. } catch (error) {
  89. console.error("Error updating field:", error);
  90. } finally {
  91. setLoading(false);
  92. }
  93. };
  94. if (!field) return null;
  95. return (
  96. <Dialog open={open} onOpenChange={onOpenChange}>
  97. <DialogContent className="sm:max-w-[425px]">
  98. <DialogHeader>
  99. <DialogTitle>Edit Field</DialogTitle>
  100. <DialogDescription>
  101. Update the details for this field.
  102. </DialogDescription>
  103. </DialogHeader>
  104. <form onSubmit={handleSubmit}>
  105. <div className="grid gap-4 py-4">
  106. <div className="grid gap-2">
  107. <Label htmlFor="edit-name">Field Name</Label>
  108. <Input
  109. id="edit-name"
  110. value={formData.name}
  111. onChange={(e) => setFormData({ ...formData, name: e.target.value })}
  112. required
  113. />
  114. </div>
  115. <div className="grid gap-2">
  116. <Label htmlFor="edit-dataType">Data Type</Label>
  117. <Select
  118. value={formData.dataType}
  119. onValueChange={(value) => setFormData({ ...formData, dataType: value })}
  120. >
  121. <SelectTrigger>
  122. <SelectValue />
  123. </SelectTrigger>
  124. <SelectContent>
  125. <SelectItem value="STRING">String</SelectItem>
  126. <SelectItem value="NUMBER">Number</SelectItem>
  127. <SelectItem value="DATE">Date</SelectItem>
  128. <SelectItem value="BOOLEAN">Boolean</SelectItem>
  129. <SelectItem value="EMAIL">Email</SelectItem>
  130. </SelectContent>
  131. </Select>
  132. </div>
  133. <div className="grid gap-2">
  134. <Label htmlFor="edit-dataTypeFormat">Data Type Format</Label>
  135. <Input
  136. id="edit-dataTypeFormat"
  137. value={formData.dataTypeFormat}
  138. onChange={(e) => setFormData({ ...formData, dataTypeFormat: e.target.value })}
  139. placeholder="e.g., YYYY-MM-DD"
  140. />
  141. </div>
  142. <div className="grid gap-2">
  143. <Label htmlFor="edit-cellPosition">Cell Position</Label>
  144. <Input
  145. id="edit-cellPosition"
  146. value={formData.cellPosition}
  147. onChange={(e) => setFormData({ ...formData, cellPosition: e.target.value })}
  148. required
  149. placeholder="e.g., A1"
  150. />
  151. </div>
  152. <div className="grid gap-2">
  153. <Label htmlFor="edit-importTableColumnName">Import Column Name</Label>
  154. <Input
  155. id="edit-importTableColumnName"
  156. value={formData.importTableColumnName}
  157. onChange={(e) => setFormData({ ...formData, importTableColumnName: e.target.value })}
  158. required
  159. />
  160. </div>
  161. <div className="grid gap-2">
  162. <Label htmlFor="edit-importColumnOrderNumber">Column Order</Label>
  163. <Input
  164. id="edit-importColumnOrderNumber"
  165. type="number"
  166. value={formData.importColumnOrderNumber}
  167. onChange={(e) => setFormData({ ...formData, importColumnOrderNumber: parseInt(e.target.value) || 0 })}
  168. required
  169. min={0}
  170. />
  171. </div>
  172. </div>
  173. <DialogFooter>
  174. <Button type="button" variant="outline" onClick={() => onOpenChange(false)}>
  175. Cancel
  176. </Button>
  177. <Button type="submit" disabled={loading}>
  178. {loading ? "Updating..." : "Update Field"}
  179. </Button>
  180. </DialogFooter>
  181. </form>
  182. </DialogContent>
  183. </Dialog>
  184. );
  185. }