summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFIN-IT_AndriFP <andrifebriyadiputra@gmail.com>2026-01-27 11:47:24 +0700
committerFIN-IT_AndriFP <andrifebriyadiputra@gmail.com>2026-01-27 11:47:24 +0700
commit8ea5e52346fff91462e63e3e881f65a47ffd1354 (patch)
tree1eedc43cab967d26c613dcd4f5e4f87e6fd20070
parent294667fde6feeba207f00cd1d7c6d2f0ead20ffa (diff)
(andri) fix search non grouping compare
-rw-r--r--src-migrate/modules/product-detail/components/ProductComparisonModal.tsx42
-rw-r--r--src/pages/api/shop/search.js14
2 files changed, 46 insertions, 10 deletions
diff --git a/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx b/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx
index ee5b01d9..d9b0a436 100644
--- a/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx
+++ b/src-migrate/modules/product-detail/components/ProductComparisonModal.tsx
@@ -223,6 +223,7 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
// ===========================================================================
useEffect(() => {
const delayDebounceFn = setTimeout(async () => {
+ // Validasi panjang karakter (biarkan tetap minimal 3 agar tidak berat)
if (searchQuery.length > 0 && searchQuery.length < 3) {
setSearchResults([]);
return;
@@ -240,17 +241,29 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
setIsSearching(true);
try {
- const queryParam = searchQuery === '' ? '*' : searchQuery;
+ // [FIX 1] Gunakan 'let' agar tidak error saat diubah nilainya
+ let queryParam = '*';
+
+ if (searchQuery !== '') {
+ // [FITUR] Wildcard Search: Ubah "7 inc" menjadi "*7* *inc*"
+ // Ini membantu pencarian parsial (typo tolerance sederhana)
+ const words = searchQuery.trim().split(/\s+/);
+ queryParam = words.map(w => `*${w}*`).join(' ');
+ }
+
const params = new URLSearchParams({
source: 'compare',
- q: queryParam,
+ q: queryParam,
limit: '20',
- fq: `attribute_set_id_i:${attrSetId}`
+ fq: `attribute_set_id_i:${attrSetId}`,
+ // [FIX 2] Matikan Grouping agar varian muncul terpisah
+ group: 'false'
});
const res = await fetch(`/api/shop/search?${params.toString()}`);
if (res.ok) {
const data = await res.json();
+ // Ambil produk dari response
setSearchResults(data.response?.products || []);
} else {
setSearchResults([]);
@@ -290,7 +303,25 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
});
if (selectedVar) {
- setDisableVariantFilter(true);
+ const isDuplicate = products.some((p, idx) =>
+ idx !== slotIndex &&
+ p !== null &&
+ String(p.id) === String(selectedVar.id)
+ );
+
+ if (isDuplicate) {
+ toast({
+ title: "Varian sudah ada",
+ description: "Varian produk ini sudah ada di slot perbandingan lain.",
+ status: "warning",
+ position: "top",
+ duration: 3000
+ });
+ return;
+ }
+
+ setDisableVariantFilter(true);
+
const newProducts = [...products];
newProducts[slotIndex] = {
...currentProduct,
@@ -307,10 +338,11 @@ const ProductComparisonModal = ({ isOpen, onClose, mainProduct, selectedVariant
};
const handleAddProduct = async (searchItem: any, slotIndex: number) => {
- if (products.find(p => p && String(p.id) === String(searchItem.id))) {
+ if (products.some(p => p !== null && String(p.id) === String(searchItem.id))) {
toast({ title: "Produk sudah ada", status: "warning", position: "top" });
return;
}
+ setDisableVariantFilter(true);
const idToAdd = searchItem.id;
const codeToAdd = searchItem.defaultCode || searchItem.default_code || searchItem.code;
diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js
index 5ea6a70a..37cfa1bd 100644
--- a/src/pages/api/shop/search.js
+++ b/src/pages/api/shop/search.js
@@ -23,6 +23,7 @@ export default async function handler(req, res) {
fq = '', // bisa berupa string atau array
limit = 30,
source = '',
+ group = 'true',
} = req.query;
let { stock = '' } = req.query;
@@ -61,11 +62,14 @@ export default async function handler(req, res) {
// Minimum Match 100% (Semua kata harus ada), ubah jika ingin lebih longgar
params.append('mm', '100%');
- // Grouping
- params.append('group', 'true');
- params.append('group.field', 'template_id_i');
- params.append('group.limit', '1');
- params.append('group.main', 'true');
+ if (group === 'false') {
+ params.append('group', 'false');
+ } else {
+ params.append('group', 'true');
+ params.append('group.field', 'template_id_i');
+ params.append('group.limit', '1');
+ params.append('group.main', 'true');
+ }
// Field List (fl)
params.append('fl', 'id,display_name_s,default_code_s,image_s,price_tier1_v2_f,attribute_set_id_i,attribute_set_name_s,template_id_i,product_id_i');