From cd072c875c334b1140e4f797a37a9e991d53e2b5 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Wed, 26 Feb 2025 16:29:27 +0700 Subject: CR repear order --- src/lib/transaction/components/Transactions.jsx | 294 +++++++++++++++++++++--- 1 file changed, 265 insertions(+), 29 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 92bdd276..a8685105 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -4,9 +4,10 @@ import { toast } from 'react-hot-toast'; import { EllipsisVerticalIcon, MagnifyingGlassIcon, + ChevronDownIcon, + ChevronUpIcon, } from '@heroicons/react/24/outline'; import useAuth from '@/core/hooks/useAuth'; - import { downloadPurchaseOrder, downloadQuotation, @@ -28,32 +29,31 @@ import Menu from '@/lib/auth/components/Menu'; import * as XLSX from 'xlsx'; import getSite from '../api/listSiteApi'; import transactionsApi from '../api/transactionsApi'; - +import { motion } from 'framer-motion'; +import Image from '@/core/components/elements/Image/Image'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); - const { q = '', page = 1, site = null } = router.query; - - const limit = 15; + const { q = '', page = 1, site = null, limit = 15 } = router.query; const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); const [listSites, setListSites] = useState([]); - + const [isOpen, setIsOpen] = useState(false); const [siteFilter, setSiteFilter] = useState(site); - + const [pageNew, setPageNew] = useState(page); + const [limitNew, setLimitNew] = useState(limit); const query = { name: q, - offset: (page - 1) * limit, + offset: (pageNew - 1) * limitNew, context, - limit, + limit: limitNew, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; - const { transactions } = useTransactions({ query }); - + console.log('transactions', transactions); const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); @@ -70,7 +70,7 @@ const Transactions = ({ context = '' }) => { setToCancel(null); }; - const pageCount = Math.ceil(transactions?.data?.saleOrderTotal / limit); + const pageCount = Math.ceil(transactions?.data?.saleOrderTotal / limitNew); let pageQuery = _.omit(query, ['limit', 'offset', 'context']); pageQuery = _.pickBy( pageQuery, @@ -137,6 +137,58 @@ const Transactions = ({ context = '' }) => { XLSX.writeFile(workbook, 'transactions.xlsx'); }; + const handleExportCSV = async () => { + const dataToExport = await getAllData(); + + exportToCSV(dataToExport?.saleOrders, siteFilter); + }; + + const exportToCSV = (data, siteFilter) => { + const fieldsToExport = [ + 'No. Transaksi', + 'No. PO', + 'Tanggal', + 'Created By', + 'Salesperson', + 'Total', + 'Status', + ]; + + if (siteFilter) { + fieldsToExport.push('Site'); + } + + const rowsToExport = data.map((saleOrder) => { + const row = [ + saleOrder.name, + saleOrder.purchaseOrderName || '-', + saleOrder.dateOrder || '-', + saleOrder.address.customer?.name || '-', + saleOrder.sales, + currencyFormat(saleOrder.amountTotal), + saleOrder.status, + ]; + + if (siteFilter) { + row.push(siteFilter); + } + + return row.join(','); + }); + + const csvContent = + 'data:text/csv;charset=utf-8,' + + [fieldsToExport.join(','), ...rowsToExport].join('\n'); + + const encodedUri = encodeURI(csvContent); + const link = document.createElement('a'); + link.setAttribute('href', encodedUri); + link.setAttribute('download', 'transactions.csv'); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + const getAllData = async () => { const query = { name: q, @@ -144,7 +196,7 @@ const Transactions = ({ context = '' }) => { site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; - const queryString = toQuery(query) + const queryString = toQuery(query); const data = await transactionsApi({ query: queryString }); return data; }; @@ -155,6 +207,25 @@ const Transactions = ({ context = '' }) => { exportToExcel(dataToExport?.saleOrders, siteFilter); }; + const handleDownload = (format) => { + handleExport(format); + setIsOpen(false); + }; + + const handleExport = (format) => { + if (format === 'csv') { + handleExportCSV(); + } else if (format === 'xlsx') { + handleExportExcel(); + } + }; + + const startItem = 1 + (pageNew - 1) * limitNew; + const endItem = Math.min( + limitNew * pageNew, + transactions?.data?.saleOrderTotal + ); + useEffect(() => { fetchSite(); }, []); @@ -328,14 +399,54 @@ const Transactions = ({ context = '' }) => {
-
+

Daftar Transaksi{' '} {transactions?.data?.saleOrders - ? `(${transactions?.data?.saleOrders.length})` + ? `(${transactions?.data?.saleOrderTotal})` : ''}

-
+
+ + + {isOpen && ( + + + + + )} +
+
+
+
{listSites?.length > 0 ? ( - ) : (
)} + ) : ( +
+ )}
{
+
+

+ Menampilkan {startItem}- + {endItem ? endItem : transactions?.data?.saleOrderTotal} dari{' '} + {transactions?.data?.saleOrderTotal} +

+ +
+
+
+ {!transactions.isLoading && + (!transactions?.data?.saleOrders || + transactions?.data?.saleOrders?.length == 0) && ( +
+

+ Tidak Ada Transaksi +

+
+ )} + + {transactions && transactions.data?.saleOrders?.length > 0 && ( +
+ {transactions.data.saleOrders.map((saleOrder, index) => ( +
+ {/* */} +
+
+ +

{saleOrder.name}

+

+ Salesperson:{' '} + { + + {saleOrder.sales} + + } +

+
+
+ Tanggal Pesanan:{' '} + + {saleOrder.dateOrder.split(' ')[0] || '-'} + +
+
+
+
+
+
+
+ {saleOrder.products[0]?.name} +
+
+

+ Nomor PO: + + {saleOrder.purchaseOrderName || '-'} + +

+

+ {saleOrder.products[0]?.parent?.name} +

+

+ {saleOrder.products[0]?.quantity} x{' '} + {currencyFormat( + saleOrder.products[0]?.price?.priceDiscount + )} +

+
+ {saleOrder.products?.length > 1 && ( +
+ {saleOrder.products + .slice(1) + .map((product, index) => ( + {product?.name} + ))} + + Lihat semua produk + +
+ )} +
+
+
+
+ + pesanan dibuat oleh: + +

+ {saleOrder.address.customer?.name || '-'} +

+
+
+
+
Total harga
+
+ {/* */} +
+ ))} +
+ )}
- @@ -382,9 +619,7 @@ const Transactions = ({ context = '' }) => { - {auth?.feature?.soApproval && ( - - )} + {auth?.feature?.soApproval && } @@ -439,8 +674,9 @@ const Transactions = ({ context = '' }) => { -- cgit v1.2.3 From faf6403595602d78b502acfacc721923addbf4a8 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Mon, 3 Mar 2025 16:38:10 +0700 Subject: update code --- src/lib/transaction/components/Transactions.jsx | 487 ++++++++++++++++-------- 1 file changed, 337 insertions(+), 150 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index a8685105..64ae9393 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -31,11 +31,30 @@ import getSite from '../api/listSiteApi'; import transactionsApi from '../api/transactionsApi'; import { motion } from 'framer-motion'; import Image from '@/core/components/elements/Image/Image'; +import { upsertUserCart } from '~/services/cart'; +import { useProductCartContext } from '@/contexts/ProductCartContext'; +import { Swiper, SwiperSlide } from 'swiper/react'; +import 'swiper/css'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); - const { q = '', page = 1, site = null, limit = 15 } = router.query; - + const { + q = '', + page = 1, + site = null, + limit = 15, + status = 'all', + } = router.query; + const { + productCart, + setRefreshCart, + setProductCart, + refreshCart, + isLoading, + setIsloading, + } = useProductCartContext(); + console.log('context', context); + console.log('router.query', router.query); const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); @@ -44,16 +63,32 @@ const Transactions = ({ context = '' }) => { const [siteFilter, setSiteFilter] = useState(site); const [pageNew, setPageNew] = useState(page); const [limitNew, setLimitNew] = useState(limit); + // const [status, setStatus] = useState('idle'); + const [statusNew, setStatusNew] = useState(status); + const [contextNew, setcontextNew] = useState(router.query.context || context); const query = { name: q, offset: (pageNew - 1) * limitNew, - context, + context: contextNew, limit: limitNew, + status: statusNew, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; + + const statuses = [ + { id: 'all', label: 'Semua' }, + { id: 'quotation', label: 'Pending Quotation' }, + { id: 'diterima', label: 'Pesanan Diterima' }, + { id: 'diproses', label: 'Pesanan Diproses' }, + { id: 'dikirim', label: 'Pesanan Dikirim' }, + { id: 'selesai', label: 'Pesanan Selesai' }, + { id: 'cancel', label: 'Pesanan Dibatalkan' }, + ]; + + console.log('query', query); const { transactions } = useTransactions({ query }); - console.log('transactions', transactions); + // console.log('transactions', transactions); const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); @@ -229,6 +264,67 @@ const Transactions = ({ context = '' }) => { useEffect(() => { fetchSite(); }, []); + + const handleBuyBack = async (products) => { + // if (status === 'success') return; + + try { + // setStatus('loading'); + + const results = await Promise.all( + products.map((product) => + upsertUserCart({ + userId: auth.id, + type: 'product', + id: product.id, + qty: product.quantity, + selected: true, + source: 'buy', // Tetap gunakan 'buy' agar bisa masuk ke halaman pembelian + qtyAppend: false, + }) + ) + ); + + // console.log(`Produk berhasil dimasukkan ke dalam cart`, results); + + // ✅ Panggil setRefreshCart(true) setiap kali satu produk berhasil ditambahkan + + setRefreshCart(true); + + // setStatus('idle'); + toast.success('Semua produk berhasil ditambahkan ke keranjang belanja'); + // Tampilkan notifikasi + // toast({ + // title: 'Tambah ke keranjang', + // description: 'Semua produk berhasil ditambahkan ke keranjang belanja', + // status: 'success', + // duration: 3000, + // isClosable: true, + // position: 'top', + // }); + + // Redirect ke halaman checkout + router.push('/shop/checkout?source=buy'); + } catch (error) { + console.error('Gagal menambahkan produk ke keranjang:', error); + // setStatus('error'); + } + }; + + const handleStatusChange = (status) => { + setStatusNew(status); + + if (['quotation', 'cancel', 'diterima', ''].includes(status)) { + setcontextNew('quotation'); + } else { + setcontextNew(''); + } + + if (status === 'all') { + router.push('/my/transactions'); + } + }; + return ( <> @@ -445,66 +541,126 @@ const Transactions = ({ context = '' }) => { )} -
-
- {listSites?.length > 0 ? ( - - ) : ( -
- )} + +
+
+
+
+ {listSites?.length > 0 ? ( + + ) : ( +
+ )} -
- setInputQuery(e.target.value)} - /> - + +
+
+

+ Menampilkan {startItem}- + {endItem + ? endItem + : transactions?.data?.saleOrderTotal + ? transactions?.data?.saleOrderTotal + : limitNew}{' '} + dari{' '} + {transactions?.data?.saleOrderTotal + ? transactions?.data?.saleOrderTotal + : limitNew} +

+ { - setLimitNew(Number(e.target.value)); - setPageNew(1); - }} - className='border p-2' - > - - - - + + + + +
-
+
{!transactions.isLoading && - (!transactions?.data?.saleOrders || - transactions?.data?.saleOrders?.length == 0) && ( + transactions?.data?.saleOrders?.length == 0 && (

Tidak Ada Transaksi @@ -512,107 +668,138 @@ const Transactions = ({ context = '' }) => {

)} - {transactions && transactions.data?.saleOrders?.length > 0 && ( -
- {transactions.data.saleOrders.map((saleOrder, index) => ( -
- {/* */} -
-
- -

{saleOrder.name}

-

- Salesperson:{' '} - { + {transactions.isLoading && ( +

+ +
+ )} + + {!transactions.isLoading && + transactions && + transactions.data?.saleOrders?.length > 0 && ( +
+ {transactions.data.saleOrders.map((saleOrder, index) => ( +
+ +
+
+ +

{saleOrder.name}

+

+ Salesperson:{' '} + { + + {saleOrder.sales} + + } +

+
+
+ Tanggal Pesanan:{' '} - {saleOrder.sales} + {saleOrder.dateOrder.split(' ')[0] || '-'} - } -

-
-
- Tanggal Pesanan:{' '} - - {saleOrder.dateOrder.split(' ')[0] || '-'} - -
-
-
-
-
-
-
-
-
-

- Nomor PO: - - {saleOrder.purchaseOrderName || '-'} - -

-

- {saleOrder.products[0]?.parent?.name} -

-

- {saleOrder.products[0]?.quantity} x{' '} - {currencyFormat( - saleOrder.products[0]?.price?.priceDiscount - )} -

-
- {saleOrder.products?.length > 1 && ( -
- {saleOrder.products - .slice(1) - .map((product, index) => ( - - ))} - - Lihat semua produk - +
+
+
+
+
+
+ +
+
+

+ + Nomor PO: + + + {saleOrder.purchaseOrderName || '-'} + +

+

+ {saleOrder.products[0]?.parent?.name} +

+

+ {saleOrder.products[0]?.quantity} x{' '} + {currencyFormat( + saleOrder.products[0]?.price + ?.priceDiscount + )} +

+
+ {saleOrder.products?.length > 1 && ( +
+ {saleOrder.products + .slice(1, 6) + .map((product, index) => ( + + ))} + + Lihat semua produk + +
+ )}
- )} +
+
+
+ + Pesanan dibuat oleh: + +

+ {saleOrder.address.customer?.name || '-'} +

+
+
+
+
+
+

Total Harga

+

+ {currencyFormat(saleOrder.amountTotal)} +

+
+
+
-
- - pesanan dibuat oleh: - -

- {saleOrder.address.customer?.name || '-'} -

-
-
-
-
Total harga
+
- {/* */} -
- ))} -
- )} + ))} +
+ )}
-
No. PO Tanggal Created BySiteSiteSalesperson Total Status
+ {/*
@@ -670,7 +857,7 @@ const Transactions = ({ context = '' }) => { ))} -
No. Transaksi
+ */} Date: Tue, 4 Mar 2025 13:37:16 +0700 Subject: add mobile --- src/lib/transaction/components/Transactions.jsx | 213 ++++++++++++++++++++---- 1 file changed, 177 insertions(+), 36 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 64ae9393..2ef50dcb 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -53,8 +53,6 @@ const Transactions = ({ context = '' }) => { isLoading, setIsloading, } = useProductCartContext(); - console.log('context', context); - console.log('router.query', router.query); const [inputQuery, setInputQuery] = useState(q); const [toOthers, setToOthers] = useState(null); const [toCancel, setToCancel] = useState(null); @@ -86,9 +84,7 @@ const Transactions = ({ context = '' }) => { { id: 'cancel', label: 'Pesanan Dibatalkan' }, ]; - console.log('query', query); const { transactions } = useTransactions({ query }); - // console.log('transactions', transactions); const fetchSite = async () => { const site = await getSite(); setListSites(site.sites); @@ -285,8 +281,6 @@ const Transactions = ({ context = '' }) => { ) ); - // console.log(`Produk berhasil dimasukkan ke dalam cart`, results); - // ✅ Panggil setRefreshCart(true) setiap kali satu produk berhasil ditambahkan setRefreshCart(true); @@ -322,6 +316,8 @@ const Transactions = ({ context = '' }) => { if (status === 'all') { router.push('/my/transactions'); + } else { + setPageNew(1); } }; @@ -329,18 +325,85 @@ const Transactions = ({ context = '' }) => { <>
-
- setInputQuery(e.target.value)} - /> - -
+
+ + + +
+
+
+ + setInputQuery(e.target.value)} + /> +
+
+

+ Menampilkan {startItem}- + {endItem + ? endItem + : transactions?.data?.saleOrderTotal + ? transactions?.data?.saleOrderTotal + : limitNew * pageNew}{' '} + dari{' '} + {transactions?.data?.saleOrderTotal + ? transactions?.data?.saleOrderTotal + : limitNew * pageNew} +

+ +
+
{transactions.isLoading && (
@@ -357,15 +420,15 @@ const Transactions = ({ context = '' }) => { {transactions.data?.saleOrders?.map((saleOrder, index) => (
-
+
- - No. Transaksi +

{saleOrder.name}

+ + {saleOrder.dateOrder.split(' ')[0] || '-'} -

{saleOrder.name}

@@ -375,8 +438,85 @@ const Transactions = ({ context = '' }) => { />
- -
+
+ +
+
+ {saleOrder.products[0]?.name} +
+
+

+ Nomor PO: + + {saleOrder.purchaseOrderName || '-'} + +

+

+ {saleOrder.products[0]?.parent?.name} +

+

+ {saleOrder.products[0]?.quantity} x{' '} + {currencyFormat( + saleOrder.products[0]?.price?.priceDiscount + )} +

+
+ {saleOrder.products?.length > 1 && ( +
+ {saleOrder.products + .slice(1, 6) + .map((product, index) => ( + {product?.name} + ))} + + Lihat semua produk + +
+ )} +
+
+ Pesanan dibuat oleh: +

+ {saleOrder.address.customer?.name || '-'} +

+
+
+
+
+
+
+

Total Harga

+

+ {currencyFormat(saleOrder.amountTotal)} +

+
+
+ +
+
+ + {/*
No. Purchase Order @@ -393,8 +533,8 @@ const Transactions = ({ context = '' }) => { {saleOrder.invoiceCount} Invoice

-
-
+
*/} + {/*
Sales

@@ -409,15 +549,16 @@ const Transactions = ({ context = '' }) => { {currencyFormat(saleOrder.amountTotal)}

-
+
*/}
))} @@ -568,7 +709,7 @@ const Transactions = ({ context = '' }) => {
- + Status { ? endItem : transactions?.data?.saleOrderTotal ? transactions?.data?.saleOrderTotal - : limitNew}{' '} + : limitNew * pageNew}{' '} dari{' '} {transactions?.data?.saleOrderTotal ? transactions?.data?.saleOrderTotal - : limitNew} + : limitNew * pageNew}

handleStatusChange(e.target.value)} - className='border border-gray-300 rounded-lg px-3 py-1 text-sm bg-white shadow-sm focus:outline-none focus:ring-2 focus:ring-red-500' + className='border border-gray-300 rounded-lg px-2 py-1 text-xs bg-white shadow-sm focus:outline-none focus:ring-2 focus:ring-red-500' > {statuses.map((status) => (
@@ -379,14 +538,14 @@ const Transactions = ({ context = '' }) => { setInputQuery(e.target.value)} />
-

+

Menampilkan {startItem}- {endItem ? endItem @@ -405,7 +564,7 @@ const Transactions = ({ context = '' }) => { setLimitNew(Number(e.target.value)); setPageNew(1); }} - className='border p-2' + className='border p-2 text-xs' > @@ -436,7 +595,7 @@ const Transactions = ({ context = '' }) => {

{saleOrder.name}

- {saleOrder.dateOrder.split(' ')[0] || '-'} + {formatDate(saleOrder.dateOrder.split(' ')[0]) || '-'}
@@ -493,7 +652,11 @@ const Transactions = ({ context = '' }) => { href={`/my/quotations/${saleOrder?.id}`} className=' text-red-500 text-nowrap' > - Lihat semua produk + {saleOrder.products?.length > 6 + ? 'Lihat ' + + (saleOrder.products?.length - 6) + + ' produk lainnya' + : 'Lihat semua produk'}
)} @@ -508,9 +671,9 @@ const Transactions = ({ context = '' }) => {
-
-

Total Harga

-

+

+

Total Harga

+

{currencyFormat(saleOrder.amountTotal)}

@@ -715,7 +878,7 @@ const Transactions = ({ context = '' }) => {
-
+
@@ -723,7 +886,7 @@ const Transactions = ({ context = '' }) => { {statuses.map((status) => ( @@ -831,7 +994,7 @@ const Transactions = ({ context = '' }) => { {transactions.data.saleOrders.map((saleOrder, index) => (
{
Tanggal Pesanan:{' '} - {saleOrder.dateOrder.split(' ')[0] || '-'} + {formatDate( + saleOrder.dateOrder.split(' ')[0] + ) || '-'}
@@ -906,7 +1071,11 @@ const Transactions = ({ context = '' }) => { href={`/my/quotations/${saleOrder?.id}`} className='text-sm text-red-500 text-nowrap' > - Lihat semua produk + {saleOrder.products?.length > 6 + ? 'Lihat ' + + (saleOrder.products?.length - 6) + + ' produk lainnya' + : 'Lihat semua produk'}
)} -- cgit v1.2.3 From b4a595eaa8600e7bd1bafcef38abe4c01a5b664c Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Wed, 12 Mar 2025 16:59:18 +0700 Subject: fix transaction --- src/lib/transaction/components/Transactions.jsx | 28 +++++++------------------ 1 file changed, 7 insertions(+), 21 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index d93c9aef..ece97734 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -80,7 +80,6 @@ const Transactions = ({ context = '' }) => { const [isOpenCalender, setIsOpenCalender] = useState(false); const parseDate = (date) => { - console.log('masuk sini', date); if (null || 'null') return null; if (!date) return null; if (date instanceof Date) return date; // Jika sudah Date, langsung return @@ -95,19 +94,6 @@ const Transactions = ({ context = '' }) => { key: 'selection', }, ]); - console.log('startDate', startDate); - console.log('state', state); - // useEffect(() => { - // if (state[0].startDate != null) { - // setState([ - // { - // startDate: parseDate(startDate), - // endDate: parseDate(endDate), - // key: 'selection', - // }, - // ]); - // } - // }, [startDate, endDate]); const query = { name: q, @@ -369,7 +355,7 @@ const Transactions = ({ context = '' }) => { } if (status === 'all') { - router.push('/my/transactions'); + router.push(`${router.pathname}`); } else { setPageNew(1); } @@ -384,7 +370,7 @@ const Transactions = ({ context = '' }) => { }, ]); setIsOpenCalender(false); - router.push('/my/transactions'); + router.push(`${router.pathname}`); }; const formatDate = (dateString) => { @@ -649,7 +635,7 @@ const Transactions = ({ context = '' }) => { /> ))} {saleOrder.products?.length > 6 @@ -730,7 +716,7 @@ const Transactions = ({ context = '' }) => { pageCount={pageCount} currentPage={parseInt(pageNew)} // url={router.pathname + pageQuery} - url={`/my/transactions?${toQuery(_.omit(query, ['page']))}`} + url={`${router.pathname}?${toQuery(_.omit(query, ['page']))}`} className='mt-2 mb-2' /> @@ -997,7 +983,7 @@ const Transactions = ({ context = '' }) => { className='border py-2 px-4 hover:border-red-500 w-full rounded-lg' >
@@ -1068,7 +1054,7 @@ const Transactions = ({ context = '' }) => { /> ))} {saleOrder.products?.length > 6 @@ -1182,7 +1168,7 @@ const Transactions = ({ context = '' }) => { pageCount={pageCount} currentPage={parseInt(pageNew)} // url={router.pathname + (pageQuery ? `?${pageQuery}` : '')} - url={`/my/transactions?${toQuery(_.omit(query, ['page']))}`} + url={`${router.pathname}?${toQuery(_.omit(query, ['page']))}`} className='mt-2 mb-2' />
-- cgit v1.2.3 From 1e2c20a9871bf0a6117ae63d1e8d9d20119460ed Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 13 Mar 2025 10:07:38 +0700 Subject: update code --- src/lib/transaction/components/Transactions.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index ece97734..45821901 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -1021,7 +1021,7 @@ const Transactions = ({ context = '' }) => { className='object-contain object-center border border-gray_r-6 h-32 w-full rounded-md' />
-
+

Nomor PO: @@ -1030,7 +1030,7 @@ const Transactions = ({ context = '' }) => { {saleOrder.purchaseOrderName || '-'}

-

+

{saleOrder.products[0]?.parent?.name}

-- cgit v1.2.3 From 0d28dc8ff5fb8c5399e356ed6ecae4fce2019ca6 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Sat, 31 May 2025 08:55:43 +0700 Subject: fix repeat-order --- src/lib/transaction/components/Transactions.jsx | 124 +++++++++++++++++++++--- 1 file changed, 110 insertions(+), 14 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index 45821901..c4651119 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -78,6 +78,8 @@ const Transactions = ({ context = '' }) => { const [dateRange, setDateRange] = useState([null, null]); // const [startDate, endDate] = dateRange; const [isOpenCalender, setIsOpenCalender] = useState(false); + const [cachedAllData, setCachedAllData] = useState(null); // Simpan data "All" + const [currentData, setCurrentData] = useState([]); // Data yang ditampilkan const parseDate = (date) => { if (null || 'null') return null; @@ -263,7 +265,16 @@ const Transactions = ({ context = '' }) => { const getAllData = async () => { const query = { name: q, - context, + offset: (pageNew - 1) * limitNew, + limit: limitNew, + context: contextMap[statusNew], // gunakan contextMap + sort: sortNew, + startDate: state[0]?.startDate + ? state[0].startDate.toLocaleDateString('id-ID') + : null, + endDate: state[0]?.endDate + ? state[0].endDate.toLocaleDateString('id-ID') + : null, site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), }; @@ -345,22 +356,29 @@ const Transactions = ({ context = '' }) => { } }; - const handleStatusChange = (status) => { + + const handleStatusChange = async (status) => { setStatusNew(status); + setPageNew(1); - if (['quotation', 'cancel', 'diterima', ''].includes(status)) { - setcontextNew('quotation'); - } else { - setcontextNew(''); + if (status === 'all' && cachedAllData) { + setCurrentData(cachedAllData); + return; } - + const data = await fetchSite(status, 1); + if (status === 'all') { - router.push(`${router.pathname}`); - } else { - setPageNew(1); + setCachedAllData(data); } + + setCurrentData(data); }; + useEffect(() => { + setCachedAllData([]); + }, []); + + const handleReset = () => { setState([ { @@ -857,9 +875,7 @@ const Transactions = ({ context = '' }) => {

Info Transaksi

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed - do eiusmod tempor incididunt ut labore et dolore magna - aliqua. + Gunakan filter status untuk mempermudah pencarian transaksi anda di Daftar Transaksi
@@ -928,6 +944,86 @@ const Transactions = ({ context = '' }) => {
+
+ + {isOpenCalender && ( +
+ {/* Tombol silang di sudut kanan atas */} + + setState([item.selection])} + showSelectionPreview={true} + maxDate={new Date()} + moveRangeOnFirstSelection={false} + months={1} + ranges={state} + className='w-full' + /> + +
+ + +
+
+ )} +

Menampilkan {startItem}- @@ -980,7 +1076,7 @@ const Transactions = ({ context = '' }) => { {transactions.data.saleOrders.map((saleOrder, index) => (

Date: Thu, 31 Jul 2025 15:55:05 +0700 Subject: fix repeat order --- src/lib/transaction/components/Transactions.jsx | 461 +++++++++++++----------- 1 file changed, 258 insertions(+), 203 deletions(-) (limited to 'src/lib/transaction/components/Transactions.jsx') diff --git a/src/lib/transaction/components/Transactions.jsx b/src/lib/transaction/components/Transactions.jsx index c4651119..acb925da 100644 --- a/src/lib/transaction/components/Transactions.jsx +++ b/src/lib/transaction/components/Transactions.jsx @@ -1,5 +1,5 @@ import { useRouter } from 'next/router'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; import { toast } from 'react-hot-toast'; import { EllipsisVerticalIcon, @@ -34,7 +34,10 @@ import Image from '@/core/components/elements/Image/Image'; import { upsertUserCart } from '~/services/cart'; import { useProductCartContext } from '@/contexts/ProductCartContext'; import { Swiper, SwiperSlide } from 'swiper/react'; +import { Navigation } from 'swiper'; import 'swiper/css'; +import 'swiper/css/navigation'; +import { Calendar } from 'lucide-react'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; import { DateRangePicker } from 'react-date-range'; @@ -45,6 +48,7 @@ import { Popover } from '@headlessui/react'; const Transactions = ({ context = '' }) => { const auth = useAuth(); const router = useRouter(); + const swiperRef = useRef(null); const { q = '', page = 1, @@ -80,11 +84,12 @@ const Transactions = ({ context = '' }) => { const [isOpenCalender, setIsOpenCalender] = useState(false); const [cachedAllData, setCachedAllData] = useState(null); // Simpan data "All" const [currentData, setCurrentData] = useState([]); // Data yang ditampilkan + const calendarRef = useRef(null); + const [isDateSelected, setIsDateSelected] = useState(false); const parseDate = (date) => { - if (null || 'null') return null; - if (!date) return null; - if (date instanceof Date) return date; // Jika sudah Date, langsung return + if (!date || date === 'null') return null; + if (date instanceof Date) return date; const [day, month, year] = date.split('/').map(Number); return new Date(year, month - 1, day); }; @@ -106,7 +111,7 @@ const Transactions = ({ context = '' }) => { sort: sortNew, startDate: state[0].startDate ? state[0].startDate.toLocaleDateString('id-ID') - : state[0].startDate, + : null, endDate: state[0]?.endDate?.toLocaleDateString('id-ID'), site: siteFilter || (auth?.webRole === null && auth?.site ? auth.site : null), @@ -114,8 +119,9 @@ const Transactions = ({ context = '' }) => { const statuses = [ { id: 'all', label: 'Semua' }, { id: 'quotation', label: 'Pending Quotation' }, - { id: 'diterima', label: 'Pesanan Diterima' }, { id: 'diproses', label: 'Pesanan Diproses' }, + { id: 'dikemas', label: 'Pesanan Dikemas' }, + { id: 'partial', label: 'Dikirim Sebagian' }, { id: 'dikirim', label: 'Pesanan Dikirim' }, { id: 'selesai', label: 'Pesanan Selesai' }, { id: 'cancel', label: 'Pesanan Dibatalkan' }, @@ -302,6 +308,22 @@ const Transactions = ({ context = '' }) => { } }; + useEffect(() => { + const handleClickOutside = (event) => { + if ( + calendarRef.current && + !calendarRef.current.contains(event.target) + ) { + setIsOpenCalender(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + const startItem = 1 + (pageNew - 1) * limitNew; const endItem = Math.min( limitNew * pageNew, @@ -438,82 +460,82 @@ const Transactions = ({ context = '' }) => { ))} -
-
setIsOpenCalender(true)} - > - - {state[0]?.startDate - ? `${state[0].startDate.toLocaleDateString()} - ${state[0].endDate.toLocaleDateString()}` - : 'Semua Tanggal'} - -
- - {isOpenCalender && ( -
-
- setState([item.selection])} - showSelectionPreview={true} - maxDate={new Date()} - moveRangeOnFirstSelection={false} - months={1} - ranges={state} - direction='horizontal' - className='w-full' - /> - -
- - -
+
+ + {isOpenCalender && ( +
+ {/* Tombol silang di sudut kanan atas */} + + setState([item.selection])} + showSelectionPreview={false} + maxDate={new Date()} + moveRangeOnFirstSelection={false} + months={1} + ranges={state} + className='w-full' + /> + +
+
- )} -
+ )} +
{/*
e.target === document} @@ -643,7 +665,7 @@ const Transactions = ({ context = '' }) => { {saleOrder.products?.length > 1 && (
{saleOrder.products - .slice(1, 6) + .slice(1, 4) .map((product, index) => ( { className='object-contain object-center border border-gray_r-6 h-8 w-8 rounded-md' /> ))} - - {saleOrder.products?.length > 6 - ? 'Lihat ' + - (saleOrder.products?.length - 6) + - ' produk lainnya' - : 'Lihat semua produk'} - + {saleOrder.products.length > 4 ? ( + + +{saleOrder.products.length - 4} lihat semua produk + + ) : ( + + Lihat semua produk + + )}
)}
@@ -880,33 +907,60 @@ const Transactions = ({ context = '' }) => {
-
+
Status - - {statuses.map((status) => ( - - + + {/* Swiper container scrollable */} +
+ - {status.label} - - - ))} - + {statuses.map((status) => ( + + + + ))} + +
+ + {/* Next */} + +
+
@@ -944,86 +998,6 @@ const Transactions = ({ context = '' }) => {
-
- - {isOpenCalender && ( -
- {/* Tombol silang di sudut kanan atas */} - - setState([item.selection])} - showSelectionPreview={true} - maxDate={new Date()} - moveRangeOnFirstSelection={false} - months={1} - ranges={state} - className='w-full' - /> - -
- - -
-
- )} -

Menampilkan {startItem}- @@ -1050,6 +1024,82 @@ const Transactions = ({ context = '' }) => { +

+ + {isOpenCalender && ( +
+ {/* Tombol silang di sudut kanan atas */} + + setState([item.selection])} + showSelectionPreview={false} + maxDate={new Date()} + moveRangeOnFirstSelection={false} + months={1} + ranges={state} + className='w-full' + /> + +
+ +
+
+ )} +
@@ -1140,7 +1190,7 @@ const Transactions = ({ context = '' }) => { {saleOrder.products?.length > 1 && (
{saleOrder.products - .slice(1, 6) + .slice(1, 4) .map((product, index) => ( { className='object-contain object-center border border-gray_r-6 h-16 w-16 rounded-md' /> ))} - - {saleOrder.products?.length > 6 - ? 'Lihat ' + - (saleOrder.products?.length - 6) + - ' produk lainnya' - : 'Lihat semua produk'} - + {saleOrder.products.length > 4 ? ( + + +{saleOrder.products.length - 4} lihat semua produk + + ) : ( + + Lihat semua produk + + )}
)}
-- cgit v1.2.3