@dropins/storefront-product-discovery 0.8.0-alpha.1 → 1.0.0-beta.1
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/chunks/acdlEvents.js +1 -1
- package/chunks/acdlEvents.js.map +1 -1
- package/components/ProductItem/ProductItem.d.ts +3 -2
- package/containers/Facets.js +1 -1
- package/containers/Facets.js.map +1 -1
- package/containers/ProductList/ProductList.d.ts +1 -0
- package/containers/ProductList/utils/sortUtils.d.ts +2 -2
- package/containers/ProductList.js +1 -1
- package/containers/ProductList.js.map +1 -1
- package/containers/ResultsInfo.js +1 -1
- package/containers/ResultsInfo.js.map +1 -1
- package/containers/SearchBarResults/SearchBarResults.d.ts +1 -0
- package/containers/SearchBarResults.js +2 -2
- package/containers/SearchBarResults.js.map +1 -1
- package/package.json +1 -1
- package/render.js +4 -4
package/chunks/acdlEvents.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
const d=e=>{var n,o,s,c,i,l,u,p,f,g,v,
|
|
3
|
+
const d=e=>{var n,o,s,c,i,l,u,p,f,g,_,v,S,C,E,I,k,w,D,T,b,x,h,P,A,U,t,L,N,H,K,O,V,q,z,X,F,Q,W,j,B,G,J,Y,Z,$;return e?{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:((n=e==null?void 0:e.images)==null?void 0:n.map(y=>({label:y.label||"",roles:y.roles||[],url:y.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:((c=(s=(o=e==null?void 0:e.price)==null?void 0:o.final)==null?void 0:s.amount)==null?void 0:c.value)||0,currency:((u=(l=(i=e==null?void 0:e.price)==null?void 0:i.final)==null?void 0:l.amount)==null?void 0:u.currency)||""}},regular:{amount:{value:((g=(f=(p=e==null?void 0:e.price)==null?void 0:p.regular)==null?void 0:f.amount)==null?void 0:g.value)||0,currency:((S=(v=(_=e==null?void 0:e.price)==null?void 0:_.regular)==null?void 0:v.amount)==null?void 0:S.currency)||""}},roles:((C=e==null?void 0:e.price)==null?void 0:C.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((w=(k=(I=(E=e==null?void 0:e.priceRange)==null?void 0:E.minimum)==null?void 0:I.final)==null?void 0:k.amount)==null?void 0:w.value)||0,currency:((x=(b=(T=(D=e==null?void 0:e.priceRange)==null?void 0:D.minimum)==null?void 0:T.final)==null?void 0:b.amount)==null?void 0:x.currency)||""}},regular:{amount:{value:((U=(A=(P=(h=e==null?void 0:e.priceRange)==null?void 0:h.minimum)==null?void 0:P.regular)==null?void 0:A.amount)==null?void 0:U.value)||0,currency:((H=(N=(L=(t=e==null?void 0:e.priceRange)==null?void 0:t.minimum)==null?void 0:L.regular)==null?void 0:N.amount)==null?void 0:H.currency)||""}}},maximum:{final:{amount:{value:((q=(V=(O=(K=e==null?void 0:e.priceRange)==null?void 0:K.maximum)==null?void 0:O.final)==null?void 0:V.amount)==null?void 0:q.value)||0,currency:((Q=(F=(X=(z=e==null?void 0:e.priceRange)==null?void 0:z.maximum)==null?void 0:X.final)==null?void 0:F.amount)==null?void 0:Q.currency)||""}},regular:{amount:{value:((G=(B=(j=(W=e==null?void 0:e.priceRange)==null?void 0:W.maximum)==null?void 0:j.regular)==null?void 0:B.amount)==null?void 0:G.value)||0,currency:(($=(Z=(Y=(J=e==null?void 0:e.priceRange)==null?void 0:J.maximum)==null?void 0:Y.regular)==null?void 0:Z.amount)==null?void 0:$.currency)||""}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""}:{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:""}};function pe(e){var o,s,c,i;const r=e==null?void 0:e.productSearch;return{facets:(r==null?void 0:r.facets)||[],items:(r==null?void 0:r.items.map(l=>d(l==null?void 0:l.productView)))||[],pageInfo:{currentPage:((o=r==null?void 0:r.page_info)==null?void 0:o.current_page)||1,totalPages:((s=r==null?void 0:r.page_info)==null?void 0:s.total_pages)||1,totalItems:((c=r==null?void 0:r.page_info)==null?void 0:c.total_items)||0,pageSize:((i=r==null?void 0:r.page_info)==null?void 0:i.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0}}function fe(e){const r=e==null?void 0:e.attributeMetadata;return{sortable:(r==null?void 0:r.sortable)||[],filterableInSearch:(r==null?void 0:r.filterableInSearch)||[]}}const ge=e=>{var r,n;return((n=(r=e==null?void 0:e.productSearch)==null?void 0:r.items)==null?void 0:n.reduce((o,s)=>{if(!(s!=null&&s.productView))return o;const c=d(s.productView);return c&&o.push(c),o},[]))||[]},M="searchInputContext",a="searchResultsContext",me="livesearch-plp",Re="livesearch-popover",re="search-product-click",se="search-request-sent",oe="search-response-received",ue="search-results-view";function m(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function ee(e){const r=m();return r.getState?r.getState(e):{}}function ne(e,r){const n=m();n.push({[e]:null}),n.push({[e]:r})}function R(e,r){m().push(o=>{const s=o.getState?o.getState():{};o.push({event:e,eventInfo:{...s,...r}})})}const ye=e=>{R(se,{searchUnitId:e})},_e=e=>{R(oe,{searchUnitId:e})},ve=e=>{R(ue,{searchUnitId:e})},Se=(e,r)=>{R(re,{sku:e,searchUnitId:r})},Ce=(e,r,n,o,s,c,i)=>{if(!m)return;const u=ee(M)||{};u!=null&&u.units||(u.units=[]);const p={searchUnitId:e,searchRequestId:r,queryTypes:["products","suggestions"],phrase:n,pageSize:s,currentPage:c,filter:o,sort:i},f=u.units.findIndex(g=>g.searchUnitId===e);f<0?u.units.push(p):u.units[f]=p,ne(M,u)},Ee=(e,r,n)=>{var l,u;if(!m)return;const s=ee(a)||{};s!=null&&s.units||(s.units=[]);const c=s.units.findIndex(p=>p.searchUnitId===e),i={searchUnitId:e,searchRequestId:r,products:ce(n.items),categories:[],suggestions:ie(n.suggestions),page:((l=n==null?void 0:n.pageInfo)==null?void 0:l.currentPage)||1,perPage:((u=n==null?void 0:n.pageInfo)==null?void 0:u.pageSize)||20,facets:le(n.facets)};c<0?s.units.push(i):s.units[c]=i,ne(a,s)},ce=e=>e?e.map((n,o)=>{var s,c,i,l,u,p,f,g;return{name:n==null?void 0:n.name,sku:n==null?void 0:n.sku,url:(n==null?void 0:n.url)??"",imageUrl:((s=n==null?void 0:n.images[0])==null?void 0:s.url)??"",price:((l=(i=(c=n==null?void 0:n.price)==null?void 0:c.final)==null?void 0:i.amount)==null?void 0:l.value)??((g=(f=(p=(u=n==null?void 0:n.priceRange)==null?void 0:u.minimum)==null?void 0:p.regular)==null?void 0:f.amount)==null?void 0:g.value),rank:o}}):[],ie=e=>e?e.map((n,o)=>({suggestion:n,rank:o})):[],le=e=>e?e.map(n=>({attribute:n==null?void 0:n.attribute,title:n==null?void 0:n.title,type:(n==null?void 0:n.type)||"PINNED",buckets:n==null?void 0:n.buckets.map(o=>o)})):[];export{me as P,Re as S,Ee as a,_e as b,ve as c,pe as d,fe as e,d as f,Se as g,ye as s,ge as t,Ce as u};
|
|
4
4
|
//# sourceMappingURL=acdlEvents.js.map
|
package/chunks/acdlEvents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acdlEvents.js","sources":["/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/utils/acdlEvents.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 { 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 transformedProduct;\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","/********************************************************************\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 { ProductSearchResponse } from '@/plp/data/models/api';\nimport {\n SearchFilter,\n SearchInput,\n SearchInputUnit,\n SearchSort,\n SearchResults,\n SearchResultUnit,\n SearchResultSuggestion,\n SearchFacetContext,\n SearchBucket,\n SearchResultProduct,\n} from '@/plp/data/models/acdl';\n\nconst SEARCH_INPUT_CONTEXT = 'searchInputContext';\nconst SEARCH_RESULTS_CONTEXT = 'searchResultsContext';\nconst PLP_UNIT_ID = 'livesearch-plp';\nconst SEARCH_UNIT_ID = 'livesearch-popover';\n//const SEARCH_CATEGORY_CLICK = 'search-category-click';\nconst SEARCH_PRODUCT_CLICK = 'search-product-click';\nconst SEARCH_REQUEST_SENT = 'search-request-sent';\nconst SEARCH_RESPONSE_RECEIVED = 'search-response-received';\nconst SEARCH_RESULTS_VIEW = 'search-results-view';\n//const CATEGORY_RESULTS_VIEW = 'category-results-view';\n\nfunction getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\n// Get a context from ACDL\nfunction getContext<T>(name?: string): T {\n const adobeDataLayer = getAdobeDataLayer();\n return adobeDataLayer.getState ? adobeDataLayer.getState(name) : ({} as T);\n}\n\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\nconst searchRequestSent = (searchUnitId: string) => {\n pushEvent(SEARCH_REQUEST_SENT, { searchUnitId });\n};\n\nconst searchResponseReceived = (searchUnitId: string) => {\n pushEvent(SEARCH_RESPONSE_RECEIVED, { searchUnitId });\n};\n\nconst categoryResultsView = () => {};\n\nconst searchResultsView = (searchUnitId: string) => {\n pushEvent(SEARCH_RESULTS_VIEW, { searchUnitId });\n};\n\nconst searchProductClick = (sku: string, searchUnitId: string) => {\n pushEvent(SEARCH_PRODUCT_CLICK, { sku, searchUnitId });\n};\n\nconst updateSearchInputCtx = (\n searchUnitId: string,\n searchRequestId: string,\n phrase: string,\n filters: Array<SearchFilter>,\n pageSize: number,\n currentPage: number,\n sort: Array<SearchSort>,\n): void => {\n const acdl = getAdobeDataLayer;\n if (!acdl) {\n // don't break search if events are broken/not loading\n return;\n }\n\n const searchInputCtx: SearchInput = getContext(SEARCH_INPUT_CONTEXT) || {};\n if (!searchInputCtx?.units) {\n searchInputCtx.units = [];\n }\n\n // create search input unit\n const searchInputUnit: SearchInputUnit = {\n searchUnitId,\n searchRequestId,\n queryTypes: ['products', 'suggestions'],\n phrase,\n pageSize,\n currentPage,\n filter: filters,\n sort,\n };\n\n // find search input unit index\n const searchInputUnitIndex = searchInputCtx.units.findIndex((unit) => unit.searchUnitId === searchUnitId);\n\n // update search input unit\n if (searchInputUnitIndex < 0) {\n searchInputCtx.units.push(searchInputUnit);\n } else {\n searchInputCtx.units[searchInputUnitIndex] = searchInputUnit;\n }\n\n setContext(SEARCH_INPUT_CONTEXT, searchInputCtx);\n};\n\nconst updateSearchResultsCtx = (\n searchUnitId: string,\n searchRequestId: string,\n results: ProductSearchResponse['productSearch'],\n): void => {\n const acdl = getAdobeDataLayer;\n if (!acdl) {\n // don't break search if events are broken/not loading\n return;\n }\n const searchResultsCtx: SearchResults = getContext(SEARCH_RESULTS_CONTEXT) || {};\n if (!searchResultsCtx?.units) {\n searchResultsCtx.units = [];\n }\n\n // find search result unit index\n const searchResultUnitIndex = searchResultsCtx.units.findIndex((unit) => unit.searchUnitId === searchUnitId);\n\n // create search result unit\n const searchResultUnit: SearchResultUnit = {\n searchUnitId,\n searchRequestId,\n products: createProducts(results.items),\n categories: [],\n suggestions: createSuggestions(results.suggestions),\n page: results?.pageInfo?.currentPage || 1,\n perPage: results?.pageInfo?.pageSize || 20,\n facets: createFacets(results.facets as SearchFacetContext[]),\n };\n\n // update search result unit\n if (searchResultUnitIndex < 0) {\n searchResultsCtx.units.push(searchResultUnit);\n } else {\n searchResultsCtx.units[searchResultUnitIndex] = searchResultUnit;\n }\n\n setContext(SEARCH_RESULTS_CONTEXT, searchResultsCtx);\n};\n\nconst createProducts = (items: ProductSearchResponse['productSearch']['items']): SearchResultProduct[] => {\n if (!items) {\n return [];\n }\n\n const products: SearchResultProduct[] = items.map((item, index) => ({\n name: item?.name,\n sku: item?.sku,\n url: item?.url ?? '',\n imageUrl: item?.images[0]?.url ?? '',\n price: item?.price?.final?.amount?.value ?? item?.priceRange?.minimum?.regular?.amount?.value,\n rank: index,\n }));\n\n return products;\n};\n\nconst createSuggestions = (items: ProductSearchResponse['productSearch']['suggestions']): SearchResultSuggestion[] => {\n if (!items) {\n return [];\n }\n\n const suggestions: SearchResultSuggestion[] = items.map((suggestion, index) => ({\n suggestion,\n rank: index,\n }));\n\n return suggestions;\n};\n\nconst createFacets = (items: SearchFacetContext[]): SearchFacetContext[] => {\n if (!items) {\n return [];\n }\n\n const facets = items.map<SearchFacetContext>((item) => ({\n attribute: item?.attribute,\n title: item?.title,\n type: item?.type || 'PINNED',\n buckets: item?.buckets.map<SearchBucket>((bucket: any) => bucket),\n }));\n\n return facets;\n};\n\nexport {\n searchRequestSent,\n searchResponseReceived,\n categoryResultsView,\n searchResultsView,\n searchProductClick,\n updateSearchInputCtx,\n updateSearchResultsCtx,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID,\n};\n"],"names":["transformProduct","data","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","_H","_I","_J","_K","_L","_M","_N","_O","_P","_Q","_R","_S","_T","image","transformProductSearchResponse","productSearch","product","transformAttributeMetadata","attributeMetadata","transformSearchResultProducts","searchResponse","returnedProductList","productItem","transformed","SEARCH_INPUT_CONTEXT","SEARCH_RESULTS_CONTEXT","PLP_UNIT_ID","SEARCH_UNIT_ID","SEARCH_REQUEST_SENT","SEARCH_RESPONSE_RECEIVED","SEARCH_RESULTS_VIEW","getAdobeDataLayer","getContext","name","adobeDataLayer","setContext","pushEvent","event","additionalContext","acdl","state","searchRequestSent","searchUnitId","searchResponseReceived","searchResultsView","updateSearchInputCtx","searchRequestId","phrase","filters","pageSize","currentPage","sort","searchInputCtx","searchInputUnit","searchInputUnitIndex","unit","updateSearchResultsCtx","results","searchResultsCtx","searchResultUnitIndex","searchResultUnit","createProducts","createSuggestions","createFacets","items","item","index","suggestion","bucket"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acdlEvents.js","sources":["/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/utils/acdlEvents.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 { 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 transformedProduct;\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","/********************************************************************\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 { ProductSearchResponse } from '@/plp/data/models/api';\nimport {\n SearchFilter,\n SearchInput,\n SearchInputUnit,\n SearchSort,\n SearchResults,\n SearchResultUnit,\n SearchResultSuggestion,\n SearchFacetContext,\n SearchBucket,\n SearchResultProduct,\n} from '@/plp/data/models/acdl';\n\nconst SEARCH_INPUT_CONTEXT = 'searchInputContext';\nconst SEARCH_RESULTS_CONTEXT = 'searchResultsContext';\nconst PLP_UNIT_ID = 'livesearch-plp';\nconst SEARCH_UNIT_ID = 'livesearch-popover';\n//const SEARCH_CATEGORY_CLICK = 'search-category-click';\nconst SEARCH_PRODUCT_CLICK = 'search-product-click';\nconst SEARCH_REQUEST_SENT = 'search-request-sent';\nconst SEARCH_RESPONSE_RECEIVED = 'search-response-received';\nconst SEARCH_RESULTS_VIEW = 'search-results-view';\n//const CATEGORY_RESULTS_VIEW = 'category-results-view';\n\nfunction getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\n// Get a context from ACDL\nfunction getContext<T>(name?: string): T {\n const adobeDataLayer = getAdobeDataLayer();\n return adobeDataLayer.getState ? adobeDataLayer.getState(name) : ({} as T);\n}\n\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\nconst searchRequestSent = (searchUnitId: string) => {\n pushEvent(SEARCH_REQUEST_SENT, { searchUnitId });\n};\n\nconst searchResponseReceived = (searchUnitId: string) => {\n pushEvent(SEARCH_RESPONSE_RECEIVED, { searchUnitId });\n};\n\nconst categoryResultsView = () => {};\n\nconst searchResultsView = (searchUnitId: string) => {\n pushEvent(SEARCH_RESULTS_VIEW, { searchUnitId });\n};\n\nconst searchProductClick = (sku: string, searchUnitId: string) => {\n pushEvent(SEARCH_PRODUCT_CLICK, { sku, searchUnitId });\n};\n\nconst updateSearchInputCtx = (\n searchUnitId: string,\n searchRequestId: string,\n phrase: string,\n filters: Array<SearchFilter>,\n pageSize: number,\n currentPage: number,\n sort: Array<SearchSort>,\n): void => {\n const acdl = getAdobeDataLayer;\n if (!acdl) {\n // don't break search if events are broken/not loading\n return;\n }\n\n const searchInputCtx: SearchInput = getContext(SEARCH_INPUT_CONTEXT) || {};\n if (!searchInputCtx?.units) {\n searchInputCtx.units = [];\n }\n\n // create search input unit\n const searchInputUnit: SearchInputUnit = {\n searchUnitId,\n searchRequestId,\n queryTypes: ['products', 'suggestions'],\n phrase,\n pageSize,\n currentPage,\n filter: filters,\n sort,\n };\n\n // find search input unit index\n const searchInputUnitIndex = searchInputCtx.units.findIndex((unit) => unit.searchUnitId === searchUnitId);\n\n // update search input unit\n if (searchInputUnitIndex < 0) {\n searchInputCtx.units.push(searchInputUnit);\n } else {\n searchInputCtx.units[searchInputUnitIndex] = searchInputUnit;\n }\n\n setContext(SEARCH_INPUT_CONTEXT, searchInputCtx);\n};\n\nconst updateSearchResultsCtx = (\n searchUnitId: string,\n searchRequestId: string,\n results: ProductSearchResponse['productSearch'],\n): void => {\n const acdl = getAdobeDataLayer;\n if (!acdl) {\n // don't break search if events are broken/not loading\n return;\n }\n const searchResultsCtx: SearchResults = getContext(SEARCH_RESULTS_CONTEXT) || {};\n if (!searchResultsCtx?.units) {\n searchResultsCtx.units = [];\n }\n\n // find search result unit index\n const searchResultUnitIndex = searchResultsCtx.units.findIndex((unit) => unit.searchUnitId === searchUnitId);\n\n // create search result unit\n const searchResultUnit: SearchResultUnit = {\n searchUnitId,\n searchRequestId,\n products: createProducts(results.items),\n categories: [],\n suggestions: createSuggestions(results.suggestions),\n page: results?.pageInfo?.currentPage || 1,\n perPage: results?.pageInfo?.pageSize || 20,\n facets: createFacets(results.facets as SearchFacetContext[]),\n };\n\n // update search result unit\n if (searchResultUnitIndex < 0) {\n searchResultsCtx.units.push(searchResultUnit);\n } else {\n searchResultsCtx.units[searchResultUnitIndex] = searchResultUnit;\n }\n\n setContext(SEARCH_RESULTS_CONTEXT, searchResultsCtx);\n};\n\nconst createProducts = (items: ProductSearchResponse['productSearch']['items']): SearchResultProduct[] => {\n if (!items) {\n return [];\n }\n\n const products: SearchResultProduct[] = items.map((item, index) => ({\n name: item?.name,\n sku: item?.sku,\n url: item?.url ?? '',\n imageUrl: item?.images[0]?.url ?? '',\n price: item?.price?.final?.amount?.value ?? item?.priceRange?.minimum?.regular?.amount?.value,\n rank: index,\n }));\n\n return products;\n};\n\nconst createSuggestions = (items: ProductSearchResponse['productSearch']['suggestions']): SearchResultSuggestion[] => {\n if (!items) {\n return [];\n }\n\n const suggestions: SearchResultSuggestion[] = items.map((suggestion, index) => ({\n suggestion,\n rank: index,\n }));\n\n return suggestions;\n};\n\nconst createFacets = (items: SearchFacetContext[]): SearchFacetContext[] => {\n if (!items) {\n return [];\n }\n\n const facets = items.map<SearchFacetContext>((item) => ({\n attribute: item?.attribute,\n title: item?.title,\n type: item?.type || 'PINNED',\n buckets: item?.buckets.map<SearchBucket>((bucket: any) => bucket),\n }));\n\n return facets;\n};\n\nexport {\n searchRequestSent,\n searchResponseReceived,\n categoryResultsView,\n searchResultsView,\n searchProductClick,\n updateSearchInputCtx,\n updateSearchResultsCtx,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID,\n};\n"],"names":["transformProduct","data","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","_H","_I","_J","_K","_L","_M","_N","_O","_P","_Q","_R","_S","_T","image","transformProductSearchResponse","productSearch","product","transformAttributeMetadata","attributeMetadata","transformSearchResultProducts","searchResponse","returnedProductList","productItem","transformed","SEARCH_INPUT_CONTEXT","SEARCH_RESULTS_CONTEXT","PLP_UNIT_ID","SEARCH_UNIT_ID","SEARCH_PRODUCT_CLICK","SEARCH_REQUEST_SENT","SEARCH_RESPONSE_RECEIVED","SEARCH_RESULTS_VIEW","getAdobeDataLayer","getContext","name","adobeDataLayer","setContext","pushEvent","event","additionalContext","acdl","state","searchRequestSent","searchUnitId","searchResponseReceived","searchResultsView","searchProductClick","sku","updateSearchInputCtx","searchRequestId","phrase","filters","pageSize","currentPage","sort","searchInputCtx","searchInputUnit","searchInputUnitIndex","unit","updateSearchResultsCtx","results","searchResultsCtx","searchResultUnitIndex","searchResultUnit","createProducts","createSuggestions","createFacets","items","item","index","suggestion","bucket"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { FunctionComponent, VNode } from 'preact';
|
|
2
|
-
import {
|
|
2
|
+
import { AnchorHTMLAttributes } from 'preact/compat';
|
|
3
3
|
import { Product } from '../../data/models/product';
|
|
4
4
|
|
|
5
|
-
export interface ProductItemProps extends
|
|
5
|
+
export interface ProductItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
6
|
+
productRouteSearch?: (product: Product) => string;
|
|
6
7
|
productItem: Product;
|
|
7
8
|
productImage?: VNode;
|
|
8
9
|
productName?: VNode;
|
package/containers/Facets.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as k,jsx as
|
|
3
|
+
import{jsxs as k,jsx as o,Fragment as b}from"@dropins/tools/preact-jsx-runtime.js";import*as u from"@dropins/tools/preact-compat.js";import{useState as C,useEffect as q}from"@dropins/tools/preact-compat.js";import{VComponent as L,classes as z,Slot as R}from"@dropins/tools/lib.js";import{Button as x,Icon as A,ActionButton as H,PriceRange as V,Divider as j,Checkbox as D,RadioButton as P}from"@dropins/tools/components.js";/* empty css */import{useText as O}from"@dropins/tools/i18n.js";/* empty css *//* empty css *//* empty css */import{events as N}from"@dropins/tools/event-bus.js";const T=e=>u.createElement("svg",{id:"Icon_Add_Base","data-name":"Icon \\u2013 Add \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...e},u.createElement("g",{id:"Large"},u.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),u.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},u.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_579","data-name":"Line 579",y2:12.7,transform:"translate(2.216 -4.087)",fill:"none",stroke:"currentColor"}),u.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_580","data-name":"Line 580",x2:12.7,transform:"translate(-4.079 2.263)",fill:"none",stroke:"currentColor"})))),U=e=>u.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},u.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M3 12H21",stroke:"currentColor"}),u.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M3 6H21",stroke:"currentColor"}),u.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M3 18H21",stroke:"currentColor"})),W=e=>u.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},u.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),u.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),Y=e=>u.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},u.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1.5,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),G=({numberOfOptionsConfig:e=5,header:t,buckets:c})=>{const l=O({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),m=e,[h,g]=C(c.length<m),p=h?c.length:m;return k("div",{children:[o(L,{className:"product-discovery-facet__header",node:t}),c.slice(0,p).map((v,F)=>o(L,{className:"product-discovery-facet__bucket",node:v},F)),!h&&c.length>m&&o(x,{variant:"tertiary",icon:o(A,{source:T,size:"24"}),onClick:()=>g(!h),children:l.showMore}),h&&c.length>m&&o(x,{variant:"tertiary",icon:o(A,{source:Y,size:"24"}),onClick:()=>g(!h),children:l.showLess})]})},J=({selectedFacets:e,facets:t})=>{const[c,l]=C(!0),m=()=>{l(!c)};return k("div",{className:"product-discovery-facet-list",children:[o("div",{className:"product-discovery-facet-list__show-filters-button",children:k(H,{onClick:()=>{m()},children:[o(A,{source:U,size:"16"}),o("span",{children:"Filters"})]})}),o(L,{className:"product-discovery-facet-list__selected-filters",node:e}),o(L,{className:z(["product-discovery-facet-list__facet-options",["product-discovery-facet-list__facet-options--hidden",c]]),node:t})]})},K="no",Q="yes",X=e=>{const t=e.buckets.find(c=>c.selected);return t?{attribute:e.attribute,range:{from:t.from,to:t.to}}:null},Z=e=>{const t=e.buckets.reduce((c,l)=>(l.selected&&c.push(l.title),c),[]);return t.length===0?null:{attribute:e.attribute,in:t}},I=e=>{var t;switch((t=e.buckets[0])==null?void 0:t.__typename){case"RangeBucket":return X(e);case"ScalarBucket":case"CategoryView":return Z(e)}},ee=e=>{var c,l,m,h,g,p,v,F,S,_,y;const t=e[0];return(m=(l=(c=t==null?void 0:t.price)==null?void 0:c.regular)==null?void 0:l.amount)!=null&&m.currency?t.price.regular.amount.currency:(v=(p=(g=(h=t==null?void 0:t.priceRange)==null?void 0:h.minimum)==null?void 0:g.regular)==null?void 0:p.amount)!=null&&v.currency?(y=(_=(S=(F=t==null?void 0:t.priceRange)==null?void 0:F.minimum)==null?void 0:S.regular)==null?void 0:_.amount)==null?void 0:y.currency:"USD"},te=(e,t,c)=>(t==null?void 0:t.attribute)==="price"?o(V,{minimumAmount:e.from,maximumAmount:e.to,currency:c||"USD",display:"dash"}):e.title,re=(e,t)=>e.title===K?`Not ${t.title}`:e.title===Q?t.title:e.title,M=(e,t,c)=>{switch(e.__typename){case"RangeBucket":return te(e,t,c);case"ScalarBucket":case"CategoryView":return re(e,t)}},he=({slots:e})=>{const t=O({clearAll:"Search.Facet.clearAll"}),[c,l]=C([]),[m,h]=C(null),g=n=>{if(!n||!n.result.facets&&!n.result.items&&!n.request.filter){l([]);return}const{facets:a,items:d}=n.result;h(ee(d));const r=n.request.filter;if(a){const s=a.map(i=>{const f=i.buckets.map(w=>{w.selected=!1;const E=r==null?void 0:r.find(B=>B.attribute===i.attribute);if(E){const B=E.range;(B&&w.from===B.from&&w.to===B.to||E.in&&E.in.includes(w.title))&&(w.selected=!0)}return w});return i.buckets=f,i});l(s)}},p=n=>{const a=c.map(r=>{const s=n.find(i=>i.attribute===r.attribute);return s||r}),d=a.reduce((r,s)=>{const i=I(s);return i&&r.push(i),r},[]);l(a),N.emit("search/request",{filter:d})},v=(n,a)=>{const d=n.buckets.map(s=>(s.title===a&&(s.selected=!1),s)),r=n;r.buckets=d,p([r])},F=()=>{const n=c.map(a=>{const d=a.buckets.map(r=>(r.selected=!1,r));return a.buckets=d,a});l(n),N.emit("search/request",{filter:[]})},S=(n,a)=>{const d=a.buckets.map(s=>{var i;return((i=a.buckets[0])==null?void 0:i.__typename)==="RangeBucket"&&(s.selected=!1),s.title===n.target.value&&(s.selected=n.target.checked),s}),r=a;r.buckets=d,p([r])},_=n=>{const a=o("span",{children:n.title}),d=n.buckets.map(r=>{var i;const s=M(r,n,m);switch((i=n.buckets[0])==null?void 0:i.__typename){case"RangeBucket":return o(P,{"data-testid":`${r.title}-radio`,label:s,name:n.attribute,value:r.title,checked:r.selected,onChange:f=>{S(f,n)}});case"ScalarBucket":case"CategoryView":return o(D,{"data-testid":`${r.title}-checkbox`,label:`${s} (${r.count})`,name:n.attribute,value:r.title,checked:r.selected,onChange:f=>{S(f,n)}});default:return null}}).filter(r=>r!==null);return o(G,{header:a,buckets:d})},y=()=>o(R,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:c},children:c.map(n=>n.buckets.length>0?k(b,{children:[o(R,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:n},children:_(n)}),o(j,{variant:"secondary"})]}):null)}),$=()=>{const n=c.reduce((r,s)=>(s.buckets.filter(f=>f.selected).length>0&&r.push(s),r),[]),a=n.map(r=>r.buckets.map(s=>{if(s.selected){const i=M(s,r,m);return o(x,{"data-testid":`${s.title}-selected-btn`,variant:"secondary",children:k(b,{children:[o("span",{children:i}),o(A,{source:W,size:"16"})]}),onClick:()=>{v(r,s.title)}})}return null})),d=a.length>0?o(x,{variant:"secondary",onClick:()=>{F()},children:o("span",{children:t.clearAll})}):null;return k(R,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:n},children:[a,d]})};return q(()=>{N.on("search/result",g)},[]),o(J,{selectedFacets:$(),facets:y()})};export{he as Facets,he as default};
|
|
4
4
|
//# sourceMappingURL=Facets.js.map
|
package/containers/Facets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Facets.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Add.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Burger.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Close.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Minus.svg","/@dropins/storefront-product-discovery/src/components/Facet/Facet.tsx","/@dropins/storefront-product-discovery/src/components/FacetList/FacetList.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/utils/facetUtils.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/Facets.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgAdd = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Add_Base\", \"data-name\": \"Icon \\\\u2013 Add \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Add_icon\", \"data-name\": \"Add icon\", transform: \"translate(9.734 9.737)\" }, /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_579\", \"data-name\": \"Line 579\", y2: 12.7, transform: \"translate(2.216 -4.087)\", fill: \"none\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_580\", \"data-name\": \"Line 580\", x2: 12.7, transform: \"translate(-4.079 2.263)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgAdd;\n","import * as React from \"react\";\nconst SvgBurger = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M3 12H21\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M3 6H21\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M3 18H21\", stroke: \"currentColor\" }));\nexport default SvgBurger;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","import * as React from \"react\";\nconst SvgMinus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M17.3332 11.75H6.6665\", strokeWidth: 1.5, strokeLinecap: \"square\", strokeLinejoin: \"round\", vectorEffect: \"non-scaling-stroke\", fill: \"none\", stroke: \"currentColor\" }));\nexport default SvgMinus;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport '@/plp/components/Facet/Facet.css';\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { Minus, Add } from '@adobe-commerce/elsie/icons';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface FacetProps extends HTMLAttributes<HTMLDivElement> {\n numberOfOptionsConfig?: number;\n header: VNode;\n buckets: VNode[];\n}\n\nexport const Facet: FunctionComponent<FacetProps> = ({ numberOfOptionsConfig = 5, header, buckets }) => {\n const translations = useText({\n showMore: 'Search.Facet.showMore',\n showLess: 'Search.Facet.showLess',\n });\n const numberOfOptionsShown = numberOfOptionsConfig;\n const [showMore, setShowMore] = useState(buckets.length < numberOfOptionsShown);\n\n const numberOfOptions = showMore ? buckets.length : numberOfOptionsShown;\n\n return (\n <div>\n <VComponent className=\"plp-facet__header\" node={header} />\n {buckets.slice(0, numberOfOptions).map((bucket, index) => {\n return <VComponent key={index} className=\"plp-facet__bucket\" node={bucket} />;\n })}\n {!showMore && buckets.length > numberOfOptionsShown && (\n <Button variant=\"tertiary\" icon={<Icon source={Add} size=\"24\" />} onClick={(): void => setShowMore(!showMore)}>\n {translations.showMore}\n </Button>\n )}\n {showMore && buckets.length > numberOfOptionsShown && (\n <Button\n variant=\"tertiary\"\n icon={<Icon source={Minus} size=\"24\" />}\n onClick={(): void => setShowMore(!showMore)}\n >\n {translations.showLess}\n </Button>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport '@/plp/components/FacetList/FacetList.css';\nimport { ActionButton, Icon } from '@adobe-commerce/elsie/components';\nimport { Burger } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\n\nexport interface FacetListProps extends HTMLAttributes<HTMLDivElement> {\n selectedFacets: VNode;\n facets: VNode;\n}\n\nexport const FacetList: FunctionComponent<FacetListProps> = ({ selectedFacets, facets }) => {\n const [showFilters, setShowFilters] = useState(true);\n\n const handleShowFilters = () => {\n setShowFilters(!showFilters);\n };\n\n return (\n <div className=\"plp-facet-list\">\n <div className=\"plp-facet-list__show-filters-button\">\n <ActionButton\n onClick={() => {\n handleShowFilters();\n }}\n >\n <Icon source={Burger} size=\"16\" />\n <span>Filters</span>\n </ActionButton>\n </div>\n <VComponent className=\"plp-facet-list__selected-filters\" node={selectedFacets} />\n <VComponent\n className={classes(['plp-facet-list__facet-options', ['plp-facet-list__facet-options--hidden', showFilters]])}\n node={facets}\n />\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { SearchFacet } from '@/plp/data/models/api';\nimport { Product } from '@/plp/data/models/product';\nimport { PriceRange } from '@adobe-commerce/elsie/components';\n\nconst BOOLEAN_NO = 'no';\nconst BOOLEAN_YES = 'yes';\n\nconst getRangeFacetFilter = (facet: SearchFacet) => {\n const selectedRange = facet.buckets.find((bucket) => bucket.selected);\n if (!selectedRange) {\n return null;\n }\n return {\n attribute: facet.attribute,\n range: {\n from: selectedRange.from,\n to: selectedRange.to,\n },\n };\n};\n\nconst getScalarFacetFilter = (facet: SearchFacet) => {\n const scalarSelections = facet.buckets.reduce((accu, curr) => {\n if (curr.selected) {\n accu.push(curr.title);\n }\n return accu;\n }, [] as string[]);\n if (scalarSelections.length === 0) {\n return null;\n }\n return {\n attribute: facet.attribute,\n in: scalarSelections,\n };\n};\n\nconst getFilterSelection = (facet: SearchFacet) => {\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n return getRangeFacetFilter(facet);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarFacetFilter(facet);\n default:\n break;\n }\n};\n\nconst getCurrencyType = (items: Product[]) => {\n const firstItem = items[0];\n if (firstItem?.price?.regular?.amount?.currency) {\n return firstItem.price.regular.amount.currency;\n } else if (firstItem?.priceRange?.minimum?.regular?.amount?.currency) {\n return firstItem?.priceRange?.minimum?.regular?.amount?.currency;\n }\n return 'USD'; // Default currency if not found\n};\n\nconst getRangeBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n if (facet?.attribute === 'price') {\n return (\n <PriceRange minimumAmount={bucket.from} maximumAmount={bucket.to} currency={currency || 'USD'} display=\"dash\" />\n );\n }\n return bucket.title;\n};\n\nconst getScalarBucketLabel = (bucket: any, facet: SearchFacet) => {\n if (bucket.title === BOOLEAN_NO) {\n return `Not ${facet.title}`;\n } else if (bucket.title === BOOLEAN_YES) {\n return facet.title;\n }\n return bucket.title;\n};\n\nconst getBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n switch (bucket.__typename) {\n case 'RangeBucket':\n return getRangeBucketLabel(bucket, facet, currency);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarBucketLabel(bucket, facet);\n default:\n break;\n }\n};\n\nexport { getBucketLabel, getCurrencyType, getFilterSelection };\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchFilter, SearchFacet, SearchVariables, FacetBucket } from '@/plp/data/models/api';\nimport { getBucketLabel, getCurrencyType, getFilterSelection } from './utils/facetUtils';\nimport FacetList from '@/plp/components/FacetList';\nimport { Button, Checkbox, Divider, Icon, RadioButton } from '@adobe-commerce/elsie/components';\nimport { Facet } from '@/plp/components';\nimport { VNode } from 'preact';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface FacetsProps extends HTMLAttributes<HTMLDivElement> {\n slots?: {\n Facet?: SlotProps;\n SelectedFacets?: SlotProps;\n Facets?: SlotProps;\n };\n}\n\nexport const Facets: Container<FacetsProps> = ({ slots }) => {\n const translations = useText({\n clearAll: 'Search.Facet.clearAll',\n });\n\n const [facetList, setFacetList] = useState<SearchFacet[]>([]);\n const [currency, setCurrency] = useState<string | null>(null);\n\n const handleSearchResult = (payload: { result: ProductSearchResult; request: SearchVariables }): void => {\n if (!payload || (!payload.result.facets && !payload.result.items && !payload.request.filter)) {\n setFacetList([]);\n return;\n }\n const { facets, items } = payload.result;\n setCurrency(getCurrencyType(items));\n const filterList = payload.request.filter;\n if (facets) {\n const facetsWithSelections = facets.map((facet: SearchFacet) => {\n const selectedBuckets = facet.buckets.map((bucket) => {\n bucket.selected = false;\n const selectedFilter = filterList?.find((filter) => filter.attribute === facet.attribute);\n if (selectedFilter) {\n const selectedRange = selectedFilter.range;\n if (selectedRange && bucket.from === selectedRange.from && bucket.to === selectedRange.to) {\n bucket.selected = true;\n } else if (selectedFilter.in && selectedFilter.in.includes(bucket.title)) {\n bucket.selected = true;\n }\n }\n return bucket;\n });\n facet.buckets = selectedBuckets;\n return facet;\n });\n setFacetList(facetsWithSelections);\n }\n };\n\n const updateFacetSelections = (facets: SearchFacet[]): void => {\n const updatedFacetList = facetList.map((f) => {\n const newFacet = facets.find((facet) => facet.attribute === f.attribute);\n if (newFacet) {\n return newFacet;\n }\n return f;\n });\n const selectedFilterList = updatedFacetList.reduce((accu: SearchFilter[], facet: SearchFacet) => {\n const selectedFilter = getFilterSelection(facet);\n if (selectedFilter) {\n accu.push(selectedFilter as SearchFilter);\n }\n return accu;\n }, [] as SearchFilter[]);\n setFacetList(updatedFacetList);\n events.emit('search/request', { filter: selectedFilterList });\n };\n\n const handleCancelSelection = (facet: SearchFacet, title: string): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (bucket.title === title) {\n bucket.selected = false;\n }\n return bucket;\n });\n const newFacet = facet;\n newFacet.buckets = newBuckets;\n updateFacetSelections([newFacet]);\n };\n\n const clearAllSelections = (): void => {\n const updatedFacetList = facetList.map((facet) => {\n const updatedBuckets = facet.buckets.map((bucket) => {\n bucket.selected = false;\n return bucket;\n });\n facet.buckets = updatedBuckets;\n return facet;\n });\n setFacetList(updatedFacetList);\n events.emit('search/request', { filter: [] });\n };\n\n const changeFilter = (event: any, facet: SearchFacet): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (facet.buckets[0]?.__typename === 'RangeBucket') {\n bucket.selected = false;\n }\n if (bucket.title === event.target.value) {\n bucket.selected = event.target.checked;\n }\n return bucket;\n });\n const newFacet = facet;\n newFacet.buckets = newBuckets;\n updateFacetSelections([newFacet]);\n };\n\n const getFacetNode = (facet: SearchFacet): VNode => {\n const header = <span>{facet.title}</span>;\n const buckets = facet.buckets\n .map((bucket: FacetBucket) => {\n const bucketLabel = getBucketLabel(bucket, facet, currency);\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n return (\n <RadioButton\n data-testid={`${bucket.title}-radio`}\n label={bucketLabel}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet);\n }}\n />\n ) as VNode;\n case 'ScalarBucket':\n case 'CategoryView':\n return (\n <Checkbox\n data-testid={`${bucket.title}-checkbox`}\n label={`${bucketLabel} (${bucket.count})`}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet);\n }}\n />\n ) as VNode;\n default:\n return null;\n }\n })\n .filter((bucket) => bucket !== null);\n return (<Facet header={header} buckets={buckets} />) as VNode;\n };\n\n const getFacetsNode = (): VNode => {\n return (\n <Slot name=\"Facets\" slot={slots?.Facets} context={{ data: facetList }}>\n {facetList.map((facet) => {\n return facet.buckets.length > 0\n ? ((\n <>\n <Slot name=\"Facet\" slot={slots?.Facet} context={{ data: facet }}>\n {getFacetNode(facet)}\n </Slot>\n <Divider variant=\"secondary\" />\n </>\n ) as VNode)\n : null;\n })}\n </Slot>\n );\n };\n\n const getSelectedFacetsNode = (): VNode => {\n const selectedFacets = facetList.reduce((accu, curr) => {\n const selected = curr.buckets.filter((bucket: FacetBucket) => bucket.selected);\n if (selected.length > 0) {\n accu.push(curr);\n }\n return accu;\n }, [] as SearchFacet[]);\n const selectedFilterBtns = selectedFacets.map((facet) => {\n return facet.buckets.map((bucket) => {\n if (bucket.selected) {\n const bucketTitle = getBucketLabel(bucket, facet, currency);\n return (\n <Button\n data-testid={`${bucket.title}-selected-btn`}\n variant=\"secondary\"\n children={\n <>\n <span>{bucketTitle}</span>\n <Icon source={Close} size=\"16\" />\n </>\n }\n onClick={(): void => {\n handleCancelSelection(facet, bucket.title);\n }}\n />\n ) as VNode;\n }\n return null;\n });\n });\n\n const clearAllBtn =\n selectedFilterBtns.length > 0 ? (\n <Button\n variant=\"secondary\"\n onClick={(): void => {\n clearAllSelections();\n }}\n >\n <span>{translations.clearAll}</span>\n </Button>\n ) : null;\n return (\n <Slot name=\"SelectedFacets\" slot={slots?.SelectedFacets} context={{ data: selectedFacets }}>\n {selectedFilterBtns}\n {clearAllBtn}\n </Slot>\n );\n };\n\n useEffect(() => {\n events.on('search/result', handleSearchResult);\n }, []);\n\n return <FacetList selectedFacets={getSelectedFacetsNode()} facets={getFacetsNode()} />;\n};\n"],"names":["SvgAdd","props","React","SvgBurger","SvgClose","SvgMinus","Facet","numberOfOptionsConfig","header","buckets","translations","useText","numberOfOptionsShown","showMore","setShowMore","useState","numberOfOptions","jsx","VComponent","bucket","index","Button","Icon","Add","Minus","FacetList","selectedFacets","facets","showFilters","setShowFilters","handleShowFilters","jsxs","ActionButton","Burger","classes","BOOLEAN_NO","BOOLEAN_YES","getRangeFacetFilter","facet","selectedRange","getScalarFacetFilter","scalarSelections","accu","curr","getFilterSelection","_a","getCurrencyType","items","firstItem","_c","_b","_g","_f","_e","_d","_k","_j","_i","_h","getRangeBucketLabel","currency","PriceRange","getScalarBucketLabel","getBucketLabel","Facets","slots","facetList","setFacetList","setCurrency","handleSearchResult","payload","filterList","facetsWithSelections","selectedBuckets","selectedFilter","filter","updateFacetSelections","updatedFacetList","f","newFacet","selectedFilterList","events","handleCancelSelection","title","newBuckets","clearAllSelections","updatedBuckets","changeFilter","event","getFacetNode","bucketLabel","RadioButton","Checkbox","getFacetsNode","Slot","Fragment","Divider","getSelectedFacetsNode","selectedFilterBtns","bucketTitle","Close","clearAllBtn","useEffect"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
1
|
+
{"version":3,"file":"Facets.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Add.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Burger.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Close.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Minus.svg","/@dropins/storefront-product-discovery/src/components/Facet/Facet.tsx","/@dropins/storefront-product-discovery/src/components/FacetList/FacetList.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/utils/facetUtils.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/Facets.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgAdd = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Add_Base\", \"data-name\": \"Icon \\\\u2013 Add \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Add_icon\", \"data-name\": \"Add icon\", transform: \"translate(9.734 9.737)\" }, /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_579\", \"data-name\": \"Line 579\", y2: 12.7, transform: \"translate(2.216 -4.087)\", fill: \"none\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_580\", \"data-name\": \"Line 580\", x2: 12.7, transform: \"translate(-4.079 2.263)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgAdd;\n","import * as React from \"react\";\nconst SvgBurger = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M3 12H21\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M3 6H21\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M3 18H21\", stroke: \"currentColor\" }));\nexport default SvgBurger;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","import * as React from \"react\";\nconst SvgMinus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M17.3332 11.75H6.6665\", strokeWidth: 1.5, strokeLinecap: \"square\", strokeLinejoin: \"round\", vectorEffect: \"non-scaling-stroke\", fill: \"none\", stroke: \"currentColor\" }));\nexport default SvgMinus;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport '@/plp/components/Facet/Facet.css';\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { Minus, Add } from '@adobe-commerce/elsie/icons';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface FacetProps extends HTMLAttributes<HTMLDivElement> {\n numberOfOptionsConfig?: number;\n header: VNode;\n buckets: VNode[];\n}\n\nexport const Facet: FunctionComponent<FacetProps> = ({ numberOfOptionsConfig = 5, header, buckets }) => {\n const translations = useText({\n showMore: 'Search.Facet.showMore',\n showLess: 'Search.Facet.showLess',\n });\n const numberOfOptionsShown = numberOfOptionsConfig;\n const [showMore, setShowMore] = useState(buckets.length < numberOfOptionsShown);\n\n const numberOfOptions = showMore ? buckets.length : numberOfOptionsShown;\n\n return (\n <div>\n <VComponent className=\"product-discovery-facet__header\" node={header} />\n {buckets.slice(0, numberOfOptions).map((bucket, index) => {\n return <VComponent key={index} className=\"product-discovery-facet__bucket\" node={bucket} />;\n })}\n {!showMore && buckets.length > numberOfOptionsShown && (\n <Button variant=\"tertiary\" icon={<Icon source={Add} size=\"24\" />} onClick={(): void => setShowMore(!showMore)}>\n {translations.showMore}\n </Button>\n )}\n {showMore && buckets.length > numberOfOptionsShown && (\n <Button\n variant=\"tertiary\"\n icon={<Icon source={Minus} size=\"24\" />}\n onClick={(): void => setShowMore(!showMore)}\n >\n {translations.showLess}\n </Button>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport '@/plp/components/FacetList/FacetList.css';\nimport { ActionButton, Icon } from '@adobe-commerce/elsie/components';\nimport { Burger } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\n\nexport interface FacetListProps extends HTMLAttributes<HTMLDivElement> {\n selectedFacets: VNode;\n facets: VNode;\n}\n\nexport const FacetList: FunctionComponent<FacetListProps> = ({ selectedFacets, facets }) => {\n const [showFilters, setShowFilters] = useState(true);\n\n const handleShowFilters = () => {\n setShowFilters(!showFilters);\n };\n\n return (\n <div className=\"product-discovery-facet-list\">\n <div className=\"product-discovery-facet-list__show-filters-button\">\n <ActionButton\n onClick={() => {\n handleShowFilters();\n }}\n >\n <Icon source={Burger} size=\"16\" />\n <span>Filters</span>\n </ActionButton>\n </div>\n <VComponent className=\"product-discovery-facet-list__selected-filters\" node={selectedFacets} />\n <VComponent\n className={classes([\n 'product-discovery-facet-list__facet-options',\n ['product-discovery-facet-list__facet-options--hidden', showFilters],\n ])}\n node={facets}\n />\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { SearchFacet } from '@/plp/data/models/api';\nimport { Product } from '@/plp/data/models/product';\nimport { PriceRange } from '@adobe-commerce/elsie/components';\n\nconst BOOLEAN_NO = 'no';\nconst BOOLEAN_YES = 'yes';\n\nconst getRangeFacetFilter = (facet: SearchFacet) => {\n const selectedRange = facet.buckets.find((bucket) => bucket.selected);\n if (!selectedRange) {\n return null;\n }\n return {\n attribute: facet.attribute,\n range: {\n from: selectedRange.from,\n to: selectedRange.to,\n },\n };\n};\n\nconst getScalarFacetFilter = (facet: SearchFacet) => {\n const scalarSelections = facet.buckets.reduce((accu, curr) => {\n if (curr.selected) {\n accu.push(curr.title);\n }\n return accu;\n }, [] as string[]);\n if (scalarSelections.length === 0) {\n return null;\n }\n return {\n attribute: facet.attribute,\n in: scalarSelections,\n };\n};\n\nconst getFilterSelection = (facet: SearchFacet) => {\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n return getRangeFacetFilter(facet);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarFacetFilter(facet);\n default:\n break;\n }\n};\n\nconst getCurrencyType = (items: Product[]) => {\n const firstItem = items[0];\n if (firstItem?.price?.regular?.amount?.currency) {\n return firstItem.price.regular.amount.currency;\n } else if (firstItem?.priceRange?.minimum?.regular?.amount?.currency) {\n return firstItem?.priceRange?.minimum?.regular?.amount?.currency;\n }\n return 'USD'; // Default currency if not found\n};\n\nconst getRangeBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n if (facet?.attribute === 'price') {\n return (\n <PriceRange minimumAmount={bucket.from} maximumAmount={bucket.to} currency={currency || 'USD'} display=\"dash\" />\n );\n }\n return bucket.title;\n};\n\nconst getScalarBucketLabel = (bucket: any, facet: SearchFacet) => {\n if (bucket.title === BOOLEAN_NO) {\n return `Not ${facet.title}`;\n } else if (bucket.title === BOOLEAN_YES) {\n return facet.title;\n }\n return bucket.title;\n};\n\nconst getBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n switch (bucket.__typename) {\n case 'RangeBucket':\n return getRangeBucketLabel(bucket, facet, currency);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarBucketLabel(bucket, facet);\n default:\n break;\n }\n};\n\nexport { getBucketLabel, getCurrencyType, getFilterSelection };\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchFilter, SearchFacet, SearchVariables, FacetBucket } from '@/plp/data/models/api';\nimport { getBucketLabel, getCurrencyType, getFilterSelection } from './utils/facetUtils';\nimport FacetList from '@/plp/components/FacetList';\nimport { Button, Checkbox, Divider, Icon, RadioButton } from '@adobe-commerce/elsie/components';\nimport { Facet } from '@/plp/components';\nimport { VNode } from 'preact';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface FacetsProps extends HTMLAttributes<HTMLDivElement> {\n slots?: {\n Facet?: SlotProps;\n SelectedFacets?: SlotProps;\n Facets?: SlotProps;\n };\n}\n\nexport const Facets: Container<FacetsProps> = ({ slots }) => {\n const translations = useText({\n clearAll: 'Search.Facet.clearAll',\n });\n\n const [facetList, setFacetList] = useState<SearchFacet[]>([]);\n const [currency, setCurrency] = useState<string | null>(null);\n\n const handleSearchResult = (payload: { result: ProductSearchResult; request: SearchVariables }): void => {\n if (!payload || (!payload.result.facets && !payload.result.items && !payload.request.filter)) {\n setFacetList([]);\n return;\n }\n const { facets, items } = payload.result;\n setCurrency(getCurrencyType(items));\n const filterList = payload.request.filter;\n if (facets) {\n const facetsWithSelections = facets.map((facet: SearchFacet) => {\n const selectedBuckets = facet.buckets.map((bucket) => {\n bucket.selected = false;\n const selectedFilter = filterList?.find((filter) => filter.attribute === facet.attribute);\n if (selectedFilter) {\n const selectedRange = selectedFilter.range;\n if (selectedRange && bucket.from === selectedRange.from && bucket.to === selectedRange.to) {\n bucket.selected = true;\n } else if (selectedFilter.in && selectedFilter.in.includes(bucket.title)) {\n bucket.selected = true;\n }\n }\n return bucket;\n });\n facet.buckets = selectedBuckets;\n return facet;\n });\n setFacetList(facetsWithSelections);\n }\n };\n\n const updateFacetSelections = (facets: SearchFacet[]): void => {\n const updatedFacetList = facetList.map((f) => {\n const newFacet = facets.find((facet) => facet.attribute === f.attribute);\n if (newFacet) {\n return newFacet;\n }\n return f;\n });\n const selectedFilterList = updatedFacetList.reduce((accu: SearchFilter[], facet: SearchFacet) => {\n const selectedFilter = getFilterSelection(facet);\n if (selectedFilter) {\n accu.push(selectedFilter as SearchFilter);\n }\n return accu;\n }, [] as SearchFilter[]);\n setFacetList(updatedFacetList);\n events.emit('search/request', { filter: selectedFilterList });\n };\n\n const handleCancelSelection = (facet: SearchFacet, title: string): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (bucket.title === title) {\n bucket.selected = false;\n }\n return bucket;\n });\n const newFacet = facet;\n newFacet.buckets = newBuckets;\n updateFacetSelections([newFacet]);\n };\n\n const clearAllSelections = (): void => {\n const updatedFacetList = facetList.map((facet) => {\n const updatedBuckets = facet.buckets.map((bucket) => {\n bucket.selected = false;\n return bucket;\n });\n facet.buckets = updatedBuckets;\n return facet;\n });\n setFacetList(updatedFacetList);\n events.emit('search/request', { filter: [] });\n };\n\n const changeFilter = (event: any, facet: SearchFacet): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (facet.buckets[0]?.__typename === 'RangeBucket') {\n bucket.selected = false;\n }\n if (bucket.title === event.target.value) {\n bucket.selected = event.target.checked;\n }\n return bucket;\n });\n const newFacet = facet;\n newFacet.buckets = newBuckets;\n updateFacetSelections([newFacet]);\n };\n\n const getFacetNode = (facet: SearchFacet): VNode => {\n const header = <span>{facet.title}</span>;\n const buckets = facet.buckets\n .map((bucket: FacetBucket) => {\n const bucketLabel = getBucketLabel(bucket, facet, currency);\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n return (\n <RadioButton\n data-testid={`${bucket.title}-radio`}\n label={bucketLabel}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet);\n }}\n />\n ) as VNode;\n case 'ScalarBucket':\n case 'CategoryView':\n return (\n <Checkbox\n data-testid={`${bucket.title}-checkbox`}\n label={`${bucketLabel} (${bucket.count})`}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet);\n }}\n />\n ) as VNode;\n default:\n return null;\n }\n })\n .filter((bucket) => bucket !== null);\n return (<Facet header={header} buckets={buckets} />) as VNode;\n };\n\n const getFacetsNode = (): VNode => {\n return (\n <Slot name=\"Facets\" slot={slots?.Facets} context={{ data: facetList }}>\n {facetList.map((facet) => {\n return facet.buckets.length > 0\n ? ((\n <>\n <Slot name=\"Facet\" slot={slots?.Facet} context={{ data: facet }}>\n {getFacetNode(facet)}\n </Slot>\n <Divider variant=\"secondary\" />\n </>\n ) as VNode)\n : null;\n })}\n </Slot>\n );\n };\n\n const getSelectedFacetsNode = (): VNode => {\n const selectedFacets = facetList.reduce((accu, curr) => {\n const selected = curr.buckets.filter((bucket: FacetBucket) => bucket.selected);\n if (selected.length > 0) {\n accu.push(curr);\n }\n return accu;\n }, [] as SearchFacet[]);\n const selectedFilterBtns = selectedFacets.map((facet) => {\n return facet.buckets.map((bucket) => {\n if (bucket.selected) {\n const bucketTitle = getBucketLabel(bucket, facet, currency);\n return (\n <Button\n data-testid={`${bucket.title}-selected-btn`}\n variant=\"secondary\"\n children={\n <>\n <span>{bucketTitle}</span>\n <Icon source={Close} size=\"16\" />\n </>\n }\n onClick={(): void => {\n handleCancelSelection(facet, bucket.title);\n }}\n />\n ) as VNode;\n }\n return null;\n });\n });\n\n const clearAllBtn =\n selectedFilterBtns.length > 0 ? (\n <Button\n variant=\"secondary\"\n onClick={(): void => {\n clearAllSelections();\n }}\n >\n <span>{translations.clearAll}</span>\n </Button>\n ) : null;\n return (\n <Slot name=\"SelectedFacets\" slot={slots?.SelectedFacets} context={{ data: selectedFacets }}>\n {selectedFilterBtns}\n {clearAllBtn}\n </Slot>\n );\n };\n\n useEffect(() => {\n events.on('search/result', handleSearchResult);\n }, []);\n\n return <FacetList selectedFacets={getSelectedFacetsNode()} facets={getFacetsNode()} />;\n};\n"],"names":["SvgAdd","props","React","SvgBurger","SvgClose","SvgMinus","Facet","numberOfOptionsConfig","header","buckets","translations","useText","numberOfOptionsShown","showMore","setShowMore","useState","numberOfOptions","jsx","VComponent","bucket","index","Button","Icon","Add","Minus","FacetList","selectedFacets","facets","showFilters","setShowFilters","handleShowFilters","jsxs","ActionButton","Burger","classes","BOOLEAN_NO","BOOLEAN_YES","getRangeFacetFilter","facet","selectedRange","getScalarFacetFilter","scalarSelections","accu","curr","getFilterSelection","_a","getCurrencyType","items","firstItem","_c","_b","_g","_f","_e","_d","_k","_j","_i","_h","getRangeBucketLabel","currency","PriceRange","getScalarBucketLabel","getBucketLabel","Facets","slots","facetList","setFacetList","setCurrency","handleSearchResult","payload","filterList","facetsWithSelections","selectedBuckets","selectedFilter","filter","updateFacetSelections","updatedFacetList","f","newFacet","selectedFilterList","events","handleCancelSelection","title","newBuckets","clearAllSelections","updatedBuckets","changeFilter","event","getFacetNode","bucketLabel","RadioButton","Checkbox","getFacetsNode","Slot","Fragment","Divider","getSelectedFacetsNode","selectedFilterBtns","bucketTitle","Close","clearAllBtn","useEffect"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
@@ -14,6 +14,7 @@ export interface ProductListProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
14
14
|
};
|
|
15
15
|
pageSize?: number;
|
|
16
16
|
routeProduct?: (product: Product) => string;
|
|
17
|
+
categoryPath?: string;
|
|
17
18
|
}
|
|
18
19
|
export declare const ProductList: Container<ProductListProps>;
|
|
19
20
|
//# sourceMappingURL=ProductList.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SortOrder } from '../../../data/models/api';
|
|
2
2
|
|
|
3
|
-
declare const getDefaultSort: (translations: any) => any;
|
|
4
|
-
declare const setSortOptions: (sortOptions: any, translations: any) => any;
|
|
3
|
+
declare const getDefaultSort: (translations: any, categoryPath?: string) => any;
|
|
4
|
+
declare const setSortOptions: (sortOptions: any, translations: any, categoryPath?: string) => any;
|
|
5
5
|
declare const getSortSearchVariables: (sortValue: string) => SortOrder[];
|
|
6
6
|
declare const getSortValue: (sort: SortOrder[]) => string;
|
|
7
7
|
declare const getPickerOption: (options: any, value: string) => any;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as o,jsxs as x}from"@dropins/tools/preact-jsx-runtime.js";import*as P from"@dropins/tools/preact-compat.js";import{useState as _,useCallback as le,useEffect as he}from"@dropins/tools/preact-compat.js";import{classes as S,VComponent as g,Slot as E}from"@dropins/tools/lib.js";import{Skeleton as ue,SkeletonRow as I,InLineAlert as pe,Icon as ge,Pagination as fe,Picker as _e,PriceRange as M,Image as Se}from"@dropins/tools/components.js";import{p as Pe}from"../chunks/productSearch.js";import{u as we,P as y,s as Ee,d as Le,a as Ce,b as ke,c as ye,e as Re,f as xe}from"../chunks/acdlEvents.js";import{a as Ne}from"../chunks/attributeMetadata.js";/* empty css *//* empty css *//* empty css *//* empty css */import{events as $}from"@dropins/tools/event-bus.js";import{useText as Ae,Text as Ie}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const Ue=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)"})))),De=()=>o("div",{className:"dropin-product-item-card dropin-product-item-card-skeleton",children:x(ue,{className:"dropin-product-item-card__skeleton dropin-product-item-card__image-container",children:[o(I,{fullWidth:!0,className:"dropin-product-item-card__skeleton__image"}),x("div",{className:"dropin-product-item-card__content dropin-product-item-card__skeleton__content",children:[o(I,{fullWidth:!0,size:"large",className:"dropin-product-item-card__skeleton__item"}),o(I,{fullWidth:!0,size:"xsmall",className:"dropin-product-item-card__skeleton__item"}),o(I,{fullWidth:!0,size:"small",className:"dropin-product-item-card__skeleton__item"})]})," "]})}),ze=({className:t,image:r,titleNode:n,price:i,sku:c,actionButton:a,swatches:h,initialized:u=!1,...z})=>u?x("div",{...z,className:S(["dropin-product-item-card",t]),children:[o("div",{className:"dropin-product-item-card__image-container",children:r&&o(g,{node:r,className:S(["dropin-product-item-card__image"])})}),x("div",{className:"dropin-product-item-card__content",children:[n&&o(g,{node:n,className:S(["dropin-product-item-card__title"])}),c&&o(g,{node:c,className:S(["dropin-product-item-card__sku"])}),i&&o("div",{className:"dropin-product-item-card__price",children:o(g,{node:i,className:S(["dropin-product-item-card__price"])})}),h&&o("div",{className:"dropin-product-item-card__swatches",children:o(g,{node:h,className:S(["dropin-product-item-card__swatches"])})}),a&&o("div",{className:"dropin-product-item-card__action",children:o(g,{node:a,className:S(["dropin-product-item-card__action"])})})]})]}):o(De,{});function Fe(t){var c;let r="";try{r=self.crypto.randomUUID(),we(y,r,t.phrase||"",t.filter||[],t.pageSize||0,t.currentPage||0,t.sort||[]),Ee(y)}catch(a){console.error("Error collecting data:",a)}const n={attribute:"visibility",in:["Search","Catalog, Search"]},i=structuredClone(t);return(c=i.filter)==null||c.push(n),Pe(i).then(a=>{const h=Le(a);try{Ce(y,r,h),ke(y),t.phrase&&ye(y)}catch(u){console.error("Error collecting data:",u)}return h}).catch(a=>{throw console.error("Error fetching product search:",a),new Error("Error fetching product search.")}).finally(()=>{})}function He(){return Ne().then(t=>Re(t)).catch(t=>{throw console.error("Error fetching attribute metadata:",t),new Error("Error fetching attribute metadata.")}).finally(()=>{})}const O=t=>({text:t.relevanceLabel,value:"relevance_DESC"}),$e=(t,r)=>{const n=O(r),i=t.reduce((c,a)=>(a.attribute!=="position"&&a.attribute!=="relevance"&&(a.attribute==="price"?(c.push({text:r.sortASC,value:`${a.attribute}_ASC`}),c.push({text:r.sortDESC,value:`${a.attribute}_DESC`})):c.push({text:a.label,value:`${a.attribute}_DESC`})),c),[]);return i.push(n),{options:i,default:n}},U=t=>{const r=t.indexOf("_");return[{attribute:t.substring(0,r),direction:t.substring(r+1)==="ASC"?"ASC":"DESC"}]},qe=t=>t.length>0?`${t[0].attribute}_${t[0].direction}`:"",Me=(t,r)=>{const n=t.findIndex(i=>i.value===r);return n>-1?t[n]:null},We=({header:t,productList:r,footer:n})=>x("div",{className:"plp-product-list",children:[t&&o(g,{className:"plp-product-list__header",node:t}),o("div",{className:"plp-product-list__grid",children:r&&o(g,{node:r})}),n&&o(g,{className:"plp-product-list__pagination",node:n})]}),Oe=({alertMessage:t=""})=>o("div",{className:S(["plp-search-alert-message__wrapper"]),children:o("div",{className:"plp-search-alert-message__content",children:o(pe,{heading:t,type:"warning",icon:o(ge,{source:Ue,size:"24"}),onDismiss:void 0})})}),j={search:"q",search_query:"search_query",pagination:"p",sort:"product_list_order",page_size:"page_size"},R=t=>{const n=T().get(t);return n||""},T=()=>{const t=window.location.search;return new URLSearchParams(t)},je=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);t===1?n.delete("p"):n.set("p",t.toString()),D(r.pathname,n)},Te=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("product_list_order",t),D(r.pathname,n)},Qe=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("q",t),D(r.pathname,n)},D=(t,r)=>{r.toString()===""?window.history.pushState({},"",`${t}`):window.history.pushState({},"",`${t}?${r.toString()}`)},W=t=>{var i;const r=T(),n=[];for(const[c,a]of r.entries())if(t.includes(c)&&!Object.values(j).includes(c))if(a.includes("--")){const h=a.split("--"),u={attribute:c,range:{from:Number(h[0]),to:Number(h[1])}};n.push(u)}else{const h=n.findIndex(u=>u.attribute==c);if(h!==-1)(i=n[h].in)==null||i.push(a);else{const u={attribute:c,in:[a]};n.push(u)}}return n},Ze=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);for(const i of r.searchParams.keys())Object.values(j).includes(i)||n.delete(i);t.forEach(i=>{const c=i.attribute;if(i.range){const a=i.range;R(c)?(n.delete(c),n.append(c,`${a.from}--${a.to}`)):n.append(c,`${a.from}--${a.to}`)}else{const a=i.in||[],h=n.getAll(c);a.map(u=>{h.includes(u)||n.append(c,u)})}}),D(r.pathname,n)},Be=t=>new DOMParser().parseFromString(t,"text/html").documentElement.textContent,at=({minQueryLength:t=3,slots:r,pageSize:n=12,routeProduct:i})=>{const c=Ae({relevanceLabel:"Search.PLP.SortDropdown.relevanceLabel",sortASC:"Search.PLP.SortDropdown.sortASC",sortDESC:"Search.PLP.SortDropdown.sortDESC",minQueryLength:o(Ie,{id:"Search.PLP.Warning.minQueryLength",fields:{minQueryLength:t}}),noResults:"Search.PLP.Warning.noResults",searchError:"Search.PLP.Warning.searchError"}),[a,h]=_([]),[u,z]=_(),[Q,Z]=_(1),[B,w]=_(!1),[v,L]=_(c.noResults),N=O(c),[K,F]=_(),[G,J]=_([]),X=[...Array(n).keys()].map(()=>{const e=xe({});return e.initialized=!1,e}),[C,Y]=_(X),b=e=>{A({currentPage:e})},V=e=>{z(e),je(e)},ee=e=>{const s=U(e);F(e),A({sort:s})},te=e=>{const s=e.phrase||"";Qe(s);const l=e.filter||[];Ze(l);const m=qe(e.sort||[]);Te(m)},re=e=>He().then(s=>{J(((s==null?void 0:s.filterableInSearch)||[]).map(d=>d.attribute));const l=$e(s==null?void 0:s.sortable,c);h(l.options);const m=Me(l.options,e||l.default.value);return F(m.value),W(((s==null?void 0:s.filterableInSearch)||[]).map(d=>d.attribute))}).catch(()=>{w(!0),L(c.searchError)}),A=e=>{var p;const s=R("product_list_order"),l=U(s||N.value),m={phrase:(e==null?void 0:e.phrase)||R("q"),pageSize:(e==null?void 0:e.pageSize)||n,currentPage:(e==null?void 0:e.currentPage)||u,filter:(e==null?void 0:e.filter)||W(G),sort:(e==null?void 0:e.sort)||l};if((e!=null&&e.phrase||e!=null&&e.filter||e!=null&&e.sort||e!=null&&e.pageSize)&&(m.currentPage=1,e!=null&&e.phrase&&(m.filter=[],m.sort=U(N.value),F(N.value))),te(m),(((p=m==null?void 0:m.phrase)==null?void 0:p.length)||0)<t)w(!0),L(c.minQueryLength.replace("{SEARCH_PHRASE}",(m==null?void 0:m.phrase)||"")),H();else return w(!1),Fe(m).then(d=>{var f,k;$.emit("search/result",{result:d,request:m}),(d==null?void 0:d.totalCount)===0&&(d==null?void 0:d.items.length)===0?(w(!0),L(c.noResults)):(Y(d==null?void 0:d.items.map(q=>(q.initialized=!0,q))),V(((f=d==null?void 0:d.pageInfo)==null?void 0:f.currentPage)||1),Z(((k=d==null?void 0:d.pageInfo)==null?void 0:k.totalPages)||1))}).catch(()=>{w(!0),L(c.searchError),H()}).finally(()=>{})},ne=le(e=>{A(e)},[]),H=()=>{$.emit("search/result",{result:{},request:{}})};he(()=>{const e=R("q"),s=R("product_list_order")||N.value;re(s).then(m=>{e!=null&&e.length&&e.length<t?(w(!0),L(c.minQueryLength.replace("{SEARCH_PHRASE}",e)),H()):A({filter:m})});const l=$.on("search/request",ne);return()=>{l==null||l.off()}},[]);const oe=e=>o(E,{name:"ProductActions",slot:r==null?void 0:r.ProductActions,context:{product:e}}),ce=e=>{var l,m,p,d,f;const s=e.typename==="ComplexProductView"?o(M,{display:"from to",minimumAmount:(l=e.priceRange)==null?void 0:l.minimum.regular.amount.value,maximumAmount:(m=e.priceRange)==null?void 0:m.maximum.regular.amount.value,currency:(p=e.priceRange)==null?void 0:p.minimum.regular.amount.currency}):o(M,{amount:(d=e.price)==null?void 0:d.regular.amount.value,currency:(f=e.price)==null?void 0:f.regular.amount.currency});return o(E,{name:"ProductPrice",slot:r==null?void 0:r.ProductPrice,context:{product:e},children:i?o("a",{href:i(e),children:s}):s})},ae=e=>{const s=e.name!==null?Be(e.name):"";return o(E,{name:"ProductName",slot:r==null?void 0:r.ProductName,context:{product:e},children:i?o("a",{href:i(e),children:s}):s})},se=(e,s)=>{var p,d,f,k;const l={loading:s<8?"eager":"lazy",src:((d=(p=e.images)==null?void 0:p[0])==null?void 0:d.url)||"",alt:((k=(f=e.images)==null?void 0:f[0])==null?void 0:k.label)||"",width:"200",height:"250"},m=o(Se,{class:"plp-product-item__image",...l,"aria-label":e.sku});return o(E,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{product:e},children:i?o("a",{href:i(e),children:m}):m})},ie=()=>o(E,{name:"Header",slot:r==null?void 0:r.Header,context:{productList:C},children:o(_e,{floatingLabel:c.sortLabel,options:a,value:K,required:!0,handleSelect:e=>{const{value:s}=e.target;ee(s)},"data-testid":"product-list-sort-by-picker"})}),de=()=>o(E,{name:"Footer",slot:r==null?void 0:r.Footer,context:{productList:C},children:o(fe,{currentPage:u,totalPages:Q,onChange:e=>{b(e)}})}),me=o(We,{header:ie(),footer:de(),productList:C==null?void 0:C.map((e,s)=>o(ze,{image:se(e,s),titleNode:ae(e),price:ce(e),actionButton:oe(e),initialized:e.initialized},e.id||e.sku))});return o("div",{class:"plp-product-list__container",children:B?o(Oe,{alertMessage:v}):me})};export{at as ProductList,at 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 he,useEffect as fe}from"@dropins/tools/preact-compat.js";import{classes as _,VComponent as p,Slot as C}from"@dropins/tools/lib.js";import{Skeleton as pe,SkeletonRow as U,InLineAlert as ge,Icon as Se,Pagination as _e,Picker as Pe,PriceRange as M,Image as we}from"@dropins/tools/components.js";import{p as Ce}from"../chunks/productSearch.js";import{u as Le,P as L,s as ke,d as ye,a as Ee,b as xe,c as Re,e as Ne,f as Ae,g as Ie}from"../chunks/acdlEvents.js";import{a as Ue}from"../chunks/attributeMetadata.js";/* empty css *//* empty css *//* empty css *//* empty css */import{events as $}from"@dropins/tools/event-bus.js";import{useText as De,Text as qe}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const ze=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)"})))),Fe=()=>o("div",{className:"dropin-product-item-card dropin-product-item-card-skeleton",children:N(pe,{className:"dropin-product-item-card__skeleton dropin-product-item-card__image-container",children:[o(U,{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(U,{fullWidth:!0,size:"large",className:"dropin-product-item-card__skeleton__item"}),o(U,{fullWidth:!0,size:"xsmall",className:"dropin-product-item-card__skeleton__item"}),o(U,{fullWidth:!0,size:"small",className:"dropin-product-item-card__skeleton__item"})]})," "]})}),He=({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(Fe,{});function $e(t){var i;let r="";try{r=self.crypto.randomUUID(),Le(L,r,t.phrase||"",t.filter||[],t.pageSize||0,t.currentPage||0,t.sort||[]),ke(L)}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),Ce(d).then(a=>{const l=ye(a);try{Ee(L,r,l),xe(L),t.phrase&&Re(L)}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 Me(){return Ue().then(t=>Ne(t)).catch(t=>{throw console.error("Error fetching attribute metadata:",t),new Error("Error fetching attribute metadata.")}).finally(()=>{})}const O=(t,r)=>r?{text:t.positionLabel,value:"position_ASC"}:{text:t.relevanceLabel,value:"relevance_DESC"},ve=(t,r,n)=>{const d=O(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}},D=t=>{const r=t.indexOf("_");return[{attribute:t.substring(0,r),direction:t.substring(r+1)==="ASC"?"ASC":"DESC"}]},Oe=t=>t.length>0?`${t[0].attribute}_${t[0].direction}`:"",We=(t,r)=>{const n=t.findIndex(d=>d.value===r);return n>-1?t[n]:null},je=({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})]}),Te=({alertMessage:t=""})=>o("div",{className:_(["product-discovery-search-alert-message__wrapper"]),children:o("div",{className:"product-discovery-search-alert-message__content",children:o(ge,{heading:t,type:"warning",icon:o(Se,{source:ze,size:"24"}),onDismiss:void 0})})}),W={search:"q",search_query:"search_query",pagination:"p",sort:"product_list_order",page_size:"page_size"},k=t=>{const n=j().get(t);return n||""},j=()=>{const t=window.location.search;return new URLSearchParams(t)},Qe=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)},Ze=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("product_list_order",t),q(r.pathname,n)},Be=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()}`)},v=t=>{var d;const r=j(),n=[];for(const[i,a]of r.entries())if(t.includes(i)&&!Object.values(W).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},Ke=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);for(const d of r.searchParams.keys())Object.values(W).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)},Ge=t=>new DOMParser().parseFromString(t,"text/html").documentElement.textContent,dt=({minQueryLength:t=3,slots:r,pageSize:n=12,routeProduct:d,categoryPath:i})=>{const a=De({relevanceLabel:"Search.PLP.SortDropdown.relevanceLabel",sortASC:"Search.PLP.SortDropdown.sortASC",sortDESC:"Search.PLP.SortDropdown.sortDESC",minQueryLength:o(qe,{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,T]=S(),[Q,Z]=S(1),[B,w]=S(!1),[K,y]=S(a.noResults),I=O(a,i),[G,z]=S(),[J,X]=S([]),Y=[...Array(n).keys()].map(()=>{const e=Ae({});return e.initialized=!1,e}),[E,b]=S(Y),F=e=>{Ie(e.sku,L)},V=e=>{x({currentPage:e})},ee=e=>{T(e),Qe(e)},te=e=>{const c=D(e);z(e),x({sort:c})},re=e=>{var h;const c=k("product_list_order"),m=D(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)||v(J),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=D(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},ne=e=>{if(!i){const s=e.phrase||"";Be(s)}const c=e.filter||[];Ke(c);const m=Oe(e.sort||[]);Ze(m)},oe=e=>Me().then(c=>{X(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute));const m=ve(c==null?void 0:c.sortable,a,i);u(m.options);const s=We(m.options,e||m.default.value);return z(s.value),v(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute))}).catch(()=>{w(!0),y(a.searchError)}),x=e=>{var m;const c=re(e);if(ne(c),!i&&(((m=c==null?void 0:c.phrase)==null?void 0:m.length)||0)<t)w(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",(c==null?void 0:c.phrase)||"")),H();else return w(!1),$e(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?(w(!0),y(a.noResults)):(b(s==null?void 0:s.items.map(g=>(g.initialized=!0,g))),ee(((h=s==null?void 0:s.pageInfo)==null?void 0:h.currentPage)||1),Z(((f=s==null?void 0:s.pageInfo)==null?void 0:f.totalPages)||1))}).catch(()=>{w(!0),y(a.searchError),H()}).finally(()=>{})},ce=he(e=>{x(e)},[]),H=()=>{$.emit("search/result",{result:{},request:{}})};fe(()=>{const e=k("q"),c=k("product_list_order")||I.value;oe(c).then(s=>{i?x({filter:[{attribute:"categoryPath",eq:i}]}):e!=null&&e.length&&e.length<t?(w(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",e)),H()):x({filter:s})});const m=$.on("search/request",ce);return()=>{m==null||m.off()}},[]);const se=e=>o(C,{name:"ProductActions",slot:r==null?void 0:r.ProductActions,context:{product:e}}),ae=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(M,{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(M,{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})},ie=e=>{const c=e.name!==null?Ge(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})},de=(e,c)=>{var h,f,g,R;const m={loading:c<8?"eager":"lazy",src:((f=(h=e.images)==null?void 0:h[0])==null?void 0:f.url)||"",alt:((R=(g=e.images)==null?void 0:g[0])==null?void 0:R.label)||"",width:"200",height:"250"},s=o(we,{class:"product-discovery-product-item__image",...m,"aria-label":e.sku});return o(C,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:s}):s})},le=()=>o(C,{name:"Header",slot:r==null?void 0:r.Header,context:{productList:E},children:o(Pe,{floatingLabel:a.sortLabel,options:l,value:G,required:!0,handleSelect:e=>{const{value:c}=e.target;te(c)},"data-testid":"product-list-sort-by-picker"})}),me=()=>o(C,{name:"Footer",slot:r==null?void 0:r.Footer,context:{productList:E},children:o(_e,{currentPage:A,totalPages:Q,onChange:e=>{V(e)}})}),ue=o(je,{header:le(),footer:me(),productList:E==null?void 0:E.map((e,c)=>o(He,{image:de(e,c),titleNode:ie(e),price:ae(e),actionButton:se(e),initialized:e.initialized},e.id||e.sku))});return o("div",{class:"product-discovery-product-list__container",children:B?o(Te,{alertMessage:K}):ue})};export{dt as ProductList,dt 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 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 }\n // else {\n // categoryResultsView();\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): any => {\n return { text: translations.relevanceLabel, value: 'relevance_DESC' };\n};\n\nconst setSortOptions = (sortOptions: any, translations: any): any => {\n const defaultSort = getDefaultSort(translations); //{ text: translations.relevanceLabel, value: 'relevance_DESC'};\n // const categorySortDefault = { attribute: 'position', direction: 'ASC' };\n\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={'plp-product-list'}>\n {header && <VComponent className=\"plp-product-list__header\" node={header} />}\n <div className=\"plp-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n {footer && <VComponent className=\"plp-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(['plp-search-alert-message__wrapper'])}>\n <div className=\"plp-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';\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}\n\nexport const ProductList: Container<ProductListProps> = ({\n minQueryLength = 3,\n slots,\n pageSize = 12,\n routeProduct,\n}) => {\n const translations = useText({\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 });\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);\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 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 updateSearchVariablesQueryString = (variables: SearchVariables): void => {\n const newPhrase = variables.phrase || '';\n updateUrlSearchPhrase(newPhrase);\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);\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 urlSort = getValueFromUrl('product_list_order');\n const sortSearchVariable = urlSort ? getSortSearchVariables(urlSort) : getSortSearchVariables(defaultSort.value);\n const searchVariables = {\n phrase: 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 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 updateSearchVariablesQueryString(searchVariables);\n\n if ((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 (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 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 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={product.priceRange?.minimum.regular.amount.currency}\n />\n ) : (\n <PriceRange amount={product.price?.regular.amount.value} currency={product.price?.regular.amount.currency} />\n );\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product }}>\n {routeProduct ? <a href={routeProduct(product)}>{productPrice}</a> : productPrice}\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 ? <a href={routeProduct(product)}>{productName}</a> : productName}\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 imageComponent = <Image class=\"plp-product-item__image\" {...defaultImageProps} aria-label={product.sku} />;\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product }}>\n {routeProduct ? <a href={routeProduct(product)}>{imageComponent}</a> : imageComponent}\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=\"plp-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","error","getAttributeMetadata","attributeMetadataQuery","transformAttributeMetadata","getDefaultSort","translations","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","changePage","page","searchProducts","updateCurrentPage","changeSort","newSort","updateSearchVariablesQueryString","newPhrase","newFilters","newSortValue","loadMetadata","urlSort","attr","sortStartValue","inputVariables","sortSearchVariable","searchVariables","emitEmptySearchEvent","events","product","_b","handleSearchRequestEvent","useCallback","useEffect","requestEvent","getActionsSlot","Slot","getProductPriceSlot","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 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 }\n // else {\n // categoryResultsView();\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 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 imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={product.sku} />\n );\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product }}>\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","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,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as C,jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{useState as a,useCallback as y,useEffect as I}from"@dropins/tools/preact-compat.js";import{classes as T,VComponent as f,Slot as m}from"@dropins/tools/lib.js";import{events as $}from"@dropins/tools/event-bus.js";/* empty css */import{useText as q}from"@dropins/tools/i18n.js";const F=({searchPhrase:e,totalCount:s,className:o=""})=>C("div",{className:T(["product-discovery-results-info",o]),children:[e&&r(f,{className:"product-discovery-results-info__search-phrase",node:e}),s&&r(f,{className:"product-discovery-results-info__total-count",node:s})]}),A=({slots:e})=>{const s=q({resultsFor:"Search.ResultsInfo.resultsFor",products:"Search.ResultsInfo.products"}),[o,S]=a(),[c,P]=a(),[n,R]=a(),[u,x]=a(),_=y(t=>{var h,l,d,i,p;P((d=(l=(h=t.request)==null?void 0:h.filter)==null?void 0:l.find(g=>g.attribute==="categoryPath"))==null?void 0:d.eq),S((i=t.request)==null?void 0:i.phrase),R((p=t.result)==null?void 0:p.totalCount),x(t)},[]);I(()=>{const t=$.on("search/result",_);return()=>{t==null||t.off()}},[]);const v=r(m,{name:"SearchPhrase",slot:e==null?void 0:e.SearchPhrase,context:{searchResult:u},children:c?r("span",{"data-testid":"search-phrase",class:"product-discovery-results-info__search-phrase--upercase",children:c}):o?C("span",{"data-testid":"search-phrase",children:[s.resultsFor," ",r("strong",{children:`"${o}"`})]}):null}),N=r(m,{name:"TotalCount",slot:e==null?void 0:e.TotalCount,context:{searchResult:u},children:n&&r("span",{"data-testid":"total-count",children:`${n} ${s.products}`})});return r(F,{searchPhrase:v,totalCount:N})};export{A as ResultsInfo,A as default};
|
|
4
4
|
//# sourceMappingURL=ResultsInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResultsInfo.js","sources":["/@dropins/storefront-product-discovery/src/components/ResultsInfo/ResultsInfo.tsx","/@dropins/storefront-product-discovery/src/containers/ResultsInfo/ResultsInfo.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ResultsInfo/ResultsInfo.css';\n\nexport interface ResultsInfoProps extends HTMLAttributes<HTMLDivElement> {\n searchPhrase?: VNode;\n totalCount?: VNode;\n}\n\nexport const ResultsInfo: FunctionComponent<ResultsInfoProps> = ({ searchPhrase, totalCount, className = '' }) => {\n return (\n <div className={classes(['
|
|
1
|
+
{"version":3,"file":"ResultsInfo.js","sources":["/@dropins/storefront-product-discovery/src/components/ResultsInfo/ResultsInfo.tsx","/@dropins/storefront-product-discovery/src/containers/ResultsInfo/ResultsInfo.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ResultsInfo/ResultsInfo.css';\n\nexport interface ResultsInfoProps extends HTMLAttributes<HTMLDivElement> {\n searchPhrase?: VNode;\n totalCount?: VNode;\n}\n\nexport const ResultsInfo: FunctionComponent<ResultsInfoProps> = ({ searchPhrase, totalCount, className = '' }) => {\n return (\n <div className={classes(['product-discovery-results-info', className])}>\n {searchPhrase && <VComponent className=\"product-discovery-results-info__search-phrase\" node={searchPhrase} />}\n {totalCount && <VComponent className=\"product-discovery-results-info__total-count\" node={totalCount} />}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ResultsInfo as ResultsInfoComponent } from '@/plp/components/ResultsInfo/ResultsInfo';\n\nexport interface ResultsInfoProps extends HTMLAttributes<HTMLDivElement> {\n slots?: {\n SearchPhrase?: SlotProps;\n TotalCount?: SlotProps;\n };\n}\n\nexport const ResultsInfo: Container<ResultsInfoProps> = ({ slots }) => {\n const translations = useText({\n resultsFor: 'Search.ResultsInfo.resultsFor',\n products: 'Search.ResultsInfo.products',\n });\n const [searchPhrase, setSearchPhrase] = useState<string | undefined>();\n const [categoryPath, setCategoryPath] = useState<string | undefined>();\n const [totalCount, setTotalCount] = useState<number | undefined>();\n const [searchResult, setSearchResult] = useState<\n { result?: ProductSearchResult; request?: SearchVariables } | undefined\n >();\n\n const handleSearchResult = useCallback(\n (payload: { result?: ProductSearchResult; request?: SearchVariables }): void => {\n setCategoryPath(payload.request?.filter?.find((f) => f.attribute === 'categoryPath')?.eq);\n setSearchPhrase(payload.request?.phrase);\n setTotalCount(payload.result?.totalCount);\n setSearchResult(payload);\n },\n [],\n );\n\n // Listen for search result events\n useEffect(() => {\n const resultEvent = events.on('search/result', handleSearchResult);\n return () => {\n resultEvent?.off();\n };\n }, []);\n\n const searchPhraseNode = (\n <Slot name=\"SearchPhrase\" slot={slots?.SearchPhrase} context={{ searchResult }}>\n {categoryPath ? (\n <span data-testid=\"search-phrase\" class=\"product-discovery-results-info__search-phrase--upercase\">\n {categoryPath}\n </span>\n ) : searchPhrase ? (\n <span data-testid=\"search-phrase\">\n {translations.resultsFor} <strong>{`\"${searchPhrase}\"`}</strong>\n </span>\n ) : null}\n </Slot>\n );\n\n const totalCountNode = (\n <Slot name=\"TotalCount\" slot={slots?.TotalCount} context={{ searchResult }}>\n {totalCount && <span data-testid=\"total-count\">{`${totalCount} ${translations.products}`}</span>}\n </Slot>\n );\n\n return <ResultsInfoComponent searchPhrase={searchPhraseNode} totalCount={totalCountNode} />;\n};\n"],"names":["ResultsInfo","searchPhrase","totalCount","className","jsxs","classes","jsx","VComponent","slots","translations","useText","setSearchPhrase","useState","categoryPath","setCategoryPath","setTotalCount","searchResult","setSearchResult","handleSearchResult","useCallback","payload","_c","_b","_a","f","_d","_e","useEffect","resultEvent","events","searchPhraseNode","Slot","totalCountNode","ResultsInfoComponent"],"mappings":"iXA2BO,MAAMA,EAAmD,CAAC,CAAE,aAAAC,EAAc,WAAAC,EAAY,UAAAC,EAAY,MAErGC,EAAC,OAAI,UAAWC,EAAQ,CAAC,iCAAkCF,CAAS,CAAC,EAClE,SAAA,CAAAF,GAAiBK,EAAAC,EAAA,CAAW,UAAU,gDAAgD,KAAMN,EAAc,EAC1GC,GAAeI,EAAAC,EAAA,CAAW,UAAU,8CAA8C,KAAML,CAAY,CAAA,CAAA,EACvG,ECDSF,EAA2C,CAAC,CAAE,MAAAQ,KAAY,CACrE,MAAMC,EAAeC,EAAQ,CAC3B,WAAY,gCACZ,SAAU,6BAAA,CACX,EACK,CAACT,EAAcU,CAAe,EAAIC,EAA6B,EAC/D,CAACC,EAAcC,CAAe,EAAIF,EAA6B,EAC/D,CAACV,EAAYa,CAAa,EAAIH,EAA6B,EAC3D,CAACI,EAAcC,CAAe,EAAIL,EAEtC,EAEIM,EAAqBC,EACxBC,GAA+E,eAC9DN,GAAAO,GAAAC,GAAAC,EAAAH,EAAQ,UAAR,YAAAG,EAAiB,SAAjB,YAAAD,EAAyB,KAAME,GAAMA,EAAE,YAAc,kBAArD,YAAAH,EAAsE,EAAE,EACxEV,GAAAc,EAAAL,EAAQ,UAAR,YAAAK,EAAiB,MAAM,EACzBV,GAAAW,EAAAN,EAAQ,SAAR,YAAAM,EAAgB,UAAU,EACxCT,EAAgBG,CAAO,CACzB,EACA,CAAA,CACF,EAGAO,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GAAG,gBAAiBX,CAAkB,EACjE,MAAO,IAAM,CACXU,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,EAAE,EAEC,MAAAE,EACHxB,EAAAyB,EAAA,CAAK,KAAK,eAAe,KAAMvB,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,aAAAQ,CAAa,EAC1E,WACEV,EAAA,OAAA,CAAK,cAAY,gBAAgB,MAAM,0DACrC,SACHO,CAAA,CAAA,EACEZ,EACFG,EAAC,OAAK,CAAA,cAAY,gBACf,SAAA,CAAaK,EAAA,WAAW,IAAEH,EAAA,SAAA,CAAQ,SAAI,IAAAL,CAAY,GAAI,CAAA,CAAA,CACzD,CAAA,EACE,KACN,EAGI+B,IACHD,EAAK,CAAA,KAAK,aAAa,KAAMvB,GAAA,YAAAA,EAAO,WAAY,QAAS,CAAE,aAAAQ,GACzD,SAAcd,GAAAI,EAAC,OAAK,CAAA,cAAY,cAAe,SAAA,GAAGJ,CAAU,IAAIO,EAAa,QAAQ,EAAA,CAAG,CAC3F,CAAA,EAGF,OAAQH,EAAA2B,EAAA,CAAqB,aAAcH,EAAkB,WAAYE,EAAgB,CAC3F"}
|
|
@@ -4,6 +4,7 @@ import { Product } from '../../data/models/product';
|
|
|
4
4
|
|
|
5
5
|
export interface SearchBarResultsProps extends HTMLAttributes<HTMLDivElement> {
|
|
6
6
|
products?: Product[];
|
|
7
|
+
productRouteSearch?: (product: Product) => string;
|
|
7
8
|
routeSearch?: (searchQuery: string) => void;
|
|
8
9
|
slots?: {
|
|
9
10
|
ProductImage?: SlotProps;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as
|
|
4
|
-
`),url:
|
|
3
|
+
import{jsx as r,jsxs as P}from"@dropins/tools/preact-jsx-runtime.js";import{useRef as q,useCallback as _,useEffect as k,useMemo as D,useState as f}from"@dropins/tools/preact-compat.js";import{Button as K,Price as O,Image as Q}from"@dropins/tools/components.js";import{VComponent as v,Slot as g}from"@dropins/tools/lib.js";import{events as y}from"@dropins/tools/event-bus.js";/* empty css */import{useText as M}from"@dropins/tools/i18n.js";const U=({productList:i,viewAllButton:l,onClose:n,...a})=>{const t=i&&i.length>0,o=q(null),s=_(c=>{o.current&&!o.current.contains(c.target)&&(n==null||n())},[n]),u=_(c=>{c.key==="Escape"&&(n==null||n())},[n]);return k(()=>{if(t)return document.addEventListener("mousedown",s),document.addEventListener("keydown",u),()=>{document.removeEventListener("mousedown",s),document.removeEventListener("keydown",u)}},[t,s,u]),t?r("div",{className:"product-discovery--search-bar-results",...a,children:r("div",{className:"product-discovery--search-bar-results__popover",ref:o,role:"region","aria-label":"Search results","aria-live":"polite",children:P("div",{className:"product-discovery--search-bar-results__outer-container",...a,children:[r("div",{className:"product-discovery--search-bar-results__grid",role:"list","aria-label":`${(i==null?void 0:i.length)||0} search results`,children:i==null?void 0:i.map((c,m)=>r("div",{role:"listitem",children:c},m))}),l&&r("div",{className:"product-discovery--search-bar-results__view-all-wrapper",children:r(v,{className:"product-discovery--search-bar-results__view-all-button",node:l})})]})})}):null},V=({productRouteSearch:i=s=>(s==null?void 0:s.url)||"",productItem:l,productImage:n,productName:a,productPrice:t,...o})=>{const s=D(()=>{const{name:u="",sku:c="",url:m=""}=l||{};return{tooltipText:[u,c&&`SKU: ${c}`].filter(Boolean).join(`
|
|
4
|
+
`),url:m}},[l]);return P("a",{className:"product-discovery--product-item",href:i(l),target:"_blank",rel:"noopener noreferrer",title:s.tooltipText,...o,children:[r("div",{className:"product-discovery--product-item__image",children:r(v,{node:n})}),P("div",{className:"product-discovery--product-item__details",children:[r(v,{node:a}),r(v,{node:t})]})]})},Z=({products:i=[],productRouteSearch:l=t=>(t==null?void 0:t.url)||"",routeSearch:n=()=>{},slots:a})=>{const[t,o]=f(i),[s,u]=f(""),[c,m]=f(i.length>0),w=M({viewAllButton:"Search.SearchInput.viewAllButton"});k(()=>{const e=y.on("search-input/result",E);return()=>{e==null||e.off()}},[]);const E=({result:e=[],request:h={}})=>{const{phrase:d=""}=h;o(e),u(d),m(e.length>0&&d.length>0)},N=_(()=>{n&&n(s),y.emit("search/request",{phrase:s}),y.emit("search-input/result",{result:[],request:{phrase:""}}),m(!1)},[n,s]),p=e=>{var h,d;return r(g,{name:"ProductImage",slot:a==null?void 0:a.ProductImage,context:{productItem:e},children:r(Q,{src:((d=(h=e==null?void 0:e.images)==null?void 0:h[0])==null?void 0:d.url)||""})})},A=e=>r(g,{name:"ProductName",slot:a==null?void 0:a.ProductName,context:{productItem:e},children:(e==null?void 0:e.name)||""}),T=e=>{var b,x,B,R,S;const{value:h,currency:d}=((x=(b=e==null?void 0:e.price)==null?void 0:b.final)==null?void 0:x.amount)||((S=(R=(B=e==null?void 0:e.priceRange)==null?void 0:B.minimum)==null?void 0:R.final)==null?void 0:S.amount)||{};return r(g,{name:"ProductPrice",slot:a==null?void 0:a.ProductPrice,context:{productItem:e},children:r(O,{amount:typeof h=="number"?h:void 0,currency:d})})},j=e=>r(V,{productRouteSearch:l,productItem:e,productImage:p(e),productName:A(e),productPrice:T(e)}),$=()=>r(K,{variant:"tertiary",onClick:()=>{N()},children:w.viewAllButton});return r("div",{children:t.length>0&&c&&r(U,{productList:t==null?void 0:t.map(e=>j(e)),viewAllButton:$(),onClose:N})})};export{Z as SearchBarResults,Z 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\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 );\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, 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';\n\nexport interface ProductItemProps extends HTMLAttributes<HTMLDivElement> {\n productItem: Product;\n productImage?: VNode;\n productName?: VNode;\n productPrice?: VNode;\n}\n\nexport const ProductItem: FunctionComponent<ProductItemProps> = ({\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 return (\n <a\n className=\"product-discovery--product-item\"\n href={productData.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={productData.tooltipText}\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 } from 'preact/compat';\nimport { Button, Image, 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 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 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 useEffect(() => {\n const searchInputEvent = events.on('search-input/result', handleSearchInputResult);\n\n return () => {\n searchInputEvent?.off();\n };\n }, []);\n\n const handleSearchInputResult = ({\n result = [],\n request = {},\n }: {\n result?: Product[];\n request?: Pick<SearchVariables, 'phrase'>;\n }) => {\n const { phrase = '' } = request;\n setSearchResults(result);\n setSearchQuery(phrase);\n setShowResults(result.length > 0 && phrase.length > 0);\n };\n\n const handleOnClose = 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 // 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 }, [routeSearch, searchQuery]);\n\n const getProductImage = (productItem: Product) => (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ productItem }}>\n <Image src={productItem?.images?.[0]?.url || ''} />\n </Slot>\n );\n\n const getProductName = (productItem: Product) => (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ productItem }}>\n {productItem?.name || ''}\n </Slot>\n );\n\n const getProductPrice = (productItem: Product) => {\n const { value, currency } = productItem?.priceRange?.minimum?.final?.amount || {};\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\n const productContainer = (productItem: Product) => (\n <ProductItemComponent\n productItem={productItem}\n productImage={getProductImage(productItem)}\n productName={getProductName(productItem)}\n productPrice={getProductPrice(productItem)}\n />\n );\n\n const viewAllButton = () => (\n <Button\n variant=\"tertiary\"\n onClick={() => {\n handleOnClose();\n }}\n >\n {translations.viewAllButton}\n </Button>\n );\n\n const searchBarResultsContainer = () =>\n searchResults.length > 0 &&\n showResults && (\n <SearchBarResultsComponent\n productList={searchResults?.map((product) => productContainer(product))}\n viewAllButton={viewAllButton()}\n onClose={handleOnClose}\n />\n );\n\n return <div>{searchBarResultsContainer()}</div>;\n};\n"],"names":["SearchBarResults","productList","viewAllButton","onClose","props","hasData","popoverRef","useRef","handleClickOutside","useCallback","event","handleEscapeKey","useEffect","jsx","jsxs","item","index","VComponent","ProductItem","productItem","productImage","productName","productPrice","productData","useMemo","name","sku","url","products","routeSearch","slots","searchResults","setSearchResults","useState","searchQuery","setSearchQuery","showResults","setShowResults","translations","useText","searchInputEvent","events","handleSearchInputResult","result","request","phrase","handleOnClose","getProductImage","Slot","Image","_b","_a","getProductName","getProductPrice","value","currency","_c","Price","productContainer","ProductItemComponent","Button","SearchBarResultsComponent","product"],"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';\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 return (\n <a\n className=\"product-discovery--product-item\"\n href={productRouteSearch(productItem)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={productData.tooltipText}\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 } from 'preact/compat';\nimport { Button, Image, 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 useEffect(() => {\n const searchInputEvent = events.on('search-input/result', handleSearchInputResult);\n\n return () => {\n searchInputEvent?.off();\n };\n }, []);\n\n const handleSearchInputResult = ({\n result = [],\n request = {},\n }: {\n result?: Product[];\n request?: Pick<SearchVariables, 'phrase'>;\n }) => {\n const { phrase = '' } = request;\n setSearchResults(result);\n setSearchQuery(phrase);\n setShowResults(result.length > 0 && phrase.length > 0);\n };\n\n const handleOnClose = 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 // 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 }, [routeSearch, searchQuery]);\n\n const getProductImage = (productItem: Product) => (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ productItem }}>\n <Image src={productItem?.images?.[0]?.url || ''} />\n </Slot>\n );\n\n const getProductName = (productItem: Product) => (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ productItem }}>\n {productItem?.name || ''}\n </Slot>\n );\n\n const getProductPrice = (productItem: Product) => {\n const { value, currency } =\n productItem?.price?.final?.amount || productItem?.priceRange?.minimum?.final?.amount || {};\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\n const productContainer = (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\n const viewAllButton = () => (\n <Button\n variant=\"tertiary\"\n onClick={() => {\n handleOnClose();\n }}\n >\n {translations.viewAllButton}\n </Button>\n );\n\n const searchBarResultsContainer = () =>\n searchResults.length > 0 &&\n showResults && (\n <SearchBarResultsComponent\n productList={searchResults?.map((product) => productContainer(product))}\n viewAllButton={viewAllButton()}\n onClose={handleOnClose}\n />\n );\n\n return <div>{searchBarResultsContainer()}</div>;\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","products","routeSearch","slots","searchResults","setSearchResults","useState","searchQuery","setSearchQuery","showResults","setShowResults","translations","useText","searchInputEvent","events","handleSearchInputResult","result","request","phrase","handleOnClose","getProductImage","Slot","Image","_b","_a","getProductName","getProductPrice","value","currency","_e","_d","_c","Price","productContainer","ProductItemComponent","Button","SearchBarResultsComponent"],"mappings":"ycAqBO,MAAMA,EAA6D,CAAC,CACzE,YAAAC,EACA,cAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAAM,CACE,MAAAC,EAAUJ,GAAeA,EAAY,OAAS,EAC9CK,EAAaC,EAAuB,IAAI,EAExCC,EAAqBC,EACxBC,GAAsB,CACjBJ,EAAW,SAAW,CAACA,EAAW,QAAQ,SAASI,EAAM,MAAc,IAC/DP,GAAA,MAAAA,IAEd,EACA,CAACA,CAAO,CACV,EAEMQ,EAAkBF,EACrBC,GAAyB,CACpBA,EAAM,MAAQ,WACNP,GAAA,MAAAA,IAEd,EACA,CAACA,CAAO,CACV,EAcI,OAZJS,EAAU,IAAM,CACd,GAAKP,EAEI,gBAAA,iBAAiB,YAAaG,CAAkB,EAChD,SAAA,iBAAiB,UAAWG,CAAe,EAE7C,IAAM,CACF,SAAA,oBAAoB,YAAaH,CAAkB,EACnD,SAAA,oBAAoB,UAAWG,CAAe,CACzD,CACC,EAAA,CAACN,EAASG,EAAoBG,CAAe,CAAC,EAE5CN,EAGFQ,EAAA,MAAA,CAAI,UAAU,wCAAyC,GAAGT,EACzD,SAAAS,EAAC,MAAA,CACC,UAAU,iDACV,IAAKP,EACL,KAAK,SACL,aAAW,iBACX,YAAU,SAEV,SAACQ,EAAA,MAAA,CAAI,UAAU,yDAA0D,GAAGV,EAC1E,SAAA,CAAAS,EAAC,MAAA,CACC,UAAU,8CACV,KAAK,OACL,aAAY,IAAGZ,GAAA,YAAAA,EAAa,SAAU,CAAC,kBAEtC,SAAAA,GAAA,YAAAA,EAAa,IAAI,CAACc,EAAMC,IACtBH,EAAA,MAAA,CAAgB,KAAK,WACnB,SADOE,CAAA,EAAAC,CAEV,EACD,CACH,EACCd,GACEW,EAAA,MAAA,CAAI,UAAU,0DACb,SAACA,EAAAI,EAAA,CAAW,UAAU,yDAAyD,KAAMf,CAAe,CAAA,CACtG,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,EAEJ,EA9BmB,IAgCvB,ECpEagB,EAAmD,CAAC,CAC/D,mBAAAC,EAAsBC,IAAqBA,GAAA,YAAAA,EAAS,MAAO,GAC3D,YAAAC,EACA,aAAAC,EACA,YAAAC,EACA,aAAAC,EACA,GAAGpB,CACL,IAAM,CACE,MAAAqB,EAAcC,EAAQ,IAAM,CAC1B,KAAA,CAAE,KAAAC,EAAO,GAAI,IAAAC,EAAM,GAAI,IAAAC,EAAM,IAAOR,GAAe,CAAC,EAKnD,MAAA,CAAE,YAFW,CAACM,EAAMC,GAAO,QAAQA,CAAG,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI,EAEpD,IAAAC,CAAI,CAAA,EACzB,CAACR,CAAW,CAAC,EAGd,OAAAP,EAAC,IAAA,CACC,UAAU,kCACV,KAAMK,EAAmBE,CAAW,EACpC,OAAO,SACP,IAAI,sBACJ,MAAOI,EAAY,YAClB,GAAGrB,EAEJ,SAAA,CAAAS,EAAC,OAAI,UAAU,yCACb,WAACI,EAAW,CAAA,KAAMK,EAAc,CAClC,CAAA,EACAR,EAAC,MAAI,CAAA,UAAU,2CACb,SAAA,CAACD,EAAAI,EAAA,CAAW,KAAMM,CAAa,CAAA,EAC/BV,EAACI,EAAW,CAAA,KAAMO,CAAc,CAAA,CAAA,CAClC,CAAA,CAAA,CAAA,CACF,CAEJ,EC5BaxB,EAAqD,CAAC,CACjE,SAAA8B,EAAW,CAAC,EACZ,mBAAAX,EAAsBC,IAAqBA,GAAA,YAAAA,EAAS,MAAO,GAC3D,YAAAW,EAAc,IAAM,CAAC,EACrB,MAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAeC,CAAgB,EAAIC,EAAoBL,CAAQ,EAChE,CAACM,EAAaC,CAAc,EAAIF,EAAS,EAAE,EAC3C,CAACG,EAAaC,CAAc,EAAIJ,EAASL,EAAS,OAAS,CAAC,EAE5DU,EAAeC,EAAQ,CAAE,cAAe,mCAAoC,EAElF7B,EAAU,IAAM,CACd,MAAM8B,EAAmBC,EAAO,GAAG,sBAAuBC,CAAuB,EAEjF,MAAO,IAAM,CACXF,GAAA,MAAAA,EAAkB,KACpB,CACF,EAAG,EAAE,EAEL,MAAME,EAA0B,CAAC,CAC/B,OAAAC,EAAS,CAAC,EACV,QAAAC,EAAU,CAAA,CAAC,IAIP,CACE,KAAA,CAAE,OAAAC,EAAS,EAAA,EAAOD,EACxBZ,EAAiBW,CAAM,EACvBR,EAAeU,CAAM,EACrBR,EAAeM,EAAO,OAAS,GAAKE,EAAO,OAAS,CAAC,CACvD,EAEMC,EAAgBvC,EAAY,IAAM,CAEtCsB,GAAeA,EAAYK,CAAW,EAGtCO,EAAO,KAAK,iBAAkB,CAAE,OAAQP,EAAmC,EAG3EO,EAAO,KAAK,sBAAuB,CACjC,OAAQ,CAAC,EACT,QAAS,CAAE,OAAQ,EAAG,CAAA,CACF,EAEtBJ,EAAe,EAAK,CAAA,EACnB,CAACR,EAAaK,CAAW,CAAC,EAEvBa,EAAmB5B,GACvB,SAAA,OAAAR,EAACqC,GAAK,KAAK,eAAe,KAAMlB,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,YAAAX,CAAY,EAC1E,SAACR,EAAAsC,EAAA,CAAM,MAAKC,GAAAC,EAAAhC,GAAA,YAAAA,EAAa,SAAb,YAAAgC,EAAsB,KAAtB,YAAAD,EAA0B,MAAO,EAAA,CAAI,CACnD,CAAA,GAGIE,EAAkBjC,GACrBR,EAAAqC,EAAA,CAAK,KAAK,cAAc,KAAMlB,GAAA,YAAAA,EAAO,YAAa,QAAS,CAAE,YAAAX,CAC3D,EAAA,UAAAA,GAAA,YAAAA,EAAa,OAAQ,GACxB,EAGIkC,EAAmBlC,GAAyB,eAChD,KAAM,CAAE,MAAAmC,EAAO,SAAAC,KACbL,GAAAC,EAAAhC,GAAA,YAAAA,EAAa,QAAb,YAAAgC,EAAoB,QAApB,YAAAD,EAA2B,WAAUM,GAAAC,GAAAC,EAAAvC,GAAA,YAAAA,EAAa,aAAb,YAAAuC,EAAyB,UAAzB,YAAAD,EAAkC,QAAlC,YAAAD,EAAyC,SAAU,CAAC,EAEzF,OAAA7C,EAACqC,GAAK,KAAK,eAAe,KAAMlB,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,YAAAX,GAC9D,SAACR,EAAAgD,EAAA,CAAM,OAAQ,OAAOL,GAAU,SAAWA,EAAQ,OAAW,SAAAC,CAAoB,CAAA,EACpF,CAEJ,EAEMK,EAAoBzC,GACxBR,EAACkD,EAAA,CACC,mBAAA5C,EACA,YAAAE,EACA,aAAc4B,EAAgB5B,CAAW,EACzC,YAAaiC,EAAejC,CAAW,EACvC,aAAckC,EAAgBlC,CAAW,CAAA,CAC3C,EAGInB,EAAgB,IACpBW,EAACmD,EAAA,CACC,QAAQ,WACR,QAAS,IAAM,CACChB,EAAA,CAChB,EAEC,SAAaR,EAAA,aAAA,CAChB,EAaK,OAAA3B,EAAC,MAAK,CAAA,SATXoB,EAAc,OAAS,GACvBK,GACEzB,EAACoD,EAAA,CACC,YAAahC,GAAA,YAAAA,EAAe,IAAKb,GAAY0C,EAAiB1C,CAAO,GACrE,cAAelB,EAAc,EAC7B,QAAS8C,CAAA,CACX,CAGqC,CAAA,CAC3C"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-product-discovery", "version": "0.
|
|
1
|
+
{"name": "@dropins/storefront-product-discovery", "version": "1.0.0-beta.1", "@dropins/tools": "^1.3.0-beta1", "license": "SEE LICENSE IN LICENSE.md"}
|
package/render.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
(function(
|
|
4
|
-
.
|
|
5
|
-
.product-discovery--search-bar-results{position:absolute;top:100%;left:0;right:0;z-index:1000;display:flex;align-items:flex-start;justify-content:flex-end;
|
|
3
|
+
(function(o,t){try{if(typeof document<"u"){const r=document.createElement("style"),d=t.styleId;for(const e in t.attributes)r.setAttribute(e,t.attributes[e]);r.setAttribute("data-dropin",d),r.appendChild(document.createTextNode(o));const i=document.querySelector('style[data-dropin="sdk"]');if(i)i.after(r);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(r):document.head.append(r)}}}catch(r){console.error("dropin-styles (injectCodeFunction)",r)}})(`.dropin-product-item-card__skeleton{gap:var(--spacing-small)}.dropin-product-item-card__skeleton__image{height:375px}.dropin-product-item-card__skeleton__content{grid-column:1/-1}.dropin-product-item-card{display:grid;position:relative;grid-auto-flow:row;background:var(--color-neutral-50);border:1px solid var(--color-neutral-400);color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:var(--spacing-small);width:300px}.dropin-product-item-card__image-container{overflow:hidden;width:100%;height:auto}.dropin-product-item-card__image img{width:100%;max-height:375px}.dropin-product-item-card__content{display:grid;grid-template-columns:1fr 1fr;padding:var(--spacing-small);gap:var(--spacing-xxsmall);align-items:center;color:var(--color-neutral-800)}.dropin-product-item-card__title,.dropin-product-item-card__sku,.dropin-product-item-card__price,.dropin-product-item-card__swatches,.dropin-product-item-card__action{grid-column:1/3}.dropin-product-item-card__title{font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing)}.dropin-product-item-card__sku,.dropin-product-item-card__price{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.dropin-product-item-card__swatches{margin-top:var(--spacing-xsmall)}.dropin-product-item-card__action{margin-top:var(--spacing-xsmall);width:100%}
|
|
4
|
+
.product-discovery-product-list,.product-discovery-product-list__container{display:flex;flex-direction:column;width:100%}.product-discovery-product-list__grid{display:grid;grid-template-columns:1fr 1fr;margin-top:var(--spacing-small)}.product-discovery-product-list__grid .dropin-product-item-card{text-align:left;border:1px solid transparent;width:200px}.product-discovery-product-list__grid .dropin-product-item-card:hover{border:1px solid var(--color-neutral-400);box-shadow:0 0 var(--spacing-xsmall) 0 #a9a9a9;padding:none}.product-discovery-product-list__grid .dropin-product-item-card a:hover{text-decoration:none;color:var(--color-neutral-800)}.product-discovery-product-list__header{display:flex;flex-direction:row-reverse;width:100%}.product-discovery-product-list__picker{width:15.625rem;display:inline-block}.product-discovery-product-item__image{min-height:250px}@media only screen and (min-width: 768px){.product-discovery-product-list__grid{grid-template-columns:repeat(3,1fr)}}@media only screen and (min-width: 1366px){.product-discovery-product-list__grid{grid-template-columns:repeat(4,1fr)}}.product-discovery-search-alert-message__wrapper{display:flex;flex-direction:column;justify-content:center;width:100%;min-height:300px}.product-discovery-search-alert-message__content{display:flex;justify-content:center}.product-discovery-facet__bucket .dropin-price-range .dropin-price--small.dropin-price--bold{font:var(--type-body-2-default-font)}.product-discovery-facet__bucket .dropin-radio-button__label:before{margin-right:var(--spacing-xsmall)}.product-discovery-facet-list{display:flex;flex-direction:column;width:100%}.product-discovery-facet-list__selected-filters{display:flex;flex-direction:row;flex-wrap:wrap;row-gap:var(--spacing-xxsmall);padding:0 0 var(--spacing-xxsmall) 0}.product-discovery-facet-list__selected-filters button{padding:0 var(--spacing-xxsmall);margin:0 var(--spacing-xxsmall);border-radius:var(--shape-border-radius-2)}.product-discovery-facet-list__selected-filters .dropin-price-range .dropin-price--small.dropin-price--bold{font:var(--type-button-2-font)}.product-discovery-facet-list__facet-options{text-align:left}.product-discovery-facet-list__facet-options button{padding:0}.product-discovery-facet-list__facet-options .dropin-radio-button{padding:var(--spacing-xxsmall) 0}.product-discovery-facet-list__facet-options--hidden{display:none}.product-discovery-facet-list__show-filters-button{display:flex;margin:0 0 var(--spacing-xsmall) 0}.product-discovery-facet-list .dropin-divider{margin:var(--spacing-xsmall) 0 var(--spacing-xsmall) 0}@media only screen and (min-width: 768px){.product-discovery-facet-list{min-width:13.12rem}.product-discovery-facet-list__facet-options{display:flex;flex-direction:column}.product-discovery-facet-list__show-filters-button{display:none}}
|
|
5
|
+
.product-discovery--search-bar-results{position:absolute;top:100%;left:0;right:0;z-index:1000;display:flex;align-items:flex-start;justify-content:flex-end;pointer-events:none}.product-discovery--search-bar-results__popover{position:relative;background:var(--color-neutral-50, #fff);box-shadow:0 10px 25px -3px #0000001a,0 4px 6px -2px #0000000d,0 0 0 1px #0000000d;width:100%;max-width:25rem;overflow:hidden;z-index:1001;animation:popoverSlideIn .2s ease-out;pointer-events:auto;display:flex;flex-direction:column;height:100%;min-height:0}.product-discovery--search-bar-results__outer-container{display:flex;flex-direction:column;padding:var(--spacing-small, 1rem)}@keyframes popoverSlideIn{0%{opacity:0;transform:translateY(-10px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.product-discovery--search-bar-results__grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-small, 1rem);overflow-y:auto;flex:1;min-height:0}.product-discovery--search-bar-results__grid>*{min-width:0;overflow:hidden}.product-discovery--search-bar-results__view-all-wrapper{flex-shrink:0;border-top:1px solid var(--color-neutral-200, #e5e5e5);background:var(--color-neutral-300)}.product-discovery--search-bar-results__view-all-button{display:flex;justify-content:center;width:100%}.product-discovery--search-bar-results__grid::-webkit-scrollbar{width:.5rem}.product-discovery--search-bar-results__grid::-webkit-scrollbar-track{background:var(--color-neutral-100, #f5f5f5);border-radius:.25rem}.product-discovery--search-bar-results__grid::-webkit-scrollbar-thumb{background:var(--color-neutral-400, #d4d4d4);border-radius:.25rem}.product-discovery--search-bar-results__grid::-webkit-scrollbar-thumb:hover{background:var(--color-neutral-500, #a3a3a3)}@media only screen and (min-width: 48rem){.product-discovery--search-bar-results{padding-top:.75rem}.product-discovery--search-bar-results__popover{max-width:25rem}.product-discovery--search-bar-results__grid{gap:var(--spacing-medium, 1.5rem);padding:var(--spacing-medium, 1.5rem)}}@media only screen and (min-width: 1024px){.product-discovery--search-bar-results__popover{max-width:25rem}}.product-discovery--product-item{display:flex;flex-flow:column nowrap;gap:var(--spacing-small);width:auto;align-items:center;cursor:pointer;text-decoration:none;color:inherit;font-weight:var(--font-weight-regular, 600)}.product-discovery--product-item:hover,.product-discovery--product-item:focus{box-shadow:0 2px 8px #0000001a;text-decoration:none}.product-discovery--product-item__image .dropin-image{width:10rem;height:10rem;max-width:10rem;max-height:10rem;object-fit:cover;border-radius:var(--shape-border-radius-2, 4px)}.product-discovery--product-item__details{display:flex;flex-flow:column nowrap;justify-content:space-between;width:100%}.product-discovery--product-item__details [data-slot=ProductPrice]{text-align:start}
|
|
6
6
|
.product-discovery--search-bar-input__container{display:flex;align-items:center;width:100%}.product-discovery--search-bar-input__form{display:flex;align-items:center}
|
|
7
|
-
.
|
|
7
|
+
.product-discovery-results-info{display:none}.product-discovery-results-info__search-phrase--upercase{text-transform:capitalize}@media only screen and (min-width: 768px){.product-discovery-results-info{display:flex;flex-direction:row;gap:var(--spacing-xsmall);width:100%;padding:var(--spacing-xsmall);text-align:center}}`,{styleId:"storefront-product-discovery"});
|
|
8
8
|
import{jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{Render as c}from"@dropins/tools/lib.js";import{useState as i,useEffect as a}from"@dropins/tools/preact-hooks.js";import{UIProvider as l}from"@dropins/tools/components.js";import{events as u}from"@dropins/tools/event-bus.js";const h={PLP:{Warning:{minQueryLength:"Your search term {SEARCH_PHRASE} has not reached the minimum of {{minQueryLength}} characters.",noResults:"Your search returned no results.",searchError:"An error occurred while searching."},SortDropdown:{title:"Sort by",option:"Sort by: {{selectedOption}}",relevanceLabel:"Most Relevant",positionLabel:"Position",sortAttributeASC:"{{label}}: Low to High",sortAttributeDESC:"{{label}}: High to Low",sortASC:"Price: Low to High",sortDESC:"Price: High to Low",productName:"Product Name",productInStock:"In Stock",productLowStock:"Low Stock"}},Facet:{showMore:"Show more",showLess:"Show less",clearAll:"Clear all"},ResultsInfo:{resultsFor:"Results for",products:"products"},SearchInput:{placeholder:"Search",viewAllButton:"View All"}},S={Search:h},m={default:S},d=({children:r})=>{const[t,n]=i("en_US");return a(()=>{const e=u.on("locale",s=>{n(s)},{eager:!0});return()=>{e==null||e.off()}},[]),o(l,{lang:t,langDefinitions:m,children:r})},A=new c(o(d,{}));export{A as render};
|
|
9
9
|
//# sourceMappingURL=render.js.map
|