import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/src/components/ui/card";
import { cn } from "@/src/utils/tailwind";
import { useDraggable, useDroppable } from "@dnd-kit/core";
import { X } from "lucide-react";
import {
type CsvColumnPreview,
type FieldMapping,
} from "@/src/features/datasets/lib/csv/types";
import { isSchemaField } from "@/src/features/datasets/lib/csv/helpers";
function SchemaKeyDropZone({
schemaKey,
mappedColumns,
parentId,
onRemove,
}: {
schemaKey: string;
mappedColumns: CsvColumnPreview[];
parentId: string;
onRemove: (columnName: string) => void;
}) {
const dropId = `${parentId}:${schemaKey}`;
const { setNodeRef, isOver } = useDroppable({ id: dropId });
return (
0 &&
"border-solid border-accent-dark-blue bg-light-blue/40",
)}
>
{mappedColumns.length === 0 ? (
) : (
{schemaKey}
{mappedColumns.map((column) => (
))}
)}
);
}
function FreeformDropZone({
id,
columns,
onRemove,
}: {
id: string;
columns: CsvColumnPreview[];
onRemove: (columnName: string) => void;
}) {
const { setNodeRef, isOver } = useDroppable({ id });
return (
0 &&
"border-solid border-accent-dark-blue bg-light-blue/40",
)}
>
{columns.length > 0 && (
{columns.map((column) => (
))}
)}
);
}
function MappedColumnBadge({
column,
onRemove,
}: {
column: CsvColumnPreview;
onRemove: (columnName: string) => void;
}) {
const { attributes, listeners, setNodeRef, isDragging } = useDraggable({
id: `mapped-${column.name}`,
data: {
column,
fromCardId: "mapped",
},
});
return (
{column.name}
);
}
type MappingCardProps = {
input: FieldMapping;
expectedOutput: FieldMapping;
metadata: CsvColumnPreview[];
onRemoveInputColumn: (columnName: string, key?: string) => void;
onRemoveExpectedColumn: (columnName: string, key?: string) => void;
onRemoveMetadataColumn: (columnName: string) => void;
};
export function MappingCard({
input,
expectedOutput,
metadata,
onRemoveInputColumn,
onRemoveExpectedColumn,
onRemoveMetadataColumn,
}: MappingCardProps) {
return (
Map to Dataset Items
{/* INPUT SECTION */}
Input
{isSchemaField(input) ? (
{input.entries.map((entry) => (
onRemoveInputColumn(columnName, entry.key)
}
/>
))}
) : (
)}
{/* OUTPUT SECTION */}
Expected Output
{expectedOutput.type === "schema" ? (
{expectedOutput.entries.map((entry) => (
onRemoveExpectedColumn(columnName, entry.key)
}
/>
))}
) : (
)}
{/* METADATA SECTION */}
Metadata
);
}