@dropins/storefront-product-discovery 3.1.0 → 3.1.1-alpha1
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/search.js +3 -3
- package/chunks/search.js.map +1 -1
- package/containers/Facets/utils/categoryFacetUtils.d.ts +39 -0
- package/containers/Facets/utils/facetUtils.d.ts +7 -2
- package/containers/Facets.js +1 -1
- package/containers/Facets.js.map +1 -1
- package/package.json +1 -1
- package/render.js +1 -1
package/chunks/search.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{merge as
|
|
3
|
+
import{merge as re}from"@dropins/tools/lib.js";import{c as te}from"./initialize.js";import{events as w}from"@dropins/tools/event-bus.js";import{ProductView as se,Facet as ie}from"../fragments.js";import{S as oe,P as ue,u as le,s as pe,a as ce,b as me}from"./acdlEvents.js";import{FetchGraphQL as he}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:xe,setFetchGraphQlHeader:$e,removeFetchGraphQlHeader:De,setFetchGraphQlHeaders:Ee,getFetchGraphQlHeader:Fe,fetchGraphQl:ge,getConfig:Te}=new he().getMethods(),P=e=>!e||!Intl.supportedValuesOf("currency").includes(e)?"USD":e,fe=e=>{var r,i,g,h,c,n,s,t,u,l,f,p,_,y,m,b,v,R,I,S,x,$,D,E,F,T,z,Q,U,A,B,G,H,K,O,M,L,N,V,W,Y,j,q,J,X,Z,a,d,k,ee;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],attributes:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const o={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)||[],attributes:((r=e==null?void 0:e.attributes)==null?void 0:r.map(C=>({label:C.label||"",name:C.name||"",roles:C.roles||[],value:C.value??null})))||[],images:((i=e==null?void 0:e.images)==null?void 0:i.map(C=>{var ne;return{label:C.label||"",roles:C.roles||[],url:((ne=C.url)==null?void 0:ne.replace(/^https?:\/\//,"//"))||""}}))||[],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=(h=(g=e==null?void 0:e.price)==null?void 0:g.final)==null?void 0:h.amount)==null?void 0:c.value)||0,currency:P((t=(s=(n=e==null?void 0:e.price)==null?void 0:n.final)==null?void 0:s.amount)==null?void 0:t.currency)}},regular:{amount:{value:((f=(l=(u=e==null?void 0:e.price)==null?void 0:u.regular)==null?void 0:l.amount)==null?void 0:f.value)||0,currency:P((y=(_=(p=e==null?void 0:e.price)==null?void 0:p.regular)==null?void 0:_.amount)==null?void 0:y.currency)}},roles:((m=e==null?void 0:e.price)==null?void 0:m.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((I=(R=(v=(b=e==null?void 0:e.priceRange)==null?void 0:b.minimum)==null?void 0:v.final)==null?void 0:R.amount)==null?void 0:I.value)||0,currency:P((D=($=(x=(S=e==null?void 0:e.priceRange)==null?void 0:S.minimum)==null?void 0:x.final)==null?void 0:$.amount)==null?void 0:D.currency)}},regular:{amount:{value:((z=(T=(F=(E=e==null?void 0:e.priceRange)==null?void 0:E.minimum)==null?void 0:F.regular)==null?void 0:T.amount)==null?void 0:z.value)||0,currency:P((B=(A=(U=(Q=e==null?void 0:e.priceRange)==null?void 0:Q.minimum)==null?void 0:U.regular)==null?void 0:A.amount)==null?void 0:B.currency)}}},maximum:{final:{amount:{value:((O=(K=(H=(G=e==null?void 0:e.priceRange)==null?void 0:G.maximum)==null?void 0:H.final)==null?void 0:K.amount)==null?void 0:O.value)||0,currency:P((V=(N=(L=(M=e==null?void 0:e.priceRange)==null?void 0:M.maximum)==null?void 0:L.final)==null?void 0:N.amount)==null?void 0:V.currency)}},regular:{amount:{value:((q=(j=(Y=(W=e==null?void 0:e.priceRange)==null?void 0:W.maximum)==null?void 0:Y.regular)==null?void 0:j.amount)==null?void 0:q.value)||0,currency:P((a=(Z=(X=(J=e==null?void 0:e.priceRange)==null?void 0:J.maximum)==null?void 0:X.regular)==null?void 0:Z.amount)==null?void 0:a.currency)}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return re(o,(ee=(k=(d=te.getConfig().models)==null?void 0:d.Product)==null?void 0:k.transformer)==null?void 0:ee.call(k,e))};function ye(e,o){var g,h,c,n,s,t,u,l,f;const r=e==null?void 0:e.productSearch,i={facets:Ce((r==null?void 0:r.facets)||[],o),items:(r==null?void 0:r.items.map(p=>fe(p==null?void 0:p.productView)))||[],pageInfo:{currentPage:((g=r==null?void 0:r.page_info)==null?void 0:g.current_page)||1,totalPages:((h=r==null?void 0:r.page_info)==null?void 0:h.total_pages)||1,totalItems:((c=r==null?void 0:r.page_info)==null?void 0:c.total_items)||0,pageSize:((n=r==null?void 0:r.page_info)==null?void 0:n.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0,metadata:{filterableAttributes:((s=e==null?void 0:e.attributeMetadata)==null?void 0:s.filterableInSearch)||[],sortableAttributes:_e(((t=e==null?void 0:e.attributeMetadata)==null?void 0:t.sortable)||[],o)}};return re(i,(f=(l=(u=te.getConfig().models)==null?void 0:u.ProductSearchResult)==null?void 0:l.transformer)==null?void 0:f.call(l,e))}function _e(e=[],o){return!e||e.length===0?[]:e.filter(r=>{var i;return r.attribute==="position"?(i=o==null?void 0:o.filter)==null?void 0:i.some(h=>h.attribute==="categoryPath"):!0}).map(r=>({...r,bidirectional:r.attribute==="price"}))}function Ce(e=[],o){var h,c;if(!e||e.length===0)return[];if((h=o==null?void 0:o.filter)==null?void 0:h.some(n=>n.attribute==="categoryPath"))return e.filter(n=>n.attribute!=="categories");const i=(c=o==null?void 0:o.filter)==null?void 0:c.find(n=>n.attribute==="categories"),g=(i==null?void 0:i.in)||[];return e.map(n=>n.attribute==="categories"?be(n,g):n)}function be(e,o){const r=n=>{var s,t;return((t=(s=e.buckets)==null?void 0:s.find(u=>u.path===n))==null?void 0:t.name)??""};if(!e.buckets||e.buckets.length===0){if(o.length>0){const n=[];return o.forEach(s=>{if(s.includes("/")){const u=s.split("/")[0];n.some(l=>l.path===u)||n.push({title:u,__typename:"CategoryView",name:"",count:0,path:u,isChild:!1}),n.push({title:s,__typename:"CategoryView",name:"",count:0,path:s,isChild:!0,parentPath:u})}else n.push({title:s,__typename:"CategoryView",name:"",count:0,path:s,isChild:!1})}),{...e,buckets:n}}return e}if(o.length===0){const n=e.buckets.filter(s=>{const t=s.path;return typeof t=="string"&&t.length>0&&!t.includes("/")});return{...e,buckets:n.map(s=>({...s,isChild:!1}))}}const i=[],g=new Set;if(o.forEach(n=>{const s=n.includes("/");let t=n;if(s&&(t=n.split("/")[0]),g.has(t))return;g.add(t);const u=t.split("/").length,l=e.buckets.filter(p=>!p.path||!p.path.startsWith(t+"/")?!1:p.path.split("/").length===u+1),f=e.buckets.find(p=>p.path===t);if(l.length>0){const p=(f==null?void 0:f.count)??l.reduce((m,b)=>m+(b.count||0),0),_={title:t,__typename:"CategoryView",name:r(t),count:p,path:t,isChild:!1};i.push(_);const y=new Set;l.forEach(m=>{y.add(m.path),i.push({...m,isChild:!0,parentPath:t})}),s&&!y.has(n)&&(y.add(n),i.push({title:n,__typename:"CategoryView",name:r(n),count:0,path:n,isChild:!0,parentPath:t})),s&&y.size===1&&o.forEach(m=>{const b=m.startsWith(t+"/")&&m.split("/").length===u+1;m!==n&&b&&!y.has(m)&&(y.add(m),i.push({title:m,__typename:"CategoryView",name:r(m),count:0,path:m,isChild:!0,parentPath:t}))})}else if(s)i.push({title:t,__typename:"CategoryView",name:r(t),count:0,path:t,isChild:!1}),i.push({title:n,__typename:"CategoryView",name:r(n),count:0,path:n,isChild:!0,parentPath:t});else{const p=e.buckets.find(_=>_.path===n);p?i.push({...p,isChild:!1}):i.push({title:n,__typename:"CategoryView",name:r(n),count:0,path:n,isChild:!1})}}),i.length>0)return{...e,buckets:i};const h=new Set(e.buckets.map(n=>n.path)),c=[];return o.forEach(n=>{if(!h.has(n))if(n.includes("/")){const t=n.split("/")[0];c.some(u=>u.path===t)||c.push({title:t,__typename:"CategoryView",name:r(t),count:0,path:t,isChild:!1}),c.push({title:n,__typename:"CategoryView",name:r(n),count:0,path:n,isChild:!0,parentPath:t})}else c.push({title:n,__typename:"CategoryView",name:r(n),count:0,path:n,isChild:!1})}),c.length>0?{...e,buckets:[...c,...e.buckets.map(n=>({...n,isChild:!1}))]}:{...e,buckets:e.buckets.map(n=>({...n,isChild:!1}))}}const we=`
|
|
4
4
|
query productSearch(
|
|
5
5
|
$phrase: String!
|
|
6
6
|
$pageSize: Int
|
|
@@ -44,7 +44,7 @@ import{merge as ne}from"@dropins/tools/lib.js";import{c as ie}from"./initialize.
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
${oe}
|
|
48
47
|
${se}
|
|
49
|
-
|
|
48
|
+
${ie}
|
|
49
|
+
`,ze=async(e,o={})=>{var g,h,c;const r=o.scope==="search"?void 0:o.scope,i={request:e||{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[],metadata:{filterableAttributes:[],sortableAttributes:[]}}};if(e===null)return w.emit("search/result",i,{scope:r}),i.result;w.emit("search/loading",!0,{scope:r});try{const n=r==="popover"?oe:ue,s=window.crypto.randomUUID(),t={...e,phrase:e.phrase??"",currentPage:e.currentPage??1,sort:e.sort??[],filter:e.filter??[]};le(n,s,t.phrase||"",t.filter||[],t.pageSize||0,t.currentPage||0,t.sort||[]),pe(n);const{errors:u,data:l}=await ge(we,{method:"GET",variables:{...t}});if(u&&!l)throw new Error("Error fetching product search");const f=ye(l,t),p=(c=(h=(g=l==null?void 0:l.productSearch)==null?void 0:g.facets)==null?void 0:h.find(_=>_.attribute==="categories"))==null?void 0:c.buckets;return ce(n,s,f),me(n),w.emit("search/result",{request:t,result:f,rawCategoriesBuckets:p},{scope:r}),f}catch(n){throw w.emit("search/error",n.message,{scope:r}),w.emit("search/result",i,{scope:r}),n}finally{w.emit("search/loading",!1,{scope:r})}};export{$e as a,Ee as b,Te as c,ze as d,ge as f,Fe as g,De as r,xe as s};
|
|
50
50
|
//# sourceMappingURL=search.js.map
|
package/chunks/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.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 { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nconst getCurrency = (currency?: string) => {\n if (!currency || !Intl.supportedValuesOf(\"currency\").includes(currency)) {\n return 'USD';\n }\n return currency;\n};\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 attributes: [],\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 attributes:\n data?.attributes?.map((attr: any) => ({\n label: attr.label || '',\n name: attr.name || '',\n roles: attr.roles || [],\n value: attr.value ?? null,\n })) || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\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: getCurrency(data?.price?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: getCurrency(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: getCurrency(data?.priceRange?.minimum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: getCurrency(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: getCurrency(data?.priceRange?.maximum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.regular?.amount?.currency),\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\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 metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\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\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n return facets;\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 { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n};\n\nexport const search = async (\n request: SearchVariables | null,\n options: SearchOptions = {},\n): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n const resolvedRequest: SearchVariables = {\n ...request,\n phrase: request.phrase ?? '',\n currentPage: request.currentPage ?? 1,\n sort: request.sort ?? [],\n filter: request.filter ?? [],\n };\n\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n resolvedRequest.phrase || '',\n resolvedRequest.filter || [],\n resolvedRequest.pageSize || 0,\n resolvedRequest.currentPage || 0,\n resolvedRequest.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...resolvedRequest },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, resolvedRequest);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId);\n\n // Emit single event with result and metadata\n events.emit('search/result', { request: resolvedRequest, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","getCurrency","currency","transformProduct","data","transformedProduct","_a","attr","_b","image","_e","_d","_c","_h","_g","_f","_k","_j","_i","_n","_m","_l","_o","_s","_r","_q","_p","_w","_v","_u","_t","_A","_z","_y","_x","_E","_D","_C","_B","_I","_H","_G","_F","_M","_L","_K","_J","_Q","_P","_O","_N","_U","_T","_S","_R","merge","_X","_W","_V","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","request","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","resolvedRequest","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.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 { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nconst getCurrency = (currency?: string) => {\n if (!currency || !Intl.supportedValuesOf(\"currency\").includes(currency)) {\n return 'USD';\n }\n return currency;\n};\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 attributes: [],\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 attributes:\n data?.attributes?.map((attr: any) => ({\n label: attr.label || '',\n name: attr.name || '',\n roles: attr.roles || [],\n value: attr.value ?? null,\n })) || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\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: getCurrency(data?.price?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: getCurrency(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: getCurrency(data?.priceRange?.minimum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: getCurrency(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: getCurrency(data?.priceRange?.maximum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.regular?.amount?.currency),\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\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 metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\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\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n // Get the currently filtered categories (if any)\n const categoriesFilter = searchVariables?.filter?.find(\n (filter) => filter.attribute === 'categories'\n );\n const filteredCategories = categoriesFilter?.in || [];\n\n // Transform categories facet based on filtered state\n return facets.map((facet) => {\n if (facet.attribute === 'categories') {\n return transformCategoriesFacet(facet, filteredCategories);\n }\n return facet;\n });\n}\n\n/**\n * Transforms the categories facet based on what's currently filtered.\n * When a parent category is selected, displays the parent with its children indented underneath.\n * \n * Always ensures that filtered categories remain visible in the facet buckets.\n * \n * @param facet - The categories facet from the API\n * @param filteredCategories - Currently filtered category values\n */\nfunction transformCategoriesFacet(facet: any, filteredCategories: string[]): any {\n // Resolve display name from API bucket by path (UI must only use bucket.name, never derived from path/title)\n const getNameByPath = (path: string): string =>\n facet.buckets?.find((b: any) => b.path === path)?.name ?? '';\n\n if (!facet.buckets || facet.buckets.length === 0) {\n // If API returns no buckets but there are filtered categories,\n // create buckets for the filtered categories so they remain visible (no API name available)\n if (filteredCategories.length > 0) {\n const resultBuckets: any[] = [];\n \n filteredCategories.forEach(cat => {\n const isChildCategory = cat.includes('/');\n \n if (isChildCategory) {\n const parentCategory = cat.split('/')[0];\n \n if (!resultBuckets.some(b => b.path === parentCategory)) {\n resultBuckets.push({\n title: parentCategory,\n __typename: 'CategoryView',\n name: '',\n count: 0,\n path: parentCategory,\n isChild: false,\n });\n }\n \n resultBuckets.push({\n title: cat,\n __typename: 'CategoryView',\n name: '',\n count: 0,\n path: cat,\n isChild: true,\n parentPath: parentCategory,\n });\n } else {\n resultBuckets.push({\n title: cat,\n __typename: 'CategoryView',\n name: '',\n count: 0,\n path: cat,\n isChild: false,\n });\n }\n });\n \n return {\n ...facet,\n buckets: resultBuckets\n };\n }\n return facet;\n }\n\n // If no categories are filtered, show only top-level categories (no children).\n // Child categories are shown only after the user selects a parent.\n // Hierarchy is determined only by path (not title).\n if (filteredCategories.length === 0) {\n const topLevelBuckets = facet.buckets.filter((bucket: any) => {\n const path = bucket.path;\n return typeof path === 'string' && path.length > 0 && !path.includes('/');\n });\n return {\n ...facet,\n buckets: topLevelBuckets.map((bucket: any) => ({\n ...bucket,\n isChild: false,\n }))\n };\n }\n\n // Build hierarchical structure: parent + children\n const resultBuckets: any[] = [];\n \n // Track which parents we've already processed\n const processedParents = new Set<string>();\n\n filteredCategories.forEach(filteredCategory => {\n // Check if this is a child category (has a slash)\n const isChildCategory = filteredCategory.includes('/');\n let parentCategory = filteredCategory;\n \n if (isChildCategory) {\n // Extract parent from child (e.g., \"collections/gear\" -> \"collections\")\n parentCategory = filteredCategory.split('/')[0];\n }\n \n // Skip if we've already processed this parent\n if (processedParents.has(parentCategory)) {\n return;\n }\n processedParents.add(parentCategory);\n \n // Find direct children only (one level deeper); tree can be 4+ levels deep\n const parentDepth = parentCategory.split('/').length;\n const childBuckets = facet.buckets.filter((bucket: any) => {\n if (!bucket.path) return false;\n if (!bucket.path.startsWith(parentCategory + '/')) return false;\n return bucket.path.split('/').length === parentDepth + 1;\n });\n\n const parentBucketFromApi = facet.buckets.find((b: any) => b.path === parentCategory);\n\n // When parent is selected: show parent + its children as selectable options.\n // API may return a flat list (parent + children + other categories); we still show parent + only its children.\n if (childBuckets.length > 0) {\n const totalCount = parentBucketFromApi?.count ?? childBuckets.reduce((sum: number, b: any) => sum + (b.count || 0), 0);\n\n const parentBucket = {\n title: parentCategory,\n __typename: 'CategoryView',\n name: getNameByPath(parentCategory),\n count: totalCount,\n path: parentCategory,\n isChild: false,\n };\n\n // Add parent first\n resultBuckets.push(parentBucket);\n\n // Add ALL children indented underneath (keep siblings visible); UI uses bucket.name from API\n const childrenInResponse = new Set<string>();\n childBuckets.forEach((childBucket: any) => {\n childrenInResponse.add(childBucket.path);\n resultBuckets.push({\n ...childBucket,\n isChild: true,\n parentPath: parentCategory,\n });\n });\n \n // If a child was selected but not in API response, add it as placeholder (use API name if known)\n if (isChildCategory && !childrenInResponse.has(filteredCategory)) {\n childrenInResponse.add(filteredCategory);\n resultBuckets.push({\n title: filteredCategory,\n __typename: 'CategoryView',\n name: getNameByPath(filteredCategory),\n count: 0,\n path: filteredCategory,\n isChild: true,\n parentPath: parentCategory,\n });\n }\n \n // If API returned only 1 child but a child filter is active, add sibling placeholders (direct children only)\n if (isChildCategory && childrenInResponse.size === 1) {\n filteredCategories.forEach(fc => {\n const isDirectSibling = fc.startsWith(parentCategory + '/') && fc.split('/').length === parentDepth + 1;\n if (fc !== filteredCategory && isDirectSibling && !childrenInResponse.has(fc)) {\n childrenInResponse.add(fc);\n resultBuckets.push({\n title: fc,\n __typename: 'CategoryView',\n name: getNameByPath(fc),\n count: 0,\n path: fc,\n isChild: true,\n parentPath: parentCategory,\n });\n }\n });\n }\n } else if (isChildCategory) {\n // Child selected but API didn't return children - create parent + selected child\n resultBuckets.push({\n title: parentCategory,\n __typename: 'CategoryView',\n name: getNameByPath(parentCategory),\n count: 0,\n path: parentCategory,\n isChild: false,\n });\n resultBuckets.push({\n title: filteredCategory,\n __typename: 'CategoryView',\n name: getNameByPath(filteredCategory),\n count: 0,\n path: filteredCategory,\n isChild: true,\n parentPath: parentCategory,\n });\n } else {\n const existingBucket = facet.buckets.find((b: any) => b.path === filteredCategory);\n if (existingBucket) {\n resultBuckets.push({\n ...existingBucket,\n isChild: false,\n });\n } else {\n resultBuckets.push({\n title: filteredCategory,\n __typename: 'CategoryView',\n name: getNameByPath(filteredCategory),\n count: 0,\n path: filteredCategory,\n isChild: false,\n });\n }\n }\n });\n\n // If we built a hierarchical structure, return it\n if (resultBuckets.length > 0) {\n return {\n ...facet,\n buckets: resultBuckets\n };\n }\n\n // Fallback: No hierarchical structure was built\n // This can happen if filteredCategories weren't processed in the loop above\n // Ensure filtered categories are in the bucket list with proper hierarchy\n const bucketPaths = new Set(facet.buckets.map((b: any) => b.path));\n const additionalBuckets: any[] = [];\n\n filteredCategories.forEach(cat => {\n if (!bucketPaths.has(cat)) {\n const isChildCategory = cat.includes('/');\n \n if (isChildCategory) {\n const parentCategory = cat.split('/')[0];\n if (!additionalBuckets.some(b => b.path === parentCategory)) {\n additionalBuckets.push({\n title: parentCategory,\n __typename: 'CategoryView',\n name: getNameByPath(parentCategory),\n count: 0,\n path: parentCategory,\n isChild: false,\n });\n }\n additionalBuckets.push({\n title: cat,\n __typename: 'CategoryView',\n name: getNameByPath(cat),\n count: 0,\n path: cat,\n isChild: true,\n parentPath: parentCategory,\n });\n } else {\n additionalBuckets.push({\n title: cat,\n __typename: 'CategoryView',\n name: getNameByPath(cat),\n count: 0,\n path: cat,\n isChild: false,\n });\n }\n }\n });\n \n if (additionalBuckets.length > 0) {\n return {\n ...facet,\n buckets: [...additionalBuckets, ...facet.buckets.map((b: any) => ({ ...b, isChild: false }))]\n };\n }\n\n // Otherwise, return original buckets marked as non-children\n return {\n ...facet,\n buckets: facet.buckets.map((b: any) => ({ ...b, isChild: false }))\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 { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n};\n\nexport const search = async (\n request: SearchVariables | null,\n options: SearchOptions = {},\n): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n const resolvedRequest: SearchVariables = {\n ...request,\n phrase: request.phrase ?? '',\n currentPage: request.currentPage ?? 1,\n sort: request.sort ?? [],\n filter: request.filter ?? [],\n };\n\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n resolvedRequest.phrase || '',\n resolvedRequest.filter || [],\n resolvedRequest.pageSize || 0,\n resolvedRequest.currentPage || 0,\n resolvedRequest.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...resolvedRequest },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, resolvedRequest);\n\n // Raw categories buckets (before transform) for optimistic child rendering in Facets\n const rawCategoriesBuckets = data?.productSearch?.facets?.find(\n (f: { attribute?: string }) => f.attribute === 'categories'\n )?.buckets;\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId);\n\n // Emit single event with result and metadata\n events.emit('search/result', { request: resolvedRequest, result, rawCategoriesBuckets }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","getCurrency","currency","transformProduct","data","transformedProduct","_a","attr","_b","image","_e","_d","_c","_h","_g","_f","_k","_j","_i","_n","_m","_l","_o","_s","_r","_q","_p","_w","_v","_u","_t","_A","_z","_y","_x","_E","_D","_C","_B","_I","_H","_G","_F","_M","_L","_K","_J","_Q","_P","_O","_N","_U","_T","_S","_R","merge","_X","_W","_V","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","categoriesFilter","filteredCategories","transformCategoriesFacet","getNameByPath","path","b","resultBuckets","cat","parentCategory","topLevelBuckets","bucket","processedParents","filteredCategory","isChildCategory","parentDepth","childBuckets","parentBucketFromApi","totalCount","sum","parentBucket","childrenInResponse","childBucket","fc","isDirectSibling","existingBucket","bucketPaths","additionalBuckets","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","request","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","resolvedRequest","updateSearchInputCtx","searchRequestSent","errors","result","rawCategoriesBuckets","f","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SearchFacet, SearchFilter } from '../../../data/models/api';
|
|
2
|
+
|
|
3
|
+
type MapRef<T> = {
|
|
4
|
+
current: T;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Merges raw category buckets into the ref. Once we have data for a path, never overwrite it with blank (preserve initial tree).
|
|
8
|
+
*/
|
|
9
|
+
export declare function mergeRawCategoriesBuckets(rawBuckets: any[] | undefined, ref: MapRef<Map<string, any>>): void;
|
|
10
|
+
/**
|
|
11
|
+
* Persists category buckets into the ref. Once we have data for a path, never overwrite with blank so initial tree data survives subsequent API calls.
|
|
12
|
+
*/
|
|
13
|
+
export declare function persistCategoryTree(buckets: any[] | undefined, ref: MapRef<Map<string, any>>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Fills the ref with known children per parent from category facets (for sibling persistence).
|
|
16
|
+
*/
|
|
17
|
+
export declare function trackKnownChildrenForFacets(facets: SearchFacet[] | undefined, ref: MapRef<Map<string, Map<string, any>>>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Merges known siblings into the bucket list when a child category is selected.
|
|
20
|
+
* getKnownChildren(parentPath) should return the stored child buckets for that parent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function mergeKnownSiblings(buckets: any[], selectedCategories: string[], getKnownChildren: (parentPath: string) => Map<string, any> | undefined): any[];
|
|
23
|
+
/**
|
|
24
|
+
* Restores bucket names and inserts missing buckets from a cached tree for the given paths.
|
|
25
|
+
* getCached(path) should return the cached bucket data for that path.
|
|
26
|
+
*/
|
|
27
|
+
export declare function restoreFromTree(buckets: any[], pathsToRestore: string[], getCached: (path: string) => any | undefined): any[];
|
|
28
|
+
/**
|
|
29
|
+
* Outdents children whose parent is not present (treats them as top-level).
|
|
30
|
+
* isPathPresent(path) and isPathInTree(path) determine whether a path exists in current buckets or in the persisted tree.
|
|
31
|
+
*/
|
|
32
|
+
export declare function outdentChildrenWithoutParent(buckets: any[], isPathPresent: (path: string) => boolean, isPathInTree: (path: string) => boolean): any[];
|
|
33
|
+
/**
|
|
34
|
+
* Processes category facet buckets: merges known siblings, restores from tree, then outdents children without parent.
|
|
35
|
+
* Uses the given refs for known children and original category tree.
|
|
36
|
+
*/
|
|
37
|
+
export declare function processCategoryBuckets(buckets: any[], filterList: SearchFilter[] | undefined, hasCategoryFilter: boolean, knownChildrenRef: MapRef<Map<string, Map<string, any>>>, originalCategoryTreeRef: MapRef<Map<string, any>>): any[];
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=categoryFacetUtils.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SearchFacet } from '../../../data/models/api';
|
|
1
|
+
import { SearchFacet, SearchFilter } from '../../../data/models/api';
|
|
2
2
|
import { Product } from '../../../data/models/product';
|
|
3
3
|
|
|
4
4
|
declare const getFilterSelection: (facet: SearchFacet) => {
|
|
@@ -11,7 +11,12 @@ declare const getFilterSelection: (facet: SearchFacet) => {
|
|
|
11
11
|
attribute: string;
|
|
12
12
|
in: string[];
|
|
13
13
|
} | null | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Returns whether a facet bucket is selected according to the given filter.
|
|
16
|
+
* Handles range buckets, scalar/category in-list selection, and category parent selection when a child is selected.
|
|
17
|
+
*/
|
|
18
|
+
declare const isBucketSelected: (bucket: any, facet: SearchFacet, selectedFilter: SearchFilter | undefined) => boolean;
|
|
14
19
|
declare const getCurrencyType: (items: Product[]) => string;
|
|
15
20
|
declare const getBucketLabel: (bucket: any, facet: SearchFacet, currency: string | null) => any;
|
|
16
|
-
export { getBucketLabel, getCurrencyType, getFilterSelection };
|
|
21
|
+
export { getBucketLabel, getCurrencyType, getFilterSelection, isBucketSelected };
|
|
17
22
|
//# sourceMappingURL=facetUtils.d.ts.map
|
package/containers/Facets.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as x,jsx as c,Fragment as $}from"@dropins/tools/preact-jsx-runtime.js";import*as F from"@dropins/tools/preact-compat.js";import{useState as C,useRef as G,useEffect as q}from"@dropins/tools/preact-compat.js";import{classes as J,VComponent as A,Slot as k}from"@dropins/tools/lib.js";import{Button as b,Icon as M,PriceRange as N,Checkbox as K,RadioButton as Q}from"@dropins/tools/components.js";/* empty css */import{useText as D}from"@dropins/tools/i18n.js";import{events as X}from"@dropins/tools/event-bus.js";import{d as I}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const ee=n=>F.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",...n},F.createElement("g",{id:"Large"},F.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),F.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},F.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"}),F.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"})))),te=n=>F.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},F.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),F.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),re=n=>F.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},F.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),ne=({numberOfOptionsConfig:n=5,header:e,buckets:i,last:u})=>{const f=D({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),w=n,[v,g]=C(i.length<w),_=v?i.length:w;return x("div",{className:J(["product-discovery-facet",["product-discovery-facet--last",u]]),children:[c(A,{className:"product-discovery-facet__header",node:e}),i.slice(0,_).map((S,B)=>c(A,{className:"product-discovery-facet__bucket",node:S},B)),!v&&i.length>w&&c(b,{variant:"tertiary",icon:c(M,{source:ee,size:"24"}),onClick:()=>g(!v),children:f.showMore}),v&&i.length>w&&c(b,{variant:"tertiary",icon:c(M,{source:re,size:"24"}),onClick:()=>g(!v),children:f.showLess})]})},ce=({selectedFacets:n,facets:e})=>x($,{children:[c(A,{className:"product-discovery-facet-list__selected-filters",node:n}),c(A,{className:"product-discovery-facet-list__facet-options",node:e})]}),ae="no",ie="yes",se=n=>{const e=n.buckets.find(i=>i.selected);return e?{attribute:n.attribute,range:{from:e.from,to:e.to}}:null},le=n=>{const e=n.buckets.reduce((i,u)=>(u.selected&&i.push(u.title),i),[]);return e.length===0?null:{attribute:n.attribute,in:e}},z=n=>{var e;switch((e=n.buckets[0])==null?void 0:e.__typename){case"RangeBucket":return se(n);case"ScalarBucket":case"CategoryView":return le(n)}},oe=n=>{var i,u,f,w,v,g,_,S,B,y,E;const e=n[0];return(f=(u=(i=e==null?void 0:e.price)==null?void 0:i.regular)==null?void 0:u.amount)!=null&&f.currency?e.price.regular.amount.currency:(_=(g=(v=(w=e==null?void 0:e.priceRange)==null?void 0:w.minimum)==null?void 0:v.regular)==null?void 0:g.amount)!=null&&_.currency?(E=(y=(B=(S=e==null?void 0:e.priceRange)==null?void 0:S.minimum)==null?void 0:B.regular)==null?void 0:y.amount)==null?void 0:E.currency:"USD"},ue=(n,e,i)=>(e==null?void 0:e.attribute)==="price"?n.from===0?x("div",{style:"display:flex",children:[c(N,{amount:n.from,currency:i||"USD"}),c("span",{style:"padding: 0 2px",children:"-"}),c(N,{amount:n.to,currency:i||"USD"})]}):c(N,{minimumAmount:n.from,maximumAmount:n.to,currency:i||"USD",display:"dash"}):n.title,de=(n,e)=>n.title===ae?`Not ${e.title}`:n.title===ie?e.title:n.title,P=(n,e,i)=>{switch(n.__typename){case"RangeBucket":return ue(n,e,i);case"ScalarBucket":case"CategoryView":return de(n,e)}},_e=({scope:n,slots:e})=>{const i=D({clearAll:"Search.Facet.clearAll"}),[u,f]=C([]),[w,v]=C(null),[g,_]=C(),[S,B]=C(null),y=G(null),E=r=>{const s=new Set(u.map(t=>t.attribute)),a=[...((g==null?void 0:g.filter)||[]).filter(t=>!s.has(t.attribute)),...r.filter||[]];I({...r,filter:a},{scope:n})},U=r=>{if(!r||!r.result.facets&&!r.result.items&&!r.request.filter){f([]);return}_(r.request);const{facets:s,items:o}=r.result;v(oe(o));const a=r.request.filter;if(s){const t=s.map(l=>{const h=l.buckets.map(p=>{const d=a==null?void 0:a.find(L=>L.attribute===l.attribute);if(d){const L=d.range;if(L&&p.from===L.from&&p.to===L.to)return{...p,selected:!0};if(d.in&&d.in.includes(p.title))return{...p,selected:!0}}return{...p,selected:!1}});return{...l,buckets:h}});f(t)}},V=r=>{f(s=>{const o=s.map(t=>{const l=r.find(h=>h.attribute===t.attribute);return l||t}),a=o.reduce((t,l)=>{const h=z(l);return h&&t.push(h),t},[]);return B(a),o})},j=(r,s)=>{const o=r.buckets.map(t=>t.title===s?{...t,selected:!1}:t),a={...r,buckets:o};V([a])},W=()=>{const r=u.map(s=>{const o=s.buckets.map(a=>({...a,selected:!1}));return{...s,buckets:o}});f(r),B([])},O=(r,s)=>{const o=r.target.value,a=r.target.checked;f(t=>{const l=t.find(m=>m.attribute===s);if(!l)return t;const h=l.buckets.map(m=>{var R;return((R=l.buckets[0])==null?void 0:R.__typename)==="RangeBucket"?m.title===o?{...m,selected:a}:{...m,selected:!1}:m.title===o?{...m,selected:a}:{...m}}),p={...l,buckets:h},d=t.map(m=>m.attribute===s?p:m),L=d.reduce((m,R)=>{const T=z(R);return T&&m.push(T),m},[]);return B(L),d})},Z=(r,s)=>{const o=c("span",{children:r.title}),a=r.buckets.map(t=>{var p;const l=P(t,r,w),h=d=>x(k,{name:"FacetBucketLabel",slot:e==null?void 0:e.FacetBucketLabel,context:{data:t},children:[l," ",d?`(${d})`:""]});switch((p=r.buckets[0])==null?void 0:p.__typename){case"RangeBucket":return c(k,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:t},children:c(Q,{"data-testid":`${t.title}-radio`,label:h(),name:r.attribute,value:t.title,checked:t.selected,onChange:d=>{O(d,r.attribute)}})});case"ScalarBucket":case"CategoryView":return c(k,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:t},children:c(K,{id:`${r.attribute}-${t.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,"data-testid":`${t.title}-checkbox`,label:h(t.count),name:`${r.attribute}-${t.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,value:t.title,checked:t.selected,onChange:d=>{O(d,r.attribute)}})});default:return null}}).filter(t=>t!==null);return c(ne,{header:o,buckets:a,last:s===u.length-1})},H=()=>c(k,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:u},children:u.map((r,s)=>r.buckets.length>0?c($,{children:c(k,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:r},children:Z(r,s)})}):null)}),Y=()=>{const r=u.reduce((a,t)=>(t.buckets.filter(h=>h.selected).length>0&&a.push(t),a),[]),s=r.map(a=>a.buckets.map(t=>{if(t.selected){const l=P(t,a,w);return c(b,{"data-testid":`${t.title}-selected-btn`,"aria-label":`Remove ${a.title} filter: ${t.title}`,variant:"secondary",children:x($,{children:[c("span",{children:l}),c(M,{source:te,size:"16"})]}),onClick:()=>{j(a,t.title)}})}return null})),o=s.length>0?c(b,{variant:"secondary",onClick:()=>{W()},children:c("span",{children:i.clearAll})}):null;return x(k,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:r},children:[s,o]})};return q(()=>{const r=X.on("search/result",U,{eager:!0,scope:n});return()=>{r==null||r.off()}},[]),q(()=>{if(S!==null)return y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{g&&E({...g,filter:S,currentPage:1}),B(null)},150),()=>{y.current&&clearTimeout(y.current)}},[S,g]),c(ce,{selectedFacets:Y(),facets:H()})};export{_e as Facets,_e as default};
|
|
3
|
+
import{jsxs as $,jsx as u,Fragment as H}from"@dropins/tools/preact-jsx-runtime.js";import*as x from"@dropins/tools/preact-compat.js";import{useState as W,useRef as V,useEffect as I}from"@dropins/tools/preact-compat.js";import{classes as se,VComponent as j,Slot as T}from"@dropins/tools/lib.js";import{Button as q,Icon as K,PriceRange as k,Checkbox as ce,RadioButton as le}from"@dropins/tools/components.js";/* empty css */import{useText as J}from"@dropins/tools/i18n.js";import{events as oe}from"@dropins/tools/event-bus.js";import{d as de}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const ue=t=>x.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",...t},x.createElement("g",{id:"Large"},x.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),x.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},x.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"}),x.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"})))),he=t=>x.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},x.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),x.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),pe=t=>x.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},x.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),me=({numberOfOptionsConfig:t=5,header:e,buckets:n,last:r})=>{const c=J({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),l=t,[g,s]=W(n.length<l),S=g?n.length:l;return $("div",{className:se(["product-discovery-facet",["product-discovery-facet--last",r]]),children:[u(j,{className:"product-discovery-facet__header",node:e}),n.slice(0,S).map((o,h)=>u(j,{className:"product-discovery-facet__bucket",node:o},h)),!g&&n.length>l&&u(q,{variant:"tertiary",icon:u(K,{source:ue,size:"24"}),onClick:()=>s(!g),children:c.showMore}),g&&n.length>l&&u(q,{variant:"tertiary",icon:u(K,{source:pe,size:"24"}),onClick:()=>s(!g),children:c.showLess})]})},fe=({selectedFacets:t,facets:e})=>$(H,{children:[u(j,{className:"product-discovery-facet-list__selected-filters",node:t}),u(j,{className:"product-discovery-facet-list__facet-options",node:e})]}),ge="no",Ce="yes",ye=t=>{const e=t.buckets.find(n=>n.selected);return e?{attribute:t.attribute,range:{from:e.from,to:e.to}}:null},we=t=>{const e=t.buckets.reduce((n,r)=>{if(r.selected){if(t.attribute==="categories"&&r.isChild===!1){const c=r.path;if(t.buckets.some(g=>{var s;return g.selected&&g.isChild===!0&&((s=g.path)==null?void 0:s.startsWith(c+"/"))}))return n}n.push(r.title)}return n},[]);return e.length===0?null:{attribute:t.attribute,in:e}},Y=t=>{var e;switch((e=t.buckets[0])==null?void 0:e.__typename){case"RangeBucket":return ye(t);case"ScalarBucket":case"CategoryView":return we(t);default:return}},_e=(t,e,n)=>{var r;if(!n)return!1;if(n.range&&t.from===n.range.from&&t.to===n.range.to||n.in&&n.in.includes(t.title))return!0;if(e.attribute==="categories"&&t.isChild===!1){const c=t.path;if((r=n.in)==null?void 0:r.some(g=>g.startsWith(c+"/")))return!0}return!1},Fe=t=>{var n,r,c,l,g,s,S,o,h,v,N;const e=t[0];return(c=(r=(n=e==null?void 0:e.price)==null?void 0:n.regular)==null?void 0:r.amount)!=null&&c.currency?e.price.regular.amount.currency:(S=(s=(g=(l=e==null?void 0:e.priceRange)==null?void 0:l.minimum)==null?void 0:g.regular)==null?void 0:s.amount)!=null&&S.currency?(N=(v=(h=(o=e==null?void 0:e.priceRange)==null?void 0:o.minimum)==null?void 0:h.regular)==null?void 0:v.amount)==null?void 0:N.currency:"USD"},ve=(t,e,n)=>(e==null?void 0:e.attribute)==="price"?t.from===0?$("div",{style:"display:flex",children:[u(k,{amount:t.from,currency:n||"USD"}),u("span",{style:"padding: 0 2px",children:"-"}),u(k,{amount:t.to,currency:n||"USD"})]}):u(k,{minimumAmount:t.from,maximumAmount:t.to,currency:n||"USD",display:"dash"}):t.title,Se=(t,e)=>t.title===ge?`Not ${e.title}`:t.title===Ce?e.title:e.attribute==="categories"?t.name??"":t.title,G=(t,e,n)=>{switch(t.__typename){case"RangeBucket":return ve(t,e,n);case"ScalarBucket":case"CategoryView":return Se(t,e)}};function Be(t,e){t!=null&&t.length&&t.forEach(n=>{if((n==null?void 0:n.path)==null)return;const r=e.current.get(n.path),c=n.name!=null&&n.name!=="";r!=null&&r.name&&!c||e.current.set(n.path,n)})}function Pe(t,e){t!=null&&t.length&&t.forEach(n=>{const r=n.path??n.title;if(r==null)return;const c=n.name!=null&&n.name!=="",l=e.current.get(r);l!=null&&l.name&&!c||e.current.set(r,{title:n.title,__typename:n.__typename??"CategoryView",name:n.name,count:n.count,path:n.path??n.title,isChild:!!n.isChild,parentPath:n.parentPath})})}function Ee(t,e){t&&t.forEach(n=>{n.attribute==="categories"&&n.buckets.forEach(r=>{r.isChild&&r.parentPath&&(e.current.has(r.parentPath)||e.current.set(r.parentPath,new Map),e.current.get(r.parentPath).set(r.path,{title:r.title,__typename:r.__typename,name:r.name,displayName:r.displayName,count:r.count,path:r.path,isChild:r.isChild,parentPath:r.parentPath}))})})}function xe(t,e,n){const r=e.find(o=>o.includes("/"));if(!r)return t;const c=r.split("/")[0]??"",l=c?n(c):void 0;if(!l||l.size===0)return t;const g=new Set(t.map(o=>o.path)),s=[],S=[];return t.forEach(o=>{const h=l.get(o.path);h&&o.isChild?s.push({...o,count:h.count,displayName:h.displayName,name:h.name}):s.push(o)}),l.forEach((o,h)=>{g.has(h)||S.push(o)}),[...s,...S]}function Le(t,e,n){let r=t;for(const c of e){const l=n(c),g=r.find(s=>(s.path??s.title)===c);if(l)if(g)!g.name&&l.name&&(r=r.map(s=>(s.path??s.title)===c?{...s,name:l.name,count:s.count??l.count}:s));else{const s=!c.includes("/"),S={...l,isChild:!s,parentPath:s?void 0:c.split("/").slice(0,-1).join("/"),selected:!1};if(s)r=[S,...r];else{const o=c.split("/").slice(0,-1).join("/"),h=r.findIndex(N=>(N.path??N.title)===o),v=h>=0?h+1:0;r=[...r.slice(0,v),S,...r.slice(v)]}}}return r}function Ne(t,e,n){return t.map(r=>{const c=r.parentPath;return r.isChild&&c!=null&&!e(c)&&!n(c)?{...r,isChild:!1,parentPath:void 0}:r})}function Re(t,e,n,r,c){const l=e==null?void 0:e.find(o=>o.attribute==="categories"),g=(l==null?void 0:l.in)||[];let s=xe(t,g,o=>r.current.get(o));if(n&&c.current.size>0){const h=((l==null?void 0:l.in)??[])[0];if(h&&typeof h=="string"){const v=h.includes("/")?h.split("/")[0]:null,U=[v??h,v&&h!==v?h:null].filter(O=>typeof O=="string");s=Le(s,U,O=>c.current.get(O))}}const S=new Set(s.map(o=>o.path??o.title));return s=Ne(s,o=>S.has(o),o=>c.current.has(o)),s}const ke=({scope:t,slots:e})=>{const n=J({clearAll:"Search.Facet.clearAll"}),[r,c]=W([]),[l,g]=W(null),[s,S]=W(),[o,h]=W(null),v=V(null),N=V(new Map),M=V(new Map),U=V(new Map),O=i=>{const p=new Set(r.map(a=>a.attribute)),d=[...((s==null?void 0:s.filter)||[]).filter(a=>!p.has(a.attribute)),...i.filter||[]];de({...i,filter:d},{scope:t})},Q=i=>{if(!i||!i.result.facets&&!i.result.items&&!i.request.filter){c([]);return}S(i.request),Be(i.rawCategoriesBuckets,M);const{facets:p,items:w}=i.result;g(Fe(w));const d=i.request.filter;if(p){const a=d==null?void 0:d.some(y=>y.attribute==="categories"),C=p.find(y=>y.attribute==="categories");Pe(C==null?void 0:C.buckets,U),Ee(p,N);const _=p.map(y=>{const B=y.attribute==="categories"?Re(y.buckets,d,!!a,N,U):y.buckets,P=d==null?void 0:d.find(F=>F.attribute===y.attribute),R=B.map(F=>({...F,selected:_e(F,y,P)}));return{...y,buckets:R}});c(_)}},X=i=>{c(p=>{const w=p.map(a=>{const C=i.find(_=>_.attribute===a.attribute);return C||a}),d=w.reduce((a,C)=>{const _=Y(C);return _&&a.push(_),a},[]);return h(d),w})},b=(i,p)=>{const w=i.buckets.find(y=>y.title===p),a=i.attribute==="categories"&&w&&w.isChild===!1?w.path:null,C=i.buckets.map(y=>{if(y.title===p)return{...y,selected:!1};if(a){const B=y.path??y.title;if(B===a||typeof B=="string"&&B.startsWith(a+"/"))return{...y,selected:!1}}return y}),_={...i,buckets:C};X([_])},ee=()=>{const i=r.map(p=>{const w=p.buckets.map(d=>({...d,selected:!1}));return{...p,buckets:w}});c(i),h([])},D=(i,p)=>{const w=i.target.value,d=i.target.checked;c(a=>{const C=a.find(f=>f.attribute===p);if(!C)return a;const _=C.buckets.find(f=>f.title===w),B=p==="categories"&&_&&_.isChild===!1&&!d?_.path:null,P=C.buckets.map(f=>{var E;if(((E=C.buckets[0])==null?void 0:E.__typename)==="RangeBucket")return f.title===w?{...f,selected:d}:{...f,selected:!1};if(p==="categories")return f.title===w?{...f,selected:d}:{...f,selected:!1};if(f.title===w)return{...f,selected:d};if(B){const L=f.path??f.title;if(L===B||typeof L=="string"&&L.startsWith(B+"/"))return{...f,selected:!1}}return{...f}});let R=P;if(p==="categories"&&M.current.size>0){const f=d&&_&&_.isChild===!1,E=f?_.path??w:null;if(f&&E){const L=E.split("/").length,z=Array.from(M.current.values()).filter(m=>(m==null?void 0:m.path)&&m.path.startsWith(E+"/")&&m.path.split("/").length===L+1);if(z.length>0){const m=P.find(A=>A.path===E||A.title===E),ie=z.map(A=>({title:A.title,__typename:A.__typename??"CategoryView",name:A.name,count:A.count,path:A.path,isChild:!0,parentPath:E,selected:!1}));m&&(R=[m,...ie])}}else if(B){const L=new Set(P.filter(m=>m.selected).map(m=>m.path??m.title)),z=Array.from(M.current.values()).filter(m=>(m==null?void 0:m.path)&&typeof m.path=="string"&&m.path.length>0&&!m.path.includes("/"));z.length>0&&(R=z.map(m=>({title:m.title,__typename:m.__typename??"CategoryView",name:m.name,count:m.count,path:m.path,isChild:!1,selected:L.has(m.path)})))}}const F={...C,buckets:R},Z=a.map(f=>f.attribute===p?F:f),ae=Z.reduce((f,E)=>{const L=Y(E);return L&&f.push(L),f},[]);return h(ae),Z})},te=(i,p)=>{const w=u("span",{children:i.title}),d=i.buckets.map(a=>{var R;const C=G(a,i,l),_=a.isChild===!0,y=F=>F!=null&&Number(F)!==0,B=F=>$(T,{name:"FacetBucketLabel",slot:e==null?void 0:e.FacetBucketLabel,context:{data:a},children:[C," ",y(F)?`(${F})`:""]});let P=null;switch((R=i.buckets[0])==null?void 0:R.__typename){case"RangeBucket":P=u(T,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:a},children:u(le,{"data-testid":`${a.title}-radio`,label:B(),name:i.attribute,value:a.title,checked:a.selected,onChange:F=>{D(F,i.attribute)}})});break;case"CategoryView":if(!C)return null;P=u(T,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:a},children:$("button",{type:"button",className:`product-discovery-facet__category-link${a.selected?" product-discovery-facet__category-link--selected":""}`,"data-testid":`${a.title}-link`,onClick:()=>{D({target:{value:a.title,checked:!a.selected}},i.attribute)},children:[C," ",y(a.count)?`(${a.count})`:""]})});break;case"ScalarBucket":P=u(T,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:a},children:u(ce,{id:`${i.attribute}-${a.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,"data-testid":`${a.title}-checkbox`,label:B(a.count),name:`${i.attribute}-${a.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,value:a.title,checked:a.selected,onChange:F=>{D(F,i.attribute)}})});break;default:return null}return _&&P?u("div",{className:"product-discovery-facet__bucket--child",children:P}):P}).filter(a=>a!==null);return u(me,{header:w,buckets:d,last:p===r.length-1})},ne=()=>u(T,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:r},children:r.map((i,p)=>i.buckets.length>0?u(H,{children:u(T,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:i},children:te(i,p)})}):null)}),re=()=>{const i=r.reduce((d,a)=>(a.buckets.filter(_=>_.selected).length>0&&a.attribute!=="categories"&&d.push(a),d),[]),p=i.map(d=>d.buckets.map(a=>{if(a.selected){const C=G(a,d,l);return u(q,{"data-testid":`${a.title}-selected-btn`,"aria-label":`Remove ${d.title} filter: ${a.title}`,variant:"secondary",children:$(H,{children:[u("span",{children:C}),u(K,{source:he,size:"16"})]}),onClick:()=>{b(d,a.title)}})}return null})),w=p.length>0?u(q,{variant:"secondary",onClick:()=>{ee()},children:u("span",{children:n.clearAll})}):null;return $(T,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:i},children:[p,w]})};return I(()=>{const i=oe.on("search/result",Q,{eager:!0,scope:t});return()=>{i==null||i.off()}},[]),I(()=>{if(o!==null)return v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{s&&O({...s,filter:o,currentPage:1}),h(null)},150),()=>{v.current&&clearTimeout(v.current)}},[o,s]),u(fe,{selectedFacets:re(),facets:ne()})};export{ke as Facets,ke 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/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 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, 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 { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { Minus, Add } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/plp/components/Facet/Facet.css';\n\nexport interface FacetProps extends HTMLAttributes<HTMLDivElement> {\n numberOfOptionsConfig?: number;\n header: VNode;\n buckets: VNode[];\n last?: boolean;\n} \n\nexport const Facet: FunctionComponent<FacetProps> = ({ numberOfOptionsConfig = 5, header, buckets, last }) => {\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 className={classes(['product-discovery-facet', ['product-discovery-facet--last', last]])}>\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 } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/FacetList/FacetList.css';\n\nexport interface FacetListProps extends HTMLAttributes<HTMLDivElement> {\n selectedFacets: VNode;\n facets: VNode;\n}\n\nexport const FacetList: FunctionComponent<FacetListProps> = ({ selectedFacets, facets }) => {\n return (\n <>\n <VComponent className=\"product-discovery-facet-list__selected-filters\" node={selectedFacets} />\n <VComponent className=\"product-discovery-facet-list__facet-options\" node={facets} />\n </>\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 //Temp fix for Price range not handling value when minumum is zero\n if (bucket.from === 0) {\n return (\n <div style={'display:flex'}>\n <PriceRange amount={bucket.from} currency={currency || 'USD'} />\n <span style={'padding: 0 2px'}>{'-'}</span>\n <PriceRange amount={bucket.to} currency={currency || 'USD'} />\n </div>\n );\n }\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, useRef } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchFilter, SearchFacet, SearchVariables, FacetBucket, Scope } from '@/plp/data/models/api';\nimport { getBucketLabel, getCurrencyType, getFilterSelection } from './utils/facetUtils';\nimport FacetList from '@/plp/components/FacetList';\nimport { Button, Checkbox, 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';\nimport { search } from '@/plp/api';\n\nexport interface FacetsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n slots?: {\n Facet?: SlotProps<{ data: SearchFacet }>;\n SelectedFacets?: SlotProps<{ data: SearchFacet[] }>;\n Facets?: SlotProps<{ data: SearchFacet[] }>;\n FacetBucket?: SlotProps<{ data: FacetBucket }>;\n FacetBucketLabel?: SlotProps<{ data: FacetBucket }>;\n };\n}\n\nexport const Facets: Container<FacetsProps> = ({ scope, slots }) => {\n const labels = useText({\n clearAll: 'Search.Facet.clearAll',\n });\n\n const [facetList, setFacetList] = useState<SearchFacet[]>([]);\n const [currency, setCurrency] = useState<string | null>(null);\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>();\n const [pendingFilters, setPendingFilters] = useState<SearchFilter[] | null>(null);\n const searchTimeoutRef = useRef<number | null>(null);\n\n const handleSearchRequest = (searchVariables: SearchVariables): void => {\n // Attributes that appear in the facet list are driven by user selection; all others\n // (visibility, etc.) are carried through so they are not lost when the user changes facets.\n const facetAttributes = new Set(facetList.map((f) => f.attribute));\n const baseFilters = (currentSearchVariables?.filter || []).filter(\n (f) => !facetAttributes.has(f.attribute)\n );\n const mergedFilter = [...baseFilters, ...(searchVariables.filter || [])];\n\n search({\n ...searchVariables,\n filter: mergedFilter,\n }, { scope });\n };\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\n setCurrentSearchVariables(payload.request);\n\n const { facets, items } = payload.result;\n\n setCurrency(getCurrencyType(items));\n\n const filterList = payload.request.filter;\n\n if (facets) {\n const facetsWithSelections = facets.map((facet: SearchFacet) => {\n const selectedBuckets = facet.buckets.map((bucket) => {\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 return { ...bucket, selected: true };\n } else if (selectedFilter.in && selectedFilter.in.includes(bucket.title)) {\n return { ...bucket, selected: true };\n }\n }\n return { ...bucket, selected: false };\n });\n return { ...facet, buckets: selectedBuckets };\n });\n\n setFacetList(facetsWithSelections);\n }\n };\n\n const updateFacetSelections = (facets: SearchFacet[]): void => {\n // Use functional update to ensure we're working with latest state\n setFacetList(currentFacetList => {\n const updatedFacetList = currentFacetList.map((f) => {\n const newFacet = facets.find((facet) => facet.attribute === f.attribute);\n if (newFacet) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selectedFilterList from the updated facet list\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 \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const handleCancelSelection = (facet: SearchFacet, title: string): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (bucket.title === title) {\n return { ...bucket, selected: false };\n }\n return bucket;\n });\n const newFacet = { ...facet, 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 return { ...bucket, selected: false };\n });\n return { ...facet, buckets: updatedBuckets };\n });\n setFacetList(updatedFacetList);\n // Queue the search request with empty filters\n setPendingFilters([]);\n };\n\n const changeFilter = (event: any, facetAttribute: string): void => {\n const clickedValue = event.target.value;\n const isChecked = event.target.checked;\n \n // Use functional update to work with latest state\n setFacetList(currentFacetList => {\n const currentFacet = currentFacetList.find(f => f.attribute === facetAttribute);\n if (!currentFacet) {\n return currentFacetList;\n }\n \n const newBuckets = currentFacet.buckets.map((bucket) => {\n if (currentFacet.buckets[0]?.__typename === 'RangeBucket') {\n // For range buckets (radio buttons), only one can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n return { ...bucket, selected: false };\n }\n // For scalar buckets (checkboxes), multiple can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n // Keep other buckets as-is, but create new objects to maintain immutability\n return { ...bucket };\n });\n \n const newFacet = { ...currentFacet, buckets: newBuckets };\n \n // Update the facet list with the new facet\n const updatedFacetList = currentFacetList.map((f) => {\n if (f.attribute === facetAttribute) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selected filters - will trigger search via useEffect\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 \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const getFacetNode = (facet: SearchFacet, index: number): 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\n const renderedBucketLabel = (count?: number) => (\n <Slot name=\"FacetBucketLabel\"\n slot={slots?.FacetBucketLabel}\n context={{ data: bucket }}>\n {bucketLabel} {count ? `(${count})` : ''}\n </Slot>\n );\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n \n return (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <RadioButton\n data-testid={`${bucket.title}-radio`}\n label={renderedBucketLabel()}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n case 'ScalarBucket':\n case 'CategoryView':\n return (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <Checkbox\n id={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n data-testid={`${bucket.title}-checkbox`}\n label={renderedBucketLabel(bucket.count)}\n name={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n default:\n return null;\n }\n })\n .filter((bucket) => bucket !== null);\n\n return <Facet header={header} buckets={buckets} last={index === facetList.length - 1} />\n };\n\n const getFacetsNode = (): VNode => {\n return (\n <Slot name=\"Facets\" slot={slots?.Facets} context={{ data: facetList }}>\n {facetList.map((facet, index) => {\n return facet.buckets.length > 0\n ? ((\n <>\n <Slot name=\"Facet\" slot={slots?.Facet} context={{ data: facet }}>\n {getFacetNode(facet, index)}\n </Slot>\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 aria-label={`Remove ${facet.title} filter: ${bucket.title}`}\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>{labels.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 const dataEvents = events.on('search/result', handleSearchResult, { eager: true, scope });\n\n return () => {\n dataEvents?.off();\n };\n }, []);\n\n // Handle search triggering with debouncing for better UX\n useEffect(() => {\n if (pendingFilters === null) {\n return;\n }\n\n // Clear any existing timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce search requests to avoid too many API calls\n searchTimeoutRef.current = setTimeout(() => {\n if (currentSearchVariables) {\n // Reset to first page when filters change\n handleSearchRequest({ ...currentSearchVariables, filter: pendingFilters, currentPage: 1 });\n }\n setPendingFilters(null);\n }, 150);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [pendingFilters, currentSearchVariables]);\n\n return <FacetList selectedFacets={getSelectedFacetsNode()} facets={getFacetsNode()} />;\n};\n"],"names":["SvgAdd","props","React","SvgClose","SvgMinus","Facet","numberOfOptionsConfig","header","buckets","last","translations","useText","numberOfOptionsShown","showMore","setShowMore","useState","numberOfOptions","jsxs","classes","jsx","VComponent","bucket","index","Button","Icon","Add","Minus","FacetList","selectedFacets","facets","Fragment","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","scope","slots","labels","facetList","setFacetList","setCurrency","currentSearchVariables","setCurrentSearchVariables","pendingFilters","setPendingFilters","searchTimeoutRef","useRef","handleSearchRequest","searchVariables","facetAttributes","f","mergedFilter","search","handleSearchResult","payload","filterList","facetsWithSelections","selectedBuckets","selectedFilter","filter","updateFacetSelections","currentFacetList","updatedFacetList","newFacet","selectedFilterList","handleCancelSelection","title","newBuckets","clearAllSelections","updatedBuckets","changeFilter","event","facetAttribute","clickedValue","isChecked","currentFacet","getFacetNode","bucketLabel","renderedBucketLabel","count","Slot","RadioButton","Checkbox","getFacetsNode","getSelectedFacetsNode","selectedFilterBtns","bucketTitle","Close","clearAllBtn","useEffect","dataEvents","events"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"Facets.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Add.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/utils/categoryFacetUtils.ts","/@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 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, 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 { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { Minus, Add } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/plp/components/Facet/Facet.css';\n\nexport interface FacetProps extends HTMLAttributes<HTMLDivElement> {\n numberOfOptionsConfig?: number;\n header: VNode;\n buckets: VNode[];\n last?: boolean;\n} \n\nexport const Facet: FunctionComponent<FacetProps> = ({ numberOfOptionsConfig = 5, header, buckets, last }) => {\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 className={classes(['product-discovery-facet', ['product-discovery-facet--last', last]])}>\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 } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/FacetList/FacetList.css';\n\nexport interface FacetListProps extends HTMLAttributes<HTMLDivElement> {\n selectedFacets: VNode;\n facets: VNode;\n}\n\nexport const FacetList: FunctionComponent<FacetListProps> = ({ selectedFacets, facets }) => {\n return (\n <>\n <VComponent className=\"product-discovery-facet-list__selected-filters\" node={selectedFacets} />\n <VComponent className=\"product-discovery-facet-list__facet-options\" node={facets} />\n </>\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, SearchFilter } 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 // For categories: skip parent if it's only selected because a child is selected\n if (facet.attribute === 'categories' && (curr as any).isChild === false) {\n // This is a parent bucket - only include if no children are selected\n const parentPath = (curr as any).path;\n const hasSelectedChildren = facet.buckets.some((bucket: any) => \n bucket.selected && \n bucket.isChild === true && \n bucket.path?.startsWith(parentPath + '/')\n );\n \n // Skip parent if any children are selected (parent is just UI context)\n if (hasSelectedChildren) {\n return accu;\n }\n }\n \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 return undefined;\n }\n};\n\n/**\n * Returns whether a facet bucket is selected according to the given filter.\n * Handles range buckets, scalar/category in-list selection, and category parent selection when a child is selected.\n */\nconst isBucketSelected = (bucket: any, facet: SearchFacet, selectedFilter: SearchFilter | undefined): boolean => {\n if (!selectedFilter) return false;\n if (selectedFilter.range && bucket.from === selectedFilter.range.from && bucket.to === selectedFilter.range.to) {\n return true;\n }\n if (selectedFilter.in && selectedFilter.in.includes(bucket.title)) {\n return true;\n }\n if (facet.attribute === 'categories' && (bucket as any).isChild === false) {\n const parentPath = bucket.path;\n const anyChildSelected = selectedFilter.in?.some((filterValue: string) =>\n filterValue.startsWith(parentPath + '/')\n );\n if (anyChildSelected) return true;\n }\n return false;\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 //Temp fix for Price range not handling value when minumum is zero\n if (bucket.from === 0) {\n return (\n <div style={'display:flex'}>\n <PriceRange amount={bucket.from} currency={currency || 'USD'} />\n <span style={'padding: 0 2px'}>{'-'}</span>\n <PriceRange amount={bucket.to} currency={currency || 'USD'} />\n </div>\n );\n }\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 if (facet.attribute === 'categories') {\n return bucket.name ?? '';\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, isBucketSelected };\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, SearchFilter } from '@/plp/data/models/api';\n\ntype MapRef<T> = { current: T };\n\n/**\n * Merges raw category buckets into the ref. Once we have data for a path, never overwrite it with blank (preserve initial tree).\n */\nexport function mergeRawCategoriesBuckets(\n rawBuckets: any[] | undefined,\n ref: MapRef<Map<string, any>>\n): void {\n if (!rawBuckets?.length) return;\n rawBuckets.forEach((b: any) => {\n if (b?.path == null) return;\n const existing = ref.current.get(b.path);\n const newHasName = b.name != null && b.name !== '';\n if (existing?.name && !newHasName) return;\n ref.current.set(b.path, b);\n });\n}\n\n/**\n * Persists category buckets into the ref. Once we have data for a path, never overwrite with blank so initial tree data survives subsequent API calls.\n */\nexport function persistCategoryTree(\n buckets: any[] | undefined,\n ref: MapRef<Map<string, any>>\n): void {\n if (!buckets?.length) return;\n buckets.forEach((bucket: any) => {\n const path = bucket.path ?? bucket.title;\n if (path == null) return;\n const hasName = bucket.name != null && bucket.name !== '';\n const existing = ref.current.get(path);\n if (existing?.name && !hasName) return;\n ref.current.set(path, {\n title: bucket.title,\n __typename: bucket.__typename ?? 'CategoryView',\n name: bucket.name,\n count: bucket.count,\n path: bucket.path ?? bucket.title,\n isChild: !!(bucket as any).isChild,\n parentPath: (bucket as any).parentPath,\n });\n });\n}\n\n/**\n * Fills the ref with known children per parent from category facets (for sibling persistence).\n */\nexport function trackKnownChildrenForFacets(\n facets: SearchFacet[] | undefined,\n ref: MapRef<Map<string, Map<string, any>>>\n): void {\n if (!facets) return;\n facets.forEach((facet: SearchFacet) => {\n if (facet.attribute === 'categories') {\n facet.buckets.forEach((bucket: any) => {\n if (bucket.isChild && bucket.parentPath) {\n if (!ref.current.has(bucket.parentPath)) {\n ref.current.set(bucket.parentPath, new Map());\n }\n ref.current.get(bucket.parentPath)!.set(bucket.path, {\n title: bucket.title,\n __typename: bucket.__typename,\n name: bucket.name,\n displayName: bucket.displayName,\n count: bucket.count,\n path: bucket.path,\n isChild: bucket.isChild,\n parentPath: bucket.parentPath,\n });\n }\n });\n }\n });\n}\n\n/**\n * Merges known siblings into the bucket list when a child category is selected.\n * getKnownChildren(parentPath) should return the stored child buckets for that parent.\n */\nexport function mergeKnownSiblings(\n buckets: any[],\n selectedCategories: string[],\n getKnownChildren: (parentPath: string) => Map<string, any> | undefined\n): any[] {\n const selectedChild = selectedCategories.find(c => c.includes('/'));\n if (!selectedChild) return buckets;\n\n const parentPath = selectedChild.split('/')[0] ?? '';\n const knownChildren = parentPath ? getKnownChildren(parentPath) : undefined;\n if (!knownChildren || knownChildren.size === 0) return buckets;\n\n const existingPaths = new Set(buckets.map(b => b.path));\n const updatedBuckets: any[] = [];\n const additionalBuckets: any[] = [];\n\n buckets.forEach(bucket => {\n const storedBucket = knownChildren.get(bucket.path);\n if (storedBucket && bucket.isChild) {\n updatedBuckets.push({\n ...bucket,\n count: storedBucket.count,\n displayName: storedBucket.displayName,\n name: storedBucket.name,\n });\n } else {\n updatedBuckets.push(bucket);\n }\n });\n\n knownChildren.forEach((bucketData, childPath) => {\n if (!existingPaths.has(childPath)) {\n additionalBuckets.push(bucketData);\n }\n });\n\n return [...updatedBuckets, ...additionalBuckets];\n}\n\n/**\n * Restores bucket names and inserts missing buckets from a cached tree for the given paths.\n * getCached(path) should return the cached bucket data for that path.\n */\nexport function restoreFromTree(\n buckets: any[],\n pathsToRestore: string[],\n getCached: (path: string) => any | undefined\n): any[] {\n let result = buckets;\n for (const path of pathsToRestore) {\n const cached = getCached(path);\n const existing = result.find((b: any) => (b.path ?? b.title) === path);\n if (!cached) continue;\n if (!existing) {\n const isTopLevel = !path.includes('/');\n const newBucket = {\n ...cached,\n isChild: !isTopLevel,\n parentPath: isTopLevel ? undefined : path.split('/').slice(0, -1).join('/'),\n selected: false,\n };\n if (isTopLevel) {\n result = [newBucket, ...result];\n } else {\n const pPath = path.split('/').slice(0, -1).join('/');\n const idx = result.findIndex((b: any) => (b.path ?? b.title) === pPath);\n const insertAt = idx >= 0 ? idx + 1 : 0;\n result = [...result.slice(0, insertAt), newBucket, ...result.slice(insertAt)];\n }\n } else if (!existing.name && cached.name) {\n result = result.map((b: any) =>\n (b.path ?? b.title) === path ? { ...b, name: cached.name, count: b.count ?? cached.count } : b\n );\n }\n }\n return result;\n}\n\n/**\n * Outdents children whose parent is not present (treats them as top-level).\n * isPathPresent(path) and isPathInTree(path) determine whether a path exists in current buckets or in the persisted tree.\n */\nexport function outdentChildrenWithoutParent(\n buckets: any[],\n isPathPresent: (path: string) => boolean,\n isPathInTree: (path: string) => boolean\n): any[] {\n return buckets.map((bucket: any) => {\n const pPath = bucket.parentPath;\n if (bucket.isChild && pPath != null && !isPathPresent(pPath) && !isPathInTree(pPath)) {\n return { ...bucket, isChild: false, parentPath: undefined };\n }\n return bucket;\n });\n}\n\n/**\n * Processes category facet buckets: merges known siblings, restores from tree, then outdents children without parent.\n * Uses the given refs for known children and original category tree.\n */\nexport function processCategoryBuckets(\n buckets: any[],\n filterList: SearchFilter[] | undefined,\n hasCategoryFilter: boolean,\n knownChildrenRef: MapRef<Map<string, Map<string, any>>>,\n originalCategoryTreeRef: MapRef<Map<string, any>>\n): any[] {\n const categoriesFilter = filterList?.find(f => f.attribute === 'categories');\n const selectedCategories = categoriesFilter?.in || [];\n\n let bucketsToProcess = mergeKnownSiblings(buckets, selectedCategories, (parentPath) =>\n knownChildrenRef.current.get(parentPath)\n );\n\n if (hasCategoryFilter && originalCategoryTreeRef.current.size > 0) {\n const selectedIn = categoriesFilter?.in ?? [];\n const selectedPath = selectedIn[0];\n if (selectedPath && typeof selectedPath === 'string') {\n const parentPath = selectedPath.includes('/') ? selectedPath.split('/')[0] : null;\n const pathFirst = parentPath ?? selectedPath;\n const pathSecond = parentPath && selectedPath !== parentPath ? selectedPath : null;\n const pathsToRestore = [pathFirst, pathSecond].filter((p): p is string => typeof p === 'string');\n bucketsToProcess = restoreFromTree(\n bucketsToProcess,\n pathsToRestore,\n (path) => originalCategoryTreeRef.current.get(path)\n );\n }\n }\n\n const pathsPresent = new Set(bucketsToProcess.map((b: any) => (b.path ?? b.title) as string));\n bucketsToProcess = outdentChildrenWithoutParent(\n bucketsToProcess,\n (path) => pathsPresent.has(path),\n (path) => originalCategoryTreeRef.current.has(path)\n );\n\n return bucketsToProcess;\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, useEffect, useState, useRef } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchFilter, SearchFacet, SearchVariables, FacetBucket, Scope } from '@/plp/data/models/api';\nimport { getBucketLabel, getCurrencyType, getFilterSelection, isBucketSelected } from './utils/facetUtils';\nimport {\n mergeRawCategoriesBuckets,\n persistCategoryTree,\n processCategoryBuckets,\n trackKnownChildrenForFacets,\n} from './utils/categoryFacetUtils';\nimport FacetList from '@/plp/components/FacetList';\nimport { Button, Checkbox, 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';\nimport { search } from '@/plp/api';\n\nexport interface FacetsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n slots?: {\n Facet?: SlotProps<{ data: SearchFacet }>;\n SelectedFacets?: SlotProps<{ data: SearchFacet[] }>;\n Facets?: SlotProps<{ data: SearchFacet[] }>;\n FacetBucket?: SlotProps<{ data: FacetBucket }>;\n FacetBucketLabel?: SlotProps<{ data: FacetBucket }>;\n };\n}\n\nexport const Facets: Container<FacetsProps> = ({ scope, slots }) => {\n const labels = useText({\n clearAll: 'Search.Facet.clearAll',\n });\n\n const [facetList, setFacetList] = useState<SearchFacet[]>([]);\n const [currency, setCurrency] = useState<string | null>(null);\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>();\n const [pendingFilters, setPendingFilters] = useState<SearchFilter[] | null>(null);\n const searchTimeoutRef = useRef<number | null>(null);\n // Track known children for each parent to maintain sibling visibility\n // Store full bucket data (not just paths) to preserve display names and counts\n const knownChildrenRef = useRef<Map<string, Map<string, any>>>(new Map());\n // Raw categories buckets from API (before transform) for optimistic child rendering on parent select\n const rawCategoriesBucketsRef = useRef<Map<string, any>>(new Map());\n // Initial category tree: once established, we never remove or overwrite with blank data so names persist across API calls\n const originalCategoryTreeRef = useRef<Map<string, any>>(new Map());\n\n const handleSearchRequest = (searchVariables: SearchVariables): void => {\n // Attributes that appear in the facet list are driven by user selection; all others\n // (visibility, etc.) are carried through so they are not lost when the user changes facets.\n const facetAttributes = new Set(facetList.map((f) => f.attribute));\n const baseFilters = (currentSearchVariables?.filter || []).filter(\n (f) => !facetAttributes.has(f.attribute)\n );\n const mergedFilter = [...baseFilters, ...(searchVariables.filter || [])];\n\n search({\n ...searchVariables,\n filter: mergedFilter,\n }, { scope });\n };\n\n const handleSearchResult = (payload: { result: ProductSearchResult; request: SearchVariables; rawCategoriesBuckets?: any[] }): void => {\n if (!payload || (!payload.result.facets && !payload.result.items && !payload.request.filter)) {\n setFacetList([]);\n return;\n }\n\n setCurrentSearchVariables(payload.request);\n mergeRawCategoriesBuckets(payload.rawCategoriesBuckets, rawCategoriesBucketsRef);\n\n const { facets, items } = payload.result;\n setCurrency(getCurrencyType(items));\n const filterList = payload.request.filter;\n\n if (facets) {\n const hasCategoryFilter = filterList?.some((f: SearchFilter) => f.attribute === 'categories');\n const categoriesFacet = facets.find((f: SearchFacet) => f.attribute === 'categories');\n persistCategoryTree(categoriesFacet?.buckets, originalCategoryTreeRef);\n trackKnownChildrenForFacets(facets, knownChildrenRef);\n\n const facetsWithSelections = facets.map((facet: SearchFacet) => {\n const bucketsToProcess =\n facet.attribute === 'categories'\n ? processCategoryBuckets(facet.buckets, filterList, !!hasCategoryFilter, knownChildrenRef, originalCategoryTreeRef)\n : facet.buckets;\n\n const selectedFilter = filterList?.find((filter) => filter.attribute === facet.attribute);\n const selectedBuckets = bucketsToProcess.map((bucket) => ({\n ...bucket,\n selected: isBucketSelected(bucket, facet, selectedFilter),\n }));\n return { ...facet, buckets: selectedBuckets };\n });\n\n setFacetList(facetsWithSelections);\n }\n };\n\n const updateFacetSelections = (facets: SearchFacet[]): void => {\n // Use functional update to ensure we're working with latest state\n setFacetList(currentFacetList => {\n const updatedFacetList = currentFacetList.map((f) => {\n const newFacet = facets.find((facet) => facet.attribute === f.attribute);\n if (newFacet) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selectedFilterList from the updated facet list\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 \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const handleCancelSelection = (facet: SearchFacet, title: string): void => {\n const clearedBucket = facet.buckets.find(b => b.title === title);\n const isParentCategory =\n facet.attribute === 'categories' &&\n clearedBucket &&\n (clearedBucket as any).isChild === false;\n const parentPathToClear = isParentCategory ? (clearedBucket as any).path : null;\n\n const newBuckets = facet.buckets.map((bucket) => {\n if (bucket.title === title) {\n return { ...bucket, selected: false };\n }\n // When clearing a parent chip, unselect it and all descendants (any depth)\n if (parentPathToClear) {\n const bucketPath = (bucket as any).path ?? bucket.title;\n if (bucketPath === parentPathToClear || (typeof bucketPath === 'string' && bucketPath.startsWith(parentPathToClear + '/'))) {\n return { ...bucket, selected: false };\n }\n }\n return bucket;\n });\n const newFacet = { ...facet, 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 return { ...bucket, selected: false };\n });\n return { ...facet, buckets: updatedBuckets };\n });\n setFacetList(updatedFacetList);\n // Queue the search request with empty filters\n setPendingFilters([]);\n };\n\n const changeFilter = (event: any, facetAttribute: string): void => {\n const clickedValue = event.target.value;\n const isChecked = event.target.checked;\n \n // Use functional update to work with latest state\n setFacetList(currentFacetList => {\n const currentFacet = currentFacetList.find(f => f.attribute === facetAttribute);\n if (!currentFacet) {\n return currentFacetList;\n }\n \n const clickedBucket = currentFacet.buckets.find(b => b.title === clickedValue);\n const isUnselectingParent =\n facetAttribute === 'categories' &&\n clickedBucket &&\n (clickedBucket as any).isChild === false &&\n !isChecked;\n const parentPathToClear = isUnselectingParent ? (clickedBucket as any).path : null;\n\n const newBuckets = currentFacet.buckets.map((bucket) => {\n if (currentFacet.buckets[0]?.__typename === 'RangeBucket') {\n // For range buckets (radio buttons), only one can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n return { ...bucket, selected: false };\n }\n // For categories: single-select only (one category at a time, no checkboxes)\n if (facetAttribute === 'categories') {\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n return { ...bucket, selected: false };\n }\n // For scalar buckets (checkboxes), multiple can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n // When unselecting a parent category, unselect it and all descendants (any depth)\n if (parentPathToClear) {\n const bucketPath = (bucket as any).path ?? bucket.title;\n if (bucketPath === parentPathToClear || (typeof bucketPath === 'string' && bucketPath.startsWith(parentPathToClear + '/'))) {\n return { ...bucket, selected: false };\n }\n }\n return { ...bucket };\n });\n\n // Optimistic expansion/collapse for categories using raw cache\n let bucketsToUse = newBuckets;\n if (facetAttribute === 'categories' && rawCategoriesBucketsRef.current.size > 0) {\n const isSelectingParent =\n isChecked &&\n clickedBucket &&\n (clickedBucket as any).isChild === false;\n const parentPath = isSelectingParent ? ((clickedBucket as any).path ?? clickedValue) as string : null;\n\n if (isSelectingParent && parentPath) {\n // Optimistic expansion: show children immediately when selecting a parent\n const parentDepth = parentPath.split('/').length;\n const directChildren = Array.from(rawCategoriesBucketsRef.current.values()).filter(\n (b: any) =>\n b?.path &&\n b.path.startsWith(parentPath + '/') &&\n b.path.split('/').length === parentDepth + 1\n );\n if (directChildren.length > 0) {\n const parentBucket = newBuckets.find((b) => (b as any).path === parentPath || b.title === parentPath);\n const childBuckets = directChildren.map((b: any) => ({\n title: b.title,\n __typename: b.__typename ?? 'CategoryView',\n name: b.name,\n count: b.count,\n path: b.path,\n isChild: true,\n parentPath,\n selected: false,\n }));\n if (parentBucket) {\n bucketsToUse = [parentBucket, ...childBuckets];\n }\n }\n } else if (parentPathToClear) {\n // Optimistic collapse: show only top-level categories when deselecting a parent\n const stillSelectedPaths = new Set(\n newBuckets.filter((b) => b.selected).map((b) => (b as any).path ?? b.title)\n );\n const topLevelRaw = Array.from(rawCategoriesBucketsRef.current.values()).filter(\n (b: any) => b?.path && typeof b.path === 'string' && b.path.length > 0 && !b.path.includes('/')\n );\n if (topLevelRaw.length > 0) {\n bucketsToUse = topLevelRaw.map((b: any) => ({\n title: b.title,\n __typename: b.__typename ?? 'CategoryView',\n name: b.name,\n count: b.count,\n path: b.path,\n isChild: false,\n selected: stillSelectedPaths.has(b.path),\n }));\n }\n }\n }\n\n const newFacet = { ...currentFacet, buckets: bucketsToUse };\n \n // Update the facet list with the new facet\n const updatedFacetList = currentFacetList.map((f) => {\n if (f.attribute === facetAttribute) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selected filters - will trigger search via useEffect\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 \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const getFacetNode = (facet: SearchFacet, index: number): 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 const isChild = (bucket as any).isChild === true;\n\n const showCount = (c: number | string | undefined | null): boolean =>\n c != null && Number(c) !== 0;\n const renderedBucketLabel = (count?: number) => (\n <Slot name=\"FacetBucketLabel\"\n slot={slots?.FacetBucketLabel}\n context={{ data: bucket }}>\n {bucketLabel} {showCount(count) ? `(${count})` : ''}\n </Slot>\n );\n \n let bucketElement: VNode | null = null;\n \n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n bucketElement = (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <RadioButton\n data-testid={`${bucket.title}-radio`}\n label={renderedBucketLabel()}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n break;\n case 'CategoryView':\n // Categories: render as links (no checkboxes, no remove chips)\n if (!bucketLabel) {\n return null;\n }\n bucketElement = (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <button\n type=\"button\"\n className={`product-discovery-facet__category-link${bucket.selected ? ' product-discovery-facet__category-link--selected' : ''}`}\n data-testid={`${bucket.title}-link`}\n onClick={(): void => {\n changeFilter({ target: { value: bucket.title, checked: !bucket.selected } }, facet.attribute);\n }}\n >\n {bucketLabel} {showCount(bucket.count) ? `(${bucket.count})` : ''}\n </button>\n </Slot>\n ) as VNode;\n break;\n case 'ScalarBucket':\n bucketElement = (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <Checkbox\n id={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n data-testid={`${bucket.title}-checkbox`}\n label={renderedBucketLabel(bucket.count)}\n name={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n break;\n default:\n return null;\n }\n \n // Wrap child buckets in a div with indentation class\n if (isChild && bucketElement) {\n return (\n <div className=\"product-discovery-facet__bucket--child\">\n {bucketElement}\n </div>\n ) as VNode;\n }\n \n return bucketElement;\n })\n .filter((bucket) => bucket !== null);\n\n return <Facet header={header} buckets={buckets} last={index === facetList.length - 1} />\n };\n\n const getFacetsNode = (): VNode => {\n return (\n <Slot name=\"Facets\" slot={slots?.Facets} context={{ data: facetList }}>\n {facetList.map((facet, index) => {\n return facet.buckets.length > 0\n ? ((\n <>\n <Slot name=\"Facet\" slot={slots?.Facet} context={{ data: facet }}>\n {getFacetNode(facet, index)}\n </Slot>\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 // Exclude categories from chips (categories use links only, no remove button)\n if (selected.length > 0 && curr.attribute !== 'categories') {\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 aria-label={`Remove ${facet.title} filter: ${bucket.title}`}\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>{labels.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 const dataEvents = events.on('search/result', handleSearchResult, { eager: true, scope });\n\n return () => {\n dataEvents?.off();\n };\n }, []);\n\n // Handle search triggering with debouncing for better UX\n useEffect(() => {\n if (pendingFilters === null) {\n return;\n }\n\n // Clear any existing timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce search requests to avoid too many API calls\n searchTimeoutRef.current = setTimeout(() => {\n if (currentSearchVariables) {\n // Reset to first page when filters change\n handleSearchRequest({ ...currentSearchVariables, filter: pendingFilters, currentPage: 1 });\n }\n setPendingFilters(null);\n }, 150);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [pendingFilters, currentSearchVariables]);\n\n return <FacetList selectedFacets={getSelectedFacetsNode()} facets={getFacetsNode()} />;\n};\n"],"names":["SvgAdd","props","React","SvgClose","SvgMinus","Facet","numberOfOptionsConfig","header","buckets","last","translations","useText","numberOfOptionsShown","showMore","setShowMore","useState","numberOfOptions","jsxs","classes","jsx","VComponent","bucket","index","Button","Icon","Add","Minus","FacetList","selectedFacets","facets","Fragment","BOOLEAN_NO","BOOLEAN_YES","getRangeFacetFilter","facet","selectedRange","getScalarFacetFilter","scalarSelections","accu","curr","parentPath","_a","getFilterSelection","isBucketSelected","selectedFilter","filterValue","getCurrencyType","items","firstItem","_c","_b","_g","_f","_e","_d","_k","_j","_i","_h","getRangeBucketLabel","currency","PriceRange","getScalarBucketLabel","getBucketLabel","mergeRawCategoriesBuckets","rawBuckets","ref","b","existing","newHasName","persistCategoryTree","path","hasName","trackKnownChildrenForFacets","mergeKnownSiblings","selectedCategories","getKnownChildren","selectedChild","c","knownChildren","existingPaths","updatedBuckets","additionalBuckets","storedBucket","bucketData","childPath","restoreFromTree","pathsToRestore","getCached","result","cached","isTopLevel","newBucket","pPath","idx","insertAt","outdentChildrenWithoutParent","isPathPresent","isPathInTree","processCategoryBuckets","filterList","hasCategoryFilter","knownChildrenRef","originalCategoryTreeRef","categoriesFilter","f","bucketsToProcess","selectedPath","p","pathsPresent","Facets","scope","slots","labels","facetList","setFacetList","setCurrency","currentSearchVariables","setCurrentSearchVariables","pendingFilters","setPendingFilters","searchTimeoutRef","useRef","rawCategoriesBucketsRef","handleSearchRequest","searchVariables","facetAttributes","mergedFilter","search","handleSearchResult","payload","categoriesFacet","facetsWithSelections","filter","selectedBuckets","updateFacetSelections","currentFacetList","updatedFacetList","newFacet","selectedFilterList","handleCancelSelection","title","clearedBucket","parentPathToClear","newBuckets","bucketPath","clearAllSelections","changeFilter","event","facetAttribute","clickedValue","isChecked","currentFacet","clickedBucket","bucketsToUse","isSelectingParent","parentDepth","directChildren","parentBucket","childBuckets","stillSelectedPaths","topLevelRaw","getFacetNode","bucketLabel","isChild","showCount","renderedBucketLabel","count","Slot","bucketElement","RadioButton","Checkbox","getFacetsNode","getSelectedFacetsNode","selectedFilterBtns","bucketTitle","Close","clearAllBtn","useEffect","dataEvents","events"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-product-discovery", "version": "3.1.
|
|
1
|
+
{"name": "@dropins/storefront-product-discovery", "version": "3.1.1-alpha1", "@dropins/tools": "^1.6.0", "license": "SEE LICENSE IN LICENSE.md"}
|
package/render.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
(function(
|
|
3
|
+
(function(c,r){try{if(typeof document<"u"){const e=document.createElement("style"),i=r.styleId;for(const t in r.attributes)e.setAttribute(t,r.attributes[t]);e.setAttribute("data-dropin",i),e.appendChild(document.createTextNode(c));const o=document.querySelector('style[data-dropin="sdk"]');if(o)o.after(e);else{const t=document.querySelector('link[rel="stylesheet"], style');t?t.before(e):document.head.append(e)}}}catch(e){console.error("dropin-styles (injectCodeFunction)",e)}})(".product-discovery-product-list{container-type:inline-size;display:flex;flex-direction:column;width:100%}.product-discovery-product-list__container{display:flex;flex-direction:column;width:100%}.product-discovery-product-list__grid{display:grid;grid-template-columns:1fr;gap:var(--spacing-small)}.product-discovery-product-list__grid .dropin-product-item-card{margin:unset;width:100%}.product-discovery-product-list__grid .dropin-product-item-card img,.product-discovery-product-list__grid .dropin-product-item-card__skeleton__image{aspect-ratio:var(--imageWidth) / var(--imageHeight);max-height:unset;height:unset}.product-discovery-product-list .product-price{display:flex;gap:8px}.product-discovery-product-list .special-price-crossed{text-decoration:line-through;opacity:.5}@container (min-width: 600px){.product-discovery-product-list__grid{grid-template-columns:repeat(2,1fr)}}@container (min-width: 900px){.product-discovery-product-list__grid{grid-template-columns:repeat(3,1fr)}}@container (min-width: 1200px){.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{padding-block:var(--spacing-small)}.product-discovery-facet:not(.product-discovery-facet--last){border-bottom:1px solid var(--color-neutral-400)}.product-discovery-facet__header{display:block;margin-block-end:var(--spacing-xsmall)}.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__bucket--child{padding-left:var(--spacing-medium)}.product-discovery-facet__bucket--child .dropin-checkbox__label{font-size:var(--type-body-2-default-size);color:var(--color-neutral-700)}.product-discovery-facet__category-link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0;font:inherit;color:var(--color-primary-700);text-decoration:underline;cursor:pointer;text-align:left}.product-discovery-facet__category-link:hover{color:var(--color-primary-800)}.product-discovery-facet__category-link--selected{font-weight:var(--type-body-2-default-weight-bold);color:var(--color-neutral-900)}.product-discovery-facet__bucket--child .product-discovery-facet__category-link{font-size:var(--type-body-2-default-size);color:var(--color-neutral-700)}.product-discovery-facet__bucket--child .product-discovery-facet__category-link--selected{color:var(--color-neutral-900)}.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 .dropin-divider{margin:var(--spacing-xsmall) 0 var(--spacing-xsmall) 0}",{styleId:"storefront-product-discovery"});
|
|
4
4
|
import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{deepmerge as f,Render as l}from"@dropins/tools/lib.js";import{useState as g,useEffect as h}from"@dropins/tools/preact-hooks.js";import{UIProvider as m}from"@dropins/tools/components.js";import{events as u}from"@dropins/tools/event-bus.js";import{c as w}from"./chunks/initialize.js";const d={PLP:{noResults:"Your search returned no results.",searchError:"An error occurred while searching."},Facet:{showMore:"Show more",showLess:"Show less",clearAll:"Clear all"},SortBy:{title:"Sort by",lowToHigh:"Low to High",highToLow:"High to Low"}},S={Search:d},p={default:S},L=({children:n})=>{var e;const[t,s]=g("en_US"),i=(e=w.getConfig())==null?void 0:e.langDefinitions;h(()=>{const o=u.on("locale",a=>{s(a)},{eager:!0});return()=>{o==null||o.off()}},[]);const c=f(p,i??{});return r(m,{lang:t,langDefinitions:c,children:n})},y=new l(r(L,{}));export{y as render};
|
|
5
5
|
//# sourceMappingURL=render.js.map
|