'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 (