diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/transactions/TransactionStatusBadge.js | 2 | ||||
| -rw-r--r-- | src/pages/index.js | 10 | ||||
| -rw-r--r-- | src/pages/my/invoice/[id].js | 2 | ||||
| -rw-r--r-- | src/pages/my/invoices.js | 43 | ||||
| -rw-r--r-- | src/pages/my/transaction/[id].js | 36 | ||||
| -rw-r--r-- | src/pages/my/transactions.js | 27 | ||||
| -rw-r--r-- | src/pages/shop/brands/[slug].js | 39 | ||||
| -rw-r--r-- | src/pages/shop/brands/index.js | 10 | ||||
| -rw-r--r-- | src/pages/shop/cart.js | 2 |
9 files changed, 143 insertions, 28 deletions
diff --git a/src/components/transactions/TransactionStatusBadge.js b/src/components/transactions/TransactionStatusBadge.js index 9551ec89..d8da6033 100644 --- a/src/components/transactions/TransactionStatusBadge.js +++ b/src/components/transactions/TransactionStatusBadge.js @@ -14,7 +14,7 @@ const TransactionStatusBadge = ({ status }) => { break; case 'waiting': badgeProps.className.push('badge-yellow'); - badgeProps.text = 'Menunggu Konfirmasi' + badgeProps.text = 'Dikonfirmasi' break; case 'sale': badgeProps.className.push('badge-yellow'); diff --git a/src/pages/index.js b/src/pages/index.js index ca501ecc..dd81e817 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -46,7 +46,15 @@ export default function Home({ heroBanners }) { <> <Header title='Home - Indoteknik' /> <Layout> - <Swiper slidesPerView={1} pagination={{dynamicBullets: true}} modules={[Pagination, Autoplay]}> + <Swiper + slidesPerView={1} + pagination={{dynamicBullets: true}} + modules={[Pagination, Autoplay]} + autoplay={{ + delay: 6000, + disableOnInteraction: false + }} + > { heroBanners?.map((banner, index) => ( <SwiperSlide key={index}> diff --git a/src/pages/my/invoice/[id].js b/src/pages/my/invoice/[id].js index 10f625a9..7342b1bf 100644 --- a/src/pages/my/invoice/[id].js +++ b/src/pages/my/invoice/[id].js @@ -105,7 +105,7 @@ export default function DetailInvoice() { type="button" className="btn-light py-1.5 px-3 ml-auto" onClick={downloadTaxInvoice} - disabled={invoice.efaktur ? false : true} + disabled={!invoice.efaktur} > Download </button> diff --git a/src/pages/my/invoices.js b/src/pages/my/invoices.js index a86ddffc..ed9ba660 100644 --- a/src/pages/my/invoices.js +++ b/src/pages/my/invoices.js @@ -6,6 +6,7 @@ import Layout from "@/components/layouts/Layout"; import apiOdoo from "@/core/utils/apiOdoo"; import { useAuth } from "@/core/utils/auth"; import currencyFormat from "@/core/utils/currencyFormat"; +import useBottomPopup from "@/lib/elements/hooks/useBottomPopup"; import { CheckIcon, ClockIcon, EllipsisVerticalIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline"; import { useRouter } from "next/router"; import { useEffect, useRef, useState } from "react"; @@ -54,6 +55,45 @@ export default function Invoices() { router.push(`/my/invoices${queryParams}`); }; + const downloadInvoice = (data) => { + const url = `${process.env.ODOO_HOST}/api/v1/download/invoice/${data.id}/${data.token}`; + window.open(url, 'download'); + closePopup(); + }; + + const downloadTaxInvoice = (data) => { + const url = `${process.env.ODOO_HOST}/api/v1/download/tax-invoice/${data.id}/${data.token}`; + window.open(url, 'download'); + closePopup(); + }; + + const childrenPopup = (data) => ( + <div className="flex flex-col gap-y-6"> + <button + className="text-left disabled:opacity-60" + onClick={() => downloadInvoice(data)} + > + Download Faktur Pembelian + </button> + <button + className="text-left disabled:opacity-60" + disabled={!data?.efaktur} + onClick={() => downloadTaxInvoice(data)} + > + Download Faktur Pajak + </button> + </div> + ); + + const { + closePopup, + openPopup, + BottomPopup + } = useBottomPopup({ + title: 'Lainnya', + children: childrenPopup + }); + return ( <WithAuth> <Layout> @@ -91,7 +131,7 @@ export default function Invoices() { ) : ( <div className="badge-solid-green h-fit ml-auto">Lunas</div> ) } - <EllipsisVerticalIcon className="w-5 h-5" onClick={() => {}} /> + <EllipsisVerticalIcon className="w-5 h-5" onClick={() => openPopup(invoice)} /> </div> </div> <Link href={`/my/invoice/${invoice.id}`}> @@ -129,6 +169,7 @@ export default function Invoices() { </div> )) } </div> + { BottomPopup } </Layout> </WithAuth> ); diff --git a/src/pages/my/transaction/[id].js b/src/pages/my/transaction/[id].js index d1ecbd7f..51004839 100644 --- a/src/pages/my/transaction/[id].js +++ b/src/pages/my/transaction/[id].js @@ -107,11 +107,13 @@ export default function DetailTransaction() { }); const downloadPurchaseOrder = () => { - + const url = `${process.env.ODOO_HOST}/api/v1/partner/${auth.partner_id}/sale_order/${transaction.id}/download_po/${transaction.token}`; + window.open(url, 'download') }; - const uploadPurchaseOrder = () => { - openPopup(); + const downloadQuotation = () => { + const url = `${process.env.ODOO_HOST}/api/v1/partner/${auth.partner_id}/sale_order/${transaction.id}/download/${transaction.token}`; + window.open(url, 'download') }; return ( @@ -152,7 +154,7 @@ export default function DetailTransaction() { <button type="button" className="btn-light py-1.5 px-3 ml-auto" - onClick={transaction?.purchase_order_file ? downloadPurchaseOrder : uploadPurchaseOrder} + onClick={transaction?.purchase_order_file ? downloadPurchaseOrder : openPopup} > { transaction?.purchase_order_file ? 'Download' : 'Upload' } </button> @@ -211,15 +213,27 @@ export default function DetailTransaction() { Belum ada Invoice </Alert> ) } - <button - className="btn-light w-full mt-4" - disabled={transaction?.status != 'waiting'} - onClick={() => openConfirmAlert(transaction)} - > - Batalkan Transaksi - </button> </div> </div> + + <LineDivider /> + + <div className="px-4"> + <button + className="btn-light w-full mt-4" + disabled={transaction?.status != 'draft'} + onClick={downloadQuotation} + > + Download Quotation + </button> + <button + className="btn-light w-full mt-4" + disabled={transaction?.status != 'waiting'} + onClick={() => openConfirmAlert(transaction)} + > + Batalkan Transaksi + </button> + </div> </> ) : ( <div className="p-4 py-6"> diff --git a/src/pages/my/transactions.js b/src/pages/my/transactions.js index 6eb0fb4e..8be43af7 100644 --- a/src/pages/my/transactions.js +++ b/src/pages/my/transactions.js @@ -58,15 +58,36 @@ export default function Transactions() { router.push(`/my/transactions${queryParams}`); }; + const downloadPurchaseOrder = (data) => { + const url = `${process.env.ODOO_HOST}/api/v1/partner/${auth.partner_id}/sale_order/${data.id}/download_po/${data.token}`; + window.open(url, 'download'); + closePopup(); + }; + + const downloadQuotation = (data) => { + const url = `${process.env.ODOO_HOST}/api/v1/partner/${auth.partner_id}/sale_order/${data.id}/download/${data.token}`; + window.open(url, 'download'); + closePopup(); + }; + const childrenPopup = (data) => ( <div className="flex flex-col gap-y-6"> <button - className="text-left" + className="text-left disabled:opacity-60" + disabled={!data?.purchase_order_file} + onClick={() => downloadPurchaseOrder(data)} + > + Download PO + </button> + <button + className="text-left disabled:opacity-60" + disabled={data?.status != 'draft'} + onClick={() => downloadQuotation(data)} > Download Quotation </button> <button - className="text-left disabled:opacity-70" + className="text-left disabled:opacity-60" disabled={ data?.status != 'waiting' } onClick={() => {openConfirmAlert(data); closePopup()}} > @@ -99,7 +120,7 @@ export default function Transactions() { title: 'Batalkan Transaksi', caption: 'Apakah anda yakin untuk membatalkan transaksi?', closeText: 'Tidak', - submitText: 'Iya, batalkan', + submitText: 'Ya, Batalkan', onSubmit: submitCancelTransaction }); diff --git a/src/pages/shop/brands/[slug].js b/src/pages/shop/brands/[slug].js index 928da0d0..64ff7706 100644 --- a/src/pages/shop/brands/[slug].js +++ b/src/pages/shop/brands/[slug].js @@ -6,8 +6,15 @@ import Header from "@/components/layouts/Header"; import Layout from "@/components/layouts/Layout"; import Pagination from "@/components/elements/Pagination"; import ProductCard from "@/components/products/ProductCard"; -import { getNameFromSlug } from "@/core/utils/slug"; +import { getIdFromSlug, getNameFromSlug } from "@/core/utils/slug"; import FilterIcon from "@/icons/filter.svg"; +import apiOdoo from "@/core/utils/apiOdoo"; +import { Swiper, SwiperSlide } from "swiper/react"; +import "swiper/css"; +import "swiper/css/pagination"; +import "swiper/css/autoplay"; +import { Pagination as SwiperPagination } from "swiper"; +import Image from "@/components/elements/Image"; export async function getServerSideProps(context) { const { @@ -30,6 +37,8 @@ export async function getServerSideProps(context) { ].join('&'); let searchResults = await axios(`${process.env.SELF_HOST}/api/shop/search?${urlParameter}`); searchResults = searchResults.data; + + const manufacture = await apiOdoo('GET', `/api/v1/manufacture/${getIdFromSlug(slug)}`); return { props: { @@ -39,7 +48,8 @@ export async function getServerSideProps(context) { category, price_from, price_to, - order_by + order_by, + manufacture } }; } @@ -51,7 +61,8 @@ export default function BrandDetail({ category, price_from, price_to, - order_by + order_by, + manufacture }) { const pageCount = Math.ceil(searchResults.response.numFound / searchResults.responseHeader.params.rows); const productStart = searchResults.responseHeader.params.start; @@ -94,8 +105,28 @@ export default function BrandDetail({ disableFilter={['brand']} /> <Layout> + <Swiper slidesPerView={1} pagination={{dynamicBullets: true}} modules={[SwiperPagination]}> + { + manufacture.banners?.map((banner, index) => ( + <SwiperSlide key={index}> + <Image + src={banner} + alt={`Banner ${manufacture.name}`} + className="w-full h-auto" + /> + </SwiperSlide> + )) + } + </Swiper> <div className="p-4"> - <h1 className="mb-2">Produk</h1> + <div className="flex"> + { manufacture.logo ? ( + <Image src={manufacture?.logo} alt={manufacture.name} className="w-4/12 border border-gray_r-6 rounded p-3" /> + ) : ( + <p className="badge-red text-caption-1">Brand { manufacture.name }</p> + ) } + </div> + <h1 className="mb-2 mt-4">Produk</h1> <div className="text-caption-1 mb-4"> {productFound > 0 ? ( <> diff --git a/src/pages/shop/brands/index.js b/src/pages/shop/brands/index.js index fec2405a..bfdcd403 100644 --- a/src/pages/shop/brands/index.js +++ b/src/pages/shop/brands/index.js @@ -1,7 +1,7 @@ import Header from "@/components/layouts/Header"; import apiOdoo from "@/core/utils/apiOdoo"; import InfiniteScroll from "react-infinite-scroll-component"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import Spinner from "@/components/elements/Spinner"; import Layout from "@/components/layouts/Layout"; import ManufactureCard from "@/components/manufactures/ManufactureCard"; @@ -20,12 +20,12 @@ export default function Brands({ initialManufactures }) { const alpha = Array.from(Array(26)).map((e, i) => i + 65); const alphabets = alpha.map((x) => String.fromCharCode(x)); - const getMoreManufactures = async () => { + const getMoreManufactures = useCallback(async () => { const name = manufactureStartwith != '' ? `${manufactureStartwith}%` : ''; const result = await apiOdoo('GET', `/api/v1/manufacture?limit=30&offset=${manufactures.length}&name=${name}`); setHasMoreManufacture(manufactures.length + 30 < result.manufacture_total) setManufactures((manufactures) => [...manufactures, ...result.manufactures]); - }; + }, [ manufactureStartwith ]); const filterManufactureStartWith = (character) => { setManufactures([]); @@ -38,7 +38,7 @@ export default function Brands({ initialManufactures }) { useEffect(() => { getMoreManufactures(); - }, [manufactureStartwith]); + }, [ getMoreManufactures ]); return ( <> @@ -48,7 +48,7 @@ export default function Brands({ initialManufactures }) { <h1>Semua Brand di Indoteknik</h1> <div className="flex overflow-x-auto gap-x-2 py-2"> {alphabets.map((alphabet, index) => ( - <button key={index} className={"p-2 py-1 border bg-white border-gray_r-6 rounded w-10 flex-shrink-0" + (manufactureStartwith == alphabet ? ' bg-yellow_r-9 border-yellow_r-9 ' : '')} onClick={() => filterManufactureStartWith(alphabet)}> + <button key={index} className={"p-2 py-1 border bg-white border-gray_r-6 rounded w-10 flex-shrink-0" + (manufactureStartwith == alphabet ? ' !bg-yellow_r-9 border-yellow_r-9 ' : '')} onClick={() => filterManufactureStartWith(alphabet)}> {alphabet} </button> ))} diff --git a/src/pages/shop/cart.js b/src/pages/shop/cart.js index d8327a10..ef62bb23 100644 --- a/src/pages/shop/cart.js +++ b/src/pages/shop/cart.js @@ -134,7 +134,7 @@ export default function Cart() { ConfirmAlert } = useConfirmAlert({ title: 'Hapus barang dari keranjang', - caption:'Apakah anda yakin menghapus barang dari keranjang', + caption:'Apakah anda yakin menghapus barang dari keranjang?', closeText: 'Batal', submitText: 'Hapus', onSubmit: deleteItem |
