@dropins/storefront-quote-management 1.2.0 → 1.2.1-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 (273) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/api/acceptQuoteTemplate/acceptQuoteTemplate.d.ts +1 -2
  3. package/api/acceptQuoteTemplate/graphql/acceptQuoteTemplate.d.ts +0 -1
  4. package/api/acceptQuoteTemplate/index.d.ts +0 -1
  5. package/api/addQuoteTemplateLineItemNote/addQuoteTemplateLineItemNote.d.ts +1 -2
  6. package/api/addQuoteTemplateLineItemNote/graphql/setQuoteTemplateLineItemNote.d.ts +0 -1
  7. package/api/addQuoteTemplateLineItemNote/index.d.ts +0 -1
  8. package/api/addQuoteTemplateShippingAddress/addQuoteTemplateShippingAddress.d.ts +1 -2
  9. package/api/addQuoteTemplateShippingAddress/graphql/setNegotiableQuoteTemplateShippingAddress.d.ts +0 -1
  10. package/api/addQuoteTemplateShippingAddress/index.d.ts +0 -1
  11. package/api/cancelQuoteTemplate/cancelQuoteTemplate.d.ts +1 -2
  12. package/api/cancelQuoteTemplate/graphql/cancelQuoteTemplate.d.ts +0 -1
  13. package/api/cancelQuoteTemplate/index.d.ts +0 -1
  14. package/api/closeNegotiableQuote/closeNegotiableQuote.d.ts +0 -1
  15. package/api/closeNegotiableQuote/graphql/CloseNegotiableQuoteMutation.d.ts +0 -1
  16. package/api/closeNegotiableQuote/index.d.ts +0 -1
  17. package/api/createQuoteTemplate/createQuoteTemplate.d.ts +8 -2
  18. package/api/createQuoteTemplate/graphql/createQuoteTemplate.d.ts +0 -1
  19. package/api/createQuoteTemplate/index.d.ts +0 -1
  20. package/api/deleteQuote/deleteQuote.d.ts +0 -1
  21. package/api/deleteQuote/graphql/DeleteQuoteMutation.d.ts +0 -1
  22. package/api/deleteQuote/index.d.ts +0 -1
  23. package/api/deleteQuoteTemplate/deleteQuoteTemplate.d.ts +0 -1
  24. package/api/deleteQuoteTemplate/graphql/deleteQuoteTemplate.d.ts +0 -1
  25. package/api/deleteQuoteTemplate/index.d.ts +0 -1
  26. package/api/duplicateNegotiableQuote/duplicateNegotiableQuote.d.ts +8 -2
  27. package/api/duplicateNegotiableQuote/graphql/duplicateNegotiableQuoteMutation.d.ts +0 -1
  28. package/api/duplicateNegotiableQuote/index.d.ts +0 -1
  29. package/api/fetch-graphql/fetch-graphql.d.ts +3 -4
  30. package/api/fetch-graphql/index.d.ts +0 -1
  31. package/api/generateQuoteFromTemplate/generateQuoteFromTemplate.d.ts +0 -1
  32. package/api/generateQuoteFromTemplate/graphql/generateNegotiableQuoteFromTemplate.d.ts +0 -1
  33. package/api/generateQuoteFromTemplate/index.d.ts +0 -1
  34. package/api/getQuoteData/getQuoteData.d.ts +1 -2
  35. package/api/getQuoteData/graphql/QuoteDataQuery.d.ts +0 -1
  36. package/api/getQuoteData/index.d.ts +0 -1
  37. package/api/getQuoteTemplateData/getQuoteTemplateData.d.ts +8 -2
  38. package/api/getQuoteTemplateData/graphql/getQuoteTemplateData.d.ts +0 -1
  39. package/api/getQuoteTemplateData/index.d.ts +0 -1
  40. package/api/getQuoteTemplates/getQuoteTemplates.d.ts +8 -2
  41. package/api/getQuoteTemplates/graphql/getQuoteTemplates.d.ts +0 -1
  42. package/api/getQuoteTemplates/index.d.ts +0 -1
  43. package/api/getStoreConfig/getStoreConfig.d.ts +8 -2
  44. package/api/getStoreConfig/graphql/StoreConfigQuery.d.ts +0 -1
  45. package/api/getStoreConfig/index.d.ts +0 -1
  46. package/api/graphql/NegotiableQuoteAddressFragment.d.ts +0 -1
  47. package/api/graphql/NegotiableQuoteFragment.d.ts +0 -1
  48. package/api/graphql/NegotiableQuoteListFragment.d.ts +0 -1
  49. package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +0 -1
  50. package/api/graphql/SearchResultPageInfoFragment.d.ts +0 -1
  51. package/api/graphql/ShippingMethodFragment.d.ts +0 -1
  52. package/api/graphql/SortFieldsFragment.d.ts +0 -1
  53. package/api/index.d.ts +0 -1
  54. package/api/initialize/index.d.ts +0 -1
  55. package/api/initialize/initialize.d.ts +10 -12
  56. package/api/negotiableQuotes/graphql/NegotiableQuotesQuery.d.ts +0 -1
  57. package/api/negotiableQuotes/index.d.ts +0 -1
  58. package/api/negotiableQuotes/negotiableQuotes.d.ts +8 -2
  59. package/api/openQuoteTemplate/graphql/openQuoteTemplate.d.ts +0 -1
  60. package/api/openQuoteTemplate/index.d.ts +0 -1
  61. package/api/openQuoteTemplate/openQuoteTemplate.d.ts +1 -2
  62. package/api/removeNegotiableQuoteItems/graphql/RemoveNegotiableQuoteItemsMutation.d.ts +0 -1
  63. package/api/removeNegotiableQuoteItems/index.d.ts +0 -1
  64. package/api/removeNegotiableQuoteItems/removeNegotiableQuoteItems.d.ts +8 -2
  65. package/api/removeQuoteTemplateItems/graphql/removeNegotiableQuoteTemplateItems.d.ts +0 -1
  66. package/api/removeQuoteTemplateItems/index.d.ts +0 -1
  67. package/api/removeQuoteTemplateItems/removeQuoteTemplateItems.d.ts +1 -2
  68. package/api/renameNegotiableQuote/graphql/RenameNegotiableQuoteMutation.d.ts +0 -1
  69. package/api/renameNegotiableQuote/index.d.ts +0 -1
  70. package/api/renameNegotiableQuote/renameNegotiableQuote.d.ts +8 -2
  71. package/api/requestNegotiableQuote/graphql/RequestNegotiableQuoteMutation.d.ts +0 -1
  72. package/api/requestNegotiableQuote/index.d.ts +0 -1
  73. package/api/requestNegotiableQuote/requestNegotiableQuote.d.ts +8 -2
  74. package/api/sendForReview/graphql/SendNegotiableQuoteForReviewMutation.d.ts +0 -1
  75. package/api/sendForReview/index.d.ts +0 -1
  76. package/api/sendForReview/sendForReview.d.ts +8 -2
  77. package/api/sendQuoteTemplateForReview/graphql/sendQuoteTemplateForReview.d.ts +0 -1
  78. package/api/sendQuoteTemplateForReview/index.d.ts +0 -1
  79. package/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview.d.ts +1 -2
  80. package/api/setLineItemNote/graphql/SetLineItemNoteMutation.d.ts +0 -1
  81. package/api/setLineItemNote/index.d.ts +0 -1
  82. package/api/setLineItemNote/setLineItemNote.d.ts +8 -2
  83. package/api/setQuoteTemplateExpirationDate/graphql/setQuoteTemplateExpirationDate.d.ts +0 -1
  84. package/api/setQuoteTemplateExpirationDate/index.d.ts +0 -1
  85. package/api/setQuoteTemplateExpirationDate/setQuoteTemplateExpirationDate.d.ts +8 -2
  86. package/api/setShippingAddress/graphql/SetNegotiableQuoteShippingAddressMutation.d.ts +0 -1
  87. package/api/setShippingAddress/index.d.ts +0 -1
  88. package/api/setShippingAddress/setShippingAddress.d.ts +8 -2
  89. package/api/updateQuantities/graphql/UpdateNegotiableQuoteQuantitiesMutation.d.ts +0 -1
  90. package/api/updateQuantities/index.d.ts +0 -1
  91. package/api/updateQuantities/updateQuantities.d.ts +8 -2
  92. package/api/updateQuoteTemplateItemQuantities/graphql/updateNegotiableQuoteTemplateQuantities.d.ts +0 -1
  93. package/api/updateQuoteTemplateItemQuantities/index.d.ts +0 -1
  94. package/api/updateQuoteTemplateItemQuantities/updateQuoteTemplateItemQuantities.d.ts +1 -2
  95. package/api/uploadFile/graphql/FinishUploadMutation.d.ts +0 -1
  96. package/api/uploadFile/graphql/InitiateUploadMutation.d.ts +0 -1
  97. package/api/uploadFile/index.d.ts +0 -1
  98. package/api/uploadFile/uploadFile.d.ts +0 -1
  99. package/api.d.ts +1 -1
  100. package/api.js +1 -1
  101. package/api.js.map +1 -1
  102. package/chunks/ShippingAddressDisplay.js +1 -1
  103. package/chunks/components.js +1 -1
  104. package/components/ActionsBar/ActionsBar.d.ts +8 -2
  105. package/components/ActionsBar/index.d.ts +0 -1
  106. package/components/AttachedFilesList/AttachedFilesList.d.ts +8 -2
  107. package/components/AttachedFilesList/index.d.ts +0 -1
  108. package/components/ConfirmationModal/ConfirmationModal.d.ts +8 -2
  109. package/components/ConfirmationModal/index.d.ts +0 -1
  110. package/components/ExpirationDateModal/ExpirationDateModal.d.ts +8 -2
  111. package/components/ExpirationDateModal/index.d.ts +0 -1
  112. package/components/ItemsQuoted/ItemsQuoted.d.ts +8 -2
  113. package/components/ItemsQuoted/index.d.ts +0 -1
  114. package/components/LineItemNoteModal/LineItemNoteModal.d.ts +8 -2
  115. package/components/LineItemNoteModal/index.d.ts +0 -1
  116. package/components/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +8 -2
  117. package/components/ManageNegotiableQuote/__fixtures__/ManageNegotiableQuoteProps.d.ts +1 -3
  118. package/components/ManageNegotiableQuote/index.d.ts +0 -1
  119. package/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +8 -2
  120. package/components/ManageNegotiableQuoteTemplate/__fixtures__/ManageNegotiableQuoteTemplateProps.d.ts +1 -3
  121. package/components/ManageNegotiableQuoteTemplate/index.d.ts +0 -1
  122. package/components/OrderSummary/OrderSummary.d.ts +8 -2
  123. package/components/OrderSummary/index.d.ts +0 -1
  124. package/components/OrderSummaryLine/OrderSummaryLine.d.ts +8 -2
  125. package/components/OrderSummaryLine/index.d.ts +0 -1
  126. package/components/ProductListTable/ProductListTable.d.ts +8 -2
  127. package/components/ProductListTable/index.d.ts +0 -1
  128. package/components/QuoteCommentsList/QuoteCommentsList.d.ts +8 -2
  129. package/components/QuoteCommentsList/index.d.ts +0 -1
  130. package/components/QuoteHistoryLog/QuoteHistoryLog.d.ts +8 -2
  131. package/components/QuoteHistoryLog/index.d.ts +0 -1
  132. package/components/QuotePricesSummary/QuotePricesSummary.d.ts +8 -2
  133. package/components/QuotePricesSummary/index.d.ts +0 -1
  134. package/components/QuoteSummaryList/QuoteSummaryList.d.ts +8 -2
  135. package/components/QuoteSummaryList/index.d.ts +0 -1
  136. package/components/QuoteTemplatesListTable/QuoteTemplatesListTable.d.ts +8 -2
  137. package/components/QuoteTemplatesListTable/index.d.ts +0 -1
  138. package/components/QuotesListTable/QuotesListTable.d.ts +8 -2
  139. package/components/QuotesListTable/index.d.ts +0 -1
  140. package/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.d.ts +8 -2
  141. package/components/ReferenceDocumentFormModal/index.d.ts +0 -1
  142. package/components/ReferenceDocumentsList/ReferenceDocumentsList.d.ts +8 -2
  143. package/components/ReferenceDocumentsList/index.d.ts +0 -1
  144. package/components/RenameQuoteModal/RenameQuoteModal.d.ts +8 -2
  145. package/components/RenameQuoteModal/index.d.ts +0 -1
  146. package/components/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.d.ts +8 -2
  147. package/components/RequestNegotiableQuoteForm/index.d.ts +0 -1
  148. package/components/ShippingAddressDisplay/ShippingAddressDisplay.d.ts +8 -2
  149. package/components/ShippingAddressDisplay/index.d.ts +0 -1
  150. package/components/TabbedContent/TabbedContent.d.ts +8 -2
  151. package/components/TabbedContent/index.d.ts +0 -1
  152. package/components/index.d.ts +0 -1
  153. package/containers/ItemsQuoted/ItemsQuoted.d.ts +9 -3
  154. package/containers/ItemsQuoted/index.d.ts +0 -1
  155. package/containers/ItemsQuoted.d.ts +1 -3
  156. package/containers/ItemsQuoted.js +1 -1
  157. package/containers/ItemsQuoted.js.map +1 -1
  158. package/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.d.ts +9 -3
  159. package/containers/ItemsQuotedTemplate/index.d.ts +0 -1
  160. package/containers/ItemsQuotedTemplate.d.ts +1 -3
  161. package/containers/ItemsQuotedTemplate.js +1 -1
  162. package/containers/ItemsQuotedTemplate.js.map +1 -1
  163. package/containers/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +9 -3
  164. package/containers/ManageNegotiableQuote/index.d.ts +0 -1
  165. package/containers/ManageNegotiableQuote.d.ts +1 -3
  166. package/containers/ManageNegotiableQuote.js +3 -1
  167. package/containers/ManageNegotiableQuote.js.map +1 -1
  168. package/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +9 -3
  169. package/containers/ManageNegotiableQuoteTemplate/index.d.ts +0 -1
  170. package/containers/ManageNegotiableQuoteTemplate.d.ts +1 -3
  171. package/containers/ManageNegotiableQuoteTemplate.js +1 -3
  172. package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
  173. package/containers/OrderSummary/OrderSummary.d.ts +9 -3
  174. package/containers/OrderSummary/index.d.ts +0 -1
  175. package/containers/OrderSummary.d.ts +1 -3
  176. package/containers/OrderSummary.js +1 -1
  177. package/containers/OrderSummaryLine/OrderSummaryLine.d.ts +9 -3
  178. package/containers/OrderSummaryLine/index.d.ts +0 -1
  179. package/containers/OrderSummaryLine.d.ts +1 -3
  180. package/containers/OrderSummaryLine.js +1 -1
  181. package/containers/QuoteCommentsList/QuoteCommentsList.d.ts +9 -3
  182. package/containers/QuoteCommentsList/index.d.ts +0 -1
  183. package/containers/QuoteCommentsList.d.ts +1 -3
  184. package/containers/QuoteCommentsList.js +1 -1
  185. package/containers/QuoteCommentsList.js.map +1 -1
  186. package/containers/QuoteHistoryLog/QuoteHistoryLog.d.ts +9 -3
  187. package/containers/QuoteHistoryLog/index.d.ts +0 -1
  188. package/containers/QuoteHistoryLog.d.ts +1 -3
  189. package/containers/QuoteHistoryLog.js +1 -1
  190. package/containers/QuoteHistoryLog.js.map +1 -1
  191. package/containers/QuoteSummaryList/QuoteSummaryList.d.ts +10 -4
  192. package/containers/QuoteSummaryList/index.d.ts +0 -1
  193. package/containers/QuoteSummaryList.d.ts +1 -3
  194. package/containers/QuoteSummaryList.js +1 -1
  195. package/containers/QuoteSummaryList.js.map +1 -1
  196. package/containers/QuoteTemplateCommentsList/QuoteTemplateCommentsList.d.ts +9 -3
  197. package/containers/QuoteTemplateCommentsList/index.d.ts +0 -1
  198. package/containers/QuoteTemplateCommentsList.d.ts +1 -3
  199. package/containers/QuoteTemplateCommentsList.js +1 -1
  200. package/containers/QuoteTemplateCommentsList.js.map +1 -1
  201. package/containers/QuoteTemplateHistoryLog/QuoteTemplateHistoryLog.d.ts +9 -3
  202. package/containers/QuoteTemplateHistoryLog/index.d.ts +0 -1
  203. package/containers/QuoteTemplateHistoryLog.d.ts +1 -3
  204. package/containers/QuoteTemplateHistoryLog.js +1 -1
  205. package/containers/QuoteTemplateHistoryLog.js.map +1 -1
  206. package/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.d.ts +9 -3
  207. package/containers/QuoteTemplatesListTable/index.d.ts +0 -1
  208. package/containers/QuoteTemplatesListTable.d.ts +1 -3
  209. package/containers/QuoteTemplatesListTable.js +1 -1
  210. package/containers/QuotesListTable/QuotesListTable.d.ts +9 -3
  211. package/containers/QuotesListTable/index.d.ts +0 -1
  212. package/containers/QuotesListTable.d.ts +1 -3
  213. package/containers/QuotesListTable.js +1 -1
  214. package/containers/QuotesListTable.js.map +1 -1
  215. package/containers/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.d.ts +9 -3
  216. package/containers/RequestNegotiableQuoteForm/index.d.ts +0 -1
  217. package/containers/RequestNegotiableQuoteForm.d.ts +1 -3
  218. package/containers/RequestNegotiableQuoteForm.js +1 -1
  219. package/containers/ShippingAddressDisplay/ShippingAddressDisplay.d.ts +9 -3
  220. package/containers/ShippingAddressDisplay/index.d.ts +0 -1
  221. package/containers/ShippingAddressDisplay.d.ts +1 -1
  222. package/containers/index.d.ts +0 -1
  223. package/data/models/__fixtures__/negotiableQuoteModel.d.ts +8 -2
  224. package/data/models/__fixtures__/negotiableQuoteTemplateModel.d.ts +8 -2
  225. package/data/models/__fixtures__/negotiableQuoteTemplatesListModel.d.ts +8 -2
  226. package/data/models/__fixtures__/negotiableQuotesListModel.d.ts +8 -2
  227. package/data/models/__fixtures__/storeConfigModel.d.ts +8 -2
  228. package/data/models/index.d.ts +0 -1
  229. package/data/models/negotiable-quote-model.d.ts +1 -2
  230. package/data/models/negotiable-quote-template-model.d.ts +8 -2
  231. package/data/models/store-config-model.d.ts +0 -1
  232. package/data/transforms/__fixtures__/negotiableQuoteData.d.ts +9 -4
  233. package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +0 -1
  234. package/data/transforms/__fixtures__/storeConfigData.d.ts +0 -1
  235. package/data/transforms/index.d.ts +0 -1
  236. package/data/transforms/transform-history.d.ts +8 -2
  237. package/data/transforms/transform-quote-items.d.ts +8 -2
  238. package/data/transforms/transform-quote-template.d.ts +8 -2
  239. package/data/transforms/transform-quote.d.ts +8 -2
  240. package/data/transforms/transform-store-config.d.ts +8 -2
  241. package/hooks/useExpirationDate.d.ts +0 -1
  242. package/hooks/useItemsQuotedTemplate.d.ts +8 -2
  243. package/hooks/useQuoteSummaryData.d.ts +9 -4
  244. package/hooks/useReferenceDocumentLinks.d.ts +8 -2
  245. package/hooks/useRemoveTemplateItems.d.ts +8 -2
  246. package/hooks/useRenameTemplate.d.ts +0 -1
  247. package/hooks/useUpdateTemplateQuantities.d.ts +8 -2
  248. package/lib/configurationTransformers.d.ts +0 -1
  249. package/lib/itemFormatters.d.ts +11 -7
  250. package/lib/priceCalculators.d.ts +14 -13
  251. package/lib/state.d.ts +8 -3
  252. package/package.json +1 -1
  253. package/render/Provider.d.ts +8 -2
  254. package/render/index.d.ts +0 -1
  255. package/render/render.d.ts +9 -4
  256. package/render.d.ts +1 -1
  257. package/types/state.types.d.ts +8 -2
  258. package/utils/dateUtils.d.ts +0 -1
  259. package/utils/fileUtils.d.ts +0 -1
  260. package/utils/mapAuthPermissions.d.ts +8 -2
  261. package/chunks/ItemsQuoted.js +0 -4
  262. package/chunks/ItemsQuoted.js.map +0 -1
  263. package/chunks/ItemsQuotedTemplate.js +0 -4
  264. package/chunks/ItemsQuotedTemplate.js.map +0 -1
  265. package/chunks/QuoteCommentsList.js +0 -4
  266. package/chunks/QuoteCommentsList.js.map +0 -1
  267. package/chunks/QuoteHistoryLog.js +0 -4
  268. package/chunks/QuoteHistoryLog.js.map +0 -1
  269. package/chunks/QuoteTemplateCommentsList.js +0 -4
  270. package/chunks/QuoteTemplateCommentsList.js.map +0 -1
  271. package/chunks/QuoteTemplateHistoryLog.js +0 -4
  272. package/chunks/QuoteTemplateHistoryLog.js.map +0 -1
  273. package/i18n/en_US.json.d.ts +0 -485
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"ManageNegotiableQuote.js","sources":["/@dropins/storefront-quote-management/src/containers/ManageNegotiableQuote/ManageNegotiableQuote.tsx","/@dropins/storefront-quote-management/src/hooks/useReferenceDocumentLinks.ts","/@dropins/storefront-quote-management/src/hooks/useRenameTemplate.ts","/@dropins/storefront-quote-management/src/hooks/useExpirationDate.ts","/@dropins/storefront-quote-management/src/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.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","/********************************************************************\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 { useMemo, useCallback } from 'preact/compat';\nimport { ReferenceDocument } from '@/quote-management/components';\nimport { ReferenceDocumentLinkInput } from '@/quote-management/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview';\n\nexport interface UseReferenceDocumentLinksParams {\n templateReferenceDocuments?: ReferenceDocument[];\n localReferenceDocuments: ReferenceDocument[];\n}\n\nexport interface UseReferenceDocumentLinksReturn {\n /**\n * Checks if a document exists in the template reference documents.\n * Matches by uid if both documents have it, otherwise matches by url.\n */\n isDocumentInTemplateData: (document: ReferenceDocument) => boolean;\n /**\n * Returns documents from localReferenceDocuments that are not in templateReferenceDocuments.\n */\n getNewDocuments: () => ReferenceDocument[];\n /**\n * Transforms all reference documents to API format.\n */\n getReferenceDocumentLinks: () => ReferenceDocumentLinkInput[];\n /**\n * Indicates if there are unsaved changes (new documents, removed documents, or modified documents).\n */\n hasUnsavedChanges: boolean;\n}\n\n/**\n * Custom hook to manage reference document links logic.\n * Handles document matching, filtering new documents, transformation to API format,\n * and detection of unsaved changes (new, removed, or modified documents).\n * Note: getReferenceDocumentLinks() returns all local reference documents, not just new ones.\n */\nexport const useReferenceDocumentLinks = (\n params: UseReferenceDocumentLinksParams\n): UseReferenceDocumentLinksReturn => {\n const { templateReferenceDocuments, localReferenceDocuments } = params;\n\n /**\n * Helper function to find a matching document in template data for a given document.\n * Matches by uid if both documents have it, otherwise matches by url.\n * Returns the matching template document or undefined if no match is found.\n */\n const findMatchingTemplateDocument = useCallback(\n (document: ReferenceDocument): ReferenceDocument | undefined => {\n if (!templateReferenceDocuments) {\n return undefined;\n }\n return templateReferenceDocuments.find((templateDoc) => {\n // If both documents have uids, match by uid\n if (document.uid && templateDoc.uid) {\n return templateDoc.uid === document.uid;\n }\n // Otherwise, match by URL\n return templateDoc.url === document.url;\n });\n },\n [templateReferenceDocuments]\n );\n\n /**\n * Helper function to check if a document is part of the template data.\n * A document is considered part of template data if:\n * - Its uid exists in templateReferenceDocuments (when uid is available), OR\n * - Its url exists in templateReferenceDocuments (when uid is not available)\n */\n const isDocumentInTemplateData = useCallback(\n (document: ReferenceDocument): boolean => {\n return findMatchingTemplateDocument(document) !== undefined;\n },\n [findMatchingTemplateDocument]\n );\n\n /**\n * Helper function to check if a document has been modified.\n * Compares all properties (name, identifier, url) between a local document and its matching template document.\n * Returns true if any property differs.\n */\n const isDocumentModified = useCallback(\n (localDoc: ReferenceDocument, templateDoc: ReferenceDocument): boolean => {\n // Compare all properties\n return (\n localDoc.name !== templateDoc.name ||\n localDoc.identifier !== templateDoc.identifier ||\n localDoc.url !== templateDoc.url\n );\n },\n []\n );\n\n /**\n * Returns documents from localReferenceDocuments that are not in templateReferenceDocuments.\n */\n const getNewDocuments = useCallback((): ReferenceDocument[] => {\n if (!templateReferenceDocuments) {\n // If no template documents exist, all local documents are new\n return localReferenceDocuments;\n }\n // Filter to only include documents not in template data\n return localReferenceDocuments.filter((doc) => {\n return !templateReferenceDocuments.some((templateDoc) => {\n // If both documents have uids, match by uid\n if (doc.uid && templateDoc.uid) {\n return templateDoc.uid === doc.uid;\n }\n // Otherwise, match by URL\n return templateDoc.url === doc.url;\n });\n });\n }, [templateReferenceDocuments, localReferenceDocuments]);\n\n /**\n * Transforms all reference documents to API format.\n */\n const getReferenceDocumentLinks = useCallback((): ReferenceDocumentLinkInput[] => {\n return localReferenceDocuments.map((doc) => ({\n uid: doc.uid,\n name: doc.name,\n identifier: doc.identifier,\n url: doc.url,\n }));\n }, [localReferenceDocuments]);\n\n /**\n * Checks if there are unsaved changes.\n * Returns true if there are:\n * - New documents: documents in local state that don't exist in template data\n * - Removed documents: documents in template data that don't exist in local state\n * - Modified documents: documents that exist in both but have different properties (name, identifier, or url)\n */\n const hasUnsavedChanges = useMemo(() => {\n if (!templateReferenceDocuments) {\n // If no template documents exist, any documents in local state are unsaved (new)\n return localReferenceDocuments.length > 0;\n }\n\n // Check for new documents: documents in local state not found in template data\n const hasNewDocuments = localReferenceDocuments.some((localDoc) => {\n return findMatchingTemplateDocument(localDoc) === undefined;\n });\n\n if (hasNewDocuments) {\n return true;\n }\n\n // Check for removed documents: documents in template data not found in local state\n const hasRemovedDocuments = templateReferenceDocuments.some((templateDoc) => {\n return !localReferenceDocuments.some((localDoc) => {\n // If both documents have uids, match by uid\n if (localDoc.uid && templateDoc.uid) {\n return localDoc.uid === templateDoc.uid;\n }\n // Otherwise, match by URL\n return localDoc.url === templateDoc.url;\n });\n });\n\n if (hasRemovedDocuments) {\n return true;\n }\n\n // Check for modified documents: documents that match but have different properties\n const hasModifiedDocuments = localReferenceDocuments.some((localDoc) => {\n const matchingTemplateDoc = findMatchingTemplateDocument(localDoc);\n // Defensive code: The falsy branch should be unreachable because we've already checked\n // for new documents above. If a document doesn't have a match, we would have\n // returned true in the hasNewDocuments check. This is kept for safety.\n /* istanbul ignore else */\n if (matchingTemplateDoc) {\n return isDocumentModified(localDoc, matchingTemplateDoc);\n }\n /* istanbul ignore next */\n return false;\n });\n\n return hasModifiedDocuments;\n }, [templateReferenceDocuments, localReferenceDocuments, findMatchingTemplateDocument, isDocumentModified]);\n\n return {\n isDocumentInTemplateData,\n getNewDocuments,\n getReferenceDocumentLinks,\n hasUnsavedChanges,\n };\n};\n\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useCallback } from 'preact/compat';\n\nexport interface UseRenameTemplateParams {\n initialTemplateName?: string;\n templateNameRequiredErrorMessage?: string;\n}\n\nexport interface UseRenameTemplateReturn {\n /**\n * Whether the rename modal is currently open.\n */\n isRenameModalOpen: boolean;\n /**\n * The new template name entered by the user.\n */\n renameTemplateName: string;\n /**\n * The reason for renaming the template.\n */\n renameReason: string;\n /**\n * Error message for rename operation.\n */\n renameError: string;\n /**\n * Error message for template name validation.\n */\n renameTemplateNameError: string;\n /**\n * Success message for rename operation.\n */\n renameSuccess: string;\n /**\n * Opens the rename modal and initializes state with the current template name.\n */\n handleRenameClick: (currentTemplateName?: string) => void;\n /**\n * Closes the rename modal and resets all state.\n */\n handleRenameClose: () => void;\n /**\n * Updates the template name and clears any name-related errors.\n */\n handleRenameTemplateNameChange: (value: string) => void;\n /**\n * Updates the rename reason.\n */\n handleRenameReasonChange: (value: string) => void;\n /**\n * Validates and saves the rename. Closes the modal if validation passes.\n * Does not make an API call - rename is tracked locally and included when submitting for review.\n */\n handleRenameSave: () => boolean;\n /**\n * Resets rename state (useful after successful submission).\n */\n resetRenameState: () => void;\n}\n\n/**\n * Custom hook to manage quote template rename functionality.\n * Handles state management for the rename modal, validation, and tracking rename changes.\n * Note: This hook does not make API calls. The rename is tracked locally and should be\n * included when calling sendQuoteTemplateForReview.\n */\nexport const useRenameTemplate = (\n params: UseRenameTemplateParams = {}\n): UseRenameTemplateReturn => {\n const { initialTemplateName, templateNameRequiredErrorMessage = 'Template name is required' } = params;\n\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [renameTemplateName, setRenameTemplateName] = useState<string>('');\n const [renameReason, setRenameReason] = useState<string>('');\n const [renameError, setRenameError] = useState<string>('');\n const [renameTemplateNameError, setRenameTemplateNameError] = useState<string>('');\n const [renameSuccess, setRenameSuccess] = useState<string>('');\n\n const handleRenameClick = useCallback((currentTemplateName?: string) => {\n setRenameTemplateName(currentTemplateName || initialTemplateName || '');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n setIsRenameModalOpen(true);\n }, [initialTemplateName]);\n\n const handleRenameClose = useCallback(() => {\n setIsRenameModalOpen(false);\n setRenameTemplateName('');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n }, []);\n\n const handleRenameTemplateNameChange = useCallback((value: string) => {\n setRenameTemplateName(value);\n if (value.trim()) {\n setRenameTemplateNameError('');\n }\n }, []);\n\n const handleRenameReasonChange = useCallback((value: string) => {\n setRenameReason(value);\n }, []);\n\n const handleRenameSave = useCallback((): boolean => {\n // Validate template name\n if (!renameTemplateName.trim()) {\n setRenameTemplateNameError(templateNameRequiredErrorMessage);\n return false;\n }\n\n // Clear any previous errors\n setRenameError('');\n setRenameTemplateNameError('');\n \n // Close modal - rename is tracked in state and will be included when submitting for review\n setIsRenameModalOpen(false);\n return true;\n }, [renameTemplateName, templateNameRequiredErrorMessage]);\n\n const resetRenameState = useCallback(() => {\n setRenameTemplateName('');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n }, []);\n\n return {\n isRenameModalOpen,\n renameTemplateName,\n renameReason,\n renameError,\n renameTemplateNameError,\n renameSuccess,\n handleRenameClick,\n handleRenameClose,\n handleRenameTemplateNameChange,\n handleRenameReasonChange,\n handleRenameSave,\n resetRenameState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useCallback } from 'preact/compat';\nimport { setQuoteTemplateExpirationDate } from '@/quote-management/api';\n\nexport interface UseExpirationDateParams {\n templateId?: string;\n initialExpirationDate?: string;\n expirationDateRequiredErrorMessage?: string;\n}\n\nexport interface UseExpirationDateReturn {\n /**\n * Whether the expiration date modal is currently open.\n */\n isExpirationModalOpen: boolean;\n /**\n * The new expiration date entered by the user (in YYYY-MM-DD format).\n */\n expirationDate: string;\n /**\n * Error message for expiration date operation.\n */\n expirationError: string;\n /**\n * Error message for expiration date validation.\n */\n expirationDateError: string;\n /**\n * Success message for expiration date operation.\n */\n expirationSuccess: string;\n /**\n * Opens the expiration date modal and initializes state with the current expiration date.\n */\n handleExpirationClick: (currentExpirationDate?: string) => void;\n /**\n * Closes the expiration date modal and resets all state.\n */\n handleExpirationClose: () => void;\n /**\n * Updates the expiration date and clears any date-related errors.\n */\n handleExpirationDateChange: (value: string) => void;\n /**\n * Validates and saves the expiration date. Makes an API call to save immediately.\n * Closes the modal if successful.\n * Returns a promise that resolves to true if successful, false otherwise.\n */\n handleExpirationSave: () => Promise<boolean>;\n /**\n * Resets expiration date state (useful after successful submission).\n */\n resetExpirationState: () => void;\n}\n\n/**\n * Custom hook to manage quote template expiration date functionality.\n * Handles state management for the expiration date modal, validation, and API calls.\n * Saves the expiration date immediately when user clicks \"Save\" in the modal.\n */\nexport const useExpirationDate = (\n params: UseExpirationDateParams = {}\n): UseExpirationDateReturn => {\n const { templateId, initialExpirationDate, expirationDateRequiredErrorMessage = 'Expiration date is required' } = params;\n\n const [isExpirationModalOpen, setIsExpirationModalOpen] = useState<boolean>(false);\n const [expirationDate, setExpirationDate] = useState<string>('');\n const [expirationError, setExpirationError] = useState<string>('');\n const [expirationDateError, setExpirationDateError] = useState<string>('');\n const [expirationSuccess, setExpirationSuccess] = useState<string>('');\n\n const handleExpirationClick = useCallback((currentExpirationDate?: string) => {\n setExpirationDate(currentExpirationDate || initialExpirationDate || '');\n setExpirationError('');\n setExpirationDateError('');\n setExpirationSuccess('');\n setIsExpirationModalOpen(true);\n }, [initialExpirationDate]);\n\n const handleExpirationClose = useCallback(() => {\n setIsExpirationModalOpen(false);\n setExpirationDate('');\n setExpirationError('');\n setExpirationDateError('');\n setExpirationSuccess('');\n }, []);\n\n const handleExpirationDateChange = useCallback((value: string) => {\n setExpirationDate(value);\n if (value.trim()) {\n setExpirationDateError('');\n }\n }, []);\n\n const handleExpirationSave = useCallback(async (): Promise<boolean> => {\n // Validate expiration date\n if (!expirationDate.trim()) {\n setExpirationDateError(expirationDateRequiredErrorMessage);\n return false;\n }\n\n // Validate date format (YYYY-MM-DD)\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(expirationDate)) {\n setExpirationDateError('Please enter a valid date');\n return false;\n }\n\n // Validate that the date is in the future\n const selectedDate = new Date(expirationDate);\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n if (selectedDate < today) {\n setExpirationDateError('Expiration date must be in the future');\n return false;\n }\n\n // Validate that templateId is provided\n if (!templateId) {\n setExpirationError('Template ID is required');\n return false;\n }\n\n // Clear any previous errors\n setExpirationError('');\n setExpirationDateError('');\n \n // Call API to save expiration date immediately\n try {\n await setQuoteTemplateExpirationDate({\n templateId,\n expirationDate,\n });\n \n // Close modal on success\n setIsExpirationModalOpen(false);\n setExpirationSuccess('Expiration date saved successfully');\n return true;\n } catch (error) {\n console.error('Failed to set expiration date:', error);\n const errorMessage = error instanceof Error ? error.message : 'Failed to set expiration date. Please try again.';\n setExpirationError(errorMessage);\n return false;\n }\n }, [expirationDate, expirationDateRequiredErrorMessage, templateId]);\n\n const resetExpirationState = useCallback(() => {\n setExpirationDate('');\n setExpirationError('');\n setExpirationDateError('');\n setExpirationSuccess('');\n }, []);\n\n return {\n isExpirationModalOpen,\n expirationDate,\n expirationError,\n expirationDateError,\n expirationSuccess,\n handleExpirationClick,\n handleExpirationClose,\n handleExpirationDateChange,\n handleExpirationSave,\n resetExpirationState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n createPortal,\n useRef,\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 { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Button,\n TextArea,\n InLineAlert,\n Icon,\n InputFile,\n} from '@adobe-commerce/elsie/components';\nimport { NegotiableQuoteTemplateModel, NegotiableQuoteTemplateStatus } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport {\n TabbedContent,\n ActionsBar,\n ConfirmationModal,\n ManageNegotiableQuoteTemplate as ManageNegotiableQuoteTemplateComponent,\n ManageNegotiableQuoteTemplateProps as ManageNegotiableQuoteTemplateComponentProps,\n ReferenceDocumentsList,\n ReferenceDocumentFormModal,\n ReferenceDocument,\n AttachedFilesList,\n AttachedFile,\n} from '@/quote-management/components';\nimport {\n ItemsQuotedTemplate,\n QuoteTemplateCommentsList,\n QuoteTemplateHistoryLog,\n ShippingAddressDisplay,\n} from '@/quote-management/containers';\nimport {\n WarningFilled,\n CheckWithCircle,\n Edit,\n Add,\n} from '@adobe-commerce/elsie/icons';\nimport {\n sendQuoteTemplateForReview,\n deleteQuoteTemplate,\n cancelQuoteTemplate,\n generateQuoteFromTemplate,\n openQuoteTemplate,\n acceptQuoteTemplate,\n uploadFile,\n ReferenceDocumentLinkInput,\n} from '@/quote-management/api';\nimport { useReferenceDocumentLinks } from '@/quote-management/hooks/useReferenceDocumentLinks';\nimport { useRenameTemplate } from '@/quote-management/hooks/useRenameTemplate';\nimport { useExpirationDate } from '@/quote-management/hooks/useExpirationDate';\nimport { RenameQuoteModal } from '@/quote-management/components/RenameQuoteModal';\nimport { ExpirationDateModal } from '@/quote-management/components/ExpirationDateModal';\nimport { formatFileSize, validateFileSize, validateFileType } from '@/quote-management/utils/fileUtils';\n\nexport interface ManageNegotiableQuoteTemplateProps\n extends HTMLAttributes<HTMLDivElement> {\n onActionsButtonClick?: (action: string) => void;\n onSendForReview?: (params: {\n templateData?: NegotiableQuoteTemplateModel;\n name?: string;\n comment?: string;\n referenceDocumentLinks?: ReferenceDocumentLinkInput[];\n attachments?: AttachedFile[];\n }) => void;\n maxFiles?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n slots?: {\n TemplateName?: SlotProps<{\n templateName?: string;\n templateData?: NegotiableQuoteTemplateModel;\n templateDisplayName?: string;\n isRenameDisabled?: boolean;\n }>;\n TemplateStatus?: SlotProps<{\n templateStatus?: string;\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Banner?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Details?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ActionBar?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ReferenceDocuments?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n referenceDocuments?: ReferenceDocument[];\n isEditable?: boolean;\n onAddDocument?: () => void;\n onEditDocument?: (document: ReferenceDocument) => void;\n onRemoveDocument?: (document: ReferenceDocument) => void;\n referenceDocumentsTitle?: string;\n }>;\n ItemsTable?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ItemsQuotedTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n CommentsTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLogTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n CommentsTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Comments?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n AttachFilesField?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n onFileChange: (files: File[]) => void;\n attachedFiles: AttachedFile[];\n fileUploadError: string | undefined;\n disabled: boolean;\n }>;\n AttachedFilesList?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n files: AttachedFile[];\n onRemove: (key: string) => void;\n disabled: boolean;\n }>;\n HistoryLogTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLog?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Footer?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n comment?: string;\n isSubmitting?: boolean;\n attachedFiles?: AttachedFile[];\n referenceDocuments?: ReferenceDocument[];\n hasUnsavedChanges?: boolean;\n handleSendForReview: () => void;\n showAcceptButton?: boolean;\n renameTemplateName?: string;\n renameReason?: string;\n }>;\n ShippingInformationTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ShippingInformation?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n loading?: boolean;\n setLoading?: (loading: boolean) => void;\n }>;\n };\n}\n\nexport const ManageNegotiableQuoteTemplate: Container<ManageNegotiableQuoteTemplateProps> = ({\n slots,\n onActionsButtonClick,\n onSendForReview,\n maxFiles,\n maxFileSize,\n acceptedFileTypes,\n ...props\n}) => {\n const [templateData, setTemplateData] = useState<NegotiableQuoteTemplateModel | undefined>(undefined);\n const [loading, setLoading] = useState<boolean>(true);\n const [comment, setComment] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState<boolean>(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n const [deleteSuccess, setDeleteSuccess] = useState<boolean>(false);\n const [isCancelDialogOpen, setIsCancelDialogOpen] = useState<boolean>(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n const [cancelSuccess, setCancelSuccess] = useState<boolean>(false);\n const [referenceDocuments, setReferenceDocuments] = useState<ReferenceDocument[]>([]);\n const [isDocumentModalOpen, setIsDocumentModalOpen] = useState<boolean>(false);\n const [editingDocument, setEditingDocument] = useState<ReferenceDocument | undefined>(undefined);\n const [documentModalErrorMessage, setDocumentModalErrorMessage] = useState<string | null>(null);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [generateQuoteSuccessMessage, setGenerateQuoteSuccessMessage] = useState<string>('');\n const [generateQuoteErrorMessage, setGenerateQuoteErrorMessage] = useState<string>('');\n const [showAcceptModal, setShowAcceptModal] = useState<boolean>(false);\n const [isAccepting, setIsAccepting] = useState<boolean>(false);\n const [acceptSuccessMessage, setAcceptSuccessMessage] = useState<string>('');\n const [acceptErrorMessage, setAcceptErrorMessage] = useState<string>('');\n const hasAutoOpened = useRef<boolean>(false);\n\n // File upload state\n const [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n const [fileUploadError, setFileUploadError] = useState<string | undefined>(undefined);\n\n // Use hook for reference document links logic\n const {\n getReferenceDocumentLinks,\n hasUnsavedChanges: hasUnsavedReferenceDocuments,\n } = useReferenceDocumentLinks({\n templateReferenceDocuments: templateData?.referenceDocuments,\n localReferenceDocuments: referenceDocuments,\n });\n\n const dictionary = useText({\n createdLabel: 'NegotiableQuoteTemplate.Manage.createdLabel',\n salesRepLabel: 'NegotiableQuoteTemplate.Manage.salesRepLabel',\n expiresLabel: 'NegotiableQuoteTemplate.Manage.expiresLabel',\n templateIdLabel: 'NegotiableQuoteTemplate.Manage.templateIdLabel',\n actionsLabel: 'NegotiableQuoteTemplate.Manage.actionsLabel',\n referenceDocumentsTitle: 'NegotiableQuoteTemplate.Manage.referenceDocuments.title',\n commentsTitle: 'NegotiableQuoteTemplate.Manage.comments.title',\n historyLogTitle: 'NegotiableQuoteTemplate.Manage.historyLog.title',\n itemsQuotedTab: 'NegotiableQuoteTemplate.Manage.tabs.itemsQuoted',\n commentsTab: 'NegotiableQuoteTemplate.Manage.tabs.comments',\n historyLogTab: 'NegotiableQuoteTemplate.Manage.tabs.historyLog',\n templateCommentsPlaceholder: 'NegotiableQuoteTemplate.Manage.templateComments.placeholder',\n sendForReview: 'NegotiableQuoteTemplate.Manage.actionButtons.sendForReview',\n delete: 'NegotiableQuoteTemplate.Manage.actionButtons.delete',\n cancel: 'NegotiableQuoteTemplate.Manage.actionButtons.cancel',\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 confirmationModalDeleteTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.title',\n confirmationModalDeleteMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.message',\n confirmationModalDeleteConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.confirm',\n confirmationModalDeleteErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.errorHeading',\n confirmationModalDeleteErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.errorFallback',\n confirmationModalDeleteSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.successHeading',\n confirmationModalDeleteSuccessDescription: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.successDescription',\n confirmationModalCancelTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.title',\n confirmationModalCancelMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.message',\n confirmationModalCancelConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.confirm',\n confirmationModalCancelErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.errorHeading',\n confirmationModalCancelErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.errorFallback',\n confirmationModalCancelSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.successHeading',\n confirmationModalCancelSuccessDescription: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.successDescription',\n confirmationModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n accept: 'NegotiableQuoteTemplate.Manage.actionButtons.accept',\n generateQuote: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalTitle: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message',\n generateQuoteModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n generateQuoteModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm',\n generateQuoteModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading',\n generateQuoteModalSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successHeading',\n generateQuoteSuccessMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successDescription',\n generateQuoteModalErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorHeading',\n generateQuoteErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorFallback',\n acceptModalTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.title',\n acceptModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.message',\n acceptModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n acceptModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.confirm',\n acceptModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.confirmLoading',\n acceptModalSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.successHeading',\n acceptSuccessMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.successDescription',\n acceptModalErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.errorHeading',\n acceptErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.errorFallback',\n documentDuplicateUidError: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.duplicateUidError',\n renameTitle: 'NegotiableQuoteTemplate.Manage.rename.title',\n renameTemplateNameLabel: 'NegotiableQuoteTemplate.Manage.rename.templateNameLabel',\n renameReasonLabel: 'NegotiableQuoteTemplate.Manage.rename.reasonLabel',\n renameButton: 'NegotiableQuoteTemplate.Manage.rename.renameButton',\n renameCancelButton: 'NegotiableQuoteTemplate.Manage.rename.cancelButton',\n renameErrorHeading: 'NegotiableQuoteTemplate.Manage.rename.errorHeading',\n renameTemplateNameRequired: 'NegotiableQuoteTemplate.Manage.rename.templateNameRequired',\n renameErrorDefault: 'NegotiableQuoteTemplate.Manage.rename.errorDefault',\n renameSuccessHeading: 'NegotiableQuoteTemplate.Manage.rename.successHeading',\n renameSuccessMessage: 'NegotiableQuoteTemplate.Manage.rename.successMessage',\n expirationDateRequired: 'NegotiableQuoteTemplate.Manage.expirationDate.expirationDateRequired',\n expirationDateErrorHeading: 'NegotiableQuoteTemplate.Manage.expirationDate.errorHeading',\n expirationDateSuccessHeading: 'NegotiableQuoteTemplate.Manage.expirationDate.successHeading',\n shippingInformationTitle: 'NegotiableQuoteTemplate.Manage.shippingInformation.title',\n unsavedChangesWarningHeading: 'NegotiableQuoteTemplate.Manage.unsavedChangesWarningHeading',\n unsavedChangesWarningMessage: 'NegotiableQuoteTemplate.Manage.unsavedChangesWarningMessage',\n shippingAddressWarningHeading: 'NegotiableQuoteTemplate.Manage.shippingAddressWarningHeading',\n shippingAddressWarningMessage: 'NegotiableQuoteTemplate.Manage.shippingAddressWarningMessage',\n });\n\n // Use hook for rename template logic (after dictionary is defined)\n const {\n isRenameModalOpen,\n renameTemplateName,\n renameReason,\n renameError,\n renameTemplateNameError,\n renameSuccess,\n handleRenameClick,\n handleRenameClose,\n handleRenameTemplateNameChange,\n handleRenameReasonChange,\n handleRenameSave,\n resetRenameState,\n } = useRenameTemplate({\n initialTemplateName: templateData?.name,\n templateNameRequiredErrorMessage: dictionary.renameTemplateNameRequired,\n });\n\n // Use hook for expiration date logic\n const {\n isExpirationModalOpen,\n expirationDate,\n expirationError,\n expirationDateError,\n expirationSuccess,\n handleExpirationClick,\n handleExpirationClose,\n handleExpirationDateChange,\n handleExpirationSave,\n resetExpirationState,\n } = useExpirationDate({\n templateId: templateData?.id,\n initialExpirationDate: templateData?.expirationDate,\n expirationDateRequiredErrorMessage: dictionary.expirationDateRequired,\n });\n\n // Check if there are unsaved rename changes\n // Only check when modal is closed to avoid showing warning while user is still editing\n const hasUnsavedRenameChanges = useMemo(() => {\n // Don't show warning while modal is open\n if (isRenameModalOpen) {\n return false;\n }\n // A rename change exists when renameTemplateName is set and differs from current template name\n return renameTemplateName !== '' && renameTemplateName !== templateData?.name;\n }, [renameTemplateName, templateData?.name, isRenameModalOpen]);\n\n // Combine unsaved changes from reference documents and rename\n // Note: Expiration date is saved immediately via API, not deferred\n const hasUnsavedChanges = useMemo(() => {\n return hasUnsavedReferenceDocuments || hasUnsavedRenameChanges;\n }, [hasUnsavedReferenceDocuments, hasUnsavedRenameChanges]);\n\n /**\n * File upload handlers\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 // NOTE: Backend support not ready yet, so we mock the upload\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 /* Event listeners */\n useEffect(() => {\n const quoteTemplateDataEvent = events.on('quote-management/quote-template-data', (data) => {\n if (data.quoteTemplate) {\n setTemplateData(data.quoteTemplate);\n setLoading(false);\n // Reset comment and submitting state after successful update\n setComment('');\n setIsSubmitting(false);\n // Clear attachments after successful submission\n setAttachedFiles([]);\n // Update reference documents from template data\n setReferenceDocuments(data.quoteTemplate.referenceDocuments || []);\n // Reset rename and expiration state after successful submission\n resetRenameState();\n resetExpirationState();\n }\n }, { eager: true });\n\n return () => quoteTemplateDataEvent?.off();\n }, [resetRenameState, resetExpirationState]);\n\n // Initialize reference documents when template data changes\n useEffect(() => {\n if (templateData?.referenceDocuments) {\n setReferenceDocuments(templateData.referenceDocuments);\n }\n }, [templateData?.referenceDocuments]);\n\n // Auto-open template if status is \"Updated\"\n useEffect(() => {\n if (templateData && templateData.status === NegotiableQuoteTemplateStatus.UPDATED && !hasAutoOpened.current) {\n hasAutoOpened.current = true;\n const openTemplate = async () => {\n try {\n await openQuoteTemplate({ templateId: templateData.id });\n // The event listener will handle updating state\n } catch (error) {\n console.error('Failed to auto-open quote template:', error);\n // Silently fail - template data is still available for viewing\n }\n };\n openTemplate();\n }\n }, [templateData]);\n\n /**\n * Handlers\n */\n const handleDeleteCancel = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeleteError(null);\n setDeleteSuccess(false);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n /* istanbul ignore next */ // If there is no template data, the button should not be enabled or even rendered\n if (!templateData?.id) {\n return;\n }\n\n setDeleteError(null);\n setDeleteSuccess(false);\n\n try {\n await deleteQuoteTemplate({\n templateId: templateData.id,\n });\n setDeleteSuccess(true);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setIsDeleteDialogOpen(false);\n setDeleteSuccess(false);\n }, 2000);\n } catch (error) {\n const errorMessage = (error as Error).message || dictionary.confirmationModalDeleteErrorFallback;\n setDeleteError(errorMessage);\n }\n }, [templateData, dictionary.confirmationModalDeleteErrorFallback]);\n\n const handleDismissError = useCallback(() => {\n setDeleteError(null);\n }, []);\n\n const handleDismissSuccess = useCallback(() => {\n setDeleteSuccess(false);\n }, []);\n\n const handleCancelCancel = useCallback(() => {\n setIsCancelDialogOpen(false);\n setCancelError(null);\n setCancelSuccess(false);\n }, []);\n\n const handleCancelConfirm = useCallback(async () => {\n /* istanbul ignore next */ // If there is no template data, the button should not be enabled or even rendered\n if (!templateData?.id) {\n return;\n }\n\n setCancelError(null);\n setCancelSuccess(false);\n\n try {\n await cancelQuoteTemplate({\n templateId: templateData.id,\n });\n setCancelSuccess(true);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setIsCancelDialogOpen(false);\n setCancelSuccess(false);\n }, 2000);\n } catch (error) {\n const errorMessage = (error as Error).message || dictionary.confirmationModalCancelErrorFallback;\n setCancelError(errorMessage);\n }\n }, [templateData, dictionary.confirmationModalCancelErrorFallback]);\n\n const handleDismissCancelError = useCallback(() => {\n setCancelError(null);\n }, []);\n\n const handleDismissCancelSuccess = useCallback(() => {\n setCancelSuccess(false);\n }, []);\n\n const handleSendForReview = useCallback(async () => {\n // Get all reference document links\n const referenceDocumentLinks = getReferenceDocumentLinks();\n\n // Filter successful attachments\n const successfulAttachments = attachedFiles.filter(f => f.status === 'success');\n\n // Combine comment with rename reason if rename reason exists\n const combinedComment = [renameReason.trim(), comment.trim()]\n .filter(Boolean)\n .join('\\n\\n')\n .trim() || undefined;\n\n // Include renamed name if it differs from current template name\n const templateName = renameTemplateName && renameTemplateName !== templateData?.name\n ? renameTemplateName\n : undefined;\n\n // If override prop is provided, use it instead of the API\n if (onSendForReview) {\n onSendForReview({\n templateData,\n name: templateName,\n comment: combinedComment,\n referenceDocumentLinks,\n attachments: successfulAttachments.length ? successfulAttachments : undefined,\n });\n return;\n }\n // Otherwise, use the sendQuoteTemplateForReview API\n setIsSubmitting(true);\n\n try {\n await sendQuoteTemplateForReview({\n templateId: templateData!.id, // the button should be disabled if templateData is null\n name: templateName,\n comment: combinedComment,\n referenceDocumentLinks: referenceDocumentLinks.length > 0 ? referenceDocumentLinks : undefined,\n attachments: successfulAttachments.length ? successfulAttachments.map(f => ({ key: f.key })) : undefined,\n });\n // The quote-template-data event will handle updating state\n } catch (error) {\n console.error('Failed to send quote template for review:', error);\n setIsSubmitting(false);\n // TODO: Show error notification to user\n }\n }, [templateData, onSendForReview, comment, renameReason, renameTemplateName, getReferenceDocumentLinks, attachedFiles]);\n\n const handleAddDocument = useCallback(() => {\n setEditingDocument(undefined);\n setDocumentModalErrorMessage(null);\n setIsDocumentModalOpen(true);\n }, []);\n\n const handleEditDocument = useCallback((document: ReferenceDocument) => {\n setEditingDocument(document);\n setDocumentModalErrorMessage(null);\n setIsDocumentModalOpen(true);\n }, []);\n\n const handleRemoveDocument = useCallback((document: ReferenceDocument) => {\n setReferenceDocuments((prev) => prev.filter((doc) => doc.uid !== document.uid || doc.url !== document.url));\n }, []);\n\n const handleSaveDocument = useCallback((document: ReferenceDocument) => {\n // Clear any previous error messages\n setDocumentModalErrorMessage(null);\n\n if (editingDocument) {\n // Update existing document\n setReferenceDocuments((prev) =>\n prev.map((doc) =>\n doc.identifier === editingDocument.identifier\n ? document\n : doc\n )\n );\n } else {\n // Add new document\n setReferenceDocuments((prev) => [...prev, document]);\n }\n setIsDocumentModalOpen(false);\n setEditingDocument(undefined);\n }, [editingDocument]);\n\n const handleDocumentModalClose = useCallback(() => {\n setIsDocumentModalOpen(false);\n setEditingDocument(undefined);\n setDocumentModalErrorMessage(null);\n }, []);\n\n // Generate quote handler\n const handleGenerateQuote = useCallback(async () => {\n setIsGeneratingQuote(true);\n setGenerateQuoteErrorMessage('');\n setGenerateQuoteSuccessMessage('');\n try {\n await generateQuoteFromTemplate({ templateId: templateData!.id });\n // Show success message\n setGenerateQuoteSuccessMessage(dictionary.generateQuoteSuccessMessage);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n const errorMessage = error instanceof Error ? error.message : dictionary.generateQuoteErrorFallback;\n setGenerateQuoteErrorMessage(errorMessage);\n } finally {\n setIsGeneratingQuote(false);\n }\n }, [templateData, dictionary.generateQuoteSuccessMessage, dictionary.generateQuoteErrorFallback]);\n\n const handleGenerateQuoteModalCancel = useCallback(() => {\n setShowGenerateQuoteModal(false);\n setGenerateQuoteErrorMessage('');\n setGenerateQuoteSuccessMessage('');\n }, []);\n\n // Accept quote template handler\n const handleAcceptQuote = useCallback(async () => {\n setIsAccepting(true);\n setAcceptErrorMessage('');\n setAcceptSuccessMessage('');\n try {\n await acceptQuoteTemplate({ templateId: templateData!.id });\n // Show success message\n setAcceptSuccessMessage(dictionary.acceptSuccessMessage);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setShowAcceptModal(false);\n setAcceptSuccessMessage('');\n }, 2000);\n } catch (error) {\n console.error('Failed to accept quote template:', error);\n const errorMessage = error instanceof Error ? error.message : dictionary.acceptErrorFallback;\n setAcceptErrorMessage(errorMessage);\n } finally {\n setIsAccepting(false);\n }\n }, [templateData, dictionary.acceptSuccessMessage, dictionary.acceptErrorFallback]);\n\n const handleAcceptModalCancel = useCallback(() => {\n setShowAcceptModal(false);\n setAcceptErrorMessage('');\n setAcceptSuccessMessage('');\n }, []);\n\n /**\n * VNodes for the ManageNegotiableQuoteTemplate component\n */\n\n // Template name\n const templateName = useMemo(() => {\n // Determine if rename is disabled based on canSendForReview permission\n const isRenameDisabled = !templateData?.canSendForReview;\n\n // Use the renamed template name if it exists\n const templateDisplayName = renameTemplateName || templateData?.name;\n\n return (\n <Slot\n name=\"TemplateName\"\n slot={slots?.TemplateName}\n context={{ templateName: templateData?.name, templateData, templateDisplayName, isRenameDisabled }}\n >\n <div className=\"quote-management-manage-negotiable-quote-template__template-name-wrapper\">\n <h1\n data-testid=\"template-name\"\n className=\"quote-management-manage-negotiable-quote-template__template-name-title\"\n >\n {templateDisplayName}\n </h1>\n <button\n onClick={() => handleRenameClick(templateDisplayName)}\n disabled={isRenameDisabled}\n data-testid=\"rename-template-button\"\n className=\"quote-management-manage-negotiable-quote-template__rename-button\"\n aria-label=\"Rename template\"\n >\n <Edit />\n </button>\n </div>\n </Slot>\n );\n }, [slots?.TemplateName, templateData, handleRenameClick, renameTemplateName]);\n\n // Template Status\n const templateStatus = useMemo(() => {\n return (\n <Slot\n name=\"TemplateStatus\"\n slot={slots?.TemplateStatus}\n context={{ templateStatus: templateData?.status, templateData }}\n >\n <div data-testid=\"template-status\">{templateData?.status}</div>\n </Slot>\n );\n }, [slots?.TemplateStatus, templateData]);\n\n // Details\n const details = useMemo(() => {\n if (!templateData) {\n return;\n }\n\n // Determine if expiration date can be edited\n // Match Luma behavior: restrict editing for finalized/terminal statuses\n // Backend may allow these, but we follow Luma's UX for consistency\n const nonEditableStatuses = ['Active', 'Expired', 'Closed', 'Canceled', 'Inactive'];\n const canEditExpirationDate = !nonEditableStatuses.includes(templateData.status);\n\n // Format expiration date if it exists\n // Expiration date is saved immediately via API, so just use template data\n const formattedExpirationDate = templateData.expirationDate ? formattedDate(templateData.expirationDate, 'short') : undefined;\n\n return (\n <Slot name=\"Details\" slot={slots?.Details} context={{ templateData }}>\n {/* template id data */}\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"template-id-label\"\n >\n {dictionary.templateIdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"template-id-value\"\n >\n {templateData.id}\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"created-label\"\n >\n {dictionary.createdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"created-value\"\n >\n {formattedDate(templateData.createdAt, 'short')} (\n {templateData.buyer.firstname} {templateData.buyer.lastname})\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"sales-rep-label\"\n >\n {dictionary.salesRepLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"sales-rep-value\"\n >\n {templateData.salesRepName}\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"expires-label\"\n >\n {dictionary.expiresLabel}\n </span>\n <div className=\"quote-management-manage-negotiable-quote-template__expiration-wrapper\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"expires-value\"\n >\n {formattedExpirationDate}\n </span>\n {canEditExpirationDate && (\n <button\n onClick={() => handleExpirationClick(templateData.expirationDate)}\n className=\"quote-management-manage-negotiable-quote-template__edit-expiration-button\"\n data-testid=\"edit-expiration-button\"\n aria-label=\"Edit expiration date\"\n >\n <Edit />\n </button>\n )}\n </div>\n </div>\n </Slot>\n );\n }, [slots?.Details, dictionary, templateData, handleExpirationClick]);\n\n\n // Action bar\n const buttons: { label: string; value: string; disabled?: boolean }[] =\n useMemo(() => {\n return [\n {\n label: dictionary.generateQuote,\n value: 'generateQuote',\n disabled: !templateData?.canGenerateQuoteFromTemplate,\n },\n ];\n }, [dictionary, templateData?.canGenerateQuoteFromTemplate]);\n\n const actionBar = useMemo(() => {\n const handleActionsButtonClick = (action: string) => {\n switch (action) {\n case 'generateQuote':\n setShowGenerateQuoteModal(true);\n setGenerateQuoteErrorMessage(''); // Clear modal errors\n setGenerateQuoteSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n }\n };\n\n return (\n <Slot\n name=\"ActionBar\"\n slot={slots?.ActionBar}\n context={{ templateData }}\n >\n <ActionsBar\n dropdownPlaceholder={dictionary.actionsLabel}\n dropdownOptions={[]}\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 templateData,\n onActionsButtonClick,\n ]);\n\n // Reference documents\n const isEditable = useMemo(() => {\n const status = templateData?.status as string;\n return status === 'Draft' || status === 'Open';\n }, [templateData?.status]);\n\n\n const referenceDocumentsNode = useMemo(() => {\n const shouldShowTitle = referenceDocuments.length > 0 || isEditable;\n const title = shouldShowTitle ? dictionary.referenceDocumentsTitle : undefined;\n\n return (\n <Slot\n name=\"ReferenceDocuments\"\n slot={slots?.ReferenceDocuments}\n context={{ templateData, referenceDocuments, isEditable, onAddDocument: handleAddDocument, onEditDocument: handleEditDocument, onRemoveDocument: handleRemoveDocument, referenceDocumentsTitle: dictionary.referenceDocumentsTitle }}\n >\n <div data-testid=\"reference-documents\">\n {shouldShowTitle && <h2>{title}</h2>}\n <ReferenceDocumentsList\n documents={referenceDocuments}\n isEditable={isEditable}\n onAdd={handleAddDocument}\n onEdit={handleEditDocument}\n onRemove={handleRemoveDocument}\n />\n </div>\n </Slot>\n );\n }, [slots?.ReferenceDocuments, dictionary, templateData, referenceDocuments, isEditable, handleAddDocument, handleEditDocument, handleRemoveDocument]);\n\n // Shipping information title\n const shippingInformationTitle = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformationTitle\"\n slot={slots?.ShippingInformationTitle}\n context={{ templateData }}\n >\n <h2>{dictionary.shippingInformationTitle}</h2>\n </Slot>\n );\n }, [slots?.ShippingInformationTitle, templateData, dictionary]);\n\n // Shipping information\n const shippingInformation = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformation\"\n slot={slots?.ShippingInformation}\n context={{ templateData, loading, setLoading }}\n >\n <ShippingAddressDisplay\n shippingAddress={templateData?.shippingAddresses?.[0]}\n loading={loading}\n data-testid=\"manage-template-shipping-address\"\n />\n </Slot>\n );\n }, [slots?.ShippingInformation, templateData, loading, setLoading]);\n\n // Items table (using TabbedContent with ItemsQuoted)\n const itemsTable = useMemo(() => {\n return (\n <Slot\n name=\"ItemsTable\"\n slot={slots?.ItemsTable}\n context={{ templateData }}\n >\n <TabbedContent\n tabs={\n new Map([\n ['items-quoted', dictionary.itemsQuotedTab],\n ['comments', dictionary.commentsTab],\n ['history-log', dictionary.historyLogTab],\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={{ templateData }}\n >\n <ItemsQuotedTemplate templateData={templateData} />\n </Slot>,\n ],\n [\n 'comments',\n <Slot\n key=\"comments\"\n name=\"CommentsTab\"\n slot={slots?.CommentsTab}\n context={{ templateData }}\n >\n <QuoteTemplateCommentsList templateData={templateData} />\n </Slot>,\n ],\n [\n 'history-log',\n <Slot\n key=\"history-log\"\n name=\"HistoryLogTab\"\n slot={slots?.HistoryLogTab}\n context={{ templateData }}\n >\n <QuoteTemplateHistoryLog templateData={templateData} />\n </Slot>,\n ],\n ])\n }\n />\n </Slot>\n );\n }, [\n slots?.ItemsTable,\n slots?.ItemsQuotedTab,\n slots?.CommentsTab,\n slots?.HistoryLogTab,\n dictionary,\n templateData,\n ]);\n\n // Comments title\n const commentsTitle = useMemo(() => {\n return (\n <Slot\n name=\"CommentsTitle\"\n slot={slots?.CommentsTitle}\n context={{ templateData }}\n >\n <h2>{dictionary.commentsTitle}</h2>\n </Slot>\n );\n }, [slots?.CommentsTitle, dictionary, templateData]);\n\n // Comments\n const comments = useMemo(() => {\n return (\n <Slot\n name=\"Comments\"\n slot={slots?.Comments}\n context={{ templateData }}\n >\n <TextArea\n name=\"templateComments\"\n placeholder={dictionary.templateCommentsPlaceholder}\n rows={3}\n value={comment}\n onInput={(e) => {\n setComment((e.target as HTMLTextAreaElement).value);\n }}\n disabled={!templateData?.canSendForReview || isSubmitting}\n />\n </Slot>\n );\n }, [slots?.Comments, dictionary, templateData, comment, isSubmitting]);\n\n // File upload should be disabled when template cannot be sent for review\n const isFileUploadDisabled = useMemo(() => {\n return !templateData?.canSendForReview;\n }, [templateData]);\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={{ templateData, onFileChange: handleAttachFiles, attachedFiles, fileUploadError, disabled: isDisabled }}\n >\n <div \n className=\"quote-management-manage-negotiable-quote-template__attach-files\"\n {...(isDisabled ? { 'data-disabled': true } : {})}\n aria-disabled={isDisabled}\n >\n <InputFile\n id=\"manage-template-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-template-attach-files\"\n accept={acceptedFileTypes?.join(',')}\n >\n {dictionary.attachFiles}\n </InputFile>\n {fileUploadError && (\n <div\n className=\"quote-management-manage-negotiable-quote-template__file-error\"\n data-testid=\"file-upload-error\"\n >\n {fileUploadError}\n </div>\n )}\n </div>\n </Slot>\n );\n }, [\n slots?.AttachFilesField,\n templateData,\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={{ templateData, 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, templateData]);\n\n // Unsaved changes warning banner\n const unsavedChangesBanner = useMemo(\n () =>\n hasUnsavedChanges ? (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.unsavedChangesWarningHeading}\n description={dictionary.unsavedChangesWarningMessage}\n data-testid=\"unsaved-changes-warning-alert\"\n />\n ) : undefined,\n [hasUnsavedChanges, dictionary.unsavedChangesWarningHeading, dictionary.unsavedChangesWarningMessage]\n );\n\n // Shipping address warning banner\n const shippingAddressWarningBanner = useMemo(() => {\n return templateData?.shippingAddresses?.length ? undefined : (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.shippingAddressWarningHeading}\n description={dictionary.shippingAddressWarningMessage}\n data-testid=\"shipping-address-warning-alert\"\n />\n );\n }, [templateData?.shippingAddresses?.length, dictionary.shippingAddressWarningHeading, dictionary.shippingAddressWarningMessage]);\n\n const banners = useMemo(() => {\n return <>\n {unsavedChangesBanner}\n {shippingAddressWarningBanner}\n </>\n }, [unsavedChangesBanner, shippingAddressWarningBanner]);\n\n // Footer\n const footer = useMemo(() => {\n const showAcceptButton = templateData?.status === NegotiableQuoteTemplateStatus.OPEN && templateData?.canAccept;\n\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ templateData, comment, isSubmitting, attachedFiles, referenceDocuments, hasUnsavedChanges, handleSendForReview, showAcceptButton, renameTemplateName, renameReason }}\n >\n {showAcceptButton && (\n <Button\n variant=\"primary\"\n onClick={() => {\n setShowAcceptModal(true);\n setAcceptErrorMessage(''); // Clear modal errors\n setAcceptSuccessMessage(''); // Clear modal success messages\n }}\n data-testid=\"accept-button\"\n disabled={isSubmitting || hasUnsavedChanges}\n >\n {dictionary.accept}\n </Button>\n )}\n\n {templateData?.canSendForReview && (\n <Button\n variant=\"primary\"\n onClick={handleSendForReview}\n data-testid=\"send-for-review-button\"\n disabled={!templateData?.canSendForReview || isSubmitting}\n >\n {dictionary.sendForReview}\n </Button>\n )}\n {templateData?.canCancel && (\n <Button\n variant=\"tertiary\"\n onClick={() => setIsCancelDialogOpen(true)}\n data-testid=\"cancel-template-button\"\n disabled={isSubmitting}\n >\n {dictionary.cancel}\n </Button>\n )}\n {templateData?.canDelete && (\n <Button\n variant=\"tertiary\"\n onClick={() => setIsDeleteDialogOpen(true)}\n data-testid=\"delete-template-button\"\n disabled={isSubmitting}\n >\n {dictionary.delete}\n </Button>\n )}\n </Slot>\n );\n }, [\n slots?.Footer,\n dictionary,\n templateData,\n comment,\n isSubmitting,\n attachedFiles,\n handleSendForReview,\n referenceDocuments,\n hasUnsavedChanges,\n renameTemplateName,\n renameReason,\n ]);\n\n // Delete error banner\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 // Delete success banner\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 // Cancel error banner\n const cancelErrorBanner = cancelError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalCancelErrorHeading}\n description={cancelError}\n onDismiss={handleDismissCancelError}\n data-testid=\"confirmation-modal-cancel-error-banner\"\n />\n ) : null;\n\n // Cancel success banner\n const cancelSuccessBanner = cancelSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalCancelSuccessHeading}\n description={dictionary.confirmationModalCancelSuccessDescription}\n onDismiss={handleDismissCancelSuccess}\n data-testid=\"confirmation-modal-cancel-success-banner\"\n />\n ) : null;\n\n const cancelBanner = cancelSuccessBanner || cancelErrorBanner;\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 // Expiration date modal error banner\n const expirationErrorBanner = useMemo(\n () =>\n expirationError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled color=\"var(--color-error)\" />}\n heading={dictionary.expirationDateErrorHeading}\n description={expirationError}\n />\n ) : undefined,\n [expirationError, dictionary.expirationDateErrorHeading]\n );\n\n // Expiration date modal success banner\n const expirationSuccessBanner = useMemo(\n () =>\n expirationSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.expirationDateSuccessHeading}\n description={expirationSuccess}\n />\n ) : undefined,\n [expirationSuccess, dictionary.expirationDateSuccessHeading]\n );\n\n const manageNegotiableQuoteTemplateProps: ManageNegotiableQuoteTemplateComponentProps = {\n ...props,\n loading,\n templateName,\n templateStatus,\n banner: banners,\n details,\n actionBar,\n referenceDocuments: referenceDocumentsNode,\n itemsTable,\n shippingInformationTitle,\n shippingInformation,\n commentsTitle,\n comments,\n attachFilesField,\n attachedFilesList,\n footer,\n };\n\n // Create banner for generate quote modal based on success/error state\n let generateQuoteModalBanner = null;\n if (generateQuoteSuccessMessage) {\n generateQuoteModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<Icon source=\"CheckWithCircle\" />}\n heading={dictionary.generateQuoteModalSuccessHeading}\n description={generateQuoteSuccessMessage}\n data-testid=\"generate-quote-success-banner\"\n />\n );\n } else if (generateQuoteErrorMessage) {\n generateQuoteModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<Icon source=\"WarningFilled\" />}\n heading={dictionary.generateQuoteModalErrorHeading}\n description={generateQuoteErrorMessage}\n data-testid=\"generate-quote-error-banner\"\n />\n );\n }\n\n // Create banner for accept modal based on success/error state\n let acceptModalBanner = null;\n if (acceptSuccessMessage) {\n acceptModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<Icon source=\"CheckWithCircle\" />}\n heading={dictionary.acceptModalSuccessHeading}\n description={acceptSuccessMessage}\n data-testid=\"accept-success-banner\"\n />\n );\n } else if (acceptErrorMessage) {\n acceptModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<Icon source=\"WarningFilled\" />}\n heading={dictionary.acceptModalErrorHeading}\n description={acceptErrorMessage}\n data-testid=\"accept-error-banner\"\n />\n );\n }\n\n return (\n <>\n <ManageNegotiableQuoteTemplateComponent {...manageNegotiableQuoteTemplateProps} />\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 {isCancelDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isCancelDialogOpen}\n title={dictionary.confirmationModalCancelTitle}\n message={dictionary.confirmationModalCancelMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalCancelConfirm}\n onCancel={handleCancelCancel}\n onConfirm={handleCancelConfirm}\n showCloseButton={!cancelBanner}\n confirmationBanner={cancelBanner}\n />,\n document.body\n )}\n {isDocumentModalOpen &&\n createPortal(\n <ReferenceDocumentFormModal\n open={isDocumentModalOpen}\n document={editingDocument}\n errorMessage={documentModalErrorMessage || undefined}\n onSave={handleSaveDocument}\n onClose={handleDocumentModalClose}\n isSubmitting={isSubmitting}\n />,\n document.body\n )}\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuoteModalTitle}\n message={dictionary.generateQuoteModalMessage}\n cancelLabel={dictionary.generateQuoteModalCancel}\n confirmLabel={\n isGeneratingQuote\n ? dictionary.generateQuoteModalConfirmLoading\n : dictionary.generateQuoteModalConfirm\n }\n onCancel={handleGenerateQuoteModalCancel}\n onConfirm={isGeneratingQuote ? undefined : handleGenerateQuote}\n showCloseButton={true}\n confirmationBanner={generateQuoteModalBanner}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n {showAcceptModal &&\n createPortal(\n <ConfirmationModal\n open={showAcceptModal}\n title={dictionary.acceptModalTitle}\n message={dictionary.acceptModalMessage}\n cancelLabel={dictionary.acceptModalCancel}\n confirmLabel={\n isAccepting\n ? dictionary.acceptModalConfirmLoading\n : dictionary.acceptModalConfirm\n }\n onCancel={handleAcceptModalCancel}\n onConfirm={isAccepting ? undefined : handleAcceptQuote}\n showCloseButton={true}\n confirmationBanner={acceptModalBanner}\n data-testid=\"accept-confirmation-modal\"\n />,\n document.body\n )}\n {isRenameModalOpen &&\n createPortal(\n <RenameQuoteModal\n open={isRenameModalOpen}\n quoteName={renameTemplateName}\n renameReason={renameReason}\n quoteNameError={renameTemplateNameError}\n errorBanner={renameErrorBanner}\n successBanner={renameSuccessBanner}\n onQuoteNameChange={handleRenameTemplateNameChange}\n onRenameReasonChange={handleRenameReasonChange}\n onSave={handleRenameSave}\n onClose={handleRenameClose}\n />,\n document.body\n )}\n {isExpirationModalOpen &&\n createPortal(\n <ExpirationDateModal\n open={isExpirationModalOpen}\n expirationDate={expirationDate}\n expirationDateError={expirationDateError}\n errorBanner={expirationErrorBanner}\n successBanner={expirationSuccessBanner}\n onExpirationDateChange={handleExpirationDateChange}\n onSave={handleExpirationSave}\n onClose={handleExpirationClose}\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","useReferenceDocumentLinks","params","templateReferenceDocuments","localReferenceDocuments","findMatchingTemplateDocument","document","templateDoc","isDocumentInTemplateData","isDocumentModified","localDoc","getNewDocuments","doc","getReferenceDocumentLinks","hasUnsavedChanges","matchingTemplateDoc","useRenameTemplate","initialTemplateName","templateNameRequiredErrorMessage","renameTemplateName","setRenameTemplateName","renameTemplateNameError","setRenameTemplateNameError","currentTemplateName","handleRenameTemplateNameChange","handleRenameReasonChange","resetRenameState","useExpirationDate","templateId","initialExpirationDate","expirationDateRequiredErrorMessage","isExpirationModalOpen","setIsExpirationModalOpen","setExpirationDate","expirationError","setExpirationError","expirationDateError","setExpirationDateError","expirationSuccess","setExpirationSuccess","handleExpirationClick","currentExpirationDate","handleExpirationClose","handleExpirationDateChange","handleExpirationSave","selectedDate","today","setQuoteTemplateExpirationDate","resetExpirationState","ManageNegotiableQuoteTemplate","templateData","setTemplateData","isCancelDialogOpen","setIsCancelDialogOpen","cancelError","setCancelError","cancelSuccess","setCancelSuccess","referenceDocuments","setReferenceDocuments","isDocumentModalOpen","setIsDocumentModalOpen","editingDocument","setEditingDocument","documentModalErrorMessage","setDocumentModalErrorMessage","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","generateQuoteSuccessMessage","setGenerateQuoteSuccessMessage","generateQuoteErrorMessage","setGenerateQuoteErrorMessage","showAcceptModal","setShowAcceptModal","isAccepting","setIsAccepting","acceptSuccessMessage","setAcceptSuccessMessage","acceptErrorMessage","setAcceptErrorMessage","hasAutoOpened","hasUnsavedReferenceDocuments","hasUnsavedRenameChanges","quoteTemplateDataEvent","NegotiableQuoteTemplateStatus","openQuoteTemplate","deleteQuoteTemplate","handleCancelCancel","handleCancelConfirm","cancelQuoteTemplate","handleDismissCancelError","handleDismissCancelSuccess","referenceDocumentLinks","combinedComment","templateName","sendQuoteTemplateForReview","handleAddDocument","handleEditDocument","handleRemoveDocument","handleSaveDocument","handleDocumentModalClose","handleGenerateQuote","generateQuoteFromTemplate","handleGenerateQuoteModalCancel","handleAcceptQuote","acceptQuoteTemplate","handleAcceptModalCancel","isRenameDisabled","templateDisplayName","templateStatus","canEditExpirationDate","formattedExpirationDate","isEditable","referenceDocumentsNode","shouldShowTitle","title","ReferenceDocumentsList","itemsTable","ItemsQuotedTemplate","QuoteTemplateCommentsList","QuoteTemplateHistoryLog","commentsTitle","comments","unsavedChangesBanner","shippingAddressWarningBanner","banners","showAcceptButton","cancelErrorBanner","cancelBanner","expirationErrorBanner","expirationSuccessBanner","manageNegotiableQuoteTemplateProps","generateQuoteModalBanner","Icon","acceptModalBanner","ManageNegotiableQuoteTemplateComponent","ReferenceDocumentFormModal","ExpirationDateModal"],"mappings":"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"}