@dropins/storefront-product-discovery 1.0.2-alpha6 → 1.0.2-alpha8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/initialize/initialize.d.ts +2 -0
- package/chunks/api.js +1 -1
- package/chunks/api.js.map +1 -1
- package/chunks/productSearch.js.map +1 -1
- package/containers/ProductList.js +1 -1
- package/containers/ProductList.js.map +1 -1
- package/containers/SearchBarResults.js +2 -2
- package/containers/SearchBarResults.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { Initializer, Model } from '@dropins/tools/types/elsie/src/lib';
|
|
2
2
|
import { Lang } from '@dropins/tools/types/elsie/src/i18n';
|
|
3
3
|
import { Product } from '../../data/models/product';
|
|
4
|
+
import { ProductSearchResult } from '../../data/models';
|
|
4
5
|
|
|
5
6
|
type ConfigProps = {
|
|
6
7
|
langDefinitions?: Lang;
|
|
7
8
|
models?: {
|
|
8
9
|
Product?: Model<Product>;
|
|
10
|
+
ProductSearchResult?: Model<ProductSearchResult>;
|
|
9
11
|
};
|
|
10
12
|
};
|
|
11
13
|
export declare const initialize: Initializer<ConfigProps>;
|
package/chunks/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{merge as
|
|
3
|
+
import{merge as d}from"@dropins/tools/lib.js";import{c as a}from"./productSearch.js";const ee=e=>{var o,i,r,l,s,c,m,f,u,y,v,R,k,w,_,x,b,C,D,K,P,T,A,O,V,z,I,S,j,q,B,E,F,G,H,J,N,Q,U,W,X,Y,Z,$,M,L,h,g,t;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const n={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],images:((o=e==null?void 0:e.images)==null?void 0:o.map(p=>({label:p.label||"",roles:p.roles||[],url:p.url||""})))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((l=(r=(i=e==null?void 0:e.price)==null?void 0:i.final)==null?void 0:r.amount)==null?void 0:l.value)||0,currency:((m=(c=(s=e==null?void 0:e.price)==null?void 0:s.final)==null?void 0:c.amount)==null?void 0:m.currency)||""}},regular:{amount:{value:((y=(u=(f=e==null?void 0:e.price)==null?void 0:f.regular)==null?void 0:u.amount)==null?void 0:y.value)||0,currency:((k=(R=(v=e==null?void 0:e.price)==null?void 0:v.regular)==null?void 0:R.amount)==null?void 0:k.currency)||""}},roles:((w=e==null?void 0:e.price)==null?void 0:w.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((C=(b=(x=(_=e==null?void 0:e.priceRange)==null?void 0:_.minimum)==null?void 0:x.final)==null?void 0:b.amount)==null?void 0:C.value)||0,currency:((T=(P=(K=(D=e==null?void 0:e.priceRange)==null?void 0:D.minimum)==null?void 0:K.final)==null?void 0:P.amount)==null?void 0:T.currency)||""}},regular:{amount:{value:((z=(V=(O=(A=e==null?void 0:e.priceRange)==null?void 0:A.minimum)==null?void 0:O.regular)==null?void 0:V.amount)==null?void 0:z.value)||0,currency:((q=(j=(S=(I=e==null?void 0:e.priceRange)==null?void 0:I.minimum)==null?void 0:S.regular)==null?void 0:j.amount)==null?void 0:q.currency)||""}}},maximum:{final:{amount:{value:((G=(F=(E=(B=e==null?void 0:e.priceRange)==null?void 0:B.maximum)==null?void 0:E.final)==null?void 0:F.amount)==null?void 0:G.value)||0,currency:((Q=(N=(J=(H=e==null?void 0:e.priceRange)==null?void 0:H.maximum)==null?void 0:J.final)==null?void 0:N.amount)==null?void 0:Q.currency)||""}},regular:{amount:{value:((Y=(X=(W=(U=e==null?void 0:e.priceRange)==null?void 0:U.maximum)==null?void 0:W.regular)==null?void 0:X.amount)==null?void 0:Y.value)||0,currency:((L=(M=($=(Z=e==null?void 0:e.priceRange)==null?void 0:Z.maximum)==null?void 0:$.regular)==null?void 0:M.amount)==null?void 0:L.currency)||""}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return d(n,(t=(g=(h=a.getConfig().models)==null?void 0:h.Product)==null?void 0:g.transformer)==null?void 0:t.call(g,e))};function ie(e){var i,r,l,s,c,m,f;const n=e==null?void 0:e.productSearch,o={facets:(n==null?void 0:n.facets)||[],items:(n==null?void 0:n.items.map(u=>ee(u==null?void 0:u.productView)))||[],pageInfo:{currentPage:((i=n==null?void 0:n.page_info)==null?void 0:i.current_page)||1,totalPages:((r=n==null?void 0:n.page_info)==null?void 0:r.total_pages)||1,totalItems:((l=n==null?void 0:n.page_info)==null?void 0:l.total_items)||0,pageSize:((s=n==null?void 0:n.page_info)==null?void 0:s.page_size)||10},totalCount:(n==null?void 0:n.total_count)||0};return d(o,(f=(m=(c=a.getConfig().models)==null?void 0:c.ProductSearchResult)==null?void 0:m.transformer)==null?void 0:f.call(m,e))}function oe(e){const n=e==null?void 0:e.attributeMetadata;return{sortable:(n==null?void 0:n.sortable)||[],filterableInSearch:(n==null?void 0:n.filterableInSearch)||[]}}const le=e=>{var n,o;return((o=(n=e==null?void 0:e.productSearch)==null?void 0:n.items)==null?void 0:o.reduce((i,r)=>{if(!(r!=null&&r.productView))return i;const l=ee(r.productView);return l&&i.push(l),i},[]))||[]};export{ie as a,oe as b,ee as c,le as t};
|
|
4
4
|
//# sourceMappingURL=api.js.map
|
package/chunks/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: data?.price?.regular?.amount?.currency || '',\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.regular?.amount?.currency || '',\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.regular?.amount?.currency || '',\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { ProductSearchResult } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\nexport function transformProductSearchResponse(data: any): ProductSearchResult {\n const productSearch = data?.productSearch;\n const transformedResponse: ProductSearchResult = {\n facets: productSearch?.facets || [],\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n };\n return transformedResponse;\n}\n\nexport function transformAttributeMetadata(data: any): any {\n const attributeMetadata = data?.attributeMetadata;\n const transformedResponse = {\n sortable: attributeMetadata?.sortable || [],\n filterableInSearch: attributeMetadata?.filterableInSearch || [],\n };\n return transformedResponse;\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n"],"names":["transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","productSearch","product","transformAttributeMetadata","attributeMetadata","transformSearchResultProducts","searchResponse","returnedProductList","productItem","transformed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","sources":["/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: data?.price?.regular?.amount?.currency || '',\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.regular?.amount?.currency || '',\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.regular?.amount?.currency || '',\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\nexport function transformProductSearchResponse(data: any): ProductSearchResult {\n const productSearch = data?.productSearch;\n const transformedResponse: ProductSearchResult = {\n facets: productSearch?.facets || [],\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport function transformAttributeMetadata(data: any): any {\n const attributeMetadata = data?.attributeMetadata;\n const transformedResponse = {\n sortable: attributeMetadata?.sortable || [],\n filterableInSearch: attributeMetadata?.filterableInSearch || [],\n };\n return transformedResponse;\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n"],"names":["transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","productSearch","transformedResponse","product","transformAttributeMetadata","attributeMetadata","transformSearchResultProducts","searchResponse","returnedProductList","productItem","transformed"],"mappings":"qFAYO,MAAMA,GAAoBC,GAA8B,uGAE7D,GAAI,CAACA,EACH,MAAO,CACL,GAAI,GACJ,KAAM,GACN,IAAK,GACL,iBAAkB,GAClB,IAAK,GACL,OAAQ,GACR,UAAW,GACX,aAAc,GACd,gBAAiB,GACjB,SAAU,GACV,MAAO,CAAA,EACP,OAAQ,CAAA,EACR,YAAa,GACb,WAAY,GACZ,aAAc,CAAA,EACd,iBAAkB,GAClB,MAAO,OACP,WAAY,OACZ,QAAS,GACT,SAAU,EAAA,EAId,MAAMC,EAAqB,CACzB,IAAID,GAAA,YAAAA,EAAM,KAAM,GAChB,MAAMA,GAAA,YAAAA,EAAM,OAAQ,GACpB,KAAKA,GAAA,YAAAA,EAAM,MAAO,GAClB,kBAAkBA,GAAA,YAAAA,EAAM,mBAAoB,GAC5C,KAAKA,GAAA,YAAAA,EAAM,MAAO,GAClB,QAAQA,GAAA,YAAAA,EAAM,SAAU,GACxB,WAAWA,GAAA,YAAAA,EAAM,YAAa,GAC9B,cAAcA,GAAA,YAAAA,EAAM,eAAgB,GACpC,iBAAiBA,GAAA,YAAAA,EAAM,kBAAmB,GAC1C,UAAUA,GAAA,YAAAA,EAAM,WAAY,GAC5B,OAAOA,GAAA,YAAAA,EAAM,QAAS,CAAA,EACtB,SACEE,EAAAF,GAAA,YAAAA,EAAM,SAAN,YAAAE,EAAc,IAAKC,IAAgB,CACjC,MAAOA,EAAM,OAAS,GACtB,MAAOA,EAAM,OAAS,CAAA,EACtB,IAAKA,EAAM,KAAO,EAAA,MACb,CAAA,EACT,aAAaH,GAAA,YAAAA,EAAM,cAAe,GAClC,YAAYA,GAAA,YAAAA,EAAM,aAAc,GAChC,cAAcA,GAAA,YAAAA,EAAM,eAAgB,CAAA,EACpC,kBAAkBA,GAAA,YAAAA,EAAM,mBAAoB,GAC5C,MAAOA,EAAK,MACR,CACE,MAAO,CACL,OAAQ,CACN,QAAOI,GAAAC,GAAAC,EAAAN,GAAA,YAAAA,EAAM,QAAN,YAAAM,EAAa,QAAb,YAAAD,EAAoB,SAApB,YAAAD,EAA4B,QAAS,EAC5C,WAAUG,GAAAC,GAAAC,EAAAT,GAAA,YAAAA,EAAM,QAAN,YAAAS,EAAa,QAAb,YAAAD,EAAoB,SAApB,YAAAD,EAA4B,WAAY,EAAA,CACpD,EAEF,QAAS,CACP,OAAQ,CACN,QAAOG,GAAAC,GAAAC,EAAAZ,GAAA,YAAAA,EAAM,QAAN,YAAAY,EAAa,UAAb,YAAAD,EAAsB,SAAtB,YAAAD,EAA8B,QAAS,EAC9C,WAAUG,GAAAC,GAAAC,EAAAf,GAAA,YAAAA,EAAM,QAAN,YAAAe,EAAa,UAAb,YAAAD,EAAsB,SAAtB,YAAAD,EAA8B,WAAY,EAAA,CACtD,EAEF,QAAOG,EAAAhB,GAAA,YAAAA,EAAM,QAAN,YAAAgB,EAAa,QAAS,CAAA,CAAC,EAEhC,OACJ,WAAYhB,GAAA,MAAAA,EAAM,WACd,CACE,QAAS,CACP,MAAO,CACL,OAAQ,CACN,QAAOiB,GAAAC,GAAAC,GAAAC,EAAApB,GAAA,YAAAA,EAAM,aAAN,YAAAoB,EAAkB,UAAlB,YAAAD,EAA2B,QAA3B,YAAAD,EAAkC,SAAlC,YAAAD,EAA0C,QAAS,EAC1D,WAAUI,GAAAC,GAAAC,GAAAC,EAAAxB,GAAA,YAAAA,EAAM,aAAN,YAAAwB,EAAkB,UAAlB,YAAAD,EAA2B,QAA3B,YAAAD,EAAkC,SAAlC,YAAAD,EAA0C,WAAY,EAAA,CAClE,EAEF,QAAS,CACP,OAAQ,CACN,QAAOI,GAAAC,GAAAC,GAAAC,EAAA5B,GAAA,YAAAA,EAAM,aAAN,YAAA4B,EAAkB,UAAlB,YAAAD,EAA2B,UAA3B,YAAAD,EAAoC,SAApC,YAAAD,EAA4C,QAAS,EAC5D,WAAUI,GAAAC,GAAAC,GAAAC,EAAAhC,GAAA,YAAAA,EAAM,aAAN,YAAAgC,EAAkB,UAAlB,YAAAD,EAA2B,UAA3B,YAAAD,EAAoC,SAApC,YAAAD,EAA4C,WAAY,EAAA,CACpE,CACF,EAEF,QAAS,CACP,MAAO,CACL,OAAQ,CACN,QAAOI,GAAAC,GAAAC,GAAAC,EAAApC,GAAA,YAAAA,EAAM,aAAN,YAAAoC,EAAkB,UAAlB,YAAAD,EAA2B,QAA3B,YAAAD,EAAkC,SAAlC,YAAAD,EAA0C,QAAS,EAC1D,WAAUI,GAAAC,GAAAC,GAAAC,EAAAxC,GAAA,YAAAA,EAAM,aAAN,YAAAwC,EAAkB,UAAlB,YAAAD,EAA2B,QAA3B,YAAAD,EAAkC,SAAlC,YAAAD,EAA0C,WAAY,EAAA,CAClE,EAEF,QAAS,CACP,OAAQ,CACN,QAAOI,GAAAC,GAAAC,GAAAC,EAAA5C,GAAA,YAAAA,EAAM,aAAN,YAAA4C,EAAkB,UAAlB,YAAAD,EAA2B,UAA3B,YAAAD,EAAoC,SAApC,YAAAD,EAA4C,QAAS,EAC5D,WAAUI,GAAAC,GAAAC,GAAAC,EAAAhD,GAAA,YAAAA,EAAM,aAAN,YAAAgD,EAAkB,UAAlB,YAAAD,EAA2B,UAA3B,YAAAD,EAAoC,SAApC,YAAAD,EAA4C,WAAY,EAAA,CACpE,CACF,CACF,EAEF,OACJ,SAAS7C,GAAA,YAAAA,EAAM,UAAW,GAC1B,UAAUA,GAAA,YAAAA,EAAM,aAAc,EAAA,EAGhC,OAAOiD,EACLhD,GACAiD,GAAAC,GAAAC,EAAAC,EAAO,UAAA,EAAY,SAAnB,YAAAD,EAA2B,UAA3B,YAAAD,EAAoC,cAApC,YAAAD,EAAA,KAAAC,EAAkDnD,EAAI,CAE1D,ECvGO,SAASsD,GAA+BtD,EAAgC,mBAC7E,MAAMuD,EAAgBvD,GAAA,YAAAA,EAAM,cACtBwD,EAA2C,CAC/C,QAAQD,GAAA,YAAAA,EAAe,SAAU,CAAA,EACjC,OAAOA,GAAA,YAAAA,EAAe,MAAM,IAAKE,GAAiB1D,GAAiB0D,GAAA,YAAAA,EAAS,WAAW,KAAM,CAAA,EAC7F,SAAU,CACR,cAAavD,EAAAqD,GAAA,YAAAA,EAAe,YAAf,YAAArD,EAA0B,eAAgB,EACvD,aAAYI,EAAAiD,GAAA,YAAAA,EAAe,YAAf,YAAAjD,EAA0B,cAAe,EACrD,aAAYD,EAAAkD,GAAA,YAAAA,EAAe,YAAf,YAAAlD,EAA0B,cAAe,EACrD,WAAUD,EAAAmD,GAAA,YAAAA,EAAe,YAAf,YAAAnD,EAA0B,YAAa,EAAA,EAEnD,YAAYmD,GAAA,YAAAA,EAAe,cAAe,CAAA,EAE5C,OAAON,EACLO,GACAjD,GAAAC,GAAAC,EAAA4C,EAAO,UAAA,EAAY,SAAnB,YAAA5C,EAA2B,sBAA3B,YAAAD,EAAgD,cAAhD,YAAAD,EAAA,KAAAC,EAA8DR,EAAI,CAEtE,CAEO,SAAS0D,GAA2B1D,EAAgB,CACzD,MAAM2D,EAAoB3D,GAAA,YAAAA,EAAM,kBAKhC,MAJ4B,CAC1B,UAAU2D,GAAA,YAAAA,EAAmB,WAAY,CAAA,EACzC,oBAAoBA,GAAA,YAAAA,EAAmB,qBAAsB,CAAA,CAAC,CAGlE,CAEO,MAAMC,GAAiCC,GAAA,SAC5C,QAAAvD,GAAAJ,EAAA2D,GAAA,YAAAA,EAAgB,gBAAhB,YAAA3D,EAA+B,QAA/B,YAAAI,EAAsC,OAAkB,CAACwD,EAAqBC,IAAgB,CAC5F,GAAI,EAACA,GAAA,MAAAA,EAAa,aAAa,OAAOD,EAEtC,MAAME,EAAcjE,GAAiBgE,EAAY,WAAW,EAC5D,OAAIC,GACFF,EAAoB,KAAKE,CAAW,EAG/BF,CACT,EAAG,CAAA,KAAO,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"productSearch.js","sources":["/@dropins/storefront-product-discovery/src/api/initialize/initialize.ts","/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/api/productSearch/graphql/productSearch.graphql.ts","/@dropins/storefront-product-discovery/src/api/productSearch/productSearch.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Initializer, Model } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n\n models?: {\n Product?: Model<Product>\n }\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/plp/api';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/productSearch.graphql';\nimport { ProductSearchResponse } from '@/plp/types/api/productSearch';\n\nexport const productSearch = async (variables: any): Promise<ProductSearchResponse | null> => {\n return fetchGraphQl(PRODUCT_SEARCH_QUERY, { method: 'GET', variables }).then(({ errors, data }) => {\n if (errors && !data) {\n console.log('error', errors);\n throw new Error('Error fetching product search');\n } else {\n return data;\n }\n });\n};\n"],"names":["initialize","Initializer","config","defaultConfig","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","PRODUCT_SEARCH_QUERY","ProductView","Facet","productSearch","variables","errors","data"],"mappings":"
|
|
1
|
+
{"version":3,"file":"productSearch.js","sources":["/@dropins/storefront-product-discovery/src/api/initialize/initialize.ts","/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/api/productSearch/graphql/productSearch.graphql.ts","/@dropins/storefront-product-discovery/src/api/productSearch/productSearch.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Initializer, Model } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\nimport { ProductSearchResult } from '@/plp/data/models';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n\n models?: {\n Product?: Model<Product>\n ProductSearchResult?: Model<ProductSearchResult>\n }\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/plp/api';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/productSearch.graphql';\nimport { ProductSearchResponse } from '@/plp/types/api/productSearch';\n\nexport const productSearch = async (variables: any): Promise<ProductSearchResponse | null> => {\n return fetchGraphQl(PRODUCT_SEARCH_QUERY, { method: 'GET', variables }).then(({ errors, data }) => {\n if (errors && !data) {\n console.log('error', errors);\n throw new Error('Error fetching product search');\n } else {\n return data;\n }\n });\n};\n"],"names":["initialize","Initializer","config","defaultConfig","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","PRODUCT_SEARCH_QUERY","ProductView","Facet","productSearch","variables","errors","data"],"mappings":"4KAuBO,MAAMA,EAAa,IAAIC,EAAyB,CACrD,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAgB,CAAA,EAEtBH,EAAW,OAAO,UAAU,CAAE,GAAGG,EAAe,GAAGD,EAAQ,CAC7D,EAEA,UAAW,IAAM,CAAA,CACnB,CAAC,EAEYA,EAASF,EAAW,OCtBpB,CACX,YAAAI,EACA,sBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EAAI,IAAIC,EAAA,EAAe,WAAA,ECPjBC,EAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsCvCC,CAAW;AAAA,IACXC,CAAK;AAAA,ECrCIC,EAAgB,MAAOC,GAC3BP,EAAaG,EAAsB,CAAE,OAAQ,MAAO,UAAAI,EAAW,EAAE,KAAK,CAAC,CAAE,OAAAC,EAAQ,KAAAC,KAAW,CACjG,GAAID,GAAU,CAACC,EACb,cAAQ,IAAI,QAASD,CAAM,EACrB,IAAI,MAAM,+BAA+B,EAE/C,OAAOC,CAEX,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as o,jsxs as N}from"@dropins/tools/preact-jsx-runtime.js";import*as P from"@dropins/tools/preact-compat.js";import{useState as S,useCallback as pe,useEffect as ge}from"@dropins/tools/preact-compat.js";import{classes as _,VComponent as p,Slot as C}from"@dropins/tools/lib.js";import{Skeleton as Se,SkeletonRow as D,InLineAlert as _e,Icon as Pe,Pagination as we,Picker as Le,PriceRange as v,Image as Ce}from"@dropins/tools/components.js";import{p as ke}from"../chunks/productSearch.js";import{a as ye,b as Ee,c as xe}from"../chunks/api.js";import{u as Re,P as w,a as Ne,b as Ae,c as Ie,d as De,e as Ue,s as qe}from"../chunks/acdlEvents.js";import{a as ze}from"../chunks/attributeMetadata.js";/* empty css *//* empty css *//* empty css *//* empty css */import{events as $}from"@dropins/tools/event-bus.js";import{useText as Fe,Text as He}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const $e=t=>P.createElement("svg",{id:"Icon_Warning_Base",width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},P.createElement("g",{clipPath:"url(#clip0_841_1324)"},P.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),P.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"})),P.createElement("defs",null,P.createElement("clipPath",{id:"clip0_841_1324"},P.createElement("rect",{width:24,height:21,fill:"white",transform:"translate(0 1.5)"})))),Me=()=>o("div",{className:"dropin-product-item-card dropin-product-item-card-skeleton",children:N(Se,{className:"dropin-product-item-card__skeleton dropin-product-item-card__image-container",children:[o(D,{fullWidth:!0,className:"dropin-product-item-card__skeleton__image"}),N("div",{className:"dropin-product-item-card__content dropin-product-item-card__skeleton__content",children:[o(D,{fullWidth:!0,size:"large",className:"dropin-product-item-card__skeleton__item"}),o(D,{fullWidth:!0,size:"xsmall",className:"dropin-product-item-card__skeleton__item"}),o(D,{fullWidth:!0,size:"small",className:"dropin-product-item-card__skeleton__item"})]})," "]})}),ve=({className:t,image:r,titleNode:n,price:d,sku:i,actionButton:a,swatches:l,initialized:u=!1,...A})=>u?N("div",{...A,className:_(["dropin-product-item-card",t]),children:[o("div",{className:"dropin-product-item-card__image-container",children:r&&o(p,{node:r,className:_(["dropin-product-item-card__image"])})}),N("div",{className:"dropin-product-item-card__content",children:[n&&o(p,{node:n,className:_(["dropin-product-item-card__title"])}),i&&o(p,{node:i,className:_(["dropin-product-item-card__sku"])}),d&&o("div",{className:"dropin-product-item-card__price",children:o(p,{node:d,className:_(["dropin-product-item-card__price"])})}),l&&o("div",{className:"dropin-product-item-card__swatches",children:o(p,{node:l,className:_(["dropin-product-item-card__swatches"])})}),a&&o("div",{className:"dropin-product-item-card__action",children:o(p,{node:a,className:_(["dropin-product-item-card__action"])})})]})]}):o(Me,{});function Oe(t){var i;let r="";try{r=self.crypto.randomUUID(),Re(w,r,t.phrase||"",t.filter||[],t.pageSize||0,t.currentPage||0,t.sort||[]),Ne(w)}catch(a){console.error("Error collecting data:",a)}const n={attribute:"visibility",in:["Search","Catalog, Search"]},d=structuredClone(t);return(i=d.filter)==null||i.push(n),ke(d).then(a=>{const l=ye(a);try{Ae(w,r,l),Ie(w),t.phrase?De(w):Ue(w)}catch(u){console.error("Error collecting data:",u)}return l}).catch(a=>{throw console.error("Error fetching product search:",a),new Error("Error fetching product search.")}).finally(()=>{})}function We(){return ze().then(t=>Ee(t)).catch(t=>{throw console.error("Error fetching attribute metadata:",t),new Error("Error fetching attribute metadata.")}).finally(()=>{})}const j=(t,r)=>r?{text:t.positionLabel,value:"position_ASC"}:{text:t.relevanceLabel,value:"relevance_DESC"},je=(t,r,n)=>{const d=j(r,n),i=t.reduce((a,l)=>(l.attribute!=="position"&&l.attribute!=="relevance"&&(l.attribute==="price"?(a.push({text:r.sortASC,value:`${l.attribute}_ASC`}),a.push({text:r.sortDESC,value:`${l.attribute}_DESC`})):a.push({text:l.label,value:`${l.attribute}_DESC`})),a),[]);return i.push(d),{options:i,default:d}},U=t=>{const r=t.indexOf("_");return[{attribute:t.substring(0,r),direction:t.substring(r+1)==="ASC"?"ASC":"DESC"}]},Te=t=>t.length>0?`${t[0].attribute}_${t[0].direction}`:"",Qe=(t,r)=>{const n=t.findIndex(d=>d.value===r);return n>-1?t[n]:null},Ze=({header:t,productList:r,footer:n})=>N("div",{className:"product-discovery-product-list",children:[t&&o(p,{className:"product-discovery-product-list__header",node:t}),o("div",{className:"product-discovery-product-list__grid",children:r&&o(p,{node:r})}),n&&o(p,{className:"product-discovery-product-list__pagination",node:n})]}),Be=({alertMessage:t=""})=>o("div",{className:_(["product-discovery-search-alert-message__wrapper"]),children:o("div",{className:"product-discovery-search-alert-message__content",children:o(_e,{heading:t,type:"warning",icon:o(Pe,{source:$e,size:"24"}),onDismiss:void 0})})}),T={search:"q",search_query:"search_query",pagination:"p",sort:"product_list_order",page_size:"page_size"},k=t=>{const n=Q().get(t);return n||""},Q=()=>{const t=window.location.search;return new URLSearchParams(t)},Ke=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);t===1?n.delete("p"):n.set("p",t.toString()),q(r.pathname,n)},Ge=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("product_list_order",t),q(r.pathname,n)},Je=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("q",t),q(r.pathname,n)},q=(t,r)=>{r.toString()===""?window.history.pushState({},"",`${t}`):window.history.pushState({},"",`${t}?${r.toString()}`)},O=t=>{var d;const r=Q(),n=[];for(const[i,a]of r.entries())if(t.includes(i)&&!Object.values(T).includes(i))if(a.includes("--")){const l=a.split("--"),u={attribute:i,range:{from:Number(l[0]),to:Number(l[1])}};n.push(u)}else{const l=n.findIndex(u=>u.attribute==i);if(l!==-1)(d=n[l].in)==null||d.push(a);else{const u={attribute:i,in:[a]};n.push(u)}}return n},Xe=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);for(const d of r.searchParams.keys())Object.values(T).includes(d)||n.delete(d);t.forEach(d=>{const i=d.attribute;if(d.range){const a=d.range;k(i)?(n.delete(i),n.append(i,`${a.from}--${a.to}`)):n.append(i,`${a.from}--${a.to}`)}else{const a=d.in||[],l=n.getAll(i);a.map(u=>{l.includes(u)||n.append(i,u)})}}),q(r.pathname,n)},W=t=>new DOMParser().parseFromString(t,"text/html").documentElement.textContent,ht=({minQueryLength:t=3,slots:r,pageSize:n=12,routeProduct:d,categoryPath:i})=>{const a=Fe({sortLabel:"Search.PLP.SortDropdown.title",relevanceLabel:"Search.PLP.SortDropdown.relevanceLabel",sortASC:"Search.PLP.SortDropdown.sortASC",sortDESC:"Search.PLP.SortDropdown.sortDESC",minQueryLength:o(He,{id:"Search.PLP.Warning.minQueryLength",fields:{minQueryLength:t}}),noResults:"Search.PLP.Warning.noResults",searchError:"Search.PLP.Warning.searchError",positionLabel:"Search.PLP.SortDropdown.positionLabel"}),[l,u]=S([]),[A,Z]=S(),[B,K]=S(1),[G,L]=S(!1),[J,y]=S(a.noResults),I=j(a,i),[X,z]=S(),[Y,b]=S([]),V=[...Array(n).keys()].map(()=>{const e=xe({});return e.initialized=!1,e}),[E,ee]=S(V),F=e=>{qe(e.sku,w)},te=e=>{x({currentPage:e})},re=e=>{Z(e),Ke(e)},ne=e=>{const c=U(e);z(e),x({sort:c})},oe=e=>{var h;const c=k("product_list_order"),m=U(c||I.value),s={phrase:i?"":(e==null?void 0:e.phrase)||k("q"),pageSize:(e==null?void 0:e.pageSize)||n,currentPage:(e==null?void 0:e.currentPage)||A,filter:(e==null?void 0:e.filter)||O(Y),sort:(e==null?void 0:e.sort)||m};return(e!=null&&e.phrase||e!=null&&e.filter||e!=null&&e.sort||e!=null&&e.pageSize)&&(s.currentPage=1,e!=null&&e.phrase&&(s.filter=[],s.sort=U(I.value),z(I.value))),i?(s.phrase="",s.filter=(h=s.filter)==null?void 0:h.concat({attribute:"categoryPath",eq:i})):s.phrase=(e==null?void 0:e.phrase)||k("q")||"",s},ce=e=>{if(!i){const s=e.phrase||"";Je(s)}const c=e.filter||[];Xe(c);const m=Te(e.sort||[]);Ge(m)},se=e=>We().then(c=>{b(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute));const m=je(c==null?void 0:c.sortable,a,i);u(m.options);const s=Qe(m.options,e||m.default.value);return z(s.value),O(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute))}).catch(()=>{L(!0),y(a.searchError)}),x=e=>{var m;const c=oe(e);if(ce(c),!i&&(((m=c==null?void 0:c.phrase)==null?void 0:m.length)||0)<t)L(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",(c==null?void 0:c.phrase)||"")),H();else return L(!1),Oe(c).then(s=>{var h,f;$.emit("search/result",{result:s,request:c}),(s==null?void 0:s.totalCount)===0&&(s==null?void 0:s.items.length)===0?(L(!0),y(a.noResults)):(ee(s==null?void 0:s.items.map(g=>(g.initialized=!0,g))),re(((h=s==null?void 0:s.pageInfo)==null?void 0:h.currentPage)||1),K(((f=s==null?void 0:s.pageInfo)==null?void 0:f.totalPages)||1))}).catch(()=>{L(!0),y(a.searchError),H()}).finally(()=>{})},ae=pe(e=>{x(e)},[]),H=()=>{$.emit("search/result",{result:{},request:{}})};ge(()=>{const e=k("q"),c=k("product_list_order")||I.value;se(c).then(s=>{i?x({filter:[{attribute:"categoryPath",eq:i}]}):e!=null&&e.length&&e.length<t?(L(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",e)),H()):x({filter:s})});const m=$.on("search/request",ae);return()=>{m==null||m.off()}},[]);const ie=e=>o(C,{name:"ProductActions",slot:r==null?void 0:r.ProductActions,context:{product:e}}),de=e=>{var s,h,f,g,R;let c=e.typename==="ComplexProductView"?(s=e.priceRange)==null?void 0:s.minimum.regular.amount.currency:(h=e.price)==null?void 0:h.regular.amount.currency;Intl.supportedValuesOf("currency").indexOf(c||"")===-1&&(c="USD");const m=e.typename==="ComplexProductView"?o(v,{display:"from to",minimumAmount:(f=e.priceRange)==null?void 0:f.minimum.regular.amount.value,maximumAmount:(g=e.priceRange)==null?void 0:g.maximum.regular.amount.value,currency:c}):o(v,{amount:(R=e.price)==null?void 0:R.regular.amount.value,currency:c});return o(C,{name:"ProductPrice",slot:r==null?void 0:r.ProductPrice,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:m}):m})},le=e=>{const c=e.name!==null?W(e.name):"";return o(C,{name:"ProductName",slot:r==null?void 0:r.ProductName,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:c}):c})},me=(e,c)=>{var f,g,R,M;const m={loading:c<8?"eager":"lazy",src:((g=(f=e.images)==null?void 0:f[0])==null?void 0:g.url)||"",alt:((M=(R=e.images)==null?void 0:R[0])==null?void 0:M.label)||"",width:"200",height:"250"},s=e.name!==null?W(e.name):e.sku,h=o(Ce,{class:"product-discovery-product-item__image",...m,"aria-label":s});return o(C,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{product:e,defaultImageProps:m},children:d?o("a",{href:d(e),onClick:()=>F(e),children:h}):h})},ue=()=>o(C,{name:"Header",slot:r==null?void 0:r.Header,context:{productList:E},children:o(Le,{floatingLabel:a.sortLabel,options:l,value:X,required:!0,handleSelect:e=>{const{value:c}=e.target;ne(c)},"data-testid":"product-list-sort-by-picker"})}),he=()=>o(C,{name:"Footer",slot:r==null?void 0:r.Footer,context:{productList:E},children:o(we,{currentPage:A,totalPages:B,onChange:e=>{te(e)}})}),fe=o(Ze,{header:ue(),footer:he(),productList:E==null?void 0:E.map((e,c)=>o(ve,{image:me(e,c),titleNode:le(e),price:de(e),actionButton:ie(e),initialized:e.initialized},e.id||e.sku))});return o("div",{class:"product-discovery-product-list__container",children:G?o(Be,{alertMessage:J}):fe})};export{ht as ProductList,ht as default};
|
|
3
|
+
import{jsx as o,jsxs as N}from"@dropins/tools/preact-jsx-runtime.js";import*as P from"@dropins/tools/preact-compat.js";import{useState as S,useCallback as pe,useEffect as ge}from"@dropins/tools/preact-compat.js";import{classes as _,VComponent as p,Slot as C}from"@dropins/tools/lib.js";import{Skeleton as Se,SkeletonRow as D,InLineAlert as _e,Icon as Pe,Pagination as we,Picker as Le,PriceRange as v,Image as Ce}from"@dropins/tools/components.js";import{p as ke}from"../chunks/productSearch.js";import{a as ye,b as Ee,c as xe}from"../chunks/api.js";import{u as Re,P as w,a as Ne,b as Ae,c as Ie,d as De,e as Ue,s as qe}from"../chunks/acdlEvents.js";import{a as ze}from"../chunks/attributeMetadata.js";/* empty css *//* empty css *//* empty css *//* empty css */import{events as $}from"@dropins/tools/event-bus.js";import{useText as Fe,Text as He}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const $e=t=>P.createElement("svg",{id:"Icon_Warning_Base",width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},P.createElement("g",{clipPath:"url(#clip0_841_1324)"},P.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),P.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"})),P.createElement("defs",null,P.createElement("clipPath",{id:"clip0_841_1324"},P.createElement("rect",{width:24,height:21,fill:"white",transform:"translate(0 1.5)"})))),Me=()=>o("div",{className:"dropin-product-item-card dropin-product-item-card-skeleton",children:N(Se,{className:"dropin-product-item-card__skeleton dropin-product-item-card__image-container",children:[o(D,{fullWidth:!0,className:"dropin-product-item-card__skeleton__image"}),N("div",{className:"dropin-product-item-card__content dropin-product-item-card__skeleton__content",children:[o(D,{fullWidth:!0,size:"large",className:"dropin-product-item-card__skeleton__item"}),o(D,{fullWidth:!0,size:"xsmall",className:"dropin-product-item-card__skeleton__item"}),o(D,{fullWidth:!0,size:"small",className:"dropin-product-item-card__skeleton__item"})]})," "]})}),ve=({className:t,image:r,titleNode:n,price:d,sku:i,actionButton:a,swatches:l,initialized:u=!1,...A})=>u?N("div",{...A,className:_(["dropin-product-item-card",t]),children:[o("div",{className:"dropin-product-item-card__image-container",children:r&&o(p,{node:r,className:_(["dropin-product-item-card__image"])})}),N("div",{className:"dropin-product-item-card__content",children:[n&&o(p,{node:n,className:_(["dropin-product-item-card__title"])}),i&&o(p,{node:i,className:_(["dropin-product-item-card__sku"])}),d&&o("div",{className:"dropin-product-item-card__price",children:o(p,{node:d,className:_(["dropin-product-item-card__price"])})}),l&&o("div",{className:"dropin-product-item-card__swatches",children:o(p,{node:l,className:_(["dropin-product-item-card__swatches"])})}),a&&o("div",{className:"dropin-product-item-card__action",children:o(p,{node:a,className:_(["dropin-product-item-card__action"])})})]})]}):o(Me,{});function Oe(t){var i;let r="";try{r=self.crypto.randomUUID(),Re(w,r,t.phrase||"",t.filter||[],t.pageSize||0,t.currentPage||0,t.sort||[]),Ne(w)}catch(a){console.error("Error collecting data:",a)}const n={attribute:"visibility",in:["Search","Catalog, Search"]},d=structuredClone(t);return(i=d.filter)==null||i.push(n),ke(d).then(a=>{const l=ye(a);try{Ae(w,r,l),Ie(w),t.phrase?De(w):Ue(w)}catch(u){console.error("Error collecting data:",u)}return l}).catch(a=>{throw console.error("Error fetching product search:",a),new Error("Error fetching product search.")}).finally(()=>{})}function We(){return ze().then(t=>Ee(t)).catch(t=>{throw console.error("Error fetching attribute metadata:",t),new Error("Error fetching attribute metadata.")}).finally(()=>{})}const j=(t,r)=>r?{text:t.positionLabel,value:"position_ASC"}:{text:t.relevanceLabel,value:"relevance_DESC"},je=(t,r,n)=>{const d=j(r,n),i=t.reduce((a,l)=>(l.attribute!=="position"&&l.attribute!=="relevance"&&(l.attribute==="price"?(a.push({text:r.sortASC,value:`${l.attribute}_ASC`}),a.push({text:r.sortDESC,value:`${l.attribute}_DESC`})):a.push({text:l.label,value:`${l.attribute}_DESC`})),a),[]);return i.push(d),{options:i,default:d}},U=t=>{const r=t.indexOf("_");return[{attribute:t.substring(0,r),direction:t.substring(r+1)==="ASC"?"ASC":"DESC"}]},Te=t=>t.length>0?`${t[0].attribute}_${t[0].direction}`:"",Qe=(t,r)=>{const n=t.findIndex(d=>d.value===r);return n>-1?t[n]:null},Ze=({header:t,productList:r,footer:n})=>N("div",{className:"product-discovery-product-list",children:[t&&o(p,{className:"product-discovery-product-list__header",node:t}),o("div",{className:"product-discovery-product-list__grid",children:r&&o(p,{node:r})}),n&&o(p,{className:"product-discovery-product-list__pagination",node:n})]}),Be=({alertMessage:t=""})=>o("div",{className:_(["product-discovery-search-alert-message__wrapper"]),children:o("div",{className:"product-discovery-search-alert-message__content",children:o(_e,{heading:t,type:"warning",icon:o(Pe,{source:$e,size:"24"}),onDismiss:void 0})})}),T={search:"q",search_query:"search_query",pagination:"p",sort:"product_list_order",page_size:"page_size"},k=t=>{const n=Q().get(t);return n||""},Q=()=>{const t=window.location.search;return new URLSearchParams(t)},Ke=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);t===1?n.delete("p"):n.set("p",t.toString()),q(r.pathname,n)},Ge=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("product_list_order",t),q(r.pathname,n)},Je=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("q",t),q(r.pathname,n)},q=(t,r)=>{r.toString()===""?window.history.pushState({},"",`${t}`):window.history.pushState({},"",`${t}?${r.toString()}`)},O=t=>{var d;const r=Q(),n=[];for(const[i,a]of r.entries())if(t.includes(i)&&!Object.values(T).includes(i))if(a.includes("--")){const l=a.split("--"),u={attribute:i,range:{from:Number(l[0]),to:Number(l[1])}};n.push(u)}else{const l=n.findIndex(u=>u.attribute==i);if(l!==-1)(d=n[l].in)==null||d.push(a);else{const u={attribute:i,in:[a]};n.push(u)}}return n},Xe=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);for(const d of r.searchParams.keys())Object.values(T).includes(d)||n.delete(d);t.forEach(d=>{const i=d.attribute;if(d.range){const a=d.range;k(i)?(n.delete(i),n.append(i,`${a.from}--${a.to}`)):n.append(i,`${a.from}--${a.to}`)}else{const a=d.in||[],l=n.getAll(i);a.map(u=>{l.includes(u)||n.append(i,u)})}}),q(r.pathname,n)},W=t=>new DOMParser().parseFromString(t,"text/html").documentElement.textContent,ht=({minQueryLength:t=3,slots:r,pageSize:n=12,routeProduct:d,categoryPath:i})=>{const a=Fe({sortLabel:"Search.PLP.SortDropdown.title",relevanceLabel:"Search.PLP.SortDropdown.relevanceLabel",sortASC:"Search.PLP.SortDropdown.sortASC",sortDESC:"Search.PLP.SortDropdown.sortDESC",minQueryLength:o(He,{id:"Search.PLP.Warning.minQueryLength",fields:{minQueryLength:t}}),noResults:"Search.PLP.Warning.noResults",searchError:"Search.PLP.Warning.searchError",positionLabel:"Search.PLP.SortDropdown.positionLabel"}),[l,u]=S([]),[A,Z]=S(),[B,K]=S(1),[G,L]=S(!1),[J,y]=S(a.noResults),I=j(a,i),[X,z]=S(),[Y,b]=S([]),V=[...Array(n).keys()].map(()=>{const e=xe({});return e.initialized=!1,e}),[E,ee]=S(V),F=e=>{qe(e.sku,w)},te=e=>{x({currentPage:e})},re=e=>{Z(e),Ke(e)},ne=e=>{const c=U(e);z(e),x({sort:c})},oe=e=>{var h;const c=k("product_list_order"),m=U(c||I.value),s={phrase:i?"":(e==null?void 0:e.phrase)||k("q"),pageSize:(e==null?void 0:e.pageSize)||n,currentPage:(e==null?void 0:e.currentPage)||A,filter:(e==null?void 0:e.filter)||O(Y),sort:(e==null?void 0:e.sort)||m};return(e!=null&&e.phrase||e!=null&&e.filter||e!=null&&e.sort||e!=null&&e.pageSize)&&(s.currentPage=1,e!=null&&e.phrase&&(s.filter=[],s.sort=U(I.value),z(I.value))),i?(s.phrase="",s.filter=(h=s.filter)==null?void 0:h.concat({attribute:"categoryPath",eq:i})):s.phrase=(e==null?void 0:e.phrase)||k("q")||"",s},ce=e=>{if(!i){const s=e.phrase||"";Je(s)}const c=e.filter||[];Xe(c);const m=Te(e.sort||[]);Ge(m)},se=e=>We().then(c=>{b(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute));const m=je(c==null?void 0:c.sortable,a,i);u(m.options);const s=Qe(m.options,e||m.default.value);return z(s.value),O(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute))}).catch(()=>{L(!0),y(a.searchError)}),x=e=>{var m;const c=oe(e);if(ce(c),!i&&(((m=c==null?void 0:c.phrase)==null?void 0:m.length)||0)<t)L(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",(c==null?void 0:c.phrase)||"")),H();else return L(!1),Oe(c).then(s=>{var h,f;$.emit("search/result",{result:s,request:c}),(s==null?void 0:s.totalCount)===0&&(s==null?void 0:s.items.length)===0?(L(!0),y(a.noResults)):(ee(s==null?void 0:s.items.map(g=>(g.initialized=!0,g))),re(((h=s==null?void 0:s.pageInfo)==null?void 0:h.currentPage)||1),K(((f=s==null?void 0:s.pageInfo)==null?void 0:f.totalPages)||1))}).catch(()=>{L(!0),y(a.searchError),H()}).finally(()=>{})},ae=pe(e=>{x(e)},[]),H=()=>{$.emit("search/result",{result:{},request:{}})};ge(()=>{const e=k("q"),c=k("product_list_order")||I.value;se(c).then(s=>{i?x({filter:[{attribute:"categoryPath",eq:i}]}):e!=null&&e.length&&e.length<t?(L(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",e)),H()):x({filter:s})});const m=$.on("search/request",ae);return()=>{m==null||m.off()}},[]);const ie=e=>o(C,{name:"ProductActions",slot:r==null?void 0:r.ProductActions,context:{product:e}}),de=e=>{var s,h,f,g,R;let c=e.typename==="ComplexProductView"?(s=e.priceRange)==null?void 0:s.minimum.regular.amount.currency:(h=e.price)==null?void 0:h.regular.amount.currency;Intl.supportedValuesOf("currency").indexOf(c||"")===-1&&(c="USD");const m=e.typename==="ComplexProductView"?o(v,{display:"from to",minimumAmount:(f=e.priceRange)==null?void 0:f.minimum.regular.amount.value,maximumAmount:(g=e.priceRange)==null?void 0:g.maximum.regular.amount.value,currency:c}):o(v,{amount:(R=e.price)==null?void 0:R.regular.amount.value,currency:c});return o(C,{name:"ProductPrice",slot:r==null?void 0:r.ProductPrice,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:m}):m})},le=e=>{const c=e.name!==null?W(e.name):"";return o(C,{name:"ProductName",slot:r==null?void 0:r.ProductName,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:c}):c})},me=(e,c)=>{var f,g,R,M;const m={loading:c<8?"eager":"lazy",src:((g=(f=e.images)==null?void 0:f[0])==null?void 0:g.url)||"",alt:((M=(R=e.images)==null?void 0:R[0])==null?void 0:M.label)||"",width:200,height:250,params:{width:200}},s=e.name!==null?W(e.name):e.sku,h=o(Ce,{class:"product-discovery-product-item__image",...m,"aria-label":s});return o(C,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{product:e,defaultImageProps:m},children:d?o("a",{href:d(e),onClick:()=>F(e),children:h}):h})},ue=()=>o(C,{name:"Header",slot:r==null?void 0:r.Header,context:{productList:E},children:o(Le,{floatingLabel:a.sortLabel,options:l,value:X,required:!0,handleSelect:e=>{const{value:c}=e.target;ne(c)},"data-testid":"product-list-sort-by-picker"})}),he=()=>o(C,{name:"Footer",slot:r==null?void 0:r.Footer,context:{productList:E},children:o(we,{currentPage:A,totalPages:B,onChange:e=>{te(e)}})}),fe=o(Ze,{header:ue(),footer:he(),productList:E==null?void 0:E.map((e,c)=>o(ve,{image:me(e,c),titleNode:le(e),price:de(e),actionButton:ie(e),initialized:e.initialized},e.id||e.sku))});return o("div",{class:"product-discovery-product-list__container",children:G?o(Be,{alertMessage:J}):fe})};export{ht as ProductList,ht as default};
|
|
4
4
|
//# sourceMappingURL=ProductList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","../../node_modules/@adobe-commerce/elsie/src/components/ProductItemCard/ProductItemCardSkeleton.tsx","../../node_modules/@adobe-commerce/elsie/src/components/ProductItemCard/ProductItemCard.tsx","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/getProductSearch.ts","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/getAttributeMetadata.ts","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/sortUtils.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/urlUtils.ts","/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/containers/ProductList/ProductList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\" }))));\nexport default SvgWarning;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCardSkeleton.css';\n\nexport const ProductItemCardSkeleton: FunctionComponent = () => {\n return (\n <div className=\"dropin-product-item-card dropin-product-item-card-skeleton\">\n <Skeleton className=\"dropin-product-item-card__skeleton dropin-product-item-card__image-container\">\n <SkeletonRow\n fullWidth={true}\n className=\"dropin-product-item-card__skeleton__image\"\n />\n <div className=\"dropin-product-item-card__content dropin-product-item-card__skeleton__content\">\n <SkeletonRow\n fullWidth={true}\n size=\"large\"\n className=\"dropin-product-item-card__skeleton__item\"\n />\n <SkeletonRow\n fullWidth={true}\n size=\"xsmall\"\n className=\"dropin-product-item-card__skeleton__item\"\n />\n <SkeletonRow\n fullWidth={true}\n size=\"small\"\n className=\"dropin-product-item-card__skeleton__item\"\n />\n </div>{' '}\n </Skeleton>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport { ProductItemCardSkeleton } from '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCardSkeleton';\nimport '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCard.css';\n\nexport interface ProductItemCardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n image?: VNode;\n titleNode?: VNode;\n price?: VNode;\n sku?: VNode;\n actionButton?: VNode;\n swatches?: VNode;\n initialized?: boolean;\n}\n\nexport const ProductItemCard: FunctionComponent<ProductItemCardProps> = ({\n className,\n image,\n titleNode,\n price,\n sku,\n actionButton,\n swatches,\n initialized = false,\n ...props\n}) => {\n if (!initialized) {\n return <ProductItemCardSkeleton />;\n }\n return (\n <div\n {...props}\n className={classes(['dropin-product-item-card', className])}\n >\n <div className=\"dropin-product-item-card__image-container\">\n {image && (\n <VComponent\n node={image}\n className={classes(['dropin-product-item-card__image'])}\n />\n )}\n </div>\n <div className=\"dropin-product-item-card__content\">\n {titleNode && (\n <VComponent\n node={titleNode}\n className={classes(['dropin-product-item-card__title'])}\n />\n )}\n {sku && (\n <VComponent\n node={sku}\n className={classes(['dropin-product-item-card__sku'])}\n />\n )}\n {price && (\n <div className=\"dropin-product-item-card__price\">\n <VComponent\n node={price}\n className={classes(['dropin-product-item-card__price'])}\n />\n </div>\n )}\n {swatches && (\n <div className=\"dropin-product-item-card__swatches\">\n <VComponent\n node={swatches}\n className={classes(['dropin-product-item-card__swatches'])}\n />\n </div>\n )}\n {actionButton && (\n <div className=\"dropin-product-item-card__action\">\n <VComponent\n node={actionButton}\n className={classes(['dropin-product-item-card__action'])}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { productSearch as productSearchQuery } from '@/plp/api';\nimport { SearchVariables } from '@/plp/data/models';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport {\n PLP_UNIT_ID,\n categoryResultsView,\n searchRequestSent,\n searchResponseReceived,\n searchResultsView,\n updateSearchInputCtx,\n updateSearchResultsCtx,\n} from '@/plp/utils/acdlEvents';\n\nexport function getProductSearch(variables: SearchVariables): any {\n let searchRequestId = '';\n // ====== data collection =====\n try {\n searchRequestId = self.crypto.randomUUID();\n updateSearchInputCtx(\n PLP_UNIT_ID,\n searchRequestId,\n variables.phrase || '',\n variables.filter || [],\n variables.pageSize || 0,\n variables.currentPage || 0,\n variables.sort || [],\n );\n searchRequestSent(PLP_UNIT_ID);\n } catch (e) {\n console.error('Error collecting data:', e);\n }\n // =============================\n\n //Add default visibility filter\n const defaultVisibilityFilter = { attribute: 'visibility', in: ['Search', 'Catalog, Search'] };\n const searchObj = structuredClone(variables);\n searchObj.filter?.push(defaultVisibilityFilter);\n\n return productSearchQuery(searchObj)\n .then((value: any | null) => {\n const transformedResponse = transformProductSearchResponse(value);\n\n try {\n // ===== data collection =====\n updateSearchResultsCtx(PLP_UNIT_ID, searchRequestId, transformedResponse);\n searchResponseReceived(PLP_UNIT_ID);\n // TODO: Publish view events base on search type\n if (variables.phrase) {\n searchResultsView(PLP_UNIT_ID);\n } else {\n categoryResultsView(PLP_UNIT_ID);\n }\n // ============================\n } catch (e) {\n console.error('Error collecting data:', e);\n }\n\n return transformedResponse;\n })\n .catch((error: any) => {\n console.error('Error fetching product search:', error);\n throw new Error('Error fetching product search.');\n })\n .finally(() => {});\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { attributeMetadata as attributeMetadataQuery } from '@/plp/api';\nimport { transformAttributeMetadata } from '@/plp/data/transforms';\n\nexport function getAttributeMetadata(): any {\n return attributeMetadataQuery()\n .then((value: any | null) => {\n return transformAttributeMetadata(value);\n })\n .catch((error: any) => {\n console.error('Error fetching attribute metadata:', error);\n throw new Error('Error fetching attribute metadata.');\n })\n .finally(() => {});\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { SortOrder } from '@/plp/data/models/api';\nconst getDefaultSort = (translations: any, categoryPath?: string): any => {\n if (categoryPath) {\n return { text: translations.positionLabel, value: 'position_ASC' };\n }\n return { text: translations.relevanceLabel, value: 'relevance_DESC' };\n};\n\nconst setSortOptions = (sortOptions: any, translations: any, categoryPath?: string): any => {\n const defaultSort = getDefaultSort(translations, categoryPath);\n const finalSortOptions = sortOptions.reduce((resultOptions: any, option: any) => {\n if (option.attribute !== 'position' && option.attribute !== 'relevance') {\n if (option.attribute === 'price') {\n resultOptions.push({\n text: translations.sortASC,\n value: `${option.attribute}_ASC`,\n });\n resultOptions.push({\n text: translations.sortDESC,\n value: `${option.attribute}_DESC`,\n });\n } else {\n resultOptions.push({\n text: option.label,\n value: `${option.attribute}_DESC`,\n });\n }\n }\n return resultOptions;\n }, []);\n finalSortOptions.push(defaultSort);\n return { options: finalSortOptions, default: defaultSort };\n};\n\nconst getSortSearchVariables = (sortValue: string): SortOrder[] => {\n const index = sortValue.indexOf('_');\n const newSort: SortOrder[] = [\n {\n attribute: sortValue.substring(0, index) as string,\n direction: sortValue.substring(index + 1) === 'ASC' ? 'ASC' : 'DESC',\n },\n ];\n return newSort;\n};\n\nconst getSortValue = (sort: SortOrder[]): string => {\n if (sort.length > 0) {\n return `${sort[0].attribute}_${sort[0].direction}`;\n }\n return '';\n};\n\nconst getPickerOption = (options: any, value: string): any => {\n const index = options.findIndex((option: any) => option.value === value);\n if (index > -1) {\n return options[index];\n }\n return null;\n};\n\nexport { getDefaultSort, getSortSearchVariables, setSortOptions, getPickerOption, getSortValue };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n header?: VNode;\n productList?: VNode[];\n footer?: VNode;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ header, productList, footer }) => {\n return (\n <div className={'product-discovery-product-list'}>\n {header && <VComponent className=\"product-discovery-product-list__header\" node={header} />}\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n {footer && <VComponent className=\"product-discovery-product-list__pagination\" node={footer} />}\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst nonFilterKeys = {\n search: 'q',\n search_query: 'search_query',\n pagination: 'p',\n sort: 'product_list_order',\n page_size: 'page_size',\n};\n\nconst getValueFromUrl = (param: string) => {\n const params = getSearchParams();\n const filter = params.get(param);\n if (filter) {\n return filter;\n }\n return '';\n};\n\nconst getSearchParams = () => {\n const search = window.location.search;\n return new URLSearchParams(search);\n};\n\nconst updateUrlPagination = (pageNumber: number) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n if (pageNumber === 1) {\n params.delete('p');\n } else {\n params.set('p', pageNumber.toString());\n }\n setWindowHistory(url.pathname, params);\n};\n\nconst updateUrlSort = (sortOption: string) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n params.set('product_list_order', sortOption);\n setWindowHistory(url.pathname, params);\n};\n\nconst updateUrlSearchPhrase = (searchPhrase: string) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n params.set('q', searchPhrase);\n setWindowHistory(url.pathname, params);\n};\n\nconst setWindowHistory = (pathname: string, params: URLSearchParams) => {\n if (params.toString() === '') {\n window.history.pushState({}, '', `${pathname}`);\n } else {\n window.history.pushState({}, '', `${pathname}?${params.toString()}`);\n }\n};\n\nconst getFiltersFromUrl = (filterableAttributes: string[]): any[] => {\n const params = getSearchParams();\n const filters: any[] = [];\n for (const [key, value] of params.entries()) {\n // if nonFilterKeys values includes a key from params (for customizing)\n if (filterableAttributes.includes(key) && !Object.values(nonFilterKeys).includes(key)) {\n if (value.includes('--')) {\n const range = value.split('--');\n const filter = {\n attribute: key,\n range: { from: Number(range[0]), to: Number(range[1]) },\n };\n filters.push(filter);\n } else {\n const attributeIndex = filters.findIndex((filter) => filter.attribute == key);\n if (attributeIndex !== -1) {\n filters[attributeIndex].in?.push(value);\n } else {\n const filter = { attribute: key, in: [value] };\n filters.push(filter);\n }\n }\n }\n }\n return filters;\n};\n\nconst addUrlFilters = (filters: any[]) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n for (const key of url.searchParams.keys()) {\n // if nonFilterKeys values includes a key from params (for customizing)\n if (!Object.values(nonFilterKeys).includes(key)) {\n params.delete(key);\n }\n }\n filters.forEach((filter) => {\n const attribute = filter.attribute;\n if (filter.range) {\n const filt = filter.range;\n if (getValueFromUrl(attribute)) {\n params.delete(attribute);\n params.append(attribute, `${filt.from}--${filt.to}`);\n } else {\n params.append(attribute, `${filt.from}--${filt.to}`);\n }\n } else {\n const filt = filter.in || [];\n const filterParams = params.getAll(attribute);\n filt.map((f: any) => {\n if (!filterParams.includes(f)) {\n params.append(attribute, f);\n }\n });\n }\n });\n setWindowHistory(url.pathname, params);\n};\n\nexport { addUrlFilters, getFiltersFromUrl, getValueFromUrl, updateUrlPagination, updateUrlSort, updateUrlSearchPhrase };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { Image, ImageProps, Pagination, Picker, PickerOption, PriceRange } from '@adobe-commerce/elsie/components';\nimport { ProductItemCard } from '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCard';\nimport { getProductSearch } from './utils/getProductSearch';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { getAttributeMetadata } from './utils/getAttributeMetadata';\nimport {\n getSortSearchVariables,\n setSortOptions,\n getPickerOption,\n getDefaultSort,\n getSortValue,\n} from './utils/sortUtils';\nimport { SearchAlertMessage } from '@/plp/components';\nimport {\n addUrlFilters,\n getFiltersFromUrl,\n getValueFromUrl,\n updateUrlPagination,\n updateUrlSearchPhrase,\n updateUrlSort,\n} from './utils/urlUtils';\nimport { ProductList as ProductListComponent } from '@/plp/components/ProductList/ProductList';\nimport { useText, Text } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { events } from '@adobe-commerce/event-bus';\nimport { VNode } from 'preact';\nimport { transformProduct } from '@/plp/data/transforms';\nimport { PLP_UNIT_ID, searchProductClick } from '@/plp/utils/acdlEvents';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n minQueryLength?: number;\n slots?: {\n Header?: SlotProps;\n ProductActions?: SlotProps;\n ProductPrice?: SlotProps;\n ProductName?: SlotProps;\n ProductImage?: SlotProps;\n Footer?: SlotProps;\n };\n pageSize?: number;\n routeProduct?: (product: Product) => string;\n categoryPath?: string;\n}\n\nexport const ProductList: Container<ProductListProps> = ({\n minQueryLength = 3,\n slots,\n pageSize = 12,\n routeProduct,\n categoryPath,\n}) => {\n const translations = useText({\n sortLabel: 'Search.PLP.SortDropdown.title',\n relevanceLabel: 'Search.PLP.SortDropdown.relevanceLabel',\n sortASC: 'Search.PLP.SortDropdown.sortASC',\n sortDESC: 'Search.PLP.SortDropdown.sortDESC',\n minQueryLength: <Text id=\"Search.PLP.Warning.minQueryLength\" fields={{ minQueryLength }} />,\n noResults: 'Search.PLP.Warning.noResults',\n searchError: 'Search.PLP.Warning.searchError',\n positionLabel: 'Search.PLP.SortDropdown.positionLabel',\n });\n const [pickerOptions, setPickerOptions] = useState<PickerOption[]>([]);\n const [currentPage, setCurrentPage] = useState<number>();\n const [totalPages, setTotalPages] = useState<number>(1);\n const [showAlert, setShowAlert] = useState<boolean>(false);\n const [alertMessage, setAlertMessage] = useState<string>(translations.noResults);\n const defaultSort = getDefaultSort(translations, categoryPath);\n const [sortValue, setSortValue] = useState<string>();\n const [filterableAttributes, setFilterableAttributes] = useState<any[]>([]);\n // Initialize the product list with empty items to avoid rendering issues\n const fakeProductList = [...Array(pageSize).keys()].map(() => {\n const fakeProduct = transformProduct({}) as Product;\n fakeProduct.initialized = false; // Mark as not initialized for skeleton loading\n return fakeProduct;\n });\n const [productList, setProductList] = useState<Product[]>(fakeProductList);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, PLP_UNIT_ID);\n };\n\n const changePage = (page: number): void => {\n searchProducts({\n currentPage: page,\n });\n };\n\n const updateCurrentPage = (page: number): void => {\n setCurrentPage(page);\n updateUrlPagination(page);\n };\n\n const changeSort = (sortValue: any): void => {\n const newSort = getSortSearchVariables(sortValue);\n setSortValue(sortValue);\n searchProducts({\n sort: newSort,\n });\n };\n\n const getSearchVariables = (inputVariables?: SearchVariables): SearchVariables => {\n const urlSort = getValueFromUrl('product_list_order');\n const sortSearchVariable = urlSort ? getSortSearchVariables(urlSort) : getSortSearchVariables(defaultSort.value);\n const searchVariables = {\n phrase: !categoryPath ? inputVariables?.phrase || getValueFromUrl('q') : '',\n pageSize: inputVariables?.pageSize || pageSize,\n currentPage: inputVariables?.currentPage || currentPage,\n filter: inputVariables?.filter || getFiltersFromUrl(filterableAttributes),\n sort: inputVariables?.sort || sortSearchVariable,\n } as SearchVariables;\n // Reset search variables for \"new\" search if certain input variables are provided\n if (inputVariables?.phrase || inputVariables?.filter || inputVariables?.sort || inputVariables?.pageSize) {\n searchVariables.currentPage = 1; // Reset to first page on new search\n if (inputVariables?.phrase) {\n searchVariables.filter = []; // Clear filters if a new search phrase is provided\n searchVariables.sort = getSortSearchVariables(defaultSort.value); // Reset sort to initial value\n setSortValue(defaultSort.value);\n }\n }\n // If categoryPath is provided, adjust search variables accordingly\n if (!categoryPath) {\n searchVariables.phrase = inputVariables?.phrase || getValueFromUrl('q') || '';\n } else {\n searchVariables.phrase = ''; // Clear phrase if in category context\n searchVariables.filter = searchVariables.filter?.concat({ attribute: 'categoryPath', eq: categoryPath });\n }\n return searchVariables;\n };\n\n const updateSearchVariablesQueryString = (variables: SearchVariables): void => {\n if (!categoryPath) {\n const newPhrase = variables.phrase || '';\n updateUrlSearchPhrase(newPhrase);\n }\n const newFilters = variables.filter || [];\n addUrlFilters(newFilters);\n const newSortValue = getSortValue(variables.sort || []);\n updateUrlSort(newSortValue);\n //page number is set based on product search results\n };\n\n const loadMetadata = (urlSort: string): Promise<any[]> => {\n return getAttributeMetadata()\n .then((value: any) => {\n setFilterableAttributes((value?.filterableInSearch || []).map((attr: any) => attr.attribute));\n const sortOptions = setSortOptions(value?.sortable, translations, categoryPath);\n setPickerOptions(sortOptions.options);\n const sortStartValue = getPickerOption(sortOptions.options, urlSort || sortOptions.default.value);\n setSortValue(sortStartValue.value);\n const urlFilters = getFiltersFromUrl((value?.filterableInSearch || []).map((attr: any) => attr.attribute));\n return urlFilters;\n })\n .catch(() => {\n setShowAlert(true);\n setAlertMessage(translations.searchError);\n });\n };\n\n const searchProducts = (inputVariables?: SearchVariables): Promise<void> | void => {\n const searchVariables = getSearchVariables(inputVariables);\n updateSearchVariablesQueryString(searchVariables);\n\n if (!categoryPath && (searchVariables?.phrase?.length || 0) < minQueryLength) {\n setShowAlert(true);\n setAlertMessage(translations.minQueryLength.replace('{SEARCH_PHRASE}', searchVariables?.phrase || ''));\n emitEmptySearchEvent();\n } else {\n setShowAlert(false);\n return getProductSearch(searchVariables)\n .then((value: ProductSearchResult) => {\n events.emit('search/result', { result: value, request: searchVariables });\n if (value?.totalCount === 0 && value?.items.length === 0) {\n setShowAlert(true);\n setAlertMessage(translations.noResults);\n } else {\n setProductList(\n value?.items.map((product: Product) => {\n product.initialized = true;\n return product;\n }),\n );\n updateCurrentPage(value?.pageInfo?.currentPage || 1);\n setTotalPages(value?.pageInfo?.totalPages || 1);\n }\n })\n .catch(() => {\n setShowAlert(true);\n setAlertMessage(translations.searchError);\n emitEmptySearchEvent();\n })\n .finally(() => {});\n }\n };\n\n const handleSearchRequestEvent = useCallback((searchVariables: SearchVariables): void => {\n searchProducts(searchVariables);\n }, []);\n\n const emitEmptySearchEvent = (): void => {\n events.emit('search/result', { result: {} as ProductSearchResult, request: {} });\n };\n\n useEffect(() => {\n const searchPhrase = getValueFromUrl('q');\n const urlSort = getValueFromUrl('product_list_order') || defaultSort.value;\n loadMetadata(urlSort).then((value: any) => {\n if (categoryPath) {\n searchProducts({\n filter: [{ attribute: 'categoryPath', eq: categoryPath }],\n });\n } else if (searchPhrase?.length && searchPhrase.length < minQueryLength) {\n setShowAlert(true);\n setAlertMessage(translations.minQueryLength.replace('{SEARCH_PHRASE}', searchPhrase));\n emitEmptySearchEvent();\n } else {\n searchProducts({ filter: value });\n }\n });\n\n const requestEvent = events.on('search/request', handleSearchRequestEvent);\n return () => {\n requestEvent?.off();\n };\n }, []);\n\n //NODE CREATION\n\n const getActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product }} />;\n };\n\n const getProductPriceSlot = (product: Product) => {\n let productCurrency =\n product.typename === 'ComplexProductView'\n ? product.priceRange?.minimum.regular.amount.currency\n : product.price?.regular.amount.currency;\n if (Intl.supportedValuesOf('currency').indexOf(productCurrency || '') === -1) {\n productCurrency = 'USD'; // Fallback to USD if the currency is not supported\n }\n const productPrice =\n product.typename === 'ComplexProductView' ? (\n <PriceRange\n display=\"from to\"\n minimumAmount={product.priceRange?.minimum.regular.amount.value}\n maximumAmount={product.priceRange?.maximum.regular.amount.value}\n currency={productCurrency}\n />\n ) : (\n <PriceRange amount={product.price?.regular.amount.value} currency={productCurrency} />\n );\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productPrice}\n </a>\n ) : (\n productPrice\n )}\n </Slot>\n );\n };\n\n const getProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const getProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: '200',\n height: '250',\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName} />\n );\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const getHeader = () => {\n return (\n <Slot name=\"Header\" slot={slots?.Header} context={{ productList }}>\n <Picker\n floatingLabel={translations.sortLabel}\n options={pickerOptions}\n value={sortValue}\n required\n handleSelect={(event) => {\n const { value } = event.target as HTMLSelectElement;\n changeSort(value);\n }}\n data-testid=\"product-list-sort-by-picker\"\n />\n </Slot>\n );\n };\n\n const getFooter = () => {\n return (\n <Slot name=\"Footer\" slot={slots?.Footer} context={{ productList }}>\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onChange={(page) => {\n changePage(page);\n }}\n />\n </Slot>\n );\n };\n\n const productListComponent = (\n <ProductListComponent\n header={getHeader()}\n footer={getFooter()}\n productList={\n productList?.map((product: Product, i: number) => {\n return (\n <ProductItemCard\n key={product.id || product.sku}\n image={getProductImageSlot(product, i)}\n titleNode={getProductNameSlot(product)}\n price={getProductPriceSlot(product)}\n actionButton={getActionsSlot(product)}\n initialized={product.initialized}\n />\n );\n }) as VNode[]\n }\n />\n );\n\n return (\n <div class=\"product-discovery-product-list__container\">\n {showAlert ? <SearchAlertMessage alertMessage={alertMessage} /> : productListComponent}\n </div>\n );\n};\n"],"names":["SvgWarning","props","React","ProductItemCardSkeleton","jsxs","Skeleton","jsx","SkeletonRow","ProductItemCard","className","image","titleNode","price","sku","actionButton","swatches","initialized","classes","VComponent","getProductSearch","variables","searchRequestId","updateSearchInputCtx","PLP_UNIT_ID","searchRequestSent","e","defaultVisibilityFilter","searchObj","_a","productSearchQuery","value","transformedResponse","transformProductSearchResponse","updateSearchResultsCtx","searchResponseReceived","searchResultsView","categoryResultsView","error","getAttributeMetadata","attributeMetadataQuery","transformAttributeMetadata","getDefaultSort","translations","categoryPath","setSortOptions","sortOptions","defaultSort","finalSortOptions","resultOptions","option","getSortSearchVariables","sortValue","index","getSortValue","sort","getPickerOption","options","ProductList","header","productList","footer","SearchAlertMessage","alertMessage","InLineAlert","Icon","Warning","nonFilterKeys","getValueFromUrl","param","filter","getSearchParams","search","updateUrlPagination","pageNumber","url","params","setWindowHistory","updateUrlSort","sortOption","updateUrlSearchPhrase","searchPhrase","pathname","getFiltersFromUrl","filterableAttributes","filters","key","range","attributeIndex","addUrlFilters","attribute","filt","filterParams","f","htmlStringDecode","input","minQueryLength","slots","pageSize","routeProduct","useText","Text","pickerOptions","setPickerOptions","useState","currentPage","setCurrentPage","totalPages","setTotalPages","showAlert","setShowAlert","setAlertMessage","setSortValue","setFilterableAttributes","fakeProductList","fakeProduct","transformProduct","setProductList","handleProductClick","product","searchProductClick","changePage","page","searchProducts","updateCurrentPage","changeSort","newSort","getSearchVariables","inputVariables","urlSort","sortSearchVariable","searchVariables","updateSearchVariablesQueryString","newPhrase","newFilters","newSortValue","loadMetadata","attr","sortStartValue","emitEmptySearchEvent","events","_b","handleSearchRequestEvent","useCallback","useEffect","requestEvent","getActionsSlot","Slot","getProductPriceSlot","productCurrency","productPrice","PriceRange","_c","_d","_e","getProductNameSlot","productName","getProductImageSlot","defaultImageProps","imageComponent","Image","getHeader","Picker","event","getFooter","Pagination","productListComponent","ProductListComponent","i"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"ProductList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","../../node_modules/@adobe-commerce/elsie/src/components/ProductItemCard/ProductItemCardSkeleton.tsx","../../node_modules/@adobe-commerce/elsie/src/components/ProductItemCard/ProductItemCard.tsx","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/getProductSearch.ts","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/getAttributeMetadata.ts","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/sortUtils.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/ProductList/utils/urlUtils.ts","/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/containers/ProductList/ProductList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\" }))));\nexport default SvgWarning;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCardSkeleton.css';\n\nexport const ProductItemCardSkeleton: FunctionComponent = () => {\n return (\n <div className=\"dropin-product-item-card dropin-product-item-card-skeleton\">\n <Skeleton className=\"dropin-product-item-card__skeleton dropin-product-item-card__image-container\">\n <SkeletonRow\n fullWidth={true}\n className=\"dropin-product-item-card__skeleton__image\"\n />\n <div className=\"dropin-product-item-card__content dropin-product-item-card__skeleton__content\">\n <SkeletonRow\n fullWidth={true}\n size=\"large\"\n className=\"dropin-product-item-card__skeleton__item\"\n />\n <SkeletonRow\n fullWidth={true}\n size=\"xsmall\"\n className=\"dropin-product-item-card__skeleton__item\"\n />\n <SkeletonRow\n fullWidth={true}\n size=\"small\"\n className=\"dropin-product-item-card__skeleton__item\"\n />\n </div>{' '}\n </Skeleton>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport { ProductItemCardSkeleton } from '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCardSkeleton';\nimport '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCard.css';\n\nexport interface ProductItemCardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n image?: VNode;\n titleNode?: VNode;\n price?: VNode;\n sku?: VNode;\n actionButton?: VNode;\n swatches?: VNode;\n initialized?: boolean;\n}\n\nexport const ProductItemCard: FunctionComponent<ProductItemCardProps> = ({\n className,\n image,\n titleNode,\n price,\n sku,\n actionButton,\n swatches,\n initialized = false,\n ...props\n}) => {\n if (!initialized) {\n return <ProductItemCardSkeleton />;\n }\n return (\n <div\n {...props}\n className={classes(['dropin-product-item-card', className])}\n >\n <div className=\"dropin-product-item-card__image-container\">\n {image && (\n <VComponent\n node={image}\n className={classes(['dropin-product-item-card__image'])}\n />\n )}\n </div>\n <div className=\"dropin-product-item-card__content\">\n {titleNode && (\n <VComponent\n node={titleNode}\n className={classes(['dropin-product-item-card__title'])}\n />\n )}\n {sku && (\n <VComponent\n node={sku}\n className={classes(['dropin-product-item-card__sku'])}\n />\n )}\n {price && (\n <div className=\"dropin-product-item-card__price\">\n <VComponent\n node={price}\n className={classes(['dropin-product-item-card__price'])}\n />\n </div>\n )}\n {swatches && (\n <div className=\"dropin-product-item-card__swatches\">\n <VComponent\n node={swatches}\n className={classes(['dropin-product-item-card__swatches'])}\n />\n </div>\n )}\n {actionButton && (\n <div className=\"dropin-product-item-card__action\">\n <VComponent\n node={actionButton}\n className={classes(['dropin-product-item-card__action'])}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { productSearch as productSearchQuery } from '@/plp/api';\nimport { SearchVariables } from '@/plp/data/models';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport {\n PLP_UNIT_ID,\n categoryResultsView,\n searchRequestSent,\n searchResponseReceived,\n searchResultsView,\n updateSearchInputCtx,\n updateSearchResultsCtx,\n} from '@/plp/utils/acdlEvents';\n\nexport function getProductSearch(variables: SearchVariables): any {\n let searchRequestId = '';\n // ====== data collection =====\n try {\n searchRequestId = self.crypto.randomUUID();\n updateSearchInputCtx(\n PLP_UNIT_ID,\n searchRequestId,\n variables.phrase || '',\n variables.filter || [],\n variables.pageSize || 0,\n variables.currentPage || 0,\n variables.sort || [],\n );\n searchRequestSent(PLP_UNIT_ID);\n } catch (e) {\n console.error('Error collecting data:', e);\n }\n // =============================\n\n //Add default visibility filter\n const defaultVisibilityFilter = { attribute: 'visibility', in: ['Search', 'Catalog, Search'] };\n const searchObj = structuredClone(variables);\n searchObj.filter?.push(defaultVisibilityFilter);\n\n return productSearchQuery(searchObj)\n .then((value: any | null) => {\n const transformedResponse = transformProductSearchResponse(value);\n\n try {\n // ===== data collection =====\n updateSearchResultsCtx(PLP_UNIT_ID, searchRequestId, transformedResponse);\n searchResponseReceived(PLP_UNIT_ID);\n // TODO: Publish view events base on search type\n if (variables.phrase) {\n searchResultsView(PLP_UNIT_ID);\n } else {\n categoryResultsView(PLP_UNIT_ID);\n }\n // ============================\n } catch (e) {\n console.error('Error collecting data:', e);\n }\n\n return transformedResponse;\n })\n .catch((error: any) => {\n console.error('Error fetching product search:', error);\n throw new Error('Error fetching product search.');\n })\n .finally(() => {});\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { attributeMetadata as attributeMetadataQuery } from '@/plp/api';\nimport { transformAttributeMetadata } from '@/plp/data/transforms';\n\nexport function getAttributeMetadata(): any {\n return attributeMetadataQuery()\n .then((value: any | null) => {\n return transformAttributeMetadata(value);\n })\n .catch((error: any) => {\n console.error('Error fetching attribute metadata:', error);\n throw new Error('Error fetching attribute metadata.');\n })\n .finally(() => {});\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { SortOrder } from '@/plp/data/models/api';\nconst getDefaultSort = (translations: any, categoryPath?: string): any => {\n if (categoryPath) {\n return { text: translations.positionLabel, value: 'position_ASC' };\n }\n return { text: translations.relevanceLabel, value: 'relevance_DESC' };\n};\n\nconst setSortOptions = (sortOptions: any, translations: any, categoryPath?: string): any => {\n const defaultSort = getDefaultSort(translations, categoryPath);\n const finalSortOptions = sortOptions.reduce((resultOptions: any, option: any) => {\n if (option.attribute !== 'position' && option.attribute !== 'relevance') {\n if (option.attribute === 'price') {\n resultOptions.push({\n text: translations.sortASC,\n value: `${option.attribute}_ASC`,\n });\n resultOptions.push({\n text: translations.sortDESC,\n value: `${option.attribute}_DESC`,\n });\n } else {\n resultOptions.push({\n text: option.label,\n value: `${option.attribute}_DESC`,\n });\n }\n }\n return resultOptions;\n }, []);\n finalSortOptions.push(defaultSort);\n return { options: finalSortOptions, default: defaultSort };\n};\n\nconst getSortSearchVariables = (sortValue: string): SortOrder[] => {\n const index = sortValue.indexOf('_');\n const newSort: SortOrder[] = [\n {\n attribute: sortValue.substring(0, index) as string,\n direction: sortValue.substring(index + 1) === 'ASC' ? 'ASC' : 'DESC',\n },\n ];\n return newSort;\n};\n\nconst getSortValue = (sort: SortOrder[]): string => {\n if (sort.length > 0) {\n return `${sort[0].attribute}_${sort[0].direction}`;\n }\n return '';\n};\n\nconst getPickerOption = (options: any, value: string): any => {\n const index = options.findIndex((option: any) => option.value === value);\n if (index > -1) {\n return options[index];\n }\n return null;\n};\n\nexport { getDefaultSort, getSortSearchVariables, setSortOptions, getPickerOption, getSortValue };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n header?: VNode;\n productList?: VNode[];\n footer?: VNode;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ header, productList, footer }) => {\n return (\n <div className={'product-discovery-product-list'}>\n {header && <VComponent className=\"product-discovery-product-list__header\" node={header} />}\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n {footer && <VComponent className=\"product-discovery-product-list__pagination\" node={footer} />}\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst nonFilterKeys = {\n search: 'q',\n search_query: 'search_query',\n pagination: 'p',\n sort: 'product_list_order',\n page_size: 'page_size',\n};\n\nconst getValueFromUrl = (param: string) => {\n const params = getSearchParams();\n const filter = params.get(param);\n if (filter) {\n return filter;\n }\n return '';\n};\n\nconst getSearchParams = () => {\n const search = window.location.search;\n return new URLSearchParams(search);\n};\n\nconst updateUrlPagination = (pageNumber: number) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n if (pageNumber === 1) {\n params.delete('p');\n } else {\n params.set('p', pageNumber.toString());\n }\n setWindowHistory(url.pathname, params);\n};\n\nconst updateUrlSort = (sortOption: string) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n params.set('product_list_order', sortOption);\n setWindowHistory(url.pathname, params);\n};\n\nconst updateUrlSearchPhrase = (searchPhrase: string) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n params.set('q', searchPhrase);\n setWindowHistory(url.pathname, params);\n};\n\nconst setWindowHistory = (pathname: string, params: URLSearchParams) => {\n if (params.toString() === '') {\n window.history.pushState({}, '', `${pathname}`);\n } else {\n window.history.pushState({}, '', `${pathname}?${params.toString()}`);\n }\n};\n\nconst getFiltersFromUrl = (filterableAttributes: string[]): any[] => {\n const params = getSearchParams();\n const filters: any[] = [];\n for (const [key, value] of params.entries()) {\n // if nonFilterKeys values includes a key from params (for customizing)\n if (filterableAttributes.includes(key) && !Object.values(nonFilterKeys).includes(key)) {\n if (value.includes('--')) {\n const range = value.split('--');\n const filter = {\n attribute: key,\n range: { from: Number(range[0]), to: Number(range[1]) },\n };\n filters.push(filter);\n } else {\n const attributeIndex = filters.findIndex((filter) => filter.attribute == key);\n if (attributeIndex !== -1) {\n filters[attributeIndex].in?.push(value);\n } else {\n const filter = { attribute: key, in: [value] };\n filters.push(filter);\n }\n }\n }\n }\n return filters;\n};\n\nconst addUrlFilters = (filters: any[]) => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.searchParams);\n for (const key of url.searchParams.keys()) {\n // if nonFilterKeys values includes a key from params (for customizing)\n if (!Object.values(nonFilterKeys).includes(key)) {\n params.delete(key);\n }\n }\n filters.forEach((filter) => {\n const attribute = filter.attribute;\n if (filter.range) {\n const filt = filter.range;\n if (getValueFromUrl(attribute)) {\n params.delete(attribute);\n params.append(attribute, `${filt.from}--${filt.to}`);\n } else {\n params.append(attribute, `${filt.from}--${filt.to}`);\n }\n } else {\n const filt = filter.in || [];\n const filterParams = params.getAll(attribute);\n filt.map((f: any) => {\n if (!filterParams.includes(f)) {\n params.append(attribute, f);\n }\n });\n }\n });\n setWindowHistory(url.pathname, params);\n};\n\nexport { addUrlFilters, getFiltersFromUrl, getValueFromUrl, updateUrlPagination, updateUrlSort, updateUrlSearchPhrase };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { Image, ImageProps, Pagination, Picker, PickerOption, PriceRange } from '@adobe-commerce/elsie/components';\nimport { ProductItemCard } from '@adobe-commerce/elsie/components/ProductItemCard/ProductItemCard';\nimport { getProductSearch } from './utils/getProductSearch';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { getAttributeMetadata } from './utils/getAttributeMetadata';\nimport {\n getSortSearchVariables,\n setSortOptions,\n getPickerOption,\n getDefaultSort,\n getSortValue,\n} from './utils/sortUtils';\nimport { SearchAlertMessage } from '@/plp/components';\nimport {\n addUrlFilters,\n getFiltersFromUrl,\n getValueFromUrl,\n updateUrlPagination,\n updateUrlSearchPhrase,\n updateUrlSort,\n} from './utils/urlUtils';\nimport { ProductList as ProductListComponent } from '@/plp/components/ProductList/ProductList';\nimport { useText, Text } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { events } from '@adobe-commerce/event-bus';\nimport { VNode } from 'preact';\nimport { transformProduct } from '@/plp/data/transforms';\nimport { PLP_UNIT_ID, searchProductClick } from '@/plp/utils/acdlEvents';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n minQueryLength?: number;\n slots?: {\n Header?: SlotProps;\n ProductActions?: SlotProps;\n ProductPrice?: SlotProps;\n ProductName?: SlotProps;\n ProductImage?: SlotProps;\n Footer?: SlotProps;\n };\n pageSize?: number;\n routeProduct?: (product: Product) => string;\n categoryPath?: string;\n}\n\nexport const ProductList: Container<ProductListProps> = ({\n minQueryLength = 3,\n slots,\n pageSize = 12,\n routeProduct,\n categoryPath,\n}) => {\n const translations = useText({\n sortLabel: 'Search.PLP.SortDropdown.title',\n relevanceLabel: 'Search.PLP.SortDropdown.relevanceLabel',\n sortASC: 'Search.PLP.SortDropdown.sortASC',\n sortDESC: 'Search.PLP.SortDropdown.sortDESC',\n minQueryLength: <Text id=\"Search.PLP.Warning.minQueryLength\" fields={{ minQueryLength }} />,\n noResults: 'Search.PLP.Warning.noResults',\n searchError: 'Search.PLP.Warning.searchError',\n positionLabel: 'Search.PLP.SortDropdown.positionLabel',\n });\n const [pickerOptions, setPickerOptions] = useState<PickerOption[]>([]);\n const [currentPage, setCurrentPage] = useState<number>();\n const [totalPages, setTotalPages] = useState<number>(1);\n const [showAlert, setShowAlert] = useState<boolean>(false);\n const [alertMessage, setAlertMessage] = useState<string>(translations.noResults);\n const defaultSort = getDefaultSort(translations, categoryPath);\n const [sortValue, setSortValue] = useState<string>();\n const [filterableAttributes, setFilterableAttributes] = useState<any[]>([]);\n // Initialize the product list with empty items to avoid rendering issues\n const fakeProductList = [...Array(pageSize).keys()].map(() => {\n const fakeProduct = transformProduct({}) as Product;\n fakeProduct.initialized = false; // Mark as not initialized for skeleton loading\n return fakeProduct;\n });\n const [productList, setProductList] = useState<Product[]>(fakeProductList);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, PLP_UNIT_ID);\n };\n\n const changePage = (page: number): void => {\n searchProducts({\n currentPage: page,\n });\n };\n\n const updateCurrentPage = (page: number): void => {\n setCurrentPage(page);\n updateUrlPagination(page);\n };\n\n const changeSort = (sortValue: any): void => {\n const newSort = getSortSearchVariables(sortValue);\n setSortValue(sortValue);\n searchProducts({\n sort: newSort,\n });\n };\n\n const getSearchVariables = (inputVariables?: SearchVariables): SearchVariables => {\n const urlSort = getValueFromUrl('product_list_order');\n const sortSearchVariable = urlSort ? getSortSearchVariables(urlSort) : getSortSearchVariables(defaultSort.value);\n const searchVariables = {\n phrase: !categoryPath ? inputVariables?.phrase || getValueFromUrl('q') : '',\n pageSize: inputVariables?.pageSize || pageSize,\n currentPage: inputVariables?.currentPage || currentPage,\n filter: inputVariables?.filter || getFiltersFromUrl(filterableAttributes),\n sort: inputVariables?.sort || sortSearchVariable,\n } as SearchVariables;\n // Reset search variables for \"new\" search if certain input variables are provided\n if (inputVariables?.phrase || inputVariables?.filter || inputVariables?.sort || inputVariables?.pageSize) {\n searchVariables.currentPage = 1; // Reset to first page on new search\n if (inputVariables?.phrase) {\n searchVariables.filter = []; // Clear filters if a new search phrase is provided\n searchVariables.sort = getSortSearchVariables(defaultSort.value); // Reset sort to initial value\n setSortValue(defaultSort.value);\n }\n }\n // If categoryPath is provided, adjust search variables accordingly\n if (!categoryPath) {\n searchVariables.phrase = inputVariables?.phrase || getValueFromUrl('q') || '';\n } else {\n searchVariables.phrase = ''; // Clear phrase if in category context\n searchVariables.filter = searchVariables.filter?.concat({ attribute: 'categoryPath', eq: categoryPath });\n }\n return searchVariables;\n };\n\n const updateSearchVariablesQueryString = (variables: SearchVariables): void => {\n if (!categoryPath) {\n const newPhrase = variables.phrase || '';\n updateUrlSearchPhrase(newPhrase);\n }\n const newFilters = variables.filter || [];\n addUrlFilters(newFilters);\n const newSortValue = getSortValue(variables.sort || []);\n updateUrlSort(newSortValue);\n //page number is set based on product search results\n };\n\n const loadMetadata = (urlSort: string): Promise<any[]> => {\n return getAttributeMetadata()\n .then((value: any) => {\n setFilterableAttributes((value?.filterableInSearch || []).map((attr: any) => attr.attribute));\n const sortOptions = setSortOptions(value?.sortable, translations, categoryPath);\n setPickerOptions(sortOptions.options);\n const sortStartValue = getPickerOption(sortOptions.options, urlSort || sortOptions.default.value);\n setSortValue(sortStartValue.value);\n const urlFilters = getFiltersFromUrl((value?.filterableInSearch || []).map((attr: any) => attr.attribute));\n return urlFilters;\n })\n .catch(() => {\n setShowAlert(true);\n setAlertMessage(translations.searchError);\n });\n };\n\n const searchProducts = (inputVariables?: SearchVariables): Promise<void> | void => {\n const searchVariables = getSearchVariables(inputVariables);\n updateSearchVariablesQueryString(searchVariables);\n\n if (!categoryPath && (searchVariables?.phrase?.length || 0) < minQueryLength) {\n setShowAlert(true);\n setAlertMessage(translations.minQueryLength.replace('{SEARCH_PHRASE}', searchVariables?.phrase || ''));\n emitEmptySearchEvent();\n } else {\n setShowAlert(false);\n return getProductSearch(searchVariables)\n .then((value: ProductSearchResult) => {\n events.emit('search/result', { result: value, request: searchVariables });\n if (value?.totalCount === 0 && value?.items.length === 0) {\n setShowAlert(true);\n setAlertMessage(translations.noResults);\n } else {\n setProductList(\n value?.items.map((product: Product) => {\n product.initialized = true;\n return product;\n }),\n );\n updateCurrentPage(value?.pageInfo?.currentPage || 1);\n setTotalPages(value?.pageInfo?.totalPages || 1);\n }\n })\n .catch(() => {\n setShowAlert(true);\n setAlertMessage(translations.searchError);\n emitEmptySearchEvent();\n })\n .finally(() => {});\n }\n };\n\n const handleSearchRequestEvent = useCallback((searchVariables: SearchVariables): void => {\n searchProducts(searchVariables);\n }, []);\n\n const emitEmptySearchEvent = (): void => {\n events.emit('search/result', { result: {} as ProductSearchResult, request: {} });\n };\n\n useEffect(() => {\n const searchPhrase = getValueFromUrl('q');\n const urlSort = getValueFromUrl('product_list_order') || defaultSort.value;\n loadMetadata(urlSort).then((value: any) => {\n if (categoryPath) {\n searchProducts({\n filter: [{ attribute: 'categoryPath', eq: categoryPath }],\n });\n } else if (searchPhrase?.length && searchPhrase.length < minQueryLength) {\n setShowAlert(true);\n setAlertMessage(translations.minQueryLength.replace('{SEARCH_PHRASE}', searchPhrase));\n emitEmptySearchEvent();\n } else {\n searchProducts({ filter: value });\n }\n });\n\n const requestEvent = events.on('search/request', handleSearchRequestEvent);\n return () => {\n requestEvent?.off();\n };\n }, []);\n\n //NODE CREATION\n\n const getActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product }} />;\n };\n\n const getProductPriceSlot = (product: Product) => {\n let productCurrency =\n product.typename === 'ComplexProductView'\n ? product.priceRange?.minimum.regular.amount.currency\n : product.price?.regular.amount.currency;\n if (Intl.supportedValuesOf('currency').indexOf(productCurrency || '') === -1) {\n productCurrency = 'USD'; // Fallback to USD if the currency is not supported\n }\n const productPrice =\n product.typename === 'ComplexProductView' ? (\n <PriceRange\n display=\"from to\"\n minimumAmount={product.priceRange?.minimum.regular.amount.value}\n maximumAmount={product.priceRange?.maximum.regular.amount.value}\n currency={productCurrency}\n />\n ) : (\n <PriceRange amount={product.price?.regular.amount.value} currency={productCurrency} />\n );\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productPrice}\n </a>\n ) : (\n productPrice\n )}\n </Slot>\n );\n };\n\n const getProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const getProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: 200,\n height: 250,\n params: { width: 200 },\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName} />\n );\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const getHeader = () => {\n return (\n <Slot name=\"Header\" slot={slots?.Header} context={{ productList }}>\n <Picker\n floatingLabel={translations.sortLabel}\n options={pickerOptions}\n value={sortValue}\n required\n handleSelect={(event) => {\n const { value } = event.target as HTMLSelectElement;\n changeSort(value);\n }}\n data-testid=\"product-list-sort-by-picker\"\n />\n </Slot>\n );\n };\n\n const getFooter = () => {\n return (\n <Slot name=\"Footer\" slot={slots?.Footer} context={{ productList }}>\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onChange={(page) => {\n changePage(page);\n }}\n />\n </Slot>\n );\n };\n\n const productListComponent = (\n <ProductListComponent\n header={getHeader()}\n footer={getFooter()}\n productList={\n productList?.map((product: Product, i: number) => {\n return (\n <ProductItemCard\n key={product.id || product.sku}\n image={getProductImageSlot(product, i)}\n titleNode={getProductNameSlot(product)}\n price={getProductPriceSlot(product)}\n actionButton={getActionsSlot(product)}\n initialized={product.initialized}\n />\n );\n }) as VNode[]\n }\n />\n );\n\n return (\n <div class=\"product-discovery-product-list__container\">\n {showAlert ? <SearchAlertMessage alertMessage={alertMessage} /> : productListComponent}\n </div>\n );\n};\n"],"names":["SvgWarning","props","React","ProductItemCardSkeleton","jsxs","Skeleton","jsx","SkeletonRow","ProductItemCard","className","image","titleNode","price","sku","actionButton","swatches","initialized","classes","VComponent","getProductSearch","variables","searchRequestId","updateSearchInputCtx","PLP_UNIT_ID","searchRequestSent","e","defaultVisibilityFilter","searchObj","_a","productSearchQuery","value","transformedResponse","transformProductSearchResponse","updateSearchResultsCtx","searchResponseReceived","searchResultsView","categoryResultsView","error","getAttributeMetadata","attributeMetadataQuery","transformAttributeMetadata","getDefaultSort","translations","categoryPath","setSortOptions","sortOptions","defaultSort","finalSortOptions","resultOptions","option","getSortSearchVariables","sortValue","index","getSortValue","sort","getPickerOption","options","ProductList","header","productList","footer","SearchAlertMessage","alertMessage","InLineAlert","Icon","Warning","nonFilterKeys","getValueFromUrl","param","filter","getSearchParams","search","updateUrlPagination","pageNumber","url","params","setWindowHistory","updateUrlSort","sortOption","updateUrlSearchPhrase","searchPhrase","pathname","getFiltersFromUrl","filterableAttributes","filters","key","range","attributeIndex","addUrlFilters","attribute","filt","filterParams","f","htmlStringDecode","input","minQueryLength","slots","pageSize","routeProduct","useText","Text","pickerOptions","setPickerOptions","useState","currentPage","setCurrentPage","totalPages","setTotalPages","showAlert","setShowAlert","setAlertMessage","setSortValue","setFilterableAttributes","fakeProductList","fakeProduct","transformProduct","setProductList","handleProductClick","product","searchProductClick","changePage","page","searchProducts","updateCurrentPage","changeSort","newSort","getSearchVariables","inputVariables","urlSort","sortSearchVariable","searchVariables","updateSearchVariablesQueryString","newPhrase","newFilters","newSortValue","loadMetadata","attr","sortStartValue","emitEmptySearchEvent","events","_b","handleSearchRequestEvent","useCallback","useEffect","requestEvent","getActionsSlot","Slot","getProductPriceSlot","productCurrency","productPrice","PriceRange","_c","_d","_e","getProductNameSlot","productName","getProductImageSlot","defaultImageProps","imageComponent","Image","getHeader","Picker","event","getFooter","Pagination","productListComponent","ProductListComponent","i"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as n,jsxs as x}from"@dropins/tools/preact-jsx-runtime.js";import{useRef as K,useCallback as u,useEffect as j,useMemo as p,useState as S}from"@dropins/tools/preact-compat.js";import{Image as Q,Price as V,Button as z}from"@dropins/tools/components.js";import{VComponent as _,Slot as b}from"@dropins/tools/lib.js";import{events as k}from"@dropins/tools/event-bus.js";/* empty css */import{s as C,S as H}from"../chunks/acdlEvents.js";import{useText as M}from"@dropins/tools/i18n.js";const F=({productList:
|
|
4
|
-
`),url:y}},[s]),h=l=>{C(l.sku,H)};return x("a",{className:"product-discovery--product-item",href:
|
|
3
|
+
import{jsx as n,jsxs as x}from"@dropins/tools/preact-jsx-runtime.js";import{useRef as K,useCallback as u,useEffect as j,useMemo as p,useState as S}from"@dropins/tools/preact-compat.js";import{Image as Q,Price as V,Button as z}from"@dropins/tools/components.js";import{VComponent as _,Slot as b}from"@dropins/tools/lib.js";import{events as k}from"@dropins/tools/event-bus.js";/* empty css */import{s as C,S as H}from"../chunks/acdlEvents.js";import{useText as M}from"@dropins/tools/i18n.js";const F=({productList:c,viewAllButton:s,onClose:i,...r})=>{const a=c&&c.length>0,d=K(null),t=u(l=>{d.current&&!d.current.contains(l.target)&&(i==null||i())},[i]),h=u(l=>{l.key==="Escape"&&(i==null||i())},[i]);return j(()=>{if(a)return document.addEventListener("mousedown",t),document.addEventListener("keydown",h),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",h)}},[a,t,h]),a?n("div",{className:"product-discovery--search-bar-results",...r,children:n("div",{className:"product-discovery--search-bar-results__popover",ref:d,role:"region","aria-label":"Search results","aria-live":"polite",children:x("div",{className:"product-discovery--search-bar-results__outer-container",...r,children:[n("div",{className:"product-discovery--search-bar-results__grid",role:"list","aria-label":`${(c==null?void 0:c.length)||0} search results`,children:c==null?void 0:c.map((l,m)=>n("div",{role:"listitem",children:l},m))}),s&&n("div",{className:"product-discovery--search-bar-results__view-all-wrapper",children:n(_,{className:"product-discovery--search-bar-results__view-all-button",node:s})})]})})}):null},G=({productRouteSearch:c=t=>(t==null?void 0:t.url)||"",productItem:s,productImage:i,productName:r,productPrice:a,...d})=>{const t=p(()=>{const{name:l="",sku:m="",url:y=""}=s||{};return{tooltipText:[l,m&&`SKU: ${m}`].filter(Boolean).join(`
|
|
4
|
+
`),url:y}},[s]),h=l=>{C(l.sku,H)};return x("a",{className:"product-discovery--product-item",href:c(s),rel:"noopener noreferrer",title:t.tooltipText,onClick:()=>h(s),...d,children:[n("div",{className:"product-discovery--product-item__image",children:n(_,{node:i})}),x("div",{className:"product-discovery--product-item__details",children:[n(_,{node:r}),n(_,{node:a})]})]})},re=({products:c=[],productRouteSearch:s=a=>(a==null?void 0:a.url)||"",routeSearch:i=()=>{},slots:r})=>{const[a,d]=S(c),[t,h]=S(""),[l,m]=S(c.length>0),y=M({viewAllButton:"Search.SearchInput.viewAllButton"}),w=u(({result:e=[],request:v={}})=>{const{phrase:o=""}=v;d(e),h(o),m(e.length>0&&o.length>0)},[]);j(()=>{const e=k.on("search-input/result",w);return()=>{e==null||e.off()}},[w]);const N=u(()=>{k.emit("search-input/result",{result:[],request:{phrase:""}}),m(!1)},[]),B=u(()=>{i&&i(t),k.emit("search/request",{phrase:t}),N()},[i,t,N]),R=u(e=>{var o,P,f,g;const v={loading:"lazy",src:((P=(o=e.images)==null?void 0:o[0])==null?void 0:P.url)||"",alt:((g=(f=e.images)==null?void 0:f[0])==null?void 0:g.label)||"",width:165,height:165,params:{width:165}};return n(b,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{productItem:e,defaultImageProps:v},children:n(Q,{...v,"aria-label":e.sku})})},[r==null?void 0:r.ProductImage]),E=u(e=>n(b,{name:"ProductName",slot:r==null?void 0:r.ProductName,context:{productItem:e},children:(e==null?void 0:e.name)||""}),[r==null?void 0:r.ProductName]),A=u(e=>{var f,g,T,O,U;const{value:v,currency:o="USD"}=((g=(f=e==null?void 0:e.price)==null?void 0:f.final)==null?void 0:g.amount)||((U=(O=(T=e==null?void 0:e.priceRange)==null?void 0:T.minimum)==null?void 0:O.final)==null?void 0:U.amount)||{},P=Intl.supportedValuesOf("currency").indexOf(o||"")===-1?"USD":o;return n(b,{name:"ProductPrice",slot:r==null?void 0:r.ProductPrice,context:{productItem:e},children:n(V,{amount:typeof v=="number"?v:void 0,currency:P})})},[r==null?void 0:r.ProductPrice]),D=u(e=>n(G,{productRouteSearch:s,productItem:e,productImage:R(e),productName:E(e),productPrice:A(e)}),[s,R,E,A]),$=p(()=>n(z,{variant:"tertiary",onClick:B,children:y.viewAllButton}),[y.viewAllButton,B]),q=p(()=>a==null?void 0:a.map(e=>D(e)),[a,D]);return!a.length||!l?null:n(F,{productList:q,viewAllButton:$,onClose:N})};export{re as SearchBarResults,re as default};
|
|
5
5
|
//# sourceMappingURL=SearchBarResults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBarResults.js","sources":["/@dropins/storefront-product-discovery/src/components/SearchBarResults/SearchBarResults.tsx","/@dropins/storefront-product-discovery/src/components/ProductItem/ProductItem.tsx","/@dropins/storefront-product-discovery/src/containers/SearchBarResults/SearchBarResults.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useEffect, useRef, useCallback } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\n\nimport '@/plp/components/SearchBarResults/SearchBarResults.css';\n\nexport interface SearchBarResultsProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n viewAllButton?: VNode;\n onClose?: () => void;\n}\n\nexport const SearchBarResults: FunctionComponent<SearchBarResultsProps> = ({\n productList,\n viewAllButton,\n onClose,\n ...props\n}) => {\n const hasData = productList && productList.length > 0;\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) {\n onClose?.();\n }\n },\n [onClose],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose?.();\n }\n },\n [onClose],\n );\n\n useEffect(() => {\n if (!hasData) return;\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [hasData, handleClickOutside, handleEscapeKey]);\n\n if (!hasData) return null;\n\n return (\n <div className=\"product-discovery--search-bar-results\" {...props}>\n <div\n className=\"product-discovery--search-bar-results__popover\"\n ref={popoverRef}\n role=\"region\"\n aria-label=\"Search results\"\n aria-live=\"polite\"\n >\n <div className=\"product-discovery--search-bar-results__outer-container\" {...props}>\n <div\n className=\"product-discovery--search-bar-results__grid\"\n role=\"list\"\n aria-label={`${productList?.length || 0} search results`}\n >\n {productList?.map((item, index) => (\n <div key={index} role=\"listitem\">\n {item}\n </div>\n ))}\n </div>\n {viewAllButton && (\n <div className=\"product-discovery--search-bar-results__view-all-wrapper\">\n <VComponent className=\"product-discovery--search-bar-results__view-all-button\" node={viewAllButton} />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n ***************************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { AnchorHTMLAttributes, useMemo } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport { Product } from '@/plp/data/models/product';\n\nimport '@/plp/components/ProductItem/ProductItem.css';\nimport { SEARCH_UNIT_ID, searchProductClick } from '@/plp/utils/acdlEvents';\n\nexport interface ProductItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n productRouteSearch?: (product: Product) => string;\n productItem: Product;\n productImage?: VNode;\n productName?: VNode;\n productPrice?: VNode;\n}\n\nexport const ProductItem: FunctionComponent<ProductItemProps> = ({\n productRouteSearch = (product: Product) => product?.url || '',\n productItem,\n productImage,\n productName,\n productPrice,\n ...props\n}) => {\n const productData = useMemo(() => {\n const { name = '', sku = '', url = '' } = productItem || {};\n\n // create tooltip text depending on available data\n const tooltipText = [name, sku && `SKU: ${sku}`].filter(Boolean).join('\\n');\n\n return { tooltipText, url };\n }, [productItem]);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, SEARCH_UNIT_ID);\n };\n\n return (\n <a\n className=\"product-discovery--product-item\"\n href={productRouteSearch(productItem)}\n rel=\"noopener noreferrer\"\n title={productData.tooltipText}\n onClick={() => handleProductClick(productItem)}\n {...props}\n >\n <div className=\"product-discovery--product-item__image\">\n <VComponent node={productImage} />\n </div>\n <div className=\"product-discovery--product-item__details\">\n <VComponent node={productName} />\n <VComponent node={productPrice} />\n </div>\n </a>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect, useCallback, useMemo } from 'preact/compat';\nimport { Button, Image, ImageProps, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\n\nimport { Product, SearchInputRequest, SearchInputResult } from '@/plp/data/models/product';\nimport { SearchVariables } from '@/plp/data/models/api';\nimport { SearchBarResults as SearchBarResultsComponent } from '@/plp/components/SearchBarResults';\nimport { ProductItem as ProductItemComponent } from '@/plp/components/ProductItem';\n\nexport interface SearchBarResultsProps extends HTMLAttributes<HTMLDivElement> {\n products?: Product[];\n productRouteSearch?: (product: Product) => string;\n routeSearch?: (searchQuery: string) => void;\n slots?: {\n ProductImage?: SlotProps;\n ProductName?: SlotProps;\n ProductPrice?: SlotProps;\n };\n}\n\nexport const SearchBarResults: Container<SearchBarResultsProps> = ({\n products = [],\n productRouteSearch = (product: Product) => product?.url || '',\n routeSearch = () => {},\n slots,\n}) => {\n const [searchResults, setSearchResults] = useState<Product[]>(products);\n const [searchQuery, setSearchQuery] = useState('');\n const [showResults, setShowResults] = useState(products.length > 0);\n\n const translations = useText({ viewAllButton: 'Search.SearchInput.viewAllButton' });\n\n const handleSearchInputResult = useCallback(\n ({ result = [], request = {} }: { result?: Product[]; request?: Pick<SearchVariables, 'phrase'> }) => {\n const { phrase = '' } = request;\n setSearchResults(result);\n setSearchQuery(phrase);\n setShowResults(result.length > 0 && phrase.length > 0);\n },\n [],\n );\n\n useEffect(() => {\n const searchInputEvent = events.on('search-input/result', handleSearchInputResult);\n\n return () => {\n searchInputEvent?.off();\n };\n }, [handleSearchInputResult]);\n\n const handleClose = useCallback(() => {\n // emit \"search-input/result\" event with empty payloads to clear anything listening for that\n events.emit('search-input/result', {\n result: [],\n request: { phrase: '' },\n } as SearchInputResult);\n\n setShowResults(false);\n }, []);\n\n const handleOnSearchAll = useCallback(() => {\n // if a `routeSearch` cb function is provided, use it to handle any navigation needed\n routeSearch && routeSearch(searchQuery);\n\n // emit \"search/request\" event to trigger listeners of the search event\n events.emit('search/request', { phrase: searchQuery } as SearchInputRequest);\n\n handleClose();\n }, [routeSearch, searchQuery, handleClose]);\n\n const getProductImage = useCallback(\n (productItem: Product) => {\n const defaultImageProps: ImageProps = {\n loading: 'lazy',\n src: productItem.images?.[0]?.url || '',\n alt: productItem.images?.[0]?.label || '',\n width: '165',\n height: '165',\n };\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ productItem, defaultImageProps }}>\n <Image {...defaultImageProps} aria-label={productItem.sku} />\n </Slot>\n );\n },\n [slots?.ProductImage],\n );\n\n const getProductName = useCallback(\n (productItem: Product) => (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ productItem }}>\n {productItem?.name || ''}\n </Slot>\n ),\n [slots?.ProductName],\n );\n\n const getProductPrice = useCallback(\n (productItem: Product) => {\n const { value, currency: returnedCurrency = 'USD' } =\n productItem?.price?.final?.amount || productItem?.priceRange?.minimum?.final?.amount || {};\n\n // validate and fallback to USD if returnedCurrency is not supported\n const currency =\n Intl.supportedValuesOf('currency').indexOf(returnedCurrency || '') === -1 ? 'USD' : returnedCurrency;\n\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ productItem }}>\n <Price amount={typeof value === 'number' ? value : undefined} currency={currency} />\n </Slot>\n );\n },\n [slots?.ProductPrice],\n );\n\n const productContainer = useCallback(\n (productItem: Product) => (\n <ProductItemComponent\n productRouteSearch={productRouteSearch}\n productItem={productItem}\n productImage={getProductImage(productItem)}\n productName={getProductName(productItem)}\n productPrice={getProductPrice(productItem)}\n />\n ),\n [productRouteSearch, getProductImage, getProductName, getProductPrice],\n );\n\n const viewAllButton = useMemo(\n () => (\n <Button variant=\"tertiary\" onClick={handleOnSearchAll}>\n {translations.viewAllButton}\n </Button>\n ),\n [translations.viewAllButton, handleOnSearchAll],\n );\n\n const productList = useMemo(\n () => searchResults?.map((product) => productContainer(product)),\n [searchResults, productContainer],\n );\n\n if (!searchResults.length || !showResults) {\n return null;\n }\n\n return <SearchBarResultsComponent productList={productList} viewAllButton={viewAllButton} onClose={handleClose} />;\n};\n"],"names":["SearchBarResults","productList","viewAllButton","onClose","props","hasData","popoverRef","useRef","handleClickOutside","useCallback","event","handleEscapeKey","useEffect","jsx","jsxs","item","index","VComponent","ProductItem","productRouteSearch","product","productItem","productImage","productName","productPrice","productData","useMemo","name","sku","url","handleProductClick","searchProductClick","SEARCH_UNIT_ID","products","routeSearch","slots","searchResults","setSearchResults","useState","searchQuery","setSearchQuery","showResults","setShowResults","translations","useText","handleSearchInputResult","result","request","phrase","searchInputEvent","events","handleClose","handleOnSearchAll","getProductImage","defaultImageProps","_b","_a","_d","_c","Slot","Image","getProductName","getProductPrice","value","returnedCurrency","_e","currency","Price","productContainer","ProductItemComponent","Button","SearchBarResultsComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SearchBarResults.js","sources":["/@dropins/storefront-product-discovery/src/components/SearchBarResults/SearchBarResults.tsx","/@dropins/storefront-product-discovery/src/components/ProductItem/ProductItem.tsx","/@dropins/storefront-product-discovery/src/containers/SearchBarResults/SearchBarResults.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useEffect, useRef, useCallback } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\n\nimport '@/plp/components/SearchBarResults/SearchBarResults.css';\n\nexport interface SearchBarResultsProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n viewAllButton?: VNode;\n onClose?: () => void;\n}\n\nexport const SearchBarResults: FunctionComponent<SearchBarResultsProps> = ({\n productList,\n viewAllButton,\n onClose,\n ...props\n}) => {\n const hasData = productList && productList.length > 0;\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) {\n onClose?.();\n }\n },\n [onClose],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose?.();\n }\n },\n [onClose],\n );\n\n useEffect(() => {\n if (!hasData) return;\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [hasData, handleClickOutside, handleEscapeKey]);\n\n if (!hasData) return null;\n\n return (\n <div className=\"product-discovery--search-bar-results\" {...props}>\n <div\n className=\"product-discovery--search-bar-results__popover\"\n ref={popoverRef}\n role=\"region\"\n aria-label=\"Search results\"\n aria-live=\"polite\"\n >\n <div className=\"product-discovery--search-bar-results__outer-container\" {...props}>\n <div\n className=\"product-discovery--search-bar-results__grid\"\n role=\"list\"\n aria-label={`${productList?.length || 0} search results`}\n >\n {productList?.map((item, index) => (\n <div key={index} role=\"listitem\">\n {item}\n </div>\n ))}\n </div>\n {viewAllButton && (\n <div className=\"product-discovery--search-bar-results__view-all-wrapper\">\n <VComponent className=\"product-discovery--search-bar-results__view-all-button\" node={viewAllButton} />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n ***************************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { AnchorHTMLAttributes, useMemo } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport { Product } from '@/plp/data/models/product';\n\nimport '@/plp/components/ProductItem/ProductItem.css';\nimport { SEARCH_UNIT_ID, searchProductClick } from '@/plp/utils/acdlEvents';\n\nexport interface ProductItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n productRouteSearch?: (product: Product) => string;\n productItem: Product;\n productImage?: VNode;\n productName?: VNode;\n productPrice?: VNode;\n}\n\nexport const ProductItem: FunctionComponent<ProductItemProps> = ({\n productRouteSearch = (product: Product) => product?.url || '',\n productItem,\n productImage,\n productName,\n productPrice,\n ...props\n}) => {\n const productData = useMemo(() => {\n const { name = '', sku = '', url = '' } = productItem || {};\n\n // create tooltip text depending on available data\n const tooltipText = [name, sku && `SKU: ${sku}`].filter(Boolean).join('\\n');\n\n return { tooltipText, url };\n }, [productItem]);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, SEARCH_UNIT_ID);\n };\n\n return (\n <a\n className=\"product-discovery--product-item\"\n href={productRouteSearch(productItem)}\n rel=\"noopener noreferrer\"\n title={productData.tooltipText}\n onClick={() => handleProductClick(productItem)}\n {...props}\n >\n <div className=\"product-discovery--product-item__image\">\n <VComponent node={productImage} />\n </div>\n <div className=\"product-discovery--product-item__details\">\n <VComponent node={productName} />\n <VComponent node={productPrice} />\n </div>\n </a>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect, useCallback, useMemo } from 'preact/compat';\nimport { Button, Image, ImageProps, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\n\nimport { Product, SearchInputRequest, SearchInputResult } from '@/plp/data/models/product';\nimport { SearchVariables } from '@/plp/data/models/api';\nimport { SearchBarResults as SearchBarResultsComponent } from '@/plp/components/SearchBarResults';\nimport { ProductItem as ProductItemComponent } from '@/plp/components/ProductItem';\n\nexport interface SearchBarResultsProps extends HTMLAttributes<HTMLDivElement> {\n products?: Product[];\n productRouteSearch?: (product: Product) => string;\n routeSearch?: (searchQuery: string) => void;\n slots?: {\n ProductImage?: SlotProps;\n ProductName?: SlotProps;\n ProductPrice?: SlotProps;\n };\n}\n\nexport const SearchBarResults: Container<SearchBarResultsProps> = ({\n products = [],\n productRouteSearch = (product: Product) => product?.url || '',\n routeSearch = () => {},\n slots,\n}) => {\n const [searchResults, setSearchResults] = useState<Product[]>(products);\n const [searchQuery, setSearchQuery] = useState('');\n const [showResults, setShowResults] = useState(products.length > 0);\n\n const translations = useText({ viewAllButton: 'Search.SearchInput.viewAllButton' });\n\n const handleSearchInputResult = useCallback(\n ({ result = [], request = {} }: { result?: Product[]; request?: Pick<SearchVariables, 'phrase'> }) => {\n const { phrase = '' } = request;\n setSearchResults(result);\n setSearchQuery(phrase);\n setShowResults(result.length > 0 && phrase.length > 0);\n },\n [],\n );\n\n useEffect(() => {\n const searchInputEvent = events.on('search-input/result', handleSearchInputResult);\n\n return () => {\n searchInputEvent?.off();\n };\n }, [handleSearchInputResult]);\n\n const handleClose = useCallback(() => {\n // emit \"search-input/result\" event with empty payloads to clear anything listening for that\n events.emit('search-input/result', {\n result: [],\n request: { phrase: '' },\n } as SearchInputResult);\n\n setShowResults(false);\n }, []);\n\n const handleOnSearchAll = useCallback(() => {\n // if a `routeSearch` cb function is provided, use it to handle any navigation needed\n routeSearch && routeSearch(searchQuery);\n\n // emit \"search/request\" event to trigger listeners of the search event\n events.emit('search/request', { phrase: searchQuery } as SearchInputRequest);\n\n handleClose();\n }, [routeSearch, searchQuery, handleClose]);\n\n const getProductImage = useCallback(\n (productItem: Product) => {\n const defaultImageProps: ImageProps = {\n loading: 'lazy',\n src: productItem.images?.[0]?.url || '',\n alt: productItem.images?.[0]?.label || '',\n width: 165,\n height: 165,\n params: { width: 165 },\n };\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ productItem, defaultImageProps }}>\n <Image {...defaultImageProps} aria-label={productItem.sku} />\n </Slot>\n );\n },\n [slots?.ProductImage],\n );\n\n const getProductName = useCallback(\n (productItem: Product) => (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ productItem }}>\n {productItem?.name || ''}\n </Slot>\n ),\n [slots?.ProductName],\n );\n\n const getProductPrice = useCallback(\n (productItem: Product) => {\n const { value, currency: returnedCurrency = 'USD' } =\n productItem?.price?.final?.amount || productItem?.priceRange?.minimum?.final?.amount || {};\n\n // validate and fallback to USD if returnedCurrency is not supported\n const currency =\n Intl.supportedValuesOf('currency').indexOf(returnedCurrency || '') === -1 ? 'USD' : returnedCurrency;\n\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ productItem }}>\n <Price amount={typeof value === 'number' ? value : undefined} currency={currency} />\n </Slot>\n );\n },\n [slots?.ProductPrice],\n );\n\n const productContainer = useCallback(\n (productItem: Product) => (\n <ProductItemComponent\n productRouteSearch={productRouteSearch}\n productItem={productItem}\n productImage={getProductImage(productItem)}\n productName={getProductName(productItem)}\n productPrice={getProductPrice(productItem)}\n />\n ),\n [productRouteSearch, getProductImage, getProductName, getProductPrice],\n );\n\n const viewAllButton = useMemo(\n () => (\n <Button variant=\"tertiary\" onClick={handleOnSearchAll}>\n {translations.viewAllButton}\n </Button>\n ),\n [translations.viewAllButton, handleOnSearchAll],\n );\n\n const productList = useMemo(\n () => searchResults?.map((product) => productContainer(product)),\n [searchResults, productContainer],\n );\n\n if (!searchResults.length || !showResults) {\n return null;\n }\n\n return <SearchBarResultsComponent productList={productList} viewAllButton={viewAllButton} onClose={handleClose} />;\n};\n"],"names":["SearchBarResults","productList","viewAllButton","onClose","props","hasData","popoverRef","useRef","handleClickOutside","useCallback","event","handleEscapeKey","useEffect","jsx","jsxs","item","index","VComponent","ProductItem","productRouteSearch","product","productItem","productImage","productName","productPrice","productData","useMemo","name","sku","url","handleProductClick","searchProductClick","SEARCH_UNIT_ID","products","routeSearch","slots","searchResults","setSearchResults","useState","searchQuery","setSearchQuery","showResults","setShowResults","translations","useText","handleSearchInputResult","result","request","phrase","searchInputEvent","events","handleClose","handleOnSearchAll","getProductImage","defaultImageProps","_b","_a","_d","_c","Slot","Image","getProductName","getProductPrice","value","returnedCurrency","_e","currency","Price","productContainer","ProductItemComponent","Button","SearchBarResultsComponent"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-product-discovery", "version": "1.0.2-
|
|
1
|
+
{"name": "@dropins/storefront-product-discovery", "version": "1.0.2-alpha8", "@dropins/tools": "^1.4.0-beta2", "license": "SEE LICENSE IN LICENSE.md"}
|