@dropins/storefront-product-discovery 2.0.0-alpha12 → 2.1.0-alpha001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/fetch-graphql/fetch-graphql.d.ts +1 -1
- package/api.js +1 -1
- package/chunks/search.js +2 -2
- package/chunks/search.js.map +1 -1
- package/containers/Facets.js +1 -1
- package/containers/Pagination.js +1 -1
- package/containers/SortBy.js +1 -1
- package/containers/SortBy.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* file in accordance with the terms of the Adobe license agreement
|
|
7
7
|
* accompanying it.
|
|
8
8
|
*******************************************************************/
|
|
9
|
-
export declare const setEndpoint: (endpoint: string) => void, setFetchGraphQlHeader: (key: string, value: string | null) => void, removeFetchGraphQlHeader: (key: string) => void, setFetchGraphQlHeaders: (header: import('@adobe-commerce/fetch-graphql').Header | ((prev: import('@adobe-commerce/fetch-graphql').Header) => import('@adobe-commerce/fetch-graphql').Header)) => void, fetchGraphQl: <T = any>(query: string, options?: import('@adobe-commerce/fetch-graphql').FetchOptions | undefined) => Promise<{
|
|
9
|
+
export declare const setEndpoint: (endpoint: string) => void, setFetchGraphQlHeader: (key: string, value: string | null) => void, removeFetchGraphQlHeader: (key: string) => void, setFetchGraphQlHeaders: (header: import('@adobe-commerce/fetch-graphql').Header | ((prev: import('@adobe-commerce/fetch-graphql').Header) => import('@adobe-commerce/fetch-graphql').Header)) => void, getFetchGraphQlHeader: (key: string) => string | null | undefined, fetchGraphQl: <T = any>(query: string, options?: import('@adobe-commerce/fetch-graphql').FetchOptions | undefined) => Promise<{
|
|
10
10
|
errors?: import('@adobe-commerce/fetch-graphql').FetchQueryError | undefined;
|
|
11
11
|
data: T;
|
|
12
12
|
}>, getConfig: () => {
|
package/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{f as p,
|
|
3
|
+
import{f as p,c as h,g as c,r as m,d,s as f,a as l,b as g}from"./chunks/search.js";import{c as G,i as Q}from"./chunks/initialize.js";import"@dropins/tools/lib.js";import"@dropins/tools/event-bus.js";import"./fragments.js";import"./chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";export{G as config,p as fetchGraphQl,h as getConfig,c as getFetchGraphQlHeader,Q as initialize,m as removeFetchGraphQlHeader,d as search,f as setEndpoint,l as setFetchGraphQlHeader,g as setFetchGraphQlHeaders};
|
|
4
4
|
//# sourceMappingURL=api.js.map
|
package/chunks/search.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{merge as ee}from"@dropins/tools/lib.js";import{c as re}from"./initialize.js";import{events as p}from"@dropins/tools/event-bus.js";import{ProductView as ne,Facet as ie}from"../fragments.js";import{S as oe,P as se,u as ue,b as le,d as te,e as ce}from"./acdlEvents.js";import{FetchGraphQL as me}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:be,setFetchGraphQlHeader:Se,removeFetchGraphQlHeader:xe,setFetchGraphQlHeaders:$e,fetchGraphQl:pe,getConfig:
|
|
3
|
+
import{merge as ee}from"@dropins/tools/lib.js";import{c as re}from"./initialize.js";import{events as p}from"@dropins/tools/event-bus.js";import{ProductView as ne,Facet as ie}from"../fragments.js";import{S as oe,P as se,u as ue,b as le,d as te,e as ce}from"./acdlEvents.js";import{FetchGraphQL as me}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:be,setFetchGraphQlHeader:Se,removeFetchGraphQlHeader:xe,setFetchGraphQlHeaders:$e,getFetchGraphQlHeader:ke,fetchGraphQl:pe,getConfig:Fe}=new me().getMethods(),ge=e=>{var r,o,n,s,t,l,u,g,f,c,h,m,_,P,v,I,w,C,b,S,x,$,k,F,D,T,z,A,Q,E,G,U,H,K,M,O,L,N,Y,j,B,J,W,X,Z,q,V,y,a;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const i={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],images:((r=e==null?void 0:e.images)==null?void 0:r.map(R=>{var d;return{label:R.label||"",roles:R.roles||[],url:((d=R.url)==null?void 0:d.replace(/^https?:\/\//,"//"))||""}}))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((s=(n=(o=e==null?void 0:e.price)==null?void 0:o.final)==null?void 0:n.amount)==null?void 0:s.value)||0,currency:((u=(l=(t=e==null?void 0:e.price)==null?void 0:t.final)==null?void 0:l.amount)==null?void 0:u.currency)||""}},regular:{amount:{value:((c=(f=(g=e==null?void 0:e.price)==null?void 0:g.regular)==null?void 0:f.amount)==null?void 0:c.value)||0,currency:((_=(m=(h=e==null?void 0:e.price)==null?void 0:h.regular)==null?void 0:m.amount)==null?void 0:_.currency)||""}},roles:((P=e==null?void 0:e.price)==null?void 0:P.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((C=(w=(I=(v=e==null?void 0:e.priceRange)==null?void 0:v.minimum)==null?void 0:I.final)==null?void 0:w.amount)==null?void 0:C.value)||0,currency:(($=(x=(S=(b=e==null?void 0:e.priceRange)==null?void 0:b.minimum)==null?void 0:S.final)==null?void 0:x.amount)==null?void 0:$.currency)||""}},regular:{amount:{value:((T=(D=(F=(k=e==null?void 0:e.priceRange)==null?void 0:k.minimum)==null?void 0:F.regular)==null?void 0:D.amount)==null?void 0:T.value)||0,currency:((E=(Q=(A=(z=e==null?void 0:e.priceRange)==null?void 0:z.minimum)==null?void 0:A.regular)==null?void 0:Q.amount)==null?void 0:E.currency)||""}}},maximum:{final:{amount:{value:((K=(H=(U=(G=e==null?void 0:e.priceRange)==null?void 0:G.maximum)==null?void 0:U.final)==null?void 0:H.amount)==null?void 0:K.value)||0,currency:((N=(L=(O=(M=e==null?void 0:e.priceRange)==null?void 0:M.maximum)==null?void 0:O.final)==null?void 0:L.amount)==null?void 0:N.currency)||""}},regular:{amount:{value:((J=(B=(j=(Y=e==null?void 0:e.priceRange)==null?void 0:Y.maximum)==null?void 0:j.regular)==null?void 0:B.amount)==null?void 0:J.value)||0,currency:((q=(Z=(X=(W=e==null?void 0:e.priceRange)==null?void 0:W.maximum)==null?void 0:X.regular)==null?void 0:Z.amount)==null?void 0:q.currency)||""}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return ee(i,(a=(y=(V=re.getConfig().models)==null?void 0:V.Product)==null?void 0:y.transformer)==null?void 0:a.call(y,e))};function fe(e,i){var n,s,t,l,u,g,f,c,h;const r=e==null?void 0:e.productSearch,o={facets:ye((r==null?void 0:r.facets)||[],i),items:(r==null?void 0:r.items.map(m=>ge(m==null?void 0:m.productView)))||[],pageInfo:{currentPage:((n=r==null?void 0:r.page_info)==null?void 0:n.current_page)||1,totalPages:((s=r==null?void 0:r.page_info)==null?void 0:s.total_pages)||1,totalItems:((t=r==null?void 0:r.page_info)==null?void 0:t.total_items)||0,pageSize:((l=r==null?void 0:r.page_info)==null?void 0:l.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0,metadata:{filterableAttributes:((u=e==null?void 0:e.attributeMetadata)==null?void 0:u.filterableInSearch)||[],sortableAttributes:he(((g=e==null?void 0:e.attributeMetadata)==null?void 0:g.sortable)||[],i)}};return ee(o,(h=(c=(f=re.getConfig().models)==null?void 0:f.ProductSearchResult)==null?void 0:c.transformer)==null?void 0:h.call(c,e))}function he(e=[],i){return!e||e.length===0?[]:e.filter(r=>{var o;return r.attribute==="position"?(o=i==null?void 0:i.filter)==null?void 0:o.some(s=>s.attribute==="categoryPath"):!0}).map(r=>({...r,bidirectional:r.attribute==="price"}))}function ye(e=[],i){var o;return!e||e.length===0?[]:((o=i==null?void 0:i.filter)==null?void 0:o.some(n=>n.attribute==="categoryPath"))?e.filter(n=>n.attribute!=="categories"):e}const Re=`
|
|
4
4
|
query productSearch(
|
|
5
5
|
$phrase: String!
|
|
6
6
|
$pageSize: Int
|
|
@@ -46,5 +46,5 @@ import{merge as ee}from"@dropins/tools/lib.js";import{c as re}from"./initialize.
|
|
|
46
46
|
}
|
|
47
47
|
${ne}
|
|
48
48
|
${ie}
|
|
49
|
-
`,
|
|
49
|
+
`,De=async(e,i={})=>{const r=i.scope==="search"?void 0:i.scope,o={request:e||{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[],metadata:{filterableAttributes:[],sortableAttributes:[]}}};if(e===null)return p.emit("search/result",o,{scope:r}),o.result;p.emit("search/loading",!0,{scope:r});try{const n=r==="popover"?oe:se,s=window.crypto.randomUUID();ue(n,s,e.phrase||"",e.filter||[],e.pageSize||0,e.currentPage||0,e.sort||[]),le(n);const{errors:t,data:l}=await pe(Re,{method:"GET",variables:{...e}});if(t&&!l)throw new Error("Error fetching product search");const u=fe(l,e);return te(n,s,u),ce(n),p.emit("search/result",{request:e,result:u},{scope:r}),u}catch(n){throw p.emit("search/error",n.message,{scope:r}),p.emit("search/result",o,{scope:r}),n}finally{p.emit("search/loading",!1,{scope:r})}};export{Se as a,$e as b,Fe as c,De as d,pe as f,ke as g,xe as r,be as s};
|
|
50
50
|
//# sourceMappingURL=search.js.map
|
package/chunks/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: data?.price?.regular?.amount?.currency || '',\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.regular?.amount?.currency || '',\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.regular?.amount?.currency || '',\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n return facets;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n}\n\nexport const search = async (request: SearchVariables | null, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n // Update search input context in ACDL\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n request.phrase || '',\n request.filter || [],\n request.pageSize || 0,\n request.currentPage || 0,\n request.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...request },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, request);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId)\n\n // Emit single event with result and metadata\n events.emit('search/result', { request, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","request","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: data?.price?.regular?.amount?.currency || '',\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.minimum?.regular?.amount?.currency || '',\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: data?.priceRange?.maximum?.regular?.amount?.currency || '',\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n return facets;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n}\n\nexport const search = async (request: SearchVariables | null, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n // Update search input context in ACDL\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n request.phrase || '',\n request.filter || [],\n request.pageSize || 0,\n request.currentPage || 0,\n request.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...request },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, request);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId)\n\n // Emit single event with result and metadata\n events.emit('search/result', { request, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","request","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
|
package/containers/Facets.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as L,jsx as a,Fragment as N}from"@dropins/tools/preact-jsx-runtime.js";import*as h from"@dropins/tools/preact-compat.js";import{useState as C,useEffect as j}from"@dropins/tools/preact-compat.js";import{classes as z,VComponent as E,Slot as y}from"@dropins/tools/lib.js";import{Button as R,Icon as b,PriceRange as A,Checkbox as T,RadioButton as V}from"@dropins/tools/components.js";/* empty css */import{useText as $}from"@dropins/tools/i18n.js";import{events as W}from"@dropins/tools/event-bus.js";import{
|
|
3
|
+
import{jsxs as L,jsx as a,Fragment as N}from"@dropins/tools/preact-jsx-runtime.js";import*as h from"@dropins/tools/preact-compat.js";import{useState as C,useEffect as j}from"@dropins/tools/preact-compat.js";import{classes as z,VComponent as E,Slot as y}from"@dropins/tools/lib.js";import{Button as R,Icon as b,PriceRange as A,Checkbox as T,RadioButton as V}from"@dropins/tools/components.js";/* empty css */import{useText as $}from"@dropins/tools/i18n.js";import{events as W}from"@dropins/tools/event-bus.js";import{d as H}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const Y=n=>h.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},h.createElement("g",{id:"Large"},h.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),h.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},h.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"}),h.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"})))),G=n=>h.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},h.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),h.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),J=n=>h.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},h.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1.5,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),K=({numberOfOptionsConfig:n=5,header:e,buckets:s,last:d})=>{const g=$({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),f=n,[p,u]=C(s.length<f),v=p?s.length:f;return L("div",{className:z(["product-discovery-facet",["product-discovery-facet--last",d]]),children:[a(E,{className:"product-discovery-facet__header",node:e}),s.slice(0,v).map((w,B)=>a(E,{className:"product-discovery-facet__bucket",node:w},B)),!p&&s.length>f&&a(R,{variant:"tertiary",icon:a(b,{source:Y,size:"24"}),onClick:()=>u(!p),children:g.showMore}),p&&s.length>f&&a(R,{variant:"tertiary",icon:a(b,{source:J,size:"24"}),onClick:()=>u(!p),children:g.showLess})]})},Q=({selectedFacets:n,facets:e})=>L(N,{children:[a(E,{className:"product-discovery-facet-list__selected-filters",node:n}),a(E,{className:"product-discovery-facet-list__facet-options",node:e})]}),X="no",Z="yes",I=n=>{const e=n.buckets.find(s=>s.selected);return e?{attribute:n.attribute,range:{from:e.from,to:e.to}}:null},ee=n=>{const e=n.buckets.reduce((s,d)=>(d.selected&&s.push(d.title),s),[]);return e.length===0?null:{attribute:n.attribute,in:e}},te=n=>{var e;switch((e=n.buckets[0])==null?void 0:e.__typename){case"RangeBucket":return I(n);case"ScalarBucket":case"CategoryView":return ee(n)}},ne=n=>{var s,d,g,f,p,u,v,w,B,k,x;const e=n[0];return(g=(d=(s=e==null?void 0:e.price)==null?void 0:s.regular)==null?void 0:d.amount)!=null&&g.currency?e.price.regular.amount.currency:(v=(u=(p=(f=e==null?void 0:e.priceRange)==null?void 0:f.minimum)==null?void 0:p.regular)==null?void 0:u.amount)!=null&&v.currency?(x=(k=(B=(w=e==null?void 0:e.priceRange)==null?void 0:w.minimum)==null?void 0:B.regular)==null?void 0:k.amount)==null?void 0:x.currency:"USD"},re=(n,e,s)=>(e==null?void 0:e.attribute)==="price"?n.from===0?L("div",{style:"display:flex",children:[a(A,{amount:n.from,currency:s||"USD"}),a("span",{style:"padding: 0 2px",children:"-"}),a(A,{amount:n.to,currency:s||"USD"})]}):a(A,{minimumAmount:n.from,maximumAmount:n.to,currency:s||"USD",display:"dash"}):n.title,ce=(n,e)=>n.title===X?`Not ${e.title}`:n.title===Z?e.title:n.title,O=(n,e,s)=>{switch(n.__typename){case"RangeBucket":return re(n,e,s);case"ScalarBucket":case"CategoryView":return ce(n,e)}},Fe=({scope:n,slots:e})=>{const s=$({clearAll:"Search.Facet.clearAll"}),[d,g]=C([]),[f,p]=C(null),[u,v]=C(),w=t=>{var o;const i=((o=u==null?void 0:u.filter)==null?void 0:o.filter(c=>c.attribute==="categoryPath"))||[];H({...t,filter:[...i,...t.filter||[]]},{scope:n})},B=t=>{if(!t||!t.result.facets&&!t.result.items&&!t.request.filter){g([]);return}v(t.request);const{facets:i,items:o}=t.result;p(ne(o));const c=t.request.filter;if(i){const r=i.map(l=>{const S=l.buckets.map(F=>{F.selected=!1;const m=c==null?void 0:c.find(_=>_.attribute===l.attribute);if(m){const _=m.range;(_&&F.from===_.from&&F.to===_.to||m.in&&m.in.includes(F.title))&&(F.selected=!0)}return F});return l.buckets=S,l});g(r)}},k=t=>{const i=d.map(c=>{const r=t.find(l=>l.attribute===c.attribute);return r||c}),o=i.reduce((c,r)=>{const l=te(r);return l&&c.push(l),c},[]);g(i),u&&w({...u,filter:o})},x=(t,i)=>{const o=t.buckets.map(r=>(r.title===i&&(r.selected=!1),r)),c=t;c.buckets=o,k([c])},q=()=>{const t=d.map(i=>{const o=i.buckets.map(c=>(c.selected=!1,c));return i.buckets=o,i});g(t),u&&w({...u,filter:[]})},M=(t,i)=>{const o=i.buckets.map(r=>{var l;return((l=i.buckets[0])==null?void 0:l.__typename)==="RangeBucket"&&(r.selected=!1),r.title===t.target.value&&(r.selected=t.target.checked),r}),c=i;c.buckets=o,k([c])},P=(t,i)=>{const o=a("span",{children:t.title}),c=t.buckets.map(r=>{var F;const l=O(r,t,f),S=m=>L(y,{name:"FacetBucketLabel",slot:e==null?void 0:e.FacetBucketLabel,context:{data:r},children:[l," ",m?`(${m})`:""]});switch((F=t.buckets[0])==null?void 0:F.__typename){case"RangeBucket":return a(y,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:r},children:a(V,{"data-testid":`${r.title}-radio`,label:S(),name:t.attribute,value:r.title,checked:r.selected,onChange:m=>{M(m,t)}})});case"ScalarBucket":case"CategoryView":return a(y,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:r},children:a(T,{"data-testid":`${r.title}-checkbox`,label:S(r.count),name:t.attribute,value:r.title,checked:r.selected,onChange:m=>{M(m,t)}})});default:return null}}).filter(r=>r!==null);return a(K,{header:o,buckets:c,last:i===d.length-1})},D=()=>a(y,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:d},children:d.map((t,i)=>t.buckets.length>0?a(N,{children:a(y,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:t},children:P(t,i)})}):null)}),U=()=>{const t=d.reduce((c,r)=>(r.buckets.filter(S=>S.selected).length>0&&c.push(r),c),[]),i=t.map(c=>c.buckets.map(r=>{if(r.selected){const l=O(r,c,f);return a(R,{"data-testid":`${r.title}-selected-btn`,"aria-label":`Remove ${c.title} filter: ${r.title}`,variant:"secondary",children:L(N,{children:[a("span",{children:l}),a(b,{source:G,size:"16"})]}),onClick:()=>{x(c,r.title)}})}return null})),o=i.length>0?a(R,{variant:"secondary",onClick:()=>{q()},children:a("span",{children:s.clearAll})}):null;return L(y,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:t},children:[i,o]})};return j(()=>{const t=W.on("search/result",B,{eager:!0,scope:n});return()=>{t==null||t.off()}},[]),a(Q,{selectedFacets:U(),facets:D()})};export{Fe as Facets,Fe as default};
|
|
4
4
|
//# sourceMappingURL=Facets.js.map
|
package/containers/Pagination.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as S}from"@dropins/tools/preact-jsx-runtime.js";import{useState as o,useEffect as b}from"@dropins/tools/preact-compat.js";import{Pagination as h}from"@dropins/tools/components.js";import{events as x}from"@dropins/tools/event-bus.js";import{
|
|
3
|
+
import{jsx as S}from"@dropins/tools/preact-jsx-runtime.js";import{useState as o,useEffect as b}from"@dropins/tools/preact-compat.js";import{Pagination as h}from"@dropins/tools/components.js";import{events as x}from"@dropins/tools/event-bus.js";import{d as I}from"../chunks/search.js";import"@dropins/tools/lib.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const A=({scope:s,onPageChange:r})=>{const[a,f]=o(),[n,l]=o(),[p,g]=o({});b(()=>{const t=x.on("search/result",e=>{var i,u,m,c;g(e.request),f((u=(i=e.result)==null?void 0:i.pageInfo)==null?void 0:u.currentPage),l((c=(m=e.result)==null?void 0:m.pageInfo)==null?void 0:c.totalPages)},{eager:!0,scope:s});return()=>{t==null||t.off()}},[]);const P=async t=>{r==null||r(t),I({...p,currentPage:t},{scope:s})};return!a||!n?null:S(h,{currentPage:a,totalPages:n,onChange:P})};export{A as Pagination,A as default};
|
|
4
4
|
//# sourceMappingURL=Pagination.js.map
|
package/containers/SortBy.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as g}from"@dropins/tools/preact-jsx-runtime.js";import{useState as n,useEffect as $}from"@dropins/tools/preact-compat.js";import{Picker as w}from"@dropins/tools/components.js";import{events as x}from"@dropins/tools/event-bus.js";import{
|
|
3
|
+
import{jsx as g}from"@dropins/tools/preact-jsx-runtime.js";import{useState as n,useEffect as $}from"@dropins/tools/preact-compat.js";import{Picker as w}from"@dropins/tools/components.js";import{events as x}from"@dropins/tools/event-bus.js";import{d}from"../chunks/search.js";import{useText as p}from"@dropins/tools/i18n.js";import"@dropins/tools/lib.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const j=({scope:t,onSortChange:e})=>{const r=p({sortLabel:"Search.SortBy.title",lowToHigh:"Search.SortBy.lowToHigh",highToLow:"Search.SortBy.highToLow"}),[s,u]=n([]),[f,S]=n("relevance_DESC"),[b,h]=n({});$(()=>{const i=x.on("search/result",o=>{var a,c;if(h(o.request),(c=(a=o.result)==null?void 0:a.metadata)!=null&&c.sortableAttributes&&(u([...o.result.metadata.sortableAttributes]),o.request.sort)){const l=L(o.request.sort);l&&S(l)}},{eager:!0,scope:t});return()=>{i==null||i.off()}},[]);const m=async i=>{e==null||e(i[0]),d({...b,sort:i,currentPage:1},{scope:t})};return g(w,{required:!0,floatingLabel:r.sortLabel,...T(s,r),value:f,handleSelect:i=>{const{value:o}=i.target,a=C(o);m(a)}})};function T(t,e){const r=[];return t.forEach((s,u)=>{s.bidirectional?r.splice(u+r.length,0,{text:`${s.label}: ${e.lowToHigh}`,value:`${s.attribute}_ASC`},{text:`${s.label}: ${e.highToLow}`,value:`${s.attribute}_DESC`}):r.splice(u+r.length,0,{text:s.label,value:`${s.attribute}_DESC`})}),{options:r}}function C(t){const e=t.indexOf("_");return[{attribute:t.substring(0,e),direction:t.substring(e+1)==="ASC"?"ASC":"DESC"}]}function L(t){return t.length>0&&t[0]?`${t[0].attribute}_${t[0].direction}`:""}export{j as SortBy,j as default};
|
|
4
4
|
//# sourceMappingURL=SortBy.js.map
|
package/containers/SortBy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SortBy.js","sources":["/@dropins/storefront-product-discovery/src/containers/SortBy/SortBy.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Picker } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Scope, SearchVariables, SortOrder } from '@/plp/data/models';\nimport { search } from '@/plp/api';\n\nexport interface SortByProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n onSortChange?: (value: SortOrder | null) => void;\n}\n\nexport const SortBy: Container<SortByProps> = ({ scope, onSortChange }) => {\n const labels = useText({\n sortLabel: 'Search.SortBy.title',\n lowToHigh: 'Search.SortBy.lowToHigh',\n highToLow: 'Search.SortBy.highToLow',\n });\n\n\n const [sortOptions, setSortOptions] = useState<any[]>([]);\n const [current, setCurrent] = useState('relevance_DESC');\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>({});\n\n useEffect(() => {\n // Listen for search results\n const searchEvent = events.on('search/result', (payload) => {\n setCurrentSearchVariables(payload.request);\n\n // Configure sort options from metadata\n if (payload.result?.metadata?.sortableAttributes) {\n setSortOptions([...payload.result.metadata.sortableAttributes]);\n\n // Set current sort value from request\n if (payload.request.sort) {\n const sortValue = getSortValue(payload.request.sort);\n\n if (sortValue) {\n setCurrent(sortValue);\n }\n }\n }\n }, { eager: true, scope });\n\n return () => {\n searchEvent?.off();\n };\n }, []);\n\n const handleSortChange = async (value: SortOrder[]): Promise<void> => {\n onSortChange?.(value[0]!);\n\n search({ ...currentSearchVariables, sort: value, currentPage: 1 }, { scope });\n };\n\n return (\n <Picker\n required\n floatingLabel={labels.sortLabel}\n {...getSortOptions(sortOptions, labels)}\n value={current}\n handleSelect={(event) => {\n const { value } = event.target as HTMLSelectElement;\n const next = getSortSearchVariables(value);\n handleSortChange(next);\n }}\n />\n );\n};\n\n/** Utility functions */\n\nfunction getSortOptions(sortOptions: any, labels: any): any {\n // if sortOption is bidirectional, then we need to add two options: lowToHigh and highToLow\n const options: any[] = [];\n \n sortOptions.forEach((option: any, index: number) => {\n if (option.bidirectional) {\n // Insert the two options at the current position\n options.splice(index + options.length, 0,\n { text: `${option.label}: ${labels.lowToHigh}`, value: `${option.attribute}_ASC` },\n { text: `${option.label}: ${labels.highToLow}`, value: `${option.attribute}_DESC` }\n );\n } else {\n // Add single option at the current position\n options.splice(index + options.length, 0,\n { text: option.label, value: `${option.attribute}_DESC` }\n );\n }\n });\n\n return { options };\n}\n\n\nfunction getSortSearchVariables(sortValue: string): SortOrder[] {\n const index = sortValue.indexOf('_');\n const newSort: SortOrder[] = [\n {\n attribute: sortValue.substring(0, index) as string,\n direction: sortValue.substring(index + 1) === 'ASC' ? 'ASC' : 'DESC',\n },\n ];\n return newSort;\n}\n\nfunction getSortValue(sort: SortOrder[]) {\n if (sort.length > 0 && sort[0]) {\n return `${sort[0].attribute}_${sort[0].direction}`;\n }\n return '';\n}\n"],"names":["SortBy","scope","onSortChange","labels","useText","sortOptions","setSortOptions","useState","current","setCurrent","currentSearchVariables","setCurrentSearchVariables","useEffect","searchEvent","events","payload","_b","_a","sortValue","getSortValue","handleSortChange","value","search","jsx","Picker","getSortOptions","event","next","getSortSearchVariables","options","option","index","sort"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SortBy.js","sources":["/@dropins/storefront-product-discovery/src/containers/SortBy/SortBy.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Picker } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Scope, SearchVariables, SortOrder } from '@/plp/data/models';\nimport { search } from '@/plp/api';\n\nexport interface SortByProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n onSortChange?: (value: SortOrder | null) => void;\n}\n\nexport const SortBy: Container<SortByProps> = ({ scope, onSortChange }) => {\n const labels = useText({\n sortLabel: 'Search.SortBy.title',\n lowToHigh: 'Search.SortBy.lowToHigh',\n highToLow: 'Search.SortBy.highToLow',\n });\n\n\n const [sortOptions, setSortOptions] = useState<any[]>([]);\n const [current, setCurrent] = useState('relevance_DESC');\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>({});\n\n useEffect(() => {\n // Listen for search results\n const searchEvent = events.on('search/result', (payload) => {\n setCurrentSearchVariables(payload.request);\n\n // Configure sort options from metadata\n if (payload.result?.metadata?.sortableAttributes) {\n setSortOptions([...payload.result.metadata.sortableAttributes]);\n\n // Set current sort value from request\n if (payload.request.sort) {\n const sortValue = getSortValue(payload.request.sort);\n\n if (sortValue) {\n setCurrent(sortValue);\n }\n }\n }\n }, { eager: true, scope });\n\n return () => {\n searchEvent?.off();\n };\n }, []);\n\n const handleSortChange = async (value: SortOrder[]): Promise<void> => {\n onSortChange?.(value[0]!);\n\n search({ ...currentSearchVariables, sort: value, currentPage: 1 }, { scope });\n };\n\n return (\n <Picker\n required\n floatingLabel={labels.sortLabel}\n {...getSortOptions(sortOptions, labels)}\n value={current}\n handleSelect={(event) => {\n const { value } = event.target as HTMLSelectElement;\n const next = getSortSearchVariables(value);\n handleSortChange(next);\n }}\n />\n );\n};\n\n/** Utility functions */\n\nfunction getSortOptions(sortOptions: any, labels: any): any {\n // if sortOption is bidirectional, then we need to add two options: lowToHigh and highToLow\n const options: any[] = [];\n \n sortOptions.forEach((option: any, index: number) => {\n if (option.bidirectional) {\n // Insert the two options at the current position\n options.splice(index + options.length, 0,\n { text: `${option.label}: ${labels.lowToHigh}`, value: `${option.attribute}_ASC` },\n { text: `${option.label}: ${labels.highToLow}`, value: `${option.attribute}_DESC` }\n );\n } else {\n // Add single option at the current position\n options.splice(index + options.length, 0,\n { text: option.label, value: `${option.attribute}_DESC` }\n );\n }\n });\n\n return { options };\n}\n\n\nfunction getSortSearchVariables(sortValue: string): SortOrder[] {\n const index = sortValue.indexOf('_');\n const newSort: SortOrder[] = [\n {\n attribute: sortValue.substring(0, index) as string,\n direction: sortValue.substring(index + 1) === 'ASC' ? 'ASC' : 'DESC',\n },\n ];\n return newSort;\n}\n\nfunction getSortValue(sort: SortOrder[]) {\n if (sort.length > 0 && sort[0]) {\n return `${sort[0].attribute}_${sort[0].direction}`;\n }\n return '';\n}\n"],"names":["SortBy","scope","onSortChange","labels","useText","sortOptions","setSortOptions","useState","current","setCurrent","currentSearchVariables","setCurrentSearchVariables","useEffect","searchEvent","events","payload","_b","_a","sortValue","getSortValue","handleSortChange","value","search","jsx","Picker","getSortOptions","event","next","getSortSearchVariables","options","option","index","sort"],"mappings":"keAsBO,MAAMA,EAAiC,CAAC,CAAE,MAAAC,EAAO,aAAAC,KAAmB,CACzE,MAAMC,EAASC,EAAQ,CACrB,UAAW,sBACX,UAAW,0BACX,UAAW,yBAAA,CACZ,EAGK,CAACC,EAAaC,CAAc,EAAIC,EAAgB,CAAA,CAAE,EAClD,CAACC,EAASC,CAAU,EAAIF,EAAS,gBAAgB,EACjD,CAACG,EAAwBC,CAAyB,EAAIJ,EAA0B,CAAA,CAAE,EAExFK,EAAU,IAAM,CAEd,MAAMC,EAAcC,EAAO,GAAG,gBAAkBC,GAAY,SAI1D,GAHAJ,EAA0BI,EAAQ,OAAO,GAGrCC,GAAAC,EAAAF,EAAQ,SAAR,YAAAE,EAAgB,WAAhB,MAAAD,EAA0B,qBAC5BV,EAAe,CAAC,GAAGS,EAAQ,OAAO,SAAS,kBAAkB,CAAC,EAG1DA,EAAQ,QAAQ,MAAM,CACxB,MAAMG,EAAYC,EAAaJ,EAAQ,QAAQ,IAAI,EAE/CG,GACFT,EAAWS,CAAS,CAExB,CAEJ,EAAG,CAAE,MAAO,GAAM,MAAAjB,EAAO,EAEzB,MAAO,IAAM,CACXY,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMO,EAAmB,MAAOC,GAAsC,CACpEnB,GAAA,MAAAA,EAAemB,EAAM,CAAC,GAEtBC,EAAO,CAAE,GAAGZ,EAAwB,KAAMW,EAAO,YAAa,CAAA,EAAK,CAAE,MAAApB,EAAO,CAC9E,EAEA,OACEsB,EAACC,EAAA,CACC,SAAQ,GACR,cAAerB,EAAO,UACrB,GAAGsB,EAAepB,EAAaF,CAAM,EACtC,MAAOK,EACP,aAAekB,GAAU,CACvB,KAAM,CAAE,MAAAL,GAAUK,EAAM,OAClBC,EAAOC,EAAuBP,CAAK,EACzCD,EAAiBO,CAAI,CACvB,CAAA,CAAA,CAGN,EAIA,SAASF,EAAepB,EAAkBF,EAAkB,CAE1D,MAAM0B,EAAiB,CAAA,EAEvB,OAAAxB,EAAY,QAAQ,CAACyB,EAAaC,IAAkB,CAC9CD,EAAO,cAETD,EAAQ,OAAOE,EAAQF,EAAQ,OAAQ,EACrC,CAAE,KAAM,GAAGC,EAAO,KAAK,KAAK3B,EAAO,SAAS,GAAI,MAAO,GAAG2B,EAAO,SAAS,MAAA,EAC1E,CAAE,KAAM,GAAGA,EAAO,KAAK,KAAK3B,EAAO,SAAS,GAAI,MAAO,GAAG2B,EAAO,SAAS,OAAA,CAAQ,EAIpFD,EAAQ,OAAOE,EAAQF,EAAQ,OAAQ,EACrC,CAAE,KAAMC,EAAO,MAAO,MAAO,GAAGA,EAAO,SAAS,OAAA,CAAQ,CAG9D,CAAC,EAEM,CAAE,QAAAD,CAAA,CACX,CAGA,SAASD,EAAuBV,EAAgC,CAC9D,MAAMa,EAAQb,EAAU,QAAQ,GAAG,EAOnC,MAN6B,CAC3B,CACE,UAAWA,EAAU,UAAU,EAAGa,CAAK,EACvC,UAAWb,EAAU,UAAUa,EAAQ,CAAC,IAAM,MAAQ,MAAQ,MAAA,CAChE,CAGJ,CAEA,SAASZ,EAAaa,EAAmB,CACvC,OAAIA,EAAK,OAAS,GAAKA,EAAK,CAAC,EACpB,GAAGA,EAAK,CAAC,EAAE,SAAS,IAAIA,EAAK,CAAC,EAAE,SAAS,GAE3C,EACT"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-product-discovery", "version": "2.
|
|
1
|
+
{"name": "@dropins/storefront-product-discovery", "version": "2.1.0-alpha001", "@dropins/tools": "^1.4.0", "license": "SEE LICENSE IN LICENSE.md"}
|