summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafi Zadanly <zadanlyr@gmail.com>2023-02-06 16:15:14 +0700
committerRafi Zadanly <zadanlyr@gmail.com>2023-02-06 16:15:14 +0700
commite561175d7167da3f6ac25200ad3cce63ea38e20b (patch)
tree0ad04bc66ef2b5ca23f35bfa9614731e1240d9f3
parent620223f151700bbd91a33d32e2a4c29d4c287e9d (diff)
no message
-rw-r--r--src/components/transactions/TransactionStatusBadge.js2
-rw-r--r--src/pages/index.js10
-rw-r--r--src/pages/my/invoice/[id].js2
-rw-r--r--src/pages/my/invoices.js43
-rw-r--r--src/pages/my/transaction/[id].js36
-rw-r--r--src/pages/my/transactions.js27
-rw-r--r--src/pages/shop/brands/[slug].js39
-rw-r--r--src/pages/shop/brands/index.js10
-rw-r--r--src/pages/shop/cart.js2
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