'use client'; import { Button } from 'primereact/button'; import { Column } from 'primereact/column'; import { DataTable } from 'primereact/datatable'; import { Dialog } from 'primereact/dialog'; import { FileUpload } from 'primereact/fileupload'; import { InputNumber } from 'primereact/inputnumber'; import { InputText } from 'primereact/inputtext'; import { InputTextarea } from 'primereact/inputtextarea'; import { RadioButton } from 'primereact/radiobutton'; import { Rating } from 'primereact/rating'; import { Toast } from 'primereact/toast'; import { Toolbar } from 'primereact/toolbar'; import { classNames } from 'primereact/utils'; import React, { useEffect, useRef, useState } from 'react'; import { ProductService } from '../../../../demo/service/ProductService'; import type { Demo } from '@/types'; const Crud = () => { let emptyProduct: Demo.Product = { id: null, name: '', image: null, description: '', category: null, price: 0, quantity: 0, rating: 0, inventoryStatus: 'INSTOCK' }; const [products, setProducts] = useState(null); const [productDialog, setProductDialog] = useState(false); const [deleteProductDialog, setDeleteProductDialog] = useState(false); const [deleteProductsDialog, setDeleteProductsDialog] = useState(false); const [product, setProduct] = useState(emptyProduct); const [selectedProducts, setSelectedProducts] = useState(null); const [submitted, setSubmitted] = useState(false); const [globalFilter, setGlobalFilter] = useState(null); const toast = useRef(null); const dt = useRef(null); useEffect(() => { ProductService.getProducts().then((data) => setProducts(data)); }, []); const formatCurrency = (value) => { return value.toLocaleString('en-US', { style: 'currency', currency: 'USD' }); }; const openNew = () => { setProduct(emptyProduct); setSubmitted(false); setProductDialog(true); }; const hideDialog = () => { setSubmitted(false); setProductDialog(false); }; const hideDeleteProductDialog = () => { setDeleteProductDialog(false); }; const hideDeleteProductsDialog = () => { setDeleteProductsDialog(false); }; const saveProduct = () => { setSubmitted(true); if (product.name.trim()) { let _products = [...products]; let _product = { ...product }; if (product.id) { const index = findIndexById(product.id); _products[index] = _product; toast.current.show({ severity: 'success', summary: 'Successful', detail: 'Product Updated', life: 3000 }); } else { _product.id = createId(); _product.code = createId(); _product.image = 'product-placeholder.svg'; _products.push(_product); toast.current.show({ severity: 'success', summary: 'Successful', detail: 'Product Created', life: 3000 }); } setProducts(_products); setProductDialog(false); setProduct(emptyProduct); } }; const editProduct = (product) => { setProduct({ ...product }); setProductDialog(true); }; const confirmDeleteProduct = (product) => { setProduct(product); setDeleteProductDialog(true); }; const deleteProduct = () => { let _products = products.filter((val) => val.id !== product.id); setProducts(_products); setDeleteProductDialog(false); setProduct(emptyProduct); toast.current.show({ severity: 'success', summary: 'Successful', detail: 'Product Deleted', life: 3000 }); }; const findIndexById = (id) => { let index = -1; for (let i = 0; i < products.length; i++) { if (products[i].id === id) { index = i; break; } } return index; }; const createId = () => { let id = ''; let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for (let i = 0; i < 5; i++) { id += chars.charAt(Math.floor(Math.random() * chars.length)); } return id; }; const exportCSV = () => { dt.current.exportCSV(); }; const confirmDeleteSelected = () => { setDeleteProductsDialog(true); }; const deleteSelectedProducts = () => { let _products = products.filter((val) => !selectedProducts.includes(val)); setProducts(_products); setDeleteProductsDialog(false); setSelectedProducts(null); toast.current.show({ severity: 'success', summary: 'Successful', detail: 'Products Deleted', life: 3000 }); }; const onCategoryChange = (e) => { let _product = { ...product }; _product['category'] = e.value; setProduct(_product); }; const onInputChange = (e, name) => { const val = (e.target && e.target.value) || ''; let _product = { ...product }; _product[`${name}`] = val; setProduct(_product); }; const onInputNumberChange = (e, name) => { const val = e.value || 0; let _product = { ...product }; _product[`${name}`] = val; setProduct(_product); }; const leftToolbarTemplate = () => { return ( ); }; const rightToolbarTemplate = () => { return ( ); }; const codeBodyTemplate = (rowData) => { return ( <> Code {rowData.code} > ); }; const nameBodyTemplate = (rowData) => { return ( <> Name {rowData.name} > ); }; const imageBodyTemplate = (rowData) => { return ( <> Image > ); }; const priceBodyTemplate = (rowData) => { return ( <> Price {formatCurrency(rowData.price)} > ); }; const categoryBodyTemplate = (rowData) => { return ( <> Category {rowData.category} > ); }; const ratingBodyTemplate = (rowData) => { return ( <> Reviews > ); }; const statusBodyTemplate = (rowData) => { return ( <> Status {rowData.inventoryStatus} > ); }; const actionBodyTemplate = (rowData) => { return ( <> editProduct(rowData)} /> confirmDeleteProduct(rowData)} /> > ); }; const header = ( Manage Products setGlobalFilter((e.target as HTMLInputElement).value)} placeholder="Search..." /> ); const productDialogFooter = ( <> > ); const deleteProductDialogFooter = ( <> > ); const deleteProductsDialogFooter = ( <> > ); return ( setSelectedProducts(e.value)} paginator rows={10} rowsPerPageOptions={[5, 10, 25]} className="datatable-responsive" paginatorTemplate="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown" currentPageReportTemplate="Showing {first} to {last} of {totalRecords} products" globalFilter={globalFilter} emptyMessage="No products found." header={header} responsiveLayout="scroll" > {product.image && } Name onInputChange(e, 'name')} required autoFocus className={classNames({ 'p-invalid': submitted && !product.name })} /> {submitted && !product.name && Name is required.} Description onInputChange(e, 'description')} required rows={3} cols={20} /> Category Accessories Clothing Electronics Fitness Price onInputNumberChange(e, 'price')} mode="currency" currency="USD" locale="en-US" /> Quantity onInputNumberChange(e, 'quantity')} /> {product && ( Are you sure you want to delete {product.name}? )} {product && Are you sure you want to delete the selected products?} ); }; export default Crud;