@dropins/storefront-quote-management 0.0.1-alpha30 → 0.0.1-alpha31
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/duplicateNegotiableQuote/duplicateNegotiableQuote.d.ts +1 -0
- package/api/getQuoteTemplates/graphql/getQuoteTemplates.d.ts +1 -1
- package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +1 -1
- package/api.js +1 -1
- package/chunks/AttachedFilesList.js +1 -1
- package/chunks/AttachedFilesList.js.map +1 -1
- package/chunks/CheckWithCircle.js +4 -0
- package/chunks/CheckWithCircle.js.map +1 -0
- package/chunks/ItemsQuoted.js +1 -1
- package/chunks/ItemsQuoted.js.map +1 -1
- package/chunks/ItemsQuotedTemplate.js +1 -1
- package/chunks/ItemsQuotedTemplate.js.map +1 -1
- package/chunks/LineItemNoteModal.js +1 -1
- package/chunks/LineItemNoteModal.js.map +1 -1
- package/chunks/NegotiableQuoteTemplateFragment.js +148 -6
- package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -1
- package/chunks/ShippingAddressDisplay.js +1 -1
- package/chunks/ShippingAddressDisplay.js.map +1 -1
- package/chunks/WarningFilled.js +1 -1
- package/chunks/WarningFilled.js.map +1 -1
- package/chunks/addQuoteTemplateLineItemNote.js +1 -1
- package/chunks/addQuoteTemplateLineItemNote.js.map +1 -1
- package/chunks/duplicateNegotiableQuote.js +8 -8
- package/chunks/duplicateNegotiableQuote.js.map +1 -1
- package/chunks/getQuoteTemplates.js +13 -11
- package/chunks/getQuoteTemplates.js.map +1 -1
- package/chunks/negotiableQuotes.js +1 -1
- package/chunks/transform-quote-template.js +1 -1
- package/chunks/transform-quote-template.js.map +1 -1
- package/chunks/transform-quote.js +1 -1
- package/chunks/transform-quote.js.map +1 -1
- package/components/LineItemNoteModal/LineItemNoteModal.d.ts +2 -2
- package/components/ProductListTable/ProductListTable.d.ts +5 -49
- package/containers/ItemsQuoted/ItemsQuoted.d.ts +7 -7
- package/containers/ItemsQuoted.js +1 -1
- package/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.d.ts +3 -3
- package/containers/ItemsQuotedTemplate.js +1 -1
- package/containers/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +3 -4
- package/containers/ManageNegotiableQuote.js +1 -1
- package/containers/ManageNegotiableQuote.js.map +1 -1
- package/containers/ManageNegotiableQuoteTemplate.js +2 -2
- package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
- package/containers/QuoteSummaryList/QuoteSummaryList.d.ts +1 -1
- package/containers/QuoteSummaryList.js +1 -1
- package/containers/QuoteSummaryList.js.map +1 -1
- package/containers/QuoteTemplatesListTable.js +1 -1
- package/containers/QuoteTemplatesListTable.js.map +1 -1
- package/containers/QuotesListTable.js +1 -1
- package/containers/QuotesListTable.js.map +1 -1
- package/containers/RequestNegotiableQuoteForm.js +1 -1
- package/containers/RequestNegotiableQuoteForm.js.map +1 -1
- package/containers/ShippingAddressDisplay.js +1 -1
- package/data/models/__fixtures__/negotiableQuoteModel.d.ts +5 -5
- package/data/models/negotiable-quote-model.d.ts +2 -2
- package/data/models/negotiable-quote-template-model.d.ts +3 -39
- package/data/transforms/__fixtures__/negotiableQuoteData.d.ts +5 -0
- package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +561 -75
- package/data/transforms/transform-history.d.ts +15 -0
- package/data/transforms/transform-quote-items.d.ts +15 -0
- package/hooks/useItemsQuotedTemplate.d.ts +3 -4
- package/hooks/useRemoveTemplateItems.d.ts +3 -3
- package/hooks/useUpdateTemplateQuantities.d.ts +2 -2
- package/i18n/en_US.json.d.ts +24 -5
- package/lib/itemFormatters.d.ts +1 -1
- package/lib/priceCalculators.d.ts +1 -1
- package/package.json +1 -1
- package/render.js +2 -2
- package/render.js.map +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as i,jsxs as _,Fragment as C}from"@dropins/tools/preact-jsx-runtime.js";import*as Q from"@dropins/tools/preact-compat.js";import{useState as N,useEffect as oe,useCallback as ce}from"@dropins/tools/preact-compat.js";import{Divider as j,Skeleton as ue,SkeletonRow as le,Price as q,Image as se,Button as de,CartList as me,Accordion as ge,AccordionSection as ye,CartItem as he}from"@dropins/tools/components.js";import{classes as v,VComponent as A,Slot as s}from"@dropins/tools/lib.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{Q as b,s as fe}from"../chunks/state.js";import{events as pe}from"@dropins/tools/event-bus.js";import{S as ve}from"../chunks/ChevronDown.js";import{useText as _e}from"@dropins/tools/i18n.js";const be=e=>Q.createElement("svg",{id:"Icon_Chevron_right_Base","data-name":"Icon \\u2013 Chevron right \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...e},Q.createElement("g",{id:"Large"},Q.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),Q.createElement("g",{id:"Chevron_right_icon","data-name":"Chevron right icon"},Q.createElement("path",{vectorEffect:"non-scaling-stroke",id:"chevron",d:"M199.75,367.5l4.255,-4.255-4.255,-4.255",transform:"translate(-189.25 -351.0)",fill:"none",stroke:"currentColor"})))),F=({className:e,children:n,heading:t,footer:a,products:o,outOfStockMessage:r,loading:l=!0,variant:d="primary",...m})=>i("div",{...m,className:v(["quote-management-quote-summary-list",e,`quote-management-quote-summary-list__background--${d}`]),children:l?i(xe,{}):_(C,{children:[(t||r)&&_("div",{"data-testid":"quote-summary-list-heading-wrapper",className:v(["quote-management-quote-summary-list__heading",["quote-management-quote-summary-list__heading--full-width",!o]]),children:[t&&_(C,{children:[i(A,{node:t,className:"quote-management-quote-summary-list__heading-text"}),i(j,{variant:"primary",className:v(["quote-management-quote-summary-list__heading-divider"])})]}),r&&i(A,{node:r,className:"quote-management-quote-summary-list__out-of-stock-message"})]}),i("div",{className:v(["quote-management-quote-summary-list__content"]),children:o}),a&&_(C,{children:[i(j,{variant:"primary",className:v(["quote-management-quote-summary-list__footer-divider"])}),i(A,{node:a,className:"quote-management-quote-summary-list__footer-text"})]})]})}),xe=()=>i(ue,{"data-testid":"quote-summary-list-skeleton",className:"quote-management-quote-summary-list__skeleton",rowGap:"medium",children:i(le,{variant:"row",size:"xlarge",fullWidth:!0,lines:3,multilineGap:"small"})}),Ie=()=>{const[e,n]=N(void 0),[t,a]=N(!0);return oe(()=>{const o=pe.on("quote-management/quote-data",r=>{const{quote:l}=r;l&&(n(l),a(!1))},{eager:!0});return()=>o==null?void 0:o.off()},[]),{quoteData:e,loading:t}},B=(e,n)=>{var t;return((t=n.quoteDisplaySettings)==null?void 0:t.price)===b.TAX_INCLUDED?e.discounted?{amount:e.prices.regularPrice.value,currency:e.prices.regularPrice.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:e.prices.priceIncludingTax.value,currency:e.prices.priceIncludingTax.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:e.prices.regularPrice.value,currency:e.prices.regularPrice.currency,style:{font:"inherit"},"data-testid":"regular-item-price"}},z=e=>{var n,t;return{amount:(n=e.savingsAmount)==null?void 0:n.value,currency:(t=e.savingsAmount)==null?void 0:t.currency,style:{font:"inherit"},"data-testid":"item-savings-amount"}},G=(e,n)=>{var o,r,l,d,m,x,I,E,c,f,p,P;const t={"aria-label":n.dictionary.regularPrice},a=e.discounted?{}:null;return((o=n.quoteDisplaySettings)==null?void 0:o.price)===b.TAX_INCLUDED||((r=n.quoteDisplaySettings)==null?void 0:r.price)===b.TAX_INCLUDED_AND_EXCLUDED?(t.amount=(l=e.prices.rowTotalIncludingTax)==null?void 0:l.value,t.currency=(d=e.prices.rowTotalIncludingTax)==null?void 0:d.currency,t.variant=e.discounted?"strikethrough":"default",t["data-testid"]="including-tax-item-total",a&&(t.amount=(m=e.prices.originalRowTotal)==null?void 0:m.value,t.currency=(x=e.prices.originalRowTotal)==null?void 0:x.currency,a.amount=(I=e.prices.rowTotalIncludingTax)==null?void 0:I.value,a.currency=(E=e.prices.rowTotalIncludingTax)==null?void 0:E.currency,a.sale=!0,a["aria-label"]=n.dictionary.discountedPrice,a["data-testid"]="discount-total")):(t.amount=(c=e.prices.originalRowTotal)==null?void 0:c.value,t.currency=(f=e.prices.originalRowTotal)==null?void 0:f.currency,t.variant=e.discounted?"strikethrough":"default",t["data-testid"]="regular-item-total",a&&(a.amount=(p=e.discountedTotal)==null?void 0:p.value,a.currency=(P=e.discountedTotal)==null?void 0:P.currency,a.sale=!0,a["aria-label"]=n.dictionary.discountedPrice,a["data-testid"]="discount-total")),{totalProps:t,discountProps:a}},Te=e=>{const n=e==null?void 0:e.map(a=>({label:a.label,value:a.values.map(o=>o.label).join(", ")})),t={};return n==null||n.forEach(a=>{t[a.label]=a.value}),Object.keys(t).length>0?t:null},Se=e=>{const n=e==null?void 0:e.map(a=>({label:a.optionLabel,value:a.valueLabel})),t={};return n==null||n.forEach(a=>{t[a.label]=a.value}),Object.keys(t).length>0?t:null},Qe=e=>{const n=e==null?void 0:e.map(a=>({label:a.label,type:a.type,values:a.values.map(o=>({label:o.label,value:o.value}))})),t={};return n==null||n.forEach(a=>{var o;switch(a.type){case"field":case"area":case"date_time":t[a.label]=a.values[0].value;break;case"radio":case"drop_down":t[a.label]=a.values[0].label;break;case"multiple":case"checkbox":t[a.label]=a.values.reduce((r,l)=>r?`${r}, ${l.label}`:l.label,"");break;case"file":{const r=new DOMParser,l=a.values[0].value,m=((o=r.parseFromString(l,"text/html").querySelector("a"))==null?void 0:o.textContent)||"";t[a.label]=m;break}}}),t},qe=4,V=(e,n,t)=>{var r;if(t.attributesToHide.includes("image"))return;const a={loading:n<qe?"eager":"lazy",src:e.image.src,alt:e.image.alt,width:"300",height:"300",params:{width:300}},o=i(se,{"data-testid":"quote-summary-list-item-image",...a});return i(s,{name:"Thumbnail",slot:(r=t.slots)==null?void 0:r.Thumbnail,context:{item:e,defaultImageProps:a},children:t.routeProduct?i("a",{href:t.routeProduct(e),children:o}):o})},W=(e,n)=>{if(!n.attributesToHide.includes("name"))return i("span",{"data-testid":"quote-summary-list-item-title",children:n.routeProduct?i("a",{href:n.routeProduct(e),children:e.product.name}):e.product.name})},Y=e=>i("span",{"data-testid":"quote-summary-list-item-sku",children:e.product.sku}),H=(e,n)=>{var t;return i(s,{name:"ProductAttributes",slot:(t=n.slots)==null?void 0:t.ProductAttributes,context:{item:e}})},J=(e,n)=>{if(n.attributesToHide.includes("configurations"))return;const t={...Te(e.bundleOptions),...Se(e.configurableOptions),...Qe(e.customizableOptions),...e.links&&e.links.count?e.links.count>1?{[n.dictionary.files.replace("{count}",e.links.count.toString())]:e.links.result}:{[n.dictionary.file.replace("{count}",e.links.count.toString())]:e.links.result}:null};if(Object.keys(t).length!==0)return t},K=(e,n)=>{var t;return((t=n.quoteDisplaySettings)==null?void 0:t.price)===b.TAX_INCLUDED_AND_EXCLUDED?i(q,{amount:e.prices.rowTotal.value,currency:e.prices.rowTotal.currency,"data-testid":"excluding-tax-total","aria-label":n.dictionary.regularPrice}):void 0},Xe=({hideHeading:e,hideFooter:n,routeProduct:t,showMaxItems:a=!0,attributesToHide:o=[],slots:r,accordion:l=!1,variant:d="primary",showDiscount:m,showSavings:x,...I})=>{const{quoteData:c,loading:f}=Ie(),[p,P]=N(a),{quoteDisplaySettings:g,quoteSummaryMaxItems:Z}=fe.config,w=Z||5,y=_e({discountedPrice:"NegotiableQuote.QuoteSummaryList.discountedPrice",discountPercentage:"NegotiableQuote.QuoteSummaryList.discountPercentage",editQuote:"NegotiableQuote.QuoteSummaryList.editQuote",file:"NegotiableQuote.QuoteSummaryList.file",files:"NegotiableQuote.QuoteSummaryList.files",heading:"NegotiableQuote.QuoteSummaryList.heading",listOfQuoteItems:"NegotiableQuote.QuoteSummaryList.listOfQuoteItems",regularPrice:"NegotiableQuote.QuoteSummaryList.regularPrice",savingsAmount:"NegotiableQuote.QuoteSummaryList.savingsAmount",viewMore:"NegotiableQuote.QuoteSummaryList.viewMore"}),ee=ce(()=>{P(h=>!h)},[]),T={attributesToHide:o,routeProduct:t,slots:r,dictionary:y,quoteDisplaySettings:g},L={dictionary:y,quoteDisplaySettings:g},O=h=>i(s,{name:"Footer",slot:r==null?void 0:r.Footer,context:{item:h}}),te=h=>c!=null&&c.totalQuantity?c.items.filter(h).map((u,X)=>{const{totalProps:ne,discountProps:$}=G(u,L),ie=i(he,{loading:f,"data-testid":`quote-summary-list-item-entry-${u.uid}`,image:V(u,X,T),title:i(s,{name:"ItemTitle",slot:r==null?void 0:r.ItemTitle,context:{item:u},children:W(u,T)}),sku:o.includes("sku")?void 0:i(s,{name:"ItemSku",slot:r==null?void 0:r.ItemSku,context:{item:u},children:Y(u)}),price:o.includes("price")?void 0:i(s,{name:"ItemPrice",slot:r==null?void 0:r.ItemPrice,context:{item:u},slotTag:"span",children:i(q,{...B(u,L)})}),quantity:o.includes("quantity")?void 0:u.quantity,total:_(C,{children:[o.includes("total")?void 0:i(s,{name:"ItemTotal",slot:r==null?void 0:r.ItemTotal,context:{item:u},children:i(q,{...ne})}),o.includes("totalDiscount")?void 0:$&&i(s,{name:"ItemTotal",slot:r==null?void 0:r.ItemTotal,context:{item:u},children:i(q,{...$})})]}),attributes:H(u,T),configurations:J(u,T),totalExcludingTax:o.includes("totalExcludingTax")?void 0:K(u,T),taxIncluded:(g==null?void 0:g.price)===b.TAX_INCLUDED,taxExcluded:!o.includes("totalExcludingTax")&&(g==null?void 0:g.price)===b.TAX_INCLUDED_AND_EXCLUDED,discount:m&&u.discounted&&u.discountPercentage!==void 0?i("div",{"data-testid":"item-discount-percentage",children:y.discountPercentage.replace("{discount}",u.discountPercentage.toString())}):void 0,savings:x&&u.discounted&&u.savingsAmount!==void 0?_("div",{children:[i("span",{children:i(q,{...z(u)})})," ",y.savingsAmount]}):void 0,footer:O(u)},u.uid);return i(s,{name:"CartItem",slot:r==null?void 0:r.QuoteItem,context:{item:u,index:X,loading:f,attributesToHide:o,quoteDisplaySettings:g,showDiscount:m,showSavings:x,dictionary:y,getImage:V,getTitle:W,getSku:Y,getPriceProps:B,getTotalPriceProps:G,getProductAttributes:H,getConfigurations:J,getTotalExcludingTax:K,getFooter:O,getSavingsAmount:z},children:ie},u.uid)}):null,M=i(s,{name:"Heading",slot:r==null?void 0:r.Heading,context:{count:(c==null?void 0:c.totalQuantity)??0,quoteId:c==null?void 0:c.uid},children:i("div",{"data-testid":"default-quote-summary-list-heading",children:y.heading.replace("({count})",c!=null&&c.totalQuantity?`(${c==null?void 0:c.totalQuantity.toString()})`:"")})}),D=M.props.children.props.children,k=te(h=>!h.outOfStock&&!h.insufficientQuantity),S=(c==null?void 0:c.items.length)||0,ae=p?Math.min(S,w):S,re=S>ae,R=c!=null&&c.totalQuantity&&k?i(s,{name:"Footer",slot:r==null?void 0:r.QuoteSummaryFooter,context:{displayMaxItems:p},"data-testid":"quote-summary-list-footer-slot",className:"quote-management-quote-summary-list-footer",children:re?i(de,{className:"quote-management-quote-summary-list-footer__action",onClick:ee,"data-testid":"view-more-items-button",variant:"tertiary",children:y.viewMore}):null}):null,U=c!=null&&c.totalQuantity?i(me,{"data-testid":"quote-summary-list",children:k==null?void 0:k.slice(0,p?Math.min(S,w):S)}):null;return l?i(ge,{"data-testid":"quote-summary-list-accordion",className:v(["quote-management-quote-summary-list-accordion",`quote-management-quote-summary-list__background--${d}`]),iconOpen:be,iconClose:ve,children:i(ye,{title:D,ariaLabelTitle:D,"data-testid":"quote-summary-list-accordion__section",open:!0,renderContentWhenClosed:!0,children:i(F,{...I,"aria-expanded":!0,"aria-label":y.listOfQuoteItems,className:"quote-management-quote-summary-list-accordion__list",footer:n?void 0:R,products:U,outOfStockMessage:void 0,loading:f,variant:d})})}):i(F,{...I,heading:e?void 0:M,footer:n?void 0:R,products:U,outOfStockMessage:void 0,loading:f,variant:d})};export{Xe as QuoteSummaryList,Xe as default};
|
|
3
|
+
import{jsx as i,jsxs as f,Fragment as k}from"@dropins/tools/preact-jsx-runtime.js";import*as S from"@dropins/tools/preact-compat.js";import{useState as A,useEffect as ie,useCallback as oe}from"@dropins/tools/preact-compat.js";import{Divider as $,Skeleton as ce,SkeletonRow as ue,Price as Q,Image as le,Button as se,CartList as de,Accordion as me,AccordionSection as ge,CartItem as ye}from"@dropins/tools/components.js";import{classes as v,VComponent as E,Slot as s}from"@dropins/tools/lib.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{Q as _,s as he}from"../chunks/state.js";import{events as pe}from"@dropins/tools/event-bus.js";import{S as ve}from"../chunks/ChevronDown.js";import{useText as fe}from"@dropins/tools/i18n.js";const _e=e=>S.createElement("svg",{id:"Icon_Chevron_right_Base","data-name":"Icon \\u2013 Chevron right \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...e},S.createElement("g",{id:"Large"},S.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),S.createElement("g",{id:"Chevron_right_icon","data-name":"Chevron right icon"},S.createElement("path",{vectorEffect:"non-scaling-stroke",id:"chevron",d:"M199.75,367.5l4.255,-4.255-4.255,-4.255",transform:"translate(-189.25 -351.0)",fill:"none",stroke:"currentColor"})))),j=({className:e,children:n,heading:t,footer:a,products:o,outOfStockMessage:r,loading:l=!0,variant:d="primary",...m})=>i("div",{...m,className:v(["quote-management-quote-summary-list",e,`quote-management-quote-summary-list__background--${d}`]),children:l?i(be,{}):f(k,{children:[(t||r)&&f("div",{"data-testid":"quote-summary-list-heading-wrapper",className:v(["quote-management-quote-summary-list__heading",["quote-management-quote-summary-list__heading--full-width",!o]]),children:[t&&f(k,{children:[i(E,{node:t,className:"quote-management-quote-summary-list__heading-text"}),i($,{variant:"primary",className:v(["quote-management-quote-summary-list__heading-divider"])})]}),r&&i(E,{node:r,className:"quote-management-quote-summary-list__out-of-stock-message"})]}),i("div",{className:v(["quote-management-quote-summary-list__content"]),children:o}),a&&f(k,{children:[i($,{variant:"primary",className:v(["quote-management-quote-summary-list__footer-divider"])}),i(E,{node:a,className:"quote-management-quote-summary-list__footer-text"})]})]})}),be=()=>i(ce,{"data-testid":"quote-summary-list-skeleton",className:"quote-management-quote-summary-list__skeleton",rowGap:"medium",children:i(ue,{variant:"row",size:"xlarge",fullWidth:!0,lines:3,multilineGap:"small"})}),xe=()=>{const[e,n]=A(void 0),[t,a]=A(!0);return ie(()=>{const o=pe.on("quote-management/quote-data",r=>{const{quote:l}=r;l&&(n(l),a(!1))},{eager:!0});return()=>o==null?void 0:o.off()},[]),{quoteData:e,loading:t}},F=(e,n)=>{var t;return((t=n.quoteDisplaySettings)==null?void 0:t.price)===_.TAX_INCLUDED?e.discounted?{amount:e.prices.regularPrice.value,currency:e.prices.regularPrice.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:e.prices.priceIncludingTax.value,currency:e.prices.priceIncludingTax.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:e.prices.regularPrice.value,currency:e.prices.regularPrice.currency,style:{font:"inherit"},"data-testid":"regular-item-price"}},B=e=>{var n,t;return{amount:(n=e.savingsAmount)==null?void 0:n.value,currency:(t=e.savingsAmount)==null?void 0:t.currency,style:{font:"inherit"},"data-testid":"item-savings-amount"}},z=(e,n)=>{var o,r,l,d,m,b,x,C,u,h,p,q;const t={"aria-label":n.dictionary.regularPrice},a=e.discounted?{}:null;return((o=n.quoteDisplaySettings)==null?void 0:o.price)===_.TAX_INCLUDED||((r=n.quoteDisplaySettings)==null?void 0:r.price)===_.TAX_INCLUDED_AND_EXCLUDED?(t.amount=(l=e.prices.rowTotalIncludingTax)==null?void 0:l.value,t.currency=(d=e.prices.rowTotalIncludingTax)==null?void 0:d.currency,t.variant=e.discounted?"strikethrough":"default",t["data-testid"]="including-tax-item-total",a&&(t.amount=(m=e.prices.originalRowTotal)==null?void 0:m.value,t.currency=(b=e.prices.originalRowTotal)==null?void 0:b.currency,a.amount=(x=e.prices.rowTotalIncludingTax)==null?void 0:x.value,a.currency=(C=e.prices.rowTotalIncludingTax)==null?void 0:C.currency,a.sale=!0,a["aria-label"]=n.dictionary.discountedPrice,a["data-testid"]="discount-total")):(t.amount=(u=e.prices.originalRowTotal)==null?void 0:u.value,t.currency=(h=e.prices.originalRowTotal)==null?void 0:h.currency,t.variant=e.discounted?"strikethrough":"default",t["data-testid"]="regular-item-total",a&&(a.amount=(p=e.discountedTotal)==null?void 0:p.value,a.currency=(q=e.discountedTotal)==null?void 0:q.currency,a.sale=!0,a["aria-label"]=n.dictionary.discountedPrice,a["data-testid"]="discount-total")),{totalProps:t,discountProps:a}},Ie=e=>{const n=e==null?void 0:e.map(a=>({label:a.label,value:a.values.map(o=>o.label).join(", ")})),t={};return n==null||n.forEach(a=>{t[a.label]=a.value}),Object.keys(t).length>0?t:null},Te=e=>{const n=e==null?void 0:e.map(a=>({label:a.optionLabel,value:a.valueLabel})),t={};return n==null||n.forEach(a=>{t[a.label]=a.value}),Object.keys(t).length>0?t:null},Se=e=>{const n=e==null?void 0:e.map(a=>({label:a.label,type:a.type,values:a.values.map(o=>({label:o.label,value:o.value}))})),t={};return n==null||n.forEach(a=>{var o;switch(a.type){case"field":case"area":case"date_time":t[a.label]=a.values[0].value;break;case"radio":case"drop_down":t[a.label]=a.values[0].label;break;case"multiple":case"checkbox":t[a.label]=a.values.reduce((r,l)=>r?`${r}, ${l.label}`:l.label,"");break;case"file":{const r=new DOMParser,l=a.values[0].value,m=((o=r.parseFromString(l,"text/html").querySelector("a"))==null?void 0:o.textContent)||"";t[a.label]=m;break}}}),t},Qe=4,G=(e,n,t)=>{var r;if(t.attributesToHide.includes("image"))return;const a={loading:n<Qe?"eager":"lazy",src:e.image.src,alt:e.image.alt,width:"300",height:"300",params:{width:300}},o=i(le,{"data-testid":"quote-summary-list-item-image",...a});return i(s,{name:"Thumbnail",slot:(r=t.slots)==null?void 0:r.Thumbnail,context:{item:e,defaultImageProps:a},children:t.routeProduct?i("a",{href:t.routeProduct(e),children:o}):o})},V=(e,n)=>{if(!n.attributesToHide.includes("name"))return i("span",{"data-testid":"quote-summary-list-item-title",children:n.routeProduct?i("a",{href:n.routeProduct(e),children:e.product.name}):e.product.name})},W=e=>i("span",{"data-testid":"quote-summary-list-item-sku",children:e.product.sku}),Y=(e,n)=>{var t;return i(s,{name:"ProductAttributes",slot:(t=n.slots)==null?void 0:t.ProductAttributes,context:{item:e}})},H=(e,n)=>{if(n.attributesToHide.includes("configurations"))return;const t={...Ie(e.bundleOptions),...Te(e.configurableOptions),...Se(e.customizableOptions),...e.links&&e.links.count?e.links.count>1?{[n.dictionary.files.replace("{count}",e.links.count.toString())]:e.links.result}:{[n.dictionary.file.replace("{count}",e.links.count.toString())]:e.links.result}:null};if(Object.keys(t).length!==0)return t},J=(e,n)=>{var t;return((t=n.quoteDisplaySettings)==null?void 0:t.price)===_.TAX_INCLUDED_AND_EXCLUDED?i(Q,{amount:e.prices.rowTotal.value,currency:e.prices.rowTotal.currency,"data-testid":"excluding-tax-total","aria-label":n.dictionary.regularPrice}):void 0},Ue=({hideHeading:e,hideFooter:n,routeProduct:t,showMaxItems:a=!0,attributesToHide:o=[],slots:r,accordion:l=!1,variant:d="primary",showDiscount:m,showSavings:b,...x})=>{const{quoteData:u,loading:h}=xe(),[p,q]=A(a),{quoteDisplaySettings:g,quoteSummaryMaxItems:K}=he.config,N=K||5,y=fe({discountedPrice:"NegotiableQuote.QuoteSummaryList.discountedPrice",discountPercentage:"NegotiableQuote.QuoteSummaryList.discountPercentage",editQuote:"NegotiableQuote.QuoteSummaryList.editQuote",file:"NegotiableQuote.QuoteSummaryList.file",files:"NegotiableQuote.QuoteSummaryList.files",heading:"NegotiableQuote.QuoteSummaryList.heading",listOfQuoteItems:"NegotiableQuote.QuoteSummaryList.listOfQuoteItems",regularPrice:"NegotiableQuote.QuoteSummaryList.regularPrice",savingsAmount:"NegotiableQuote.QuoteSummaryList.savingsAmount",viewMore:"NegotiableQuote.QuoteSummaryList.viewMore"}),Z=oe(()=>{q(c=>!c)},[]),I={attributesToHide:o,routeProduct:t,slots:r,dictionary:y,quoteDisplaySettings:g},w={dictionary:y,quoteDisplaySettings:g},L=c=>i(s,{name:"Footer",slot:r==null?void 0:r.Footer,context:{item:c}}),ee=()=>u!=null&&u.totalQuantity?u.items.map((c,U)=>{const{totalProps:re,discountProps:X}=z(c,w),ne=i(ye,{loading:h,"data-testid":`quote-summary-list-item-entry-${c.uid}`,image:G(c,U,I),title:i(s,{name:"ItemTitle",slot:r==null?void 0:r.ItemTitle,context:{item:c},children:V(c,I)}),sku:o.includes("sku")?void 0:i(s,{name:"ItemSku",slot:r==null?void 0:r.ItemSku,context:{item:c},children:W(c)}),price:o.includes("price")?void 0:i(s,{name:"ItemPrice",slot:r==null?void 0:r.ItemPrice,context:{item:c},slotTag:"span",children:i(Q,{...F(c,w)})}),quantity:o.includes("quantity")?void 0:c.quantity,total:f(k,{children:[o.includes("total")?void 0:i(s,{name:"ItemTotal",slot:r==null?void 0:r.ItemTotal,context:{item:c},children:i(Q,{...re})}),o.includes("totalDiscount")?void 0:X&&i(s,{name:"ItemTotal",slot:r==null?void 0:r.ItemTotal,context:{item:c},children:i(Q,{...X})})]}),attributes:Y(c,I),configurations:H(c,I),totalExcludingTax:o.includes("totalExcludingTax")?void 0:J(c,I),taxIncluded:(g==null?void 0:g.price)===_.TAX_INCLUDED,taxExcluded:!o.includes("totalExcludingTax")&&(g==null?void 0:g.price)===_.TAX_INCLUDED_AND_EXCLUDED,discount:m&&c.discounted&&c.discountPercentage!==void 0?i("div",{"data-testid":"item-discount-percentage",children:y.discountPercentage.replace("{discount}",c.discountPercentage.toString())}):void 0,savings:b&&c.discounted&&c.savingsAmount!==void 0?f("div",{children:[i("span",{children:i(Q,{...B(c)})})," ",y.savingsAmount]}):void 0,footer:L(c)},c.uid);return i(s,{name:"CartItem",slot:r==null?void 0:r.QuoteItem,context:{item:c,index:U,loading:h,attributesToHide:o,quoteDisplaySettings:g,showDiscount:m,showSavings:b,dictionary:y,getImage:G,getTitle:V,getSku:W,getPriceProps:F,getTotalPriceProps:z,getProductAttributes:Y,getConfigurations:H,getTotalExcludingTax:J,getFooter:L,getSavingsAmount:B},children:ne},c.uid)}):null,O=i(s,{name:"Heading",slot:r==null?void 0:r.Heading,context:{count:(u==null?void 0:u.totalQuantity)??0,quoteId:u==null?void 0:u.uid},children:i("div",{"data-testid":"default-quote-summary-list-heading",children:y.heading.replace("({count})",u!=null&&u.totalQuantity?`(${u==null?void 0:u.totalQuantity.toString()})`:"")})}),M=O.props.children.props.children,P=ee(),T=(u==null?void 0:u.items.length)||0,te=p?Math.min(T,N):T,ae=T>te,D=u!=null&&u.totalQuantity&&P?i(s,{name:"Footer",slot:r==null?void 0:r.QuoteSummaryFooter,context:{displayMaxItems:p},"data-testid":"quote-summary-list-footer-slot",className:"quote-management-quote-summary-list-footer",children:ae?i(se,{className:"quote-management-quote-summary-list-footer__action",onClick:Z,"data-testid":"view-more-items-button",variant:"tertiary",children:y.viewMore}):null}):null,R=u!=null&&u.totalQuantity?i(de,{"data-testid":"quote-summary-list",children:P==null?void 0:P.slice(0,p?Math.min(T,N):T)}):null;return l?i(me,{"data-testid":"quote-summary-list-accordion",className:v(["quote-management-quote-summary-list-accordion",`quote-management-quote-summary-list__background--${d}`]),iconOpen:_e,iconClose:ve,children:i(ge,{title:M,ariaLabelTitle:M,"data-testid":"quote-summary-list-accordion__section",open:!0,renderContentWhenClosed:!0,children:i(j,{...x,"aria-expanded":!0,"aria-label":y.listOfQuoteItems,className:"quote-management-quote-summary-list-accordion__list",footer:n?void 0:D,products:R,outOfStockMessage:void 0,loading:h,variant:d})})}):i(j,{...x,heading:e?void 0:O,footer:n?void 0:D,products:R,outOfStockMessage:void 0,loading:h,variant:d})};export{Ue as QuoteSummaryList,Ue as default};
|
|
4
4
|
//# sourceMappingURL=QuoteSummaryList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuoteSummaryList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/ChevronRight.svg","/@dropins/storefront-quote-management/src/components/QuoteSummaryList/QuoteSummaryList.tsx","/@dropins/storefront-quote-management/src/hooks/useQuoteSummaryData.ts","/@dropins/storefront-quote-management/src/lib/priceCalculators.ts","/@dropins/storefront-quote-management/src/lib/configurationTransformers.ts","/@dropins/storefront-quote-management/src/lib/itemFormatters.tsx","/@dropins/storefront-quote-management/src/containers/QuoteSummaryList/QuoteSummaryList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Chevron_right_Base\", \"data-name\": \"Icon \\\\u2013 Chevron right \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Chevron_right_icon\", \"data-name\": \"Chevron right icon\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", id: \"chevron\", d: \"M199.75,367.5l4.255,-4.255-4.255,-4.255\", transform: \"translate(-189.25 -351.0)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgChevronRight;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport {\n Divider,\n Skeleton,\n SkeletonRow,\n} from '@adobe-commerce/elsie/components';\nimport '@/quote-management/components/QuoteSummaryList/QuoteSummaryList.css';\n\nexport interface QuoteSummaryListProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n heading?: VNode | null;\n footer?: VNode | null;\n products?: VNode | null;\n outOfStockMessage?: VNode | null;\n loading?: boolean;\n variant?: 'primary' | 'secondary';\n}\n\nexport const QuoteSummaryList: FunctionComponent<QuoteSummaryListProps> = ({\n className,\n children,\n heading,\n footer,\n products,\n outOfStockMessage,\n loading = true,\n variant = 'primary',\n ...props\n}) => {\n return (\n <div\n {...props}\n className={classes([\n 'quote-management-quote-summary-list',\n className,\n `quote-management-quote-summary-list__background--${variant}`,\n ])}\n >\n {loading ? (\n <QuoteSummaryListSkeleton />\n ) : (\n <>\n {(heading || outOfStockMessage) && (\n <div\n data-testid=\"quote-summary-list-heading-wrapper\"\n className={classes([\n 'quote-management-quote-summary-list__heading',\n [\n 'quote-management-quote-summary-list__heading--full-width',\n !products,\n ],\n ])}\n >\n {heading && (\n <>\n <VComponent\n node={heading}\n className=\"quote-management-quote-summary-list__heading-text\"\n />\n <Divider\n variant=\"primary\"\n className={classes([\n 'quote-management-quote-summary-list__heading-divider',\n ])}\n />\n </>\n )}\n\n {outOfStockMessage && (\n <VComponent\n node={outOfStockMessage}\n className=\"quote-management-quote-summary-list__out-of-stock-message\"\n />\n )}\n </div>\n )}\n <div\n className={classes([\n 'quote-management-quote-summary-list__content',\n ])}\n >\n {products}\n </div>\n\n {footer && (\n <>\n <Divider\n variant=\"primary\"\n className={classes([\n 'quote-management-quote-summary-list__footer-divider',\n ])}\n />\n <VComponent\n node={footer}\n className=\"quote-management-quote-summary-list__footer-text\"\n />\n </>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst QuoteSummaryListSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n data-testid=\"quote-summary-list-skeleton\"\n className=\"quote-management-quote-summary-list__skeleton\"\n rowGap=\"medium\"\n >\n <SkeletonRow\n variant=\"row\"\n size=\"xlarge\"\n fullWidth={true}\n lines={3}\n multilineGap=\"small\"\n />\n </Skeleton>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { useEffect, useState } from 'preact/compat';\nimport { events } from '@adobe-commerce/event-bus';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models';\n\n/**\n * Custom hook to manage quote summary data and loading state\n */\nexport const useQuoteSummaryData = () => {\n const [quoteData, setQuoteData] = useState<NegotiableQuoteModel | undefined>(\n undefined\n );\n const [loading, setLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const quoteDataEvent = events.on(\n 'quote-management/quote-data',\n (payload: { quote: NegotiableQuoteModel }) => {\n const { quote } = payload;\n if (quote) {\n setQuoteData(quote);\n setLoading(false);\n }\n },\n {\n eager: true,\n }\n );\n return () => quoteDataEvent?.off();\n }, []);\n\n return {\n quoteData,\n loading,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { PriceProps } from '@adobe-commerce/elsie/components';\nimport {\n NegotiableQuoteCartItem as NegotiableQuoteItemModel,\n QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\n\nexport interface PriceCalculatorOptions {\n dictionary: Record<string, string>;\n quoteDisplaySettings?: StoreConfigModel['quoteDisplaySettings'];\n}\n\n/**\n * Get price props for an item\n */\nexport const getPriceProps = (\n item: NegotiableQuoteItemModel,\n options: PriceCalculatorOptions\n) => {\n return options.quoteDisplaySettings?.price === QuoteDisplayAmount.TAX_INCLUDED\n ? item.discounted\n ? {\n amount: item.prices.regularPrice.value,\n currency: item.prices.regularPrice.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.prices.priceIncludingTax.value,\n currency: item.prices.priceIncludingTax.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.prices.regularPrice.value,\n currency: item.prices.regularPrice.currency,\n style: { font: 'inherit' },\n 'data-testid': 'regular-item-price',\n };\n};\n\n/**\n * Get savings amount props for an item\n */\nexport const getSavingsAmount = (item: NegotiableQuoteItemModel) => {\n return {\n amount: item.savingsAmount?.value,\n currency: item.savingsAmount?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'item-savings-amount',\n };\n};\n\n/**\n * Calculate total price props and discount props for an item\n */\nexport const getTotalPriceProps = (\n item: NegotiableQuoteItemModel,\n options: PriceCalculatorOptions\n) => {\n const totalProps: PriceProps & { 'data-testid'?: string } = {\n 'aria-label': options.dictionary.regularPrice,\n };\n const discountProps: (PriceProps & { 'data-testid'?: string }) | null =\n item.discounted ? {} : null;\n\n if (\n options.quoteDisplaySettings?.price === QuoteDisplayAmount.TAX_INCLUDED ||\n options.quoteDisplaySettings?.price ===\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED\n ) {\n totalProps['amount'] = item.prices.rowTotalIncludingTax?.value;\n totalProps['currency'] = item.prices.rowTotalIncludingTax?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n totalProps['data-testid'] = 'including-tax-item-total';\n\n if (discountProps) {\n totalProps['amount'] = item.prices.originalRowTotal?.value;\n totalProps['currency'] = item.prices.originalRowTotal?.currency;\n\n discountProps['amount'] = item.prices.rowTotalIncludingTax?.value;\n discountProps['currency'] = item.prices.rowTotalIncludingTax?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = options.dictionary.discountedPrice;\n discountProps['data-testid'] = 'discount-total';\n }\n } else {\n totalProps['amount'] = item.prices.originalRowTotal?.value;\n totalProps['currency'] = item.prices.originalRowTotal?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n totalProps['data-testid'] = 'regular-item-total';\n\n if (discountProps) {\n discountProps['amount'] = item.discountedTotal?.value;\n discountProps['currency'] = item.discountedTotal?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = options.dictionary.discountedPrice;\n discountProps['data-testid'] = 'discount-total';\n }\n }\n\n return {\n totalProps,\n discountProps,\n };\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\n/**\n * Helper function to transform bundle options data to be ready for a CartItem SDK component\n */\nexport const transformBundleOptions = (data: any) => {\n const bundle = data?.map((option: any) => ({\n label: option.label,\n value: option.values.map((value: any) => value.label).join(', '),\n }));\n\n const bundleOptions: { [key: string]: any } = {};\n\n bundle?.forEach((option: any) => {\n bundleOptions[option.label] = option.value;\n });\n\n return Object.keys(bundleOptions).length > 0 ? bundleOptions : null;\n};\n\n/**\n * Helper function to transform configurable options data to be ready for a CartItem SDK component\n */\nexport const transformConfigurableOptions = (data: any) => {\n const configurable = data?.map((option: any) => ({\n label: option.optionLabel,\n value: option.valueLabel,\n }));\n\n const configurableOptions: { [key: string]: any } = {};\n\n configurable?.forEach((option: any) => {\n configurableOptions[option.label] = option.value;\n });\n\n return Object.keys(configurableOptions).length > 0\n ? configurableOptions\n : null;\n};\n\n/**\n * Helper function to transform customizable options data to be ready for a CartItem SDK component\n */\nexport const transformCustomizableOptions = (data: any) => {\n const transformedOptions = data?.map((option: any) => ({\n label: option.label,\n type: option.type,\n values: option.values.map((value: any) => ({\n label: value.label,\n value: value.value,\n })),\n }));\n\n const result: { [key: string]: any } = {};\n\n transformedOptions?.forEach((option: any) => {\n switch (option.type) {\n case 'field':\n case 'area':\n case 'date_time':\n result[option.label] = option.values[0].value;\n break;\n case 'radio':\n case 'drop_down':\n result[option.label] = option.values[0].label;\n break;\n case 'multiple':\n case 'checkbox':\n result[option.label] = (option.values as Array<any>).reduce(\n (previous, current) => {\n if (previous) return `${previous}, ${current.label}`;\n return current.label;\n },\n ''\n );\n break;\n case 'file': {\n const parser = new DOMParser();\n const fileAnchorElementHtml = option.values[0].value;\n const doc = parser.parseFromString(fileAnchorElementHtml, 'text/html');\n const anchorText = doc.querySelector('a')?.textContent || '';\n result[option.label] = anchorText;\n break;\n }\n }\n });\n\n return result;\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Image, ImageProps, Price } from '@adobe-commerce/elsie/components';\nimport { Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n NegotiableQuoteCartItem as NegotiableQuoteItemModel,\n QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\nimport { SwitchableAttributes } from '@/quote-management/containers/QuoteSummaryList/QuoteSummaryList';\nimport {\n transformBundleOptions,\n transformConfigurableOptions,\n transformCustomizableOptions,\n} from './configurationTransformers';\n\nconst EAGER_LOAD_THRESHOLD = 4;\n\nexport interface ItemFormatterOptions {\n attributesToHide: SwitchableAttributes[];\n routeProduct?: (item: NegotiableQuoteItemModel) => string;\n slots?: {\n Thumbnail?: SlotProps<{\n item: NegotiableQuoteItemModel;\n defaultImageProps: ImageProps;\n }>;\n ProductAttributes?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n };\n dictionary: Record<string, string>;\n quoteDisplaySettings?: StoreConfigModel['quoteDisplaySettings'];\n}\n\n/**\n * Get image component for an item\n */\nexport const getImage = (\n item: NegotiableQuoteItemModel,\n index: number,\n options: ItemFormatterOptions\n) => {\n if (options.attributesToHide.includes('image')) {\n return undefined;\n }\n\n const defaultImageProps: ImageProps = {\n loading: index < EAGER_LOAD_THRESHOLD ? 'eager' : 'lazy',\n src: item.image.src,\n alt: item.image.alt,\n width: '300',\n height: '300',\n params: { width: 300 },\n };\n\n const imageComponent = (\n <Image\n data-testid=\"quote-summary-list-item-image\"\n {...defaultImageProps}\n />\n );\n return (\n <Slot\n name=\"Thumbnail\"\n slot={options.slots?.Thumbnail}\n context={{ item, defaultImageProps }}\n >\n {options.routeProduct ? (\n <a href={options.routeProduct(item)}>{imageComponent}</a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n};\n\n/**\n * Get title component for an item\n */\nexport const getTitle = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n if (options.attributesToHide.includes('name')) {\n return undefined;\n }\n\n return (\n <span data-testid=\"quote-summary-list-item-title\">\n {options.routeProduct ? (\n <a href={options.routeProduct(item)}>{item.product.name}</a>\n ) : (\n item.product.name\n )}\n </span>\n );\n};\n\n/**\n * Get SKU component for an item\n */\nexport const getSku = (item: NegotiableQuoteItemModel) => {\n return (\n <span data-testid=\"quote-summary-list-item-sku\">{item.product.sku}</span>\n );\n};\n\n/**\n * Get product attributes slot for an item\n */\nexport const getProductAttributes = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n return (\n <Slot\n name=\"ProductAttributes\"\n slot={options.slots?.ProductAttributes}\n context={{ item }}\n />\n );\n};\n\n/**\n * Get configurations for an item (bundle, configurable, customizable options)\n */\nexport const getConfigurations = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n if (options.attributesToHide.includes('configurations')) {\n return undefined;\n }\n\n const configuration = {\n ...transformBundleOptions(item.bundleOptions),\n ...transformConfigurableOptions(item.configurableOptions),\n ...transformCustomizableOptions(item.customizableOptions),\n ...(item.links && item.links.count\n ? item.links.count > 1\n ? {\n [options.dictionary.files.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : {\n [options.dictionary.file.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : null),\n };\n\n if (Object.keys(configuration).length === 0) {\n return undefined;\n }\n\n return configuration;\n};\n\n/**\n * Get total excluding tax component for an item\n */\nexport const getTotalExcludingTax = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n return options.quoteDisplaySettings?.price ===\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED ? (\n <Price\n amount={item.prices.rowTotal.value}\n currency={item.prices.rowTotal.currency}\n data-testid=\"excluding-tax-total\"\n aria-label={options.dictionary.regularPrice}\n />\n ) : undefined;\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useState } from 'preact/compat';\n\nimport {\n Accordion,\n AccordionSection,\n Button,\n CartItem,\n CartList,\n ImageProps,\n Price,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ChevronDown, ChevronRight } from '@adobe-commerce/elsie/icons';\nimport { Container, Slot, SlotProps, classes } from '@adobe-commerce/elsie/lib';\n\nimport { QuoteSummaryList as QuoteSummaryListComponent } from '@/quote-management/components';\nimport {\n NegotiableQuoteCartItem as NegotiableQuoteItemModel,\n QuoteDisplayAmount,\n} from '@/quote-management/data/models';\nimport { state } from '@/quote-management/lib/state';\nimport { useQuoteSummaryData } from '@/quote-management/hooks/useQuoteSummaryData';\nimport {\n getPriceProps,\n getSavingsAmount,\n getTotalPriceProps,\n} from '@/quote-management/lib/priceCalculators';\nimport {\n getImage,\n getTitle,\n getSku,\n getProductAttributes,\n getConfigurations,\n getTotalExcludingTax,\n} from '@/quote-management/lib/itemFormatters';\n\nexport interface QuoteSummaryListProps extends HTMLAttributes<HTMLDivElement> {\n hideHeading?: boolean;\n hideFooter?: boolean;\n routeProduct?: (item: NegotiableQuoteItemModel) => string;\n showMaxItems?: boolean;\n attributesToHide?: SwitchableAttributes[];\n slots?: {\n Heading?: SlotProps<{ count: number; quoteId: string }>;\n Footer?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n Thumbnail?: SlotProps<{\n item: NegotiableQuoteItemModel;\n defaultImageProps: ImageProps;\n }>;\n ProductAttributes?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n QuoteSummaryFooter?: SlotProps<{\n displayMaxItems: boolean;\n }>;\n QuoteItem?: SlotProps;\n ItemTitle?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n ItemPrice?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n ItemTotal?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n ItemSku?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n };\n accordion?: boolean;\n variant?: 'primary' | 'secondary';\n showDiscount?: boolean;\n showSavings?: boolean;\n}\n\n// Attributes that can be hidden or shown\nexport type SwitchableAttributes =\n | 'name'\n | 'image'\n | 'configurations'\n | 'warning'\n | 'alert'\n | 'sku'\n | 'price'\n | 'quantity'\n | 'total'\n | 'totalDiscount'\n | 'totalExcludingTax';\n\nexport const QuoteSummaryList: Container<QuoteSummaryListProps> = ({\n hideHeading,\n hideFooter,\n routeProduct,\n showMaxItems = true,\n attributesToHide = [],\n slots,\n accordion = false,\n variant = 'primary',\n showDiscount,\n showSavings,\n ...props\n}) => {\n const CART_SUMMARY_MAX_ITEMS = 5;\n\n const { quoteData, loading } = useQuoteSummaryData();\n const [displayMaxItems, setDisplayMaxItems] = useState<boolean>(showMaxItems);\n\n const { quoteDisplaySettings, quoteSummaryMaxItems } = state.config;\n const maxItems = quoteSummaryMaxItems || CART_SUMMARY_MAX_ITEMS;\n\n const dictionary = useText({\n discountedPrice: 'NegotiableQuote.QuoteSummaryList.discountedPrice',\n discountPercentage: 'NegotiableQuote.QuoteSummaryList.discountPercentage',\n editQuote: 'NegotiableQuote.QuoteSummaryList.editQuote',\n file: 'NegotiableQuote.QuoteSummaryList.file',\n files: 'NegotiableQuote.QuoteSummaryList.files',\n heading: 'NegotiableQuote.QuoteSummaryList.heading',\n listOfQuoteItems: 'NegotiableQuote.QuoteSummaryList.listOfQuoteItems',\n regularPrice: 'NegotiableQuote.QuoteSummaryList.regularPrice',\n savingsAmount: 'NegotiableQuote.QuoteSummaryList.savingsAmount',\n viewMore: 'NegotiableQuote.QuoteSummaryList.viewMore',\n });\n\n // Display max items\n const handleMaxItemsView = useCallback(() => {\n setDisplayMaxItems((prev) => !prev);\n }, []);\n\n // Options for item formatters\n const formatterOptions = {\n attributesToHide,\n routeProduct,\n slots,\n dictionary,\n quoteDisplaySettings,\n };\n\n // Options for price calculators\n const calculatorOptions = {\n dictionary,\n quoteDisplaySettings,\n };\n\n const getFooter = (item: NegotiableQuoteItemModel) => {\n return <Slot name=\"Footer\" slot={slots?.Footer} context={{ item }} />;\n };\n\n // Re-usable function to get a filtered list of cart items\n const getCartItemEntries = (\n filterCallback: (item: NegotiableQuoteItemModel) => boolean\n ) => {\n return quoteData?.totalQuantity\n ? quoteData.items.filter(filterCallback).map((item, index) => {\n const { totalProps, discountProps } = getTotalPriceProps(\n item,\n calculatorOptions\n );\n\n const defaultCartItem = (\n <CartItem\n loading={loading}\n key={item.uid}\n data-testid={`quote-summary-list-item-entry-${item.uid}`}\n image={getImage(item, index, formatterOptions)}\n title={\n <Slot\n name=\"ItemTitle\"\n slot={slots?.ItemTitle}\n context={{ item }}\n >\n {getTitle(item, formatterOptions)}\n </Slot>\n }\n sku={\n attributesToHide.includes('sku') ? undefined : (\n <Slot name=\"ItemSku\" slot={slots?.ItemSku} context={{ item }}>\n {getSku(item)}\n </Slot>\n )\n }\n price={\n attributesToHide.includes('price') ? undefined : (\n <Slot\n name=\"ItemPrice\"\n slot={slots?.ItemPrice}\n context={{ item }}\n slotTag=\"span\"\n >\n <Price {...getPriceProps(item, calculatorOptions)} />\n </Slot>\n )\n }\n quantity={\n attributesToHide.includes('quantity')\n ? undefined\n : item.quantity\n }\n total={\n <>\n {attributesToHide.includes('total') ? undefined : (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...totalProps} />\n </Slot>\n )}\n {attributesToHide.includes('totalDiscount')\n ? undefined\n : discountProps && (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...discountProps} />\n </Slot>\n )}\n </>\n }\n attributes={getProductAttributes(item, formatterOptions)}\n configurations={getConfigurations(item, formatterOptions)}\n totalExcludingTax={\n attributesToHide.includes('totalExcludingTax')\n ? undefined\n : getTotalExcludingTax(item, formatterOptions)\n }\n taxIncluded={\n quoteDisplaySettings?.price === QuoteDisplayAmount.TAX_INCLUDED\n }\n taxExcluded={\n !attributesToHide.includes('totalExcludingTax') &&\n quoteDisplaySettings?.price ===\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED\n }\n discount={\n showDiscount &&\n item.discounted &&\n item.discountPercentage !== undefined ? (\n <div data-testid=\"item-discount-percentage\">\n {dictionary.discountPercentage.replace(\n '{discount}',\n item.discountPercentage.toString()\n )}\n </div>\n ) : undefined\n }\n savings={\n showSavings &&\n item.discounted &&\n item.savingsAmount !== undefined ? (\n <div>\n <span>\n <Price {...getSavingsAmount(item)} />\n </span>\n \n {dictionary.savingsAmount}\n </div>\n ) : undefined\n }\n footer={getFooter(item)}\n />\n );\n\n return (\n <Slot\n key={item.uid}\n name=\"CartItem\"\n slot={slots?.QuoteItem}\n context={{\n item,\n index,\n loading,\n attributesToHide,\n quoteDisplaySettings,\n showDiscount,\n showSavings,\n dictionary,\n getImage,\n getTitle,\n getSku,\n getPriceProps,\n getTotalPriceProps,\n getProductAttributes,\n getConfigurations,\n getTotalExcludingTax,\n getFooter,\n getSavingsAmount,\n }}\n >\n {defaultCartItem}\n </Slot>\n );\n })\n : null;\n };\n\n const heading = (\n <Slot\n name=\"Heading\"\n slot={slots?.Heading}\n context={{\n count: quoteData?.totalQuantity ?? 0,\n quoteId: quoteData?.uid!,\n }}\n >\n <div data-testid=\"default-quote-summary-list-heading\">\n {dictionary.heading.replace(\n '({count})',\n quoteData?.totalQuantity\n ? `(${quoteData?.totalQuantity.toString()})`\n : ''\n )}\n </div>\n </Slot>\n );\n\n // Heading Section text for screen reader\n const headingSection = heading.props.children.props.children;\n\n // Main Product Entries\n const mainProductEntries = getCartItemEntries(\n (item) => !item.outOfStock && !item.insufficientQuantity\n );\n\n const totalLineItems = quoteData?.items.length || 0;\n const numOfVisibleItems = displayMaxItems\n ? Math.min(totalLineItems, maxItems)\n : totalLineItems;\n\n const hasHiddenItems = totalLineItems > numOfVisibleItems;\n\n const footerActions =\n quoteData?.totalQuantity && mainProductEntries ? (\n <Slot\n name=\"Footer\"\n slot={slots?.QuoteSummaryFooter}\n context={{ displayMaxItems }}\n data-testid=\"quote-summary-list-footer-slot\"\n className=\"quote-management-quote-summary-list-footer\"\n >\n {hasHiddenItems ? (\n <Button\n className=\"quote-management-quote-summary-list-footer__action\"\n onClick={handleMaxItemsView}\n data-testid=\"view-more-items-button\"\n variant=\"tertiary\"\n >\n {dictionary.viewMore}\n </Button>\n ) : null}\n </Slot>\n ) : null;\n\n const productEntries = quoteData?.totalQuantity ? (\n <CartList data-testid=\"quote-summary-list\">\n {mainProductEntries?.slice(\n 0,\n displayMaxItems ? Math.min(totalLineItems, maxItems) : totalLineItems\n )}\n </CartList>\n ) : null;\n\n return accordion ? (\n <Accordion\n data-testid=\"quote-summary-list-accordion\"\n className={classes([\n `quote-management-quote-summary-list-accordion`,\n `quote-management-quote-summary-list__background--${variant}`,\n ])}\n iconOpen={ChevronRight}\n iconClose={ChevronDown}\n >\n <AccordionSection\n title={headingSection}\n ariaLabelTitle={headingSection}\n data-testid=\"quote-summary-list-accordion__section\"\n open={true}\n renderContentWhenClosed={true}\n >\n <QuoteSummaryListComponent\n {...props}\n aria-expanded={true}\n aria-label={dictionary.listOfQuoteItems}\n className={`quote-management-quote-summary-list-accordion__list`}\n footer={hideFooter ? undefined : footerActions}\n products={productEntries}\n outOfStockMessage={undefined}\n loading={loading}\n variant={variant}\n />\n </AccordionSection>\n </Accordion>\n ) : (\n <QuoteSummaryListComponent\n {...props}\n heading={hideHeading ? undefined : heading}\n footer={hideFooter ? undefined : footerActions}\n products={productEntries}\n outOfStockMessage={undefined}\n loading={loading}\n variant={variant}\n />\n );\n};\n"],"names":["SvgChevronRight","props","React","QuoteSummaryList","className","children","heading","footer","products","outOfStockMessage","loading","variant","jsx","classes","QuoteSummaryListSkeleton","jsxs","Fragment","VComponent","Divider","Skeleton","SkeletonRow","useQuoteSummaryData","quoteData","setQuoteData","useState","setLoading","useEffect","quoteDataEvent","events","payload","quote","getPriceProps","item","options","_a","QuoteDisplayAmount","getSavingsAmount","_b","getTotalPriceProps","totalProps","discountProps","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","transformBundleOptions","data","bundle","option","value","bundleOptions","transformConfigurableOptions","configurable","configurableOptions","transformCustomizableOptions","transformedOptions","result","previous","current","parser","fileAnchorElementHtml","anchorText","EAGER_LOAD_THRESHOLD","getImage","index","defaultImageProps","imageComponent","Image","Slot","getTitle","getSku","getProductAttributes","getConfigurations","configuration","getTotalExcludingTax","Price","hideHeading","hideFooter","routeProduct","showMaxItems","attributesToHide","slots","accordion","showDiscount","showSavings","displayMaxItems","setDisplayMaxItems","quoteDisplaySettings","quoteSummaryMaxItems","state","maxItems","dictionary","useText","handleMaxItemsView","useCallback","prev","formatterOptions","calculatorOptions","getFooter","getCartItemEntries","filterCallback","defaultCartItem","CartItem","headingSection","mainProductEntries","totalLineItems","numOfVisibleItems","hasHiddenItems","footerActions","Button","productEntries","CartList","Accordion","ChevronRight","ChevronDown","AccordionSection","QuoteSummaryListComponent"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"QuoteSummaryList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/ChevronRight.svg","/@dropins/storefront-quote-management/src/components/QuoteSummaryList/QuoteSummaryList.tsx","/@dropins/storefront-quote-management/src/hooks/useQuoteSummaryData.ts","/@dropins/storefront-quote-management/src/lib/priceCalculators.ts","/@dropins/storefront-quote-management/src/lib/configurationTransformers.ts","/@dropins/storefront-quote-management/src/lib/itemFormatters.tsx","/@dropins/storefront-quote-management/src/containers/QuoteSummaryList/QuoteSummaryList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Chevron_right_Base\", \"data-name\": \"Icon \\\\u2013 Chevron right \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Chevron_right_icon\", \"data-name\": \"Chevron right icon\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", id: \"chevron\", d: \"M199.75,367.5l4.255,-4.255-4.255,-4.255\", transform: \"translate(-189.25 -351.0)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgChevronRight;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport {\n Divider,\n Skeleton,\n SkeletonRow,\n} from '@adobe-commerce/elsie/components';\nimport '@/quote-management/components/QuoteSummaryList/QuoteSummaryList.css';\n\nexport interface QuoteSummaryListProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n heading?: VNode | null;\n footer?: VNode | null;\n products?: VNode | null;\n outOfStockMessage?: VNode | null;\n loading?: boolean;\n variant?: 'primary' | 'secondary';\n}\n\nexport const QuoteSummaryList: FunctionComponent<QuoteSummaryListProps> = ({\n className,\n children,\n heading,\n footer,\n products,\n outOfStockMessage,\n loading = true,\n variant = 'primary',\n ...props\n}) => {\n return (\n <div\n {...props}\n className={classes([\n 'quote-management-quote-summary-list',\n className,\n `quote-management-quote-summary-list__background--${variant}`,\n ])}\n >\n {loading ? (\n <QuoteSummaryListSkeleton />\n ) : (\n <>\n {(heading || outOfStockMessage) && (\n <div\n data-testid=\"quote-summary-list-heading-wrapper\"\n className={classes([\n 'quote-management-quote-summary-list__heading',\n [\n 'quote-management-quote-summary-list__heading--full-width',\n !products,\n ],\n ])}\n >\n {heading && (\n <>\n <VComponent\n node={heading}\n className=\"quote-management-quote-summary-list__heading-text\"\n />\n <Divider\n variant=\"primary\"\n className={classes([\n 'quote-management-quote-summary-list__heading-divider',\n ])}\n />\n </>\n )}\n\n {outOfStockMessage && (\n <VComponent\n node={outOfStockMessage}\n className=\"quote-management-quote-summary-list__out-of-stock-message\"\n />\n )}\n </div>\n )}\n <div\n className={classes([\n 'quote-management-quote-summary-list__content',\n ])}\n >\n {products}\n </div>\n\n {footer && (\n <>\n <Divider\n variant=\"primary\"\n className={classes([\n 'quote-management-quote-summary-list__footer-divider',\n ])}\n />\n <VComponent\n node={footer}\n className=\"quote-management-quote-summary-list__footer-text\"\n />\n </>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst QuoteSummaryListSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n data-testid=\"quote-summary-list-skeleton\"\n className=\"quote-management-quote-summary-list__skeleton\"\n rowGap=\"medium\"\n >\n <SkeletonRow\n variant=\"row\"\n size=\"xlarge\"\n fullWidth={true}\n lines={3}\n multilineGap=\"small\"\n />\n </Skeleton>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { useEffect, useState } from 'preact/compat';\nimport { events } from '@adobe-commerce/event-bus';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models';\n\n/**\n * Custom hook to manage quote summary data and loading state\n */\nexport const useQuoteSummaryData = () => {\n const [quoteData, setQuoteData] = useState<NegotiableQuoteModel | undefined>(\n undefined\n );\n const [loading, setLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const quoteDataEvent = events.on(\n 'quote-management/quote-data',\n (payload: { quote: NegotiableQuoteModel }) => {\n const { quote } = payload;\n if (quote) {\n setQuoteData(quote);\n setLoading(false);\n }\n },\n {\n eager: true,\n }\n );\n return () => quoteDataEvent?.off();\n }, []);\n\n return {\n quoteData,\n loading,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { PriceProps } from '@adobe-commerce/elsie/components';\nimport {\n CartItemModel as NegotiableQuoteItemModel,\n QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\n\nexport interface PriceCalculatorOptions {\n dictionary: Record<string, string>;\n quoteDisplaySettings?: StoreConfigModel['quoteDisplaySettings'];\n}\n\n/**\n * Get price props for an item\n */\nexport const getPriceProps = (\n item: NegotiableQuoteItemModel,\n options: PriceCalculatorOptions\n) => {\n return options.quoteDisplaySettings?.price === QuoteDisplayAmount.TAX_INCLUDED\n ? item.discounted\n ? {\n amount: item.prices.regularPrice.value,\n currency: item.prices.regularPrice.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.prices.priceIncludingTax.value,\n currency: item.prices.priceIncludingTax.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.prices.regularPrice.value,\n currency: item.prices.regularPrice.currency,\n style: { font: 'inherit' },\n 'data-testid': 'regular-item-price',\n };\n};\n\n/**\n * Get savings amount props for an item\n */\nexport const getSavingsAmount = (item: NegotiableQuoteItemModel) => {\n return {\n amount: item.savingsAmount?.value,\n currency: item.savingsAmount?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'item-savings-amount',\n };\n};\n\n/**\n * Calculate total price props and discount props for an item\n */\nexport const getTotalPriceProps = (\n item: NegotiableQuoteItemModel,\n options: PriceCalculatorOptions\n) => {\n const totalProps: PriceProps & { 'data-testid'?: string } = {\n 'aria-label': options.dictionary.regularPrice,\n };\n const discountProps: (PriceProps & { 'data-testid'?: string }) | null =\n item.discounted ? {} : null;\n\n if (\n options.quoteDisplaySettings?.price === QuoteDisplayAmount.TAX_INCLUDED ||\n options.quoteDisplaySettings?.price ===\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED\n ) {\n totalProps['amount'] = item.prices.rowTotalIncludingTax?.value;\n totalProps['currency'] = item.prices.rowTotalIncludingTax?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n totalProps['data-testid'] = 'including-tax-item-total';\n\n if (discountProps) {\n totalProps['amount'] = item.prices.originalRowTotal?.value;\n totalProps['currency'] = item.prices.originalRowTotal?.currency;\n\n discountProps['amount'] = item.prices.rowTotalIncludingTax?.value;\n discountProps['currency'] = item.prices.rowTotalIncludingTax?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = options.dictionary.discountedPrice;\n discountProps['data-testid'] = 'discount-total';\n }\n } else {\n totalProps['amount'] = item.prices.originalRowTotal?.value;\n totalProps['currency'] = item.prices.originalRowTotal?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n totalProps['data-testid'] = 'regular-item-total';\n\n if (discountProps) {\n discountProps['amount'] = item.discountedTotal?.value;\n discountProps['currency'] = item.discountedTotal?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = options.dictionary.discountedPrice;\n discountProps['data-testid'] = 'discount-total';\n }\n }\n\n return {\n totalProps,\n discountProps,\n };\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\n/**\n * Helper function to transform bundle options data to be ready for a CartItem SDK component\n */\nexport const transformBundleOptions = (data: any) => {\n const bundle = data?.map((option: any) => ({\n label: option.label,\n value: option.values.map((value: any) => value.label).join(', '),\n }));\n\n const bundleOptions: { [key: string]: any } = {};\n\n bundle?.forEach((option: any) => {\n bundleOptions[option.label] = option.value;\n });\n\n return Object.keys(bundleOptions).length > 0 ? bundleOptions : null;\n};\n\n/**\n * Helper function to transform configurable options data to be ready for a CartItem SDK component\n */\nexport const transformConfigurableOptions = (data: any) => {\n const configurable = data?.map((option: any) => ({\n label: option.optionLabel,\n value: option.valueLabel,\n }));\n\n const configurableOptions: { [key: string]: any } = {};\n\n configurable?.forEach((option: any) => {\n configurableOptions[option.label] = option.value;\n });\n\n return Object.keys(configurableOptions).length > 0\n ? configurableOptions\n : null;\n};\n\n/**\n * Helper function to transform customizable options data to be ready for a CartItem SDK component\n */\nexport const transformCustomizableOptions = (data: any) => {\n const transformedOptions = data?.map((option: any) => ({\n label: option.label,\n type: option.type,\n values: option.values.map((value: any) => ({\n label: value.label,\n value: value.value,\n })),\n }));\n\n const result: { [key: string]: any } = {};\n\n transformedOptions?.forEach((option: any) => {\n switch (option.type) {\n case 'field':\n case 'area':\n case 'date_time':\n result[option.label] = option.values[0].value;\n break;\n case 'radio':\n case 'drop_down':\n result[option.label] = option.values[0].label;\n break;\n case 'multiple':\n case 'checkbox':\n result[option.label] = (option.values as Array<any>).reduce(\n (previous, current) => {\n if (previous) return `${previous}, ${current.label}`;\n return current.label;\n },\n ''\n );\n break;\n case 'file': {\n const parser = new DOMParser();\n const fileAnchorElementHtml = option.values[0].value;\n const doc = parser.parseFromString(fileAnchorElementHtml, 'text/html');\n const anchorText = doc.querySelector('a')?.textContent || '';\n result[option.label] = anchorText;\n break;\n }\n }\n });\n\n return result;\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Image, ImageProps, Price } from '@adobe-commerce/elsie/components';\nimport { Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n CartItemModel as NegotiableQuoteItemModel,\n QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\nimport { SwitchableAttributes } from '@/quote-management/containers/QuoteSummaryList/QuoteSummaryList';\nimport {\n transformBundleOptions,\n transformConfigurableOptions,\n transformCustomizableOptions,\n} from './configurationTransformers';\n\nconst EAGER_LOAD_THRESHOLD = 4;\n\nexport interface ItemFormatterOptions {\n attributesToHide: SwitchableAttributes[];\n routeProduct?: (item: NegotiableQuoteItemModel) => string;\n slots?: {\n Thumbnail?: SlotProps<{\n item: NegotiableQuoteItemModel;\n defaultImageProps: ImageProps;\n }>;\n ProductAttributes?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n };\n dictionary: Record<string, string>;\n quoteDisplaySettings?: StoreConfigModel['quoteDisplaySettings'];\n}\n\n/**\n * Get image component for an item\n */\nexport const getImage = (\n item: NegotiableQuoteItemModel,\n index: number,\n options: ItemFormatterOptions\n) => {\n if (options.attributesToHide.includes('image')) {\n return undefined;\n }\n\n const defaultImageProps: ImageProps = {\n loading: index < EAGER_LOAD_THRESHOLD ? 'eager' : 'lazy',\n src: item.image.src,\n alt: item.image.alt,\n width: '300',\n height: '300',\n params: { width: 300 },\n };\n\n const imageComponent = (\n <Image\n data-testid=\"quote-summary-list-item-image\"\n {...defaultImageProps}\n />\n );\n return (\n <Slot\n name=\"Thumbnail\"\n slot={options.slots?.Thumbnail}\n context={{ item, defaultImageProps }}\n >\n {options.routeProduct ? (\n <a href={options.routeProduct(item)}>{imageComponent}</a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n};\n\n/**\n * Get title component for an item\n */\nexport const getTitle = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n if (options.attributesToHide.includes('name')) {\n return undefined;\n }\n\n return (\n <span data-testid=\"quote-summary-list-item-title\">\n {options.routeProduct ? (\n <a href={options.routeProduct(item)}>{item.product.name}</a>\n ) : (\n item.product.name\n )}\n </span>\n );\n};\n\n/**\n * Get SKU component for an item\n */\nexport const getSku = (item: NegotiableQuoteItemModel) => {\n return (\n <span data-testid=\"quote-summary-list-item-sku\">{item.product.sku}</span>\n );\n};\n\n/**\n * Get product attributes slot for an item\n */\nexport const getProductAttributes = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n return (\n <Slot\n name=\"ProductAttributes\"\n slot={options.slots?.ProductAttributes}\n context={{ item }}\n />\n );\n};\n\n/**\n * Get configurations for an item (bundle, configurable, customizable options)\n */\nexport const getConfigurations = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n if (options.attributesToHide.includes('configurations')) {\n return undefined;\n }\n\n const configuration = {\n ...transformBundleOptions(item.bundleOptions),\n ...transformConfigurableOptions(item.configurableOptions),\n ...transformCustomizableOptions(item.customizableOptions),\n ...(item.links && item.links.count\n ? item.links.count > 1\n ? {\n [options.dictionary.files.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : {\n [options.dictionary.file.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : null),\n };\n\n if (Object.keys(configuration).length === 0) {\n return undefined;\n }\n\n return configuration;\n};\n\n/**\n * Get total excluding tax component for an item\n */\nexport const getTotalExcludingTax = (\n item: NegotiableQuoteItemModel,\n options: ItemFormatterOptions\n) => {\n return options.quoteDisplaySettings?.price ===\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED ? (\n <Price\n amount={item.prices.rowTotal.value}\n currency={item.prices.rowTotal.currency}\n data-testid=\"excluding-tax-total\"\n aria-label={options.dictionary.regularPrice}\n />\n ) : undefined;\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useState } from 'preact/compat';\n\nimport {\n Accordion,\n AccordionSection,\n Button,\n CartItem,\n CartList,\n ImageProps,\n Price,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ChevronDown, ChevronRight } from '@adobe-commerce/elsie/icons';\nimport { Container, Slot, SlotProps, classes } from '@adobe-commerce/elsie/lib';\n\nimport { QuoteSummaryList as QuoteSummaryListComponent } from '@/quote-management/components';\nimport {\n CartItemModel as NegotiableQuoteItemModel,\n QuoteDisplayAmount,\n} from '@/quote-management/data/models';\nimport { state } from '@/quote-management/lib/state';\nimport { useQuoteSummaryData } from '@/quote-management/hooks/useQuoteSummaryData';\nimport {\n getPriceProps,\n getSavingsAmount,\n getTotalPriceProps,\n} from '@/quote-management/lib/priceCalculators';\nimport {\n getImage,\n getTitle,\n getSku,\n getProductAttributes,\n getConfigurations,\n getTotalExcludingTax,\n} from '@/quote-management/lib/itemFormatters';\n\nexport interface QuoteSummaryListProps extends HTMLAttributes<HTMLDivElement> {\n hideHeading?: boolean;\n hideFooter?: boolean;\n routeProduct?: (item: NegotiableQuoteItemModel) => string;\n showMaxItems?: boolean;\n attributesToHide?: SwitchableAttributes[];\n slots?: {\n Heading?: SlotProps<{ count: number; quoteId: string }>;\n Footer?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n Thumbnail?: SlotProps<{\n item: NegotiableQuoteItemModel;\n defaultImageProps: ImageProps;\n }>;\n ProductAttributes?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n QuoteSummaryFooter?: SlotProps<{\n displayMaxItems: boolean;\n }>;\n QuoteItem?: SlotProps;\n ItemTitle?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n ItemPrice?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n ItemTotal?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n ItemSku?: SlotProps<{ item: NegotiableQuoteItemModel }>;\n };\n accordion?: boolean;\n variant?: 'primary' | 'secondary';\n showDiscount?: boolean;\n showSavings?: boolean;\n}\n\n// Attributes that can be hidden or shown\nexport type SwitchableAttributes =\n | 'name'\n | 'image'\n | 'configurations'\n | 'warning'\n | 'alert'\n | 'sku'\n | 'price'\n | 'quantity'\n | 'total'\n | 'totalDiscount'\n | 'totalExcludingTax';\n\nexport const QuoteSummaryList: Container<QuoteSummaryListProps> = ({\n hideHeading,\n hideFooter,\n routeProduct,\n showMaxItems = true,\n attributesToHide = [],\n slots,\n accordion = false,\n variant = 'primary',\n showDiscount,\n showSavings,\n ...props\n}) => {\n const CART_SUMMARY_MAX_ITEMS = 5;\n\n const { quoteData, loading } = useQuoteSummaryData();\n const [displayMaxItems, setDisplayMaxItems] = useState<boolean>(showMaxItems);\n\n const { quoteDisplaySettings, quoteSummaryMaxItems } = state.config;\n const maxItems = quoteSummaryMaxItems || CART_SUMMARY_MAX_ITEMS;\n\n const dictionary = useText({\n discountedPrice: 'NegotiableQuote.QuoteSummaryList.discountedPrice',\n discountPercentage: 'NegotiableQuote.QuoteSummaryList.discountPercentage',\n editQuote: 'NegotiableQuote.QuoteSummaryList.editQuote',\n file: 'NegotiableQuote.QuoteSummaryList.file',\n files: 'NegotiableQuote.QuoteSummaryList.files',\n heading: 'NegotiableQuote.QuoteSummaryList.heading',\n listOfQuoteItems: 'NegotiableQuote.QuoteSummaryList.listOfQuoteItems',\n regularPrice: 'NegotiableQuote.QuoteSummaryList.regularPrice',\n savingsAmount: 'NegotiableQuote.QuoteSummaryList.savingsAmount',\n viewMore: 'NegotiableQuote.QuoteSummaryList.viewMore',\n });\n\n // Display max items\n const handleMaxItemsView = useCallback(() => {\n setDisplayMaxItems((prev) => !prev);\n }, []);\n\n // Options for item formatters\n const formatterOptions = {\n attributesToHide,\n routeProduct,\n slots,\n dictionary,\n quoteDisplaySettings,\n };\n\n // Options for price calculators\n const calculatorOptions = {\n dictionary,\n quoteDisplaySettings,\n };\n\n const getFooter = (item: NegotiableQuoteItemModel) => {\n return <Slot name=\"Footer\" slot={slots?.Footer} context={{ item }} />;\n };\n\n const getCartItemEntries = () => {\n return quoteData?.totalQuantity\n ? quoteData.items.map((item, index) => {\n const { totalProps, discountProps } = getTotalPriceProps(\n item,\n calculatorOptions\n );\n\n const defaultCartItem = (\n <CartItem\n loading={loading}\n key={item.uid}\n data-testid={`quote-summary-list-item-entry-${item.uid}`}\n image={getImage(item, index, formatterOptions)}\n title={\n <Slot\n name=\"ItemTitle\"\n slot={slots?.ItemTitle}\n context={{ item }}\n >\n {getTitle(item, formatterOptions)}\n </Slot>\n }\n sku={\n attributesToHide.includes('sku') ? undefined : (\n <Slot name=\"ItemSku\" slot={slots?.ItemSku} context={{ item }}>\n {getSku(item)}\n </Slot>\n )\n }\n price={\n attributesToHide.includes('price') ? undefined : (\n <Slot\n name=\"ItemPrice\"\n slot={slots?.ItemPrice}\n context={{ item }}\n slotTag=\"span\"\n >\n <Price {...getPriceProps(item, calculatorOptions)} />\n </Slot>\n )\n }\n quantity={\n attributesToHide.includes('quantity')\n ? undefined\n : item.quantity\n }\n total={\n <>\n {attributesToHide.includes('total') ? undefined : (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...totalProps} />\n </Slot>\n )}\n {attributesToHide.includes('totalDiscount')\n ? undefined\n : discountProps && (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...discountProps} />\n </Slot>\n )}\n </>\n }\n attributes={getProductAttributes(item, formatterOptions)}\n configurations={getConfigurations(item, formatterOptions)}\n totalExcludingTax={\n attributesToHide.includes('totalExcludingTax')\n ? undefined\n : getTotalExcludingTax(item, formatterOptions)\n }\n taxIncluded={\n quoteDisplaySettings?.price === QuoteDisplayAmount.TAX_INCLUDED\n }\n taxExcluded={\n !attributesToHide.includes('totalExcludingTax') &&\n quoteDisplaySettings?.price ===\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED\n }\n discount={\n showDiscount &&\n item.discounted &&\n item.discountPercentage !== undefined ? (\n <div data-testid=\"item-discount-percentage\">\n {dictionary.discountPercentage.replace(\n '{discount}',\n item.discountPercentage.toString()\n )}\n </div>\n ) : undefined\n }\n savings={\n showSavings &&\n item.discounted &&\n item.savingsAmount !== undefined ? (\n <div>\n <span>\n <Price {...getSavingsAmount(item)} />\n </span>\n \n {dictionary.savingsAmount}\n </div>\n ) : undefined\n }\n footer={getFooter(item)}\n />\n );\n\n return (\n <Slot\n key={item.uid}\n name=\"CartItem\"\n slot={slots?.QuoteItem}\n context={{\n item,\n index,\n loading,\n attributesToHide,\n quoteDisplaySettings,\n showDiscount,\n showSavings,\n dictionary,\n getImage,\n getTitle,\n getSku,\n getPriceProps,\n getTotalPriceProps,\n getProductAttributes,\n getConfigurations,\n getTotalExcludingTax,\n getFooter,\n getSavingsAmount,\n }}\n >\n {defaultCartItem}\n </Slot>\n );\n })\n : null;\n };\n\n const heading = (\n <Slot\n name=\"Heading\"\n slot={slots?.Heading}\n context={{\n count: quoteData?.totalQuantity ?? 0,\n quoteId: quoteData?.uid!,\n }}\n >\n <div data-testid=\"default-quote-summary-list-heading\">\n {dictionary.heading.replace(\n '({count})',\n quoteData?.totalQuantity\n ? `(${quoteData?.totalQuantity.toString()})`\n : ''\n )}\n </div>\n </Slot>\n );\n\n // Heading Section text for screen reader\n const headingSection = heading.props.children.props.children;\n\n // Main Product Entries\n const mainProductEntries = getCartItemEntries();\n\n const totalLineItems = quoteData?.items.length || 0;\n const numOfVisibleItems = displayMaxItems\n ? Math.min(totalLineItems, maxItems)\n : totalLineItems;\n\n const hasHiddenItems = totalLineItems > numOfVisibleItems;\n\n const footerActions =\n quoteData?.totalQuantity && mainProductEntries ? (\n <Slot\n name=\"Footer\"\n slot={slots?.QuoteSummaryFooter}\n context={{ displayMaxItems }}\n data-testid=\"quote-summary-list-footer-slot\"\n className=\"quote-management-quote-summary-list-footer\"\n >\n {hasHiddenItems ? (\n <Button\n className=\"quote-management-quote-summary-list-footer__action\"\n onClick={handleMaxItemsView}\n data-testid=\"view-more-items-button\"\n variant=\"tertiary\"\n >\n {dictionary.viewMore}\n </Button>\n ) : null}\n </Slot>\n ) : null;\n\n const productEntries = quoteData?.totalQuantity ? (\n <CartList data-testid=\"quote-summary-list\">\n {mainProductEntries?.slice(\n 0,\n displayMaxItems ? Math.min(totalLineItems, maxItems) : totalLineItems\n )}\n </CartList>\n ) : null;\n\n return accordion ? (\n <Accordion\n data-testid=\"quote-summary-list-accordion\"\n className={classes([\n `quote-management-quote-summary-list-accordion`,\n `quote-management-quote-summary-list__background--${variant}`,\n ])}\n iconOpen={ChevronRight}\n iconClose={ChevronDown}\n >\n <AccordionSection\n title={headingSection}\n ariaLabelTitle={headingSection}\n data-testid=\"quote-summary-list-accordion__section\"\n open={true}\n renderContentWhenClosed={true}\n >\n <QuoteSummaryListComponent\n {...props}\n aria-expanded={true}\n aria-label={dictionary.listOfQuoteItems}\n className={`quote-management-quote-summary-list-accordion__list`}\n footer={hideFooter ? undefined : footerActions}\n products={productEntries}\n outOfStockMessage={undefined}\n loading={loading}\n variant={variant}\n />\n </AccordionSection>\n </Accordion>\n ) : (\n <QuoteSummaryListComponent\n {...props}\n heading={hideHeading ? undefined : heading}\n footer={hideFooter ? undefined : footerActions}\n products={productEntries}\n outOfStockMessage={undefined}\n loading={loading}\n variant={variant}\n />\n );\n};\n"],"names":["SvgChevronRight","props","React","QuoteSummaryList","className","children","heading","footer","products","outOfStockMessage","loading","variant","jsx","classes","QuoteSummaryListSkeleton","jsxs","Fragment","VComponent","Divider","Skeleton","SkeletonRow","useQuoteSummaryData","quoteData","setQuoteData","useState","setLoading","useEffect","quoteDataEvent","events","payload","quote","getPriceProps","item","options","_a","QuoteDisplayAmount","getSavingsAmount","_b","getTotalPriceProps","totalProps","discountProps","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","transformBundleOptions","data","bundle","option","value","bundleOptions","transformConfigurableOptions","configurable","configurableOptions","transformCustomizableOptions","transformedOptions","result","previous","current","parser","fileAnchorElementHtml","anchorText","EAGER_LOAD_THRESHOLD","getImage","index","defaultImageProps","imageComponent","Image","Slot","getTitle","getSku","getProductAttributes","getConfigurations","configuration","getTotalExcludingTax","Price","hideHeading","hideFooter","routeProduct","showMaxItems","attributesToHide","slots","accordion","showDiscount","showSavings","displayMaxItems","setDisplayMaxItems","quoteDisplaySettings","quoteSummaryMaxItems","state","maxItems","dictionary","useText","handleMaxItemsView","useCallback","prev","formatterOptions","calculatorOptions","getFooter","getCartItemEntries","defaultCartItem","CartItem","headingSection","mainProductEntries","totalLineItems","numOfVisibleItems","hasHiddenItems","footerActions","Button","productEntries","CartList","Accordion","ChevronRight","ChevronDown","AccordionSection","QuoteSummaryListComponent"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as g,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as u,useRef as le,useEffect as j,createPortal as se}from"@dropins/tools/preact-compat.js";import{classes as ce,Slot as s}from"@dropins/tools/lib.js";import{Table as ue,IllustratedMessage as de,Picker as me,Pagination as ge,InLineAlert as pe,Button as F,Price as he}from"@dropins/tools/components.js";import{events as $}from"@dropins/tools/event-bus.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{f as D}from"../chunks/dateUtils.js";import{useText as W}from"@dropins/tools/i18n.js";import{C as fe}from"../chunks/ConfirmationModal.js";/* empty css *//* empty css */import{g as H}from"../chunks/transform-quote.js";import"../chunks/state.js";import{g as Qe}from"../chunks/getQuoteTemplates.js";import{g as Te}from"../chunks/generateQuoteFromTemplate.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/transform-quote-template.js";const Me=({rowData:p=[],loading:h=!1,className:L,emptyStateMessage:M,showItemRange:N=!0,itemRangeMessage:d,showPageSizePicker:f=!0,pageSizePickerMessage:m,showPagination:l=!0,paginationMessage:Q,...c})=>{const o=W({name:"QuoteManagement.QuoteTemplatesListTable.name",state:"QuoteManagement.QuoteTemplatesListTable.state",status:"QuoteManagement.QuoteTemplatesListTable.status",validUntil:"QuoteManagement.QuoteTemplatesListTable.validUntil",minQuoteTotal:"QuoteManagement.QuoteTemplatesListTable.minQuoteTotal",ordersPlaced:"QuoteManagement.QuoteTemplatesListTable.ordersPlaced",lastOrdered:"QuoteManagement.QuoteTemplatesListTable.lastOrdered",actions:"QuoteManagement.QuoteTemplatesListTable.actions"}),b=[{key:"name",label:o.name},{key:"state",label:o.state},{key:"status",label:o.status},{key:"validUntil",label:o.validUntil},{key:"minQuoteTotal",label:o.minQuoteTotal},{key:"ordersPlaced",label:o.ordersPlaced},{key:"lastOrdered",label:o.lastOrdered},{key:"actions",label:o.actions}],S=h||p.length>0,T=!h&&p.length===0&&M,P=N&&d,v=f&&m,y=l&&Q,x=P||v||y;return g("div",{...c,className:ce(["quote-management-quote-templates-list-table",L]),children:[S&&t(ue,{columns:b,rowData:p,loading:h,mobileLayout:"none",className:"quote-management-quote-templates-list-table__table"}),T&&t("div",{className:"quote-templates-list-table__empty-state",children:M}),x&&g("div",{className:"quote-templates-list-table__footer",children:[t("div",{className:"quote-templates-list-table__item-range",children:P&&d}),t("div",{className:"quote-templates-list-table__pagination",children:y&&Q}),t("div",{className:"quote-templates-list-table__page-size-picker",children:v&&m})]})]})},Ge=({pageSize:p,showItemRange:h=!0,showPageSizePicker:L=!0,showPagination:M=!0,onViewQuoteTemplate:N,onGenerateQuoteFromTemplate:d,onPageSizeChange:f,onPageChange:m,slots:l,...Q})=>{const c=W({view:"QuoteManagement.QuoteTemplatesListTable.view",generateQuote:"NegotiableQuoteTemplate.Manage.actionButtons.generateQuote",generateQuoteModalMessage:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message",generateQuoteModalCancel:"NegotiableQuoteTemplate.Manage.confirmationModal.cancel",generateQuoteModalConfirm:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm",generateQuoteModalConfirmLoading:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading",noQuoteTemplatesAccessTitle:"QuoteManagement.permissions.noQuoteTemplatesAccessTitle",noQuoteTemplatesAccessMessage:"QuoteManagement.permissions.noQuoteTemplatesAccessMessage"}),[o,b]=u(null),[S,T]=u(!0),[P,v]=u(!0),[y,x]=u(!1),w=le(!0),[I,z]=u(!1),[O,C]=u(!1),[_,q]=u(null),J=H()[0],[A,K]=u(p||J),[R,U]=u(1);j(()=>{const n=async()=>{try{T(!0);const r=await Qe({pageSize:A,currentPage:R});b(r)}catch(r){console.error("Failed to fetch quote templates:",r)}finally{T(!1)}},e=$.on("authenticated",r=>{x(r),r&&w.current?n():(b(null),T(!1))},{eager:!0});return()=>{e==null||e.off()}},[A,R]),j(()=>{const n=$.on("quote-management/permissions",e=>{const r=e.viewQuoteTemplates||e.manageQuoteTemplates;w.current=r,v(r)},{eager:!0});return()=>{n==null||n.off()}},[]);const G=n=>{K(n),U(1),f==null||f(n)},B=n=>{U(n),m==null||m(n)},X=n=>{const e=n.target,r=e==null?void 0:e.value;r&&G(Number(r))},Y=(n,e)=>{q({id:n,name:e}),z(!0)},Z=async n=>{C(!0);try{const e=await Te({templateId:n.id});d==null||d(n.id,n.name,e.quoteId),z(!1),q(null)}catch(e){console.error("Failed to generate quote from template:",e)}finally{C(!1)}},V=()=>{z(!1),q(null)},ee=(n,e,r)=>n.filter(a=>a==null?void 0:a.uid).map(a=>{var E;return{id:a.id,name:t(s,{name:"Name",slot:e==null?void 0:e.Name,context:{template:a},children:t("span",{children:a.name})}),state:t(s,{name:"State",slot:e==null?void 0:e.State,context:{template:a},children:t("span",{style:{textTransform:"capitalize"},children:((E=a.state)==null?void 0:E.replace(/_/g," "))||"-"})}),status:t(s,{name:"Status",slot:e==null?void 0:e.Status,context:{template:a},children:t("span",{children:a.status})}),validUntil:t(s,{name:"ValidUntil",slot:e==null?void 0:e.ValidUntil,context:{template:a},children:t("span",{children:D(a.expirationDate,"short")})}),minQuoteTotal:t(s,{name:"MinQuoteTotal",slot:e==null?void 0:e.MinQuoteTotal,context:{template:a},children:t(he,{amount:a.prices.minNegotiatedGrandTotal.value,currency:a.prices.minNegotiatedGrandTotal.currency})}),ordersPlaced:t(s,{name:"OrdersPlaced",slot:e==null?void 0:e.OrdersPlaced,context:{template:a},children:t("span",{children:a.ordersPlaced})}),lastOrdered:t(s,{name:"LastOrdered",slot:e==null?void 0:e.LastOrdered,context:{template:a},children:t("span",{children:D(a.lastOrderedAt,"short")})}),actions:g(s,{name:"Actions",slot:e==null?void 0:e.Actions,context:{template:a,onViewQuoteTemplate:r},className:"quote-management-quote-templates-list-table__actions-cell",children:[t(F,{variant:"tertiary",size:"medium",onClick:()=>r==null?void 0:r(a.id,a.name,a.status),children:c.view}),a.canGenerateQuoteFromTemplate&&t(F,{variant:"primary",size:"medium",onClick:()=>Y(a.id,a.name),"data-testid":`generate-quote-button-${a.id}`,children:c.generateQuote})]})}}),te=o!=null&&o.items?ee(o.items,l,N):[],i=o!=null&&o.paginationInfo?{...o.paginationInfo,pageSizeOptions:H()}:void 0,k=!!i,ae=t(s,{name:"EmptyTemplates",slot:l==null?void 0:l.EmptyTemplates,context:{templatesData:o},children:t(de,{heading:"No Quote Templates Found"})}),ne=i?t(s,{name:"ItemRange",slot:l==null?void 0:l.ItemRange,context:i,children:g("span",{children:["Items ",i.startItem," to ",i.endItem," of"," ",i.totalCount," total"]})}):void 0,oe=i&&i.pageSizeOptions?g(s,{name:"PageSizePicker",slot:l==null?void 0:l.PageSizePicker,context:{pageSize:i.pageSize,pageSizeOptions:i.pageSizeOptions,onPageSizeChange:G},children:[t("span",{children:"Show "}),t(me,{variant:"primary",size:"medium",value:String(i.pageSize),options:i.pageSizeOptions.map(n=>({value:String(n),text:String(n)})),handleSelect:X}),t("span",{children:" per page"})]}):void 0,ie=i?t(s,{name:"Pagination",slot:l==null?void 0:l.Pagination,context:{currentPage:i.currentPage,totalPages:i.totalPages,onChange:B},children:t(ge,{currentPage:i.currentPage,totalPages:i.totalPages,onChange:B})}):void 0,re=y&&!P&&!S?t(pe,{type:"warning",variant:"primary",heading:c.noQuoteTemplatesAccessTitle,"data-testid":"quote-templates-permission-warning",children:c.noQuoteTemplatesAccessMessage}):null;return g("div",{...Q,className:Q.className,children:[re,t(Me,{rowData:te,loading:S,emptyStateMessage:ae,showItemRange:h&&k,itemRangeMessage:ne,showPageSizePicker:L&&k,pageSizePickerMessage:oe,showPagination:M&&k,paginationMessage:ie}),I&&se(t(fe,{open:I,title:c.generateQuote,message:c.generateQuoteModalMessage,cancelLabel:c.generateQuoteModalCancel,confirmLabel:O?c.generateQuoteModalConfirmLoading:c.generateQuoteModalConfirm,onCancel:V,onConfirm:O||!_?void 0:()=>Z(_),showCloseButton:!0,"data-testid":"generate-quote-confirmation-modal"}),document.body)]})};export{Ge as QuoteTemplatesListTable,Ge as default};
|
|
4
4
|
//# sourceMappingURL=QuoteTemplatesListTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuoteTemplatesListTable.js","sources":["/@dropins/storefront-quote-management/src/components/QuoteTemplatesListTable/QuoteTemplatesListTable.tsx","/@dropins/storefront-quote-management/src/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/QuoteTemplatesListTable/QuoteTemplatesListTable.css';\n\ntype Column = {\n key: string;\n label: string;\n};\n\nexport interface QuoteTemplatesListTableProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading' | 'children'> {\n rowData: QuoteTemplateRowData[];\n loading?: boolean;\n className?: string;\n emptyStateMessage?: VNode;\n showItemRange?: boolean;\n itemRangeMessage?: VNode;\n showPageSizePicker?: boolean;\n pageSizePickerMessage?: VNode;\n showPagination?: boolean;\n paginationMessage?: VNode;\n}\n\nexport type QuoteTemplateRowData = {\n id: string;\n name: VNode;\n state: VNode;\n status: VNode;\n validUntil: VNode;\n minQuoteTotal: VNode;\n ordersPlaced: VNode;\n lastOrdered: VNode;\n actions: VNode;\n [key: string]: VNode | string | number | undefined;\n};\n\nexport const QuoteTemplatesListTable: FunctionComponent<\n QuoteTemplatesListTableProps\n> = ({\n rowData = [],\n loading = false,\n className,\n emptyStateMessage,\n showItemRange = true,\n itemRangeMessage,\n showPageSizePicker = true,\n pageSizePickerMessage,\n showPagination = true,\n paginationMessage,\n ...props\n}) => {\n const dictionary = useText({\n name: 'QuoteManagement.QuoteTemplatesListTable.name',\n state: 'QuoteManagement.QuoteTemplatesListTable.state',\n status: 'QuoteManagement.QuoteTemplatesListTable.status',\n validUntil: 'QuoteManagement.QuoteTemplatesListTable.validUntil',\n minQuoteTotal: 'QuoteManagement.QuoteTemplatesListTable.minQuoteTotal',\n ordersPlaced: 'QuoteManagement.QuoteTemplatesListTable.ordersPlaced',\n lastOrdered: 'QuoteManagement.QuoteTemplatesListTable.lastOrdered',\n actions: 'QuoteManagement.QuoteTemplatesListTable.actions',\n });\n\n const columns: Column[] = [\n { key: 'name', label: dictionary.name },\n { key: 'state', label: dictionary.state },\n { key: 'status', label: dictionary.status },\n { key: 'validUntil', label: dictionary.validUntil },\n { key: 'minQuoteTotal', label: dictionary.minQuoteTotal },\n { key: 'ordersPlaced', label: dictionary.ordersPlaced },\n { key: 'lastOrdered', label: dictionary.lastOrdered },\n { key: 'actions', label: dictionary.actions },\n ];\n\n // Check if we should show empty state\n const shouldShowEmptyState =\n !loading && rowData.length === 0 && emptyStateMessage;\n\n // Show item range if requested and message is provided\n const shouldShowItemRange = showItemRange && itemRangeMessage;\n\n // Show page size picker if requested and message is provided\n const shouldShowPageSizePicker = showPageSizePicker && pageSizePickerMessage;\n\n // Show pagination if requested and message is provided\n const shouldShowPagination = showPagination && paginationMessage;\n\n // Show footer if any pagination element should be shown\n const shouldShowFooter =\n shouldShowItemRange || shouldShowPageSizePicker || shouldShowPagination;\n\n return (\n <div\n {...props}\n className={classes([\n 'quote-management-quote-templates-list-table',\n className,\n ])}\n >\n <Table\n columns={columns}\n rowData={rowData}\n loading={loading}\n mobileLayout=\"none\"\n className=\"quote-management-quote-templates-list-table__table\"\n />\n {shouldShowEmptyState && (\n <div className=\"quote-templates-list-table__empty-state\">\n {emptyStateMessage}\n </div>\n )}\n {shouldShowFooter && (\n <div className=\"quote-templates-list-table__footer\">\n <div className=\"quote-templates-list-table__item-range\">\n {shouldShowItemRange && itemRangeMessage}\n </div>\n <div className=\"quote-templates-list-table__pagination\">\n {shouldShowPagination && paginationMessage}\n </div>\n <div className=\"quote-templates-list-table__page-size-picker\">\n {shouldShowPageSizePicker && pageSizePickerMessage}\n </div>\n </div>\n )}\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState, createPortal } from 'preact/compat';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n Price,\n Button,\n IllustratedMessage,\n Picker,\n Pagination,\n type PickerOption,\n} from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n QuoteTemplatesListTable as QuoteTemplatesListTableComponent,\n QuoteTemplateRowData,\n ConfirmationModal,\n} from '@/quote-management/components';\nimport { getQuoteTemplates, generateQuoteFromTemplate } from '@/quote-management/api';\nimport { getDefaultPageSizeOptions } from '@/quote-management/data/transforms';\nimport {\n NegotiableQuoteTemplatesListModel,\n NegotiableQuoteTemplateListEntry,\n} from '@/quote-management/data/models';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\n\nexport interface QuoteTemplatesListTableProps\n extends HTMLAttributes<HTMLDivElement> {\n pageSize?: number;\n showItemRange?: boolean;\n showPageSizePicker?: boolean;\n showPagination?: boolean;\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (templateId: string, templateName: string, quoteId: string) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n slots?: {\n /** Slot for customizing the template name cell content */\n Name?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the state cell content */\n State?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the status cell content */\n Status?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the valid until cell content */\n ValidUntil?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the min quote total cell content */\n MinQuoteTotal?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the orders placed cell content */\n OrdersPlaced?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the last ordered cell content */\n LastOrdered?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the actions cell content */\n Actions?: SlotProps<{\n template: NegotiableQuoteTemplateListEntry;\n onViewQuoteTemplate?: (id: string, name: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (id: string, name: string) => void;\n }>;\n /** Slot for customizing the empty templates message */\n EmptyTemplates?: SlotProps;\n /** Slot for customizing the item range display */\n ItemRange?: SlotProps<{\n startItem: number;\n endItem: number;\n totalCount: number;\n currentPage: number;\n pageSize: number;\n }>;\n /** Slot for customizing the page size picker */\n PageSizePicker?: SlotProps<{\n pageSize: number;\n pageSizeOptions: number[];\n onPageSizeChange?: (pageSize: number) => void;\n }>;\n /** Slot for customizing the pagination */\n Pagination?: SlotProps<{\n currentPage: number;\n totalPages: number;\n onChange?: (page: number) => void;\n }>;\n };\n}\n\nexport const QuoteTemplatesListTable: Container<\n QuoteTemplatesListTableProps\n> = ({\n pageSize,\n showItemRange = true,\n showPageSizePicker = true,\n showPagination = true,\n onViewQuoteTemplate,\n onGenerateQuoteFromTemplate,\n onPageSizeChange,\n onPageChange,\n slots,\n ...props\n}) => {\n const dictionary = useText({\n view: 'QuoteManagement.QuoteTemplatesListTable.view',\n generateQuote: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message',\n generateQuoteModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n generateQuoteModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm',\n generateQuoteModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading',\n });\n\n const [templatesData, setTemplatesData] =\n useState<NegotiableQuoteTemplatesListModel | null>(null);\n const [loading, setLoading] = useState(true);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [selectedTemplate, setSelectedTemplate] = useState<{ id: string; name: string } | null>(null);\n\n // Default to first page size option if no pageSize prop provided\n const defaultPageSize = getDefaultPageSizeOptions()[0];\n const [currentPageSize, setCurrentPageSize] = useState(\n pageSize || defaultPageSize\n );\n const [currentPage, setCurrentPage] = useState(1);\n\n // Fetch quote templates data when authenticated\n useEffect(() => {\n const fetchTemplates = async () => {\n try {\n setLoading(true);\n const data = await getQuoteTemplates({\n pageSize: currentPageSize,\n currentPage,\n });\n setTemplatesData(data);\n } catch (error) {\n console.error('Failed to fetch quote templates:', error);\n } finally {\n setLoading(false);\n }\n };\n\n // Listen for authentication events\n const unsubscribe = events.on(\n 'authenticated',\n (isAuthenticated) => {\n if (isAuthenticated) {\n fetchTemplates();\n } else {\n setTemplatesData(null);\n setLoading(false);\n }\n },\n { eager: true }\n ); // eager: true means it fires immediately with current state\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Handle page size change\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1); // Reset to page 1 when page size changes\n onPageSizeChange?.(newPageSize); // Also call parent callback\n };\n\n // Handle page change\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n onPageChange?.(newPage); // Also call parent callback\n };\n\n // Handle page size picker selection\n const handlePageSizeSelect = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target?.value;\n if (value) {\n handlePageSizeChange(Number(value));\n }\n };\n\n // Handle generate quote button click\n const handleGenerateQuoteClick = (templateId: string, templateName: string) => {\n setSelectedTemplate({ id: templateId, name: templateName });\n setShowGenerateQuoteModal(true);\n };\n\n // Handle generate quote confirmation\n const handleGenerateQuote = async (template: { id: string; name: string }) => { \n setIsGeneratingQuote(true);\n \n try {\n const result = await generateQuoteFromTemplate({ templateId: template.id });\n \n // Call the callback AFTER successful generation\n onGenerateQuoteFromTemplate?.(template.id, template.name, result.quoteId);\n \n // Close modal on success\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n // Keep modal open on error so user can try again or cancel\n } finally {\n setIsGeneratingQuote(false);\n }\n };\n\n // Handle generate quote modal cancel\n const handleGenerateQuoteModalCancel = () => {\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n };\n\n // Prepare transformed quote template data for table component\n const prepareRowData = (\n templates: NegotiableQuoteTemplateListEntry[],\n slots?: QuoteTemplatesListTableProps['slots'],\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void\n ): QuoteTemplateRowData[] => {\n return templates\n .filter((template) => template?.uid) // Filter out null templates\n .map((template) => {\n return {\n id: template.id,\n name: (\n <Slot name=\"Name\" slot={slots?.Name} context={{ template }}>\n <span>{template.name}</span>\n </Slot>\n ),\n state: (\n <Slot name=\"State\" slot={slots?.State} context={{ template }}>\n <span style={{ textTransform: 'capitalize' }}>\n {template.state?.replace(/_/g, ' ') || '-'}\n </span>\n </Slot>\n ),\n status: (\n <Slot name=\"Status\" slot={slots?.Status} context={{ template }}>\n <span>{template.status}</span>\n </Slot>\n ),\n validUntil: (\n <Slot\n name=\"ValidUntil\"\n slot={slots?.ValidUntil}\n context={{ template }}\n >\n <span>{formattedDate(template.expirationDate, 'short')}</span>\n </Slot>\n ),\n minQuoteTotal: (\n <Slot\n name=\"MinQuoteTotal\"\n slot={slots?.MinQuoteTotal}\n context={{ template }}\n >\n <Price\n amount={template.prices.minNegotiatedGrandTotal.value}\n currency={template.prices.minNegotiatedGrandTotal.currency}\n />\n </Slot>\n ),\n ordersPlaced: (\n <Slot\n name=\"OrdersPlaced\"\n slot={slots?.OrdersPlaced}\n context={{ template }}\n >\n <span>{template.ordersPlaced}</span>\n </Slot>\n ),\n lastOrdered: (\n <Slot\n name=\"LastOrdered\"\n slot={slots?.LastOrdered}\n context={{ template }}\n >\n <span>{formattedDate(template.lastOrderedAt, 'short')}</span>\n </Slot>\n ),\n actions: (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{ template, onViewQuoteTemplate }}\n className=\"quote-management-quote-templates-list-table__actions-cell\"\n >\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n onClick={() => onViewQuoteTemplate?.(template.id, template.name, template.status)}\n >\n {dictionary.view}\n </Button>\n {template.canGenerateQuoteFromTemplate && (\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={() => handleGenerateQuoteClick(template.id, template.name)}\n data-testid={`generate-quote-button-${template.id}`}\n >\n {dictionary.generateQuote}\n </Button>\n )}\n </Slot>\n ),\n };\n });\n };\n\n // Prepare data for rendering\n const rowData = templatesData?.items\n ? prepareRowData(templatesData.items, slots, onViewQuoteTemplate)\n : [];\n\n // Use pagination info directly from API response, merging in pageSizeOptions if needed\n const paginationInfo = templatesData?.paginationInfo\n ? {\n ...templatesData.paginationInfo,\n pageSizeOptions: getDefaultPageSizeOptions(),\n }\n : undefined;\n\n const shouldShowPagination = !!paginationInfo;\n\n // Empty state message\n const emptyStateMessage = (\n <Slot\n name=\"EmptyTemplates\"\n slot={slots?.EmptyTemplates}\n context={{ templatesData }}\n >\n <IllustratedMessage heading=\"No Quote Templates Found\" />\n </Slot>\n );\n\n // Item range message\n const itemRangeMessage = paginationInfo ? (\n <Slot name=\"ItemRange\" slot={slots?.ItemRange} context={paginationInfo}>\n <span>\n Items {paginationInfo.startItem} to {paginationInfo.endItem} of{' '}\n {paginationInfo.totalCount} total\n </span>\n </Slot>\n ) : undefined;\n\n // Prepare page size picker message for component\n const pageSizePickerMessage =\n paginationInfo && paginationInfo.pageSizeOptions ? (\n <Slot\n name=\"PageSizePicker\"\n slot={slots?.PageSizePicker}\n context={{\n pageSize: paginationInfo.pageSize,\n pageSizeOptions: paginationInfo.pageSizeOptions,\n onPageSizeChange: handlePageSizeChange,\n }}\n >\n <span>Show </span>\n <Picker\n variant=\"primary\"\n size=\"medium\"\n value={String(paginationInfo.pageSize)}\n options={paginationInfo.pageSizeOptions.map(\n (size): PickerOption => ({\n value: String(size),\n text: String(size),\n })\n )}\n handleSelect={handlePageSizeSelect}\n />\n <span> per page</span>\n </Slot>\n ) : undefined;\n\n // Prepare pagination message for component\n const paginationMessage = paginationInfo ? (\n <Slot\n name=\"Pagination\"\n slot={slots?.Pagination}\n context={{\n currentPage: paginationInfo.currentPage,\n totalPages: paginationInfo.totalPages,\n onChange: handlePageChange,\n }}\n >\n <Pagination\n currentPage={paginationInfo.currentPage}\n totalPages={paginationInfo.totalPages}\n onChange={handlePageChange}\n />\n </Slot>\n ) : undefined;\n\n return (\n <>\n <QuoteTemplatesListTableComponent\n rowData={rowData}\n loading={loading}\n className={props.className as string}\n emptyStateMessage={emptyStateMessage}\n showItemRange={showItemRange && shouldShowPagination}\n itemRangeMessage={itemRangeMessage}\n showPageSizePicker={showPageSizePicker && shouldShowPagination}\n pageSizePickerMessage={pageSizePickerMessage}\n showPagination={showPagination && shouldShowPagination}\n paginationMessage={paginationMessage}\n />\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuote}\n message={dictionary.generateQuoteModalMessage}\n cancelLabel={dictionary.generateQuoteModalCancel}\n confirmLabel={\n isGeneratingQuote\n ? dictionary.generateQuoteModalConfirmLoading\n : dictionary.generateQuoteModalConfirm\n }\n onCancel={handleGenerateQuoteModalCancel}\n onConfirm={isGeneratingQuote || !selectedTemplate ? undefined : () => handleGenerateQuote(selectedTemplate)}\n showCloseButton={true}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["QuoteTemplatesListTable","rowData","loading","className","emptyStateMessage","showItemRange","itemRangeMessage","showPageSizePicker","pageSizePickerMessage","showPagination","paginationMessage","props","dictionary","useText","columns","shouldShowEmptyState","shouldShowItemRange","shouldShowPageSizePicker","shouldShowPagination","shouldShowFooter","jsxs","classes","jsx","Table","pageSize","onViewQuoteTemplate","onGenerateQuoteFromTemplate","onPageSizeChange","onPageChange","slots","templatesData","setTemplatesData","useState","setLoading","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","selectedTemplate","setSelectedTemplate","defaultPageSize","getDefaultPageSizeOptions","currentPageSize","setCurrentPageSize","currentPage","setCurrentPage","useEffect","fetchTemplates","data","getQuoteTemplates","error","unsubscribe","events","isAuthenticated","handlePageSizeChange","newPageSize","handlePageChange","newPage","handlePageSizeSelect","event","target","value","handleGenerateQuoteClick","templateId","templateName","handleGenerateQuote","template","result","generateQuoteFromTemplate","handleGenerateQuoteModalCancel","prepareRowData","templates","Slot","_a","formattedDate","Price","Button","paginationInfo","IllustratedMessage","Picker","size","Pagination","Fragment","QuoteTemplatesListTableComponent","createPortal","ConfirmationModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuoteTemplatesListTable.js","sources":["/@dropins/storefront-quote-management/src/components/QuoteTemplatesListTable/QuoteTemplatesListTable.tsx","/@dropins/storefront-quote-management/src/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/QuoteTemplatesListTable/QuoteTemplatesListTable.css';\n\ntype Column = {\n key: string;\n label: string;\n};\n\nexport interface QuoteTemplatesListTableProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading' | 'children'> {\n rowData: QuoteTemplateRowData[];\n loading?: boolean;\n className?: string;\n emptyStateMessage?: VNode;\n showItemRange?: boolean;\n itemRangeMessage?: VNode;\n showPageSizePicker?: boolean;\n pageSizePickerMessage?: VNode;\n showPagination?: boolean;\n paginationMessage?: VNode;\n}\n\nexport type QuoteTemplateRowData = {\n id: string;\n name: VNode;\n state: VNode;\n status: VNode;\n validUntil: VNode;\n minQuoteTotal: VNode;\n ordersPlaced: VNode;\n lastOrdered: VNode;\n actions: VNode;\n [key: string]: VNode | string | number | undefined;\n};\n\nexport const QuoteTemplatesListTable: FunctionComponent<\n QuoteTemplatesListTableProps\n> = ({\n rowData = [],\n loading = false,\n className,\n emptyStateMessage,\n showItemRange = true,\n itemRangeMessage,\n showPageSizePicker = true,\n pageSizePickerMessage,\n showPagination = true,\n paginationMessage,\n ...props\n}) => {\n const dictionary = useText({\n name: 'QuoteManagement.QuoteTemplatesListTable.name',\n state: 'QuoteManagement.QuoteTemplatesListTable.state',\n status: 'QuoteManagement.QuoteTemplatesListTable.status',\n validUntil: 'QuoteManagement.QuoteTemplatesListTable.validUntil',\n minQuoteTotal: 'QuoteManagement.QuoteTemplatesListTable.minQuoteTotal',\n ordersPlaced: 'QuoteManagement.QuoteTemplatesListTable.ordersPlaced',\n lastOrdered: 'QuoteManagement.QuoteTemplatesListTable.lastOrdered',\n actions: 'QuoteManagement.QuoteTemplatesListTable.actions',\n });\n\n const columns: Column[] = [\n { key: 'name', label: dictionary.name },\n { key: 'state', label: dictionary.state },\n { key: 'status', label: dictionary.status },\n { key: 'validUntil', label: dictionary.validUntil },\n { key: 'minQuoteTotal', label: dictionary.minQuoteTotal },\n { key: 'ordersPlaced', label: dictionary.ordersPlaced },\n { key: 'lastOrdered', label: dictionary.lastOrdered },\n { key: 'actions', label: dictionary.actions },\n ];\n\n // Check if should show the table when loading or there is data\n const shouldShowTable = loading || rowData.length > 0;\n\n // Check if we should show empty state\n const shouldShowEmptyState =\n !loading && rowData.length === 0 && emptyStateMessage;\n\n // Show item range if requested and message is provided\n const shouldShowItemRange = showItemRange && itemRangeMessage;\n\n // Show page size picker if requested and message is provided\n const shouldShowPageSizePicker = showPageSizePicker && pageSizePickerMessage;\n\n // Show pagination if requested and message is provided\n const shouldShowPagination = showPagination && paginationMessage;\n\n // Show footer if any pagination element should be shown\n const shouldShowFooter =\n shouldShowItemRange || shouldShowPageSizePicker || shouldShowPagination;\n\n return (\n <div\n {...props}\n className={classes([\n 'quote-management-quote-templates-list-table',\n className,\n ])}\n >\n {shouldShowTable && (\n <Table\n columns={columns}\n rowData={rowData}\n loading={loading}\n mobileLayout=\"none\"\n className=\"quote-management-quote-templates-list-table__table\"\n />\n )}\n {shouldShowEmptyState && (\n <div className=\"quote-templates-list-table__empty-state\">\n {emptyStateMessage}\n </div>\n )}\n {shouldShowFooter && (\n <div className=\"quote-templates-list-table__footer\">\n <div className=\"quote-templates-list-table__item-range\">\n {shouldShowItemRange && itemRangeMessage}\n </div>\n <div className=\"quote-templates-list-table__pagination\">\n {shouldShowPagination && paginationMessage}\n </div>\n <div className=\"quote-templates-list-table__page-size-picker\">\n {shouldShowPageSizePicker && pageSizePickerMessage}\n </div>\n </div>\n )}\n </div>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState, createPortal, useRef } from 'preact/compat';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n Price,\n Button,\n IllustratedMessage,\n Picker,\n Pagination,\n InLineAlert,\n type PickerOption,\n} from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n QuoteTemplatesListTable as QuoteTemplatesListTableComponent,\n QuoteTemplateRowData,\n ConfirmationModal,\n} from '@/quote-management/components';\nimport { getQuoteTemplates, generateQuoteFromTemplate } from '@/quote-management/api';\nimport { getDefaultPageSizeOptions } from '@/quote-management/data/transforms';\nimport {\n NegotiableQuoteTemplatesListModel,\n NegotiableQuoteTemplateListEntry,\n} from '@/quote-management/data/models';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\nimport { state } from '@/quote-management/lib/state';\n\nexport interface QuoteTemplatesListTableProps\n extends HTMLAttributes<HTMLDivElement> {\n pageSize?: number;\n showItemRange?: boolean;\n showPageSizePicker?: boolean;\n showPagination?: boolean;\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (templateId: string, templateName: string, quoteId: string) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n slots?: {\n /** Slot for customizing the template name cell content */\n Name?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the state cell content */\n State?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the status cell content */\n Status?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the valid until cell content */\n ValidUntil?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the min quote total cell content */\n MinQuoteTotal?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the orders placed cell content */\n OrdersPlaced?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the last ordered cell content */\n LastOrdered?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the actions cell content */\n Actions?: SlotProps<{\n template: NegotiableQuoteTemplateListEntry;\n onViewQuoteTemplate?: (id: string, name: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (id: string, name: string) => void;\n }>;\n /** Slot for customizing the empty templates message */\n EmptyTemplates?: SlotProps;\n /** Slot for customizing the item range display */\n ItemRange?: SlotProps<{\n startItem: number;\n endItem: number;\n totalCount: number;\n currentPage: number;\n pageSize: number;\n }>;\n /** Slot for customizing the page size picker */\n PageSizePicker?: SlotProps<{\n pageSize: number;\n pageSizeOptions: number[];\n onPageSizeChange?: (pageSize: number) => void;\n }>;\n /** Slot for customizing the pagination */\n Pagination?: SlotProps<{\n currentPage: number;\n totalPages: number;\n onChange?: (page: number) => void;\n }>;\n };\n}\n\nexport const QuoteTemplatesListTable: Container<\n QuoteTemplatesListTableProps\n> = ({\n pageSize,\n showItemRange = true,\n showPageSizePicker = true,\n showPagination = true,\n onViewQuoteTemplate,\n onGenerateQuoteFromTemplate,\n onPageSizeChange,\n onPageChange,\n slots,\n ...props\n}) => {\n const dictionary = useText({\n view: 'QuoteManagement.QuoteTemplatesListTable.view',\n generateQuote: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message',\n generateQuoteModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n generateQuoteModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm',\n generateQuoteModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading',\n noQuoteTemplatesAccessTitle: 'QuoteManagement.permissions.noQuoteTemplatesAccessTitle',\n noQuoteTemplatesAccessMessage: 'QuoteManagement.permissions.noQuoteTemplatesAccessMessage',\n });\n\n const [templatesData, setTemplatesData] =\n useState<NegotiableQuoteTemplatesListModel | null>(null);\n const [loading, setLoading] = useState(true);\n const [hasPermission, setHasPermission] = useState(true);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const hasPermissionRef = useRef(true);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [selectedTemplate, setSelectedTemplate] = useState<{ id: string; name: string } | null>(null);\n\n // Default to first page size option if no pageSize prop provided\n const defaultPageSize = getDefaultPageSizeOptions()[0];\n const [currentPageSize, setCurrentPageSize] = useState(\n pageSize || defaultPageSize\n );\n const [currentPage, setCurrentPage] = useState(1);\n\n // Fetch quote templates data when authenticated\n useEffect(() => {\n const fetchTemplates = async () => {\n try {\n setLoading(true);\n const data = await getQuoteTemplates({\n pageSize: currentPageSize,\n currentPage,\n });\n setTemplatesData(data);\n } catch (error) {\n console.error('Failed to fetch quote templates:', error);\n } finally {\n setLoading(false);\n }\n };\n\n // Listen for authentication events\n const unsubscribe = events.on(\n 'authenticated',\n (authenticated) => {\n setIsAuthenticated(authenticated);\n if (authenticated && hasPermissionRef.current) {\n fetchTemplates();\n } else {\n setTemplatesData(null);\n setLoading(false);\n }\n },\n { eager: true }\n ); // eager: true means it fires immediately with current state\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Listen for permissions changes\n useEffect(() => {\n const unsubscribe = events.on(\n 'quote-management/permissions',\n (permissions: typeof state.permissions) => {\n const canViewTemplates = permissions.viewQuoteTemplates || permissions.manageQuoteTemplates;\n hasPermissionRef.current = canViewTemplates;\n setHasPermission(canViewTemplates);\n },\n { eager: true }\n );\n\n return () => {\n unsubscribe?.off();\n };\n }, []);\n\n // Handle page size change\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1); // Reset to page 1 when page size changes\n onPageSizeChange?.(newPageSize); // Also call parent callback\n };\n\n // Handle page change\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n onPageChange?.(newPage); // Also call parent callback\n };\n\n // Handle page size picker selection\n const handlePageSizeSelect = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target?.value;\n if (value) {\n handlePageSizeChange(Number(value));\n }\n };\n\n // Handle generate quote button click\n const handleGenerateQuoteClick = (templateId: string, templateName: string) => {\n setSelectedTemplate({ id: templateId, name: templateName });\n setShowGenerateQuoteModal(true);\n };\n\n // Handle generate quote confirmation\n const handleGenerateQuote = async (template: { id: string; name: string }) => { \n setIsGeneratingQuote(true);\n \n try {\n const result = await generateQuoteFromTemplate({ templateId: template.id });\n \n // Call the callback AFTER successful generation\n onGenerateQuoteFromTemplate?.(template.id, template.name, result.quoteId);\n \n // Close modal on success\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n // Keep modal open on error so user can try again or cancel\n } finally {\n setIsGeneratingQuote(false);\n }\n };\n\n // Handle generate quote modal cancel\n const handleGenerateQuoteModalCancel = () => {\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n };\n\n // Prepare transformed quote template data for table component\n const prepareRowData = (\n templates: NegotiableQuoteTemplateListEntry[],\n slots?: QuoteTemplatesListTableProps['slots'],\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void\n ): QuoteTemplateRowData[] => {\n return templates\n .filter((template) => template?.uid) // Filter out null templates\n .map((template) => {\n return {\n id: template.id,\n name: (\n <Slot name=\"Name\" slot={slots?.Name} context={{ template }}>\n <span>{template.name}</span>\n </Slot>\n ),\n state: (\n <Slot name=\"State\" slot={slots?.State} context={{ template }}>\n <span style={{ textTransform: 'capitalize' }}>\n {template.state?.replace(/_/g, ' ') || '-'}\n </span>\n </Slot>\n ),\n status: (\n <Slot name=\"Status\" slot={slots?.Status} context={{ template }}>\n <span>{template.status}</span>\n </Slot>\n ),\n validUntil: (\n <Slot\n name=\"ValidUntil\"\n slot={slots?.ValidUntil}\n context={{ template }}\n >\n <span>{formattedDate(template.expirationDate, 'short')}</span>\n </Slot>\n ),\n minQuoteTotal: (\n <Slot\n name=\"MinQuoteTotal\"\n slot={slots?.MinQuoteTotal}\n context={{ template }}\n >\n <Price\n amount={template.prices.minNegotiatedGrandTotal.value}\n currency={template.prices.minNegotiatedGrandTotal.currency}\n />\n </Slot>\n ),\n ordersPlaced: (\n <Slot\n name=\"OrdersPlaced\"\n slot={slots?.OrdersPlaced}\n context={{ template }}\n >\n <span>{template.ordersPlaced}</span>\n </Slot>\n ),\n lastOrdered: (\n <Slot\n name=\"LastOrdered\"\n slot={slots?.LastOrdered}\n context={{ template }}\n >\n <span>{formattedDate(template.lastOrderedAt, 'short')}</span>\n </Slot>\n ),\n actions: (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{ template, onViewQuoteTemplate }}\n className=\"quote-management-quote-templates-list-table__actions-cell\"\n >\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n onClick={() => onViewQuoteTemplate?.(template.id, template.name, template.status)}\n >\n {dictionary.view}\n </Button>\n {template.canGenerateQuoteFromTemplate && (\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={() => handleGenerateQuoteClick(template.id, template.name)}\n data-testid={`generate-quote-button-${template.id}`}\n >\n {dictionary.generateQuote}\n </Button>\n )}\n </Slot>\n ),\n };\n });\n };\n\n // Prepare data for rendering\n const rowData = templatesData?.items\n ? prepareRowData(templatesData.items, slots, onViewQuoteTemplate)\n : [];\n\n // Use pagination info directly from API response, merging in pageSizeOptions if needed\n const paginationInfo = templatesData?.paginationInfo\n ? {\n ...templatesData.paginationInfo,\n pageSizeOptions: getDefaultPageSizeOptions(),\n }\n : undefined;\n\n const shouldShowPagination = !!paginationInfo;\n\n // Empty state message\n const emptyStateMessage = (\n <Slot\n name=\"EmptyTemplates\"\n slot={slots?.EmptyTemplates}\n context={{ templatesData }}\n >\n <IllustratedMessage heading=\"No Quote Templates Found\" />\n </Slot>\n );\n\n // Item range message\n const itemRangeMessage = paginationInfo ? (\n <Slot name=\"ItemRange\" slot={slots?.ItemRange} context={paginationInfo}>\n <span>\n Items {paginationInfo.startItem} to {paginationInfo.endItem} of{' '}\n {paginationInfo.totalCount} total\n </span>\n </Slot>\n ) : undefined;\n\n // Prepare page size picker message for component\n const pageSizePickerMessage =\n paginationInfo && paginationInfo.pageSizeOptions ? (\n <Slot\n name=\"PageSizePicker\"\n slot={slots?.PageSizePicker}\n context={{\n pageSize: paginationInfo.pageSize,\n pageSizeOptions: paginationInfo.pageSizeOptions,\n onPageSizeChange: handlePageSizeChange,\n }}\n >\n <span>Show </span>\n <Picker\n variant=\"primary\"\n size=\"medium\"\n value={String(paginationInfo.pageSize)}\n options={paginationInfo.pageSizeOptions.map(\n (size): PickerOption => ({\n value: String(size),\n text: String(size),\n })\n )}\n handleSelect={handlePageSizeSelect}\n />\n <span> per page</span>\n </Slot>\n ) : undefined;\n\n // Prepare pagination message for component\n const paginationMessage = paginationInfo ? (\n <Slot\n name=\"Pagination\"\n slot={slots?.Pagination}\n context={{\n currentPage: paginationInfo.currentPage,\n totalPages: paginationInfo.totalPages,\n onChange: handlePageChange,\n }}\n >\n <Pagination\n currentPage={paginationInfo.currentPage}\n totalPages={paginationInfo.totalPages}\n onChange={handlePageChange}\n />\n </Slot>\n ) : undefined;\n\n // Permission warning banner shown above the table/empty state\n const permissionWarningBanner = isAuthenticated && !hasPermission && !loading ? (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n heading={dictionary.noQuoteTemplatesAccessTitle}\n data-testid=\"quote-templates-permission-warning\"\n >\n {dictionary.noQuoteTemplatesAccessMessage}\n </InLineAlert>\n ) : null;\n\n return (\n <div {...props} className={props.className as string}>\n {permissionWarningBanner}\n <QuoteTemplatesListTableComponent\n rowData={rowData}\n loading={loading}\n emptyStateMessage={emptyStateMessage}\n showItemRange={showItemRange && shouldShowPagination}\n itemRangeMessage={itemRangeMessage}\n showPageSizePicker={showPageSizePicker && shouldShowPagination}\n pageSizePickerMessage={pageSizePickerMessage}\n showPagination={showPagination && shouldShowPagination}\n paginationMessage={paginationMessage}\n />\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuote}\n message={dictionary.generateQuoteModalMessage}\n cancelLabel={dictionary.generateQuoteModalCancel}\n confirmLabel={\n isGeneratingQuote\n ? dictionary.generateQuoteModalConfirmLoading\n : dictionary.generateQuoteModalConfirm\n }\n onCancel={handleGenerateQuoteModalCancel}\n onConfirm={isGeneratingQuote || !selectedTemplate ? undefined : () => handleGenerateQuote(selectedTemplate)}\n showCloseButton={true}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n </div>\n );\n};\n"],"names":["QuoteTemplatesListTable","rowData","loading","className","emptyStateMessage","showItemRange","itemRangeMessage","showPageSizePicker","pageSizePickerMessage","showPagination","paginationMessage","props","dictionary","useText","columns","shouldShowTable","shouldShowEmptyState","shouldShowItemRange","shouldShowPageSizePicker","shouldShowPagination","shouldShowFooter","jsxs","classes","jsx","Table","pageSize","onViewQuoteTemplate","onGenerateQuoteFromTemplate","onPageSizeChange","onPageChange","slots","templatesData","setTemplatesData","useState","setLoading","hasPermission","setHasPermission","isAuthenticated","setIsAuthenticated","hasPermissionRef","useRef","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","selectedTemplate","setSelectedTemplate","defaultPageSize","getDefaultPageSizeOptions","currentPageSize","setCurrentPageSize","currentPage","setCurrentPage","useEffect","fetchTemplates","data","getQuoteTemplates","error","unsubscribe","events","authenticated","permissions","canViewTemplates","handlePageSizeChange","newPageSize","handlePageChange","newPage","handlePageSizeSelect","event","target","value","handleGenerateQuoteClick","templateId","templateName","handleGenerateQuote","template","result","generateQuoteFromTemplate","handleGenerateQuoteModalCancel","prepareRowData","templates","Slot","_a","formattedDate","Price","Button","paginationInfo","IllustratedMessage","Picker","size","Pagination","permissionWarningBanner","InLineAlert","QuoteTemplatesListTableComponent","createPortal","ConfirmationModal"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as Q,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as u,useRef as ee,useEffect as I}from"@dropins/tools/preact-compat.js";import{classes as te,Slot as s}from"@dropins/tools/lib.js";import{Table as ae,IllustratedMessage as ne,Picker as re,Pagination as ie,InLineAlert as oe,Button as ce,Price as se}from"@dropins/tools/components.js";import{events as _}from"@dropins/tools/event-bus.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{f as F}from"../chunks/dateUtils.js";import{useText as j}from"@dropins/tools/i18n.js";/* empty css *//* empty css */import{g as me}from"../chunks/transform-quote.js";import"../chunks/state.js";import{n as $}from"../chunks/negotiableQuotes.js";import"@dropins/tools/fetch-graphql.js";const le=({rowData:d=[],loading:p=!1,className:A,emptyStateMessage:y,showItemRange:k=!0,itemRangeMessage:l,showPageSizePicker:g=!0,pageSizePickerMessage:o,showPagination:S=!0,paginationMessage:h,...m})=>{const c=j({quoteName:"QuoteManagement.QuotesListTable.quoteName",created:"QuoteManagement.QuotesListTable.created",createdBy:"QuoteManagement.QuotesListTable.createdBy",status:"QuoteManagement.QuotesListTable.status",lastUpdated:"QuoteManagement.QuotesListTable.lastUpdated",quoteTemplate:"QuoteManagement.QuotesListTable.quoteTemplate",quoteTotal:"QuoteManagement.QuotesListTable.quoteTotal",actions:"QuoteManagement.QuotesListTable.actions"}),T=[{key:"quoteName",label:c.quoteName},{key:"created",label:c.created},{key:"createdBy",label:c.createdBy},{key:"status",label:c.status},{key:"lastUpdated",label:c.lastUpdated},{key:"quoteTemplate",label:c.quoteTemplate},{key:"quoteTotal",label:c.quoteTotal},{key:"actions",label:c.actions}],f=p||d.length>0,L=!p&&d.length===0&&y,b=k&&l,P=g&&o,N=S&&h,v=b||P||N;return Q("div",{...m,className:te(["quote-management-quotes-list-table",A]),children:[f&&t(ae,{columns:T,rowData:d,loading:p,mobileLayout:"none",className:"quote-management-quotes-list-table__table"}),L&&t("div",{className:"quotes-list-table__empty-state",children:y}),v&&Q("div",{className:"quotes-list-table__footer",children:[t("div",{className:"quotes-list-table__item-range",children:b&&l}),t("div",{className:"quotes-list-table__pagination",children:N&&h}),t("div",{className:"quotes-list-table__page-size-picker",children:P&&o})]})]})},Ae=({pageSize:d,showItemRange:p=!0,showPageSizePicker:A=!0,showPagination:y=!0,onViewQuote:k,onPageSizeChange:l,onPageChange:g,slots:o,...S})=>{const h=j({noQuotesAccessTitle:"QuoteManagement.permissions.noQuotesAccessTitle",noQuotesAccessMessage:"QuoteManagement.permissions.noQuotesAccessMessage"}),[m,c]=u(null),[T,f]=u(!0),[L,b]=u(!0),[P,N]=u(!1),v=ee(!0),q=me()[0],[x,H]=u(d||q),[z,w]=u(1);I(()=>{const r=async()=>{try{f(!0);const n=await $({pageSize:x,currentPage:z});c(n)}catch(n){console.error("Failed to fetch quotes:",n)}finally{f(!1)}},e=_.on("authenticated",n=>{N(n),n&&v.current?r():(c(null),f(!1))},{eager:!0});return()=>{e==null||e.off()}},[x,z]),I(()=>{const r=_.on("quote-management/permissions",e=>{const n=e.editQuote||e.requestQuote;v.current=n,b(n)},{eager:!0});return()=>{r==null||r.off()}},[]),I(()=>{const r=async()=>{try{const n=await $({pageSize:x,currentPage:z});c(n)}catch(n){console.error("Failed to fetch quotes:",n)}},e=_.on("quote-management/quote-renamed",()=>{r()},{eager:!0});return()=>{e==null||e.off()}},[x,z]);const B=r=>{H(r),w(1),l==null||l(r)},R=r=>{w(r),g==null||g(r)},W=r=>{const e=r.target,n=e==null?void 0:e.value;n&&B(Number(n))},D=(r,e,n)=>r.filter(a=>a==null?void 0:a.uid).map(a=>{var U,C,O,E;const V=`${a.buyer.firstname} ${a.buyer.lastname}`;return{id:a.uid,quoteName:t(s,{name:"QuoteName",slot:e==null?void 0:e.QuoteName,context:{quote:a},children:t("span",{children:a.name})}),created:t(s,{name:"Created",slot:e==null?void 0:e.Created,context:{quote:a},children:t("span",{children:a.createdAt?F(a.createdAt,"short"):"N/A"})}),createdBy:t(s,{name:"CreatedBy",slot:e==null?void 0:e.CreatedBy,context:{quote:a},children:t("span",{children:V})}),status:t(s,{name:"Status",slot:e==null?void 0:e.Status,context:{quote:a},children:t("span",{children:a.status})}),lastUpdated:t(s,{name:"LastUpdated",slot:e==null?void 0:e.LastUpdated,context:{quote:a},children:t("span",{children:a.updatedAt?F(a.updatedAt,"short"):"N/A"})}),quoteTemplate:t(s,{name:"QuoteTemplate",slot:e==null?void 0:e.QuoteTemplate,context:{quote:a},children:t("span",{children:a.templateName})}),quoteTotal:t(s,{name:"QuoteTotal",slot:e==null?void 0:e.QuoteTotal,context:{quote:a},children:t(se,{amount:(C=(U=a.prices)==null?void 0:U.grandTotal)==null?void 0:C.value,currency:(E=(O=a.prices)==null?void 0:O.grandTotal)==null?void 0:E.currency})}),actions:t(s,{name:"Actions",slot:e==null?void 0:e.Actions,context:{quote:a,onViewQuote:n},children:t(ce,{variant:"tertiary",size:"medium",onClick:()=>n==null?void 0:n(a.uid,a.name,a.status),children:"View"})})}}),G=m!=null&&m.items?D(m.items,o,k):[],i=m==null?void 0:m.paginationInfo,M=!!i,J=t(s,{name:"EmptyQuotes",slot:o==null?void 0:o.EmptyQuotes,context:{quotesData:m},children:t(ne,{heading:"No Quotes Found"})}),K=i?t(s,{name:"ItemRange",slot:o==null?void 0:o.ItemRange,context:i,children:Q("span",{children:["Items ",i.startItem," to ",i.endItem," of"," ",i.totalCount," total"]})}):void 0,X=i&&i.pageSizeOptions?Q(s,{name:"PageSizePicker",slot:o==null?void 0:o.PageSizePicker,context:{pageSize:i.pageSize,pageSizeOptions:i.pageSizeOptions,onPageSizeChange:B},children:[t("span",{children:"Show "}),t(re,{variant:"primary",size:"medium",value:String(i.pageSize),options:i.pageSizeOptions.map(r=>({value:String(r),text:String(r)})),handleSelect:W}),t("span",{children:" per page"})]}):void 0,Y=i?t(s,{name:"Pagination",slot:o==null?void 0:o.Pagination,context:{currentPage:i.currentPage,totalPages:i.totalPages,onChange:R},children:t(ie,{currentPage:i.currentPage,totalPages:i.totalPages,onChange:R})}):void 0,Z=P&&!L&&!T?t(oe,{type:"warning",variant:"primary",heading:h.noQuotesAccessTitle,"data-testid":"quotes-permission-warning",children:h.noQuotesAccessMessage}):null;return Q("div",{...S,className:S.className,children:[Z,t(le,{rowData:G,loading:T,emptyStateMessage:J,showItemRange:p&&M,itemRangeMessage:K,showPageSizePicker:A&&M,pageSizePickerMessage:X,showPagination:y&&M,paginationMessage:Y})]})};export{Ae as QuotesListTable,Ae as default};
|
|
4
4
|
//# sourceMappingURL=QuotesListTable.js.map
|