@dropins/storefront-quick-order 0.0.1-alpha1 → 0.1.2-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/getStoreConfig/getStoreConfig.d.ts +22 -0
- package/api/getStoreConfig/graphql/getStoreConfig.graphql.d.ts +18 -0
- package/api/getStoreConfig/index.d.ts +18 -0
- package/api/index.d.ts +1 -0
- package/api/initialize/initialize.d.ts +1 -0
- package/api.js +1 -1
- package/api.js.map +1 -1
- package/chunks/QuickOrderDisabledOverlay.js +4 -0
- package/chunks/QuickOrderDisabledOverlay.js.map +1 -0
- package/chunks/initialize.js +10 -0
- package/chunks/initialize.js.map +1 -0
- package/components/QuickOrderDisabledOverlay/QuickOrderDisabledOverlay.d.ts +5 -0
- package/components/QuickOrderDisabledOverlay/index.d.ts +19 -0
- package/components/QuickOrderNotificationBanner/QuickOrderNotificationBanner.d.ts +5 -0
- package/components/QuickOrderNotificationBanner/index.d.ts +19 -0
- package/components/index.d.ts +2 -0
- package/containers/QuickOrderCsvUpload.js +2 -2
- package/containers/QuickOrderCsvUpload.js.map +1 -1
- package/containers/QuickOrderItems.js +1 -1
- package/containers/QuickOrderItems.js.map +1 -1
- package/containers/QuickOrderMultipleSku.js +1 -1
- package/containers/QuickOrderMultipleSku.js.map +1 -1
- package/hooks/index.d.ts +1 -0
- package/hooks/useQuickOrderItems.d.ts +1 -1
- package/hooks/useSearch.d.ts +27 -0
- package/i18n/en_US.json.d.ts +9 -1
- package/lib/fetch-error.d.ts +21 -0
- package/lib/index.d.ts +1 -0
- package/lib/isItemValid.d.ts +9 -0
- package/lib/network-error.d.ts +22 -0
- package/lib/searchKeyboardNavigation.d.ts +19 -12
- package/lib/validateOrderItems.d.ts +28 -0
- package/package.json +1 -1
- package/render.js +2 -3
- package/render.js.map +1 -1
- package/types/index.d.ts +2 -0
- package/types/quickOrderCsvUpload.types.d.ts +1 -0
- package/types/quickOrderDisabledOverlay.types.d.ts +22 -0
- package/types/quickOrderItems.types.d.ts +16 -4
- package/types/quickOrderMultipleSku.types.d.ts +1 -0
- package/types/quickOrderNotificationBanner.types.d.ts +33 -0
- package/chunks/CsvFileInput.js +0 -4
- package/chunks/CsvFileInput.js.map +0 -1
- package/chunks/Search.js +0 -4
- package/chunks/Search.js.map +0 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/********************************************************************
|
|
2
|
+
* ADOBE CONFIDENTIAL
|
|
3
|
+
* __________________
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2024 Adobe
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* NOTICE: All information contained herein is, and remains
|
|
9
|
+
* the property of Adobe and its suppliers, if any. The intellectual
|
|
10
|
+
* and technical concepts contained herein are proprietary to Adobe
|
|
11
|
+
* and its suppliers and are protected by all applicable intellectual
|
|
12
|
+
* property laws, including trade secret and copyright laws.
|
|
13
|
+
* Dissemination of this information or reproduction of this material
|
|
14
|
+
* is strictly forbidden unless prior written permission is obtained
|
|
15
|
+
* from Adobe.
|
|
16
|
+
*******************************************************************/
|
|
17
|
+
export declare const getStoreConfig: () => Promise<{
|
|
18
|
+
storeConfig: {
|
|
19
|
+
quickOrderActive: boolean;
|
|
20
|
+
};
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=getStoreConfig.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/********************************************************************
|
|
2
|
+
* ADOBE CONFIDENTIAL
|
|
3
|
+
* __________________
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2024 Adobe
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* NOTICE: All information contained herein is, and remains
|
|
9
|
+
* the property of Adobe and its suppliers, if any. The intellectual
|
|
10
|
+
* and technical concepts contained herein are proprietary to Adobe
|
|
11
|
+
* and its suppliers and are protected by all applicable intellectual
|
|
12
|
+
* property laws, including trade secret and copyright laws.
|
|
13
|
+
* Dissemination of this information or reproduction of this material
|
|
14
|
+
* is strictly forbidden unless prior written permission is obtained
|
|
15
|
+
* from Adobe.
|
|
16
|
+
*******************************************************************/
|
|
17
|
+
export declare const GET_STORE_CONFIG = "\n query GET_STORE_CONFIG {\n storeConfig {\n quickorder_active\n }\n }\n";
|
|
18
|
+
//# sourceMappingURL=getStoreConfig.graphql.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/********************************************************************
|
|
2
|
+
* ADOBE CONFIDENTIAL
|
|
3
|
+
* __________________
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2024 Adobe
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* NOTICE: All information contained herein is, and remains
|
|
9
|
+
* the property of Adobe and its suppliers, if any. The intellectual
|
|
10
|
+
* and technical concepts contained herein are proprietary to Adobe
|
|
11
|
+
* and its suppliers and are protected by all applicable intellectual
|
|
12
|
+
* property laws, including trade secret and copyright laws.
|
|
13
|
+
* Dissemination of this information or reproduction of this material
|
|
14
|
+
* is strictly forbidden unless prior written permission is obtained
|
|
15
|
+
* from Adobe.
|
|
16
|
+
*******************************************************************/
|
|
17
|
+
export * from './getStoreConfig';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
package/api/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { Lang } from '@dropins/tools/types/elsie/src/i18n';
|
|
|
3
3
|
|
|
4
4
|
type ConfigProps = {
|
|
5
5
|
langDefinitions?: Lang;
|
|
6
|
+
quickOrderActive?: boolean;
|
|
6
7
|
};
|
|
7
8
|
export declare const initialize: Initializer<ConfigProps>;
|
|
8
9
|
export declare const config: import('@dropins/tools/types/elsie/src/lib').Config<ConfigProps>;
|
package/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{
|
|
3
|
+
import{c as i,f as o,g as p,a as h,i as c,r as f,s as g,b as n,d}from"./chunks/initialize.js";import"@dropins/tools/lib.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";export{i as config,o as fetchGraphQl,p as getConfig,h as getStoreConfig,c as initialize,f as removeFetchGraphQlHeader,g as setEndpoint,n as setFetchGraphQlHeader,d as setFetchGraphQlHeaders};
|
|
4
4
|
//# sourceMappingURL=api.js.map
|
package/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":[
|
|
1
|
+
{"version":3,"file":"api.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
|
+
All Rights Reserved. */
|
|
3
|
+
import{jsxs as w,jsx as t,Fragment as Q}from"@dropins/tools/preact-jsx-runtime.js";import{memo as F,useCallback as O,useState as V,useRef as D,useEffect as P,useMemo as L}from"@dropins/tools/preact-compat.js";import{InputFile as J,CartList as X,Divider as Y,Button as Z,CartItem as W,AccordionSection as U,Input as ee}from"@dropins/tools/components.js";import{Slot as T}from"@dropins/tools/lib.js";import{useState as H,useRef as re,useEffect as j,useMemo as te,useCallback as M}from"@dropins/tools/preact-hooks.js";import{events as ae}from"@dropins/tools/event-bus.js";const K=e=>e.reduce((a,s)=>{if(!s)return a;if(typeof s=="string"&&(a+=` ${s}`),Array.isArray(s)){const[o,n]=s;o&&n&&(a+=` ${o}`)}return a},"").trim(),se=({t:e,onFileUpload:r,error:a,fileName:s,onDownloadSample:o,showSampleDownload:n,disabled:l})=>{const u=O(m=>{var h;const b=(h=m.target.files)==null?void 0:h[0];b&&r(b)},[r]);return w("div",{className:"b2b-quick-order-csv-file-input",children:[t("div",{className:"b2b-quick-order-csv-file-input__title",children:e.title}),w("div",{className:"b2b-quick-order-csv-file-input__helper",children:[e.helperText,n&&t(Q,{children:t("button",{type:"button",className:"b2b-quick-order-csv-file-input__download-link",onClick:o,"data-testid":"download-sample",disabled:l,children:e.downloadSample})})]}),t("div",{className:`b2b-quick-order-csv-file-input__input-wrapper ${l?"b2b-quick-order-csv-file-input__input-wrapper--disabled":""}`,children:t(J,{id:"quick-order-csv-file-input",label:e.inputLabel,className:"b2b-quick-order-csv-file-input__input",onChange:u,accept:".csv",disabled:l})}),s&&w("div",{className:"b2b-quick-order-csv-file-input__file-name","data-testid":"file-name",children:[e.selectedFile,": ",s]}),a&&t("div",{className:"b2b-quick-order-csv-file-input__error","data-testid":"error-message",role:"alert",children:a})]})},$e=F(se),ne=(e,r)=>{let a;return function(...s){clearTimeout(a),a=setTimeout(()=>e.apply(this,s),r)}},ce=[{attribute:"visibility",in:["Search","Catalog, Search"]}],ie=e=>{const{containerRef:r,itemSelected:a,initialValue:s,currentValue:o,onValueRestore:n,onClose:l}=e,u=document.activeElement;(r==null?void 0:r.contains(u))||(l(),!a&&s!==o&&n(s))},le=(e,r=150)=>window.setTimeout(()=>{ie(e)},r),x=e=>{e&&clearTimeout(e)},ue=(e,r)=>r===0?-1:e<r-1?e+1:e,oe=e=>e>0?e-1:-1,de=()=>0,he=e=>Math.max(0,e-1),pe=(e,r,a)=>e>=0&&r[e]?(a(r[e]),!0):!1,be=(e,r,a,s)=>{a(e),s(),r&&"blur"in r&&typeof r.blur=="function"&&r.blur()},z=({productsSearch:e,initialSku:r,replaceItemSku:a,searchFilter:s=ce})=>{const[o,n]=H(r),[l,u]=H([]),[c,m]=H(!1),d=re(!0);j(()=>()=>{d.current=!1},[]),j(()=>{c||n(r)},[r,c]);const b=te(()=>ne(async f=>{if(!f||!e){d.current&&u([]);return}try{const k=await e({phrase:f,filter:s});d.current&&u(k.items||[])}catch(k){console.error("Error searching products:",k),d.current&&u([])}},300),[e,s]),h=M(f=>{const v=f.target.value;n(v),m(!0),b(v)},[b]),q=M(()=>{n(""),u([]),m(!1)},[]),y=M(f=>{const k={sku:f.sku,...f.variantSku&&{variantSku:f.variantSku},quantity:1,...a&&{replaceItemSku:a}};ae.emit("quick-order/add-items",[k]),q()},[a,q]);return{searchValue:o,searchResults:l,handleSearchChange:h,shouldShowResults:c,resetSearch:q,handleItemClick:y}},fe=({value:e,onChange:r,items:a,shouldShowResults:s=!0,onItemClick:o})=>{const[n,l]=V(-1),[u,c]=V(""),[m,d]=V(!1),[b,h]=V(!1),q=D(`search-results-${Math.random().toString(36).substr(2,9)}`),y=D(null),f=D([]),k=D(null),v=D(null),S=!!e&&!b,_=s&&S&&a.length>0,$=s&&S&&a.length===0;P(()=>{l(-1)},[a]),P(()=>()=>{x(v.current)},[]),P(()=>{if(n>=0&&f.current[n]){const p=f.current[n];p&&typeof p.scrollIntoView=="function"&&p.scrollIntoView({behavior:"smooth",block:"nearest"})}},[n]);const g=O(p=>{b&&h(!1),r==null||r(p)},[r,b]),N=O(p=>()=>{d(!0),h(!0),o==null||o(p),l(-1)},[o]),E=O(()=>{x(v.current),v.current=null,c(e||""),d(!1),h(!1)},[e]),B=O(()=>{v.current=le({containerRef:k.current,itemSelected:m,initialValue:u,currentValue:e||"",onValueRestore:p=>{r==null||r({target:{value:p}})},onClose:()=>{h(!0)}})},[m,u,e,r]),C=O(p=>{if(_)switch(p.key){case"ArrowDown":p.preventDefault(),l(i=>ue(i,a.length));break;case"ArrowUp":p.preventDefault(),l(i=>oe(i));break;case"Home":_&&a.length>0&&(p.preventDefault(),l(de()));break;case"End":_&&a.length>0&&(p.preventDefault(),l(he(a.length)));break;case"Tab":x(v.current),v.current=null,h(!0),r==null||r({target:{value:u}});break;case"Enter":{pe(n,a,A=>{d(!0),h(!0),o==null||o(A),l(-1)})&&p.preventDefault();break}case"Escape":p.preventDefault(),be(u,y.current,i=>{r==null||r({target:{value:i}}),l(-1),h(!0)},()=>{h(!0)});break}},[_,a,n,o,r,u]),I=O(()=>{if(n>=0&&_)return`${q.current}-item-${n}`},[n,_]);return{activeIndex:n,showResults:_,showEmptyState:$,resultsId:q,inputRef:y,itemRefs:f,containerRef:k,handleChange:g,handleFocus:E,handleBlur:B,handleKeyDown:C,createItemClickHandler:N,getActiveDescendant:I}},me=({t:e,items:r,onRemove:a,clearItems:s,onUpdateQuantity:o,slots:n,handleAddToCart:l,isItemUpdating:u,loading:c,isDisabledButton:m,productsSearch:d,searchFilter:b})=>{const{searchValue:h,searchResults:q,handleSearchChange:y,shouldShowResults:f,handleItemClick:k}=z({productsSearch:d,initialSku:"",searchFilter:b});return w("div",{className:K(["b2b-quick-order-form-quick-order-items-list"]),role:"region","aria-label":e.title,children:[t("div",{className:"b2b-quick-order-form-quick-order-items-list__title",children:e.title}),r.length>0&&w(Q,{children:[t(X,{role:"list",className:"b2b-quick-order-form-quick-order-items-list__list",children:r.map(v=>t(ve,{item:v,t:e,onRemove:a,onUpdateQuantity:o,isUpdating:u==null?void 0:u(v.sku),loading:c,productsSearch:d,searchFilter:b,slots:n},v.sku))}),t(Y,{variant:"secondary"})]}),t("div",{className:"b2b-quick-order-form-quick-order-items-list__global-search",children:t(G,{t:e,onChange:y,items:q,value:h,shouldShowResults:f,onItemClick:k,className:"b2b-quick-order-form-quick-order-items-list__search"})}),r.length===0&&t("div",{className:"b2b-quick-order-form-quick-order-items-list__empty","data-testid":"empty-items",children:e.emptyList}),t(T,{slot:n==null?void 0:n.AddAllToCartButton,name:"AddAllToCartButton",context:{handleAddToCart:l,clearItems:s,loading:c,isDisabledButton:m},"data-testid":"addAllToCart",children:t("div",{className:"b2b-quick-order-form-quick-order-items-list__actions",children:t(Z,{variant:"primary",onClick:l,"data-testid":"add-all-to-cart-button",disabled:c||m,children:e.addAllToCart})})})]})},Ee=F(me),ke=({item:e,t:r,onRemove:a,onUpdateQuantity:s,isUpdating:o,loading:n,productsSearch:l,searchFilter:u,slots:c})=>{var I,p;const m=`quick-order-item-${e.id||e.variantSku||e.sku}`,d=(e==null?void 0:e.variantSku)??(e==null?void 0:e.sku),{searchValue:b,searchResults:h,handleSearchChange:q,shouldShowResults:y,handleItemClick:f}=z({productsSearch:l,initialSku:d,replaceItemSku:e.sku,searchFilter:u}),k=`form-${e.id||d}`,v=e.inStock&&e.addToCartAllowed,S=e.options&&e.options.length>0,_=L(()=>S&&e.options.some(i=>i.required),[S,e.options]),$=L(()=>S&&e.options.some(i=>i.items&&i.items.some(A=>A.selected)),[S,e.options]),g=L(()=>_?e.options.every(i=>i.required?i.items&&i.items.some(A=>A.selected):!0):$,[_,$,e.options]),N=L(()=>{var i;return(i=e.images)==null?void 0:i.find(A=>{var R;return(R=A.roles)==null?void 0:R.includes("image")})},[e.images]),E=O(()=>{a==null||a(e.id||e.sku)},[a,e.id,e.sku]),B=O(i=>{s==null||s(e.sku,i);const A=document.forms[k];if(A){const R=A.querySelector('input[name="quantity"]');R&&(R.value=String(i))}},[s,e.sku,k]),C=t(T,{name:"QuickOrderItemSearch",slot:c==null?void 0:c.QuickOrderItemSearch,context:{item:e,scope:m,handleSearchChange:q,searchResults:h,searchValue:b,shouldShowResults:y,handleItemClick:f},children:t(G,{t:r,onChange:q,items:h,value:b,shouldShowResults:y,className:"b2b-quick-order-form-quick-order-items__item-search",onItemClick:f,slots:c})});return!e.name&&!((I=e.images)!=null&&I.length)?w("form",{name:k,className:"b2b-quick-order-form-quick-order-items__item-form",onSubmit:i=>i.preventDefault(),"data-sku":e.sku,children:[t("input",{type:"hidden",name:"sku",value:e.sku}),t("input",{type:"hidden",name:"quantity",value:e.quantity}),t("input",{type:"hidden",name:"valid",value:"false"}),t("input",{type:"hidden",name:"productType",value:""}),C,t(W,{sku:t("span",{children:e.sku}),title:t("span",{children:r.productNotFound}),quantity:e.quantity,alert:t("div",{className:"b2b-quick-order-items__error",children:(p=r.productNotFoundDescription)==null?void 0:p.replace("{sku}",e.sku)}),disabled:n,onRemove:E,ariaLabel:`${r.productNotFound} - ${e.sku}`})]},e.sku):w("form",{name:k,className:"b2b-quick-order-form-quick-order-items__item-form",onSubmit:i=>i.preventDefault(),"data-sku":d,children:[t("input",{type:"hidden",name:"sku",value:d}),t("input",{type:"hidden",name:"quantity",value:e.quantity}),t("input",{type:"hidden",name:"valid",value:v?"true":"false"}),t("input",{type:"hidden",name:"productType",value:e.productType||""}),C,t(W,{title:t("span",{children:e.name}),sku:t("span",{children:d}),image:N?t("img",{src:N.url,alt:N.label||e.name}):void 0,price:t(T,{name:"ProductPrice",slot:c==null?void 0:c.ProductPrice,context:{item:e,scope:m}}),quantity:e.quantity,alert:e.inStock===!1?t("div",{className:"b2b-quick-order-items__alert",children:r.outOfStock}):void 0,warning:S&&!g?t("div",{className:"b2b-quick-order-items__warning",children:r.configurableOptionsWarning}):void 0,footer:S?t(U,{title:r.productOptions,ariaLabelTitle:r.productOptions,defaultOpen:!g,className:"b2b-quick-order-list-item__accordion",actionIconPosition:"left",children:t(T,{name:"ProductOptions",slot:c==null?void 0:c.ProductOptions,context:{item:e,scope:m},children:t("div",{className:"b2b-quick-order-items__configurable-error",children:r.configurableProductErrorDescription})})}):void 0,updating:o,disabled:n,loading:n,onRemove:E,onQuantity:B,ariaLabel:`${e.name} - ${e.sku}`})]},d)},ve=F(ke),qe={cursor:"pointer"},_e={cursor:"default"},ye=({t:e,value:r,onChange:a,items:s,shouldShowResults:o=!0,className:n,onItemClick:l,slots:u})=>{const{activeIndex:c,showResults:m,showEmptyState:d,resultsId:b,inputRef:h,itemRefs:q,containerRef:y,handleChange:f,handleFocus:k,handleBlur:v,handleKeyDown:S,createItemClickHandler:_,getActiveDescendant:$}=fe({value:r,onChange:a,items:s,shouldShowResults:o,onItemClick:l});return w("div",{ref:y,className:K(["b2b-quick-order-search",n]),children:[t(ee,{ref:h,className:"b2b-quick-order-search__input",value:r,onChange:f,onFocus:k,onBlur:v,placeholder:e.searchPlaceholder,"aria-label":e.searchAriaLabel,role:"combobox","aria-autocomplete":"list","aria-expanded":m,"aria-controls":b.current,"aria-activedescendant":$(),onKeyDown:S}),m&&t("div",{id:b.current,role:"listbox",className:"b2b-quick-order-search__results","aria-label":e.searchAriaLabel,children:s.map((g,N)=>t(T,{slot:u==null?void 0:u.QuickOrderSearchAutocompleteItem,name:"QuickOrderSearchAutocompleteItem",context:{item:g,index:N,createItemClickHandler:_,activeIndex:c},children:t("div",{id:`${b.current}-item-${N}`,ref:E=>q.current[N]=E,role:"option","aria-selected":N===c,className:K(["b2b-quick-order-search__result-item",N===c&&"b2b-quick-order-search__result-item--active"]),onClick:_(g),style:l?qe:_e,children:`${g.sku} ${g.name}`})},g.sku))}),d&&t("div",{className:"b2b-quick-order-search__empty-state",role:"status","aria-live":"polite",children:e.searchEmptyState}),m&&w("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:[s.length," ",s.length===1?e.resultAvailable:e.resultsAvailable,"."," ",e.srInstructions]})]})},G=F(ye),Re=({isDisabled:e,message:r,children:a})=>w("div",{className:"b2b-quick-order-disabled-overlay",children:[t("div",{className:"b2b-quick-order-disabled-overlay__content",style:{pointerEvents:e?"none":"auto"},children:a}),e&&w(Q,{children:[t("div",{className:"b2b-quick-order-disabled-overlay__blur"}),t("div",{className:"b2b-quick-order-disabled-overlay__message",children:r})]})]});export{$e as C,Re as Q,Ee as a,K as c,ne as d};
|
|
4
|
+
//# sourceMappingURL=QuickOrderDisabledOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuickOrderDisabledOverlay.js","sources":["../../node_modules/@adobe-commerce/elsie/src/lib/classes.ts","/@dropins/storefront-quick-order/src/components/CsvFileInput/CsvFileInput.tsx","../../node_modules/@adobe-commerce/elsie/src/lib/debounce.ts","/@dropins/storefront-quick-order/src/configs/search-filter.config.ts","/@dropins/storefront-quick-order/src/lib/searchBlurHandler.ts","/@dropins/storefront-quick-order/src/lib/searchKeyboardNavigation.ts","/@dropins/storefront-quick-order/src/hooks/useItemSearch.tsx","/@dropins/storefront-quick-order/src/hooks/useSearch.tsx","/@dropins/storefront-quick-order/src/components/QuickOrderItemsList/QuickOrderItemsList.tsx","/@dropins/storefront-quick-order/src/components/QuickOrderListItem/QuickOrderListItem.tsx","/@dropins/storefront-quick-order/src/components/Search/Search.tsx","/@dropins/storefront-quick-order/src/components/QuickOrderDisabledOverlay/QuickOrderDisabledOverlay.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2024 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\n// @ts-ignore\nimport { JSXInternal } from 'preact/src/jsx';\n\ntype ClassName = string | JSXInternal.SignalLike<string | undefined>;\n\nexport const classes = (\n classes: Array<ClassName | [ClassName, boolean] | undefined>\n) => {\n const result = classes.reduce((result, item) => {\n if (!item) return result;\n\n if (typeof item === 'string') result += ` ${item}`;\n\n if (Array.isArray(item)) {\n const [className, isActive] = item;\n if (className && isActive) {\n result += ` ${className}`;\n }\n }\n\n return result;\n }, '') as string;\n\n return result.trim();\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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, useCallback, memo } from 'preact/compat';\nimport { InputFile } from '@adobe-commerce/elsie/components';\nimport { CsvFileInputProps } from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport '@/b2b-quick-order/components/CsvFileInput/CsvFileInput.css';\n\nconst CsvFileInputComponent: FunctionComponent<CsvFileInputProps> = ({\n t,\n onFileUpload,\n error,\n fileName,\n onDownloadSample,\n showSampleDownload,\n disabled,\n}) => {\n const handleFileChange = useCallback(\n (e: Event) => {\n const target = e.target as HTMLInputElement;\n const file = target.files?.[0];\n if (file) {\n onFileUpload(file);\n }\n },\n [onFileUpload]\n );\n\n const inputClassName = 'b2b-quick-order-csv-file-input__input';\n\n return (\n <div className=\"b2b-quick-order-csv-file-input\">\n <div className=\"b2b-quick-order-csv-file-input__title\">{t.title}</div>\n\n <div className=\"b2b-quick-order-csv-file-input__helper\">\n {t.helperText}\n {showSampleDownload && (\n <>\n <button\n type=\"button\"\n className=\"b2b-quick-order-csv-file-input__download-link\"\n onClick={onDownloadSample}\n data-testid=\"download-sample\"\n disabled={disabled}\n >\n {t.downloadSample}\n </button>\n </>\n )}\n </div>\n\n <div\n className={`b2b-quick-order-csv-file-input__input-wrapper ${\n disabled\n ? 'b2b-quick-order-csv-file-input__input-wrapper--disabled'\n : ''\n }`}\n >\n <InputFile\n id={'quick-order-csv-file-input'}\n label={t.inputLabel}\n className={inputClassName}\n onChange={handleFileChange}\n accept={'.csv'}\n disabled={disabled}\n />\n </div>\n\n {fileName && (\n <div\n className=\"b2b-quick-order-csv-file-input__file-name\"\n data-testid=\"file-name\"\n >\n {t.selectedFile}: {fileName}\n </div>\n )}\n\n {error && (\n <div\n className=\"b2b-quick-order-csv-file-input__error\"\n data-testid=\"error-message\"\n role=\"alert\"\n >\n {error}\n </div>\n )}\n </div>\n );\n};\n\nexport const CsvFileInput = memo(CsvFileInputComponent);\n","/********************************************************************\n * Copyright 2024 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\nexport const debounce = (fn: Function, ms: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n return function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n};\n","export const SEARCH_FILTER = [\n {\n attribute: 'visibility',\n in: ['Search', 'Catalog, Search'],\n },\n];\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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\nexport interface BlurHandlerOptions {\n containerRef: HTMLElement | null;\n itemSelected: boolean;\n initialValue: string;\n currentValue: string;\n onValueRestore: (value: string) => void;\n onClose: () => void;\n}\n\n/**\n * Handles blur logic for search component\n * Checks if focus moved outside component and restores initial value if needed\n */\nexport const handleSearchBlur = (options: BlurHandlerOptions): void => {\n const {\n containerRef,\n itemSelected,\n initialValue,\n currentValue,\n onValueRestore,\n onClose,\n } = options;\n\n const activeElement = document.activeElement;\n const isWithinComponent = containerRef?.contains(activeElement);\n\n if (!isWithinComponent) {\n onClose();\n\n if (!itemSelected && initialValue !== currentValue) {\n onValueRestore(initialValue);\n }\n }\n};\n\n/**\n * Creates a blur handler with timeout\n */\nexport const createBlurHandler = (\n options: BlurHandlerOptions,\n delay: number = 150\n): number => {\n return window.setTimeout(() => {\n handleSearchBlur(options);\n }, delay);\n};\n\n/**\n * Clears blur timeout if exists\n */\nexport const clearBlurTimeout = (timeoutRef: number | null): void => {\n if (timeoutRef) {\n clearTimeout(timeoutRef);\n }\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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\n/**\n * WCAG 2.1 compliant keyboard navigation for combobox with listbox pattern.\n * Focus always remains on the input element, visual indication via aria-activedescendant.\n * Reference: https://www.w3.org/WAI/ARIA/apg/patterns/combobox/\n */\n\n/**\n * Calculates next active index when ArrowDown is pressed\n * Returns next index in list or current if at end\n */\nexport const handleArrowDown = (\n currentIndex: number,\n itemsLength: number\n): number => {\n if (itemsLength === 0) return -1;\n return currentIndex < itemsLength - 1 ? currentIndex + 1 : currentIndex;\n};\n\n/**\n * Calculates next active index when ArrowUp is pressed\n * Returns previous index or -1 to return focus to input\n */\nexport const handleArrowUp = (currentIndex: number): number => {\n return currentIndex > 0 ? currentIndex - 1 : -1;\n};\n\n/**\n * Moves visual focus to first item in list (Home key)\n */\nexport const handleHomeKey = (): number => {\n return 0;\n};\n\n/**\n * Moves visual focus to last item in list (End key)\n */\nexport const handleEndKey = (itemsLength: number): number => {\n return Math.max(0, itemsLength - 1);\n};\n\n/**\n * Handles Enter key press on active item\n * Returns true if item was selected, false otherwise\n */\nexport const handleEnterKey = <T>(\n activeIndex: number,\n items: T[],\n onItemSelect: (item: T) => void\n): boolean => {\n if (activeIndex >= 0 && items[activeIndex]) {\n onItemSelect(items[activeIndex]);\n return true;\n }\n return false;\n};\n\n/**\n * Handles Escape key press - restores initial value and closes results\n */\nexport const handleEscapeKey = (\n initialValue: string,\n inputRef: HTMLElement | null,\n onValueRestore: (value: string) => void,\n onClose: () => void\n): void => {\n onValueRestore(initialValue);\n onClose();\n if (inputRef && 'blur' in inputRef && typeof inputRef.blur === 'function') {\n inputRef.blur();\n }\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 {\n useCallback,\n useState,\n useMemo,\n useRef,\n useEffect,\n} from 'preact/hooks';\nimport { debounce } from '@adobe-commerce/elsie/lib/debounce';\nimport { OrderItem, UseItemSearchProps } from '@/b2b-quick-order/types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { SEARCH_FILTER } from '@/b2b-quick-order/configs';\n\nexport const useItemSearch = ({\n productsSearch,\n initialSku,\n replaceItemSku,\n searchFilter = SEARCH_FILTER,\n}: UseItemSearchProps) => {\n const [searchValue, setSearchValue] = useState(initialSku);\n const [searchResults, setSearchResults] = useState<OrderItem[]>([]);\n const [isTouched, setIsTouched] = useState(false);\n\n // Track if component is mounted to prevent state updates after unmount\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Update search value when initialSku changes (e.g., after merge)\n useEffect(() => {\n if (!isTouched) {\n setSearchValue(initialSku);\n }\n }, [initialSku, isTouched]);\n\n const debouncedSearch = useMemo(\n () =>\n debounce(async (searchTerm: string) => {\n if (!searchTerm || !productsSearch) {\n if (isMountedRef.current) {\n setSearchResults([]);\n }\n return;\n }\n\n try {\n const result = await productsSearch({\n phrase: searchTerm,\n filter: searchFilter,\n });\n if (isMountedRef.current) {\n setSearchResults(result.items || []);\n }\n } catch (error) {\n console.error('Error searching products:', error);\n if (isMountedRef.current) {\n setSearchResults([]);\n }\n }\n }, 300),\n [productsSearch, searchFilter]\n );\n\n const handleSearchChange = useCallback(\n (e: Event) => {\n const target = e.target as HTMLInputElement;\n const value = target.value;\n setSearchValue(value);\n setIsTouched(true);\n debouncedSearch(value);\n },\n [debouncedSearch]\n );\n\n const resetSearch = useCallback(() => {\n setSearchValue('');\n setSearchResults([]);\n setIsTouched(false);\n }, []);\n\n const handleItemClick = useCallback(\n (clickedItem: OrderItem) => {\n // Build item data for emission\n // Just send the data as-is from the search result\n // The deduplication logic will handle matching correctly\n const itemData = {\n sku: clickedItem.sku,\n ...(clickedItem.variantSku && { variantSku: clickedItem.variantSku }),\n quantity: 1,\n ...(replaceItemSku && { replaceItemSku }),\n };\n\n events.emit('quick-order/add-items', [itemData]);\n resetSearch();\n },\n [replaceItemSku, resetSearch]\n );\n\n return {\n searchValue,\n searchResults,\n handleSearchChange,\n shouldShowResults: isTouched,\n resetSearch,\n handleItemClick,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 React, { useCallback, useState, useRef, useEffect } from 'preact/compat';\nimport { SearchItem } from '@/b2b-quick-order/types/search.types';\nimport {\n createBlurHandler,\n clearBlurTimeout,\n handleArrowDown,\n handleArrowUp,\n handleEnterKey,\n handleEscapeKey,\n handleHomeKey,\n handleEndKey,\n} from '@/b2b-quick-order/lib';\n\nexport interface UseSearchOptions<T extends SearchItem> {\n value: string;\n onChange?: (e: any) => void;\n items: T[];\n shouldShowResults?: boolean;\n onItemClick?: (item: T) => void;\n}\n\nexport interface UseSearchReturn<T extends SearchItem> {\n // State\n activeIndex: number;\n showResults: boolean;\n showEmptyState: boolean;\n\n // Refs\n resultsId: React.MutableRefObject<string>;\n inputRef: React.RefObject<HTMLInputElement>;\n itemRefs: React.MutableRefObject<(HTMLDivElement | null)[]>;\n containerRef: React.RefObject<HTMLDivElement>;\n\n // Handlers\n handleChange: (e: any) => void;\n handleFocus: () => void;\n handleBlur: () => void;\n handleKeyDown: (e: KeyboardEvent) => void;\n createItemClickHandler: (item: T) => () => void;\n getActiveDescendant: () => string | undefined;\n}\n\nexport const useSearch = <T extends SearchItem = SearchItem>({\n value,\n onChange,\n items,\n shouldShowResults = true,\n onItemClick,\n}: UseSearchOptions<T>): UseSearchReturn<T> => {\n const [activeIndex, setActiveIndex] = useState(-1);\n const [initialValue, setInitialValue] = useState('');\n const [itemSelected, setItemSelected] = useState(false);\n const [isClosedManually, setIsClosedManually] = useState(false);\n\n const resultsId = useRef(\n `search-results-${Math.random().toString(36).substr(2, 9)}`\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const containerRef = useRef<HTMLDivElement>(null);\n const blurTimeoutRef = useRef<number | null>(null);\n\n const isOpen = Boolean(value) && !isClosedManually;\n const showResults = shouldShowResults && isOpen && items.length > 0;\n const showEmptyState = shouldShowResults && isOpen && items.length === 0;\n\n useEffect(() => {\n setActiveIndex(-1);\n // Don't reset isClosedManually here - only reset on focus\n // This prevents results from reopening after Tab\n }, [items]);\n\n useEffect(() => {\n return () => {\n clearBlurTimeout(blurTimeoutRef.current);\n };\n }, []);\n\n useEffect(() => {\n // Auto-scroll active item into view when navigating with keyboard\n if (activeIndex >= 0 && itemRefs.current[activeIndex]) {\n const element = itemRefs.current[activeIndex];\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n }\n }, [activeIndex]);\n\n const handleChange = useCallback(\n (e: any) => {\n // Reset isClosedManually when user types\n if (isClosedManually) {\n setIsClosedManually(false);\n }\n onChange?.(e);\n },\n [onChange, isClosedManually]\n );\n\n const createItemClickHandler = useCallback(\n (item: T) => () => {\n setItemSelected(true);\n setIsClosedManually(true);\n onItemClick?.(item);\n setActiveIndex(-1);\n },\n [onItemClick]\n );\n\n const handleFocus = useCallback(() => {\n clearBlurTimeout(blurTimeoutRef.current);\n blurTimeoutRef.current = null;\n setInitialValue(value || '');\n setItemSelected(false);\n setIsClosedManually(false);\n }, [value]);\n\n const handleBlur = useCallback(() => {\n blurTimeoutRef.current = createBlurHandler({\n containerRef: containerRef.current,\n itemSelected,\n initialValue,\n currentValue: value || '',\n onValueRestore: (restoredValue) => {\n onChange?.({ target: { value: restoredValue } } as any);\n },\n onClose: () => {\n setIsClosedManually(true);\n },\n });\n }, [itemSelected, initialValue, value, onChange]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!showResults) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setActiveIndex((prev) => handleArrowDown(prev, items.length));\n break;\n case 'ArrowUp':\n e.preventDefault();\n setActiveIndex((prev) => handleArrowUp(prev));\n break;\n case 'Home':\n if (showResults && items.length > 0) {\n e.preventDefault();\n setActiveIndex(handleHomeKey());\n }\n break;\n case 'End':\n if (showResults && items.length > 0) {\n e.preventDefault();\n setActiveIndex(handleEndKey(items.length));\n }\n break;\n case 'Tab':\n clearBlurTimeout(blurTimeoutRef.current);\n blurTimeoutRef.current = null;\n setIsClosedManually(true);\n onChange?.({ target: { value: initialValue } } as any);\n break;\n case 'Enter': {\n const wasHandled = handleEnterKey(activeIndex, items, (item) => {\n setItemSelected(true);\n setIsClosedManually(true);\n onItemClick?.(item);\n setActiveIndex(-1);\n });\n if (wasHandled) {\n e.preventDefault();\n }\n break;\n }\n case 'Escape':\n e.preventDefault();\n handleEscapeKey(\n initialValue,\n inputRef.current,\n (restoredValue) => {\n onChange?.({ target: { value: restoredValue } } as any);\n setActiveIndex(-1);\n setIsClosedManually(true);\n },\n () => {\n setIsClosedManually(true);\n }\n );\n break;\n }\n },\n [showResults, items, activeIndex, onItemClick, onChange, initialValue]\n );\n\n const getActiveDescendant = useCallback(() => {\n if (activeIndex >= 0 && showResults) {\n return `${resultsId.current}-item-${activeIndex}`;\n }\n return undefined;\n }, [activeIndex, showResults]);\n\n return {\n activeIndex,\n showResults,\n showEmptyState,\n resultsId,\n inputRef,\n itemRefs,\n containerRef,\n handleChange,\n handleFocus,\n handleBlur,\n handleKeyDown,\n createItemClickHandler,\n getActiveDescendant,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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, memo } from 'preact/compat';\nimport { Button, CartList, Divider } from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { QuickOrderItemsListProps } from '@/b2b-quick-order/types';\nimport { Slot } from '@adobe-commerce/elsie/lib';\nimport { QuickOrderListItem, Search } from '@/b2b-quick-order/components';\nimport { useItemSearch } from '@/b2b-quick-order/hooks';\nimport '@/b2b-quick-order/components/QuickOrderItemsList/QuickOrderItemsList.css';\n\nconst QuickOrderItemsListComponent: FunctionComponent<\n QuickOrderItemsListProps\n> = ({\n t,\n items,\n onRemove,\n clearItems,\n onUpdateQuantity,\n slots,\n handleAddToCart,\n isItemUpdating,\n loading,\n isDisabledButton,\n productsSearch,\n searchFilter,\n}) => {\n const {\n searchValue,\n searchResults,\n handleSearchChange,\n shouldShowResults,\n handleItemClick,\n } = useItemSearch({\n productsSearch,\n initialSku: '',\n searchFilter,\n });\n\n return (\n <div\n className={classes(['b2b-quick-order-form-quick-order-items-list'])}\n role=\"region\"\n aria-label={t.title}\n >\n <div className=\"b2b-quick-order-form-quick-order-items-list__title\">\n {t.title}\n </div>\n\n {items.length > 0 && (\n <>\n <CartList\n role=\"list\"\n className=\"b2b-quick-order-form-quick-order-items-list__list\"\n >\n {items.map((item) => (\n <QuickOrderListItem\n key={item.sku}\n item={item}\n t={t}\n onRemove={onRemove}\n onUpdateQuantity={onUpdateQuantity}\n isUpdating={isItemUpdating?.(item.sku)}\n loading={loading}\n productsSearch={productsSearch}\n searchFilter={searchFilter}\n slots={slots}\n />\n ))}\n </CartList>\n <Divider variant={'secondary'} />\n </>\n )}\n <div className=\"b2b-quick-order-form-quick-order-items-list__global-search\">\n <Search\n t={t}\n onChange={handleSearchChange}\n items={searchResults}\n value={searchValue}\n shouldShowResults={shouldShowResults}\n onItemClick={handleItemClick}\n className=\"b2b-quick-order-form-quick-order-items-list__search\"\n />\n </div>\n {items.length === 0 && (\n <div\n className=\"b2b-quick-order-form-quick-order-items-list__empty\"\n data-testid=\"empty-items\"\n >\n {t.emptyList}\n </div>\n )}\n <Slot\n slot={slots?.AddAllToCartButton}\n name=\"AddAllToCartButton\"\n context={{\n handleAddToCart,\n clearItems,\n loading,\n isDisabledButton,\n }}\n data-testid=\"addAllToCart\"\n >\n <div className=\"b2b-quick-order-form-quick-order-items-list__actions\">\n <Button\n variant=\"primary\"\n onClick={handleAddToCart}\n data-testid=\"add-all-to-cart-button\"\n disabled={loading || isDisabledButton}\n >\n {t.addAllToCart}\n </Button>\n </div>\n </Slot>\n </div>\n );\n};\n\nexport const QuickOrderItemsList = memo(QuickOrderItemsListComponent);\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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, useMemo, useCallback, memo } from 'preact/compat';\nimport { CartItem, AccordionSection } from '@adobe-commerce/elsie/components';\nimport { Slot } from '@adobe-commerce/elsie/lib';\nimport { QuickOrderListItemProps } from '@/b2b-quick-order/types';\nimport { useItemSearch } from '@/b2b-quick-order/hooks';\nimport '@/b2b-quick-order/components/QuickOrderListItem/QuickOrderListItem.css';\nimport { Search } from '@/b2b-quick-order/components';\n\nconst QuickOrderListItemComponent: FunctionComponent<\n QuickOrderListItemProps\n> = ({\n item,\n t,\n onRemove,\n onUpdateQuantity,\n isUpdating,\n loading,\n productsSearch,\n searchFilter,\n slots,\n}) => {\n // Generate unique scope identifier Dropins - use item.id if available to distinguish multiple items with same sku\n const scope = `quick-order-item-${item.id || item.variantSku || item.sku}`;\n const currentSku = item?.variantSku ?? item?.sku;\n\n const {\n searchValue,\n searchResults,\n handleSearchChange,\n shouldShowResults,\n handleItemClick,\n } = useItemSearch({\n productsSearch,\n initialSku: currentSku,\n replaceItemSku: item.sku,\n searchFilter,\n });\n\n const formName = `form-${item.id || currentSku}`;\n const isValid = item.inStock && item.addToCartAllowed;\n const hasOptions = item.options && item.options.length > 0;\n\n const hasRequiredOptions = useMemo(\n () => hasOptions && item.options.some((option) => option.required),\n [hasOptions, item.options]\n );\n\n const hasSelectedOptions = useMemo(\n () =>\n hasOptions &&\n item.options.some(\n (option) =>\n option.items && option.items.some((optionItem) => optionItem.selected)\n ),\n [hasOptions, item.options]\n );\n\n // Check if all required options are selected\n const allRequiredOptionsSelected = useMemo(() => {\n if (hasRequiredOptions) {\n // If there are required options, check that all are selected\n return item.options.every((option) => {\n if (!option.required) return true;\n return (\n option.items && option.items.some((optionItem) => optionItem.selected)\n );\n });\n }\n // If no required options, return hasSelectedOptions\n return hasSelectedOptions;\n }, [hasRequiredOptions, hasSelectedOptions, item.options]);\n\n const mainImage = useMemo(\n () => item.images?.find((img) => img.roles?.includes('image')),\n [item.images]\n );\n\n // Memoize handlers\n const handleRemove = useCallback(() => {\n // Use item.id if available, otherwise fall back to sku\n onRemove?.(item.id || item.sku);\n }, [onRemove, item.id, item.sku]);\n\n const handleQuantityChange = useCallback(\n (newQty: number) => {\n onUpdateQuantity?.(item.sku, newQty);\n // Update hidden quantity field\n const form = document.forms[formName as any] as HTMLFormElement;\n if (form) {\n const qtyInput = form.querySelector(\n 'input[name=\"quantity\"]'\n ) as HTMLInputElement;\n if (qtyInput) qtyInput.value = String(newQty);\n }\n },\n [onUpdateQuantity, item.sku, formName]\n );\n\n const searchSlot = (\n <Slot\n name=\"QuickOrderItemSearch\"\n slot={slots?.QuickOrderItemSearch}\n context={{\n item,\n scope,\n handleSearchChange,\n searchResults,\n searchValue,\n shouldShowResults,\n handleItemClick,\n }}\n >\n <Search\n t={t}\n onChange={handleSearchChange}\n items={searchResults}\n value={searchValue}\n shouldShowResults={shouldShowResults}\n className=\"b2b-quick-order-form-quick-order-items__item-search\"\n onItemClick={handleItemClick}\n slots={slots}\n />\n </Slot>\n );\n\n if (!item.name && !item.images?.length) {\n return (\n <form\n key={item.sku}\n name={formName}\n className=\"b2b-quick-order-form-quick-order-items__item-form\"\n onSubmit={(e) => e.preventDefault()}\n data-sku={item.sku}\n >\n <input type=\"hidden\" name=\"sku\" value={item.sku} />\n <input type=\"hidden\" name=\"quantity\" value={item.quantity} />\n <input type=\"hidden\" name=\"valid\" value=\"false\" />\n <input type=\"hidden\" name=\"productType\" value=\"\" />\n {searchSlot}\n\n <CartItem\n sku={<span>{item.sku}</span>}\n title={<span>{t.productNotFound}</span>}\n quantity={item.quantity}\n alert={\n <div className=\"b2b-quick-order-items__error\">\n {t.productNotFoundDescription?.replace('{sku}', item.sku)}\n </div>\n }\n disabled={loading}\n onRemove={handleRemove}\n ariaLabel={`${t.productNotFound} - ${item.sku}`}\n />\n </form>\n );\n }\n\n return (\n <form\n key={currentSku}\n name={formName}\n className=\"b2b-quick-order-form-quick-order-items__item-form\"\n onSubmit={(e) => e.preventDefault()}\n data-sku={currentSku}\n >\n <input type=\"hidden\" name=\"sku\" value={currentSku} />\n <input type=\"hidden\" name=\"quantity\" value={item.quantity} />\n <input type=\"hidden\" name=\"valid\" value={isValid ? 'true' : 'false'} />\n <input type=\"hidden\" name=\"productType\" value={item.productType || ''} />\n {searchSlot}\n <CartItem\n title={<span>{item.name}</span>}\n sku={<span>{currentSku}</span>}\n image={\n mainImage ? (\n <img src={mainImage.url} alt={mainImage.label || item.name} />\n ) : undefined\n }\n price={\n <Slot\n name=\"ProductPrice\"\n slot={slots?.ProductPrice}\n context={{\n item,\n scope,\n }}\n />\n }\n quantity={item.quantity}\n alert={\n item.inStock === false ? (\n <div className=\"b2b-quick-order-items__alert\">{t.outOfStock}</div>\n ) : undefined\n }\n warning={\n hasOptions && !allRequiredOptionsSelected ? (\n <div className=\"b2b-quick-order-items__warning\">\n {t.configurableOptionsWarning}\n </div>\n ) : undefined\n }\n footer={\n hasOptions ? (\n <AccordionSection\n title={t.productOptions}\n ariaLabelTitle={t.productOptions}\n defaultOpen={!allRequiredOptionsSelected}\n className=\"b2b-quick-order-list-item__accordion\"\n actionIconPosition=\"left\"\n >\n <Slot\n name=\"ProductOptions\"\n slot={slots?.ProductOptions}\n context={{\n item,\n scope,\n }}\n >\n <div className=\"b2b-quick-order-items__configurable-error\">\n {t.configurableProductErrorDescription}\n </div>\n </Slot>\n </AccordionSection>\n ) : undefined\n }\n updating={isUpdating}\n disabled={loading}\n loading={loading}\n onRemove={handleRemove}\n onQuantity={handleQuantityChange}\n ariaLabel={`${item.name} - ${item.sku}`}\n />\n </form>\n );\n};\n\nexport const QuickOrderListItem = memo(QuickOrderListItemComponent);\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { memo } from 'preact/compat';\nimport { Input } from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { SearchProps, SearchItem } from '@/b2b-quick-order/types/search.types';\nimport { useSearch } from '@/b2b-quick-order/hooks/useSearch';\nimport '@/b2b-quick-order/components/Search/Search.css';\nimport { Slot } from '@adobe-commerce/elsie/lib';\n\nconst cursorStyle = { cursor: 'pointer' as const };\nconst defaultCursorStyle = { cursor: 'default' as const };\n\nconst SearchComponent = <T extends SearchItem = SearchItem>({\n t,\n value,\n onChange,\n items,\n shouldShowResults = true,\n className,\n onItemClick,\n slots,\n}: SearchProps<T>) => {\n const {\n activeIndex,\n showResults,\n showEmptyState,\n resultsId,\n inputRef,\n itemRefs,\n containerRef,\n handleChange,\n handleFocus,\n handleBlur,\n handleKeyDown,\n createItemClickHandler,\n getActiveDescendant,\n } = useSearch({\n value,\n onChange,\n items,\n shouldShowResults,\n onItemClick,\n });\n\n return (\n <div\n ref={containerRef}\n className={classes(['b2b-quick-order-search', className])}\n >\n <Input\n ref={inputRef}\n className=\"b2b-quick-order-search__input\"\n value={value}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={t.searchPlaceholder}\n aria-label={t.searchAriaLabel}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showResults}\n aria-controls={resultsId.current}\n aria-activedescendant={getActiveDescendant()}\n onKeyDown={handleKeyDown}\n />\n\n {showResults && (\n <div\n id={resultsId.current}\n role=\"listbox\"\n className=\"b2b-quick-order-search__results\"\n aria-label={t.searchAriaLabel}\n >\n {items.map((item, index) => (\n <Slot\n key={item.sku}\n slot={slots?.QuickOrderSearchAutocompleteItem}\n name={'QuickOrderSearchAutocompleteItem'}\n context={{\n item,\n index,\n createItemClickHandler,\n activeIndex,\n }}\n >\n <div\n id={`${resultsId.current}-item-${index}`}\n ref={(el) => (itemRefs.current[index] = el)}\n role=\"option\"\n aria-selected={index === activeIndex}\n className={classes([\n 'b2b-quick-order-search__result-item',\n index === activeIndex &&\n 'b2b-quick-order-search__result-item--active',\n ])}\n onClick={createItemClickHandler(item)}\n style={onItemClick ? cursorStyle : defaultCursorStyle}\n >\n {`${item.sku} ${item.name}`}\n </div>\n </Slot>\n ))}\n </div>\n )}\n\n {showEmptyState && (\n <div\n className=\"b2b-quick-order-search__empty-state\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {t.searchEmptyState}\n </div>\n )}\n\n {showResults && (\n <div\n className=\"sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {items.length}{' '}\n {items.length === 1 ? t.resultAvailable : t.resultsAvailable}.{' '}\n {t.srInstructions}\n </div>\n )}\n </div>\n );\n};\n\nexport const Search = memo(SearchComponent) as typeof SearchComponent;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 } from 'preact/compat';\nimport { QuickOrderDisabledOverlayProps } from '@/b2b-quick-order/types';\nimport '@/b2b-quick-order/components/QuickOrderDisabledOverlay/QuickOrderDisabledOverlay.css';\n\nexport const QuickOrderDisabledOverlay: FunctionComponent<\n QuickOrderDisabledOverlayProps\n> = ({ isDisabled, message, children }) => {\n return (\n <div className=\"b2b-quick-order-disabled-overlay\">\n <div\n className=\"b2b-quick-order-disabled-overlay__content\"\n style={{ pointerEvents: isDisabled ? 'none' : 'auto' }}\n >\n {children}\n </div>\n {isDisabled && (\n <>\n <div className=\"b2b-quick-order-disabled-overlay__blur\" />\n <div className=\"b2b-quick-order-disabled-overlay__message\">\n {message}\n </div>\n </>\n )}\n </div>\n );\n};\n"],"names":["classes","result","item","className","isActive","CsvFileInputComponent","t","onFileUpload","error","fileName","onDownloadSample","showSampleDownload","disabled","handleFileChange","useCallback","e","file","_a","jsxs","jsx","Fragment","InputFile","CsvFileInput","memo","debounce","fn","ms","timeoutId","args","SEARCH_FILTER","handleSearchBlur","options","containerRef","itemSelected","initialValue","currentValue","onValueRestore","onClose","activeElement","createBlurHandler","delay","clearBlurTimeout","timeoutRef","handleArrowDown","currentIndex","itemsLength","handleArrowUp","handleHomeKey","handleEndKey","handleEnterKey","activeIndex","items","onItemSelect","handleEscapeKey","inputRef","useItemSearch","productsSearch","initialSku","replaceItemSku","searchFilter","searchValue","setSearchValue","useState","searchResults","setSearchResults","isTouched","setIsTouched","isMountedRef","useRef","useEffect","debouncedSearch","useMemo","searchTerm","handleSearchChange","value","resetSearch","handleItemClick","clickedItem","itemData","events","useSearch","onChange","shouldShowResults","onItemClick","setActiveIndex","setInitialValue","setItemSelected","isClosedManually","setIsClosedManually","resultsId","itemRefs","blurTimeoutRef","isOpen","showResults","showEmptyState","element","handleChange","createItemClickHandler","handleFocus","handleBlur","restoredValue","handleKeyDown","prev","getActiveDescendant","QuickOrderItemsListComponent","onRemove","clearItems","onUpdateQuantity","slots","handleAddToCart","isItemUpdating","loading","isDisabledButton","CartList","QuickOrderListItem","Divider","Search","Slot","Button","QuickOrderItemsList","QuickOrderListItemComponent","isUpdating","scope","currentSku","formName","isValid","hasOptions","hasRequiredOptions","option","hasSelectedOptions","optionItem","allRequiredOptionsSelected","mainImage","img","handleRemove","handleQuantityChange","newQty","form","qtyInput","searchSlot","CartItem","_b","AccordionSection","cursorStyle","defaultCursorStyle","SearchComponent","Input","index","el","QuickOrderDisabledOverlay","isDisabled","message","children"],"mappings":"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","x_google_ignoreList":[0,2]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
|
+
All Rights Reserved. */
|
|
3
|
+
import{Initializer as c}from"@dropins/tools/lib.js";import{FetchGraphQL as a}from"@dropins/tools/fetch-graphql.js";import{events as n}from"@dropins/tools/event-bus.js";const{setEndpoint:m,setFetchGraphQlHeader:C,removeFetchGraphQlHeader:G,setFetchGraphQlHeaders:k,fetchGraphQl:s,getConfig:O}=new a().getMethods(),f=`
|
|
4
|
+
query GET_STORE_CONFIG {
|
|
5
|
+
storeConfig {
|
|
6
|
+
quickorder_active
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
`,h=r=>{throw r instanceof DOMException&&r.name==="AbortError"||n.emit("b2b-quick-order/error",{source:"auth",type:"network",error:r}),r},g=r=>{const t=r.map(e=>e.message).join(" ");throw Error(t)},d=async()=>await s(f,{method:"GET",cache:"force-cache"}).then(r=>{var t,e,o;return(t=r.errors)!=null&&t.length?g(r.errors):{storeConfig:{quickOrderActive:((o=(e=r==null?void 0:r.data)==null?void 0:e.storeConfig)==null?void 0:o.quickorder_active)??!1}}}).catch(h),i=new c({init:async r=>{const t={quickOrderActive:!1};try{const e=await d();t.quickOrderActive=e.storeConfig.quickOrderActive}catch(e){console.error("Failed to fetch store config:",e)}i.config.setConfig({...t,...r})},listeners:()=>[]}),p=i.config;export{d as a,C as b,p as c,k as d,s as f,O as g,i,G as r,m as s};
|
|
10
|
+
//# sourceMappingURL=initialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initialize.js","sources":["/@dropins/storefront-quick-order/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-quick-order/src/api/getStoreConfig/graphql/getStoreConfig.graphql.ts","/@dropins/storefront-quick-order/src/lib/network-error.ts","/@dropins/storefront-quick-order/src/lib/fetch-error.ts","/@dropins/storefront-quick-order/src/api/getStoreConfig/getStoreConfig.ts","/@dropins/storefront-quick-order/src/api/initialize/initialize.ts"],"sourcesContent":["import { 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 * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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\nexport const GET_STORE_CONFIG = /* GraphQL */ `\n query GET_STORE_CONFIG {\n storeConfig {\n quickorder_active\n }\n }\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { events } from '@adobe-commerce/event-bus';\n\n/**\n * A function which can be attached to fetchGraphQL to handle thrown errors in\n * a generic way.\n */\nexport const handleNetworkError = (error: Error) => {\n const isAbortError =\n error instanceof DOMException && error.name === 'AbortError';\n\n if (!isAbortError) {\n events.emit('b2b-quick-order/error', {\n source: 'auth',\n type: 'network',\n error,\n });\n }\n throw error;\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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\n/** Actions */\nexport const handleFetchError = (errors: Array<{ message: string }>) => {\n const errorMessage = errors.map((e: any) => e.message).join(' ');\n\n throw Error(errorMessage);\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { fetchGraphQl } from '../fetch-graphql';\nimport { GET_STORE_CONFIG } from './graphql/getStoreConfig.graphql';\nimport { handleNetworkError } from '@/b2b-quick-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-quick-order/lib/fetch-error';\n\nexport const getStoreConfig = async (): Promise<{\n storeConfig: {\n quickOrderActive: boolean;\n };\n}> => {\n return await fetchGraphQl(GET_STORE_CONFIG, {\n method: 'GET',\n cache: 'force-cache',\n })\n .then((response) => {\n if (response.errors?.length) return handleFetchError(response.errors);\n\n return {\n storeConfig: {\n quickOrderActive:\n response?.data?.storeConfig?.quickorder_active ?? false,\n },\n };\n })\n .catch(handleNetworkError);\n};\n","import { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { getStoreConfig } from '../getStoreConfig/getStoreConfig';\n// import { events } from '@adobe-commerce/event-bus';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n quickOrderActive?: boolean;\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig: Partial<ConfigProps> = {\n quickOrderActive: false,\n };\n\n try {\n const storeConfigResponse = await getStoreConfig();\n defaultConfig.quickOrderActive =\n storeConfigResponse.storeConfig.quickOrderActive;\n } catch (error) {\n console.error('Failed to fetch store config:', error);\n }\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [\n // events.on('authenticated', (authenticated) => {\n // console.log('authenticated', authenticated);\n // }),\n ],\n});\n\nexport const config = initialize.config;\n"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","GET_STORE_CONFIG","handleNetworkError","error","events","handleFetchError","errors","errorMessage","getStoreConfig","response","_a","_c","_b","initialize","Initializer","config","defaultConfig","storeConfigResponse"],"mappings":"wKAEO,KAAM,CACX,YAAAA,EACA,sBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EAAI,IAAIC,EAAA,EAAe,WAAA,ECQVC,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECMjCC,EAAsBC,GAAiB,CAIlD,MAFEA,aAAiB,cAAgBA,EAAM,OAAS,cAGhDC,EAAO,KAAK,wBAAyB,CACnC,OAAQ,OACR,KAAM,UACN,MAAAD,CAAA,CACD,EAEGA,CACR,ECjBaE,EAAoBC,GAAuC,CACtE,MAAMC,EAAeD,EAAO,IAAK,GAAW,EAAE,OAAO,EAAE,KAAK,GAAG,EAE/D,MAAM,MAAMC,CAAY,CAC1B,ECAaC,EAAiB,SAKrB,MAAMV,EAAaG,EAAkB,CAC1C,OAAQ,MACR,MAAO,aAAA,CACR,EACE,KAAMQ,GAAa,WAClB,OAAIC,EAAAD,EAAS,SAAT,MAAAC,EAAiB,OAAeL,EAAiBI,EAAS,MAAM,EAE7D,CACL,YAAa,CACX,mBACEE,GAAAC,EAAAH,GAAA,YAAAA,EAAU,OAAV,YAAAG,EAAgB,cAAhB,YAAAD,EAA6B,oBAAqB,EAAA,CACtD,CAEJ,CAAC,EACA,MAAMT,CAAkB,EC/BhBW,EAAa,IAAIC,EAAyB,CACrD,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAsC,CAC1C,iBAAkB,EAAA,EAGpB,GAAI,CACF,MAAMC,EAAsB,MAAMT,EAAA,EAClCQ,EAAc,iBACZC,EAAoB,YAAY,gBACpC,OAASd,EAAO,CACd,QAAQ,MAAM,gCAAiCA,CAAK,CACtD,CAEAU,EAAW,OAAO,UAAU,CAAE,GAAGG,EAAe,GAAGD,EAAQ,CAC7D,EAEA,UAAW,IAAM,CAAA,CAKnB,CAAC,EAEYA,EAASF,EAAW"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FunctionComponent } from 'preact/compat';
|
|
2
|
+
import { QuickOrderDisabledOverlayProps } from '../../types';
|
|
3
|
+
|
|
4
|
+
export declare const QuickOrderDisabledOverlay: FunctionComponent<QuickOrderDisabledOverlayProps>;
|
|
5
|
+
//# sourceMappingURL=QuickOrderDisabledOverlay.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/********************************************************************
|
|
2
|
+
* ADOBE CONFIDENTIAL
|
|
3
|
+
* __________________
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2024 Adobe
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* NOTICE: All information contained herein is, and remains
|
|
9
|
+
* the property of Adobe and its suppliers, if any. The intellectual
|
|
10
|
+
* and technical concepts contained herein are proprietary to Adobe
|
|
11
|
+
* and its suppliers and are protected by all applicable intellectual
|
|
12
|
+
* property laws, including trade secret and copyright laws.
|
|
13
|
+
* Dissemination of this information or reproduction of this material
|
|
14
|
+
* is strictly forbidden unless prior written permission is obtained
|
|
15
|
+
* from Adobe.
|
|
16
|
+
*******************************************************************/
|
|
17
|
+
export * from './QuickOrderDisabledOverlay';
|
|
18
|
+
export { QuickOrderDisabledOverlay as default } from './QuickOrderDisabledOverlay';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { FunctionComponent } from 'preact/compat';
|
|
2
|
+
import { QuickOrderNotificationBannerProps } from '../../types';
|
|
3
|
+
|
|
4
|
+
export declare const QuickOrderNotificationBanner: FunctionComponent<QuickOrderNotificationBannerProps>;
|
|
5
|
+
//# sourceMappingURL=QuickOrderNotificationBanner.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/********************************************************************
|
|
2
|
+
* ADOBE CONFIDENTIAL
|
|
3
|
+
* __________________
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2024 Adobe
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* NOTICE: All information contained herein is, and remains
|
|
9
|
+
* the property of Adobe and its suppliers, if any. The intellectual
|
|
10
|
+
* and technical concepts contained herein are proprietary to Adobe
|
|
11
|
+
* and its suppliers and are protected by all applicable intellectual
|
|
12
|
+
* property laws, including trade secret and copyright laws.
|
|
13
|
+
* Dissemination of this information or reproduction of this material
|
|
14
|
+
* is strictly forbidden unless prior written permission is obtained
|
|
15
|
+
* from Adobe.
|
|
16
|
+
*******************************************************************/
|
|
17
|
+
export * from './QuickOrderNotificationBanner';
|
|
18
|
+
export { QuickOrderNotificationBanner as default } from './QuickOrderNotificationBanner';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
package/components/index.d.ts
CHANGED
|
@@ -19,4 +19,6 @@ export * from './CsvFileInput/CsvFileInput';
|
|
|
19
19
|
export * from './QuickOrderItemsList/QuickOrderItemsList';
|
|
20
20
|
export * from './QuickOrderListItem/QuickOrderListItem';
|
|
21
21
|
export * from './Search/Search';
|
|
22
|
+
export * from './QuickOrderNotificationBanner/QuickOrderNotificationBanner';
|
|
23
|
+
export * from './QuickOrderDisabledOverlay/QuickOrderDisabledOverlay';
|
|
22
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as v}from"@dropins/tools/preact-jsx-runtime.js";import{C as
|
|
3
|
+
import{jsx as v}from"@dropins/tools/preact-jsx-runtime.js";import{Q as V,C as S}from"../chunks/QuickOrderDisabledOverlay.js";import"@dropins/tools/components.js";import{classes as w}from"@dropins/tools/lib.js";import{useState as k,useCallback as f}from"@dropins/tools/preact-hooks.js";import{events as h}from"@dropins/tools/event-bus.js";import{useText as Q}from"@dropins/tools/i18n.js";import{c as y}from"../chunks/initialize.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/fetch-graphql.js";const F=n=>n.trim().replace(/^["']|["']$/g,""),O=200,I=(n,t)=>{const i=n.replace(/^\uFEFF/,"").trim().split(/\r?\n|\r/);if(!i.some(e=>e.trim()))return{isValid:!1,error:t.emptyFile};const a=i[0].split(",").map(e=>F(e).toLowerCase()),r=a.indexOf("sku"),c=a.indexOf("qty");if(r===-1||c===-1)return{isValid:!1,error:t.missingColumns};if(a.length!==2)return{isValid:!1,error:t.extraColumns};if(i.length-1>O)return{isValid:!1,error:t.maxRowsExceeded.replace("{maxRows}",O.toString())};const d=[];for(let e=1;e<i.length;e++){const s=i[e].trim();if(!s)continue;const u=s.split(",").map(x=>F(x)),l=u[r],C=u[c];if(!l)return{isValid:!1,error:t.skuRequired.replace("{rowNumber}",e.toString())};const o=parseInt(C,10);if(isNaN(o)||o<=0||!Number.isInteger(o))return{isValid:!1,error:t.invalidQuantity.replace("{rowNumber}",e.toString())};d.push({sku:l,quantity:o})}return d.length===0?{isValid:!1,error:t.noValidData}:{isValid:!0,data:d}},b=({routeSampleCSV:n,onFileUpload:t})=>{const[m,i]=k(null),[p,a]=k(null),r=Q({invalidFile:"QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile",emptyFile:"QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile",missingColumns:"QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns",extraColumns:"QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns",maxRowsExceeded:"QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded",skuRequired:"QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired",invalidQuantity:"QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity",noValidData:"QuickOrder.CsvFileInput.uploadCSVErrors.noValidData",onlyCSV:"QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV",failedToRead:"QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead",failedToParse:"QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse"}),c=f(e=>{if(i(null),a(e.name),!e.name.toLowerCase().endsWith(".csv")){i(r.onlyCSV);return}const s=new FileReader;s.onload=u=>{var l;try{const C=(l=u.target)==null?void 0:l.result,o=I(C,{emptyFile:r.emptyFile,missingColumns:r.missingColumns,extraColumns:r.extraColumns,maxRowsExceeded:r.maxRowsExceeded,skuRequired:r.skuRequired,invalidQuantity:r.invalidQuantity,noValidData:r.noValidData});if(!o.isValid){i(o.error);return}t?t(o.data):h.emit("quick-order/add-items",o.data),a(null),i(null)}catch{i(r.failedToParse)}},s.onerror=()=>{i(r.failedToRead)},s.readAsText(e)},[t,r]),d=f(()=>{if(n)window.open(n,"_blank");else{const e=`SKU,QTY
|
|
4
4
|
SKU123,1
|
|
5
5
|
SKU456,2
|
|
6
|
-
SKU789,3`,s=new Blob([
|
|
6
|
+
SKU789,3`,s=new Blob([e],{type:"text/csv"}),u=URL.createObjectURL(s),l=document.createElement("a");l.href=u,l.download="sample-quick-order.csv",document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(u)}},[n]);return{handleFileUpload:c,error:m,fileName:p,handleDownloadSample:d,showSampleDownload:!0}},K=({className:n,routeSampleCSV:t,onFileUpload:m})=>{const i=y.getConfig().quickOrderActive,p=Q({title:"QuickOrder.CsvFileInput.title",helperText:"QuickOrder.CsvFileInput.helperText",downloadSample:"QuickOrder.CsvFileInput.downloadSample",inputLabel:"QuickOrder.CsvFileInput.inputLabel",selectedFile:"QuickOrder.CsvFileInput.selectedFile",disabledMessage:"QuickOrder.QuickOrderItem.disabledMessage"}),{handleFileUpload:a,error:r,fileName:c,handleDownloadSample:d,showSampleDownload:e}=b({routeSampleCSV:t,onFileUpload:m});return v("div",{className:w(["b2b-quick-order-quick-order-upload-csv",n]),"data-testid":"quick-order-upload-csv",children:v(V,{isDisabled:!i,message:p.disabledMessage,children:v(S,{t:p,onFileUpload:a,error:r,fileName:c,onDownloadSample:d,showSampleDownload:e})})})};export{K as QuickOrderCsvUpload,K as default};
|
|
7
7
|
//# sourceMappingURL=QuickOrderCsvUpload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuickOrderCsvUpload.js","sources":["/@dropins/storefront-quick-order/src/lib/cleanCsvValue.ts","/@dropins/storefront-quick-order/src/lib/validateCsvContent.ts","/@dropins/storefront-quick-order/src/hooks/useQuickOrderCsvUpload.tsx","/@dropins/storefront-quick-order/src/containers/QuickOrderCsvUpload/QuickOrderCsvUpload.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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\n/**\n * Cleans CSV value by removing surrounding quotes and trimming whitespace\n * Handles both double quotes (\") and single quotes (')\n * @param val - The raw CSV value to clean\n * @returns Cleaned string value\n */\nexport const cleanCsvValue = (val: string): string =>\n val.trim().replace(/^[\"']|[\"']$/g, '');\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { CSVValidationResult, SubmitSkuValue } from '@/b2b-quick-order/types';\nimport { cleanCsvValue } from './cleanCsvValue';\n\n// Maximum number of rows allowed in CSV\nconst MAX_ROWS = 200;\n\nexport interface ValidationMessages {\n emptyFile: string;\n missingColumns: string;\n extraColumns: string;\n maxRowsExceeded: string;\n skuRequired: string;\n invalidQuantity: string;\n noValidData: string;\n}\n\n/**\n * Validates CSV content and extracts SKU/quantity data\n * Handles BOM, different line endings, quoted values, and empty lines\n * @param content - Raw CSV file content\n * @param messages - Localized error messages\n * @returns Validation result with data or error\n */\nexport const validateCsvContent = (\n content: string,\n messages: ValidationMessages\n): CSVValidationResult => {\n // Remove BOM if present\n const cleanContent = content.replace(/^\\uFEFF/, '');\n\n // Split by different line endings (handle \\r\\n, \\n, \\r)\n const lines = cleanContent.trim().split(/\\r?\\n|\\r/);\n\n // Check if file is effectively empty after removing empty lines\n const hasContent = lines.some((line) => line.trim());\n if (!hasContent) {\n return { isValid: false, error: messages.emptyFile };\n }\n\n const header = lines[0]\n .split(',')\n .map((col) => cleanCsvValue(col).toLowerCase());\n const skuIndex = header.indexOf('sku');\n const qtyIndex = header.indexOf('qty');\n\n if (skuIndex === -1 || qtyIndex === -1) {\n return {\n isValid: false,\n error: messages.missingColumns,\n };\n }\n\n if (header.length !== 2) {\n return {\n isValid: false,\n error: messages.extraColumns,\n };\n }\n\n if (lines.length - 1 > MAX_ROWS) {\n return {\n isValid: false,\n error: messages.maxRowsExceeded.replace('{maxRows}', MAX_ROWS.toString()),\n };\n }\n\n const data: SubmitSkuValue = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n const values = line.split(',').map((val) => cleanCsvValue(val));\n const sku = values[skuIndex];\n const qty = values[qtyIndex];\n\n if (!sku) {\n return {\n isValid: false,\n error: messages.skuRequired.replace('{rowNumber}', i.toString()),\n };\n }\n\n const quantity = parseInt(qty, 10);\n if (isNaN(quantity) || quantity <= 0 || !Number.isInteger(quantity)) {\n return {\n isValid: false,\n error: messages.invalidQuantity.replace('{rowNumber}', i.toString()),\n };\n }\n\n data.push({ sku, quantity });\n }\n\n if (data.length === 0) {\n return { isValid: false, error: messages.noValidData };\n }\n\n return { isValid: true, data };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { useCallback, useState } from 'preact/hooks';\nimport {\n UseQuickOrderCsvUploadProps,\n UseQuickOrderCsvUploadReturn,\n} from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { validateCsvContent } from '@/b2b-quick-order/lib';\n\nexport const useQuickOrderCsvUpload = ({\n routeSampleCSV,\n onFileUpload,\n}: UseQuickOrderCsvUploadProps): UseQuickOrderCsvUploadReturn => {\n const [error, setError] = useState<string | null>(null);\n const [fileName, setFileName] = useState<string | null>(null);\n\n const t = useText({\n invalidFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile',\n emptyFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile',\n missingColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns',\n extraColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns',\n maxRowsExceeded: 'QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded',\n skuRequired: 'QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired',\n invalidQuantity: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity',\n noValidData: 'QuickOrder.CsvFileInput.uploadCSVErrors.noValidData',\n onlyCSV: 'QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV',\n failedToRead: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead',\n failedToParse: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse',\n });\n\n const handleFileUpload = useCallback(\n (file: File) => {\n setError(null);\n setFileName(file.name);\n\n if (!file.name.toLowerCase().endsWith('.csv')) {\n setError(t.onlyCSV);\n return;\n }\n\n const reader = new FileReader();\n\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const validation = validateCsvContent(content, {\n emptyFile: t.emptyFile,\n missingColumns: t.missingColumns,\n extraColumns: t.extraColumns,\n maxRowsExceeded: t.maxRowsExceeded,\n skuRequired: t.skuRequired,\n invalidQuantity: t.invalidQuantity,\n noValidData: t.noValidData,\n });\n\n if (!validation.isValid) {\n setError(validation.error!);\n return;\n }\n\n // Success - emit event or call custom callback\n if (onFileUpload) {\n onFileUpload(validation.data!);\n } else {\n events.emit('quick-order/add-items', validation.data!);\n }\n\n // Reset state after successful upload\n setFileName(null);\n setError(null);\n } catch (err) {\n setError(t.failedToParse);\n }\n };\n\n reader.onerror = () => {\n setError(t.failedToRead);\n };\n\n reader.readAsText(file);\n },\n [onFileUpload, t]\n );\n\n const handleDownloadSample = useCallback(() => {\n if (routeSampleCSV) {\n window.open(routeSampleCSV, '_blank');\n } else {\n const csvContent = 'SKU,QTY\\nSKU123,1\\nSKU456,2\\nSKU789,3';\n const blob = new Blob([csvContent], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'sample-quick-order.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n }, [routeSampleCSV]);\n\n return {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload: true,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { CsvFileInput } from '@/b2b-quick-order/components/CsvFileInput';\nimport { useQuickOrderCsvUpload } from '@/b2b-quick-order/hooks/useQuickOrderCsvUpload';\nimport { QuickOrderCsvUploadProps } from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\n\nexport const QuickOrderCsvUpload: Container<QuickOrderCsvUploadProps> = ({\n className,\n routeSampleCSV,\n onFileUpload,\n}) => {\n const t = useText({\n title: 'QuickOrder.CsvFileInput.title',\n helperText: 'QuickOrder.CsvFileInput.helperText',\n downloadSample: 'QuickOrder.CsvFileInput.downloadSample',\n inputLabel: 'QuickOrder.CsvFileInput.inputLabel',\n selectedFile: 'QuickOrder.CsvFileInput.selectedFile',\n });\n\n const {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload,\n } = useQuickOrderCsvUpload({\n routeSampleCSV,\n onFileUpload,\n });\n\n return (\n <div\n className={classes(['b2b-quick-order-quick-order-upload-csv', className])}\n data-testid=\"quick-order-upload-csv\"\n >\n <CsvFileInput\n t={t}\n onFileUpload={handleFileUpload}\n error={error}\n fileName={fileName}\n onDownloadSample={handleDownloadSample}\n showSampleDownload={showSampleDownload}\n />\n </div>\n );\n};\n"],"names":["cleanCsvValue","val","MAX_ROWS","validateCsvContent","content","messages","lines","line","header","col","skuIndex","qtyIndex","data","i","values","sku","qty","quantity","useQuickOrderCsvUpload","routeSampleCSV","onFileUpload","error","setError","useState","fileName","setFileName","t","useText","handleFileUpload","useCallback","file","reader","e","_a","validation","events","handleDownloadSample","csvContent","blob","url","link","QuickOrderCsvUpload","className","showSampleDownload","jsx","classes","CsvFileInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuickOrderCsvUpload.js","sources":["/@dropins/storefront-quick-order/src/lib/cleanCsvValue.ts","/@dropins/storefront-quick-order/src/lib/validateCsvContent.ts","/@dropins/storefront-quick-order/src/hooks/useQuickOrderCsvUpload.tsx","/@dropins/storefront-quick-order/src/containers/QuickOrderCsvUpload/QuickOrderCsvUpload.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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\n/**\n * Cleans CSV value by removing surrounding quotes and trimming whitespace\n * Handles both double quotes (\") and single quotes (')\n * @param val - The raw CSV value to clean\n * @returns Cleaned string value\n */\nexport const cleanCsvValue = (val: string): string =>\n val.trim().replace(/^[\"']|[\"']$/g, '');\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { CSVValidationResult, SubmitSkuValue } from '@/b2b-quick-order/types';\nimport { cleanCsvValue } from './cleanCsvValue';\n\n// Maximum number of rows allowed in CSV\nconst MAX_ROWS = 200;\n\nexport interface ValidationMessages {\n emptyFile: string;\n missingColumns: string;\n extraColumns: string;\n maxRowsExceeded: string;\n skuRequired: string;\n invalidQuantity: string;\n noValidData: string;\n}\n\n/**\n * Validates CSV content and extracts SKU/quantity data\n * Handles BOM, different line endings, quoted values, and empty lines\n * @param content - Raw CSV file content\n * @param messages - Localized error messages\n * @returns Validation result with data or error\n */\nexport const validateCsvContent = (\n content: string,\n messages: ValidationMessages\n): CSVValidationResult => {\n // Remove BOM if present\n const cleanContent = content.replace(/^\\uFEFF/, '');\n\n // Split by different line endings (handle \\r\\n, \\n, \\r)\n const lines = cleanContent.trim().split(/\\r?\\n|\\r/);\n\n // Check if file is effectively empty after removing empty lines\n const hasContent = lines.some((line) => line.trim());\n if (!hasContent) {\n return { isValid: false, error: messages.emptyFile };\n }\n\n const header = lines[0]\n .split(',')\n .map((col) => cleanCsvValue(col).toLowerCase());\n const skuIndex = header.indexOf('sku');\n const qtyIndex = header.indexOf('qty');\n\n if (skuIndex === -1 || qtyIndex === -1) {\n return {\n isValid: false,\n error: messages.missingColumns,\n };\n }\n\n if (header.length !== 2) {\n return {\n isValid: false,\n error: messages.extraColumns,\n };\n }\n\n if (lines.length - 1 > MAX_ROWS) {\n return {\n isValid: false,\n error: messages.maxRowsExceeded.replace('{maxRows}', MAX_ROWS.toString()),\n };\n }\n\n const data: SubmitSkuValue = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n const values = line.split(',').map((val) => cleanCsvValue(val));\n const sku = values[skuIndex];\n const qty = values[qtyIndex];\n\n if (!sku) {\n return {\n isValid: false,\n error: messages.skuRequired.replace('{rowNumber}', i.toString()),\n };\n }\n\n const quantity = parseInt(qty, 10);\n if (isNaN(quantity) || quantity <= 0 || !Number.isInteger(quantity)) {\n return {\n isValid: false,\n error: messages.invalidQuantity.replace('{rowNumber}', i.toString()),\n };\n }\n\n data.push({ sku, quantity });\n }\n\n if (data.length === 0) {\n return { isValid: false, error: messages.noValidData };\n }\n\n return { isValid: true, data };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { useCallback, useState } from 'preact/hooks';\nimport {\n UseQuickOrderCsvUploadProps,\n UseQuickOrderCsvUploadReturn,\n} from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { validateCsvContent } from '@/b2b-quick-order/lib';\n\nexport const useQuickOrderCsvUpload = ({\n routeSampleCSV,\n onFileUpload,\n}: UseQuickOrderCsvUploadProps): UseQuickOrderCsvUploadReturn => {\n const [error, setError] = useState<string | null>(null);\n const [fileName, setFileName] = useState<string | null>(null);\n\n const t = useText({\n invalidFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidFile',\n emptyFile: 'QuickOrder.CsvFileInput.uploadCSVErrors.emptyFile',\n missingColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.missingColumns',\n extraColumns: 'QuickOrder.CsvFileInput.uploadCSVErrors.extraColumns',\n maxRowsExceeded: 'QuickOrder.CsvFileInput.uploadCSVErrors.maxRowsExceeded',\n skuRequired: 'QuickOrder.CsvFileInput.uploadCSVErrors.skuRequired',\n invalidQuantity: 'QuickOrder.CsvFileInput.uploadCSVErrors.invalidQuantity',\n noValidData: 'QuickOrder.CsvFileInput.uploadCSVErrors.noValidData',\n onlyCSV: 'QuickOrder.CsvFileInput.uploadCSVErrors.onlyCSV',\n failedToRead: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToRead',\n failedToParse: 'QuickOrder.CsvFileInput.uploadCSVErrors.failedToParse',\n });\n\n const handleFileUpload = useCallback(\n (file: File) => {\n setError(null);\n setFileName(file.name);\n\n if (!file.name.toLowerCase().endsWith('.csv')) {\n setError(t.onlyCSV);\n return;\n }\n\n const reader = new FileReader();\n\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const validation = validateCsvContent(content, {\n emptyFile: t.emptyFile,\n missingColumns: t.missingColumns,\n extraColumns: t.extraColumns,\n maxRowsExceeded: t.maxRowsExceeded,\n skuRequired: t.skuRequired,\n invalidQuantity: t.invalidQuantity,\n noValidData: t.noValidData,\n });\n\n if (!validation.isValid) {\n setError(validation.error!);\n return;\n }\n\n // Success - emit event or call custom callback\n if (onFileUpload) {\n onFileUpload(validation.data!);\n } else {\n events.emit('quick-order/add-items', validation.data!);\n }\n\n // Reset state after successful upload\n setFileName(null);\n setError(null);\n } catch (err) {\n setError(t.failedToParse);\n }\n };\n\n reader.onerror = () => {\n setError(t.failedToRead);\n };\n\n reader.readAsText(file);\n },\n [onFileUpload, t]\n );\n\n const handleDownloadSample = useCallback(() => {\n if (routeSampleCSV) {\n window.open(routeSampleCSV, '_blank');\n } else {\n const csvContent = 'SKU,QTY\\nSKU123,1\\nSKU456,2\\nSKU789,3';\n const blob = new Blob([csvContent], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'sample-quick-order.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n }, [routeSampleCSV]);\n\n return {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload: true,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 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 { CsvFileInput } from '@/b2b-quick-order/components/CsvFileInput';\nimport { QuickOrderDisabledOverlay } from '@/b2b-quick-order/components';\nimport { useQuickOrderCsvUpload } from '@/b2b-quick-order/hooks/useQuickOrderCsvUpload';\nimport { QuickOrderCsvUploadProps } from '@/b2b-quick-order/types/quickOrderCsvUpload.types';\nimport { config } from '@/b2b-quick-order/api/initialize';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\n\nexport const QuickOrderCsvUpload: Container<QuickOrderCsvUploadProps> = ({\n className,\n routeSampleCSV,\n onFileUpload,\n}) => {\n const isQuickOrderActive = config.getConfig().quickOrderActive;\n\n const t = useText({\n title: 'QuickOrder.CsvFileInput.title',\n helperText: 'QuickOrder.CsvFileInput.helperText',\n downloadSample: 'QuickOrder.CsvFileInput.downloadSample',\n inputLabel: 'QuickOrder.CsvFileInput.inputLabel',\n selectedFile: 'QuickOrder.CsvFileInput.selectedFile',\n disabledMessage: 'QuickOrder.QuickOrderItem.disabledMessage',\n });\n\n const {\n handleFileUpload,\n error,\n fileName,\n handleDownloadSample,\n showSampleDownload,\n } = useQuickOrderCsvUpload({\n routeSampleCSV,\n onFileUpload,\n });\n\n return (\n <div\n className={classes(['b2b-quick-order-quick-order-upload-csv', className])}\n data-testid=\"quick-order-upload-csv\"\n >\n <QuickOrderDisabledOverlay\n isDisabled={!isQuickOrderActive}\n message={t.disabledMessage}\n >\n <CsvFileInput\n t={t}\n onFileUpload={handleFileUpload}\n error={error}\n fileName={fileName}\n onDownloadSample={handleDownloadSample}\n showSampleDownload={showSampleDownload}\n />\n </QuickOrderDisabledOverlay>\n </div>\n );\n};\n"],"names":["cleanCsvValue","val","MAX_ROWS","validateCsvContent","content","messages","lines","line","header","col","skuIndex","qtyIndex","data","i","values","sku","qty","quantity","useQuickOrderCsvUpload","routeSampleCSV","onFileUpload","error","setError","useState","fileName","setFileName","t","useText","handleFileUpload","useCallback","file","reader","e","_a","validation","events","handleDownloadSample","csvContent","blob","url","link","QuickOrderCsvUpload","className","isQuickOrderActive","config","showSampleDownload","jsx","classes","QuickOrderDisabledOverlay","CsvFileInput"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as U}from"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/components.js";import{Q as K}from"../chunks/Search.js";import"../chunks/CsvFileInput.js";import{useState as A,useCallback as v,useEffect as b}from"@dropins/tools/preact-hooks.js";import{events as S}from"@dropins/tools/event-bus.js";import{classes as x}from"@dropins/tools/lib.js";import{useText as P}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";const R=["sku","parentSku","quantity","optionsUIDs","valid","productType"],_=n=>{const r=[],t=[];return n.forEach((e,o)=>{if(R.includes(o))return;const s=e;s&&s.match(/^[A-Za-z0-9+/=]+$/)?r.push(s):t.push({uid:o,value:s})}),{optionUIDs:r,enteredOptions:t}},M=n=>{const r=Number(n.get("quantity")),t=!r||r<1?1:r,e={sku:n.get("sku"),quantity:t},o=n.get("parentSku");o&&(e.parentSku=o);const{optionUIDs:s,enteredOptions:a}=_(n);return s.length>0&&(e.optionsUIDs=s),a.length>0&&(e.enteredOptions=a),e},T={sku:"",quantity:1,name:"",images:[],inStock:!1,addToCartAllowed:!1,isBundle:!1,prices:{},attributes:[],options:[],url:"",urlKey:"",externalId:"",productType:"simple",shortDescription:"",metaDescription:"",metaKeyword:"",metaTitle:"",description:""},C=(n,r)=>!r||!Array.isArray(r)?n.map(t=>({...T,sku:t.sku,quantity:t.quantity??1})):n.map(t=>{const e=r.find(o=>(o==null?void 0:o.sku)===(t==null?void 0:t.sku));return e?{...e,...t.variantSku&&{variantSku:t.variantSku},quantity:t.quantity??1}:{...T,sku:t.sku,...t.variantSku&&{variantSku:t.variantSku},quantity:t.quantity??1}}),V=n=>n.length===0?!1:n.every(r=>!((r.urlKey||r.url)&&r.name)||r.inStock===!1?!1:r.options&&r.options.length>0?r.options.some(o=>o.items&&o.items.length>0&&o.items.some(s=>s.selected===!0)):!0),D=n=>`quick-order-item-${n.id||n.variantSku||n.sku}`,F=n=>`${n}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,$=(n,r)=>n.findIndex(t=>r.variantSku&&t.variantSku?t.variantSku===r.variantSku:t.variantSku&&!r.variantSku&&r.sku?t.variantSku===r.sku:r.variantSku&&!t.variantSku&&t.sku?t.sku===r.variantSku:!r.variantSku&&!t.variantSku?t.sku===r.sku:!1),j=(n,r,t)=>n.findIndex(e=>e.id===t?!1:r.variantSku&&e.variantSku?e.variantSku===r.variantSku:r.variantSku&&!e.variantSku&&e.sku?e.sku===r.variantSku:!1),J=(n,r,t,e=1)=>n.map((o,s)=>s===t?{...o,quantity:o.quantity+e}:s===r?null:o).filter(Boolean),z=(n,r,t)=>{const e=[...n],o=[],s=[],a=[];return r.forEach((l,Q)=>{const h=t[Q];if(h!=null&&h.replaceItemSku){const d=e.findIndex(f=>f.sku===h.replaceItemSku||f.id===h.replaceItemSku);if(d!==-1){const f=$(e,l);if(f!==-1&&f!==d){e.splice(d,1);const m=f>d?f-1:f;e[m]={...e[m],quantity:e[m].quantity+l.quantity},a.push(e[m])}else{const m={...l,id:F(l.sku)};e[d]=m,s.push(m)}return}}const p=$(e,l);if(p!==-1)e[p]={...e[p],quantity:e[p].quantity+l.quantity},a.push(e[p]);else{const d={...l,id:F(l.sku)};e.push(d),o.push(d)}}),{updatedItems:e,addedItems:o,replacedItems:s,mergedItems:a}},G=(n,r,t,e=1)=>{const o=r?j(n,t,r):-1;if(o!==-1){const a=n.findIndex(l=>l.id===r);return{updatedItems:J(n,a,o,e),wasMerged:!0,mergedIntoIndex:o}}return{updatedItems:n.map(a=>r&&a.id===r?{...a,...t,id:r}:!r&&a.sku===t.sku?{...a,...t}:a),wasMerged:!1}},Y=n=>n.map(r=>{const t=r.id||r.sku,e=document.forms[`form-${t}`];if(!e)return null;const o=new FormData(e);return o.get("valid")==="true"?M(o):null}),Z=n=>{let r=[];return n&&typeof n=="object"?n.optionsUIDs&&Array.isArray(n.optionsUIDs)?r=n.optionsUIDs:Array.isArray(n)&&(r=n):typeof n=="string"&&(r=[n]),r},B=n=>{try{const r=localStorage.getItem(n);if(r)return JSON.parse(r)}catch(r){console.error("Error reading from localStorage:",r)}return{}},H=(n,r,t)=>{if(t.length!==0)try{const e=B(n);e[r]=t,localStorage.setItem(n,JSON.stringify(e))}catch(e){console.error("Error saving to localStorage:",e)}},X=(n,r,t)=>n.map(e=>{const o=r.find(s=>e.sku===s.sku||e.sku===s.variantSku);if(o){const s=o.id||o.sku,a=t[s];if(a&&a.length>0)return{...e,optionsUIDs:a}}return e}),w=({getProductsData:n,onAddAllToCart:r}={})=>{const[t,e]=A([]),[o,s]=A(!1),[a,l]=A(new Set),[Q,h]=A(!1),p="quick-order-selected-options",d=v(u=>{h(u)},[]);b(()=>{const u=S.on("quick-order/loading",i=>{s(i)},{eager:!0});return()=>{u==null||u.off()}},[]),b(()=>{const u=S.on("quick-order/add-items",async i=>{if(i&&i.length>0){if(!n)return;s(!0),S.emit("quick-order/loading",!0);const k=i.map(c=>c.sku).filter(Boolean);l(c=>new Set([...Array.from(c),...k]));try{let c=[];try{const O=await n(i);d(i.length!==O.length),c=C(i,O)}catch(O){console.error("Error fetching products data:",O),c=C(i,[])}e(O=>{const{updatedItems:g,addedItems:q,mergedItems:N,replacedItems:W}=z(O,c,i);return W.forEach(I=>{const y=D(I);S.emit(`${y}/pdp/data`,I)}),N.forEach(I=>{const y=D(I);S.emit(`${y}/pdp/data`,I)}),q.forEach(I=>{const y=D(I);S.emit(`${y}/pdp/data`,I)}),g})}finally{s(!1),S.emit("quick-order/loading",!1),l(c=>new Set(Array.from(c).filter(O=>!k.includes(O))))}}},{eager:!0});return()=>{u==null||u.off()}},[n,d]),b(()=>{const u=t.map(i=>{const k=D(i),c=i.id;return S.on(`${k}/pdp/data`,O=>{e(g=>G(g,c||"",O,i.quantity||1).updatedItems)})});return()=>{u==null||u.forEach(i=>{i==null||i.off()})}},[t]),b(()=>{const u=V(t);d(!u)},[t,d]),b(()=>{const u=t.map(i=>{const k=D(i),c=i.id||i.sku;return S.on(`${k}/pdp/values`,O=>{const g=Z(O);H(p,c,g)})});return()=>{u.forEach(i=>{i==null||i.off()})}},[t,p]);const f=v(u=>{e(i=>i.filter(k=>k.id!==u&&k.sku!==u))},[]),m=v((u,i)=>{e(k=>k.map(c=>c.sku===u?{...c,quantity:i}:c))},[]),E=v(u=>a.has(u),[a]),L=v(()=>{const u=Y(t).filter(c=>c!==null),i=B(p),k=X(u,t,i);r?r(k):S.emit("quick-order/add-to-cart",k)},[t,r,p]);return{items:t,loading:o,removeItem:f,updateItemQuantity:m,handleAddToCart:L,isItemUpdating:E,isDisabledButton:Q,setDisabledCartButton:d}},cr=({className:n,slots:r,getProductsData:t,onAddAllToCart:e,productsSearch:o,searchFilter:s})=>{const a=P({title:"QuickOrder.QuickOrderItem.title",quantity:"QuickOrder.QuickOrderItem.quantity",price:"QuickOrder.QuickOrderItem.price",remove:"QuickOrder.QuickOrderItem.remove",removeItem:"QuickOrder.QuickOrderItem.removeItem",showOptions:"QuickOrder.QuickOrderItem.showOptions",hideOptions:"QuickOrder.QuickOrderItem.hideOptions",additionalOptions:"QuickOrder.QuickOrderItem.additionalOptions",noAdditionalOptions:"QuickOrder.QuickOrderItem.noAdditionalOptions",emptyList:"QuickOrder.QuickOrderItem.emptyList",sku:"QuickOrder.QuickOrderItem.sku",loading:"QuickOrder.QuickOrderItem.loading",productNotFound:"QuickOrder.QuickOrderItem.productNotFound",productNotFoundDescription:"QuickOrder.QuickOrderItem.productNotFoundDescription",productOptions:"QuickOrder.QuickOrderItem.productOptions",configurableProductError:"QuickOrder.QuickOrderItem.configurableProductError",configurableProductErrorDescription:"QuickOrder.QuickOrderItem.configurableProductErrorDescription",addAllToCart:"QuickOrder.QuickOrderItem.addAllToCart",configurableOptionsWarning:"QuickOrder.QuickOrderItem.configurableOptionsWarning",configurableOptionsWarningDescription:"QuickOrder.QuickOrderItem.configurableOptionsWarningDescription",outOfStock:"QuickOrder.QuickOrderItem.outOfStock",searchPlaceholder:"QuickOrder.Search.placeholder",searchAriaLabel:"QuickOrder.Search.ariaLabel",searchEmptyState:"QuickOrder.Search.emptyState",resultsAvailable:"QuickOrder.Search.resultsAvailable",resultAvailable:"QuickOrder.Search.resultAvailable",srInstructions:"QuickOrder.Search.srInstructions"}),{items:l,loading:Q,removeItem:h,updateItemQuantity:p,handleAddToCart:d,isItemUpdating:f,setDisabledCartButton:m,isDisabledButton:E}=w({getProductsData:t,onAddAllToCart:e});return U("div",{className:x(["b2b-quick-order-quick-order-items",n]),"data-testid":"quick-order-items",children:U(K,{t:a,items:l,onRemove:h,onUpdateQuantity:p,handleAddToCart:d,isItemUpdating:f,slots:r,loading:Q,setDisabledCartButton:m,isDisabledButton:E,productsSearch:o,searchFilter:s})})};export{cr as QuickOrderItems,cr as default};
|
|
3
|
+
import{jsx as v,jsxs as D}from"@dropins/tools/preact-jsx-runtime.js";import{AlertBanner as rr}from"@dropins/tools/components.js";import{Q as er,a as tr}from"../chunks/QuickOrderDisabledOverlay.js";import{classes as j}from"@dropins/tools/lib.js";import{useState as R,useRef as J,useCallback as A,useEffect as Q}from"@dropins/tools/preact-hooks.js";import{events as S}from"@dropins/tools/event-bus.js";import{useText as z}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";import{c as nr}from"../chunks/initialize.js";import"@dropins/tools/fetch-graphql.js";const sr=["sku","parentSku","quantity","optionsUIDs","valid","productType"],ir=t=>{const e=[],r=[];return t.forEach((n,u)=>{if(sr.includes(u))return;const i=n;i&&i.match(/^[A-Za-z0-9+/=]+$/)?e.push(i):r.push({uid:u,value:i})}),{optionUIDs:e,enteredOptions:r}},or=t=>{const e=Number(t.get("quantity")),r=!e||e<1?1:e,n={sku:t.get("sku"),quantity:r},u=t.get("parentSku");u&&(n.parentSku=u);const{optionUIDs:i,enteredOptions:a}=ir(t);return i.length>0&&(n.optionsUIDs=i),a.length>0&&(n.enteredOptions=a),n},_={sku:"",quantity:1,name:"",images:[],inStock:!1,addToCartAllowed:!1,isBundle:!1,prices:{},attributes:[],options:[],url:"",urlKey:"",externalId:"",productType:"simple",shortDescription:"",metaDescription:"",metaKeyword:"",metaTitle:"",description:""},L=(t,e)=>!e||!Array.isArray(e)?t.map(r=>({..._,sku:r.sku,quantity:r.quantity??1})):t.map(r=>{const n=e.find(u=>(u==null?void 0:u.sku)===(r==null?void 0:r.sku));return n?{...n,...r.variantSku&&{variantSku:r.variantSku},quantity:r.quantity??1}:{..._,sku:r.sku,...r.variantSku&&{variantSku:r.variantSku},quantity:r.quantity??1}}),P=t=>t.length===0?!1:t.every(e=>!((e.urlKey||e.url)&&e.name)||e.inStock===!1?!1:e.options&&e.options.length>0?e.options.some(i=>i.required)?e.options.every(i=>{var a;return i.required?(a=i.items)==null?void 0:a.some(l=>l.selected):!0}):e.options.some(i=>i.items&&i.items.length>0&&i.items.some(a=>a.selected===!0)):!0),x=t=>{const e=[];return t.forEach(r=>{if(!((r.urlKey||r.url)&&r.name)){e.push({sku:r.sku,name:r.name||"Unknown",reason:"incomplete_data"});return}if(r.inStock===!1){e.push({sku:r.sku,name:r.name,reason:"out_of_stock"});return}if(r.options&&r.options.length>0){if(r.options.some(a=>a.required)){r.options.every(l=>{var h;return l.required?(h=l.items)==null?void 0:h.some(y=>y.selected):!0})||e.push({sku:r.sku,name:r.name,reason:"missing_required_options"});return}r.options.some(a=>a.items&&a.items.length>0&&a.items.some(l=>l.selected===!0))||e.push({sku:r.sku,name:r.name,reason:"missing_options"})}}),e},w=t=>`quick-order-item-${t.id||t.variantSku||t.sku}`,K=t=>`${t}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,W=(t,e)=>t.findIndex(r=>e.variantSku&&r.variantSku?r.variantSku===e.variantSku:r.variantSku&&!e.variantSku&&e.sku?r.variantSku===e.sku:e.variantSku&&!r.variantSku&&r.sku?r.sku===e.variantSku:!e.variantSku&&!r.variantSku?r.sku===e.sku:!1),ar=(t,e,r)=>t.findIndex(n=>n.id===r?!1:e.variantSku&&n.variantSku?n.variantSku===e.variantSku:e.variantSku&&!n.variantSku&&n.sku?n.sku===e.variantSku:!1),ur=(t,e,r,n=1)=>t.map((u,i)=>i===r?{...u,quantity:u.quantity+n}:i===e?null:u).filter(Boolean),cr=(t,e,r)=>{const n=[...t],u=[],i=[],a=[];return e.forEach((l,h)=>{const y=r[h];if(y!=null&&y.replaceItemSku){const p=n.findIndex(g=>g.sku===y.replaceItemSku||g.id===y.replaceItemSku);if(p!==-1){const g=W(n,l);if(g!==-1&&g!==p){n.splice(p,1);const O=g>p?g-1:g;n[O]={...n[O],quantity:n[O].quantity+l.quantity},a.push(n[O])}else{const O={...l,id:K(l.sku)};n[p]=O,i.push(O)}return}}const q=W(n,l);if(q!==-1)n[q]={...n[q],quantity:n[q].quantity+l.quantity},a.push(n[q]);else{const p={...l,id:K(l.sku)};n.push(p),u.push(p)}}),{updatedItems:n,addedItems:u,replacedItems:i,mergedItems:a}},dr=(t,e,r,n=1)=>{const u=e?ar(t,r,e):-1;if(u!==-1){const a=t.findIndex(l=>l.id===e);return{updatedItems:ur(t,a,u,n),wasMerged:!0,mergedIntoIndex:u}}return{updatedItems:t.map(a=>e&&a.id===e?{...a,...r,id:e}:!e&&a.sku===r.sku?{...a,...r}:a),wasMerged:!1}},lr=t=>t.map(e=>{const r=e.id||e.sku,n=document.forms[`form-${r}`];if(!n)return null;const u=new FormData(n);return u.get("valid")==="true"?or(u):null}),kr=t=>{let e=[];return t&&typeof t=="object"?t.optionsUIDs&&Array.isArray(t.optionsUIDs)?e=t.optionsUIDs:Array.isArray(t)&&(e=t):typeof t=="string"&&(e=[t]),e},G=t=>{try{const e=localStorage.getItem(t);if(e)return JSON.parse(e)}catch(e){console.error("Error reading from localStorage:",e)}return{}},fr=(t,e,r)=>{if(r.length!==0)try{const n=G(t);n[e]=r,localStorage.setItem(t,JSON.stringify(n))}catch(n){console.error("Error saving to localStorage:",n)}},pr=(t,e,r)=>t.map(n=>{const u=e.find(i=>n.sku===i.sku||n.sku===i.variantSku);if(u){const i=u.id||u.sku,a=r[i];if(a&&a.length>0)return{...n,optionsUIDs:a}}return n}),mr=t=>{const e=!t.inStock||!t.addToCartAllowed;if(t.options&&t.options.length>0){if(t.options.some(i=>!i.items||i.items.length===0))return!0;if(t.options.some(i=>i.required)){const i=t.options.every(a=>{var l;return a.required?(l=a.items)==null?void 0:l.some(h=>h.selected):!0});return e||!i}const u=t.options.some(i=>i.items&&i.items.length>0&&i.items.some(a=>a.selected===!0));return e||!u}return e},hr=({getProductsData:t,handleAddToCart:e}={})=>{const[r,n]=R([]),[u,i]=R(!1),[a,l]=R(new Set),[h,y]=R(!1),[q,p]=R(null),[g,O]=R([]),C=J([]),I=z({validationError:"QuickOrder.QuickOrderItem.notification.validationError",backendError:"QuickOrder.QuickOrderItem.notification.backendError",success:"QuickOrder.QuickOrderItem.notification.success",partialSuccess:"QuickOrder.QuickOrderItem.notification.partialSuccess",unexpectedError:"QuickOrder.QuickOrderItem.notification.unexpectedError"}),B="quick-order-selected-options",F=A(()=>{p(null)},[]),b=A(s=>{y(s)},[]);Q(()=>{const s=S.on("quick-order/loading",o=>{i(o)},{eager:!0});return()=>{s==null||s.off()}},[]),Q(()=>{const s=S.on("quick-order/add-items",async o=>{if(o&&o.length>0){if(!t)return;i(!0),S.emit("quick-order/loading",!0);const k=o.map(d=>d.sku).filter(Boolean);l(d=>new Set([...Array.from(d),...k]));try{let d=[];try{const f=await t(o);b(o.length!==f.length),d=L(o,f)}catch(f){console.error("Error fetching products data:",f),d=L(o,[])}const c=x(d);if(c.length>0){const f=c.map(m=>m.sku);p(m=>{if((m==null?void 0:m.type)==="validation"&&m.clickableSkus){const T=[...new Set([...m.clickableSkus,...f])];return{...m,clickableSkus:T}}return{type:"validation",variant:"warning",message:I.validationError,clickableSkus:f}})}n(f=>{const{updatedItems:m,addedItems:T,mergedItems:H,replacedItems:X}=cr(f,d,o);return X.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),H.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),T.forEach(E=>{const U=w(E);S.emit(`${U}/pdp/data`,E)}),m})}finally{i(!1),S.emit("quick-order/loading",!1),l(d=>new Set(Array.from(d).filter(c=>!k.includes(c))))}}},{eager:!0});return()=>{s==null||s.off()}},[t,b]),Q(()=>{const s=r.map(o=>{const k=w(o),d=o.id;return S.on(`${k}/pdp/data`,c=>{n(f=>dr(f,d||"",c,o.quantity||1).updatedItems)})});return()=>{s==null||s.forEach(o=>{o==null||o.off()})}},[r]),Q(()=>{const s=P(r);b(!s)},[r,b]),Q(()=>{p(s=>{if(!s||!s.clickableSkus||s.clickableSkus.length===0)return s;const o=s.clickableSkus.filter(k=>{const d=r.filter(c=>c.sku===k||c.variantSku===k);return d.length===0?!1:d.some(c=>mr(c))});return o.length===0?null:o.length!==s.clickableSkus.length?{...s,clickableSkus:o}:s})},[r]),Q(()=>{!h||r.length===0||p(s=>{if(s&&(s.type==="validation"||s.type==="partial-success"))return s;const o=x(r);if(o.length===0)return s;const k=[...new Set(o.map(f=>f.sku))],d=(s==null?void 0:s.clickableSkus)||[];return k.length!==d.length||!k.every(f=>d.includes(f))?{type:"validation",variant:"warning",message:I.validationError,clickableSkus:k}:s})},[h,r,I.validationError]),Q(()=>{const s=r.map(o=>{const k=w(o),d=o.id||o.sku;return S.on(`${k}/pdp/values`,c=>{const f=kr(c);fr(B,d,f)})});return()=>{s.forEach(o=>{o==null||o.off()})}},[r,B]),Q(()=>{C.current=g},[g]),Q(()=>{const s=S.on("cart/product/added",k=>{const d=Array.isArray(k)?k.length:0,c=Array.isArray(k)?k.map(f=>f.sku).filter(Boolean):[];if(g.length>0){const f=g.filter(m=>!c.includes(m));f.length>0&&d>0&&(p({type:"partial-success",variant:"warning",message:I.partialSuccess,count:d,clickableSkus:f}),O([]))}else return}),o=S.on("quick-order/add-to-cart-error",k=>{p({type:"backend-error",variant:"warning",message:I.backendError,details:k.message}),O([])});return()=>{s==null||s.off(),o==null||o.off()}},[g]),Q(()=>{const s=S.on("cart/data",o=>{if(C.current.length===0||!(o!=null&&o.items)||o.items.length===0)return;const k=o.items.flatMap(c=>{var m;const f=[];return c.sku&&f.push(c.sku),(m=c.product)!=null&&m.sku&&f.push(c.product.sku),f}),d=C.current.filter(c=>k.includes(c));d.length!==0&&(p({type:"success",variant:"success",message:I.success,count:d.length}),O([]),S.emit("quick-order/loading",!1))},{eager:!0});return()=>{s==null||s.off()}},[]);const M=A(s=>{n(o=>o.filter(k=>k.id!==s&&k.sku!==s))},[]),N=A(()=>{n([]),p(null)},[]),V=A((s,o)=>{n(k=>k.map(d=>d.sku===s?{...d,quantity:o}:d))},[]),$=A(s=>a.has(s),[a]),Z=A(()=>{const s=lr(r).filter(c=>c!==null);if(r.length>0&&!P(r)){const m=x(r).map(T=>T.sku);p({type:"validation",variant:"warning",message:I.validationError,clickableSkus:m});return}if(s.length===0){if(r.length>0){const f=x(r).map(m=>m.sku);p({type:"validation",variant:"warning",message:I.validationError,clickableSkus:f})}return}p(null);const o=s.map(c=>c.sku).filter(c=>!!c);O(o);const k=G(B),d=pr(s,r,k);e?(S.emit("quick-order/loading",!0),Promise.resolve(e(d,N)).then(c=>{c&&typeof c=="string"&&(p({type:"backend-error",variant:"warning",message:I.backendError,details:c}),O([]))}).catch(c=>{p({type:"backend-error",variant:"warning",message:I.backendError,details:c.message||I.unexpectedError}),O([])}).finally(()=>{S.emit("quick-order/loading",!1)})):S.emit("quick-order/add-to-cart",d)},[r,e,B]);return{items:r,loading:u,removeItem:M,clearItems:N,updateItemQuantity:V,addToCart:Z,isItemUpdating:$,isDisabledButton:h,setDisabledCartButton:b,notification:q,dismissNotification:F}},gr=({notification:t,onDismiss:e,onSkuClick:r,validationErrorText:n,backendErrorText:u,successText:i,partialSuccessText:a})=>{if(!t)return null;const l=()=>{switch(t.type){case"validation":return Or(n,t.clickableSkus,t.details,r);case"partial-success":return Sr(a,t.message,t.count,t.clickableSkus,r);case"backend-error":return Ir(u,t.details);case"success":return yr(i,t.count);default:return v("span",{children:t.message})}};return v("div",{className:j(["b2b-quick-order-notification-banner",[`b2b-quick-order-notification-banner--${t.variant}`,t.variant]]),children:v(rr,{variant:t.variant,message:l(),onDismiss:e})})};function Y(t,e){return t.map((r,n)=>D("span",{children:[v("a",{href:"#",onClick:u=>{u.preventDefault(),e(r)},style:{cursor:"pointer",textDecoration:"underline",color:"white"},children:r}),n<t.length-1?", ":""]},r))}function Or(t,e,r,n){return e!=null&&e.length&&n?D("span",{children:[t," - ",Y(e,n)]}):D("span",{children:[t," - ",r]})}function Sr(t,e,r,n,u){if(!t)return v("span",{children:e});const i=t.replace("{count}",String(r||0)).replace("{total}",String((r||0)+((n==null?void 0:n.length)||0)));return n!=null&&n.length&&u?D("span",{children:[i,": ",Y(n,u)]}):D("span",{children:[i,": ",(n==null?void 0:n.join(", "))||"Unknown"]})}function Ir(t,e){return D("span",{children:[t,e?` - ${e}`:""]})}function yr(t,e){return e!==void 0?v("span",{children:t.replace("{count}",String(e))}):v("span",{children:t})}const Tr=({className:t,slots:e,getProductsData:r,handleAddToCart:n,productsSearch:u,searchFilter:i})=>{const a=nr.getConfig().quickOrderActive,l=J(null),h=z({title:"QuickOrder.QuickOrderItem.title",quantity:"QuickOrder.QuickOrderItem.quantity",price:"QuickOrder.QuickOrderItem.price",remove:"QuickOrder.QuickOrderItem.remove",removeItem:"QuickOrder.QuickOrderItem.removeItem",showOptions:"QuickOrder.QuickOrderItem.showOptions",hideOptions:"QuickOrder.QuickOrderItem.hideOptions",additionalOptions:"QuickOrder.QuickOrderItem.additionalOptions",noAdditionalOptions:"QuickOrder.QuickOrderItem.noAdditionalOptions",emptyList:"QuickOrder.QuickOrderItem.emptyList",sku:"QuickOrder.QuickOrderItem.sku",loading:"QuickOrder.QuickOrderItem.loading",productNotFound:"QuickOrder.QuickOrderItem.productNotFound",productNotFoundDescription:"QuickOrder.QuickOrderItem.productNotFoundDescription",productOptions:"QuickOrder.QuickOrderItem.productOptions",configurableProductError:"QuickOrder.QuickOrderItem.configurableProductError",configurableProductErrorDescription:"QuickOrder.QuickOrderItem.configurableProductErrorDescription",addAllToCart:"QuickOrder.QuickOrderItem.addAllToCart",configurableOptionsWarning:"QuickOrder.QuickOrderItem.configurableOptionsWarning",configurableOptionsWarningDescription:"QuickOrder.QuickOrderItem.configurableOptionsWarningDescription",outOfStock:"QuickOrder.QuickOrderItem.outOfStock",searchPlaceholder:"QuickOrder.Search.placeholder",searchAriaLabel:"QuickOrder.Search.ariaLabel",searchEmptyState:"QuickOrder.Search.emptyState",resultsAvailable:"QuickOrder.Search.resultsAvailable",resultAvailable:"QuickOrder.Search.resultAvailable",srInstructions:"QuickOrder.Search.srInstructions",notificationValidationError:"QuickOrder.QuickOrderItem.notification.validationError",notificationBackendError:"QuickOrder.QuickOrderItem.notification.backendError",notificationSuccess:"QuickOrder.QuickOrderItem.notification.success",notificationPartialSuccess:"QuickOrder.QuickOrderItem.notification.partialSuccess",disabledMessage:"QuickOrder.QuickOrderItem.disabledMessage"}),{items:y,loading:q,removeItem:p,clearItems:g,updateItemQuantity:O,addToCart:C,isItemUpdating:I,setDisabledCartButton:B,isDisabledButton:F,notification:b,dismissNotification:M}=hr({getProductsData:r,handleAddToCart:n});Q(()=>{b&&b.variant==="warning"&&l.current&&l.current.scrollIntoView({behavior:"smooth",block:"start"})},[b]);const N=V=>{const $=document.querySelector(`form[data-sku="${V}"]`);$&&$.scrollIntoView({behavior:"smooth",block:"center"})};return D("div",{className:j(["b2b-quick-order-quick-order-items",!a&&"b2b-quick-order-disabled",t]),"data-testid":"quick-order-items",style:{position:"relative"},children:[v("div",{ref:l,children:v(gr,{notification:b,onDismiss:M,onSkuClick:N,validationErrorText:h.notificationValidationError,backendErrorText:h.notificationBackendError,successText:h.notificationSuccess,partialSuccessText:h.notificationPartialSuccess})}),v(er,{isDisabled:!a,message:h.disabledMessage,children:v(tr,{t:h,items:y,onRemove:p,clearItems:g,onUpdateQuantity:O,handleAddToCart:C,isItemUpdating:I,slots:e,loading:q,setDisabledCartButton:B,isDisabledButton:F,productsSearch:u,searchFilter:i})})]})};export{Tr as QuickOrderItems,Tr as default};
|
|
4
4
|
//# sourceMappingURL=QuickOrderItems.js.map
|