@dropins/storefront-product-discovery 3.0.0-alpha13 → 3.0.0-alpha14
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/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 a,Fragment as N}from"@dropins/tools/preact-jsx-runtime.js";import*as F from"@dropins/tools/preact-compat.js";import{useState as C,useRef as J,useEffect as T}from"@dropins/tools/preact-compat.js";import{classes as K,VComponent as $,Slot as k}from"@dropins/tools/lib.js";import{Button as A,Icon as M,PriceRange as b,Checkbox as Q,RadioButton as X}from"@dropins/tools/components.js";/* empty css */import{useText as q}from"@dropins/tools/i18n.js";import{events as I}from"@dropins/tools/event-bus.js";import{d as ee}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const te=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"})))),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",{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"})),ne=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
|
|
3
|
+
import{jsxs as x,jsx as a,Fragment as N}from"@dropins/tools/preact-jsx-runtime.js";import*as F from"@dropins/tools/preact-compat.js";import{useState as C,useRef as J,useEffect as T}from"@dropins/tools/preact-compat.js";import{classes as K,VComponent as $,Slot as k}from"@dropins/tools/lib.js";import{Button as A,Icon as M,PriceRange as b,Checkbox as Q,RadioButton as X}from"@dropins/tools/components.js";/* empty css */import{useText as q}from"@dropins/tools/i18n.js";import{events as I}from"@dropins/tools/event-bus.js";import{d as ee}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const te=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"})))),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",{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"})),ne=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"})),ce=({numberOfOptionsConfig:n=5,header:e,buckets:s,last:m})=>{const p=q({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),w=n,[S,g]=C(s.length<w),_=S?s.length:w;return x("div",{className:K(["product-discovery-facet",["product-discovery-facet--last",m]]),children:[a($,{className:"product-discovery-facet__header",node:e}),s.slice(0,_).map((B,v)=>a($,{className:"product-discovery-facet__bucket",node:B},v)),!S&&s.length>w&&a(A,{variant:"tertiary",icon:a(M,{source:te,size:"24"}),onClick:()=>g(!S),children:p.showMore}),S&&s.length>w&&a(A,{variant:"tertiary",icon:a(M,{source:ne,size:"24"}),onClick:()=>g(!S),children:p.showLess})]})},ae=({selectedFacets:n,facets:e})=>x(N,{children:[a($,{className:"product-discovery-facet-list__selected-filters",node:n}),a($,{className:"product-discovery-facet-list__facet-options",node:e})]}),ie="no",se="yes",le=n=>{const e=n.buckets.find(s=>s.selected);return e?{attribute:n.attribute,range:{from:e.from,to:e.to}}:null},oe=n=>{const e=n.buckets.reduce((s,m)=>(m.selected&&s.push(m.title),s),[]);return e.length===0?null:{attribute:n.attribute,in:e}},U=n=>{var e;switch((e=n.buckets[0])==null?void 0:e.__typename){case"RangeBucket":return le(n);case"ScalarBucket":case"CategoryView":return oe(n)}},ue=n=>{var s,m,p,w,S,g,_,B,v,y,E;const e=n[0];return(p=(m=(s=e==null?void 0:e.price)==null?void 0:s.regular)==null?void 0:m.amount)!=null&&p.currency?e.price.regular.amount.currency:(_=(g=(S=(w=e==null?void 0:e.priceRange)==null?void 0:w.minimum)==null?void 0:S.regular)==null?void 0:g.amount)!=null&&_.currency?(E=(y=(v=(B=e==null?void 0:e.priceRange)==null?void 0:B.minimum)==null?void 0:v.regular)==null?void 0:y.amount)==null?void 0:E.currency:"USD"},de=(n,e,s)=>(e==null?void 0:e.attribute)==="price"?n.from===0?x("div",{style:"display:flex",children:[a(b,{amount:n.from,currency:s||"USD"}),a("span",{style:"padding: 0 2px",children:"-"}),a(b,{amount:n.to,currency:s||"USD"})]}):a(b,{minimumAmount:n.from,maximumAmount:n.to,currency:s||"USD",display:"dash"}):n.title,me=(n,e)=>n.title===ie?`Not ${e.title}`:n.title===se?e.title:n.title,j=(n,e,s)=>{switch(n.__typename){case"RangeBucket":return de(n,e,s);case"ScalarBucket":case"CategoryView":return me(n,e)}},ke=({scope:n,slots:e})=>{const s=q({clearAll:"Search.Facet.clearAll"}),[m,p]=C([]),[w,S]=C(null),[g,_]=C(),[B,v]=C(null),y=J(null),E=t=>{var l;const i=((l=g==null?void 0:g.filter)==null?void 0:l.filter(c=>c.attribute==="categoryPath"))||[];ee({...t,filter:[...i,...t.filter||[]]},{scope:n})},z=t=>{const i=new URLSearchParams(window.location.search);if(!t.length)i.delete("filter");else{const l=t.map(c=>{var r;return c.range?`${c.attribute}:${c.range.from}-${c.range.to}`:(r=c.in)!=null&&r.length?`${c.attribute}:${c.in.join(",")}`:null}).filter(Boolean).join(";");i.set("filter",l)}i.set("page","1"),window.history.replaceState({},"",`${window.location.pathname}?${i.toString()}`)},D=t=>{if(!t||!t.result.facets&&!t.result.items&&!t.request.filter){p([]);return}_(t.request);const{facets:i,items:l}=t.result;S(ue(l));const c=t.request.filter;if(i){const r=i.map(o=>{const h=o.buckets.map(f=>{const u=c==null?void 0:c.find(L=>L.attribute===o.attribute);if(u){const L=u.range;if(L&&f.from===L.from&&f.to===L.to)return{...f,selected:!0};if(u.in&&u.in.includes(f.title))return{...f,selected:!0}}return{...f,selected:!1}});return{...o,buckets:h}});p(r)}},V=t=>{p(i=>{const l=i.map(r=>{const o=t.find(h=>h.attribute===r.attribute);return o||r}),c=l.reduce((r,o)=>{const h=U(o);return h&&r.push(h),r},[]);return v(c),l})},W=(t,i)=>{const l=t.buckets.map(r=>r.title===i?{...r,selected:!1}:r),c={...t,buckets:l};V([c])},Z=()=>{const t=m.map(i=>{const l=i.buckets.map(c=>({...c,selected:!1}));return{...i,buckets:l}});p(t),v([])},O=(t,i)=>{const l=t.target.value,c=t.target.checked;p(r=>{const o=r.find(d=>d.attribute===i);if(!o)return r;const h=o.buckets.map(d=>{var R;return((R=o.buckets[0])==null?void 0:R.__typename)==="RangeBucket"?d.title===l?{...d,selected:c}:{...d,selected:!1}:d.title===l?{...d,selected:c}:{...d}}),f={...o,buckets:h},u=r.map(d=>d.attribute===i?f:d),L=u.reduce((d,R)=>{const P=U(R);return P&&d.push(P),d},[]);return v(L),u})},H=(t,i)=>{const l=a("span",{children:t.title}),c=t.buckets.map(r=>{var f;const o=j(r,t,w),h=u=>x(k,{name:"FacetBucketLabel",slot:e==null?void 0:e.FacetBucketLabel,context:{data:r},children:[o," ",u?`(${u})`:""]});switch((f=t.buckets[0])==null?void 0:f.__typename){case"RangeBucket":return a(k,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:r},children:a(X,{"data-testid":`${r.title}-radio`,label:h(),name:t.attribute,value:r.title,checked:r.selected,onChange:u=>{O(u,t.attribute)}})});case"ScalarBucket":case"CategoryView":return a(k,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:r},children:a(Q,{id:`${t.attribute}-${r.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,"data-testid":`${r.title}-checkbox`,label:h(r.count),name:`${t.attribute}-${r.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,value:r.title,checked:r.selected,onChange:u=>{O(u,t.attribute)}})});default:return null}}).filter(r=>r!==null);return a(ce,{header:l,buckets:c,last:i===m.length-1})},Y=()=>a(k,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:m},children:m.map((t,i)=>t.buckets.length>0?a(N,{children:a(k,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:t},children:H(t,i)})}):null)}),G=()=>{const t=m.reduce((c,r)=>(r.buckets.filter(h=>h.selected).length>0&&c.push(r),c),[]),i=t.map(c=>c.buckets.map(r=>{if(r.selected){const o=j(r,c,w);return a(A,{"data-testid":`${r.title}-selected-btn`,"aria-label":`Remove ${c.title} filter: ${r.title}`,variant:"secondary",children:x(N,{children:[a("span",{children:o}),a(M,{source:re,size:"16"})]}),onClick:()=>{W(c,r.title)}})}return null})),l=i.length>0?a(A,{variant:"secondary",onClick:()=>{Z()},children:a("span",{children:s.clearAll})}):null;return x(k,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:t},children:[i,l]})};return T(()=>{const t=I.on("search/result",D,{eager:!0,scope:n});return()=>{t==null||t.off()}},[]),T(()=>{if(B!==null)return y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{g&&(z(B),E({...g,filter:B})),v(null)},150),()=>{y.current&&clearTimeout(y.current)}},[B,g]),a(ae,{selectedFacets:G(),facets:Y()})};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.5, strokeLinecap: \"square\", strokeLinejoin: \"round\", vectorEffect: \"non-scaling-stroke\", fill: \"none\", stroke: \"currentColor\" }));\nexport default SvgMinus;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { 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 // Preserve any existing categoryPath filters from currentSearchVariables\n const existingCategoryPathFilters = currentSearchVariables?.filter?.filter(\n (filter) => filter.attribute === 'categoryPath'\n ) || [];\n\n search({\n ...searchVariables,\n filter: [...existingCategoryPathFilters, ...(searchVariables.filter || [])]\n }, { scope });\n };\n\n const updateUrlFromFilters = (filters: SearchFilter[]) => {\n const params = new URLSearchParams(window.location.search);\n \n if (!filters.length) {\n params.delete('filter');\n } else {\n const filterParam = filters\n .map((filter) => {\n if (filter.range) {\n return `${filter.attribute}:${filter.range.from}-${filter.range.to}`;\n }\n \n if (filter.in?.length) {\n return `${filter.attribute}:${filter.in.join(',')}`;\n }\n \n return null;\n })\n .filter(Boolean)\n .join(';');\n \n params.set('filter', filterParam);\n }\n params.set('page', '1');\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}?${params.toString()}`\n );\n };\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 updateUrlFromFilters(pendingFilters);\n handleSearchRequest({ ...currentSearchVariables, filter: pendingFilters });\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","existingCategoryPathFilters","filter","search","updateUrlFromFilters","filters","params","filterParam","handleSearchResult","payload","filterList","facetsWithSelections","selectedBuckets","selectedFilter","updateFacetSelections","currentFacetList","updatedFacetList","f","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/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 // Preserve any existing categoryPath filters from currentSearchVariables\n const existingCategoryPathFilters = currentSearchVariables?.filter?.filter(\n (filter) => filter.attribute === 'categoryPath'\n ) || [];\n\n search({\n ...searchVariables,\n filter: [...existingCategoryPathFilters, ...(searchVariables.filter || [])]\n }, { scope });\n };\n\n const updateUrlFromFilters = (filters: SearchFilter[]) => {\n const params = new URLSearchParams(window.location.search);\n \n if (!filters.length) {\n params.delete('filter');\n } else {\n const filterParam = filters\n .map((filter) => {\n if (filter.range) {\n return `${filter.attribute}:${filter.range.from}-${filter.range.to}`;\n }\n \n if (filter.in?.length) {\n return `${filter.attribute}:${filter.in.join(',')}`;\n }\n \n return null;\n })\n .filter(Boolean)\n .join(';');\n \n params.set('filter', filterParam);\n }\n params.set('page', '1');\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}?${params.toString()}`\n );\n };\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 updateUrlFromFilters(pendingFilters);\n handleSearchRequest({ ...currentSearchVariables, filter: pendingFilters });\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","existingCategoryPathFilters","filter","search","updateUrlFromFilters","filters","params","filterParam","handleSearchResult","payload","filterList","facetsWithSelections","selectedBuckets","selectedFilter","updateFacetSelections","currentFacetList","updatedFacetList","f","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,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as U,jsx as e}from"@dropins/tools/preact-jsx-runtime.js";import*as w from"@dropins/tools/preact-compat.js";import{useState as E,useEffect as
|
|
3
|
+
import{jsxs as U,jsx as e}from"@dropins/tools/preact-jsx-runtime.js";import*as w from"@dropins/tools/preact-compat.js";import{useState as E,useEffect as Z}from"@dropins/tools/preact-compat.js";import{VComponent as q,classes as G,Slot as k}from"@dropins/tools/lib.js";import{events as C}from"@dropins/tools/event-bus.js";import{PriceRange as y,InLineAlert as J,Icon as K,ProductItemCard as H,Image as Q}from"@dropins/tools/components.js";/* empty css */import{c as X,d as Y,e as $,S as ee,P as re}from"../chunks/acdlEvents.js";import{useText as ne}from"@dropins/tools/i18n.js";const F=t=>new DOMParser().parseFromString(t,"text/html").documentElement.textContent,M=({productList:t,header:a,footer:n,imageWidth:c,imageHeight:l})=>U("div",{className:"product-discovery-product-list",style:{"--imageWidth":c,"--imageHeight":l},children:[a&&e("div",{className:"product-discovery-product-list__header",children:a}),e("div",{className:"product-discovery-product-list__grid",children:t&&e(q,{node:t})}),n&&e("div",{className:"product-discovery-product-list__footer",children:n})]}),te=({product:t})=>{var h,v,u,p,o,P,d,x,_;let a=((u=(v=(h=t.price)==null?void 0:h.regular)==null?void 0:v.amount)==null?void 0:u.currency)??"USD";Intl.supportedValuesOf("currency").includes(a)||(a="USD");const n=(P=(o=(p=t.price)==null?void 0:p.final)==null?void 0:o.amount)==null?void 0:P.value,c=(_=(x=(d=t.price)==null?void 0:d.regular)==null?void 0:x.amount)==null?void 0:_.value;return n!==void 0&&c!==void 0&&n<c?U("div",{class:"product-price",children:[e("span",{class:"regular-price-normal",children:e(y,{amount:n,currency:a})}),e("span",{class:"special-price-crossed",children:e(y,{amount:c,currency:a})})]}):e(y,{amount:c,currency:a})},ae=({product:t})=>{var u,p,o,P,d,x,_,I,S,R,L,N;let a=((P=(o=(p=(u=t.priceRange)==null?void 0:u.minimum)==null?void 0:p.regular)==null?void 0:o.amount)==null?void 0:P.currency)??"USD";Intl.supportedValuesOf("currency").includes(a)||(a="USD");const n=(x=(d=t.priceRange)==null?void 0:d.minimum)==null?void 0:x.final.amount.value,c=(I=(_=t.priceRange)==null?void 0:_.minimum)==null?void 0:I.regular.amount.value,l=(R=(S=t.priceRange)==null?void 0:S.maximum)==null?void 0:R.final.amount.value,h=(N=(L=t.priceRange)==null?void 0:L.maximum)==null?void 0:N.regular.amount.value;return n<c||l<h?U("div",{class:"product-price",children:[e("span",{class:"regular-price-normal",children:e(y,{display:"from to",minimumAmount:n,maximumAmount:l,currency:a})}),e("span",{class:"special-price-crossed",children:e(y,{display:"from to",minimumAmount:c,maximumAmount:h,currency:a})})]}):e(y,{display:"from to",minimumAmount:c,maximumAmount:h,currency:a})},ie=t=>w.createElement("svg",{id:"Icon_Warning_Base",width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},w.createElement("g",{clipPath:"url(#clip0_841_1324)"},w.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),w.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"})),w.createElement("defs",null,w.createElement("clipPath",{id:"clip0_841_1324"},w.createElement("rect",{width:24,height:21,fill:"white",transform:"translate(0 1.5)",strokeWidth:1})))),ce=({alertMessage:t=""})=>e("div",{className:G(["product-discovery-search-alert-message__wrapper"]),children:e("div",{className:"product-discovery-search-alert-message__content",children:e(J,{heading:t,type:"warning",icon:e(K,{source:ie,size:"24"}),onDismiss:void 0})})}),fe=({routeProduct:t,scope:a,slots:n,imageWidth:c=400,imageHeight:l=450,skeletonCount:h=8,onSearchResult:v})=>{const u=a==="popover"?ee:re,p=ne({noResults:"Search.PLP.noResults",searchError:"Search.PLP.searchError"}),[o,P]=E(null),[d,x]=E([]),[_,I]=E(!1),[S,R]=E(null);Z(()=>{const r=C.on("search/loading",I,{eager:!0,scope:a}),i=C.on("search/error",()=>{R(p.searchError)},{eager:!0,scope:a}),s=C.on("search/result",m=>{var g,f,A;R(((g=m.result)==null?void 0:g.items.length)<1?p.noResults:null),P(m.request),x((f=m.result)==null?void 0:f.items),v==null||v((A=m.result)==null?void 0:A.items),m.request.phrase?X(u):Y(u)},{eager:!0,scope:a});return()=>{r==null||r.off(),i==null||i.off(),s==null||s.off()}},[]);const L=(r,i)=>{var f;const s=(f=r.target)==null?void 0:f.closest("a");if(!s||!t)return;const m=new URL(s.href),g=new URL(t(i),window.location.origin);m.pathname===g.pathname&&m.hostname===g.hostname&&$(i.sku,u)},N=(r,i)=>{var f,A,V,D;const s={loading:i<8?"eager":"lazy",src:((A=(f=r.images)==null?void 0:f[0])==null?void 0:A.url)||"",alt:((D=(V=r.images)==null?void 0:V[0])==null?void 0:D.label)||"",width:c,height:l,params:{width:c}},m=r.name!==null?F(r.name):r.sku,g=e(Q,{class:"product-discovery-product-item__image",...s,"aria-label":m||""});return e(k,{name:"ProductImage",slot:n==null?void 0:n.ProductImage,context:{product:r,defaultImageProps:s,variables:o},children:t?e("a",{href:t(r),children:g}):g})},b=r=>{const i=r.name!==null?F(r.name):"";return e(k,{name:"ProductName",slot:n==null?void 0:n.ProductName,context:{product:r,variables:o},children:t?e("a",{href:t(r),children:i}):i})},j=r=>{const i=r.typename==="ComplexProductView"?e(ae,{product:r}):e(te,{product:r});return e(k,{name:"ProductPrice",slot:n==null?void 0:n.ProductPrice,context:{product:r,variables:o},children:t?e("a",{href:t(r),children:i}):i})},z=r=>e(k,{name:"ProductActions",slot:n==null?void 0:n.ProductActions,context:{product:r,variables:o}}),B=()=>e(k,{name:"NoResults",slot:n==null?void 0:n.NoResults,context:{error:S,variables:o},children:S&&e(ce,{alertMessage:S})}),O=()=>e(M,{imageWidth:c,imageHeight:l,productList:Array.from({length:h}).map((r,i)=>e(H,{initialized:!1},i))}),T=()=>e(k,{name:"Header",slot:n==null?void 0:n.Header,context:{products:d,variables:o}}),W=()=>e(k,{name:"Footer",slot:n==null?void 0:n.Footer,context:{products:d,variables:o}});return e("div",{children:_?O():S?B():e(M,{header:T(),footer:W(),imageWidth:c,imageHeight:l,productList:d.map((r,i)=>e(H,{image:N(r,i),titleNode:b(r),price:j(r),actionButton:n!=null&&n.ProductActions?z(r):void 0,onClick:s=>L(s,r),initialized:!0},r.id||r.sku||i))})})};export{fe as SearchResults,fe as default};
|
|
4
4
|
//# sourceMappingURL=SearchResults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchResults.js","sources":["/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SimpleProductPrice.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/ComplexProductPrice.tsx","../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SearchResults.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n header?: VNode;\n footer?: VNode;\n imageWidth?: number;\n imageHeight?: number;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ productList, header, footer, imageWidth, imageHeight }) => {\n return (\n <div className={'product-discovery-product-list'} style={{ '--imageWidth': imageWidth, '--imageHeight': imageHeight }}>\n {header && <div className=\"product-discovery-product-list__header\">{header}</div>}\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n {footer && <div className=\"product-discovery-product-list__footer\">{footer}</div>}\n </div>\n );\n};\n","import { PriceRange } from \"@adobe-commerce/elsie/components\";\nimport { Product } from \"@/plp/data/models/product\";\nimport '@/plp/components/ProductList/ProductList';\n\nexport const SimpleProductPrice = ({ product }: { product: Product }) => {\n let currency = product.price?.regular?.amount?.currency ?? \"USD\";\n\n if (!Intl.supportedValuesOf(\"currency\").includes(currency)) {\n currency = \"USD\";\n }\n\n\n const finalAmount = product.price?.final?.amount?.value;\n const regularAmount = product.price?.regular?.amount?.value;\n\n const hasSpecial =\n finalAmount !== undefined &&\n regularAmount !== undefined &&\n finalAmount < regularAmount;\n\n if (!hasSpecial) {\n return <PriceRange amount={regularAmount} currency={currency} />;\n }\n\n return (\n <div class=\"product-price\">\n <span class=\"regular-price-normal\">\n <PriceRange amount={finalAmount} currency={currency} />\n </span>\n <span class=\"special-price-crossed\">\n <PriceRange amount={regularAmount} currency={currency} />\n </span>\n </div>\n );\n};\n","import { PriceRange } from \"@adobe-commerce/elsie/components\";\nimport { Product } from \"@/plp/data/models/product\";\n\nexport const ComplexProductPrice = ({ product }: { product: Product }) => {\n let currency =\n product.priceRange?.minimum?.regular?.amount?.currency ?? \"USD\";\n\n if (!Intl.supportedValuesOf(\"currency\").includes(currency)) {\n currency = \"USD\";\n }\n\n const minFinal = product.priceRange?.minimum?.final.amount.value;\n const minRegular = product.priceRange?.minimum?.regular.amount.value;\n const maxFinal = product.priceRange?.maximum?.final.amount.value;\n const maxRegular = product.priceRange?.maximum?.regular.amount.value;\n\n const hasSpecial = minFinal < minRegular || maxFinal < maxRegular;\n\n if (!hasSpecial) {\n return (\n <PriceRange\n display=\"from to\"\n minimumAmount={minRegular}\n maximumAmount={maxRegular}\n currency={currency}\n />\n );\n }\n\n return (\n <div class=\"product-price\">\n <span class=\"regular-price-normal\">\n <PriceRange\n display=\"from to\"\n minimumAmount={minFinal}\n maximumAmount={maxFinal}\n currency={currency}\n />\n </span>\n\n <span class=\"special-price-crossed\">\n <PriceRange\n display=\"from to\"\n minimumAmount={minRegular}\n maximumAmount={maxRegular}\n currency={currency}\n />\n </span>\n </div>\n );\n};","import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\" }))));\nexport default SvgWarning;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ImageProps, Image, ProductItemCard } from '@adobe-commerce/elsie/components';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { Scope, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { SimpleProductPrice } from '@/plp/containers/SearchResults/SimpleProductPrice';\nimport { ComplexProductPrice } from \"@/plp/containers/SearchResults/ComplexProductPrice\";\nimport { ProductList, SearchAlertMessage } from '@/plp/components'\nimport {\n searchProductClick,\n searchResultsView,\n categoryResultsView,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID\n} from '@/plp/utils/acdlEvents';\n\ntype SlotDefaultContext = {\n product: Product;\n variables: SearchVariables | null;\n}\n\nexport interface SearchResultsProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (product: Product) => string;\n scope?: Scope;\n imageWidth?: number;\n imageHeight?: number;\n skeletonCount?: number;\n onSearchResult?: (payload: Product[]) => void;\n slots?: {\n ProductActions?: SlotProps<SlotDefaultContext>;\n ProductPrice?: SlotProps<SlotDefaultContext>;\n ProductName?: SlotProps<SlotDefaultContext>;\n ProductImage?: SlotProps<SlotDefaultContext & { defaultImageProps: ImageProps }>;\n NoResults?: SlotProps<{ error: string | null; variables: SearchVariables | null }>;\n Header?: SlotProps<{ products: Product[]; variables: SearchVariables | null }>;\n Footer?: SlotProps<{ products: Product[]; variables: SearchVariables | null }>;\n },\n}\n\nexport const SearchResults: Container<SearchResultsProps> = ({\n routeProduct,\n scope,\n slots,\n imageWidth = 400,\n imageHeight = 450,\n skeletonCount = 8,\n onSearchResult,\n}) => {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n\n const labels = useText({\n noResults: 'Search.PLP.noResults',\n searchError: 'Search.PLP.searchError',\n });\n\n const [variables, setVariables] = useState<SearchVariables | null>(null);\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadingEvent = events.on('search/loading', setLoading, { eager: true, scope });\n\n const errorEvent = events.on('search/error', () => {\n setError(labels.searchError!);\n }, { eager: true, scope });\n\n const searchEvent = events.on('search/result', (payload) => {\n setError(payload.result?.items.length < 1 ? labels.noResults! : null);\n\n setVariables(payload.request);\n setItems(payload.result?.items);\n onSearchResult?.(payload.result?.items);\n\n // Publish search results view event to ACDL\n if (payload.request.phrase) {\n searchResultsView(acdlUnitId);\n } else {\n categoryResultsView(acdlUnitId);\n }\n }, { eager: true, scope });\n\n return () => {\n loadingEvent?.off();\n errorEvent?.off();\n searchEvent?.off();\n };\n }, []);\n\n const handleProductClick = (event: MouseEvent, product: Product): void => {\n const anchor = (event.target as HTMLElement)?.closest('a');\n\n if (!anchor || !routeProduct) return;\n\n const anchorUrl = new URL(anchor.href);\n const routeUrl = new URL(routeProduct(product), window.location.origin);\n\n // Compare both pathname and hostname to ensure same path under same host\n if (anchorUrl.pathname === routeUrl.pathname && anchorUrl.hostname === routeUrl.hostname) { \n searchProductClick(product.sku, acdlUnitId);\n }\n };\n\n const renderProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: imageWidth,\n height: imageHeight,\n params: { width: imageWidth },\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName || ''} />\n );\n\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const renderProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const renderProductPriceSlot = (product: Product) => {\n const PriceNode =\n product.typename === \"ComplexProductView\" ? (\n <ComplexProductPrice product={product} />\n ) : (\n <SimpleProductPrice product={product} />\n );\n \n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)}>{PriceNode}</a>\n ) : (\n PriceNode\n )}\n </Slot>\n );\n }; \n \n const renderActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product, variables }} />;\n };\n\n const renderAlertSlot = () => {\n return <Slot name=\"NoResults\" slot={slots?.NoResults} context={{ error, variables }}>\n {error && <SearchAlertMessage alertMessage={error} />}\n </Slot>;\n }\n\n const renderSkeleton = () => {\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={Array.from({ length: skeletonCount }).map((_, index) => (\n <ProductItemCard key={index} initialized={false} />\n ))}\n />\n }\n\n const renderHeader = () => {\n return <Slot name=\"Header\" slot={slots?.Header} context={{ products: items, variables }} />;\n }\n\n const renderFooter = () => {\n return <Slot name=\"Footer\" slot={slots?.Footer} context={{ products: items, variables }} />;\n }\n\n const renderResults = () => {\n if (error) return renderAlertSlot();\n\n return <ProductList\n header={renderHeader()}\n footer={renderFooter()}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={items.map((product, index) => (\n <ProductItemCard key={product.id || product.sku || index}\n image={renderProductImageSlot(product, index)}\n titleNode={renderProductNameSlot(product)}\n price={renderProductPriceSlot(product)}\n actionButton={slots?.ProductActions ? renderActionsSlot(product) : undefined}\n onClick={(event) => handleProductClick(event, product)}\n initialized\n />\n ))}\n />\n }\n\n return (\n <div>\n {loading ? renderSkeleton() : renderResults()}\n </div>\n );\n};\n"],"names":["htmlStringDecode","input","ProductList","productList","header","footer","imageWidth","imageHeight","jsxs","jsx","VComponent","SimpleProductPrice","product","currency","_c","_b","_a","finalAmount","_f","_e","_d","regularAmount","_i","_h","_g","PriceRange","ComplexProductPrice","minFinal","minRegular","maxFinal","_j","maxRegular","_l","_k","SvgWarning","props","React","SearchAlertMessage","alertMessage","classes","InLineAlert","Icon","Warning","SearchResults","routeProduct","scope","slots","skeletonCount","onSearchResult","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","labels","useText","variables","setVariables","useState","items","setItems","loading","setLoading","error","setError","useEffect","loadingEvent","events","errorEvent","searchEvent","payload","searchResultsView","categoryResultsView","handleProductClick","event","anchor","anchorUrl","routeUrl","searchProductClick","renderProductImageSlot","index","defaultImageProps","productName","imageComponent","Image","Slot","renderProductNameSlot","renderProductPriceSlot","PriceNode","renderActionsSlot","renderAlertSlot","renderSkeleton","_","ProductItemCard","renderHeader","renderFooter"],"mappings":"glBASA,MAAMA,EAAoBC,GACZ,IAAI,UAAA,EAAY,gBAAgBA,EAAO,WAAW,EACnD,gBAAgB,YCWhBC,EAAmD,CAAC,CAAE,YAAAC,EAAa,OAAAC,EAAQ,OAAAC,EAAQ,WAAAC,EAAY,YAAAC,KAExGC,EAAC,MAAA,CAAI,UAAW,iCAAkC,MAAO,CAAE,eAAgBF,EAAY,gBAAiBC,CAAA,EACrG,SAAA,CAAAH,GAAUK,EAAC,MAAA,CAAI,UAAU,yCAA0C,SAAAL,EAAO,EAC3EK,EAAC,OAAI,UAAU,uCAAwC,YAAeA,EAACC,EAAA,CAAW,KAAMP,CAAA,CAAa,CAAA,CAAG,EACvGE,GAAUI,EAAC,MAAA,CAAI,UAAU,yCAA0C,SAAAJ,CAAA,CAAO,CAAA,EAC7E,ECxBSM,GAAqB,CAAC,CAAE,QAAAC,KAAoC,uBACvE,IAAIC,IAAWC,GAAAC,GAAAC,EAAAJ,EAAQ,QAAR,YAAAI,EAAe,UAAf,YAAAD,EAAwB,SAAxB,YAAAD,EAAgC,WAAY,MAEtD,KAAK,kBAAkB,UAAU,EAAE,SAASD,CAAQ,IACvDA,EAAW,OAIb,MAAMI,GAAcC,GAAAC,GAAAC,EAAAR,EAAQ,QAAR,YAAAQ,EAAe,QAAf,YAAAD,EAAsB,SAAtB,YAAAD,EAA8B,MAC5CG,GAAgBC,GAAAC,GAAAC,EAAAZ,EAAQ,QAAR,YAAAY,EAAe,UAAf,YAAAD,EAAwB,SAAxB,YAAAD,EAAgC,MAOtD,OAJEL,IAAgB,QAChBI,IAAkB,QAClBJ,EAAcI,EAOdb,EAAC,MAAA,CAAI,MAAM,gBACT,SAAA,CAAAC,EAAC,OAAA,CAAK,MAAM,uBACV,SAAAA,EAACgB,GAAW,OAAQR,EAAa,SAAAJ,EAAoB,CAAA,CACvD,EACAJ,EAAC,QAAK,MAAM,wBACV,WAACgB,EAAA,CAAW,OAAQJ,EAAe,SAAAR,CAAA,CAAoB,CAAA,CACzD,CAAA,EACF,EAXOJ,EAACgB,EAAA,CAAW,OAAQJ,EAAe,SAAAR,CAAA,CAAoB,CAalE,EC/Baa,GAAsB,CAAC,CAAE,QAAAd,KAAoC,6BACxE,IAAIC,IACFO,GAAAN,GAAAC,GAAAC,EAAAJ,EAAQ,aAAR,YAAAI,EAAoB,UAApB,YAAAD,EAA6B,UAA7B,YAAAD,EAAsC,SAAtC,YAAAM,EAA8C,WAAY,MAEvD,KAAK,kBAAkB,UAAU,EAAE,SAASP,CAAQ,IACvDA,EAAW,OAGb,MAAMc,GAAWT,GAAAC,EAAAP,EAAQ,aAAR,YAAAO,EAAoB,UAApB,YAAAD,EAA6B,MAAM,OAAO,MACrDU,GAAaL,GAAAC,EAAAZ,EAAQ,aAAR,YAAAY,EAAoB,UAApB,YAAAD,EAA6B,QAAQ,OAAO,MACzDM,GAAWC,GAAAR,EAAAV,EAAQ,aAAR,YAAAU,EAAoB,UAApB,YAAAQ,EAA6B,MAAM,OAAO,MACrDC,GAAaC,GAAAC,EAAArB,EAAQ,aAAR,YAAAqB,EAAoB,UAApB,YAAAD,EAA6B,QAAQ,OAAO,MAI/D,OAFmBL,EAAWC,GAAcC,EAAWE,EAcrDvB,EAAC,MAAA,CAAI,MAAM,gBACT,SAAA,CAAAC,EAAC,OAAA,CAAK,MAAM,uBACV,SAAAA,EAACgB,EAAA,CACC,QAAQ,UACR,cAAeE,EACf,cAAeE,EACf,SAAAhB,CAAA,CAAA,EAEJ,EAEAJ,EAAC,OAAA,CAAK,MAAM,wBACV,SAAAA,EAACgB,EAAA,CACC,QAAQ,UACR,cAAeG,EACf,cAAeG,EACf,SAAAlB,CAAA,CAAA,CACF,CACF,CAAA,EACF,EA5BEJ,EAACgB,EAAA,CACC,QAAQ,UACR,cAAeG,EACf,cAAeG,EACf,SAAAlB,CAAA,CAAA,CA0BR,ECjDMqB,GAAcC,GAA0BC,EAAM,cAAc,MAAO,CAAE,GAAI,oBAAqB,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAK,EAAoBC,EAAM,cAAc,IAAK,CAAE,SAAU,wBAA0CA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,6DAA8D,OAAQ,eAAgB,cAAe,QAAS,eAAgB,OAAO,CAAE,EAAmBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,qIAAsI,OAAQ,eAAgB,cAAe,QAAS,eAAgB,OAAO,CAAE,CAAC,EAAmBA,EAAM,cAAc,OAAQ,KAAsBA,EAAM,cAAc,WAAY,CAAE,GAAI,gBAAgB,EAAoBA,EAAM,cAAc,OAAQ,CAAE,MAAO,GAAI,OAAQ,GAAI,KAAM,QAAS,UAAW,mBAAoB,CAAC,CAAC,CAAC,ECmB3gCC,GAAiE,CAAC,CAAE,aAAAC,EAAe,MAE5F7B,EAAC,MAAA,CAAI,UAAW8B,EAAQ,CAAC,iDAAiD,CAAC,EACzE,SAAA9B,EAAC,MAAA,CAAI,UAAU,kDACb,SAAAA,EAAC+B,EAAA,CACC,QAASF,EACT,KAAM,UACN,KAAM7B,EAACgC,EAAA,CAAK,OAAQC,GAAS,KAAK,KAAK,EACvC,UAAW,MAAA,CAAA,EAEf,CAAA,CACF,ECoBSC,GAA+C,CAAC,CAC3D,aAAAC,EACA,MAAAC,EACA,MAAAC,EACA,WAAAxC,EAAa,IACb,YAAAC,EAAc,IACd,cAAAwC,EAAgB,EAChB,eAAAC,CACF,IAAM,CACJ,MAAMC,EAAaJ,IAAU,UAAYK,GAAiBC,GAEpDC,EAASC,GAAQ,CACrB,UAAW,uBACX,YAAa,wBAAA,CACd,EAEK,CAACC,EAAWC,CAAY,EAAIC,EAAiC,IAAI,EACjE,CAACC,EAAOC,CAAQ,EAAIF,EAAgB,CAAA,CAAE,EACtC,CAACG,EAASC,CAAU,EAAIJ,EAAS,EAAK,EACtC,CAACK,EAAOC,CAAQ,EAAIN,EAAwB,IAAI,EAEtDO,EAAU,IAAM,CACd,MAAMC,EAAeC,EAAO,GAAG,iBAAkBL,EAAY,CAAE,MAAO,GAAM,MAAAf,EAAO,EAE7EqB,EAAaD,EAAO,GAAG,eAAgB,IAAM,CACjDH,EAASV,EAAO,WAAY,CAC9B,EAAG,CAAE,MAAO,GAAM,MAAAP,EAAO,EAEnBsB,EAAcF,EAAO,GAAG,gBAAkBG,GAAY,WAC1DN,IAAS9C,EAAAoD,EAAQ,SAAR,YAAApD,EAAgB,MAAM,QAAS,EAAIoC,EAAO,UAAa,IAAI,EAEpEG,EAAaa,EAAQ,OAAO,EAC5BV,GAAS3C,EAAAqD,EAAQ,SAAR,YAAArD,EAAgB,KAAK,EAC9BiC,GAAA,MAAAA,GAAiBlC,EAAAsD,EAAQ,SAAR,YAAAtD,EAAgB,OAG7BsD,EAAQ,QAAQ,OAClBC,EAAkBpB,CAAU,EAE5BqB,EAAoBrB,CAAU,CAElC,EAAG,CAAE,MAAO,GAAM,MAAAJ,EAAO,EAEzB,MAAO,IAAM,CACXmB,GAAA,MAAAA,EAAc,MACdE,GAAA,MAAAA,EAAY,MACZC,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMI,EAAqB,CAACC,EAAmB5D,IAA2B,OACxE,MAAM6D,GAAUzD,EAAAwD,EAAM,SAAN,YAAAxD,EAA8B,QAAQ,KAEtD,GAAI,CAACyD,GAAU,CAAC7B,EAAc,OAE9B,MAAM8B,EAAY,IAAI,IAAID,EAAO,IAAI,EAC/BE,EAAW,IAAI,IAAI/B,EAAahC,CAAO,EAAG,OAAO,SAAS,MAAM,EAGlE8D,EAAU,WAAaC,EAAS,UAAYD,EAAU,WAAaC,EAAS,UAC9EC,EAAmBhE,EAAQ,IAAKqC,CAAU,CAE9C,EAEM4B,EAAyB,CAACjE,EAAkBkE,IAAkB,aAClE,MAAMC,EAAgC,CACpC,QAASD,EAAQ,EAAI,QAAU,OAC/B,MAAK/D,GAAAC,EAAAJ,EAAQ,SAAR,YAAAI,EAAiB,KAAjB,YAAAD,EAAqB,MAAO,GACjC,MAAKK,GAAAN,EAAAF,EAAQ,SAAR,YAAAE,EAAiB,KAAjB,YAAAM,EAAqB,QAAS,GACnC,MAAOd,EACP,OAAQC,EACR,OAAQ,CAAE,MAAOD,CAAA,CAAW,EAExB0E,EAAcpE,EAAQ,OAAS,KAAOZ,EAAiBY,EAAQ,IAAI,EAAIA,EAAQ,IAC/EqE,IACHC,EAAA,CAAM,MAAM,wCAAyC,GAAGH,EAAmB,aAAYC,GAAe,EAAA,CAAI,EAG7G,OACEvE,EAAC0E,GAAK,KAAK,eAAe,KAAMrC,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,QAAAlC,EAAS,kBAAAmE,EAAmB,UAAAzB,GACzF,SAAAV,IACE,IAAA,CAAE,KAAMA,EAAahC,CAAO,EAC1B,SAAAqE,EACH,EAEAA,CAAA,CAEJ,CAEJ,EAEMG,EAAyBxE,GAAqB,CAClD,MAAMoE,EAAcpE,EAAQ,OAAS,KAAOZ,EAAiBY,EAAQ,IAAI,EAAI,GAC7E,OACEH,EAAC0E,GAAK,KAAK,cAAc,KAAMrC,GAAA,YAAAA,EAAO,YAAa,QAAS,CAAE,QAAAlC,EAAS,UAAA0C,GACpE,SAAAV,IACE,IAAA,CAAE,KAAMA,EAAahC,CAAO,EAC1B,SAAAoE,EACH,EAEAA,CAAA,CAEJ,CAEJ,EAEMK,EAA0BzE,GAAqB,CACnD,MAAM0E,EACJ1E,EAAQ,WAAa,qBACnBH,EAACiB,IAAoB,QAAAd,CAAA,CAAkB,EAEvCH,EAACE,GAAA,CAAmB,QAAAC,CAAA,CAAkB,EAG1C,OACEH,EAAC0E,GAAK,KAAK,eAAe,KAAMrC,GAAA,YAAAA,EAAO,aAAc,QAAS,CAAE,QAAAlC,EAAS,UAAA0C,GACtE,SAAAV,IACE,IAAA,CAAE,KAAMA,EAAahC,CAAO,EAAI,SAAA0E,EAAU,EAE3CA,CAAA,CAEJ,CAEJ,EAEMC,EAAqB3E,GAClBH,EAAC0E,EAAA,CAAK,KAAK,iBAAiB,KAAMrC,GAAA,YAAAA,EAAO,eAAgB,QAAS,CAAE,QAAAlC,EAAS,UAAA0C,CAAA,CAAU,CAAG,EAG7FkC,EAAkB,MACdL,EAAA,CAAK,KAAK,YAAY,KAAMrC,GAAA,YAAAA,EAAO,UAAW,QAAS,CAAE,MAAAe,EAAO,UAAAP,GACrE,SAAAO,KAAUxB,GAAA,CAAmB,aAAcwB,EAAO,EACrD,EAGI4B,EAAiB,IACdhF,EAACP,EAAA,CACN,WAAAI,EACA,YAAAC,EACA,YAAa,MAAM,KAAK,CAAE,OAAQwC,EAAe,EAAE,IAAI,CAAC2C,EAAGZ,IACzDrE,EAACkF,GAA4B,YAAa,EAAA,EAApBb,CAA2B,CAClD,CAAA,CAAA,EAICc,EAAe,IACZnF,EAAC0E,EAAA,CAAK,KAAK,SAAS,KAAMrC,GAAA,YAAAA,EAAO,OAAQ,QAAS,CAAE,SAAUW,EAAO,UAAAH,CAAA,CAAU,CAAG,EAGrFuC,EAAe,IACZpF,EAAC0E,EAAA,CAAK,KAAK,SAAS,KAAMrC,GAAA,YAAAA,EAAO,OAAQ,QAAS,CAAE,SAAUW,EAAO,UAAAH,CAAA,CAAU,CAAG,EAwB3F,SACG,MAAA,CACE,SAAAK,EAAU8B,EAAA,EAtBT5B,EAAc2B,EAAA,EAEX/E,EAACP,EAAA,CACN,OAAQ0F,EAAA,EACR,OAAQC,EAAA,EACR,WAAAvF,EACA,YAAAC,EACA,YAAakD,EAAM,IAAI,CAAC7C,EAASkE,IAC/BrE,EAACkF,EAAA,CACC,MAAOd,EAAuBjE,EAASkE,CAAK,EAC5C,UAAWM,EAAsBxE,CAAO,EACxC,MAAOyE,EAAuBzE,CAAO,EACrC,aAAckC,GAAA,MAAAA,EAAO,eAAiByC,EAAkB3E,CAAO,EAAI,OACnE,QAAU4D,GAAUD,EAAmBC,EAAO5D,CAAO,EACrD,YAAW,EAAA,EANSA,EAAQ,IAAMA,EAAQ,KAAOkE,CAAA,CAQpD,CAAA,CAAA,EAOH,CAEJ","x_google_ignoreList":[4]}
|
|
1
|
+
{"version":3,"file":"SearchResults.js","sources":["/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SimpleProductPrice.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/ComplexProductPrice.tsx","../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SearchResults.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n header?: VNode;\n footer?: VNode;\n imageWidth?: number;\n imageHeight?: number;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ productList, header, footer, imageWidth, imageHeight }) => {\n return (\n <div className={'product-discovery-product-list'} style={{ '--imageWidth': imageWidth, '--imageHeight': imageHeight }}>\n {header && <div className=\"product-discovery-product-list__header\">{header}</div>}\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n {footer && <div className=\"product-discovery-product-list__footer\">{footer}</div>}\n </div>\n );\n};\n","import { PriceRange } from \"@adobe-commerce/elsie/components\";\nimport { Product } from \"@/plp/data/models/product\";\nimport '@/plp/components/ProductList/ProductList';\n\nexport const SimpleProductPrice = ({ product }: { product: Product }) => {\n let currency = product.price?.regular?.amount?.currency ?? \"USD\";\n\n if (!Intl.supportedValuesOf(\"currency\").includes(currency)) {\n currency = \"USD\";\n }\n\n\n const finalAmount = product.price?.final?.amount?.value;\n const regularAmount = product.price?.regular?.amount?.value;\n\n const hasSpecial =\n finalAmount !== undefined &&\n regularAmount !== undefined &&\n finalAmount < regularAmount;\n\n if (!hasSpecial) {\n return <PriceRange amount={regularAmount} currency={currency} />;\n }\n\n return (\n <div class=\"product-price\">\n <span class=\"regular-price-normal\">\n <PriceRange amount={finalAmount} currency={currency} />\n </span>\n <span class=\"special-price-crossed\">\n <PriceRange amount={regularAmount} currency={currency} />\n </span>\n </div>\n );\n};\n","import { PriceRange } from \"@adobe-commerce/elsie/components\";\nimport { Product } from \"@/plp/data/models/product\";\n\nexport const ComplexProductPrice = ({ product }: { product: Product }) => {\n let currency =\n product.priceRange?.minimum?.regular?.amount?.currency ?? \"USD\";\n\n if (!Intl.supportedValuesOf(\"currency\").includes(currency)) {\n currency = \"USD\";\n }\n\n const minFinal = product.priceRange?.minimum?.final.amount.value;\n const minRegular = product.priceRange?.minimum?.regular.amount.value;\n const maxFinal = product.priceRange?.maximum?.final.amount.value;\n const maxRegular = product.priceRange?.maximum?.regular.amount.value;\n\n const hasSpecial = minFinal < minRegular || maxFinal < maxRegular;\n\n if (!hasSpecial) {\n return (\n <PriceRange\n display=\"from to\"\n minimumAmount={minRegular}\n maximumAmount={maxRegular}\n currency={currency}\n />\n );\n }\n\n return (\n <div class=\"product-price\">\n <span class=\"regular-price-normal\">\n <PriceRange\n display=\"from to\"\n minimumAmount={minFinal}\n maximumAmount={maxFinal}\n currency={currency}\n />\n </span>\n\n <span class=\"special-price-crossed\">\n <PriceRange\n display=\"from to\"\n minimumAmount={minRegular}\n maximumAmount={maxRegular}\n currency={currency}\n />\n </span>\n </div>\n );\n};","import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\", strokeWidth: 1 }))));\nexport default SvgWarning;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ImageProps, Image, ProductItemCard } from '@adobe-commerce/elsie/components';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { Scope, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { SimpleProductPrice } from '@/plp/containers/SearchResults/SimpleProductPrice';\nimport { ComplexProductPrice } from \"@/plp/containers/SearchResults/ComplexProductPrice\";\nimport { ProductList, SearchAlertMessage } from '@/plp/components'\nimport {\n searchProductClick,\n searchResultsView,\n categoryResultsView,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID\n} from '@/plp/utils/acdlEvents';\n\ntype SlotDefaultContext = {\n product: Product;\n variables: SearchVariables | null;\n}\n\nexport interface SearchResultsProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (product: Product) => string;\n scope?: Scope;\n imageWidth?: number;\n imageHeight?: number;\n skeletonCount?: number;\n onSearchResult?: (payload: Product[]) => void;\n slots?: {\n ProductActions?: SlotProps<SlotDefaultContext>;\n ProductPrice?: SlotProps<SlotDefaultContext>;\n ProductName?: SlotProps<SlotDefaultContext>;\n ProductImage?: SlotProps<SlotDefaultContext & { defaultImageProps: ImageProps }>;\n NoResults?: SlotProps<{ error: string | null; variables: SearchVariables | null }>;\n Header?: SlotProps<{ products: Product[]; variables: SearchVariables | null }>;\n Footer?: SlotProps<{ products: Product[]; variables: SearchVariables | null }>;\n },\n}\n\nexport const SearchResults: Container<SearchResultsProps> = ({\n routeProduct,\n scope,\n slots,\n imageWidth = 400,\n imageHeight = 450,\n skeletonCount = 8,\n onSearchResult,\n}) => {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n\n const labels = useText({\n noResults: 'Search.PLP.noResults',\n searchError: 'Search.PLP.searchError',\n });\n\n const [variables, setVariables] = useState<SearchVariables | null>(null);\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadingEvent = events.on('search/loading', setLoading, { eager: true, scope });\n\n const errorEvent = events.on('search/error', () => {\n setError(labels.searchError!);\n }, { eager: true, scope });\n\n const searchEvent = events.on('search/result', (payload) => {\n setError(payload.result?.items.length < 1 ? labels.noResults! : null);\n\n setVariables(payload.request);\n setItems(payload.result?.items);\n onSearchResult?.(payload.result?.items);\n\n // Publish search results view event to ACDL\n if (payload.request.phrase) {\n searchResultsView(acdlUnitId);\n } else {\n categoryResultsView(acdlUnitId);\n }\n }, { eager: true, scope });\n\n return () => {\n loadingEvent?.off();\n errorEvent?.off();\n searchEvent?.off();\n };\n }, []);\n\n const handleProductClick = (event: MouseEvent, product: Product): void => {\n const anchor = (event.target as HTMLElement)?.closest('a');\n\n if (!anchor || !routeProduct) return;\n\n const anchorUrl = new URL(anchor.href);\n const routeUrl = new URL(routeProduct(product), window.location.origin);\n\n // Compare both pathname and hostname to ensure same path under same host\n if (anchorUrl.pathname === routeUrl.pathname && anchorUrl.hostname === routeUrl.hostname) { \n searchProductClick(product.sku, acdlUnitId);\n }\n };\n\n const renderProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: imageWidth,\n height: imageHeight,\n params: { width: imageWidth },\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName || ''} />\n );\n\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const renderProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const renderProductPriceSlot = (product: Product) => {\n const PriceNode =\n product.typename === \"ComplexProductView\" ? (\n <ComplexProductPrice product={product} />\n ) : (\n <SimpleProductPrice product={product} />\n );\n \n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product, variables }}>\n {routeProduct ? (\n <a href={routeProduct(product)}>{PriceNode}</a>\n ) : (\n PriceNode\n )}\n </Slot>\n );\n }; \n \n const renderActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product, variables }} />;\n };\n\n const renderAlertSlot = () => {\n return <Slot name=\"NoResults\" slot={slots?.NoResults} context={{ error, variables }}>\n {error && <SearchAlertMessage alertMessage={error} />}\n </Slot>;\n }\n\n const renderSkeleton = () => {\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={Array.from({ length: skeletonCount }).map((_, index) => (\n <ProductItemCard key={index} initialized={false} />\n ))}\n />\n }\n\n const renderHeader = () => {\n return <Slot name=\"Header\" slot={slots?.Header} context={{ products: items, variables }} />;\n }\n\n const renderFooter = () => {\n return <Slot name=\"Footer\" slot={slots?.Footer} context={{ products: items, variables }} />;\n }\n\n const renderResults = () => {\n if (error) return renderAlertSlot();\n\n return <ProductList\n header={renderHeader()}\n footer={renderFooter()}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={items.map((product, index) => (\n <ProductItemCard key={product.id || product.sku || index}\n image={renderProductImageSlot(product, index)}\n titleNode={renderProductNameSlot(product)}\n price={renderProductPriceSlot(product)}\n actionButton={slots?.ProductActions ? renderActionsSlot(product) : undefined}\n onClick={(event) => handleProductClick(event, product)}\n initialized\n />\n ))}\n />\n }\n\n return (\n <div>\n {loading ? renderSkeleton() : renderResults()}\n </div>\n );\n};\n"],"names":["htmlStringDecode","input","ProductList","productList","header","footer","imageWidth","imageHeight","jsxs","jsx","VComponent","SimpleProductPrice","product","currency","_c","_b","_a","finalAmount","_f","_e","_d","regularAmount","_i","_h","_g","PriceRange","ComplexProductPrice","minFinal","minRegular","maxFinal","_j","maxRegular","_l","_k","SvgWarning","props","React","SearchAlertMessage","alertMessage","classes","InLineAlert","Icon","Warning","SearchResults","routeProduct","scope","slots","skeletonCount","onSearchResult","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","labels","useText","variables","setVariables","useState","items","setItems","loading","setLoading","error","setError","useEffect","loadingEvent","events","errorEvent","searchEvent","payload","searchResultsView","categoryResultsView","handleProductClick","event","anchor","anchorUrl","routeUrl","searchProductClick","renderProductImageSlot","index","defaultImageProps","productName","imageComponent","Image","Slot","renderProductNameSlot","renderProductPriceSlot","PriceNode","renderActionsSlot","renderAlertSlot","renderSkeleton","_","ProductItemCard","renderHeader","renderFooter"],"mappings":"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","x_google_ignoreList":[4]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-product-discovery", "version": "3.0.0-
|
|
1
|
+
{"name": "@dropins/storefront-product-discovery", "version": "3.0.0-alpha14", "@dropins/tools": "^1.6.0", "license": "SEE LICENSE IN LICENSE.md"}
|