import {useMutation, useQuery} from "@apollo/client"; import {AddIcon} from "@chakra-ui/icons"; import {Stack} from "@chakra-ui/layout"; import { Badge, Button, Checkbox, HStack, IconButton, Image, Select, Table, Tag, Tbody, Td, Text, Th, Thead, Tr, useToast } from "@chakra-ui/react"; import {capitalCase, snakeCase} from "change-case"; import React, {useEffect, useState} from "react"; import {deleteIcon, editIcon} from '../../images'; import {Col, TableType} from "../intefaces/interfaces"; import {deleteRecordByPrimaryKey, getSearchQuery} from "../utils/GenericQueries"; import ConfirmDialog from "./ConfirmDialog"; import CustomEditModal from "./CustomEditModal"; import {getSinglePrimaryKey} from "./CustomeTableUtils"; import FilterInput from "./FilterInput"; import MultipleDisplay from "./MultipleDisplay"; import ForeignKeyDisplay from "./ForeignKeyDisplay"; function DelightTable(props: TableType) { const toast = useToast() const { primaryColor, secondaryColor, isModal, title, tablename, colorRow, bgRow, fontFamily, fontSizeRow, fontSizeHeader, fontWeightRow = "400", showAllBorders = false, showRoundedTitle = true, showControls = true, showSearch = false, showPagination = false, showBackground = true, selectableRows = false, col, panels, addEditDisplayType, recordsDisplayType, searchByCol, } = props; const searchQuery = getSearchQuery(tablename, col) const {loading, error, data, refetch} = useQuery(searchQuery); const [displayRecords, setDisplayRecords] = useState([]); const [formdata, setFormData] = useState(null) //delete const [itemToBeDeleted, setItemToBeDeleted] = useState(null) const [isDialogOpen, setDialogOpen] = useState(false); //delete row const [deleteRow] = useMutation(deleteRecordByPrimaryKey(tablename, col)) //modal const [isAddEdit, setIsAddEdit] = useState(false); const [isUpdate, setIsUpdate] = useState(false); const [selectedRows, setSelectedRows]: any[] = useState([]); useEffect(() => { if (data) { setDisplayRecords(data[tablename]) } }, [data]) function handleActionSelected(e: any) { const {value} = e.target if (value === 'delete') { deleteMultipleItems(selectedRows) } } function getDisplayStyle(mycol: Col, columnValue: string) { if (mycol.displayProperties) { let conditionalStyle = mycol.displayProperties.conditions.find(c => c.value == columnValue); if (conditionalStyle) { return conditionalStyle.styles; } //default chips style // return mycol.displayProperties.styles } } function displayType(mycol: Col) { return mycol?.displayProperties?.displayType ?? "default" } const addRecord = () => { let item: any = {} for (let i = 0; i < col.length; i++) { item[snakeCase(col[i].name)] = '' } setFormData(item) setIsUpdate(false) setIsAddEdit(true) } const editRecord = (item: any) => { setFormData(item) setIsUpdate(true) setIsAddEdit(true) } const deleteRecord = (item: any) => { setItemToBeDeleted(item); setDialogOpen(true); } async function deleteMultipleItems(items: any) { toast({ description: `Deleting ${selectedRows.length} rows...`, status: "info", duration: 5000, position: "bottom", isClosable: false }) for (let i = 0; i < items.length; i++) { let item: any = items[i]; let primaryKey = getSinglePrimaryKey(col) let deleteObj = { [primaryKey]: item[primaryKey] } await deleteRow({ variables: deleteObj }).then(r => { refetch() console.log("Deleted ", item) }).catch(e => { console.log("error ", e) }) } setSelectedRows([]); } function deleteCallBack(shouldItemBeDeleted: any) { setDialogOpen(false); if (itemToBeDeleted == null) return; if (shouldItemBeDeleted) { let primaryKey = getSinglePrimaryKey(col) let deleteObj = { [primaryKey]: itemToBeDeleted[primaryKey] } deleteRow({ variables: deleteObj }).then(r => { refetch() }).catch(e => { console.log("error ", e) toast({ title: "Error", description: e.message, status: "error", duration: 9000, isClosable: true }) }) } } if (loading) { return
Loading...
} if (error) { console.log("error ", error) return
{error.message}
} if (data) return ( <> {!isAddEdit ? {title && {title} } {showSearch && { setDisplayRecords(filteredRecords); }} /> } {showControls && } {selectedRows.length > 0 && } {selectableRows && } {col.map((item: any) => { return })} {displayRecords.map((item: any) => ( {selectableRows && } {col.map((mycol: Col) => { return displayType(mycol) === "chip" ? : displayType(mycol) === "badge" ? : mycol.hasManyRelationship ? : })} ))}
Select {capitalCase(item.name)} Actions
{ if (e.target.checked) { let mRows = [selectedRows] mRows.push(item) setSelectedRows(mRows); } else { setSelectedRows(selectedRows.filter((e: any) => e.id !== item.id)) } }} /> {item[snakeCase(mycol.name)]} {item[snakeCase(mycol.name)]} { mycol.type === "image" ? alt : mycol.isForeignKey ? : item[snakeCase(mycol.name)]?.toString() } deleteRecord(item)} bg="transparent" children={}/> editRecord(item)} bg="transparent" children={}/>
: setIsAddEdit(false)} refetch={() => { setIsAddEdit(false) refetch() }} /> } ) return
No Data
} export default DelightTable;