LayoutSectionCard.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. "use client";
  2. import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
  3. import { Badge } from "@/components/ui/badge";
  4. import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
  5. interface LayoutSection {
  6. id: number;
  7. name: string;
  8. type: string;
  9. sheetName: string;
  10. startingRow?: number | null;
  11. endingRow?: number | null;
  12. tableName: string;
  13. fields: LayoutSectionField[];
  14. }
  15. interface LayoutSectionField {
  16. id: number;
  17. name: string;
  18. dataType: string;
  19. dataTypeFormat: string | null;
  20. cellPosition: string;
  21. importTableColumnName: string;
  22. importColumnOrderNumber: number;
  23. }
  24. interface LayoutSectionCardProps {
  25. section: LayoutSection;
  26. }
  27. export function LayoutSectionCard({ section }: LayoutSectionCardProps) {
  28. const getTypeColor = (type: string) => {
  29. switch (type.toLowerCase()) {
  30. case "properties":
  31. return "bg-blue-100 text-blue-800";
  32. case "grid":
  33. return "bg-green-100 text-green-800";
  34. default:
  35. return "bg-gray-100 text-gray-800";
  36. }
  37. };
  38. return (
  39. <Card>
  40. <CardHeader>
  41. <div className="flex justify-between items-start">
  42. <div>
  43. <CardTitle className="text-lg">{section.name}</CardTitle>
  44. <CardDescription>
  45. Sheet: {section.sheetName} | Table: {section.tableName}
  46. </CardDescription>
  47. </div>
  48. <Badge className={getTypeColor(section.type)}>
  49. {section.type}
  50. </Badge>
  51. </div>
  52. </CardHeader>
  53. <CardContent>
  54. <div className="space-y-4">
  55. <div className="flex gap-4 text-sm">
  56. {section.startingRow && (
  57. <span>
  58. <strong>Rows:</strong> {section.startingRow} - {section.endingRow || "end"}
  59. </span>
  60. )}
  61. <span>
  62. <strong>Fields:</strong> {section.fields.length}
  63. </span>
  64. </div>
  65. {section.fields.length > 0 && (
  66. <div>
  67. <h4 className="font-medium mb-2">Fields</h4>
  68. <div className="overflow-x-auto">
  69. <Table>
  70. <TableHeader>
  71. <TableRow>
  72. <TableHead>Name</TableHead>
  73. <TableHead>Type</TableHead>
  74. <TableHead>Position</TableHead>
  75. <TableHead>Column</TableHead>
  76. <TableHead>Order</TableHead>
  77. </TableRow>
  78. </TableHeader>
  79. <TableBody>
  80. {section.fields.map((field) => (
  81. <TableRow key={field.id}>
  82. <TableCell className="font-medium">{field.name}</TableCell>
  83. <TableCell>
  84. <Badge variant="outline" className="text-xs">
  85. {field.dataType}
  86. </Badge>
  87. </TableCell>
  88. <TableCell>{field.cellPosition}</TableCell>
  89. <TableCell>{field.importTableColumnName}</TableCell>
  90. <TableCell>{field.importColumnOrderNumber}</TableCell>
  91. </TableRow>
  92. ))}
  93. </TableBody>
  94. </Table>
  95. </div>
  96. </div>
  97. )}
  98. </div>
  99. </CardContent>
  100. </Card>
  101. );
  102. }