From 6bd88bdb765c1ecc0518abeca77eca25bde2857b Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 17 Oct 2023 14:57:48 +0700 Subject: add lebel product terjual di product card dan product detail, bugfix queri solr untuk filter brand --- src/core/utils/formatValue.js | 10 ++++++++++ .../product/components/Product/ProductDesktop.jsx | 9 +++++++-- .../product/components/Product/ProductMobile.jsx | 11 ++++++++--- src/lib/product/components/ProductCard.jsx | 23 +++++++++++----------- src/lib/product/components/ProductSearch.jsx | 6 +++--- src/pages/api/shop/search.js | 6 +++--- src/utils/solrMapping.js | 6 ++++-- 7 files changed, 46 insertions(+), 25 deletions(-) create mode 100644 src/core/utils/formatValue.js (limited to 'src') diff --git a/src/core/utils/formatValue.js b/src/core/utils/formatValue.js new file mode 100644 index 00000000..dc78df5b --- /dev/null +++ b/src/core/utils/formatValue.js @@ -0,0 +1,10 @@ +const sellingProductFormat = (value) => { + if (value > 1000) { + const formattedValue = (value / 1000).toFixed(1).replace('.', ',') + return `${formattedValue.replace(/\.0$/, '')}rb+` + } else { + return value.toString() + } +} + +export { sellingProductFormat } diff --git a/src/lib/product/components/Product/ProductDesktop.jsx b/src/lib/product/components/Product/ProductDesktop.jsx index 701750b2..ab4943eb 100644 --- a/src/lib/product/components/Product/ProductDesktop.jsx +++ b/src/lib/product/components/Product/ProductDesktop.jsx @@ -25,6 +25,7 @@ import { useProductCartContext } from '@/contexts/ProductCartContext' import { Box, Skeleton, Tooltip } from '@chakra-ui/react' import { Info } from 'lucide-react' import Breadcrumb from './Breadcrumb' +import { sellingProductFormat } from '@/core/utils/formatValue' const ProductDesktop = ({ products, wishlist, toggleWishlist }) => { const router = useRouter() @@ -418,7 +419,7 @@ const ProductDesktop = ({ products, wishlist, toggleWishlist }) => { -
+
{product.variants.length > 1 && product.lowestPrice.priceDiscount > 0 && (
Harga mulai dari:
)} @@ -447,7 +448,11 @@ const ProductDesktop = ({ products, wishlist, toggleWishlist }) => { )}
)} */} - + {product?.qtySold > 0 && ( +
+ {sellingProductFormat(product?.qtySold) + ' Terjual'} +
+ )} {lowestPrice?.isFlashsale && lowestPrice?.price.discountPercentage > 0 ? ( <>
diff --git a/src/lib/product/components/Product/ProductMobile.jsx b/src/lib/product/components/Product/ProductMobile.jsx index 70ac1cbc..ef2c0002 100644 --- a/src/lib/product/components/Product/ProductMobile.jsx +++ b/src/lib/product/components/Product/ProductMobile.jsx @@ -21,6 +21,7 @@ import ImageNext from 'next/image' import CountDown2 from '@/core/components/elements/CountDown/CountDown2' import Breadcrumb from './Breadcrumb' import useAuth from '@/core/hooks/useAuth' +import { sellingProductFormat } from '@/core/utils/formatValue' const ProductMobile = ({ product, wishlist, toggleWishlist }) => { const router = useRouter() @@ -62,7 +63,8 @@ const ProductMobile = ({ product, wishlist, toggleWishlist }) => { price: getLowestPrice(), stock: product.stockTotal, weight: product.weight, - hasProgram: false + hasProgram: false, + qtySold: product.qtySold }) const variantOptions = product.variants?.map((variant) => { @@ -105,7 +107,8 @@ const ProductMobile = ({ product, wishlist, toggleWishlist }) => { stock: variant.stock, weight: variant.weight, hasProgram: variant.hasProgram, - isFlashsale: variant.isFlashsale + isFlashsale: variant.isFlashsale, + qtySold: variant.qtySold } setActiveVariant(newActiveVariant) @@ -245,7 +248,9 @@ const ProductMobile = ({ product, wishlist, toggleWishlist }) => {

{activeVariant?.name}

- + {product?.qtySold > 0 && ( +
{sellingProductFormat(activeVariant?.qtySold) + ' Terjual'}
+ )} {product.variants.length > 1 && activeVariant.price.priceDiscount > 0 && !selectedVariant && ( diff --git a/src/lib/product/components/ProductCard.jsx b/src/lib/product/components/ProductCard.jsx index 3b96ac32..72a3260e 100644 --- a/src/lib/product/components/ProductCard.jsx +++ b/src/lib/product/components/ProductCard.jsx @@ -1,6 +1,7 @@ import Image from '@/core/components/elements/Image/Image' import Link from '@/core/components/elements/Link/Link' import currencyFormat from '@/core/utils/currencyFormat' +import { sellingProductFormat } from '@/core/utils/formatValue' import { createSlug } from '@/core/utils/slug' import whatsappUrl from '@/core/utils/whatsappUrl' import ImageNext from 'next/image' @@ -123,12 +124,11 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => {
)} - {product?.stockTotal > 0 && ( -
-
Ready Stock
-
{product?.stockTotal > 5 ? '> 5' : '< 5'}
-
- )} +
+ {product?.stockTotal > 0 &&
Ready Stock
} + {/*
{product?.stockTotal > 5 ? '> 5' : '< 5'}
*/} + {product?.qtySold > 0 &&
{sellingProductFormat(product?.qtySold) + ' Terjual'}
} +
) @@ -229,12 +229,11 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => { )} - {product?.stockTotal > 0 && ( -
-
Ready Stock
-
{product?.stockTotal > 5 ? '> 5' : '< 5'}
-
- )} +
+ {product?.stockTotal > 0 &&
Ready Stock
} + {/*
{product?.stockTotal > 5 ? '> 5' : '< 5'}
*/} + {product?.qtySold > 0 &&
{sellingProductFormat(product?.qtySold) + ' Terjual'}
} +
) diff --git a/src/lib/product/components/ProductSearch.jsx b/src/lib/product/components/ProductSearch.jsx index fd75d587..dc9796f2 100644 --- a/src/lib/product/components/ProductSearch.jsx +++ b/src/lib/product/components/ProductSearch.jsx @@ -70,11 +70,11 @@ const ProductSearch = ({ query, prefixUrl, defaultBrand = null }) => { const brands = [] for ( let i = 0; - i < productSearch.data?.facetCounts?.facetFields?.manufactureName.length; + i < productSearch.data?.facetCounts?.facetFields?.manufactureNameS.length; i += 2 ) { - const brand = productSearch.data?.facetCounts?.facetFields?.manufactureName[i] - const qty = productSearch.data?.facetCounts?.facetFields?.manufactureName[i + 1] + const brand = productSearch.data?.facetCounts?.facetFields?.manufactureNameS[i] + const qty = productSearch.data?.facetCounts?.facetFields?.manufactureNameS[i + 1] if (qty > 0) { brands.push({ brand, qty }) } diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index fd7a215a..31497c51 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -13,7 +13,7 @@ export default async function handler(req, res) { orderBy = '', operation = 'AND', fq = '', - limit = 0, + limit = 30, stock = '' } = req.query @@ -41,7 +41,7 @@ export default async function handler(req, res) { let offset = (page - 1) * limit let parameter = [ - 'facet.field=manufacture_name', + 'facet.field=manufacture_name_s', 'facet.field=category_name', 'facet=true', 'indent=true', @@ -49,7 +49,7 @@ export default async function handler(req, res) { `q.op=${operation}`, `q=${escapeSolrQuery(q)}`, 'qf=name_s', - `start=${offset}`, + `start=${parseInt(offset)}`, `rows=${limit}`, `sort=${paramOrderBy}`, `fq=-publish_b:false` diff --git a/src/utils/solrMapping.js b/src/utils/solrMapping.js index 61816cf8..41d24b53 100644 --- a/src/utils/solrMapping.js +++ b/src/utils/solrMapping.js @@ -32,7 +32,8 @@ export const productMappingSolr = (products, pricelist) => { remainingTime: flashsaleTime(product?.flashsale_end_date_s)?.remainingTime, name: product?.product?.flashsale_name_s, tag: product?.flashsale_tag_s || 'FLASH SALE' - } + }, + qtySold : product?.qty_sold_f || 0 } if (product.manufacture_id_i && product.manufacture_name_s) { @@ -85,7 +86,8 @@ export const variantsMappingSolr = (parent, products, pricelist) => { stockTotal: product.stock_total_f || 0, weight: product.weight_f || 0, manufacture: {}, - parent: {} + parent: {}, + qtySold : product?.qty_sold_f || 0 } if (product.manufacture_id_i && product.manufacture_name_s) { -- cgit v1.2.3