@dropins/storefront-quote-management 1.1.2 → 1.2.0-beta.0

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/api.js +1172 -5
  3. package/api.js.map +1 -1
  4. package/chunks/ItemsQuoted.js +1 -1
  5. package/chunks/ItemsQuoted.js.map +1 -1
  6. package/chunks/ItemsQuotedTemplate.js +1 -1
  7. package/chunks/ItemsQuotedTemplate.js.map +1 -1
  8. package/chunks/QuoteCommentsList.js +1 -1
  9. package/chunks/QuoteCommentsList.js.map +1 -1
  10. package/chunks/QuoteHistoryLog.js +1 -1
  11. package/chunks/QuoteHistoryLog.js.map +1 -1
  12. package/chunks/QuoteTemplateCommentsList.js +1 -1
  13. package/chunks/QuoteTemplateCommentsList.js.map +1 -1
  14. package/chunks/QuoteTemplateHistoryLog.js +1 -1
  15. package/chunks/QuoteTemplateHistoryLog.js.map +1 -1
  16. package/chunks/ShippingAddressDisplay.js +1 -1
  17. package/chunks/ShippingAddressDisplay.js.map +1 -1
  18. package/chunks/components.js +4 -0
  19. package/chunks/components.js.map +1 -0
  20. package/containers/ItemsQuoted.js +1 -1
  21. package/containers/ItemsQuotedTemplate.js +1 -1
  22. package/containers/ManageNegotiableQuote.js +1 -1
  23. package/containers/ManageNegotiableQuote.js.map +1 -1
  24. package/containers/ManageNegotiableQuoteTemplate.js +2 -2
  25. package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
  26. package/containers/OrderSummary.js +1 -1
  27. package/containers/OrderSummary.js.map +1 -1
  28. package/containers/OrderSummaryLine.js +1 -1
  29. package/containers/QuoteCommentsList.js +1 -1
  30. package/containers/QuoteHistoryLog.js +1 -1
  31. package/containers/QuoteSummaryList.js +1 -1
  32. package/containers/QuoteSummaryList.js.map +1 -1
  33. package/containers/QuoteTemplateCommentsList.js +1 -1
  34. package/containers/QuoteTemplateHistoryLog.js +1 -1
  35. package/containers/QuoteTemplatesListTable.js +1 -1
  36. package/containers/QuoteTemplatesListTable.js.map +1 -1
  37. package/containers/QuotesListTable.js +1 -1
  38. package/containers/QuotesListTable.js.map +1 -1
  39. package/containers/RequestNegotiableQuoteForm.js +1 -1
  40. package/containers/RequestNegotiableQuoteForm.js.map +1 -1
  41. package/containers/ShippingAddressDisplay.js +1 -1
  42. package/package.json +1 -1
  43. package/render.js +2 -7
  44. package/render.js.map +1 -1
  45. package/chunks/AttachedFilesList.js +0 -4
  46. package/chunks/AttachedFilesList.js.map +0 -1
  47. package/chunks/CheckWithCircle.js +0 -4
  48. package/chunks/CheckWithCircle.js.map +0 -1
  49. package/chunks/ChevronDown.js +0 -4
  50. package/chunks/ChevronDown.js.map +0 -1
  51. package/chunks/ConfirmationModal.js +0 -4
  52. package/chunks/ConfirmationModal.js.map +0 -1
  53. package/chunks/LineItemNoteModal.js +0 -4
  54. package/chunks/LineItemNoteModal.js.map +0 -1
  55. package/chunks/NegotiableQuoteFragment.js +0 -396
  56. package/chunks/NegotiableQuoteFragment.js.map +0 -1
  57. package/chunks/NegotiableQuoteTemplateFragment.js +0 -342
  58. package/chunks/NegotiableQuoteTemplateFragment.js.map +0 -1
  59. package/chunks/OrderSummaryLine.js +0 -4
  60. package/chunks/OrderSummaryLine.js.map +0 -1
  61. package/chunks/QuoteCommentsList3.js +0 -4
  62. package/chunks/QuoteCommentsList3.js.map +0 -1
  63. package/chunks/QuoteHistoryLog3.js +0 -4
  64. package/chunks/QuoteHistoryLog3.js.map +0 -1
  65. package/chunks/RenameQuoteModal.js +0 -4
  66. package/chunks/RenameQuoteModal.js.map +0 -1
  67. package/chunks/WarningFilled.js +0 -4
  68. package/chunks/WarningFilled.js.map +0 -1
  69. package/chunks/addQuoteTemplateLineItemNote.js +0 -33
  70. package/chunks/addQuoteTemplateLineItemNote.js.map +0 -1
  71. package/chunks/dateUtils.js +0 -4
  72. package/chunks/dateUtils.js.map +0 -1
  73. package/chunks/duplicateNegotiableQuote.js +0 -109
  74. package/chunks/duplicateNegotiableQuote.js.map +0 -1
  75. package/chunks/generateQuoteFromTemplate.js +0 -12
  76. package/chunks/generateQuoteFromTemplate.js.map +0 -1
  77. package/chunks/getQuoteData.js +0 -16
  78. package/chunks/getQuoteData.js.map +0 -1
  79. package/chunks/getQuoteTemplateData.js +0 -28
  80. package/chunks/getQuoteTemplateData.js.map +0 -1
  81. package/chunks/getQuoteTemplates.js +0 -52
  82. package/chunks/getQuoteTemplates.js.map +0 -1
  83. package/chunks/negotiableQuotes.js +0 -77
  84. package/chunks/negotiableQuotes.js.map +0 -1
  85. package/chunks/openQuoteTemplate.js +0 -62
  86. package/chunks/openQuoteTemplate.js.map +0 -1
  87. package/chunks/requestNegotiableQuote.js +0 -25
  88. package/chunks/requestNegotiableQuote.js.map +0 -1
  89. package/chunks/setLineItemNote.js +0 -47
  90. package/chunks/setLineItemNote.js.map +0 -1
  91. package/chunks/state.js +0 -4
  92. package/chunks/state.js.map +0 -1
  93. package/chunks/transform-quote-template.js +0 -4
  94. package/chunks/transform-quote-template.js.map +0 -1
  95. package/chunks/transform-quote.js +0 -4
  96. package/chunks/transform-quote.js.map +0 -1
  97. package/chunks/uploadFile.js +0 -20
  98. package/chunks/uploadFile.js.map +0 -1
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as n,jsxs as p,Fragment as la}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useRef as _e,useEffect as q,useCallback as c,useMemo as f,createPortal as W}from"@dropins/tools/preact-compat.js";import{classes as u,VComponent as M,Slot as g}from"@dropins/tools/lib.js";import{f as ca}from"../chunks/dateUtils.js";/* empty css */import{Skeleton as ja,SkeletonRow as z,InLineAlert as h,Button as sa,TextArea as Ga,InputFile as Ka}from"@dropins/tools/components.js";import{events as C}from"@dropins/tools/event-bus.js";import{S as Xa,A as Ja,T as Ya,R as Za}from"../chunks/RenameQuoteModal.js";import{v as Aa,f as et,a as at,S as tt,A as nt}from"../chunks/AttachedFilesList.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{C as X}from"../chunks/ConfirmationModal.js";/* empty css *//* empty css */import{S as ot}from"../chunks/ShippingAddressDisplay.js";import{Q as it}from"../chunks/QuoteHistoryLog3.js";import{g as rt}from"../chunks/getQuoteData.js";import"../chunks/state.js";import{r as lt,c as ct,a as st,s as mt,d as dt,b as ut}from"../chunks/duplicateNegotiableQuote.js";import{u as gt}from"../chunks/uploadFile.js";import{I as ft}from"../chunks/ItemsQuoted.js";import{Q as pt}from"../chunks/QuoteCommentsList3.js";import{S as D}from"../chunks/WarningFilled.js";import{S as J}from"../chunks/CheckWithCircle.js";import{useText as Mt}from"@dropins/tools/i18n.js";import"../chunks/QuoteHistoryLog.js";import"../chunks/transform-quote.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/NegotiableQuoteFragment.js";import"../chunks/transform-quote-template.js";import"../chunks/NegotiableQuoteTemplateFragment.js";import"../chunks/LineItemNoteModal.js";import"../chunks/setLineItemNote.js";import"../chunks/QuoteCommentsList.js";const bt=({className:x,loading:t,quoteName:m,quoteStatus:R,banner:y,details:_,actionBar:N,quoteContent:L,shippingInformationTitle:Y,shippingInformation:e,quoteCommentsTitle:S,quoteComments:E,attachFilesField:k,attachedFilesList:P,footer:Z,...A})=>t?n(ht,{}):p("div",{...A,className:u(["quote-management-manage-negotiable-quote",x]),children:[p("div",{className:u(["quote-management-manage-negotiable-quote__header"]),children:[m&&n(M,{node:m,className:u(["quote-management-manage-negotiable-quote__quote-name"])}),R&&n(M,{node:R,className:u(["quote-management-manage-negotiable-quote__quote-status"])})]}),y&&n(M,{node:y,className:u(["quote-management-manage-negotiable-quote__banner"])}),_&&n(M,{node:_,className:u(["quote-management-manage-negotiable-quote__details"])}),N&&n(M,{node:N,className:u(["quote-management-manage-negotiable-quote__action-bar"])}),L&&n(M,{node:L,className:u(["quote-management-manage-negotiable-quote__quote-content"])}),p("div",{"data-testid":"quote-shipping-information-container",className:u(["quote-management-manage-negotiable-quote__shipping-information-container"]),children:[Y&&n(M,{node:Y,className:u(["quote-management-manage-negotiable-quote__shipping-information-title"])}),e&&n(M,{node:e,className:u(["quote-management-manage-negotiable-quote__shipping-information"])})]}),p("div",{"data-testid":"quote-comments-container",className:u(["quote-management-manage-negotiable-quote__quote-comments-container"]),children:[S&&n(M,{node:S,className:u(["quote-management-manage-negotiable-quote__quote-comments-title"])}),E&&n(M,{node:E,className:u(["quote-management-manage-negotiable-quote__quote-comments"])}),k&&n(M,{node:k,className:u(["quote-management-manage-negotiable-quote__attach-files-field"])}),P&&n(M,{node:P,className:u(["quote-management-manage-negotiable-quote__attached-files-list"])})]}),n(M,{node:Z,className:u(["quote-management-manage-negotiable-quote__footer"])})]}),ht=()=>p(ja,{"data-testid":"manage-negotiable-quote-skeleton",children:[n(z,{variant:"heading",fullWidth:!0,size:"large"}),n(z,{variant:"row",fullWidth:!1,size:"small"}),n(z,{variant:"row",fullWidth:!1,size:"small"}),n(z,{variant:"row",fullWidth:!0}),n(z,{variant:"row",fullWidth:!0,size:"xlarge",lines:2}),n(z,{variant:"row",fullWidth:!1,size:"small"})]}),tn=({onActionsDropdownChange:x,slots:t,onActionsButtonClick:m,onSendForReview:R,maxFiles:y,maxFileSize:_,acceptedFileTypes:N,onDuplicateQuote:L,...Y})=>{const[e,S]=l(void 0),[E,k]=l(!0),[P,Z]=l(!1),[A,$]=l(null),[ma,ee]=l(!1),[Ee,se]=l(!1),[Fe,F]=l(null),[da,H]=l(!1),[Ie,we]=l(!1),[I,De]=l(""),[Q,me]=l(!1),[xe,de]=l(!1),[Re,ue]=l(!1),[Le,O]=l(""),[ke,V]=l(""),[He,ge]=l(!1),[Oe,Be]=l(!1),[Ue,j]=l(""),[We,ae]=l(""),[ze,fe]=l(!1),[te,ne]=l(""),[pe,oe]=l(""),[Me,G]=l(""),[ua,B]=l(""),[be,ie]=l(""),[b,K]=l([]),[re,le]=l(void 0),[he,Pe]=l(new Set),$e=_e(he),Ne=_e(null),[U,Se]=l(""),ce=_e(U),[Ve,je]=l(!1);q(()=>{$e.current=he},[he]),q(()=>{ce.current=U},[U]);const o=Mt({createdLabel:"NegotiableQuote.Manage.createdLabel",salesRepLabel:"NegotiableQuote.Manage.salesRepLabel",expiresLabel:"NegotiableQuote.Manage.expiresLabel",actionsLabel:"NegotiableQuote.Manage.actionsLabel",remove:"NegotiableQuote.Manage.actions.remove",close:"NegotiableQuote.Manage.actionButtons.close",delete:"NegotiableQuote.Manage.actionButtons.delete",print:"NegotiableQuote.Manage.actionButtons.print",createTemplate:"NegotiableQuote.Manage.actionButtons.createTemplate",createCopy:"NegotiableQuote.Manage.actionButtons.createCopy",shippingInformationTitle:"NegotiableQuote.Manage.shippingInformation.title",quoteCommentsTitle:"NegotiableQuote.Manage.quoteComments.title",quoteCommentsPlaceholder:"NegotiableQuote.Manage.quoteComments.placeholder",sendForReview:"NegotiableQuote.Manage.actionButtons.sendForReview",bannerTitle:"NegotiableQuote.Manage.bannerTitle",statusSubmitted:"NegotiableQuote.Manage.bannerStatusMessages.submitted",statusPending:"NegotiableQuote.Manage.bannerStatusMessages.pending",statusExpired:"NegotiableQuote.Manage.bannerStatusMessages.expired",errorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",closeSuccessMessage:"NegotiableQuote.Manage.confirmationModal.close.successDescription",closeModalTitle:"NegotiableQuote.Manage.actionButtons.close",closeModalMessage:"NegotiableQuote.Manage.confirmationModal.close.message",closeModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",closeModalConfirm:"NegotiableQuote.Manage.confirmationModal.close.confirm",closeModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.close.confirmLoading",closeModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.close.successHeading",createTemplateModalTitle:"NegotiableQuote.Manage.actionButtons.createTemplate",createTemplateModalMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.message",createTemplateModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",createTemplateModalConfirm:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirm",createTemplateModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirmLoading",createTemplateModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.successHeading",createTemplateSuccessMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.successDescription",createTemplateModalErrorHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorHeading",createTemplateErrorFallback:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorFallback",renameErrorHeading:"NegotiableQuote.Manage.rename.errorHeading",renameQuoteNameRequired:"NegotiableQuote.Manage.rename.quoteNameRequired",renameErrorDefault:"NegotiableQuote.Manage.rename.errorDefault",renameSuccessHeading:"NegotiableQuote.Manage.rename.successHeading",renameSuccessMessage:"NegotiableQuote.Manage.rename.successMessage",confirmationModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",confirmationModalDeleteTitle:"NegotiableQuote.Manage.confirmationModal.delete.title",confirmationModalDeleteMessage:"NegotiableQuote.Manage.confirmationModal.delete.message",confirmationModalDeleteConfirm:"NegotiableQuote.Manage.confirmationModal.delete.confirm",confirmationModalDeleteErrorHeading:"NegotiableQuote.Manage.confirmationModal.delete.errorHeading",confirmationModalDeleteErrorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",confirmationModalDeleteSuccessHeading:"NegotiableQuote.Manage.confirmationModal.delete.successHeading",confirmationModalDeleteSuccessDescription:"NegotiableQuote.Manage.confirmationModal.delete.successDescription",confirmationModalDuplicateTitle:"NegotiableQuote.Manage.confirmationModal.duplicate.title",confirmationModalDuplicateMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.message",confirmationModalDuplicateConfirm:"NegotiableQuote.Manage.confirmationModal.duplicate.confirm",confirmationModalDuplicateErrorHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.errorHeading",confirmationModalDuplicateErrorFallback:"NegotiableQuote.Manage.confirmationModal.duplicate.errorFallback",confirmationModalDuplicateSuccessHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.successHeading",confirmationModalDuplicateSuccessDescription:"NegotiableQuote.Manage.confirmationModal.duplicate.successDescription",duplicateOutOfStockWarningHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningHeading",duplicateOutOfStockWarningMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningMessage",noItemsSelectedModalTitle:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.title",noItemsSelectedModalMessage:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.message",noItemsSelectedModalConfirm:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.confirm",attachFiles:"NegotiableQuote.Manage.attachFiles",fileUploadError:"NegotiableQuote.Manage.fileUploadError",maxFilesExceeded:"NegotiableQuote.Manage.maxFilesExceeded",maxFileSizeExceeded:"NegotiableQuote.Manage.maxFileSizeExceeded",invalidFileType:"NegotiableQuote.Manage.invalidFileType"});q(()=>{const a=C.on("quote-management/quote-data",i=>{const{quote:r}=i;if(r){S(r),k(!1);const s=`duplicate-outOfStock-warning-${r.uid}`;sessionStorage.getItem(s)==="true"&&(we(!0),sessionStorage.removeItem(s))}},{eager:!0});return()=>a==null?void 0:a.off()},[]),q(()=>{const a=C.on("quote-management/shipping-address-set",i=>{const{quote:r}=i;r&&S(r)},{eager:!0});return()=>a==null?void 0:a.off()},[]),q(()=>{const a=C.on("quote-management/quote-sent-for-review",i=>{const{quote:r}=i;S(r),De(""),K([]),me(!1)},{eager:!0});return()=>a==null?void 0:a.off()},[]),q(()=>{const a=C.on("quote-management/quote-items-removed",i=>{const{quote:r,removedItemUids:s}=i;r&&S(r),s&&Pe(d=>{const v=new Set(d);return s.forEach(w=>v.delete(w)),v})},{eager:!0});return()=>a==null?void 0:a.off()},[]);const Ge=c((a,i)=>{Pe(r=>{const s=new Set(r);return i?s.add(a.uid):s.delete(a.uid),s})},[]),Ke=c(a=>{const i=a.target.value,r=$e.current;if(i==="remove"){if(Se(i),ce.current=i,r.size===0)je(!0);else if(e&&Ne.current){const s=e.items.filter(d=>r.has(d.uid));Ne.current(s)}}x==null||x(a)},[x,e]),Xe=c(()=>{je(!1),Se(""),ce.current=""},[]);q(()=>{const a=C.on("quote-management/negotiable-quote-closed",async i=>{ue(!1),V(""),O(o.closeSuccessMessage),S(r=>{var s;return r!=null&&r.uid&&((s=i.closedQuoteUids)!=null&&s.includes(r.uid))&&rt(r.uid).then(d=>{S(d)}).catch(d=>{console.warn("Failed to refresh quote data after closure:",d)}),r}),setTimeout(()=>{de(!1),O("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[o.closeSuccessMessage]),q(()=>{const a=C.on("quote-management/negotiable-quote-close-error",i=>{console.log("Close error event received:",i),ue(!1),O("");const r=i.error.message||o.errorFallback;V(r)},{eager:!0});return()=>a==null?void 0:a.off()},[o.errorFallback]),q(()=>{const a=C.on("quote-management/quote-renamed",i=>{const{quote:r}=i;S(r),G(""),B(""),ie(o.renameSuccessMessage),setTimeout(()=>{fe(!1),ne(""),oe(""),ie("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[o.renameSuccessMessage]),q(()=>{const a=C.on("quote-management/quote-duplicated",i=>{const{quote:r}=i;e&&L&&L({quoteData:e,newQuote:r}),H(!0),F(null),setTimeout(()=>{se(!1),H(!1),F(null)},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[e,L]);const Qe=c(async a=>{if(y&&b.length+a.length>y){le(o.maxFilesExceeded.replace("{maxFiles}",String(y)));return}for(const r of a){if(_&&!Aa(r.size,_)){le(o.maxFileSizeExceeded.replace("{maxSize}",et(_)));return}if(N&&!at(r.type,N)){le(o.invalidFileType);return}}le(void 0);const i=a.map(r=>({key:`temp-${Date.now()}-${Math.random()}-${r.name}`,name:r.name,size:r.size,status:"uploading"}));K(r=>[...r,...i]);for(let r=0;r<a.length;r++){const s=a[r],d=i[r].key;try{const v=await gt(s);K(w=>w.map(T=>T.key===d?{...T,key:v.key,status:"success"}:T))}catch(v){K(w=>w.map(T=>T.key===d?{...T,status:"error",error:v.message}:T))}}},[y,_,N,b,o]),ve=c(a=>{K(i=>i.filter(r=>r.key!==a))},[]),Je=c(()=>{ne((e==null?void 0:e.name)||""),oe(""),G(""),B(""),ie(""),fe(!0)},[e]),ga=c(()=>{fe(!1),ne(""),oe(""),G(""),B(""),ie("")},[]),fa=c(a=>{ne(a),a.trim()&&B("")},[]),Ye=c(()=>{se(!0),F(null),H(!1)},[]),pa=c(async()=>{if(!te.trim()){B(o.renameQuoteNameRequired);return}try{G(""),B(""),await lt({quoteUid:e.uid,quoteName:te,quoteComment:pe.trim()||void 0})}catch(a){G(a.message||o.renameErrorDefault)}},[e,te,pe,o.renameQuoteNameRequired,o.renameErrorDefault]),Ma=f(()=>{const a=e&&(e.lockedForEditing===!0||e.lockedForEditing===void 0&&(e.status==="SUBMITTED"||e.status==="PENDING"||e.status==="ORDERED"||e.status==="CLOSED"));return n(g,{name:"QuoteName",slot:t==null?void 0:t.QuoteName,context:{quoteName:e==null?void 0:e.name,quoteData:e},children:p("div",{className:"quote-management-manage-negotiable-quote__quote-name-wrapper",children:[n("h1",{"data-testid":"quote-name",className:"quote-management-manage-negotiable-quote__quote-name-title",children:e==null?void 0:e.name}),n("button",{onClick:Je,disabled:a,"data-testid":"rename-quote-button",className:"quote-management-manage-negotiable-quote__rename-button","aria-label":"Rename quote",children:n(Xa,{})})]})})},[t==null?void 0:t.QuoteName,e,Je]),ba=f(()=>n(g,{name:"QuoteStatus",slot:t==null?void 0:t.QuoteStatus,context:{quoteStatus:e==null?void 0:e.status,quoteData:e},children:n("div",{"data-testid":"quote-status",children:e==null?void 0:e.status})}),[t==null?void 0:t.QuoteStatus,e]),Ze=c(a=>{switch(a){case"SUBMITTED":return o.statusSubmitted;case"PENDING":return o.statusPending;case"EXPIRED":return o.statusExpired;default:return null}},[o])(e==null?void 0:e.status),Ae=Ze&&n(h,{type:"warning",variant:"secondary",icon:n(D,{}),heading:o.bannerTitle,description:Ze}),ea=Ae&&n(g,{name:"Banner","data-testid":"banner",slot:t==null?void 0:t.Banner,context:{quoteData:e},children:Ae}),ha=c(()=>{we(!1)},[]),aa=Ie&&n(g,{name:"DuplicateQuoteWarningBanner","data-testid":"duplicate-outOfStock-warning-banner",slot:t==null?void 0:t.DuplicateQuoteWarningBanner,context:{outOfStockWarning:Ie},children:n(h,{type:"warning",variant:"primary",icon:n(D,{}),heading:o.duplicateOutOfStockWarningHeading,description:o.duplicateOutOfStockWarningMessage,onDismiss:ha,"data-testid":"duplicate-outOfStock-warning-alert"})}),Na=f(()=>{if(!e)return;const a=e.expirationDate?ca(e.expirationDate,"short"):void 0;return p(g,{name:"Details",slot:t==null?void 0:t.Details,context:{quoteData:e},children:[p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"created-label",children:o.createdLabel}),p("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"created-value",children:[ca(e.createdAt,"short")," (",e.buyer.firstname," ",e.buyer.lastname,")"]})]}),p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"sales-rep-label",children:o.salesRepLabel}),n("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"sales-rep-value",children:e.salesRepName})]}),p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"expires-label",children:o.expiresLabel}),n("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"expires-value",children:a})]})]})},[t==null?void 0:t.Details,o,e]),ta=f(()=>[{label:o.close,value:"close",disabled:!(e!=null&&e.canClose)},{label:o.delete,value:"delete",disabled:!(e!=null&&e.canDelete)},{label:o.print,value:"print"},{label:o.createTemplate,value:"createTemplate",disabled:!!(e!=null&&e.templateName)},{label:o.createCopy,value:"createCopy",disabled:!!(e!=null&&e.templateName)}],[o,e==null?void 0:e.canDelete,e==null?void 0:e.canClose,e==null?void 0:e.templateName]),Sa=f(()=>{const a=i=>{switch(i){case"close":de(!0),V(""),O(""),m==null||m(i);break;case"delete":Z(!0),m==null||m(i);break;case"print":m==null||m(i);break;case"createTemplate":ge(!0),ae(""),j(""),m==null||m(i);break;case"createCopy":Ye(),m==null||m(i);break}};return n(g,{name:"ActionBar",slot:t==null?void 0:t.ActionBar,context:{quoteData:e,actionsBarDropdownValue:U},children:n(Ja,{dropdownPlaceholder:o.actionsLabel,dropdownOptions:[{label:o.remove,value:"remove"}],dropdownValue:U,handleDropdownChange:Ke,buttons:ta.map(i=>n(sa,{variant:"tertiary",onClick:()=>a(i.value),"data-testid":`actions-bar-${i.value}-button`,"data-action":i.value,disabled:i.disabled,children:i.label},i.value))})})},[ta,o,t==null?void 0:t.ActionBar,e,Ke,m,Ye,U]),Qa=f(()=>n(g,{name:"QuoteContent",slot:t==null?void 0:t.QuoteContent,context:{quoteData:e},children:n(Ya,{tabs:new Map([["items-quoted","Items Quoted"],["comments","Comments"],["history-log","History Log"]]),tabsContent:new Map([["items-quoted",n(g,{name:"ItemsQuotedTab",slot:t==null?void 0:t.ItemsQuotedTab,context:{quoteData:e},children:n(ft,{quoteData:e,onItemCheckboxChange:Ge,onRemoveItemsRef:a=>{Ne.current=a},onRemoveModalStateChange:a=>{!a&&ce.current==="remove"&&Se("")}})},"items-quoted")],["comments",n(g,{name:"CommentsTab",slot:t==null?void 0:t.CommentsTab,context:{quoteData:e},children:n(pt,{quoteData:e})},"comments")],["history-log",n(g,{name:"HistoryLogTab",slot:t==null?void 0:t.HistoryLogTab,context:{quoteData:e},children:n(it,{quoteData:e})},"history-log")]])})}),[t==null?void 0:t.QuoteContent,t==null?void 0:t.HistoryLogTab,t==null?void 0:t.CommentsTab,t==null?void 0:t.ItemsQuotedTab,e,Ge]),va=f(()=>n(g,{name:"ShippingInformationTitle",slot:t==null?void 0:t.ShippingInformationTitle,context:{quoteData:e},children:n("h2",{children:o.shippingInformationTitle})}),[t==null?void 0:t.ShippingInformationTitle,e,o]),qa=f(()=>{var a;return n(g,{name:"ShippingInformation",slot:t==null?void 0:t.ShippingInformation,context:{quoteData:e,loading:E,setLoading:k},children:n(ot,{shippingAddress:(a=e==null?void 0:e.shippingAddresses)==null?void 0:a[0],loading:E,"data-testid":"manage-quote-shipping-address"})})},[t==null?void 0:t.ShippingInformation,e,E,k]),Ta=f(()=>n(g,{name:"QuoteCommentsTitle",slot:t==null?void 0:t.QuoteCommentsTitle,context:{quoteData:e},children:n("h2",{children:o.quoteCommentsTitle})}),[t==null?void 0:t.QuoteCommentsTitle,o,e]),Ca=f(()=>n(g,{name:"QuoteComments",slot:t==null?void 0:t.QuoteComments,context:{quoteData:e},children:n(Ga,{name:"quoteComments",placeholder:o.quoteCommentsPlaceholder,rows:3,value:I,onInput:a=>{De(a.target.value)},disabled:!(e!=null&&e.canSendForReview)||Q})}),[t==null?void 0:t.QuoteComments,o,e,I,Q]),na=f(()=>!(e!=null&&e.canSendForReview),[e]),ya=f(()=>{const a=Q||na;return n(g,{name:"AttachFilesField",slot:t==null?void 0:t.AttachFilesField,context:{onFileChange:Qe,attachedFiles:b,fileUploadError:re,disabled:a},children:p("div",{className:"quote-management-manage-negotiable-quote__attach-files",...a?{"data-disabled":!0}:{},"aria-disabled":a,children:[n(Ka,{id:"manage-quote-attach-files",multiple:!0,onChange:i=>{const r=i.target,s=r==null?void 0:r.files,d=s?Array.from(s):[];d.length>0&&Qe(d)},icon:n(tt,{}),disabled:a,"data-testid":"manage-quote-attach-files",accept:N==null?void 0:N.join(","),children:o.attachFiles}),re&&n("div",{className:"quote-management-manage-negotiable-quote__file-error","data-testid":"file-upload-error",children:re})]})})},[t==null?void 0:t.AttachFilesField,Qe,Q,na,N,re,o,b]),_a=f(()=>{if(b.length)return n(g,{name:"AttachedFilesList",slot:t==null?void 0:t.AttachedFilesList,context:{files:b,onRemove:ve,disabled:Q},children:n(nt,{files:b,onRemove:ve,disabled:Q})})},[b,ve,Q,t==null?void 0:t.AttachedFilesList]),Ea=c(async()=>{if(e!=null&&e.uid){ue(!0),V(""),O("");try{await ct({quoteUids:[e.uid]})}catch(a){console.error("Failed to close quote:",a)}}},[e]),Fa=c(()=>{de(!1),V(""),O("")},[]),Ia=c(async()=>{if(e!=null&&e.uid){Be(!0),ae(""),j("");try{await st(e.uid),j(o.createTemplateSuccessMessage),setTimeout(()=>{ge(!1),j("")},2e3)}catch(a){console.error("Failed to create quote template:",a);const i=a instanceof Error?a.message:o.createTemplateErrorFallback;ae(i)}finally{Be(!1)}}},[e,o.createTemplateSuccessMessage,o.createTemplateErrorFallback]),wa=c(()=>{ge(!1),ae(""),j("")},[]),qe=c(async()=>{const a=b.filter(i=>i.status==="success");if(R){R({quoteData:e,comment:I.trim()||void 0,attachments:a.length?a:void 0});return}me(!0);try{await mt({quoteUid:e.uid,comment:I.trim()||void 0,attachments:a.length?a.map(i=>({key:i.key})):void 0})}catch(i){console.error("Failed to send quote for review:",i),me(!1)}},[e,R,I,b]),Da=f(()=>n(g,{name:"Footer",slot:t==null?void 0:t.Footer,context:{quoteData:e,comment:I,isSubmitting:Q,attachments:b,handleSendForReview:qe},children:n(sa,{variant:"primary",onClick:qe,"data-testid":"send-for-review-button",disabled:!(e!=null&&e.canSendForReview)||Q,children:o.sendForReview})}),[t==null?void 0:t.Footer,o,e,I,Q,b,qe]),xa=f(()=>Me?n(h,{type:"error",variant:"primary",icon:n(D,{color:"var(--color-error)"}),heading:o.renameErrorHeading,description:Me}):void 0,[Me,o.renameErrorHeading]),Ra=f(()=>be?n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.renameSuccessHeading,description:be}):void 0,[be,o.renameSuccessHeading]),Te=c(a=>a.errors&&Array.isArray(a.errors)&&a.errors.length>0?a.errors[0].message||o.confirmationModalDeleteErrorFallback:(a==null?void 0:a.message)||o.confirmationModalDeleteErrorFallback,[o.confirmationModalDeleteErrorFallback]),La=c(()=>{Z(!1),$(null),ee(!1)},[]),ka=c(async()=>{if(e!=null&&e.uid){$(null),ee(!1);try{const{operationResults:a}=await dt(e.uid),i=a.find(r=>r.__typename==="DeleteNegotiableQuoteOperationFailure");if(i){const r=Te(i);$(r);return}ee(!0)}catch(a){const i=Te(a);$(i)}}},[e,Te]),Ha=c(()=>{$(null)},[]),Oa=c(()=>{ee(!1)},[]),oa=c(a=>(a==null?void 0:a.message)||o.confirmationModalDuplicateErrorFallback,[o.confirmationModalDuplicateErrorFallback]),Ba=c(()=>{se(!1),F(null),H(!1)},[]),Ua=c(async()=>{var a;if(e!=null&&e.uid){F(null),H(!1);try{const i=((a=e.items)==null?void 0:a.filter(v=>v.outOfStock))||[],s=(v=>{const w=v.slice(0,-8),T=crypto.randomUUID().slice(0,8);return w+T})(e.uid),d=i.length>0;d&&sessionStorage.setItem(`duplicate-outOfStock-warning-${s}`,"true"),await ut({quoteUid:e.uid,duplicatedQuoteUid:s,hasOutOfStockItems:d})}catch(i){const r=oa(i);F(r)}}},[e,oa]),Wa=c(()=>{F(null)},[]),za=c(()=>{H(!1)},[]),Pa=A?n(h,{type:"error",variant:"primary",icon:n(D,{}),heading:o.confirmationModalDeleteErrorHeading,description:A,onDismiss:Ha,"data-testid":"confirmation-modal-error-banner"}):null,ia=(ma?n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.confirmationModalDeleteSuccessHeading,description:o.confirmationModalDeleteSuccessDescription,onDismiss:Oa,"data-testid":"confirmation-modal-success-banner"}):null)||Pa,$a=Fe?n(h,{type:"error",variant:"primary",icon:n(D,{}),heading:o.confirmationModalDuplicateErrorHeading,description:Fe,onDismiss:Wa,"data-testid":"confirmation-modal-duplicate-error-banner"}):null,ra=(da?n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.confirmationModalDuplicateSuccessHeading,description:o.confirmationModalDuplicateSuccessDescription,onDismiss:za,"data-testid":"confirmation-modal-duplicate-success-banner"}):null)||$a,Va={...Y,loading:E,quoteName:Ma,quoteStatus:ba,banner:aa||ea?p(la,{children:[aa,ea]}):void 0,details:Na,actionBar:Sa,quoteContent:Qa,shippingInformationTitle:va,shippingInformation:qa,quoteCommentsTitle:Ta,quoteComments:Ca,attachFilesField:ya,attachedFilesList:_a,footer:Da};let Ce=null;Le?Ce=n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.closeModalSuccessHeading,description:Le,"data-testid":"close-quote-success-banner"}):ke&&(Ce=n(h,{type:"error",variant:"primary",icon:n(D,{}),heading:o.confirmationModalDeleteErrorHeading,description:ke,"data-testid":"close-quote-error-banner"}));let ye=null;return Ue?ye=n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.createTemplateModalSuccessHeading,description:Ue,"data-testid":"create-template-success-banner"}):We&&(ye=n(h,{type:"error",variant:"primary",icon:n(D,{}),heading:o.createTemplateModalErrorHeading,description:We,"data-testid":"create-template-error-banner"})),p(la,{children:[n(bt,{...Va}),ze&&W(n(Za,{open:ze,quoteName:te,renameReason:pe,quoteNameError:ua,errorBanner:xa,successBanner:Ra,onQuoteNameChange:fa,onRenameReasonChange:oe,onSave:pa,onClose:ga}),document.body),P&&W(n(X,{open:P,title:o.confirmationModalDeleteTitle,message:o.confirmationModalDeleteMessage,cancelLabel:o.confirmationModalCancel,confirmLabel:o.confirmationModalDeleteConfirm,onCancel:La,onConfirm:ka,showCloseButton:!ia,confirmationBanner:ia}),document.body),Ee&&W(n(X,{open:Ee,title:o.confirmationModalDuplicateTitle,message:o.confirmationModalDuplicateMessage,cancelLabel:o.confirmationModalCancel,confirmLabel:o.confirmationModalDuplicateConfirm,onCancel:Ba,onConfirm:Ua,showCloseButton:!ra,confirmationBanner:ra}),document.body),xe&&W(n(X,{open:xe,title:o.closeModalTitle,message:o.closeModalMessage,cancelLabel:o.closeModalCancel,confirmLabel:Re?o.closeModalConfirmLoading:o.closeModalConfirm,onCancel:Fa,onConfirm:Re?void 0:Ea,showCloseButton:!0,confirmationBanner:Ce,"data-testid":"close-quote-confirmation-modal"}),document.body),He&&W(n(X,{open:He,title:o.createTemplateModalTitle,message:o.createTemplateModalMessage,cancelLabel:o.createTemplateModalCancel,confirmLabel:Oe?o.createTemplateModalConfirmLoading:o.createTemplateModalConfirm,onCancel:wa,onConfirm:Oe?void 0:Ia,showCloseButton:!0,confirmationBanner:ye,"data-testid":"create-template-confirmation-modal"}),document.body),Ve&&W(n(X,{open:Ve,title:o.noItemsSelectedModalTitle,message:o.noItemsSelectedModalMessage,confirmLabel:o.noItemsSelectedModalConfirm,onConfirm:Xe,onClose:Xe,showCloseButton:!0,"data-testid":"no-items-selected-modal"}),document.body)]})};export{tn as ManageNegotiableQuote,tn as default};
3
+ import{jsx as o,jsxs as N,Fragment as na}from"@dropins/tools/preact-jsx-runtime.js";import{useState as c,useRef as Ne,useEffect as h,useCallback as l,useMemo as g,createPortal as x}from"@dropins/tools/preact-compat.js";import{Slot as m}from"@dropins/tools/lib.js";import{v as za,f as $a,a as Va,k as ja,c as F,d as oa,l as Ga,T as Ka,S as Xa,A as Ja,b as _,M as Ya,m as Za,C as B}from"../chunks/components.js";import{events as Q}from"@dropins/tools/event-bus.js";import{InLineAlert as p,Button as ia,TextArea as Aa,InputFile as et}from"@dropins/tools/components.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{S as at}from"../chunks/ShippingAddressDisplay.js";import{Q as tt}from"../chunks/QuoteHistoryLog.js";import{getQuoteData as nt,uploadFile as ot,renameNegotiableQuote as it,closeNegotiableQuote as rt,createQuoteTemplate as ct,sendForReview as lt,deleteQuote as st,duplicateQuote as dt}from"../api.js";import{I as mt}from"../chunks/ItemsQuoted.js";import{Q as ut}from"../chunks/QuoteCommentsList.js";import{useText as gt}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const xt=({onActionsDropdownChange:U,slots:t,onActionsButtonClick:u,onSendForReview:A,maxFiles:W,maxFileSize:P,acceptedFileTypes:T,onDuplicateQuote:ee,...ra})=>{const[e,C]=c(void 0),[z,ae]=c(!0),[Qe,Te]=c(!1),[Ce,L]=c(null),[ca,$]=c(!1),[ve,te]=c(!1),[ye,v]=c(null),[la,I]=c(!1),[Ee,Fe]=c(!1),[y,Ie]=c(""),[M,ne]=c(!1),[De,oe]=c(!1),[qe,ie]=c(!1),[we,D]=c(""),[xe,R]=c(""),[Le,re]=c(!1),[Re,He]=c(!1),[Oe,H]=c(""),[ke,V]=c(""),[_e,ce]=c(!1),[j,G]=c(""),[le,K]=c(""),[se,O]=c(""),[sa,q]=c(""),[de,X]=c(""),[f,k]=c([]),[J,Y]=c(void 0),[me,Be]=c(new Set),Ue=Ne(me),ue=Ne(null),[w,ge]=c(""),Z=Ne(w),[We,Pe]=c(!1);h(()=>{Ue.current=me},[me]),h(()=>{Z.current=w},[w]);const n=gt({createdLabel:"NegotiableQuote.Manage.createdLabel",salesRepLabel:"NegotiableQuote.Manage.salesRepLabel",expiresLabel:"NegotiableQuote.Manage.expiresLabel",actionsLabel:"NegotiableQuote.Manage.actionsLabel",remove:"NegotiableQuote.Manage.actions.remove",close:"NegotiableQuote.Manage.actionButtons.close",delete:"NegotiableQuote.Manage.actionButtons.delete",print:"NegotiableQuote.Manage.actionButtons.print",createTemplate:"NegotiableQuote.Manage.actionButtons.createTemplate",createCopy:"NegotiableQuote.Manage.actionButtons.createCopy",shippingInformationTitle:"NegotiableQuote.Manage.shippingInformation.title",quoteCommentsTitle:"NegotiableQuote.Manage.quoteComments.title",quoteCommentsPlaceholder:"NegotiableQuote.Manage.quoteComments.placeholder",sendForReview:"NegotiableQuote.Manage.actionButtons.sendForReview",bannerTitle:"NegotiableQuote.Manage.bannerTitle",statusSubmitted:"NegotiableQuote.Manage.bannerStatusMessages.submitted",statusPending:"NegotiableQuote.Manage.bannerStatusMessages.pending",statusExpired:"NegotiableQuote.Manage.bannerStatusMessages.expired",errorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",closeSuccessMessage:"NegotiableQuote.Manage.confirmationModal.close.successDescription",closeModalTitle:"NegotiableQuote.Manage.actionButtons.close",closeModalMessage:"NegotiableQuote.Manage.confirmationModal.close.message",closeModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",closeModalConfirm:"NegotiableQuote.Manage.confirmationModal.close.confirm",closeModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.close.confirmLoading",closeModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.close.successHeading",createTemplateModalTitle:"NegotiableQuote.Manage.actionButtons.createTemplate",createTemplateModalMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.message",createTemplateModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",createTemplateModalConfirm:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirm",createTemplateModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirmLoading",createTemplateModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.successHeading",createTemplateSuccessMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.successDescription",createTemplateModalErrorHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorHeading",createTemplateErrorFallback:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorFallback",renameErrorHeading:"NegotiableQuote.Manage.rename.errorHeading",renameQuoteNameRequired:"NegotiableQuote.Manage.rename.quoteNameRequired",renameErrorDefault:"NegotiableQuote.Manage.rename.errorDefault",renameSuccessHeading:"NegotiableQuote.Manage.rename.successHeading",renameSuccessMessage:"NegotiableQuote.Manage.rename.successMessage",confirmationModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",confirmationModalDeleteTitle:"NegotiableQuote.Manage.confirmationModal.delete.title",confirmationModalDeleteMessage:"NegotiableQuote.Manage.confirmationModal.delete.message",confirmationModalDeleteConfirm:"NegotiableQuote.Manage.confirmationModal.delete.confirm",confirmationModalDeleteErrorHeading:"NegotiableQuote.Manage.confirmationModal.delete.errorHeading",confirmationModalDeleteErrorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",confirmationModalDeleteSuccessHeading:"NegotiableQuote.Manage.confirmationModal.delete.successHeading",confirmationModalDeleteSuccessDescription:"NegotiableQuote.Manage.confirmationModal.delete.successDescription",confirmationModalDuplicateTitle:"NegotiableQuote.Manage.confirmationModal.duplicate.title",confirmationModalDuplicateMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.message",confirmationModalDuplicateConfirm:"NegotiableQuote.Manage.confirmationModal.duplicate.confirm",confirmationModalDuplicateErrorHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.errorHeading",confirmationModalDuplicateErrorFallback:"NegotiableQuote.Manage.confirmationModal.duplicate.errorFallback",confirmationModalDuplicateSuccessHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.successHeading",confirmationModalDuplicateSuccessDescription:"NegotiableQuote.Manage.confirmationModal.duplicate.successDescription",duplicateOutOfStockWarningHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningHeading",duplicateOutOfStockWarningMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningMessage",noItemsSelectedModalTitle:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.title",noItemsSelectedModalMessage:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.message",noItemsSelectedModalConfirm:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.confirm",attachFiles:"NegotiableQuote.Manage.attachFiles",fileUploadError:"NegotiableQuote.Manage.fileUploadError",maxFilesExceeded:"NegotiableQuote.Manage.maxFilesExceeded",maxFileSizeExceeded:"NegotiableQuote.Manage.maxFileSizeExceeded",invalidFileType:"NegotiableQuote.Manage.invalidFileType"});h(()=>{const a=Q.on("quote-management/quote-data",i=>{const{quote:r}=i;if(r){C(r),ae(!1);const s=`duplicate-outOfStock-warning-${r.uid}`;sessionStorage.getItem(s)==="true"&&(Fe(!0),sessionStorage.removeItem(s))}},{eager:!0});return()=>a==null?void 0:a.off()},[]),h(()=>{const a=Q.on("quote-management/shipping-address-set",i=>{const{quote:r}=i;r&&C(r)},{eager:!0});return()=>a==null?void 0:a.off()},[]),h(()=>{const a=Q.on("quote-management/quote-sent-for-review",i=>{const{quote:r}=i;C(r),Ie(""),k([]),ne(!1)},{eager:!0});return()=>a==null?void 0:a.off()},[]),h(()=>{const a=Q.on("quote-management/quote-items-removed",i=>{const{quote:r,removedItemUids:s}=i;r&&C(r),s&&Be(d=>{const b=new Set(d);return s.forEach(E=>b.delete(E)),b})},{eager:!0});return()=>a==null?void 0:a.off()},[]);const ze=l((a,i)=>{Be(r=>{const s=new Set(r);return i?s.add(a.uid):s.delete(a.uid),s})},[]),$e=l(a=>{const i=a.target.value,r=Ue.current;if(i==="remove"){if(ge(i),Z.current=i,r.size===0)Pe(!0);else if(e&&ue.current){const s=e.items.filter(d=>r.has(d.uid));ue.current(s)}}U==null||U(a)},[U,e]),Ve=l(()=>{Pe(!1),ge(""),Z.current=""},[]);h(()=>{const a=Q.on("quote-management/negotiable-quote-closed",async i=>{ie(!1),R(""),D(n.closeSuccessMessage),C(r=>{var s;return r!=null&&r.uid&&((s=i.closedQuoteUids)!=null&&s.includes(r.uid))&&nt(r.uid).then(d=>{C(d)}).catch(d=>{console.warn("Failed to refresh quote data after closure:",d)}),r}),setTimeout(()=>{oe(!1),D("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[n.closeSuccessMessage]),h(()=>{const a=Q.on("quote-management/negotiable-quote-close-error",i=>{console.log("Close error event received:",i),ie(!1),D("");const r=i.error.message||n.errorFallback;R(r)},{eager:!0});return()=>a==null?void 0:a.off()},[n.errorFallback]),h(()=>{const a=Q.on("quote-management/quote-renamed",i=>{const{quote:r}=i;C(r),O(""),q(""),X(n.renameSuccessMessage),setTimeout(()=>{ce(!1),G(""),K(""),X("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[n.renameSuccessMessage]),h(()=>{const a=Q.on("quote-management/quote-duplicated",i=>{const{quote:r}=i;e&&ee&&ee({quoteData:e,newQuote:r}),I(!0),v(null),setTimeout(()=>{te(!1),I(!1),v(null)},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[e,ee]);const fe=l(async a=>{if(W&&f.length+a.length>W){Y(n.maxFilesExceeded.replace("{maxFiles}",String(W)));return}for(const r of a){if(P&&!za(r.size,P)){Y(n.maxFileSizeExceeded.replace("{maxSize}",$a(P)));return}if(T&&!Va(r.type,T)){Y(n.invalidFileType);return}}Y(void 0);const i=a.map(r=>({key:`temp-${Date.now()}-${Math.random()}-${r.name}`,name:r.name,size:r.size,status:"uploading"}));k(r=>[...r,...i]);for(let r=0;r<a.length;r++){const s=a[r],d=i[r].key;try{const b=await ot(s);k(E=>E.map(S=>S.key===d?{...S,key:b.key,status:"success"}:S))}catch(b){k(E=>E.map(S=>S.key===d?{...S,status:"error",error:b.message}:S))}}},[W,P,T,f,n]),pe=l(a=>{k(i=>i.filter(r=>r.key!==a))},[]),je=l(()=>{G((e==null?void 0:e.name)||""),K(""),O(""),q(""),X(""),ce(!0)},[e]),da=l(()=>{ce(!1),G(""),K(""),O(""),q(""),X("")},[]),ma=l(a=>{G(a),a.trim()&&q("")},[]),Ge=l(()=>{te(!0),v(null),I(!1)},[]),ua=l(async()=>{if(!j.trim()){q(n.renameQuoteNameRequired);return}try{O(""),q(""),await it({quoteUid:e.uid,quoteName:j,quoteComment:le.trim()||void 0})}catch(a){O(a.message||n.renameErrorDefault)}},[e,j,le,n.renameQuoteNameRequired,n.renameErrorDefault]),ga=g(()=>{const a=e&&(e.lockedForEditing===!0||e.lockedForEditing===void 0&&(e.status==="SUBMITTED"||e.status==="PENDING"||e.status==="ORDERED"||e.status==="CLOSED"));return o(m,{name:"QuoteName",slot:t==null?void 0:t.QuoteName,context:{quoteName:e==null?void 0:e.name,quoteData:e},children:N("div",{className:"quote-management-manage-negotiable-quote__quote-name-wrapper",children:[o("h1",{"data-testid":"quote-name",className:"quote-management-manage-negotiable-quote__quote-name-title",children:e==null?void 0:e.name}),o("button",{onClick:je,disabled:a,"data-testid":"rename-quote-button",className:"quote-management-manage-negotiable-quote__rename-button","aria-label":"Rename quote",children:o(ja,{})})]})})},[t==null?void 0:t.QuoteName,e,je]),fa=g(()=>o(m,{name:"QuoteStatus",slot:t==null?void 0:t.QuoteStatus,context:{quoteStatus:e==null?void 0:e.status,quoteData:e},children:o("div",{"data-testid":"quote-status",children:e==null?void 0:e.status})}),[t==null?void 0:t.QuoteStatus,e]),Ke=l(a=>{switch(a){case"SUBMITTED":return n.statusSubmitted;case"PENDING":return n.statusPending;case"EXPIRED":return n.statusExpired;default:return null}},[n])(e==null?void 0:e.status),Xe=Ke&&o(p,{type:"warning",variant:"secondary",icon:o(F,{}),heading:n.bannerTitle,description:Ke}),Je=Xe&&o(m,{name:"Banner","data-testid":"banner",slot:t==null?void 0:t.Banner,context:{quoteData:e},children:Xe}),pa=l(()=>{Fe(!1)},[]),Ye=Ee&&o(m,{name:"DuplicateQuoteWarningBanner","data-testid":"duplicate-outOfStock-warning-banner",slot:t==null?void 0:t.DuplicateQuoteWarningBanner,context:{outOfStockWarning:Ee},children:o(p,{type:"warning",variant:"primary",icon:o(F,{}),heading:n.duplicateOutOfStockWarningHeading,description:n.duplicateOutOfStockWarningMessage,onDismiss:pa,"data-testid":"duplicate-outOfStock-warning-alert"})}),Ma=g(()=>{if(!e)return;const a=e.expirationDate?oa(e.expirationDate,"short"):void 0;return N(m,{name:"Details",slot:t==null?void 0:t.Details,context:{quoteData:e},children:[N("div",{className:"quote-management-manage-negotiable-quote__detail",children:[o("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"created-label",children:n.createdLabel}),N("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"created-value",children:[oa(e.createdAt,"short")," (",e.buyer.firstname," ",e.buyer.lastname,")"]})]}),N("div",{className:"quote-management-manage-negotiable-quote__detail",children:[o("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"sales-rep-label",children:n.salesRepLabel}),o("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"sales-rep-value",children:e.salesRepName})]}),N("div",{className:"quote-management-manage-negotiable-quote__detail",children:[o("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"expires-label",children:n.expiresLabel}),o("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"expires-value",children:a})]})]})},[t==null?void 0:t.Details,n,e]),Ze=g(()=>[{label:n.close,value:"close",disabled:!(e!=null&&e.canClose)},{label:n.delete,value:"delete",disabled:!(e!=null&&e.canDelete)},{label:n.print,value:"print"},{label:n.createTemplate,value:"createTemplate",disabled:!!(e!=null&&e.templateName)},{label:n.createCopy,value:"createCopy",disabled:!!(e!=null&&e.templateName)}],[n,e==null?void 0:e.canDelete,e==null?void 0:e.canClose,e==null?void 0:e.templateName]),ba=g(()=>{const a=i=>{switch(i){case"close":oe(!0),R(""),D(""),u==null||u(i);break;case"delete":Te(!0),u==null||u(i);break;case"print":u==null||u(i);break;case"createTemplate":re(!0),V(""),H(""),u==null||u(i);break;case"createCopy":Ge(),u==null||u(i);break}};return o(m,{name:"ActionBar",slot:t==null?void 0:t.ActionBar,context:{quoteData:e,actionsBarDropdownValue:w},children:o(Ga,{dropdownPlaceholder:n.actionsLabel,dropdownOptions:[{label:n.remove,value:"remove"}],dropdownValue:w,handleDropdownChange:$e,buttons:Ze.map(i=>o(ia,{variant:"tertiary",onClick:()=>a(i.value),"data-testid":`actions-bar-${i.value}-button`,"data-action":i.value,disabled:i.disabled,children:i.label},i.value))})})},[Ze,n,t==null?void 0:t.ActionBar,e,$e,u,Ge,w]),ha=g(()=>o(m,{name:"QuoteContent",slot:t==null?void 0:t.QuoteContent,context:{quoteData:e},children:o(Ka,{tabs:new Map([["items-quoted","Items Quoted"],["comments","Comments"],["history-log","History Log"]]),tabsContent:new Map([["items-quoted",o(m,{name:"ItemsQuotedTab",slot:t==null?void 0:t.ItemsQuotedTab,context:{quoteData:e},children:o(mt,{quoteData:e,onItemCheckboxChange:ze,onRemoveItemsRef:a=>{ue.current=a},onRemoveModalStateChange:a=>{!a&&Z.current==="remove"&&ge("")}})},"items-quoted")],["comments",o(m,{name:"CommentsTab",slot:t==null?void 0:t.CommentsTab,context:{quoteData:e},children:o(ut,{quoteData:e})},"comments")],["history-log",o(m,{name:"HistoryLogTab",slot:t==null?void 0:t.HistoryLogTab,context:{quoteData:e},children:o(tt,{quoteData:e})},"history-log")]])})}),[t==null?void 0:t.QuoteContent,t==null?void 0:t.HistoryLogTab,t==null?void 0:t.CommentsTab,t==null?void 0:t.ItemsQuotedTab,e,ze]),Sa=g(()=>o(m,{name:"ShippingInformationTitle",slot:t==null?void 0:t.ShippingInformationTitle,context:{quoteData:e},children:o("h2",{children:n.shippingInformationTitle})}),[t==null?void 0:t.ShippingInformationTitle,e,n]),Na=g(()=>{var a;return o(m,{name:"ShippingInformation",slot:t==null?void 0:t.ShippingInformation,context:{quoteData:e,loading:z,setLoading:ae},children:o(at,{shippingAddress:(a=e==null?void 0:e.shippingAddresses)==null?void 0:a[0],loading:z,"data-testid":"manage-quote-shipping-address"})})},[t==null?void 0:t.ShippingInformation,e,z,ae]),Qa=g(()=>o(m,{name:"QuoteCommentsTitle",slot:t==null?void 0:t.QuoteCommentsTitle,context:{quoteData:e},children:o("h2",{children:n.quoteCommentsTitle})}),[t==null?void 0:t.QuoteCommentsTitle,n,e]),Ta=g(()=>o(m,{name:"QuoteComments",slot:t==null?void 0:t.QuoteComments,context:{quoteData:e},children:o(Aa,{name:"quoteComments",placeholder:n.quoteCommentsPlaceholder,rows:3,value:y,onInput:a=>{Ie(a.target.value)},disabled:!(e!=null&&e.canSendForReview)||M})}),[t==null?void 0:t.QuoteComments,n,e,y,M]),Ae=g(()=>!(e!=null&&e.canSendForReview),[e]),Ca=g(()=>{const a=M||Ae;return o(m,{name:"AttachFilesField",slot:t==null?void 0:t.AttachFilesField,context:{onFileChange:fe,attachedFiles:f,fileUploadError:J,disabled:a},children:N("div",{className:"quote-management-manage-negotiable-quote__attach-files",...a?{"data-disabled":!0}:{},"aria-disabled":a,children:[o(et,{id:"manage-quote-attach-files",multiple:!0,onChange:i=>{const r=i.target,s=r==null?void 0:r.files,d=s?Array.from(s):[];d.length>0&&fe(d)},icon:o(Xa,{}),disabled:a,"data-testid":"manage-quote-attach-files",accept:T==null?void 0:T.join(","),children:n.attachFiles}),J&&o("div",{className:"quote-management-manage-negotiable-quote__file-error","data-testid":"file-upload-error",children:J})]})})},[t==null?void 0:t.AttachFilesField,fe,M,Ae,T,J,n,f]),va=g(()=>{if(f.length)return o(m,{name:"AttachedFilesList",slot:t==null?void 0:t.AttachedFilesList,context:{files:f,onRemove:pe,disabled:M},children:o(Ja,{files:f,onRemove:pe,disabled:M})})},[f,pe,M,t==null?void 0:t.AttachedFilesList]),ya=l(async()=>{if(e!=null&&e.uid){ie(!0),R(""),D("");try{await rt({quoteUids:[e.uid]})}catch(a){console.error("Failed to close quote:",a)}}},[e]),Ea=l(()=>{oe(!1),R(""),D("")},[]),Fa=l(async()=>{if(e!=null&&e.uid){He(!0),V(""),H("");try{await ct(e.uid),H(n.createTemplateSuccessMessage),setTimeout(()=>{re(!1),H("")},2e3)}catch(a){console.error("Failed to create quote template:",a);const i=a instanceof Error?a.message:n.createTemplateErrorFallback;V(i)}finally{He(!1)}}},[e,n.createTemplateSuccessMessage,n.createTemplateErrorFallback]),Ia=l(()=>{re(!1),V(""),H("")},[]),Me=l(async()=>{const a=f.filter(i=>i.status==="success");if(A){A({quoteData:e,comment:y.trim()||void 0,attachments:a.length?a:void 0});return}ne(!0);try{await lt({quoteUid:e.uid,comment:y.trim()||void 0,attachments:a.length?a.map(i=>({key:i.key})):void 0})}catch(i){console.error("Failed to send quote for review:",i),ne(!1)}},[e,A,y,f]),Da=g(()=>o(m,{name:"Footer",slot:t==null?void 0:t.Footer,context:{quoteData:e,comment:y,isSubmitting:M,attachments:f,handleSendForReview:Me},children:o(ia,{variant:"primary",onClick:Me,"data-testid":"send-for-review-button",disabled:!(e!=null&&e.canSendForReview)||M,children:n.sendForReview})}),[t==null?void 0:t.Footer,n,e,y,M,f,Me]),qa=g(()=>se?o(p,{type:"error",variant:"primary",icon:o(F,{color:"var(--color-error)"}),heading:n.renameErrorHeading,description:se}):void 0,[se,n.renameErrorHeading]),wa=g(()=>de?o(p,{type:"success",variant:"primary",icon:o(_,{}),heading:n.renameSuccessHeading,description:de}):void 0,[de,n.renameSuccessHeading]),be=l(a=>a.errors&&Array.isArray(a.errors)&&a.errors.length>0?a.errors[0].message||n.confirmationModalDeleteErrorFallback:(a==null?void 0:a.message)||n.confirmationModalDeleteErrorFallback,[n.confirmationModalDeleteErrorFallback]),xa=l(()=>{Te(!1),L(null),$(!1)},[]),La=l(async()=>{if(e!=null&&e.uid){L(null),$(!1);try{const{operationResults:a}=await st(e.uid),i=a.find(r=>r.__typename==="DeleteNegotiableQuoteOperationFailure");if(i){const r=be(i);L(r);return}$(!0)}catch(a){const i=be(a);L(i)}}},[e,be]),Ra=l(()=>{L(null)},[]),Ha=l(()=>{$(!1)},[]),ea=l(a=>(a==null?void 0:a.message)||n.confirmationModalDuplicateErrorFallback,[n.confirmationModalDuplicateErrorFallback]),Oa=l(()=>{te(!1),v(null),I(!1)},[]),ka=l(async()=>{var a;if(e!=null&&e.uid){v(null),I(!1);try{const i=((a=e.items)==null?void 0:a.filter(b=>b.outOfStock))||[],s=(b=>{const E=b.slice(0,-8),S=crypto.randomUUID().slice(0,8);return E+S})(e.uid),d=i.length>0;d&&sessionStorage.setItem(`duplicate-outOfStock-warning-${s}`,"true"),await dt({quoteUid:e.uid,duplicatedQuoteUid:s,hasOutOfStockItems:d})}catch(i){const r=ea(i);v(r)}}},[e,ea]),_a=l(()=>{v(null)},[]),Ba=l(()=>{I(!1)},[]),Ua=Ce?o(p,{type:"error",variant:"primary",icon:o(F,{}),heading:n.confirmationModalDeleteErrorHeading,description:Ce,onDismiss:Ra,"data-testid":"confirmation-modal-error-banner"}):null,aa=(ca?o(p,{type:"success",variant:"primary",icon:o(_,{}),heading:n.confirmationModalDeleteSuccessHeading,description:n.confirmationModalDeleteSuccessDescription,onDismiss:Ha,"data-testid":"confirmation-modal-success-banner"}):null)||Ua,Wa=ye?o(p,{type:"error",variant:"primary",icon:o(F,{}),heading:n.confirmationModalDuplicateErrorHeading,description:ye,onDismiss:_a,"data-testid":"confirmation-modal-duplicate-error-banner"}):null,ta=(la?o(p,{type:"success",variant:"primary",icon:o(_,{}),heading:n.confirmationModalDuplicateSuccessHeading,description:n.confirmationModalDuplicateSuccessDescription,onDismiss:Ba,"data-testid":"confirmation-modal-duplicate-success-banner"}):null)||Wa,Pa={...ra,loading:z,quoteName:ga,quoteStatus:fa,banner:Ye||Je?N(na,{children:[Ye,Je]}):void 0,details:Ma,actionBar:ba,quoteContent:ha,shippingInformationTitle:Sa,shippingInformation:Na,quoteCommentsTitle:Qa,quoteComments:Ta,attachFilesField:Ca,attachedFilesList:va,footer:Da};let he=null;we?he=o(p,{type:"success",variant:"primary",icon:o(_,{}),heading:n.closeModalSuccessHeading,description:we,"data-testid":"close-quote-success-banner"}):xe&&(he=o(p,{type:"error",variant:"primary",icon:o(F,{}),heading:n.confirmationModalDeleteErrorHeading,description:xe,"data-testid":"close-quote-error-banner"}));let Se=null;return Oe?Se=o(p,{type:"success",variant:"primary",icon:o(_,{}),heading:n.createTemplateModalSuccessHeading,description:Oe,"data-testid":"create-template-success-banner"}):ke&&(Se=o(p,{type:"error",variant:"primary",icon:o(F,{}),heading:n.createTemplateModalErrorHeading,description:ke,"data-testid":"create-template-error-banner"})),N(na,{children:[o(Ya,{...Pa}),_e&&x(o(Za,{open:_e,quoteName:j,renameReason:le,quoteNameError:sa,errorBanner:qa,successBanner:wa,onQuoteNameChange:ma,onRenameReasonChange:K,onSave:ua,onClose:da}),document.body),Qe&&x(o(B,{open:Qe,title:n.confirmationModalDeleteTitle,message:n.confirmationModalDeleteMessage,cancelLabel:n.confirmationModalCancel,confirmLabel:n.confirmationModalDeleteConfirm,onCancel:xa,onConfirm:La,showCloseButton:!aa,confirmationBanner:aa}),document.body),ve&&x(o(B,{open:ve,title:n.confirmationModalDuplicateTitle,message:n.confirmationModalDuplicateMessage,cancelLabel:n.confirmationModalCancel,confirmLabel:n.confirmationModalDuplicateConfirm,onCancel:Oa,onConfirm:ka,showCloseButton:!ta,confirmationBanner:ta}),document.body),De&&x(o(B,{open:De,title:n.closeModalTitle,message:n.closeModalMessage,cancelLabel:n.closeModalCancel,confirmLabel:qe?n.closeModalConfirmLoading:n.closeModalConfirm,onCancel:Ea,onConfirm:qe?void 0:ya,showCloseButton:!0,confirmationBanner:he,"data-testid":"close-quote-confirmation-modal"}),document.body),Le&&x(o(B,{open:Le,title:n.createTemplateModalTitle,message:n.createTemplateModalMessage,cancelLabel:n.createTemplateModalCancel,confirmLabel:Re?n.createTemplateModalConfirmLoading:n.createTemplateModalConfirm,onCancel:Ia,onConfirm:Re?void 0:Fa,showCloseButton:!0,confirmationBanner:Se,"data-testid":"create-template-confirmation-modal"}),document.body),We&&x(o(B,{open:We,title:n.noItemsSelectedModalTitle,message:n.noItemsSelectedModalMessage,confirmLabel:n.noItemsSelectedModalConfirm,onConfirm:Ve,onClose:Ve,showCloseButton:!0,"data-testid":"no-items-selected-modal"}),document.body)]})};export{xt as ManageNegotiableQuote,xt as default};
4
4
  //# sourceMappingURL=ManageNegotiableQuote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ManageNegotiableQuote.js","sources":["/@dropins/storefront-quote-management/src/components/ManageNegotiableQuote/ManageNegotiableQuote.tsx","/@dropins/storefront-quote-management/src/containers/ManageNegotiableQuote/ManageNegotiableQuote.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, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/quote-management/components/ManageNegotiableQuote/ManageNegotiableQuote.css';\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\n\nexport interface ManageNegotiableQuoteProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n loading?: boolean;\n quoteName: VNode;\n quoteStatus: VNode;\n banner?: VNode;\n details?: VNode;\n actionBar?: VNode;\n quoteContent: VNode;\n shippingInformationTitle: VNode;\n shippingInformation: VNode;\n quoteCommentsTitle: VNode;\n quoteComments: VNode;\n attachFilesField?: VNode;\n attachedFilesList?: VNode;\n footer: VNode;\n}\n\nexport const ManageNegotiableQuote: FunctionComponent<ManageNegotiableQuoteProps> = ({\n className,\n loading,\n quoteName,\n quoteStatus,\n banner,\n details,\n actionBar,\n quoteContent,\n shippingInformationTitle,\n shippingInformation,\n quoteCommentsTitle,\n quoteComments,\n attachFilesField,\n attachedFilesList,\n footer,\n ...props\n}) => {\n if (loading) {\n return <ManageNegotiableQuoteSkeleton />;\n }\n\n return (\n <div {...props} className={classes(['quote-management-manage-negotiable-quote', className])}>\n <div className={classes(['quote-management-manage-negotiable-quote__header'])}>\n {quoteName &&\n <VComponent\n node={quoteName}\n className={classes(['quote-management-manage-negotiable-quote__quote-name'])}\n />\n }\n {quoteStatus &&\n <VComponent\n node={quoteStatus}\n className={classes(['quote-management-manage-negotiable-quote__quote-status'])}\n />\n }\n </div>\n {banner &&\n <VComponent\n node={banner}\n className={classes(['quote-management-manage-negotiable-quote__banner'])}\n />\n }\n {details &&\n <VComponent\n node={details}\n className={classes(['quote-management-manage-negotiable-quote__details'])}\n />\n }\n {actionBar &&\n <VComponent\n node={actionBar}\n className={classes(['quote-management-manage-negotiable-quote__action-bar'])}\n />\n }\n {quoteContent &&\n <VComponent\n node={quoteContent}\n className={classes(['quote-management-manage-negotiable-quote__quote-content'])}\n />\n }\n <div data-testid=\"quote-shipping-information-container\" className={classes(['quote-management-manage-negotiable-quote__shipping-information-container'])}>\n {shippingInformationTitle &&\n <VComponent\n node={shippingInformationTitle}\n className={classes(['quote-management-manage-negotiable-quote__shipping-information-title'])}\n />\n }\n {shippingInformation &&\n <VComponent\n node={shippingInformation}\n className={classes(['quote-management-manage-negotiable-quote__shipping-information'])}\n />\n }\n </div>\n <div data-testid=\"quote-comments-container\" className={classes(['quote-management-manage-negotiable-quote__quote-comments-container'])}>\n {quoteCommentsTitle &&\n <VComponent\n node={quoteCommentsTitle}\n className={classes(['quote-management-manage-negotiable-quote__quote-comments-title'])}\n />\n }\n {quoteComments &&\n <VComponent\n node={quoteComments}\n className={classes(['quote-management-manage-negotiable-quote__quote-comments'])}\n />\n }\n {attachFilesField &&\n <VComponent\n node={attachFilesField}\n className={classes(['quote-management-manage-negotiable-quote__attach-files-field'])}\n />\n }\n {attachedFilesList &&\n <VComponent\n node={attachedFilesList}\n className={classes(['quote-management-manage-negotiable-quote__attached-files-list'])}\n />\n }\n </div>\n <VComponent\n node={footer}\n className={classes(['quote-management-manage-negotiable-quote__footer'])}\n />\n </div>\n );\n};\n\nexport const ManageNegotiableQuoteSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"manage-negotiable-quote-skeleton\">\n <SkeletonRow variant=\"heading\" fullWidth={true} size=\"large\" />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n <SkeletonRow variant=\"row\" fullWidth={true} />\n <SkeletonRow variant=\"row\" fullWidth={true} size=\"xlarge\" lines={2} />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\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 {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n createPortal,\n} from 'preact/compat';\nimport {\n Container,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\nimport {\n NegotiableQuoteModel,\n CartItemModel,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport {\n ManageNegotiableQuote as ManageNegotiableQuoteComponent,\n ManageNegotiableQuoteProps as ManageNegotiableQuoteComponentProps,\n} from '@/quote-management/components/ManageNegotiableQuote';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n ActionsBar,\n TabbedContent,\n ConfirmationModal,\n AttachedFilesList,\n AttachedFile,\n} from '@/quote-management/components';\nimport { ShippingAddressDisplay } from '@/quote-management/containers/ShippingAddressDisplay';\nimport { QuoteHistoryLog } from '@/quote-management/containers/QuoteHistoryLog';\nimport { ItemsQuoted, QuoteCommentsList } from '@/quote-management/containers';\nimport {\n Button,\n InLineAlert,\n TextArea,\n InputFile,\n} from '@adobe-commerce/elsie/components';\nimport {\n WarningFilled,\n Edit,\n CheckWithCircle,\n Add,\n} from '@adobe-commerce/elsie/icons';\nimport {\n deleteQuote,\n sendForReview,\n renameNegotiableQuote,\n closeNegotiableQuote,\n getQuoteData,\n uploadFile,\n duplicateQuote,\n createQuoteTemplate,\n} from '@/quote-management/api';\nimport {\n formatFileSize,\n validateFileType,\n validateFileSize,\n} from '@/quote-management/utils/fileUtils';\nimport { RenameQuoteModal } from '@/quote-management/components/RenameQuoteModal';\n\nexport interface ManageNegotiableQuoteProps\n extends HTMLAttributes<HTMLDivElement> {\n onActionsDropdownChange?: (event: Event) => void;\n onActionsButtonClick?: (action: string) => void;\n onSendForReview?: (params: {\n quoteData: NegotiableQuoteModel;\n comment?: string;\n attachments?: AttachedFile[];\n }) => void;\n maxFiles?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n onDuplicateQuote?: (params: {\n quoteData: NegotiableQuoteModel;\n newQuote: NegotiableQuoteModel;\n }) => void;\n slots?: {\n QuoteName?: SlotProps<{\n quoteName?: string;\n quoteData?: NegotiableQuoteModel;\n }>;\n QuoteStatus?: SlotProps<{\n quoteStatus?: string;\n quoteData?: NegotiableQuoteModel;\n }>;\n Banner?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n DuplicateQuoteWarningBanner?: SlotProps<{\n outOfStockWarning?: boolean;\n }>;\n Details?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ActionBar?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n actionsBarDropdownValue?: string;\n }>;\n QuoteContent?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ItemsQuotedTab?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n CommentsTab?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n HistoryLogTab?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ShippingInformationTitle?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ShippingInformation?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n loading?: boolean;\n setLoading?: (loading: boolean) => void;\n }>;\n QuoteCommentsTitle?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n QuoteComments?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n AttachFilesField?: SlotProps<{\n onFileChange: (files: File[]) => void;\n attachedFiles: AttachedFile[];\n fileUploadError: string | undefined;\n disabled?: boolean;\n }>;\n AttachedFilesList?: SlotProps<{\n files: AttachedFile[];\n onRemove: (key: string) => void;\n disabled?: boolean;\n }>;\n Footer?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n comment?: string;\n isSubmitting?: boolean;\n attachments?: AttachedFile[];\n handleSendForReview: () => void;\n }>;\n };\n}\n\nexport const ManageNegotiableQuote: Container<ManageNegotiableQuoteProps> = ({\n onActionsDropdownChange,\n slots,\n onActionsButtonClick,\n onSendForReview,\n maxFiles,\n maxFileSize,\n acceptedFileTypes,\n onDuplicateQuote,\n ...props\n}) => {\n const [quoteData, setQuoteData] = useState<NegotiableQuoteModel | undefined>(\n undefined\n );\n const [loading, setLoading] = useState<boolean>(true);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState<boolean>(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n const [deleteSuccess, setDeleteSuccess] = useState<boolean>(false);\n const [isDuplicateDialogOpen, setIsDuplicateDialogOpen] = useState<boolean>(false);\n const [duplicateError, setDuplicateError] = useState<string | null>(null);\n const [duplicateSuccess, setDuplicateSuccess] = useState<boolean>(false);\n const [duplicateOutOfStockWarning, setDuplicateOutOfStockWarning] = useState<boolean>(false);\n const [comment, setComment] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [showCloseModal, setShowCloseModal] = useState<boolean>(false);\n const [isClosing, setIsClosing] = useState<boolean>(false);\n const [modalSuccessMessage, setModalSuccessMessage] = useState<string>('');\n const [modalErrorMessage, setModalErrorMessage] = useState<string>('');\n const [showCreateTemplateModal, setShowCreateTemplateModal] = useState<boolean>(false);\n const [isCreatingTemplate, setIsCreatingTemplate] = useState<boolean>(false);\n const [createTemplateSuccessMessage, setCreateTemplateSuccessMessage] = useState<string>('');\n const [createTemplateErrorMessage, setCreateTemplateErrorMessage] = useState<string>('');\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [renameQuoteName, setRenameQuoteName] = useState<string>('');\n const [renameReason, setRenameReason] = useState<string>('');\n const [renameError, setRenameError] = useState<string>('');\n const [renameQuoteNameError, setRenameQuoteNameError] = useState<string>('');\n const [renameSuccess, setRenameSuccess] = useState<string>('');\n const [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n const [fileUploadError, setFileUploadError] = useState<string | undefined>(undefined);\n const [selectedItemUids, setSelectedItemUids] = useState<Set<string>>(\n new Set()\n );\n const selectedItemUidsRef = useRef<Set<string>>(selectedItemUids);\n const removeItemsHandlerRef = useRef<\n ((items: CartItemModel[]) => void) | null\n >(null);\n const [actionsBarDropdownValue, setActionsBarDropdownValue] =\n useState<string>('');\n const actionsBarDropdownValueRef = useRef<string>(actionsBarDropdownValue);\n const [isNoItemsSelectedModalOpen, setIsNoItemsSelectedModalOpen] =\n useState<boolean>(false);\n\n // Keep refs in sync with state\n useEffect(() => {\n selectedItemUidsRef.current = selectedItemUids;\n }, [selectedItemUids]);\n\n useEffect(() => {\n actionsBarDropdownValueRef.current = actionsBarDropdownValue;\n }, [actionsBarDropdownValue]);\n\n const dictionary = useText({\n createdLabel: 'NegotiableQuote.Manage.createdLabel',\n salesRepLabel: 'NegotiableQuote.Manage.salesRepLabel',\n expiresLabel: 'NegotiableQuote.Manage.expiresLabel',\n actionsLabel: 'NegotiableQuote.Manage.actionsLabel',\n remove: 'NegotiableQuote.Manage.actions.remove',\n close: 'NegotiableQuote.Manage.actionButtons.close',\n delete: 'NegotiableQuote.Manage.actionButtons.delete',\n print: 'NegotiableQuote.Manage.actionButtons.print',\n createTemplate: 'NegotiableQuote.Manage.actionButtons.createTemplate',\n createCopy: 'NegotiableQuote.Manage.actionButtons.createCopy',\n shippingInformationTitle:\n 'NegotiableQuote.Manage.shippingInformation.title',\n quoteCommentsTitle: 'NegotiableQuote.Manage.quoteComments.title',\n quoteCommentsPlaceholder:\n 'NegotiableQuote.Manage.quoteComments.placeholder',\n sendForReview: 'NegotiableQuote.Manage.actionButtons.sendForReview',\n bannerTitle: 'NegotiableQuote.Manage.bannerTitle',\n statusSubmitted: 'NegotiableQuote.Manage.bannerStatusMessages.submitted',\n statusPending: 'NegotiableQuote.Manage.bannerStatusMessages.pending',\n statusExpired: 'NegotiableQuote.Manage.bannerStatusMessages.expired',\n errorFallback:\n 'NegotiableQuote.Manage.confirmationModal.delete.errorFallback',\n closeSuccessMessage:\n 'NegotiableQuote.Manage.confirmationModal.close.successDescription',\n closeModalTitle: 'NegotiableQuote.Manage.actionButtons.close',\n closeModalMessage: 'NegotiableQuote.Manage.confirmationModal.close.message',\n closeModalCancel: 'NegotiableQuote.Manage.confirmationModal.cancel',\n closeModalConfirm: 'NegotiableQuote.Manage.confirmationModal.close.confirm',\n closeModalConfirmLoading:\n 'NegotiableQuote.Manage.confirmationModal.close.confirmLoading',\n closeModalSuccessHeading:\n 'NegotiableQuote.Manage.confirmationModal.close.successHeading',\n createTemplateModalTitle: 'NegotiableQuote.Manage.actionButtons.createTemplate',\n createTemplateModalMessage: 'NegotiableQuote.Manage.confirmationModal.createTemplate.message',\n createTemplateModalCancel: 'NegotiableQuote.Manage.confirmationModal.cancel',\n createTemplateModalConfirm: 'NegotiableQuote.Manage.confirmationModal.createTemplate.confirm',\n createTemplateModalConfirmLoading:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.confirmLoading',\n createTemplateModalSuccessHeading:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.successHeading',\n createTemplateSuccessMessage:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.successDescription',\n createTemplateModalErrorHeading:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.errorHeading',\n createTemplateErrorFallback:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.errorFallback',\n renameErrorHeading: 'NegotiableQuote.Manage.rename.errorHeading',\n renameQuoteNameRequired: 'NegotiableQuote.Manage.rename.quoteNameRequired',\n renameErrorDefault: 'NegotiableQuote.Manage.rename.errorDefault',\n renameSuccessHeading: 'NegotiableQuote.Manage.rename.successHeading',\n renameSuccessMessage: 'NegotiableQuote.Manage.rename.successMessage',\n confirmationModalCancel: 'NegotiableQuote.Manage.confirmationModal.cancel',\n confirmationModalDeleteTitle: 'NegotiableQuote.Manage.confirmationModal.delete.title',\n confirmationModalDeleteMessage: 'NegotiableQuote.Manage.confirmationModal.delete.message',\n confirmationModalDeleteConfirm: 'NegotiableQuote.Manage.confirmationModal.delete.confirm',\n confirmationModalDeleteErrorHeading: 'NegotiableQuote.Manage.confirmationModal.delete.errorHeading',\n confirmationModalDeleteErrorFallback: 'NegotiableQuote.Manage.confirmationModal.delete.errorFallback',\n confirmationModalDeleteSuccessHeading: 'NegotiableQuote.Manage.confirmationModal.delete.successHeading',\n confirmationModalDeleteSuccessDescription: 'NegotiableQuote.Manage.confirmationModal.delete.successDescription',\n confirmationModalDuplicateTitle: 'NegotiableQuote.Manage.confirmationModal.duplicate.title',\n confirmationModalDuplicateMessage: 'NegotiableQuote.Manage.confirmationModal.duplicate.message',\n confirmationModalDuplicateConfirm: 'NegotiableQuote.Manage.confirmationModal.duplicate.confirm',\n confirmationModalDuplicateErrorHeading: 'NegotiableQuote.Manage.confirmationModal.duplicate.errorHeading',\n confirmationModalDuplicateErrorFallback: 'NegotiableQuote.Manage.confirmationModal.duplicate.errorFallback',\n confirmationModalDuplicateSuccessHeading: 'NegotiableQuote.Manage.confirmationModal.duplicate.successHeading',\n confirmationModalDuplicateSuccessDescription: 'NegotiableQuote.Manage.confirmationModal.duplicate.successDescription',\n duplicateOutOfStockWarningHeading: 'NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningHeading',\n duplicateOutOfStockWarningMessage: 'NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningMessage',\n noItemsSelectedModalTitle: 'NegotiableQuote.Manage.confirmationModal.noItemsSelected.title',\n noItemsSelectedModalMessage: 'NegotiableQuote.Manage.confirmationModal.noItemsSelected.message',\n noItemsSelectedModalConfirm: 'NegotiableQuote.Manage.confirmationModal.noItemsSelected.confirm',\n attachFiles: 'NegotiableQuote.Manage.attachFiles',\n fileUploadError: 'NegotiableQuote.Manage.fileUploadError',\n maxFilesExceeded: 'NegotiableQuote.Manage.maxFilesExceeded',\n maxFileSizeExceeded: 'NegotiableQuote.Manage.maxFileSizeExceeded',\n invalidFileType: 'NegotiableQuote.Manage.invalidFileType',\n });\n /* Event listeners */\n useEffect(() => {\n const quoteDataEvent = events.on(\n 'quote-management/quote-data',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n if (quote) {\n setQuoteData(quote);\n setLoading(false);\n\n // Check for pending out of stock warning from duplication\n const pendingWarningKey = `duplicate-outOfStock-warning-${quote.uid}`;\n const pendingWarning = sessionStorage.getItem(pendingWarningKey);\n if (pendingWarning === 'true') {\n setDuplicateOutOfStockWarning(true);\n sessionStorage.removeItem(pendingWarningKey);\n }\n }\n },\n {\n eager: true,\n }\n );\n return () => quoteDataEvent?.off();\n }, []);\n\n // Listen for shipping address set event\n useEffect(() => {\n const shippingAddressSetEvent = events.on(\n 'quote-management/shipping-address-set',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n if (quote) {\n setQuoteData(quote);\n }\n },\n {\n eager: true,\n }\n );\n return () => shippingAddressSetEvent?.off();\n }, []);\n\n // Listen for quote sent for review event\n useEffect(() => {\n const quoteSentForReviewEvent = events.on(\n 'quote-management/quote-sent-for-review',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n setQuoteData(quote);\n setComment(''); // Reset comment after successful submission\n setAttachedFiles([]); // Clear attachments after successful submission\n setIsSubmitting(false);\n },\n {\n eager: true,\n }\n );\n return () => quoteSentForReviewEvent?.off();\n }, []);\n\n // Listen for quote items removed event\n useEffect(() => {\n const quoteItemsRemovedEvent = events.on(\n 'quote-management/quote-items-removed',\n (data: { quote: NegotiableQuoteModel; removedItemUids: string[] }) => {\n const { quote, removedItemUids } = data;\n /* istanbul ignore else */ // Always has quote in real usage; covered in integration tests\n if (quote) {\n setQuoteData(quote);\n }\n // Clear selected items that were removed\n /* istanbul ignore else */ // Always has removedItemUids in real usage; covered in integration tests\n if (removedItemUids) {\n setSelectedItemUids((prev) => {\n const next = new Set(prev);\n removedItemUids.forEach((uid) => next.delete(uid));\n return next;\n });\n }\n },\n {\n eager: true,\n }\n );\n return () => quoteItemsRemovedEvent?.off();\n }, []);\n\n /**\n * Handlers\n */\n const handleItemCheckboxChange = useCallback(\n (item: CartItemModel, isSelected: boolean) => {\n setSelectedItemUids((prev) => {\n const next = new Set(prev);\n if (isSelected) {\n next.add(item.uid);\n } else {\n next.delete(item.uid);\n }\n return next;\n });\n },\n []\n );\n\n const handleActionsDropdownChange = useCallback(\n (event: Event) => {\n const action = (event.target as HTMLSelectElement).value;\n const currentSelectedUids = selectedItemUidsRef.current;\n /* istanbul ignore else */ if (action === 'remove') {\n setActionsBarDropdownValue(action);\n actionsBarDropdownValueRef.current = action; // Update ref immediately\n /* istanbul ignore next */ if (currentSelectedUids.size === 0) {\n // No items selected - show warning modal\n setIsNoItemsSelectedModalOpen(true);\n } else if (quoteData && removeItemsHandlerRef.current) {\n // Items selected - proceed with removal\n const itemsToRemove = quoteData.items.filter((item) =>\n currentSelectedUids.has(item.uid)\n );\n /* istanbul ignore next */ removeItemsHandlerRef.current(\n itemsToRemove\n );\n }\n }\n onActionsDropdownChange?.(event);\n },\n [onActionsDropdownChange, quoteData]\n );\n\n /* istanbul ignore next */ const handleCloseNoItemsSelectedModal =\n useCallback(() => {\n setIsNoItemsSelectedModalOpen(false);\n setActionsBarDropdownValue('');\n actionsBarDropdownValueRef.current = '';\n }, []);\n\n // Listen for quote closed event\n useEffect(() => {\n const quoteClosedEvent = events.on(\n 'quote-management/negotiable-quote-closed',\n async (data: { closedQuoteUids: string[] }) => {\n setIsClosing(false);\n setModalErrorMessage('');\n // Show success message in modal\n setModalSuccessMessage(dictionary.closeSuccessMessage);\n\n // Refresh quote data if the current quote was closed\n // Use a function to get the current quoteData to avoid stale closure\n setQuoteData((currentQuoteData) => {\n if (\n currentQuoteData?.uid &&\n data.closedQuoteUids?.includes(currentQuoteData.uid)\n ) {\n // Trigger async refresh\n getQuoteData(currentQuoteData.uid)\n .then((updatedQuoteData) => {\n setQuoteData(updatedQuoteData);\n })\n .catch((error) => {\n console.warn(\n 'Failed to refresh quote data after closure:',\n error\n );\n });\n }\n return currentQuoteData; // Return current data unchanged for this setter call\n });\n\n // Close modal and redirect after a delay to show success message\n setTimeout(() => {\n setShowCloseModal(false);\n setModalSuccessMessage('');\n }, 2000);\n },\n {\n eager: true,\n }\n );\n return () => quoteClosedEvent?.off();\n }, [dictionary.closeSuccessMessage]);\n\n // Listen for quote close error event\n useEffect(() => {\n const quoteCloseErrorEvent = events.on(\n 'quote-management/negotiable-quote-close-error',\n (data: { error: Error; attemptedQuoteUids: string[] }) => {\n console.log('Close error event received:', data);\n setIsClosing(false);\n setModalSuccessMessage('');\n const errorMsg = data.error.message || dictionary.errorFallback;\n setModalErrorMessage(errorMsg);\n },\n {\n eager: true,\n }\n );\n return () => quoteCloseErrorEvent?.off();\n }, [dictionary.errorFallback]);\n\n // Listen for quote renamed event\n useEffect(() => {\n const quoteRenamedEvent = events.on(\n 'quote-management/quote-renamed',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n setQuoteData(quote);\n setRenameError('');\n setRenameQuoteNameError('');\n setRenameSuccess(dictionary.renameSuccessMessage);\n\n // Wait 2 seconds before closing the modal\n setTimeout(() => {\n setIsRenameModalOpen(false);\n setRenameQuoteName('');\n setRenameReason('');\n setRenameSuccess('');\n }, 2000);\n },\n {\n eager: true,\n }\n );\n return () => quoteRenamedEvent?.off();\n }, [dictionary.renameSuccessMessage]);\n\n // Listen for quote duplicated event\n useEffect(() => {\n const quoteDuplicatedEvent = events.on(\n 'quote-management/quote-duplicated',\n (data: {\n quote: NegotiableQuoteModel;\n input: { quoteUid: string; duplicatedQuoteUid: string };\n }) => {\n const { quote: newQuote } = data;\n\n // Call parent callback if provided\n if (quoteData && onDuplicateQuote) {\n onDuplicateQuote({ quoteData, newQuote });\n }\n\n // Show success in modal\n setDuplicateSuccess(true);\n setDuplicateError(null);\n\n // Close modal after showing success message\n // Navigation is handled by the application layer listening to quote-duplicated event\n setTimeout(() => {\n setIsDuplicateDialogOpen(false);\n setDuplicateSuccess(false);\n setDuplicateError(null);\n }, 2000);\n },\n {\n eager: true,\n }\n );\n return () => quoteDuplicatedEvent?.off();\n }, [quoteData, onDuplicateQuote]);\n\n /**\n * File upload handlers\n */\n\n const handleAttachFiles = useCallback(async (files: File[]) => {\n // Check maxFiles limit\n if (maxFiles && attachedFiles.length + files.length > maxFiles) {\n setFileUploadError(dictionary.maxFilesExceeded.replace('{maxFiles}', String(maxFiles)));\n return;\n }\n\n // Validate file types and sizes before uploading\n for (const file of files) {\n if (maxFileSize && !validateFileSize(file.size, maxFileSize)) {\n setFileUploadError(\n dictionary.maxFileSizeExceeded.replace('{maxSize}', formatFileSize(maxFileSize))\n );\n return;\n }\n\n if (acceptedFileTypes && !validateFileType(file.type, acceptedFileTypes)) {\n setFileUploadError(dictionary.invalidFileType);\n return;\n }\n }\n\n setFileUploadError(undefined);\n\n // Add files with 'uploading' status\n const newFiles: AttachedFile[] = files.map(file => ({\n key: `temp-${Date.now()}-${Math.random()}-${file.name}`,\n name: file.name,\n size: file.size,\n status: 'uploading',\n }));\n\n setAttachedFiles(prev => [...prev, ...newFiles]);\n\n // Upload each file and update its status\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const tempKey = newFiles[i].key;\n\n try {\n const result = await uploadFile(file);\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, key: result.key, status: 'success' }\n : f\n ));\n } catch (error) {\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, status: 'error', error: (error as Error).message }\n : f\n ));\n }\n }\n }, [maxFiles, maxFileSize, acceptedFileTypes, attachedFiles, dictionary]);\n\n const handleRemoveFile = useCallback((key: string) => {\n setAttachedFiles(prev => prev.filter(f => f.key !== key));\n }, []);\n\n /**\n * VNodes for the ManageNegotiableQuote component\n */\n\n // Rename handlers\n const handleRenameClick = useCallback(() => {\n setRenameQuoteName(quoteData?.name || '');\n setRenameReason('');\n setRenameError('');\n setRenameQuoteNameError('');\n setRenameSuccess('');\n setIsRenameModalOpen(true);\n }, [quoteData]);\n\n const handleRenameClose = useCallback(() => {\n setIsRenameModalOpen(false);\n setRenameQuoteName('');\n setRenameReason('');\n setRenameError('');\n setRenameQuoteNameError('');\n setRenameSuccess('');\n }, []);\n\n const handleRenameQuoteNameChange = useCallback((value: string) => {\n setRenameQuoteName(value);\n if (value.trim()) {\n setRenameQuoteNameError('');\n }\n }, []);\n\n const handleDuplicateQuote = useCallback(() => {\n // Show confirmation modal\n setIsDuplicateDialogOpen(true);\n setDuplicateError(null);\n setDuplicateSuccess(false);\n }, []);\n\n const handleRenameSave = useCallback(async () => {\n // Validate quote name\n if (!renameQuoteName.trim()) {\n setRenameQuoteNameError(dictionary.renameQuoteNameRequired);\n return;\n }\n\n try {\n setRenameError('');\n setRenameQuoteNameError('');\n await renameNegotiableQuote({\n quoteUid: quoteData!.uid,\n quoteName: renameQuoteName,\n quoteComment: renameReason.trim() || undefined,\n });\n // The quote-renamed event will handle closing the modal and updating state\n } catch (error) {\n setRenameError((error as Error).message || dictionary.renameErrorDefault);\n }\n }, [\n quoteData,\n renameQuoteName,\n renameReason,\n dictionary.renameQuoteNameRequired,\n dictionary.renameErrorDefault,\n ]);\n\n // Quote name with rename icon\n const quoteName = useMemo(() => {\n // Priority 1: Check lockedForEditing if explicitly set\n // Priority 2: Fall back to status check\n const isLocked =\n quoteData &&\n // If lockedForEditing is explicitly set, use it\n (quoteData.lockedForEditing === true ||\n // Otherwise, lock based on status\n (quoteData.lockedForEditing === undefined &&\n (quoteData.status === 'SUBMITTED' ||\n quoteData.status === 'PENDING' ||\n quoteData.status === 'ORDERED' ||\n quoteData.status === 'CLOSED')));\n\n return (\n <Slot\n name=\"QuoteName\"\n slot={slots?.QuoteName}\n context={{ quoteName: quoteData?.name, quoteData }}\n >\n <div className=\"quote-management-manage-negotiable-quote__quote-name-wrapper\">\n <h1\n data-testid=\"quote-name\"\n className=\"quote-management-manage-negotiable-quote__quote-name-title\"\n >\n {quoteData?.name}\n </h1>\n <button\n onClick={handleRenameClick}\n disabled={isLocked}\n data-testid=\"rename-quote-button\"\n className=\"quote-management-manage-negotiable-quote__rename-button\"\n aria-label=\"Rename quote\"\n >\n <Edit />\n </button>\n </div>\n </Slot>\n );\n }, [slots?.QuoteName, quoteData, handleRenameClick]);\n\n // Quote status\n const quoteStatus = useMemo(() => {\n return (\n <Slot\n name=\"QuoteStatus\"\n slot={slots?.QuoteStatus}\n context={{ quoteStatus: quoteData?.status, quoteData }}\n >\n <div data-testid=\"quote-status\">{quoteData?.status}</div>\n </Slot>\n );\n }, [slots?.QuoteStatus, quoteData]);\n\n // Banner\n const getBannerStatusMessage = useCallback(\n (status: string | undefined) => {\n switch (status) {\n case 'SUBMITTED':\n return dictionary.statusSubmitted;\n case 'PENDING':\n return dictionary.statusPending;\n case 'EXPIRED':\n return dictionary.statusExpired;\n default:\n return null;\n }\n },\n [dictionary]\n );\n\n const bannerMessage = getBannerStatusMessage(quoteData?.status);\n\n const bannerContent = bannerMessage && (\n <InLineAlert\n type=\"warning\"\n variant=\"secondary\"\n icon={<WarningFilled />}\n heading={dictionary.bannerTitle}\n description={bannerMessage}\n />\n );\n\n const banner = bannerContent && (\n <Slot\n name=\"Banner\"\n data-testid=\"banner\"\n slot={slots?.Banner}\n context={{ quoteData }}\n >\n {bannerContent}\n </Slot>\n );\n\n // Handler for dismissing out of stock warning\n const handleDismissOutOfStockWarning = useCallback(() => {\n setDuplicateOutOfStockWarning(false);\n }, []);\n\n // Out of stock warning banner for duplicated quotes\n const outOfStockWarningBanner = duplicateOutOfStockWarning && (\n <Slot\n name=\"DuplicateQuoteWarningBanner\"\n data-testid=\"duplicate-outOfStock-warning-banner\"\n slot={slots?.DuplicateQuoteWarningBanner}\n context={{ outOfStockWarning: duplicateOutOfStockWarning }}\n >\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.duplicateOutOfStockWarningHeading}\n description={dictionary.duplicateOutOfStockWarningMessage}\n onDismiss={handleDismissOutOfStockWarning}\n data-testid=\"duplicate-outOfStock-warning-alert\"\n />\n </Slot>\n );\n\n // Details\n const details = useMemo(() => {\n if (!quoteData) {\n return;\n }\n\n // Some quotes, such as draft quotes, don't have a date formatted expiration date\n const expirationDate = quoteData.expirationDate ? formattedDate(quoteData.expirationDate, 'short') : undefined;\n\n return (\n <Slot name=\"Details\" slot={slots?.Details} context={{ quoteData }}>\n <div className=\"quote-management-manage-negotiable-quote__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote__detail-title\"\n data-testid=\"created-label\"\n >\n {dictionary.createdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote__detail-content\"\n data-testid=\"created-value\"\n >\n {formattedDate(quoteData!.createdAt, 'short')} (\n {quoteData!.buyer.firstname} {quoteData!.buyer.lastname})\n </span>\n </div>\n <div className=\"quote-management-manage-negotiable-quote__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote__detail-title\"\n data-testid=\"sales-rep-label\"\n >\n {dictionary.salesRepLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote__detail-content\"\n data-testid=\"sales-rep-value\"\n >\n {quoteData!.salesRepName}\n </span>\n </div>\n <div className=\"quote-management-manage-negotiable-quote__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote__detail-title\"\n data-testid=\"expires-label\"\n >\n {dictionary.expiresLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote__detail-content\"\n data-testid=\"expires-value\"\n >\n {expirationDate}\n </span>\n </div>\n </Slot>\n );\n }, [slots?.Details, dictionary, quoteData]);\n\n // Action bar\n const buttons: { label: string; value: string; disabled?: boolean }[] =\n useMemo(() => {\n return [\n {\n label: dictionary.close,\n value: 'close',\n disabled: !quoteData?.canClose,\n },\n {\n label: dictionary.delete,\n value: 'delete',\n disabled: !quoteData?.canDelete,\n },\n {\n label: dictionary.print,\n value: 'print',\n },\n {\n label: dictionary.createTemplate,\n value: 'createTemplate',\n disabled: Boolean(quoteData?.templateName),\n },\n {\n label: dictionary.createCopy,\n value: 'createCopy',\n disabled: Boolean(quoteData?.templateName),\n },\n ];\n }, [dictionary, quoteData?.canDelete, quoteData?.canClose, quoteData?.templateName]);\n const actionBar = useMemo(() => {\n const handleActionsButtonClick = (action: string) => {\n switch (action) {\n case 'close':\n setShowCloseModal(true);\n setModalErrorMessage(''); // Clear modal errors\n setModalSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n case 'delete':\n setIsDeleteDialogOpen(true);\n onActionsButtonClick?.(action);\n break;\n case 'print':\n onActionsButtonClick?.(action);\n break;\n case 'createTemplate':\n setShowCreateTemplateModal(true);\n setCreateTemplateErrorMessage(''); // Clear modal errors\n setCreateTemplateSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n case 'createCopy':\n handleDuplicateQuote();\n onActionsButtonClick?.(action);\n break;\n }\n };\n return (\n <Slot\n name=\"ActionBar\"\n slot={slots?.ActionBar}\n context={{ quoteData, actionsBarDropdownValue }}\n >\n <ActionsBar\n dropdownPlaceholder={dictionary.actionsLabel}\n dropdownOptions={[\n {\n label: dictionary.remove,\n value: 'remove',\n },\n ]}\n dropdownValue={actionsBarDropdownValue}\n handleDropdownChange={handleActionsDropdownChange}\n buttons={buttons.map((button) => (\n <Button\n key={button.value}\n variant=\"tertiary\"\n onClick={() => handleActionsButtonClick(button.value)}\n data-testid={`actions-bar-${button.value}-button`}\n data-action={button.value}\n disabled={button.disabled}\n >\n {button.label}\n </Button>\n ))}\n />\n </Slot>\n );\n }, [\n buttons,\n dictionary,\n slots?.ActionBar,\n quoteData,\n handleActionsDropdownChange,\n onActionsButtonClick,\n handleDuplicateQuote,\n actionsBarDropdownValue,\n ]);\n\n // Quote content\n const quoteContent = useMemo(() => {\n return (\n <Slot\n name=\"QuoteContent\"\n slot={slots?.QuoteContent}\n context={{ quoteData }}\n >\n <TabbedContent\n tabs={\n new Map([\n ['items-quoted', 'Items Quoted'],\n ['comments', 'Comments'],\n ['history-log', 'History Log'],\n ])\n }\n tabsContent={\n new Map([\n [\n 'items-quoted',\n <Slot\n key=\"items-quoted\"\n name=\"ItemsQuotedTab\"\n slot={slots?.ItemsQuotedTab}\n context={{ quoteData }}\n >\n <ItemsQuoted\n quoteData={quoteData}\n onItemCheckboxChange={handleItemCheckboxChange}\n onRemoveItemsRef={(handler) => {\n removeItemsHandlerRef.current = handler;\n }}\n onRemoveModalStateChange={\n /* istanbul ignore next */ (isOpen) => {\n if (\n !isOpen &&\n actionsBarDropdownValueRef.current === 'remove'\n ) {\n setActionsBarDropdownValue('');\n }\n }\n }\n />\n </Slot>,\n ],\n [\n 'comments',\n <Slot\n key=\"comments\"\n name=\"CommentsTab\"\n slot={slots?.CommentsTab}\n context={{ quoteData }}\n >\n <QuoteCommentsList quoteData={quoteData} />\n </Slot>,\n ],\n [\n 'history-log',\n <Slot\n key=\"history-log\"\n name=\"HistoryLogTab\"\n slot={slots?.HistoryLogTab}\n context={{ quoteData }}\n >\n <QuoteHistoryLog quoteData={quoteData} />\n </Slot>,\n ],\n ])\n }\n />\n </Slot>\n );\n }, [\n slots?.QuoteContent,\n slots?.HistoryLogTab,\n slots?.CommentsTab,\n slots?.ItemsQuotedTab,\n quoteData,\n handleItemCheckboxChange,\n ]);\n\n // Shipping information title\n const shippingInformationTitle = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformationTitle\"\n slot={slots?.ShippingInformationTitle}\n context={{ quoteData }}\n >\n <h2>{dictionary.shippingInformationTitle}</h2>\n </Slot>\n );\n }, [slots?.ShippingInformationTitle, quoteData, dictionary]);\n\n // Shipping information\n const shippingInformation = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformation\"\n slot={slots?.ShippingInformation}\n context={{ quoteData, loading, setLoading }}\n >\n <ShippingAddressDisplay\n shippingAddress={quoteData?.shippingAddresses?.[0]}\n loading={loading}\n data-testid=\"manage-quote-shipping-address\"\n />\n </Slot>\n );\n }, [slots?.ShippingInformation, quoteData, loading, setLoading]);\n\n // Quote comments title\n const quoteCommentsTitle = useMemo(() => {\n return (\n <Slot\n name=\"QuoteCommentsTitle\"\n slot={slots?.QuoteCommentsTitle}\n context={{ quoteData }}\n >\n <h2>{dictionary.quoteCommentsTitle}</h2>\n </Slot>\n );\n }, [slots?.QuoteCommentsTitle, dictionary, quoteData]);\n\n // Quote comments\n const quoteComments = useMemo(() => {\n return (\n <Slot\n name=\"QuoteComments\"\n slot={slots?.QuoteComments}\n context={{ quoteData }}\n >\n <TextArea\n name=\"quoteComments\"\n placeholder={dictionary.quoteCommentsPlaceholder}\n rows={3}\n value={comment}\n onInput={(e) => {\n setComment((e.target as HTMLTextAreaElement).value);\n }}\n disabled={!quoteData?.canSendForReview || isSubmitting}\n />\n </Slot>\n );\n }, [slots?.QuoteComments, dictionary, quoteData, comment, isSubmitting]);\n\n // File upload should be disabled when quote cannot be sent for review\n // (which already includes the status and permission checks from the transformer)\n const isFileUploadDisabled = useMemo(() => {\n return !quoteData?.canSendForReview;\n }, [quoteData]);\n\n // File upload input\n const attachFilesField = useMemo(() => {\n // Check if button should be visually disabled\n const isDisabled = isSubmitting || isFileUploadDisabled;\n\n return (\n <Slot\n name=\"AttachFilesField\"\n slot={slots?.AttachFilesField}\n context={{ onFileChange: handleAttachFiles, attachedFiles, fileUploadError, disabled: isDisabled }}\n >\n <div \n className=\"quote-management-manage-negotiable-quote__attach-files\"\n {...(isDisabled ? { 'data-disabled': true } : {})}\n aria-disabled={isDisabled}\n >\n <InputFile\n id=\"manage-quote-attach-files\"\n multiple\n onChange={(e: Event) => {\n const target = e.target as HTMLInputElement;\n const fileList = target?.files;\n const files = fileList ? Array.from(fileList) : [];\n if (files.length > 0) {\n void handleAttachFiles(files);\n }\n }}\n icon={<Add />}\n disabled={isDisabled}\n data-testid=\"manage-quote-attach-files\"\n accept={acceptedFileTypes?.join(',')}\n >\n {dictionary.attachFiles}\n </InputFile>\n {fileUploadError && (\n <div\n className=\"quote-management-manage-negotiable-quote__file-error\"\n data-testid=\"file-upload-error\"\n >\n {fileUploadError}\n </div>\n )}\n </div>\n </Slot>\n );\n }, [\n slots?.AttachFilesField,\n handleAttachFiles,\n isSubmitting,\n isFileUploadDisabled,\n acceptedFileTypes,\n fileUploadError,\n dictionary,\n attachedFiles,\n ]);\n\n // Attached files list\n const attachedFilesList = useMemo(() => {\n if (!attachedFiles.length) return undefined;\n\n return (\n <Slot\n name=\"AttachedFilesList\"\n slot={slots?.AttachedFilesList}\n context={{ files: attachedFiles, onRemove: handleRemoveFile, disabled: isSubmitting }}\n >\n <AttachedFilesList\n files={attachedFiles}\n onRemove={handleRemoveFile}\n disabled={isSubmitting}\n />\n </Slot>\n );\n }, [attachedFiles, handleRemoveFile, isSubmitting, slots?.AttachedFilesList]);\n\n // Close quote handler - only called when quoteData exists\n const handleCloseQuote = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n setIsClosing(true);\n setModalErrorMessage('');\n setModalSuccessMessage('');\n try {\n await closeNegotiableQuote({\n quoteUids: [quoteData!.uid],\n });\n } catch (error) {\n console.error('Failed to close quote:', error);\n }\n }, [quoteData]);\n\n const handleCloseModalCancel = useCallback(() => {\n setShowCloseModal(false);\n setModalErrorMessage('');\n setModalSuccessMessage('');\n }, []);\n\n // Create template handler\n const handleCreateTemplate = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n setIsCreatingTemplate(true);\n setCreateTemplateErrorMessage('');\n setCreateTemplateSuccessMessage('');\n try {\n await createQuoteTemplate(quoteData.uid);\n // Show success message\n setCreateTemplateSuccessMessage(dictionary.createTemplateSuccessMessage);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setShowCreateTemplateModal(false);\n setCreateTemplateSuccessMessage('');\n }, 2000);\n } catch (error) {\n console.error('Failed to create quote template:', error);\n const errorMessage =\n error instanceof Error ? error.message : dictionary.createTemplateErrorFallback;\n setCreateTemplateErrorMessage(errorMessage);\n } finally {\n setIsCreatingTemplate(false);\n }\n }, [quoteData, dictionary.createTemplateSuccessMessage, dictionary.createTemplateErrorFallback]);\n\n const handleCreateTemplateModalCancel = useCallback(() => {\n setShowCreateTemplateModal(false);\n setCreateTemplateErrorMessage('');\n setCreateTemplateSuccessMessage('');\n }, []);\n\n // Footer\n const handleSendForReview = useCallback(async () => {\n const successfulAttachments = attachedFiles.filter(f => f.status === 'success');\n\n // If override prop is provided, use it instead of the API\n if (onSendForReview) {\n onSendForReview({\n quoteData: quoteData!,\n comment: comment.trim() || undefined,\n attachments: successfulAttachments.length ?\n successfulAttachments :\n undefined,\n });\n return;\n }\n\n // Otherwise, use the sendForReview API\n setIsSubmitting(true);\n try {\n await sendForReview({\n quoteUid: quoteData!.uid,\n comment: comment.trim() || undefined,\n attachments: successfulAttachments.length\n ? successfulAttachments.map(f => ({ key: f.key }))\n : undefined,\n });\n // The quote-sent-for-review event will handle updating state\n } catch (error) {\n console.error('Failed to send quote for review:', error);\n setIsSubmitting(false);\n // TODO: Show error notification to user\n }\n }, [quoteData, onSendForReview, comment, attachedFiles]);\n\n const footer = useMemo(() => {\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ quoteData, comment, isSubmitting, attachments: attachedFiles, handleSendForReview }}\n >\n <Button\n variant=\"primary\"\n onClick={handleSendForReview}\n data-testid=\"send-for-review-button\"\n disabled={!quoteData?.canSendForReview || isSubmitting}\n >\n {dictionary.sendForReview}\n </Button>\n </Slot>\n );\n }, [\n slots?.Footer,\n dictionary,\n quoteData,\n comment,\n isSubmitting,\n attachedFiles,\n handleSendForReview,\n ]);\n\n // Rename modal error banner\n const renameErrorBanner = useMemo(\n () =>\n renameError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled color=\"var(--color-error)\" />}\n heading={dictionary.renameErrorHeading}\n description={renameError}\n />\n ) : undefined,\n [renameError, dictionary.renameErrorHeading]\n );\n\n // Rename modal success banner\n const renameSuccessBanner = useMemo(\n () =>\n renameSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.renameSuccessHeading}\n description={renameSuccess}\n />\n ) : undefined,\n [renameSuccess, dictionary.renameSuccessHeading]\n );\n\n // Delete quote functionality\n const getDeleteErrorMessage = useCallback(\n (error: any): string => {\n // If it's an operation failure with errors array, get the first error message\n if (\n error.errors &&\n Array.isArray(error.errors) &&\n error.errors.length > 0\n ) {\n return (\n error.errors[0].message ||\n dictionary.confirmationModalDeleteErrorFallback\n );\n }\n // Otherwise use the error message or fallback\n return error?.message || dictionary.confirmationModalDeleteErrorFallback;\n },\n [dictionary.confirmationModalDeleteErrorFallback]\n );\n\n const handleDeleteCancel = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeleteError(null);\n setDeleteSuccess(false);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n\n setDeleteError(null);\n setDeleteSuccess(false);\n\n try {\n const { operationResults } = await deleteQuote(quoteData.uid);\n\n const failure = operationResults.find(\n (res: any) => res.__typename === 'DeleteNegotiableQuoteOperationFailure'\n ) as any;\n if (failure) {\n const errorMessage = getDeleteErrorMessage(failure);\n setDeleteError(errorMessage);\n return;\n }\n\n setDeleteSuccess(true);\n } catch (error: any) {\n const errorMessage = getDeleteErrorMessage(error);\n setDeleteError(errorMessage);\n }\n }, [quoteData, getDeleteErrorMessage]);\n\n const handleDismissError = useCallback(() => {\n setDeleteError(null);\n }, []);\n\n const handleDismissSuccess = useCallback(() => {\n setDeleteSuccess(false);\n }, []);\n\n // Duplicate quote functionality\n const getDuplicateErrorMessage = useCallback((error: any): string => {\n return error?.message || dictionary.confirmationModalDuplicateErrorFallback;\n }, [dictionary.confirmationModalDuplicateErrorFallback]);\n\n const handleDuplicateCancel = useCallback(() => {\n setIsDuplicateDialogOpen(false);\n setDuplicateError(null);\n setDuplicateSuccess(false);\n }, []);\n\n const handleDuplicateConfirm = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n\n setDuplicateError(null);\n setDuplicateSuccess(false);\n\n try {\n // Check for out of stock items before duplication\n /* istanbul ignore next */\n const outOfStockItems = quoteData.items?.filter((item) => item.outOfStock) || [];\n\n // Generate a unique duplicated quote UID by replacing the last 8 characters\n const generateUniqueUid = (originalUid: string): string => {\n const baseUid = originalUid.slice(0, -8); // Remove last 8 characters\n const randomSuffix = crypto.randomUUID().slice(0, 8);\n return baseUid + randomSuffix;\n };\n \n const duplicatedQuoteUid = generateUniqueUid(quoteData.uid);\n\n // Store out of stock warning for the new quote if any items are out of stock\n const hasOutOfStockItems = outOfStockItems.length > 0;\n if (hasOutOfStockItems) {\n sessionStorage.setItem(`duplicate-outOfStock-warning-${duplicatedQuoteUid}`, 'true');\n }\n\n await duplicateQuote({ \n quoteUid: quoteData.uid, \n duplicatedQuoteUid,\n hasOutOfStockItems \n });\n // Success handling is done in the event listener\n } catch (error: any) {\n const errorMessage = getDuplicateErrorMessage(error);\n setDuplicateError(errorMessage);\n }\n }, [quoteData, getDuplicateErrorMessage]);\n\n const handleDismissDuplicateError = useCallback(() => {\n setDuplicateError(null);\n }, []);\n\n const handleDismissDuplicateSuccess = useCallback(() => {\n setDuplicateSuccess(false);\n }, []);\n\n const deleteErrorBanner = deleteError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDeleteErrorHeading}\n description={deleteError}\n onDismiss={handleDismissError}\n data-testid=\"confirmation-modal-error-banner\"\n />\n ) : null;\n\n const deleteSuccessBanner = deleteSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalDeleteSuccessHeading}\n description={dictionary.confirmationModalDeleteSuccessDescription}\n onDismiss={handleDismissSuccess}\n data-testid=\"confirmation-modal-success-banner\"\n />\n ) : null;\n\n const deleteBanner = deleteSuccessBanner || deleteErrorBanner;\n\n const duplicateErrorBanner = duplicateError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDuplicateErrorHeading}\n description={duplicateError}\n onDismiss={handleDismissDuplicateError}\n data-testid=\"confirmation-modal-duplicate-error-banner\"\n />\n ) : null;\n\n const duplicateSuccessBanner = duplicateSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalDuplicateSuccessHeading}\n description={dictionary.confirmationModalDuplicateSuccessDescription}\n onDismiss={handleDismissDuplicateSuccess}\n data-testid=\"confirmation-modal-duplicate-success-banner\"\n />\n ) : null;\n\n const duplicateBanner = duplicateSuccessBanner || duplicateErrorBanner;\n\n const manageNegotiableQuoteProps: ManageNegotiableQuoteComponentProps = {\n ...props,\n loading,\n quoteName,\n quoteStatus,\n banner: (outOfStockWarningBanner || banner) ? (<>{outOfStockWarningBanner}{banner}</>) : undefined,\n details,\n actionBar,\n quoteContent,\n shippingInformationTitle,\n shippingInformation,\n quoteCommentsTitle,\n quoteComments,\n attachFilesField,\n attachedFilesList,\n footer,\n };\n\n // Create banner for close modal based on success/error state\n let closeModalBanner = null;\n if (modalSuccessMessage) {\n closeModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.closeModalSuccessHeading}\n description={modalSuccessMessage}\n data-testid=\"close-quote-success-banner\"\n />\n );\n } else if (modalErrorMessage) {\n closeModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDeleteErrorHeading}\n description={modalErrorMessage}\n data-testid=\"close-quote-error-banner\"\n />\n );\n }\n\n // Create banner for create template modal based on success/error state\n let createTemplateModalBanner = null;\n if (createTemplateSuccessMessage) {\n createTemplateModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.createTemplateModalSuccessHeading}\n description={createTemplateSuccessMessage}\n data-testid=\"create-template-success-banner\"\n />\n );\n } else if (createTemplateErrorMessage) {\n createTemplateModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.createTemplateModalErrorHeading}\n description={createTemplateErrorMessage}\n data-testid=\"create-template-error-banner\"\n />\n );\n }\n\n return (\n <>\n <ManageNegotiableQuoteComponent {...manageNegotiableQuoteProps} />\n {isRenameModalOpen &&\n createPortal(\n <RenameQuoteModal\n open={isRenameModalOpen}\n quoteName={renameQuoteName}\n renameReason={renameReason}\n quoteNameError={renameQuoteNameError}\n errorBanner={renameErrorBanner}\n successBanner={renameSuccessBanner}\n onQuoteNameChange={handleRenameQuoteNameChange}\n onRenameReasonChange={setRenameReason}\n onSave={handleRenameSave}\n onClose={handleRenameClose}\n />,\n document.body\n )}\n {isDeleteDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isDeleteDialogOpen}\n title={dictionary.confirmationModalDeleteTitle}\n message={dictionary.confirmationModalDeleteMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalDeleteConfirm}\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n showCloseButton={!deleteBanner}\n confirmationBanner={deleteBanner}\n />,\n document.body\n )}\n {isDuplicateDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isDuplicateDialogOpen}\n title={dictionary.confirmationModalDuplicateTitle}\n message={dictionary.confirmationModalDuplicateMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalDuplicateConfirm}\n onCancel={handleDuplicateCancel}\n onConfirm={handleDuplicateConfirm}\n showCloseButton={!duplicateBanner}\n confirmationBanner={duplicateBanner}\n />,\n document.body\n )}\n {showCloseModal &&\n createPortal(\n <ConfirmationModal\n open={showCloseModal}\n title={dictionary.closeModalTitle}\n message={dictionary.closeModalMessage}\n cancelLabel={dictionary.closeModalCancel}\n confirmLabel={\n isClosing\n ? dictionary.closeModalConfirmLoading\n : dictionary.closeModalConfirm\n }\n onCancel={handleCloseModalCancel}\n onConfirm={isClosing ? undefined : handleCloseQuote}\n showCloseButton={true}\n confirmationBanner={closeModalBanner}\n data-testid=\"close-quote-confirmation-modal\"\n />,\n document.body\n )}\n {showCreateTemplateModal &&\n createPortal(\n <ConfirmationModal\n open={showCreateTemplateModal}\n title={dictionary.createTemplateModalTitle}\n message={dictionary.createTemplateModalMessage}\n cancelLabel={dictionary.createTemplateModalCancel}\n confirmLabel={\n isCreatingTemplate\n ? dictionary.createTemplateModalConfirmLoading\n : dictionary.createTemplateModalConfirm\n }\n onCancel={handleCreateTemplateModalCancel}\n onConfirm={isCreatingTemplate ? undefined : handleCreateTemplate}\n showCloseButton={true}\n confirmationBanner={createTemplateModalBanner}\n data-testid=\"create-template-confirmation-modal\"\n />,\n document.body\n )}\n {isNoItemsSelectedModalOpen &&\n createPortal(\n <ConfirmationModal\n open={isNoItemsSelectedModalOpen}\n title={dictionary.noItemsSelectedModalTitle}\n message={dictionary.noItemsSelectedModalMessage}\n confirmLabel={dictionary.noItemsSelectedModalConfirm}\n onConfirm={handleCloseNoItemsSelectedModal}\n onClose={handleCloseNoItemsSelectedModal}\n showCloseButton={true}\n data-testid=\"no-items-selected-modal\"\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["ManageNegotiableQuote","className","loading","quoteName","quoteStatus","banner","details","actionBar","quoteContent","shippingInformationTitle","shippingInformation","quoteCommentsTitle","quoteComments","attachFilesField","attachedFilesList","footer","props","ManageNegotiableQuoteSkeleton","jsxs","classes","jsx","VComponent","Skeleton","SkeletonRow","onActionsDropdownChange","slots","onActionsButtonClick","onSendForReview","maxFiles","maxFileSize","acceptedFileTypes","onDuplicateQuote","quoteData","setQuoteData","useState","setLoading","isDeleteDialogOpen","setIsDeleteDialogOpen","deleteError","setDeleteError","deleteSuccess","setDeleteSuccess","isDuplicateDialogOpen","setIsDuplicateDialogOpen","duplicateError","setDuplicateError","duplicateSuccess","setDuplicateSuccess","duplicateOutOfStockWarning","setDuplicateOutOfStockWarning","comment","setComment","isSubmitting","setIsSubmitting","showCloseModal","setShowCloseModal","isClosing","setIsClosing","modalSuccessMessage","setModalSuccessMessage","modalErrorMessage","setModalErrorMessage","showCreateTemplateModal","setShowCreateTemplateModal","isCreatingTemplate","setIsCreatingTemplate","createTemplateSuccessMessage","setCreateTemplateSuccessMessage","createTemplateErrorMessage","setCreateTemplateErrorMessage","isRenameModalOpen","setIsRenameModalOpen","renameQuoteName","setRenameQuoteName","renameReason","setRenameReason","renameError","setRenameError","renameQuoteNameError","setRenameQuoteNameError","renameSuccess","setRenameSuccess","attachedFiles","setAttachedFiles","fileUploadError","setFileUploadError","selectedItemUids","setSelectedItemUids","selectedItemUidsRef","useRef","removeItemsHandlerRef","actionsBarDropdownValue","setActionsBarDropdownValue","actionsBarDropdownValueRef","isNoItemsSelectedModalOpen","setIsNoItemsSelectedModalOpen","useEffect","dictionary","useText","quoteDataEvent","events","data","quote","pendingWarningKey","shippingAddressSetEvent","quoteSentForReviewEvent","quoteItemsRemovedEvent","removedItemUids","prev","next","uid","handleItemCheckboxChange","useCallback","item","isSelected","handleActionsDropdownChange","event","action","currentSelectedUids","itemsToRemove","handleCloseNoItemsSelectedModal","quoteClosedEvent","currentQuoteData","_a","getQuoteData","updatedQuoteData","error","quoteCloseErrorEvent","errorMsg","quoteRenamedEvent","quoteDuplicatedEvent","newQuote","handleAttachFiles","files","file","validateFileSize","formatFileSize","validateFileType","newFiles","i","tempKey","result","uploadFile","f","handleRemoveFile","key","handleRenameClick","handleRenameClose","handleRenameQuoteNameChange","value","handleDuplicateQuote","handleRenameSave","renameNegotiableQuote","useMemo","isLocked","Slot","Edit","bannerMessage","status","bannerContent","InLineAlert","WarningFilled","handleDismissOutOfStockWarning","outOfStockWarningBanner","expirationDate","formattedDate","buttons","handleActionsButtonClick","ActionsBar","button","Button","TabbedContent","ItemsQuoted","handler","isOpen","QuoteCommentsList","QuoteHistoryLog","ShippingAddressDisplay","TextArea","e","isFileUploadDisabled","isDisabled","InputFile","target","fileList","Add","AttachedFilesList","handleCloseQuote","closeNegotiableQuote","handleCloseModalCancel","handleCreateTemplate","createQuoteTemplate","errorMessage","handleCreateTemplateModalCancel","handleSendForReview","successfulAttachments","sendForReview","renameErrorBanner","renameSuccessBanner","CheckWithCircle","getDeleteErrorMessage","handleDeleteCancel","handleDeleteConfirm","operationResults","deleteQuote","failure","res","handleDismissError","handleDismissSuccess","getDuplicateErrorMessage","handleDuplicateCancel","handleDuplicateConfirm","outOfStockItems","duplicatedQuoteUid","originalUid","baseUid","randomSuffix","hasOutOfStockItems","duplicateQuote","handleDismissDuplicateError","handleDismissDuplicateSuccess","deleteErrorBanner","deleteBanner","duplicateErrorBanner","duplicateBanner","manageNegotiableQuoteProps","Fragment","closeModalBanner","createTemplateModalBanner","ManageNegotiableQuoteComponent","createPortal","RenameQuoteModal","ConfirmationModal"],"mappings":"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"}
1
+ {"version":3,"file":"ManageNegotiableQuote.js","sources":["/@dropins/storefront-quote-management/src/containers/ManageNegotiableQuote/ManageNegotiableQuote.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 {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n createPortal,\n} from 'preact/compat';\nimport {\n Container,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\nimport {\n NegotiableQuoteModel,\n CartItemModel,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport {\n ManageNegotiableQuote as ManageNegotiableQuoteComponent,\n ManageNegotiableQuoteProps as ManageNegotiableQuoteComponentProps,\n} from '@/quote-management/components/ManageNegotiableQuote';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n ActionsBar,\n TabbedContent,\n ConfirmationModal,\n AttachedFilesList,\n AttachedFile,\n} from '@/quote-management/components';\nimport { ShippingAddressDisplay } from '@/quote-management/containers/ShippingAddressDisplay';\nimport { QuoteHistoryLog } from '@/quote-management/containers/QuoteHistoryLog';\nimport { ItemsQuoted, QuoteCommentsList } from '@/quote-management/containers';\nimport {\n Button,\n InLineAlert,\n TextArea,\n InputFile,\n} from '@adobe-commerce/elsie/components';\nimport {\n WarningFilled,\n Edit,\n CheckWithCircle,\n Add,\n} from '@adobe-commerce/elsie/icons';\nimport {\n deleteQuote,\n sendForReview,\n renameNegotiableQuote,\n closeNegotiableQuote,\n getQuoteData,\n uploadFile,\n duplicateQuote,\n createQuoteTemplate,\n} from '@/quote-management/api';\nimport {\n formatFileSize,\n validateFileType,\n validateFileSize,\n} from '@/quote-management/utils/fileUtils';\nimport { RenameQuoteModal } from '@/quote-management/components/RenameQuoteModal';\n\nexport interface ManageNegotiableQuoteProps\n extends HTMLAttributes<HTMLDivElement> {\n onActionsDropdownChange?: (event: Event) => void;\n onActionsButtonClick?: (action: string) => void;\n onSendForReview?: (params: {\n quoteData: NegotiableQuoteModel;\n comment?: string;\n attachments?: AttachedFile[];\n }) => void;\n maxFiles?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n onDuplicateQuote?: (params: {\n quoteData: NegotiableQuoteModel;\n newQuote: NegotiableQuoteModel;\n }) => void;\n slots?: {\n QuoteName?: SlotProps<{\n quoteName?: string;\n quoteData?: NegotiableQuoteModel;\n }>;\n QuoteStatus?: SlotProps<{\n quoteStatus?: string;\n quoteData?: NegotiableQuoteModel;\n }>;\n Banner?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n DuplicateQuoteWarningBanner?: SlotProps<{\n outOfStockWarning?: boolean;\n }>;\n Details?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ActionBar?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n actionsBarDropdownValue?: string;\n }>;\n QuoteContent?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ItemsQuotedTab?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n CommentsTab?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n HistoryLogTab?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ShippingInformationTitle?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n ShippingInformation?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n loading?: boolean;\n setLoading?: (loading: boolean) => void;\n }>;\n QuoteCommentsTitle?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n QuoteComments?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n }>;\n AttachFilesField?: SlotProps<{\n onFileChange: (files: File[]) => void;\n attachedFiles: AttachedFile[];\n fileUploadError: string | undefined;\n disabled?: boolean;\n }>;\n AttachedFilesList?: SlotProps<{\n files: AttachedFile[];\n onRemove: (key: string) => void;\n disabled?: boolean;\n }>;\n Footer?: SlotProps<{\n quoteData?: NegotiableQuoteModel;\n comment?: string;\n isSubmitting?: boolean;\n attachments?: AttachedFile[];\n handleSendForReview: () => void;\n }>;\n };\n}\n\nexport const ManageNegotiableQuote: Container<ManageNegotiableQuoteProps> = ({\n onActionsDropdownChange,\n slots,\n onActionsButtonClick,\n onSendForReview,\n maxFiles,\n maxFileSize,\n acceptedFileTypes,\n onDuplicateQuote,\n ...props\n}) => {\n const [quoteData, setQuoteData] = useState<NegotiableQuoteModel | undefined>(\n undefined\n );\n const [loading, setLoading] = useState<boolean>(true);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState<boolean>(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n const [deleteSuccess, setDeleteSuccess] = useState<boolean>(false);\n const [isDuplicateDialogOpen, setIsDuplicateDialogOpen] = useState<boolean>(false);\n const [duplicateError, setDuplicateError] = useState<string | null>(null);\n const [duplicateSuccess, setDuplicateSuccess] = useState<boolean>(false);\n const [duplicateOutOfStockWarning, setDuplicateOutOfStockWarning] = useState<boolean>(false);\n const [comment, setComment] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [showCloseModal, setShowCloseModal] = useState<boolean>(false);\n const [isClosing, setIsClosing] = useState<boolean>(false);\n const [modalSuccessMessage, setModalSuccessMessage] = useState<string>('');\n const [modalErrorMessage, setModalErrorMessage] = useState<string>('');\n const [showCreateTemplateModal, setShowCreateTemplateModal] = useState<boolean>(false);\n const [isCreatingTemplate, setIsCreatingTemplate] = useState<boolean>(false);\n const [createTemplateSuccessMessage, setCreateTemplateSuccessMessage] = useState<string>('');\n const [createTemplateErrorMessage, setCreateTemplateErrorMessage] = useState<string>('');\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [renameQuoteName, setRenameQuoteName] = useState<string>('');\n const [renameReason, setRenameReason] = useState<string>('');\n const [renameError, setRenameError] = useState<string>('');\n const [renameQuoteNameError, setRenameQuoteNameError] = useState<string>('');\n const [renameSuccess, setRenameSuccess] = useState<string>('');\n const [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n const [fileUploadError, setFileUploadError] = useState<string | undefined>(undefined);\n const [selectedItemUids, setSelectedItemUids] = useState<Set<string>>(\n new Set()\n );\n const selectedItemUidsRef = useRef<Set<string>>(selectedItemUids);\n const removeItemsHandlerRef = useRef<\n ((items: CartItemModel[]) => void) | null\n >(null);\n const [actionsBarDropdownValue, setActionsBarDropdownValue] =\n useState<string>('');\n const actionsBarDropdownValueRef = useRef<string>(actionsBarDropdownValue);\n const [isNoItemsSelectedModalOpen, setIsNoItemsSelectedModalOpen] =\n useState<boolean>(false);\n\n // Keep refs in sync with state\n useEffect(() => {\n selectedItemUidsRef.current = selectedItemUids;\n }, [selectedItemUids]);\n\n useEffect(() => {\n actionsBarDropdownValueRef.current = actionsBarDropdownValue;\n }, [actionsBarDropdownValue]);\n\n const dictionary = useText({\n createdLabel: 'NegotiableQuote.Manage.createdLabel',\n salesRepLabel: 'NegotiableQuote.Manage.salesRepLabel',\n expiresLabel: 'NegotiableQuote.Manage.expiresLabel',\n actionsLabel: 'NegotiableQuote.Manage.actionsLabel',\n remove: 'NegotiableQuote.Manage.actions.remove',\n close: 'NegotiableQuote.Manage.actionButtons.close',\n delete: 'NegotiableQuote.Manage.actionButtons.delete',\n print: 'NegotiableQuote.Manage.actionButtons.print',\n createTemplate: 'NegotiableQuote.Manage.actionButtons.createTemplate',\n createCopy: 'NegotiableQuote.Manage.actionButtons.createCopy',\n shippingInformationTitle:\n 'NegotiableQuote.Manage.shippingInformation.title',\n quoteCommentsTitle: 'NegotiableQuote.Manage.quoteComments.title',\n quoteCommentsPlaceholder:\n 'NegotiableQuote.Manage.quoteComments.placeholder',\n sendForReview: 'NegotiableQuote.Manage.actionButtons.sendForReview',\n bannerTitle: 'NegotiableQuote.Manage.bannerTitle',\n statusSubmitted: 'NegotiableQuote.Manage.bannerStatusMessages.submitted',\n statusPending: 'NegotiableQuote.Manage.bannerStatusMessages.pending',\n statusExpired: 'NegotiableQuote.Manage.bannerStatusMessages.expired',\n errorFallback:\n 'NegotiableQuote.Manage.confirmationModal.delete.errorFallback',\n closeSuccessMessage:\n 'NegotiableQuote.Manage.confirmationModal.close.successDescription',\n closeModalTitle: 'NegotiableQuote.Manage.actionButtons.close',\n closeModalMessage: 'NegotiableQuote.Manage.confirmationModal.close.message',\n closeModalCancel: 'NegotiableQuote.Manage.confirmationModal.cancel',\n closeModalConfirm: 'NegotiableQuote.Manage.confirmationModal.close.confirm',\n closeModalConfirmLoading:\n 'NegotiableQuote.Manage.confirmationModal.close.confirmLoading',\n closeModalSuccessHeading:\n 'NegotiableQuote.Manage.confirmationModal.close.successHeading',\n createTemplateModalTitle: 'NegotiableQuote.Manage.actionButtons.createTemplate',\n createTemplateModalMessage: 'NegotiableQuote.Manage.confirmationModal.createTemplate.message',\n createTemplateModalCancel: 'NegotiableQuote.Manage.confirmationModal.cancel',\n createTemplateModalConfirm: 'NegotiableQuote.Manage.confirmationModal.createTemplate.confirm',\n createTemplateModalConfirmLoading:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.confirmLoading',\n createTemplateModalSuccessHeading:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.successHeading',\n createTemplateSuccessMessage:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.successDescription',\n createTemplateModalErrorHeading:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.errorHeading',\n createTemplateErrorFallback:\n 'NegotiableQuote.Manage.confirmationModal.createTemplate.errorFallback',\n renameErrorHeading: 'NegotiableQuote.Manage.rename.errorHeading',\n renameQuoteNameRequired: 'NegotiableQuote.Manage.rename.quoteNameRequired',\n renameErrorDefault: 'NegotiableQuote.Manage.rename.errorDefault',\n renameSuccessHeading: 'NegotiableQuote.Manage.rename.successHeading',\n renameSuccessMessage: 'NegotiableQuote.Manage.rename.successMessage',\n confirmationModalCancel: 'NegotiableQuote.Manage.confirmationModal.cancel',\n confirmationModalDeleteTitle: 'NegotiableQuote.Manage.confirmationModal.delete.title',\n confirmationModalDeleteMessage: 'NegotiableQuote.Manage.confirmationModal.delete.message',\n confirmationModalDeleteConfirm: 'NegotiableQuote.Manage.confirmationModal.delete.confirm',\n confirmationModalDeleteErrorHeading: 'NegotiableQuote.Manage.confirmationModal.delete.errorHeading',\n confirmationModalDeleteErrorFallback: 'NegotiableQuote.Manage.confirmationModal.delete.errorFallback',\n confirmationModalDeleteSuccessHeading: 'NegotiableQuote.Manage.confirmationModal.delete.successHeading',\n confirmationModalDeleteSuccessDescription: 'NegotiableQuote.Manage.confirmationModal.delete.successDescription',\n confirmationModalDuplicateTitle: 'NegotiableQuote.Manage.confirmationModal.duplicate.title',\n confirmationModalDuplicateMessage: 'NegotiableQuote.Manage.confirmationModal.duplicate.message',\n confirmationModalDuplicateConfirm: 'NegotiableQuote.Manage.confirmationModal.duplicate.confirm',\n confirmationModalDuplicateErrorHeading: 'NegotiableQuote.Manage.confirmationModal.duplicate.errorHeading',\n confirmationModalDuplicateErrorFallback: 'NegotiableQuote.Manage.confirmationModal.duplicate.errorFallback',\n confirmationModalDuplicateSuccessHeading: 'NegotiableQuote.Manage.confirmationModal.duplicate.successHeading',\n confirmationModalDuplicateSuccessDescription: 'NegotiableQuote.Manage.confirmationModal.duplicate.successDescription',\n duplicateOutOfStockWarningHeading: 'NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningHeading',\n duplicateOutOfStockWarningMessage: 'NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningMessage',\n noItemsSelectedModalTitle: 'NegotiableQuote.Manage.confirmationModal.noItemsSelected.title',\n noItemsSelectedModalMessage: 'NegotiableQuote.Manage.confirmationModal.noItemsSelected.message',\n noItemsSelectedModalConfirm: 'NegotiableQuote.Manage.confirmationModal.noItemsSelected.confirm',\n attachFiles: 'NegotiableQuote.Manage.attachFiles',\n fileUploadError: 'NegotiableQuote.Manage.fileUploadError',\n maxFilesExceeded: 'NegotiableQuote.Manage.maxFilesExceeded',\n maxFileSizeExceeded: 'NegotiableQuote.Manage.maxFileSizeExceeded',\n invalidFileType: 'NegotiableQuote.Manage.invalidFileType',\n });\n /* Event listeners */\n useEffect(() => {\n const quoteDataEvent = events.on(\n 'quote-management/quote-data',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n if (quote) {\n setQuoteData(quote);\n setLoading(false);\n\n // Check for pending out of stock warning from duplication\n const pendingWarningKey = `duplicate-outOfStock-warning-${quote.uid}`;\n const pendingWarning = sessionStorage.getItem(pendingWarningKey);\n if (pendingWarning === 'true') {\n setDuplicateOutOfStockWarning(true);\n sessionStorage.removeItem(pendingWarningKey);\n }\n }\n },\n {\n eager: true,\n }\n );\n return () => quoteDataEvent?.off();\n }, []);\n\n // Listen for shipping address set event\n useEffect(() => {\n const shippingAddressSetEvent = events.on(\n 'quote-management/shipping-address-set',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n if (quote) {\n setQuoteData(quote);\n }\n },\n {\n eager: true,\n }\n );\n return () => shippingAddressSetEvent?.off();\n }, []);\n\n // Listen for quote sent for review event\n useEffect(() => {\n const quoteSentForReviewEvent = events.on(\n 'quote-management/quote-sent-for-review',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n setQuoteData(quote);\n setComment(''); // Reset comment after successful submission\n setAttachedFiles([]); // Clear attachments after successful submission\n setIsSubmitting(false);\n },\n {\n eager: true,\n }\n );\n return () => quoteSentForReviewEvent?.off();\n }, []);\n\n // Listen for quote items removed event\n useEffect(() => {\n const quoteItemsRemovedEvent = events.on(\n 'quote-management/quote-items-removed',\n (data: { quote: NegotiableQuoteModel; removedItemUids: string[] }) => {\n const { quote, removedItemUids } = data;\n /* istanbul ignore else */ // Always has quote in real usage; covered in integration tests\n if (quote) {\n setQuoteData(quote);\n }\n // Clear selected items that were removed\n /* istanbul ignore else */ // Always has removedItemUids in real usage; covered in integration tests\n if (removedItemUids) {\n setSelectedItemUids((prev) => {\n const next = new Set(prev);\n removedItemUids.forEach((uid) => next.delete(uid));\n return next;\n });\n }\n },\n {\n eager: true,\n }\n );\n return () => quoteItemsRemovedEvent?.off();\n }, []);\n\n /**\n * Handlers\n */\n const handleItemCheckboxChange = useCallback(\n (item: CartItemModel, isSelected: boolean) => {\n setSelectedItemUids((prev) => {\n const next = new Set(prev);\n if (isSelected) {\n next.add(item.uid);\n } else {\n next.delete(item.uid);\n }\n return next;\n });\n },\n []\n );\n\n const handleActionsDropdownChange = useCallback(\n (event: Event) => {\n const action = (event.target as HTMLSelectElement).value;\n const currentSelectedUids = selectedItemUidsRef.current;\n /* istanbul ignore else */ if (action === 'remove') {\n setActionsBarDropdownValue(action);\n actionsBarDropdownValueRef.current = action; // Update ref immediately\n /* istanbul ignore next */ if (currentSelectedUids.size === 0) {\n // No items selected - show warning modal\n setIsNoItemsSelectedModalOpen(true);\n } else if (quoteData && removeItemsHandlerRef.current) {\n // Items selected - proceed with removal\n const itemsToRemove = quoteData.items.filter((item) =>\n currentSelectedUids.has(item.uid)\n );\n /* istanbul ignore next */ removeItemsHandlerRef.current(\n itemsToRemove\n );\n }\n }\n onActionsDropdownChange?.(event);\n },\n [onActionsDropdownChange, quoteData]\n );\n\n /* istanbul ignore next */ const handleCloseNoItemsSelectedModal =\n useCallback(() => {\n setIsNoItemsSelectedModalOpen(false);\n setActionsBarDropdownValue('');\n actionsBarDropdownValueRef.current = '';\n }, []);\n\n // Listen for quote closed event\n useEffect(() => {\n const quoteClosedEvent = events.on(\n 'quote-management/negotiable-quote-closed',\n async (data: { closedQuoteUids: string[] }) => {\n setIsClosing(false);\n setModalErrorMessage('');\n // Show success message in modal\n setModalSuccessMessage(dictionary.closeSuccessMessage);\n\n // Refresh quote data if the current quote was closed\n // Use a function to get the current quoteData to avoid stale closure\n setQuoteData((currentQuoteData) => {\n if (\n currentQuoteData?.uid &&\n data.closedQuoteUids?.includes(currentQuoteData.uid)\n ) {\n // Trigger async refresh\n getQuoteData(currentQuoteData.uid)\n .then((updatedQuoteData) => {\n setQuoteData(updatedQuoteData);\n })\n .catch((error) => {\n console.warn(\n 'Failed to refresh quote data after closure:',\n error\n );\n });\n }\n return currentQuoteData; // Return current data unchanged for this setter call\n });\n\n // Close modal and redirect after a delay to show success message\n setTimeout(() => {\n setShowCloseModal(false);\n setModalSuccessMessage('');\n }, 2000);\n },\n {\n eager: true,\n }\n );\n return () => quoteClosedEvent?.off();\n }, [dictionary.closeSuccessMessage]);\n\n // Listen for quote close error event\n useEffect(() => {\n const quoteCloseErrorEvent = events.on(\n 'quote-management/negotiable-quote-close-error',\n (data: { error: Error; attemptedQuoteUids: string[] }) => {\n console.log('Close error event received:', data);\n setIsClosing(false);\n setModalSuccessMessage('');\n const errorMsg = data.error.message || dictionary.errorFallback;\n setModalErrorMessage(errorMsg);\n },\n {\n eager: true,\n }\n );\n return () => quoteCloseErrorEvent?.off();\n }, [dictionary.errorFallback]);\n\n // Listen for quote renamed event\n useEffect(() => {\n const quoteRenamedEvent = events.on(\n 'quote-management/quote-renamed',\n (data: { quote: NegotiableQuoteModel }) => {\n const { quote } = data;\n setQuoteData(quote);\n setRenameError('');\n setRenameQuoteNameError('');\n setRenameSuccess(dictionary.renameSuccessMessage);\n\n // Wait 2 seconds before closing the modal\n setTimeout(() => {\n setIsRenameModalOpen(false);\n setRenameQuoteName('');\n setRenameReason('');\n setRenameSuccess('');\n }, 2000);\n },\n {\n eager: true,\n }\n );\n return () => quoteRenamedEvent?.off();\n }, [dictionary.renameSuccessMessage]);\n\n // Listen for quote duplicated event\n useEffect(() => {\n const quoteDuplicatedEvent = events.on(\n 'quote-management/quote-duplicated',\n (data: {\n quote: NegotiableQuoteModel;\n input: { quoteUid: string; duplicatedQuoteUid: string };\n }) => {\n const { quote: newQuote } = data;\n\n // Call parent callback if provided\n if (quoteData && onDuplicateQuote) {\n onDuplicateQuote({ quoteData, newQuote });\n }\n\n // Show success in modal\n setDuplicateSuccess(true);\n setDuplicateError(null);\n\n // Close modal after showing success message\n // Navigation is handled by the application layer listening to quote-duplicated event\n setTimeout(() => {\n setIsDuplicateDialogOpen(false);\n setDuplicateSuccess(false);\n setDuplicateError(null);\n }, 2000);\n },\n {\n eager: true,\n }\n );\n return () => quoteDuplicatedEvent?.off();\n }, [quoteData, onDuplicateQuote]);\n\n /**\n * File upload handlers\n */\n\n const handleAttachFiles = useCallback(async (files: File[]) => {\n // Check maxFiles limit\n if (maxFiles && attachedFiles.length + files.length > maxFiles) {\n setFileUploadError(dictionary.maxFilesExceeded.replace('{maxFiles}', String(maxFiles)));\n return;\n }\n\n // Validate file types and sizes before uploading\n for (const file of files) {\n if (maxFileSize && !validateFileSize(file.size, maxFileSize)) {\n setFileUploadError(\n dictionary.maxFileSizeExceeded.replace('{maxSize}', formatFileSize(maxFileSize))\n );\n return;\n }\n\n if (acceptedFileTypes && !validateFileType(file.type, acceptedFileTypes)) {\n setFileUploadError(dictionary.invalidFileType);\n return;\n }\n }\n\n setFileUploadError(undefined);\n\n // Add files with 'uploading' status\n const newFiles: AttachedFile[] = files.map(file => ({\n key: `temp-${Date.now()}-${Math.random()}-${file.name}`,\n name: file.name,\n size: file.size,\n status: 'uploading',\n }));\n\n setAttachedFiles(prev => [...prev, ...newFiles]);\n\n // Upload each file and update its status\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const tempKey = newFiles[i].key;\n\n try {\n const result = await uploadFile(file);\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, key: result.key, status: 'success' }\n : f\n ));\n } catch (error) {\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, status: 'error', error: (error as Error).message }\n : f\n ));\n }\n }\n }, [maxFiles, maxFileSize, acceptedFileTypes, attachedFiles, dictionary]);\n\n const handleRemoveFile = useCallback((key: string) => {\n setAttachedFiles(prev => prev.filter(f => f.key !== key));\n }, []);\n\n /**\n * VNodes for the ManageNegotiableQuote component\n */\n\n // Rename handlers\n const handleRenameClick = useCallback(() => {\n setRenameQuoteName(quoteData?.name || '');\n setRenameReason('');\n setRenameError('');\n setRenameQuoteNameError('');\n setRenameSuccess('');\n setIsRenameModalOpen(true);\n }, [quoteData]);\n\n const handleRenameClose = useCallback(() => {\n setIsRenameModalOpen(false);\n setRenameQuoteName('');\n setRenameReason('');\n setRenameError('');\n setRenameQuoteNameError('');\n setRenameSuccess('');\n }, []);\n\n const handleRenameQuoteNameChange = useCallback((value: string) => {\n setRenameQuoteName(value);\n if (value.trim()) {\n setRenameQuoteNameError('');\n }\n }, []);\n\n const handleDuplicateQuote = useCallback(() => {\n // Show confirmation modal\n setIsDuplicateDialogOpen(true);\n setDuplicateError(null);\n setDuplicateSuccess(false);\n }, []);\n\n const handleRenameSave = useCallback(async () => {\n // Validate quote name\n if (!renameQuoteName.trim()) {\n setRenameQuoteNameError(dictionary.renameQuoteNameRequired);\n return;\n }\n\n try {\n setRenameError('');\n setRenameQuoteNameError('');\n await renameNegotiableQuote({\n quoteUid: quoteData!.uid,\n quoteName: renameQuoteName,\n quoteComment: renameReason.trim() || undefined,\n });\n // The quote-renamed event will handle closing the modal and updating state\n } catch (error) {\n setRenameError((error as Error).message || dictionary.renameErrorDefault);\n }\n }, [\n quoteData,\n renameQuoteName,\n renameReason,\n dictionary.renameQuoteNameRequired,\n dictionary.renameErrorDefault,\n ]);\n\n // Quote name with rename icon\n const quoteName = useMemo(() => {\n // Priority 1: Check lockedForEditing if explicitly set\n // Priority 2: Fall back to status check\n const isLocked =\n quoteData &&\n // If lockedForEditing is explicitly set, use it\n (quoteData.lockedForEditing === true ||\n // Otherwise, lock based on status\n (quoteData.lockedForEditing === undefined &&\n (quoteData.status === 'SUBMITTED' ||\n quoteData.status === 'PENDING' ||\n quoteData.status === 'ORDERED' ||\n quoteData.status === 'CLOSED')));\n\n return (\n <Slot\n name=\"QuoteName\"\n slot={slots?.QuoteName}\n context={{ quoteName: quoteData?.name, quoteData }}\n >\n <div className=\"quote-management-manage-negotiable-quote__quote-name-wrapper\">\n <h1\n data-testid=\"quote-name\"\n className=\"quote-management-manage-negotiable-quote__quote-name-title\"\n >\n {quoteData?.name}\n </h1>\n <button\n onClick={handleRenameClick}\n disabled={isLocked}\n data-testid=\"rename-quote-button\"\n className=\"quote-management-manage-negotiable-quote__rename-button\"\n aria-label=\"Rename quote\"\n >\n <Edit />\n </button>\n </div>\n </Slot>\n );\n }, [slots?.QuoteName, quoteData, handleRenameClick]);\n\n // Quote status\n const quoteStatus = useMemo(() => {\n return (\n <Slot\n name=\"QuoteStatus\"\n slot={slots?.QuoteStatus}\n context={{ quoteStatus: quoteData?.status, quoteData }}\n >\n <div data-testid=\"quote-status\">{quoteData?.status}</div>\n </Slot>\n );\n }, [slots?.QuoteStatus, quoteData]);\n\n // Banner\n const getBannerStatusMessage = useCallback(\n (status: string | undefined) => {\n switch (status) {\n case 'SUBMITTED':\n return dictionary.statusSubmitted;\n case 'PENDING':\n return dictionary.statusPending;\n case 'EXPIRED':\n return dictionary.statusExpired;\n default:\n return null;\n }\n },\n [dictionary]\n );\n\n const bannerMessage = getBannerStatusMessage(quoteData?.status);\n\n const bannerContent = bannerMessage && (\n <InLineAlert\n type=\"warning\"\n variant=\"secondary\"\n icon={<WarningFilled />}\n heading={dictionary.bannerTitle}\n description={bannerMessage}\n />\n );\n\n const banner = bannerContent && (\n <Slot\n name=\"Banner\"\n data-testid=\"banner\"\n slot={slots?.Banner}\n context={{ quoteData }}\n >\n {bannerContent}\n </Slot>\n );\n\n // Handler for dismissing out of stock warning\n const handleDismissOutOfStockWarning = useCallback(() => {\n setDuplicateOutOfStockWarning(false);\n }, []);\n\n // Out of stock warning banner for duplicated quotes\n const outOfStockWarningBanner = duplicateOutOfStockWarning && (\n <Slot\n name=\"DuplicateQuoteWarningBanner\"\n data-testid=\"duplicate-outOfStock-warning-banner\"\n slot={slots?.DuplicateQuoteWarningBanner}\n context={{ outOfStockWarning: duplicateOutOfStockWarning }}\n >\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.duplicateOutOfStockWarningHeading}\n description={dictionary.duplicateOutOfStockWarningMessage}\n onDismiss={handleDismissOutOfStockWarning}\n data-testid=\"duplicate-outOfStock-warning-alert\"\n />\n </Slot>\n );\n\n // Details\n const details = useMemo(() => {\n if (!quoteData) {\n return;\n }\n\n // Some quotes, such as draft quotes, don't have a date formatted expiration date\n const expirationDate = quoteData.expirationDate ? formattedDate(quoteData.expirationDate, 'short') : undefined;\n\n return (\n <Slot name=\"Details\" slot={slots?.Details} context={{ quoteData }}>\n <div className=\"quote-management-manage-negotiable-quote__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote__detail-title\"\n data-testid=\"created-label\"\n >\n {dictionary.createdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote__detail-content\"\n data-testid=\"created-value\"\n >\n {formattedDate(quoteData!.createdAt, 'short')} (\n {quoteData!.buyer.firstname} {quoteData!.buyer.lastname})\n </span>\n </div>\n <div className=\"quote-management-manage-negotiable-quote__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote__detail-title\"\n data-testid=\"sales-rep-label\"\n >\n {dictionary.salesRepLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote__detail-content\"\n data-testid=\"sales-rep-value\"\n >\n {quoteData!.salesRepName}\n </span>\n </div>\n <div className=\"quote-management-manage-negotiable-quote__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote__detail-title\"\n data-testid=\"expires-label\"\n >\n {dictionary.expiresLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote__detail-content\"\n data-testid=\"expires-value\"\n >\n {expirationDate}\n </span>\n </div>\n </Slot>\n );\n }, [slots?.Details, dictionary, quoteData]);\n\n // Action bar\n const buttons: { label: string; value: string; disabled?: boolean }[] =\n useMemo(() => {\n return [\n {\n label: dictionary.close,\n value: 'close',\n disabled: !quoteData?.canClose,\n },\n {\n label: dictionary.delete,\n value: 'delete',\n disabled: !quoteData?.canDelete,\n },\n {\n label: dictionary.print,\n value: 'print',\n },\n {\n label: dictionary.createTemplate,\n value: 'createTemplate',\n disabled: Boolean(quoteData?.templateName),\n },\n {\n label: dictionary.createCopy,\n value: 'createCopy',\n disabled: Boolean(quoteData?.templateName),\n },\n ];\n }, [dictionary, quoteData?.canDelete, quoteData?.canClose, quoteData?.templateName]);\n const actionBar = useMemo(() => {\n const handleActionsButtonClick = (action: string) => {\n switch (action) {\n case 'close':\n setShowCloseModal(true);\n setModalErrorMessage(''); // Clear modal errors\n setModalSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n case 'delete':\n setIsDeleteDialogOpen(true);\n onActionsButtonClick?.(action);\n break;\n case 'print':\n onActionsButtonClick?.(action);\n break;\n case 'createTemplate':\n setShowCreateTemplateModal(true);\n setCreateTemplateErrorMessage(''); // Clear modal errors\n setCreateTemplateSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n case 'createCopy':\n handleDuplicateQuote();\n onActionsButtonClick?.(action);\n break;\n }\n };\n return (\n <Slot\n name=\"ActionBar\"\n slot={slots?.ActionBar}\n context={{ quoteData, actionsBarDropdownValue }}\n >\n <ActionsBar\n dropdownPlaceholder={dictionary.actionsLabel}\n dropdownOptions={[\n {\n label: dictionary.remove,\n value: 'remove',\n },\n ]}\n dropdownValue={actionsBarDropdownValue}\n handleDropdownChange={handleActionsDropdownChange}\n buttons={buttons.map((button) => (\n <Button\n key={button.value}\n variant=\"tertiary\"\n onClick={() => handleActionsButtonClick(button.value)}\n data-testid={`actions-bar-${button.value}-button`}\n data-action={button.value}\n disabled={button.disabled}\n >\n {button.label}\n </Button>\n ))}\n />\n </Slot>\n );\n }, [\n buttons,\n dictionary,\n slots?.ActionBar,\n quoteData,\n handleActionsDropdownChange,\n onActionsButtonClick,\n handleDuplicateQuote,\n actionsBarDropdownValue,\n ]);\n\n // Quote content\n const quoteContent = useMemo(() => {\n return (\n <Slot\n name=\"QuoteContent\"\n slot={slots?.QuoteContent}\n context={{ quoteData }}\n >\n <TabbedContent\n tabs={\n new Map([\n ['items-quoted', 'Items Quoted'],\n ['comments', 'Comments'],\n ['history-log', 'History Log'],\n ])\n }\n tabsContent={\n new Map([\n [\n 'items-quoted',\n <Slot\n key=\"items-quoted\"\n name=\"ItemsQuotedTab\"\n slot={slots?.ItemsQuotedTab}\n context={{ quoteData }}\n >\n <ItemsQuoted\n quoteData={quoteData}\n onItemCheckboxChange={handleItemCheckboxChange}\n onRemoveItemsRef={(handler) => {\n removeItemsHandlerRef.current = handler;\n }}\n onRemoveModalStateChange={\n /* istanbul ignore next */ (isOpen) => {\n if (\n !isOpen &&\n actionsBarDropdownValueRef.current === 'remove'\n ) {\n setActionsBarDropdownValue('');\n }\n }\n }\n />\n </Slot>,\n ],\n [\n 'comments',\n <Slot\n key=\"comments\"\n name=\"CommentsTab\"\n slot={slots?.CommentsTab}\n context={{ quoteData }}\n >\n <QuoteCommentsList quoteData={quoteData} />\n </Slot>,\n ],\n [\n 'history-log',\n <Slot\n key=\"history-log\"\n name=\"HistoryLogTab\"\n slot={slots?.HistoryLogTab}\n context={{ quoteData }}\n >\n <QuoteHistoryLog quoteData={quoteData} />\n </Slot>,\n ],\n ])\n }\n />\n </Slot>\n );\n }, [\n slots?.QuoteContent,\n slots?.HistoryLogTab,\n slots?.CommentsTab,\n slots?.ItemsQuotedTab,\n quoteData,\n handleItemCheckboxChange,\n ]);\n\n // Shipping information title\n const shippingInformationTitle = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformationTitle\"\n slot={slots?.ShippingInformationTitle}\n context={{ quoteData }}\n >\n <h2>{dictionary.shippingInformationTitle}</h2>\n </Slot>\n );\n }, [slots?.ShippingInformationTitle, quoteData, dictionary]);\n\n // Shipping information\n const shippingInformation = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformation\"\n slot={slots?.ShippingInformation}\n context={{ quoteData, loading, setLoading }}\n >\n <ShippingAddressDisplay\n shippingAddress={quoteData?.shippingAddresses?.[0]}\n loading={loading}\n data-testid=\"manage-quote-shipping-address\"\n />\n </Slot>\n );\n }, [slots?.ShippingInformation, quoteData, loading, setLoading]);\n\n // Quote comments title\n const quoteCommentsTitle = useMemo(() => {\n return (\n <Slot\n name=\"QuoteCommentsTitle\"\n slot={slots?.QuoteCommentsTitle}\n context={{ quoteData }}\n >\n <h2>{dictionary.quoteCommentsTitle}</h2>\n </Slot>\n );\n }, [slots?.QuoteCommentsTitle, dictionary, quoteData]);\n\n // Quote comments\n const quoteComments = useMemo(() => {\n return (\n <Slot\n name=\"QuoteComments\"\n slot={slots?.QuoteComments}\n context={{ quoteData }}\n >\n <TextArea\n name=\"quoteComments\"\n placeholder={dictionary.quoteCommentsPlaceholder}\n rows={3}\n value={comment}\n onInput={(e) => {\n setComment((e.target as HTMLTextAreaElement).value);\n }}\n disabled={!quoteData?.canSendForReview || isSubmitting}\n />\n </Slot>\n );\n }, [slots?.QuoteComments, dictionary, quoteData, comment, isSubmitting]);\n\n // File upload should be disabled when quote cannot be sent for review\n // (which already includes the status and permission checks from the transformer)\n const isFileUploadDisabled = useMemo(() => {\n return !quoteData?.canSendForReview;\n }, [quoteData]);\n\n // File upload input\n const attachFilesField = useMemo(() => {\n // Check if button should be visually disabled\n const isDisabled = isSubmitting || isFileUploadDisabled;\n\n return (\n <Slot\n name=\"AttachFilesField\"\n slot={slots?.AttachFilesField}\n context={{ onFileChange: handleAttachFiles, attachedFiles, fileUploadError, disabled: isDisabled }}\n >\n <div \n className=\"quote-management-manage-negotiable-quote__attach-files\"\n {...(isDisabled ? { 'data-disabled': true } : {})}\n aria-disabled={isDisabled}\n >\n <InputFile\n id=\"manage-quote-attach-files\"\n multiple\n onChange={(e: Event) => {\n const target = e.target as HTMLInputElement;\n const fileList = target?.files;\n const files = fileList ? Array.from(fileList) : [];\n if (files.length > 0) {\n void handleAttachFiles(files);\n }\n }}\n icon={<Add />}\n disabled={isDisabled}\n data-testid=\"manage-quote-attach-files\"\n accept={acceptedFileTypes?.join(',')}\n >\n {dictionary.attachFiles}\n </InputFile>\n {fileUploadError && (\n <div\n className=\"quote-management-manage-negotiable-quote__file-error\"\n data-testid=\"file-upload-error\"\n >\n {fileUploadError}\n </div>\n )}\n </div>\n </Slot>\n );\n }, [\n slots?.AttachFilesField,\n handleAttachFiles,\n isSubmitting,\n isFileUploadDisabled,\n acceptedFileTypes,\n fileUploadError,\n dictionary,\n attachedFiles,\n ]);\n\n // Attached files list\n const attachedFilesList = useMemo(() => {\n if (!attachedFiles.length) return undefined;\n\n return (\n <Slot\n name=\"AttachedFilesList\"\n slot={slots?.AttachedFilesList}\n context={{ files: attachedFiles, onRemove: handleRemoveFile, disabled: isSubmitting }}\n >\n <AttachedFilesList\n files={attachedFiles}\n onRemove={handleRemoveFile}\n disabled={isSubmitting}\n />\n </Slot>\n );\n }, [attachedFiles, handleRemoveFile, isSubmitting, slots?.AttachedFilesList]);\n\n // Close quote handler - only called when quoteData exists\n const handleCloseQuote = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n setIsClosing(true);\n setModalErrorMessage('');\n setModalSuccessMessage('');\n try {\n await closeNegotiableQuote({\n quoteUids: [quoteData!.uid],\n });\n } catch (error) {\n console.error('Failed to close quote:', error);\n }\n }, [quoteData]);\n\n const handleCloseModalCancel = useCallback(() => {\n setShowCloseModal(false);\n setModalErrorMessage('');\n setModalSuccessMessage('');\n }, []);\n\n // Create template handler\n const handleCreateTemplate = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n setIsCreatingTemplate(true);\n setCreateTemplateErrorMessage('');\n setCreateTemplateSuccessMessage('');\n try {\n await createQuoteTemplate(quoteData.uid);\n // Show success message\n setCreateTemplateSuccessMessage(dictionary.createTemplateSuccessMessage);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setShowCreateTemplateModal(false);\n setCreateTemplateSuccessMessage('');\n }, 2000);\n } catch (error) {\n console.error('Failed to create quote template:', error);\n const errorMessage =\n error instanceof Error ? error.message : dictionary.createTemplateErrorFallback;\n setCreateTemplateErrorMessage(errorMessage);\n } finally {\n setIsCreatingTemplate(false);\n }\n }, [quoteData, dictionary.createTemplateSuccessMessage, dictionary.createTemplateErrorFallback]);\n\n const handleCreateTemplateModalCancel = useCallback(() => {\n setShowCreateTemplateModal(false);\n setCreateTemplateErrorMessage('');\n setCreateTemplateSuccessMessage('');\n }, []);\n\n // Footer\n const handleSendForReview = useCallback(async () => {\n const successfulAttachments = attachedFiles.filter(f => f.status === 'success');\n\n // If override prop is provided, use it instead of the API\n if (onSendForReview) {\n onSendForReview({\n quoteData: quoteData!,\n comment: comment.trim() || undefined,\n attachments: successfulAttachments.length ?\n successfulAttachments :\n undefined,\n });\n return;\n }\n\n // Otherwise, use the sendForReview API\n setIsSubmitting(true);\n try {\n await sendForReview({\n quoteUid: quoteData!.uid,\n comment: comment.trim() || undefined,\n attachments: successfulAttachments.length\n ? successfulAttachments.map(f => ({ key: f.key }))\n : undefined,\n });\n // The quote-sent-for-review event will handle updating state\n } catch (error) {\n console.error('Failed to send quote for review:', error);\n setIsSubmitting(false);\n // TODO: Show error notification to user\n }\n }, [quoteData, onSendForReview, comment, attachedFiles]);\n\n const footer = useMemo(() => {\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ quoteData, comment, isSubmitting, attachments: attachedFiles, handleSendForReview }}\n >\n <Button\n variant=\"primary\"\n onClick={handleSendForReview}\n data-testid=\"send-for-review-button\"\n disabled={!quoteData?.canSendForReview || isSubmitting}\n >\n {dictionary.sendForReview}\n </Button>\n </Slot>\n );\n }, [\n slots?.Footer,\n dictionary,\n quoteData,\n comment,\n isSubmitting,\n attachedFiles,\n handleSendForReview,\n ]);\n\n // Rename modal error banner\n const renameErrorBanner = useMemo(\n () =>\n renameError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled color=\"var(--color-error)\" />}\n heading={dictionary.renameErrorHeading}\n description={renameError}\n />\n ) : undefined,\n [renameError, dictionary.renameErrorHeading]\n );\n\n // Rename modal success banner\n const renameSuccessBanner = useMemo(\n () =>\n renameSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.renameSuccessHeading}\n description={renameSuccess}\n />\n ) : undefined,\n [renameSuccess, dictionary.renameSuccessHeading]\n );\n\n // Delete quote functionality\n const getDeleteErrorMessage = useCallback(\n (error: any): string => {\n // If it's an operation failure with errors array, get the first error message\n if (\n error.errors &&\n Array.isArray(error.errors) &&\n error.errors.length > 0\n ) {\n return (\n error.errors[0].message ||\n dictionary.confirmationModalDeleteErrorFallback\n );\n }\n // Otherwise use the error message or fallback\n return error?.message || dictionary.confirmationModalDeleteErrorFallback;\n },\n [dictionary.confirmationModalDeleteErrorFallback]\n );\n\n const handleDeleteCancel = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeleteError(null);\n setDeleteSuccess(false);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n\n setDeleteError(null);\n setDeleteSuccess(false);\n\n try {\n const { operationResults } = await deleteQuote(quoteData.uid);\n\n const failure = operationResults.find(\n (res: any) => res.__typename === 'DeleteNegotiableQuoteOperationFailure'\n ) as any;\n if (failure) {\n const errorMessage = getDeleteErrorMessage(failure);\n setDeleteError(errorMessage);\n return;\n }\n\n setDeleteSuccess(true);\n } catch (error: any) {\n const errorMessage = getDeleteErrorMessage(error);\n setDeleteError(errorMessage);\n }\n }, [quoteData, getDeleteErrorMessage]);\n\n const handleDismissError = useCallback(() => {\n setDeleteError(null);\n }, []);\n\n const handleDismissSuccess = useCallback(() => {\n setDeleteSuccess(false);\n }, []);\n\n // Duplicate quote functionality\n const getDuplicateErrorMessage = useCallback((error: any): string => {\n return error?.message || dictionary.confirmationModalDuplicateErrorFallback;\n }, [dictionary.confirmationModalDuplicateErrorFallback]);\n\n const handleDuplicateCancel = useCallback(() => {\n setIsDuplicateDialogOpen(false);\n setDuplicateError(null);\n setDuplicateSuccess(false);\n }, []);\n\n const handleDuplicateConfirm = useCallback(async () => {\n if (!quoteData?.uid) {\n return;\n }\n\n setDuplicateError(null);\n setDuplicateSuccess(false);\n\n try {\n // Check for out of stock items before duplication\n /* istanbul ignore next */\n const outOfStockItems = quoteData.items?.filter((item) => item.outOfStock) || [];\n\n // Generate a unique duplicated quote UID by replacing the last 8 characters\n const generateUniqueUid = (originalUid: string): string => {\n const baseUid = originalUid.slice(0, -8); // Remove last 8 characters\n const randomSuffix = crypto.randomUUID().slice(0, 8);\n return baseUid + randomSuffix;\n };\n \n const duplicatedQuoteUid = generateUniqueUid(quoteData.uid);\n\n // Store out of stock warning for the new quote if any items are out of stock\n const hasOutOfStockItems = outOfStockItems.length > 0;\n if (hasOutOfStockItems) {\n sessionStorage.setItem(`duplicate-outOfStock-warning-${duplicatedQuoteUid}`, 'true');\n }\n\n await duplicateQuote({ \n quoteUid: quoteData.uid, \n duplicatedQuoteUid,\n hasOutOfStockItems \n });\n // Success handling is done in the event listener\n } catch (error: any) {\n const errorMessage = getDuplicateErrorMessage(error);\n setDuplicateError(errorMessage);\n }\n }, [quoteData, getDuplicateErrorMessage]);\n\n const handleDismissDuplicateError = useCallback(() => {\n setDuplicateError(null);\n }, []);\n\n const handleDismissDuplicateSuccess = useCallback(() => {\n setDuplicateSuccess(false);\n }, []);\n\n const deleteErrorBanner = deleteError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDeleteErrorHeading}\n description={deleteError}\n onDismiss={handleDismissError}\n data-testid=\"confirmation-modal-error-banner\"\n />\n ) : null;\n\n const deleteSuccessBanner = deleteSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalDeleteSuccessHeading}\n description={dictionary.confirmationModalDeleteSuccessDescription}\n onDismiss={handleDismissSuccess}\n data-testid=\"confirmation-modal-success-banner\"\n />\n ) : null;\n\n const deleteBanner = deleteSuccessBanner || deleteErrorBanner;\n\n const duplicateErrorBanner = duplicateError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDuplicateErrorHeading}\n description={duplicateError}\n onDismiss={handleDismissDuplicateError}\n data-testid=\"confirmation-modal-duplicate-error-banner\"\n />\n ) : null;\n\n const duplicateSuccessBanner = duplicateSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalDuplicateSuccessHeading}\n description={dictionary.confirmationModalDuplicateSuccessDescription}\n onDismiss={handleDismissDuplicateSuccess}\n data-testid=\"confirmation-modal-duplicate-success-banner\"\n />\n ) : null;\n\n const duplicateBanner = duplicateSuccessBanner || duplicateErrorBanner;\n\n const manageNegotiableQuoteProps: ManageNegotiableQuoteComponentProps = {\n ...props,\n loading,\n quoteName,\n quoteStatus,\n banner: (outOfStockWarningBanner || banner) ? (<>{outOfStockWarningBanner}{banner}</>) : undefined,\n details,\n actionBar,\n quoteContent,\n shippingInformationTitle,\n shippingInformation,\n quoteCommentsTitle,\n quoteComments,\n attachFilesField,\n attachedFilesList,\n footer,\n };\n\n // Create banner for close modal based on success/error state\n let closeModalBanner = null;\n if (modalSuccessMessage) {\n closeModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.closeModalSuccessHeading}\n description={modalSuccessMessage}\n data-testid=\"close-quote-success-banner\"\n />\n );\n } else if (modalErrorMessage) {\n closeModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDeleteErrorHeading}\n description={modalErrorMessage}\n data-testid=\"close-quote-error-banner\"\n />\n );\n }\n\n // Create banner for create template modal based on success/error state\n let createTemplateModalBanner = null;\n if (createTemplateSuccessMessage) {\n createTemplateModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.createTemplateModalSuccessHeading}\n description={createTemplateSuccessMessage}\n data-testid=\"create-template-success-banner\"\n />\n );\n } else if (createTemplateErrorMessage) {\n createTemplateModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.createTemplateModalErrorHeading}\n description={createTemplateErrorMessage}\n data-testid=\"create-template-error-banner\"\n />\n );\n }\n\n return (\n <>\n <ManageNegotiableQuoteComponent {...manageNegotiableQuoteProps} />\n {isRenameModalOpen &&\n createPortal(\n <RenameQuoteModal\n open={isRenameModalOpen}\n quoteName={renameQuoteName}\n renameReason={renameReason}\n quoteNameError={renameQuoteNameError}\n errorBanner={renameErrorBanner}\n successBanner={renameSuccessBanner}\n onQuoteNameChange={handleRenameQuoteNameChange}\n onRenameReasonChange={setRenameReason}\n onSave={handleRenameSave}\n onClose={handleRenameClose}\n />,\n document.body\n )}\n {isDeleteDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isDeleteDialogOpen}\n title={dictionary.confirmationModalDeleteTitle}\n message={dictionary.confirmationModalDeleteMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalDeleteConfirm}\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n showCloseButton={!deleteBanner}\n confirmationBanner={deleteBanner}\n />,\n document.body\n )}\n {isDuplicateDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isDuplicateDialogOpen}\n title={dictionary.confirmationModalDuplicateTitle}\n message={dictionary.confirmationModalDuplicateMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalDuplicateConfirm}\n onCancel={handleDuplicateCancel}\n onConfirm={handleDuplicateConfirm}\n showCloseButton={!duplicateBanner}\n confirmationBanner={duplicateBanner}\n />,\n document.body\n )}\n {showCloseModal &&\n createPortal(\n <ConfirmationModal\n open={showCloseModal}\n title={dictionary.closeModalTitle}\n message={dictionary.closeModalMessage}\n cancelLabel={dictionary.closeModalCancel}\n confirmLabel={\n isClosing\n ? dictionary.closeModalConfirmLoading\n : dictionary.closeModalConfirm\n }\n onCancel={handleCloseModalCancel}\n onConfirm={isClosing ? undefined : handleCloseQuote}\n showCloseButton={true}\n confirmationBanner={closeModalBanner}\n data-testid=\"close-quote-confirmation-modal\"\n />,\n document.body\n )}\n {showCreateTemplateModal &&\n createPortal(\n <ConfirmationModal\n open={showCreateTemplateModal}\n title={dictionary.createTemplateModalTitle}\n message={dictionary.createTemplateModalMessage}\n cancelLabel={dictionary.createTemplateModalCancel}\n confirmLabel={\n isCreatingTemplate\n ? dictionary.createTemplateModalConfirmLoading\n : dictionary.createTemplateModalConfirm\n }\n onCancel={handleCreateTemplateModalCancel}\n onConfirm={isCreatingTemplate ? undefined : handleCreateTemplate}\n showCloseButton={true}\n confirmationBanner={createTemplateModalBanner}\n data-testid=\"create-template-confirmation-modal\"\n />,\n document.body\n )}\n {isNoItemsSelectedModalOpen &&\n createPortal(\n <ConfirmationModal\n open={isNoItemsSelectedModalOpen}\n title={dictionary.noItemsSelectedModalTitle}\n message={dictionary.noItemsSelectedModalMessage}\n confirmLabel={dictionary.noItemsSelectedModalConfirm}\n onConfirm={handleCloseNoItemsSelectedModal}\n onClose={handleCloseNoItemsSelectedModal}\n showCloseButton={true}\n data-testid=\"no-items-selected-modal\"\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["ManageNegotiableQuote","onActionsDropdownChange","slots","onActionsButtonClick","onSendForReview","maxFiles","maxFileSize","acceptedFileTypes","onDuplicateQuote","props","quoteData","setQuoteData","useState","loading","setLoading","isDeleteDialogOpen","setIsDeleteDialogOpen","deleteError","setDeleteError","deleteSuccess","setDeleteSuccess","isDuplicateDialogOpen","setIsDuplicateDialogOpen","duplicateError","setDuplicateError","duplicateSuccess","setDuplicateSuccess","duplicateOutOfStockWarning","setDuplicateOutOfStockWarning","comment","setComment","isSubmitting","setIsSubmitting","showCloseModal","setShowCloseModal","isClosing","setIsClosing","modalSuccessMessage","setModalSuccessMessage","modalErrorMessage","setModalErrorMessage","showCreateTemplateModal","setShowCreateTemplateModal","isCreatingTemplate","setIsCreatingTemplate","createTemplateSuccessMessage","setCreateTemplateSuccessMessage","createTemplateErrorMessage","setCreateTemplateErrorMessage","isRenameModalOpen","setIsRenameModalOpen","renameQuoteName","setRenameQuoteName","renameReason","setRenameReason","renameError","setRenameError","renameQuoteNameError","setRenameQuoteNameError","renameSuccess","setRenameSuccess","attachedFiles","setAttachedFiles","fileUploadError","setFileUploadError","selectedItemUids","setSelectedItemUids","selectedItemUidsRef","useRef","removeItemsHandlerRef","actionsBarDropdownValue","setActionsBarDropdownValue","actionsBarDropdownValueRef","isNoItemsSelectedModalOpen","setIsNoItemsSelectedModalOpen","useEffect","dictionary","useText","quoteDataEvent","events","data","quote","pendingWarningKey","shippingAddressSetEvent","quoteSentForReviewEvent","quoteItemsRemovedEvent","removedItemUids","prev","next","uid","handleItemCheckboxChange","useCallback","item","isSelected","handleActionsDropdownChange","event","action","currentSelectedUids","itemsToRemove","handleCloseNoItemsSelectedModal","quoteClosedEvent","currentQuoteData","_a","getQuoteData","updatedQuoteData","error","quoteCloseErrorEvent","errorMsg","quoteRenamedEvent","quoteDuplicatedEvent","newQuote","handleAttachFiles","files","file","validateFileSize","formatFileSize","validateFileType","newFiles","i","tempKey","result","uploadFile","f","handleRemoveFile","key","handleRenameClick","handleRenameClose","handleRenameQuoteNameChange","value","handleDuplicateQuote","handleRenameSave","renameNegotiableQuote","quoteName","useMemo","isLocked","jsx","Slot","jsxs","Edit","quoteStatus","bannerMessage","status","bannerContent","InLineAlert","WarningFilled","banner","handleDismissOutOfStockWarning","outOfStockWarningBanner","details","expirationDate","formattedDate","buttons","actionBar","handleActionsButtonClick","ActionsBar","button","Button","quoteContent","TabbedContent","ItemsQuoted","handler","isOpen","QuoteCommentsList","QuoteHistoryLog","shippingInformationTitle","shippingInformation","ShippingAddressDisplay","quoteCommentsTitle","quoteComments","TextArea","e","isFileUploadDisabled","attachFilesField","isDisabled","InputFile","target","fileList","Add","attachedFilesList","AttachedFilesList","handleCloseQuote","closeNegotiableQuote","handleCloseModalCancel","handleCreateTemplate","createQuoteTemplate","errorMessage","handleCreateTemplateModalCancel","handleSendForReview","successfulAttachments","sendForReview","footer","renameErrorBanner","renameSuccessBanner","CheckWithCircle","getDeleteErrorMessage","handleDeleteCancel","handleDeleteConfirm","operationResults","deleteQuote","failure","res","handleDismissError","handleDismissSuccess","getDuplicateErrorMessage","handleDuplicateCancel","handleDuplicateConfirm","outOfStockItems","duplicatedQuoteUid","originalUid","baseUid","randomSuffix","hasOutOfStockItems","duplicateQuote","handleDismissDuplicateError","handleDismissDuplicateSuccess","deleteErrorBanner","deleteBanner","duplicateErrorBanner","duplicateBanner","manageNegotiableQuoteProps","Fragment","closeModalBanner","createTemplateModalBanner","ManageNegotiableQuoteComponent","createPortal","RenameQuoteModal","ConfirmationModal"],"mappings":"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"}