@dropins/storefront-quote-management 0.0.1-alpha3 → 0.0.1-alpha30

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 (312) hide show
  1. package/api/acceptQuoteTemplate/acceptQuoteTemplate.d.ts +13 -0
  2. package/api/{getCustomerData/getCustomerData.d.ts → acceptQuoteTemplate/graphql/acceptQuoteTemplate.d.ts} +2 -2
  3. package/{data/transforms/__fixtures__/customerData.d.ts → api/acceptQuoteTemplate/index.d.ts} +2 -2
  4. package/api/addQuoteTemplateLineItemNote/addQuoteTemplateLineItemNote.d.ts +15 -0
  5. package/api/addQuoteTemplateLineItemNote/graphql/setQuoteTemplateLineItemNote.d.ts +10 -0
  6. package/api/addQuoteTemplateLineItemNote/index.d.ts +10 -0
  7. package/api/addQuoteTemplateShippingAddress/addQuoteTemplateShippingAddress.d.ts +37 -0
  8. package/api/addQuoteTemplateShippingAddress/graphql/setNegotiableQuoteTemplateShippingAddress.d.ts +10 -0
  9. package/api/addQuoteTemplateShippingAddress/index.d.ts +10 -0
  10. package/api/cancelQuoteTemplate/cancelQuoteTemplate.d.ts +14 -0
  11. package/api/cancelQuoteTemplate/graphql/cancelQuoteTemplate.d.ts +10 -0
  12. package/api/cancelQuoteTemplate/index.d.ts +10 -0
  13. package/api/closeNegotiableQuote/closeNegotiableQuote.d.ts +31 -0
  14. package/api/closeNegotiableQuote/graphql/CloseNegotiableQuoteMutation.d.ts +2 -0
  15. package/api/closeNegotiableQuote/index.d.ts +10 -0
  16. package/api/createQuoteTemplate/createQuoteTemplate.d.ts +4 -0
  17. package/api/createQuoteTemplate/graphql/createQuoteTemplate.d.ts +10 -0
  18. package/api/createQuoteTemplate/index.d.ts +10 -0
  19. package/api/deleteQuote/deleteQuote.d.ts +28 -0
  20. package/api/deleteQuote/graphql/DeleteQuoteMutation.d.ts +10 -0
  21. package/api/{getCustomerData → deleteQuote}/index.d.ts +1 -1
  22. package/{data/models/customer-model.d.ts → api/deleteQuoteTemplate/deleteQuoteTemplate.d.ts} +6 -8
  23. package/api/deleteQuoteTemplate/graphql/deleteQuoteTemplate.d.ts +10 -0
  24. package/api/deleteQuoteTemplate/index.d.ts +10 -0
  25. package/api/duplicateNegotiableQuote/duplicateNegotiableQuote.d.ts +8 -0
  26. package/api/duplicateNegotiableQuote/graphql/duplicateNegotiableQuoteMutation.d.ts +10 -0
  27. package/api/duplicateNegotiableQuote/index.d.ts +10 -0
  28. package/api/generateQuoteFromTemplate/generateQuoteFromTemplate.d.ts +15 -0
  29. package/api/generateQuoteFromTemplate/graphql/generateNegotiableQuoteFromTemplate.d.ts +10 -0
  30. package/api/generateQuoteFromTemplate/index.d.ts +10 -0
  31. package/api/getQuoteData/getQuoteData.d.ts +10 -0
  32. package/api/getQuoteData/graphql/QuoteDataQuery.d.ts +2 -0
  33. package/api/getQuoteData/index.d.ts +10 -0
  34. package/api/getQuoteTemplateData/getQuoteTemplateData.d.ts +4 -0
  35. package/api/getQuoteTemplateData/graphql/getQuoteTemplateData.d.ts +10 -0
  36. package/api/getQuoteTemplateData/index.d.ts +10 -0
  37. package/api/getQuoteTemplates/getQuoteTemplates.d.ts +34 -0
  38. package/api/getQuoteTemplates/graphql/getQuoteTemplates.d.ts +10 -0
  39. package/api/getQuoteTemplates/index.d.ts +10 -0
  40. package/api/getStoreConfig/getStoreConfig.d.ts +4 -0
  41. package/api/getStoreConfig/graphql/StoreConfigQuery.d.ts +10 -0
  42. package/api/getStoreConfig/index.d.ts +10 -0
  43. package/api/graphql/NegotiableQuoteAddressFragment.d.ts +10 -0
  44. package/api/graphql/NegotiableQuoteFragment.d.ts +5 -13
  45. package/api/graphql/NegotiableQuoteListFragment.d.ts +10 -0
  46. package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +10 -0
  47. package/api/graphql/SearchResultPageInfoFragment.d.ts +10 -0
  48. package/api/graphql/ShippingMethodFragment.d.ts +10 -0
  49. package/api/graphql/SortFieldsFragment.d.ts +10 -0
  50. package/api/index.d.ts +34 -1
  51. package/api/initialize/initialize.d.ts +2 -0
  52. package/api/negotiableQuotes/graphql/NegotiableQuotesQuery.d.ts +10 -0
  53. package/api/negotiableQuotes/index.d.ts +10 -0
  54. package/api/negotiableQuotes/negotiableQuotes.d.ts +39 -0
  55. package/api/openQuoteTemplate/graphql/openQuoteTemplate.d.ts +10 -0
  56. package/api/openQuoteTemplate/index.d.ts +10 -0
  57. package/api/openQuoteTemplate/openQuoteTemplate.d.ts +13 -0
  58. package/api/removeNegotiableQuoteItems/graphql/RemoveNegotiableQuoteItemsMutation.d.ts +10 -0
  59. package/api/removeNegotiableQuoteItems/index.d.ts +10 -0
  60. package/api/removeNegotiableQuoteItems/removeNegotiableQuoteItems.d.ts +8 -0
  61. package/api/removeQuoteTemplateItems/graphql/removeNegotiableQuoteTemplateItems.d.ts +10 -0
  62. package/api/removeQuoteTemplateItems/index.d.ts +10 -0
  63. package/api/removeQuoteTemplateItems/removeQuoteTemplateItems.d.ts +14 -0
  64. package/api/renameNegotiableQuote/graphql/RenameNegotiableQuoteMutation.d.ts +10 -0
  65. package/api/renameNegotiableQuote/index.d.ts +10 -0
  66. package/api/renameNegotiableQuote/renameNegotiableQuote.d.ts +9 -0
  67. package/api/requestNegotiableQuote/graphql/RequestNegotiableQuoteMutation.d.ts +4 -12
  68. package/api/requestNegotiableQuote/requestNegotiableQuote.d.ts +3 -0
  69. package/api/sendForReview/graphql/SendNegotiableQuoteForReviewMutation.d.ts +10 -0
  70. package/api/sendForReview/index.d.ts +10 -0
  71. package/api/sendForReview/sendForReview.d.ts +11 -0
  72. package/api/sendQuoteTemplateForReview/graphql/sendQuoteTemplateForReview.d.ts +10 -0
  73. package/api/sendQuoteTemplateForReview/index.d.ts +10 -0
  74. package/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview.d.ts +22 -0
  75. package/api/setLineItemNote/graphql/SetLineItemNoteMutation.d.ts +10 -0
  76. package/api/setLineItemNote/index.d.ts +10 -0
  77. package/api/setLineItemNote/setLineItemNote.d.ts +10 -0
  78. package/api/setShippingAddress/graphql/SetNegotiableQuoteShippingAddressMutation.d.ts +10 -0
  79. package/api/setShippingAddress/index.d.ts +2 -0
  80. package/api/setShippingAddress/setShippingAddress.d.ts +110 -0
  81. package/api/updateQuantities/graphql/UpdateNegotiableQuoteQuantitiesMutation.d.ts +10 -0
  82. package/api/updateQuantities/index.d.ts +10 -0
  83. package/api/updateQuantities/updateQuantities.d.ts +36 -0
  84. package/api/updateQuoteTemplateItemQuantities/graphql/updateNegotiableQuoteTemplateQuantities.d.ts +10 -0
  85. package/api/updateQuoteTemplateItemQuantities/index.d.ts +10 -0
  86. package/api/updateQuoteTemplateItemQuantities/updateQuoteTemplateItemQuantities.d.ts +20 -0
  87. package/api/uploadFile/graphql/FinishUploadMutation.d.ts +10 -0
  88. package/api/uploadFile/graphql/InitiateUploadMutation.d.ts +10 -0
  89. package/api/uploadFile/index.d.ts +10 -0
  90. package/api/uploadFile/uploadFile.d.ts +12 -0
  91. package/api.js +56 -22
  92. package/api.js.map +1 -1
  93. package/chunks/AttachedFilesList.js +4 -0
  94. package/chunks/AttachedFilesList.js.map +1 -0
  95. package/chunks/ChevronDown.js +4 -0
  96. package/chunks/ChevronDown.js.map +1 -0
  97. package/chunks/ConfirmationModal.js +4 -0
  98. package/chunks/ConfirmationModal.js.map +1 -0
  99. package/chunks/ItemsQuoted.js +4 -0
  100. package/chunks/ItemsQuoted.js.map +1 -0
  101. package/chunks/ItemsQuotedTemplate.js +4 -0
  102. package/chunks/ItemsQuotedTemplate.js.map +1 -0
  103. package/chunks/LineItemNoteModal.js +4 -0
  104. package/chunks/LineItemNoteModal.js.map +1 -0
  105. package/chunks/NegotiableQuoteFragment.js +391 -0
  106. package/chunks/NegotiableQuoteFragment.js.map +1 -0
  107. package/chunks/NegotiableQuoteTemplateFragment.js +196 -0
  108. package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -0
  109. package/chunks/OrderSummaryLine.js +4 -0
  110. package/chunks/OrderSummaryLine.js.map +1 -0
  111. package/chunks/QuoteCommentsList.js +4 -0
  112. package/chunks/QuoteCommentsList.js.map +1 -0
  113. package/chunks/QuoteCommentsList3.js +4 -0
  114. package/chunks/QuoteCommentsList3.js.map +1 -0
  115. package/chunks/QuoteHistoryLog.js +4 -0
  116. package/chunks/QuoteHistoryLog.js.map +1 -0
  117. package/chunks/QuoteHistoryLog3.js +4 -0
  118. package/chunks/QuoteHistoryLog3.js.map +1 -0
  119. package/chunks/QuoteTemplateCommentsList.js +4 -0
  120. package/chunks/QuoteTemplateCommentsList.js.map +1 -0
  121. package/chunks/QuoteTemplateHistoryLog.js +4 -0
  122. package/chunks/QuoteTemplateHistoryLog.js.map +1 -0
  123. package/chunks/RenameQuoteModal.js +4 -0
  124. package/chunks/RenameQuoteModal.js.map +1 -0
  125. package/chunks/ShippingAddressDisplay.js +4 -0
  126. package/chunks/ShippingAddressDisplay.js.map +1 -0
  127. package/chunks/WarningFilled.js +4 -0
  128. package/chunks/WarningFilled.js.map +1 -0
  129. package/chunks/addQuoteTemplateLineItemNote.js +33 -0
  130. package/chunks/addQuoteTemplateLineItemNote.js.map +1 -0
  131. package/chunks/dateUtils.js +4 -0
  132. package/chunks/dateUtils.js.map +1 -0
  133. package/chunks/duplicateNegotiableQuote.js +121 -0
  134. package/chunks/duplicateNegotiableQuote.js.map +1 -0
  135. package/chunks/generateQuoteFromTemplate.js +12 -0
  136. package/chunks/generateQuoteFromTemplate.js.map +1 -0
  137. package/chunks/getQuoteTemplates.js +50 -0
  138. package/chunks/getQuoteTemplates.js.map +1 -0
  139. package/chunks/negotiableQuotes.js +77 -0
  140. package/chunks/negotiableQuotes.js.map +1 -0
  141. package/chunks/openQuoteTemplate.js +51 -0
  142. package/chunks/openQuoteTemplate.js.map +1 -0
  143. package/chunks/requestNegotiableQuote.js +6 -53
  144. package/chunks/requestNegotiableQuote.js.map +1 -1
  145. package/chunks/setLineItemNote.js +47 -0
  146. package/chunks/setLineItemNote.js.map +1 -0
  147. package/chunks/state.js +4 -0
  148. package/chunks/state.js.map +1 -0
  149. package/chunks/transform-quote-template.js +4 -0
  150. package/chunks/transform-quote-template.js.map +1 -0
  151. package/chunks/transform-quote.js +4 -0
  152. package/chunks/transform-quote.js.map +1 -0
  153. package/chunks/uploadFile.js +20 -0
  154. package/chunks/uploadFile.js.map +1 -0
  155. package/components/ActionsBar/ActionsBar.d.ts +15 -0
  156. package/components/ActionsBar/index.d.ts +11 -0
  157. package/components/AttachedFilesList/AttachedFilesList.d.ts +16 -0
  158. package/components/AttachedFilesList/index.d.ts +11 -0
  159. package/components/ConfirmationModal/ConfirmationModal.d.ts +17 -0
  160. package/components/ConfirmationModal/index.d.ts +11 -0
  161. package/components/ItemsQuoted/ItemsQuoted.d.ts +11 -0
  162. package/components/ItemsQuoted/index.d.ts +11 -0
  163. package/components/LineItemNoteModal/LineItemNoteModal.d.ts +17 -0
  164. package/components/LineItemNoteModal/index.d.ts +11 -0
  165. package/components/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +22 -0
  166. package/components/ManageNegotiableQuote/__fixtures__/ManageNegotiableQuoteProps.d.ts +4 -0
  167. package/components/ManageNegotiableQuote/index.d.ts +11 -0
  168. package/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +21 -0
  169. package/components/ManageNegotiableQuoteTemplate/__fixtures__/ManageNegotiableQuoteTemplateProps.d.ts +4 -0
  170. package/components/ManageNegotiableQuoteTemplate/index.d.ts +11 -0
  171. package/components/OrderSummary/OrderSummary.d.ts +48 -0
  172. package/components/OrderSummary/index.d.ts +11 -0
  173. package/components/OrderSummaryLine/OrderSummaryLine.d.ts +13 -0
  174. package/components/OrderSummaryLine/index.d.ts +11 -0
  175. package/components/ProductListTable/ProductListTable.d.ts +61 -0
  176. package/components/ProductListTable/index.d.ts +11 -0
  177. package/components/QuoteCommentsList/QuoteCommentsList.d.ts +17 -0
  178. package/components/QuoteCommentsList/index.d.ts +11 -0
  179. package/components/QuoteHistoryLog/QuoteHistoryLog.d.ts +77 -0
  180. package/components/QuoteHistoryLog/index.d.ts +11 -0
  181. package/components/QuotePricesSummary/QuotePricesSummary.d.ts +16 -0
  182. package/components/QuotePricesSummary/index.d.ts +11 -0
  183. package/components/QuoteSummaryList/QuoteSummaryList.d.ts +13 -0
  184. package/components/QuoteSummaryList/index.d.ts +11 -0
  185. package/components/QuoteTemplatesListTable/QuoteTemplatesListTable.d.ts +29 -0
  186. package/components/QuoteTemplatesListTable/index.d.ts +10 -0
  187. package/components/QuotesListTable/QuotesListTable.d.ts +29 -0
  188. package/components/QuotesListTable/index.d.ts +11 -0
  189. package/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.d.ts +30 -0
  190. package/components/ReferenceDocumentFormModal/index.d.ts +11 -0
  191. package/components/ReferenceDocumentsList/ReferenceDocumentsList.d.ts +18 -0
  192. package/components/ReferenceDocumentsList/index.d.ts +11 -0
  193. package/components/RenameQuoteModal/RenameQuoteModal.d.ts +18 -0
  194. package/components/RenameQuoteModal/index.d.ts +11 -0
  195. package/components/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.d.ts +1 -0
  196. package/components/ShippingAddressDisplay/ShippingAddressDisplay.d.ts +12 -0
  197. package/components/ShippingAddressDisplay/index.d.ts +11 -0
  198. package/components/TabbedContent/TabbedContent.d.ts +10 -0
  199. package/components/TabbedContent/index.d.ts +11 -0
  200. package/components/index.d.ts +30 -0
  201. package/containers/ItemsQuoted/ItemsQuoted.d.ts +30 -0
  202. package/containers/ItemsQuoted/index.d.ts +11 -0
  203. package/containers/ItemsQuoted.d.ts +3 -0
  204. package/containers/ItemsQuoted.js +4 -0
  205. package/containers/ItemsQuoted.js.map +1 -0
  206. package/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.d.ts +25 -0
  207. package/containers/ItemsQuotedTemplate/index.d.ts +11 -0
  208. package/containers/ItemsQuotedTemplate.d.ts +3 -0
  209. package/containers/ItemsQuotedTemplate.js +4 -0
  210. package/containers/ItemsQuotedTemplate.js.map +1 -0
  211. package/containers/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +91 -0
  212. package/containers/ManageNegotiableQuote/index.d.ts +11 -0
  213. package/containers/ManageNegotiableQuote.d.ts +3 -0
  214. package/containers/ManageNegotiableQuote.js +4 -0
  215. package/containers/ManageNegotiableQuote.js.map +1 -0
  216. package/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +90 -0
  217. package/containers/ManageNegotiableQuoteTemplate/index.d.ts +11 -0
  218. package/containers/ManageNegotiableQuoteTemplate.d.ts +3 -0
  219. package/containers/ManageNegotiableQuoteTemplate.js +6 -0
  220. package/containers/ManageNegotiableQuoteTemplate.js.map +1 -0
  221. package/containers/OrderSummary/OrderSummary.d.ts +11 -0
  222. package/containers/OrderSummary/index.d.ts +11 -0
  223. package/containers/OrderSummary.d.ts +3 -0
  224. package/containers/OrderSummary.js +4 -0
  225. package/containers/OrderSummary.js.map +1 -0
  226. package/containers/OrderSummaryLine/OrderSummaryLine.d.ts +14 -0
  227. package/containers/OrderSummaryLine/index.d.ts +11 -0
  228. package/containers/OrderSummaryLine.d.ts +3 -0
  229. package/containers/OrderSummaryLine.js +4 -0
  230. package/containers/OrderSummaryLine.js.map +1 -0
  231. package/containers/QuoteCommentsList/QuoteCommentsList.d.ts +9 -0
  232. package/containers/QuoteCommentsList/index.d.ts +11 -0
  233. package/containers/QuoteCommentsList.d.ts +3 -0
  234. package/containers/QuoteCommentsList.js +4 -0
  235. package/containers/QuoteCommentsList.js.map +1 -0
  236. package/containers/QuoteHistoryLog/QuoteHistoryLog.d.ts +9 -0
  237. package/containers/QuoteHistoryLog/index.d.ts +11 -0
  238. package/containers/QuoteHistoryLog.d.ts +3 -0
  239. package/containers/QuoteHistoryLog.js +4 -0
  240. package/containers/QuoteHistoryLog.js.map +1 -0
  241. package/containers/QuoteSummaryList/QuoteSummaryList.d.ts +51 -0
  242. package/containers/QuoteSummaryList/index.d.ts +11 -0
  243. package/containers/QuoteSummaryList.d.ts +3 -0
  244. package/containers/QuoteSummaryList.js +4 -0
  245. package/containers/QuoteSummaryList.js.map +1 -0
  246. package/containers/QuoteTemplateCommentsList/QuoteTemplateCommentsList.d.ts +9 -0
  247. package/containers/QuoteTemplateCommentsList/index.d.ts +11 -0
  248. package/containers/QuoteTemplateCommentsList.d.ts +3 -0
  249. package/containers/QuoteTemplateCommentsList.js +4 -0
  250. package/containers/QuoteTemplateCommentsList.js.map +1 -0
  251. package/containers/QuoteTemplateHistoryLog/QuoteTemplateHistoryLog.d.ts +9 -0
  252. package/containers/QuoteTemplateHistoryLog/index.d.ts +11 -0
  253. package/containers/QuoteTemplateHistoryLog.d.ts +3 -0
  254. package/containers/QuoteTemplateHistoryLog.js +4 -0
  255. package/containers/QuoteTemplateHistoryLog.js.map +1 -0
  256. package/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.d.ts +74 -0
  257. package/containers/QuoteTemplatesListTable/index.d.ts +11 -0
  258. package/containers/QuoteTemplatesListTable.d.ts +3 -0
  259. package/containers/QuoteTemplatesListTable.js +4 -0
  260. package/containers/QuoteTemplatesListTable.js.map +1 -0
  261. package/containers/QuotesListTable/QuotesListTable.d.ts +72 -0
  262. package/containers/QuotesListTable/index.d.ts +11 -0
  263. package/containers/QuotesListTable.d.ts +3 -0
  264. package/containers/QuotesListTable.js +4 -0
  265. package/containers/QuotesListTable.js.map +1 -0
  266. package/containers/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.d.ts +10 -0
  267. package/containers/RequestNegotiableQuoteForm.js +1 -1
  268. package/containers/RequestNegotiableQuoteForm.js.map +1 -1
  269. package/containers/ShippingAddressDisplay/ShippingAddressDisplay.d.ts +10 -0
  270. package/containers/ShippingAddressDisplay/index.d.ts +11 -0
  271. package/containers/ShippingAddressDisplay.d.ts +1 -0
  272. package/containers/ShippingAddressDisplay.js +4 -0
  273. package/containers/ShippingAddressDisplay.js.map +1 -0
  274. package/containers/index.d.ts +22 -0
  275. package/data/models/__fixtures__/negotiableQuoteModel.d.ts +8 -0
  276. package/data/models/__fixtures__/negotiableQuoteTemplateModel.d.ts +4 -0
  277. package/data/models/__fixtures__/negotiableQuoteTemplatesListModel.d.ts +5 -0
  278. package/data/models/__fixtures__/negotiableQuotesListModel.d.ts +5 -0
  279. package/data/models/__fixtures__/storeConfigModel.d.ts +5 -0
  280. package/data/models/index.d.ts +11 -1
  281. package/data/models/negotiable-quote-model.d.ts +266 -27
  282. package/data/models/negotiable-quote-template-model.d.ts +148 -0
  283. package/data/models/store-config-model.d.ts +27 -0
  284. package/data/transforms/__fixtures__/negotiableQuoteData.d.ts +665 -2
  285. package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +1665 -0
  286. package/data/transforms/__fixtures__/storeConfigData.d.ts +31 -0
  287. package/data/transforms/index.d.ts +6 -13
  288. package/data/transforms/transform-quote-template.d.ts +5 -0
  289. package/data/transforms/transform-quote.d.ts +13 -2
  290. package/data/transforms/transform-store-config.d.ts +4 -0
  291. package/hooks/useItemsQuotedTemplate.d.ts +16 -0
  292. package/hooks/useQuoteSummaryData.d.ts +10 -0
  293. package/hooks/useReferenceDocumentLinks.d.ts +34 -0
  294. package/hooks/useRemoveTemplateItems.d.ts +25 -0
  295. package/hooks/useRenameTemplate.d.ts +71 -0
  296. package/hooks/useUpdateTemplateQuantities.d.ts +27 -0
  297. package/i18n/en_US.json.d.ts +438 -1
  298. package/lib/configurationTransformers.d.ts +27 -0
  299. package/lib/itemFormatters.d.ts +47 -0
  300. package/lib/priceCalculators.d.ts +41 -0
  301. package/lib/state.d.ts +6 -0
  302. package/package.json +1 -1
  303. package/render.js +6 -2
  304. package/render.js.map +1 -1
  305. package/types/state.types.d.ts +13 -0
  306. package/utils/dateUtils.d.ts +26 -0
  307. package/utils/fileUtils.d.ts +46 -0
  308. package/utils/mapAuthPermissions.d.ts +39 -0
  309. package/api/getCustomerData/graphql/CustomerQuery.d.ts +0 -2
  310. package/api/graphql/CustomerFragment.d.ts +0 -2
  311. package/data/models/__fixtures__/customerModel.d.ts +0 -4
  312. package/data/transforms/transform-customer.d.ts +0 -15
@@ -0,0 +1,36 @@
1
+ import { NegotiableQuoteModel } from '../../data/models/negotiable-quote-model';
2
+
3
+ export interface QuantityItem {
4
+ /** The unique ID of the quote item */
5
+ quoteItemUid: string;
6
+ /** The new quantity for the item (must be greater than 0) */
7
+ quantity: number;
8
+ }
9
+ export interface UpdateQuantitiesInput {
10
+ /** The unique ID of the negotiable quote */
11
+ quoteUid: string;
12
+ /** Array of items with their new quantities */
13
+ items: QuantityItem[];
14
+ }
15
+ /**
16
+ * Updates the quantities of items in a negotiable quote.
17
+ *
18
+ * @param input - The input parameters for updating quantities
19
+ * @param input.quoteUid - The unique ID of the negotiable quote
20
+ * @param input.items - Array of items with their new quantities
21
+ * @returns Promise that resolves to the updated quote model
22
+ * @throws Error if validation fails or GraphQL operation fails
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const quote = await updateQuantities({
27
+ * quoteUid: 'quote-123',
28
+ * items: [
29
+ * { quoteItemUid: 'item-1', quantity: 5 },
30
+ * { quoteItemUid: 'item-2', quantity: 3 }
31
+ * ]
32
+ * });
33
+ * ```
34
+ */
35
+ export declare const updateQuantities: (input: UpdateQuantitiesInput) => Promise<NegotiableQuoteModel | null>;
36
+ //# sourceMappingURL=updateQuantities.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const UPDATE_NEGOTIABLE_QUOTE_TEMPLATE_QUANTITIES_MUTATION: string;
10
+ //# sourceMappingURL=updateNegotiableQuoteTemplateQuantities.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './updateQuoteTemplateItemQuantities';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,20 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export interface NegotiableQuoteTemplateItemQuantityInput {
10
+ itemId: string;
11
+ quantity: number;
12
+ minQty?: number;
13
+ maxQty?: number;
14
+ }
15
+ export interface UpdateQuoteTemplateItemQuantitiesParams {
16
+ templateId: string;
17
+ items: NegotiableQuoteTemplateItemQuantityInput[];
18
+ }
19
+ export declare const updateQuoteTemplateItemQuantities: (params: UpdateQuoteTemplateItemQuantitiesParams) => Promise<import('../../data/models/negotiable-quote-template-model').NegotiableQuoteTemplateModel>;
20
+ //# sourceMappingURL=updateQuoteTemplateItemQuantities.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const FINISH_UPLOAD_MUTATION = "\n mutation FINISH_UPLOAD_MUTATION($input: finishUploadInput!) {\n finishUpload(input: $input) {\n success\n key\n message\n }\n }\n";
10
+ //# sourceMappingURL=FinishUploadMutation.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const INITIATE_UPLOAD_MUTATION = "\n mutation INITIATE_UPLOAD_MUTATION($input: initiateUploadInput!) {\n initiateUpload(input: $input) {\n upload_url\n key\n expires_at\n }\n }\n";
10
+ //# sourceMappingURL=InitiateUploadMutation.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './uploadFile';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,12 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const uploadFile: (file: File) => Promise<{
10
+ key: string;
11
+ }>;
12
+ //# sourceMappingURL=uploadFile.d.ts.map
package/api.js CHANGED
@@ -1,29 +1,63 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{s as n,D as r}from"./chunks/requestNegotiableQuote.js";import{r as F}from"./chunks/requestNegotiableQuote.js";import{FetchGraphQL as l}from"@dropins/tools/fetch-graphql.js";import{events as i}from"@dropins/tools/event-bus.js";import{Initializer as E}from"@dropins/tools/lib.js";const d=`
4
- fragment CUSTOMER_FRAGMENT on Customer {
5
- role {
6
- permissions {
7
- text
8
- children {
9
- text
10
- children {
11
- text
12
- children {
13
- text
14
- }
15
- }
16
- }
17
- }
18
- }
3
+ import{r as J}from"./chunks/requestNegotiableQuote.js";import{g as I}from"./chunks/duplicateNegotiableQuote.js";import{c as V,a as W,d as Z,b as ee,r as te,s as se}from"./chunks/duplicateNegotiableQuote.js";import{F as re,N as ae,S as ie,n as ne}from"./chunks/negotiableQuotes.js";import{events as a}from"@dropins/tools/event-bus.js";import{s as r,D as f,a as h,Q as n}from"./chunks/state.js";import{f as d,t as q}from"./chunks/transform-quote.js";import{e as ue,r as pe,s as me,c as le,d as ge}from"./chunks/transform-quote.js";import{N as D}from"./chunks/NegotiableQuoteFragment.js";import{u as _e}from"./chunks/uploadFile.js";import{a as T}from"./chunks/transform-quote-template.js";import{N as Q}from"./chunks/NegotiableQuoteTemplateFragment.js";import{Q as he,a as Te,S as Qe,g as Ee}from"./chunks/getQuoteTemplates.js";import{a as Ie,c as qe,d as De,o as Ne,s as ye}from"./chunks/openQuoteTemplate.js";import{a as Se,r as we,u as Fe}from"./chunks/addQuoteTemplateLineItemNote.js";import{g as ve}from"./chunks/generateQuoteFromTemplate.js";import{r as Me,s as Oe,u as xe}from"./chunks/setLineItemNote.js";import{Initializer as N}from"@dropins/tools/lib.js";import"@dropins/tools/fetch-graphql.js";function y(e){if(!e||typeof e!="object")return{requestQuote:!1,editQuote:!1,deleteQuote:!1,checkoutQuote:!1,viewQuoteTemplates:!1,manageQuoteTemplates:!1,generateQuoteFromTemplate:!1};if(e.all===!0)return{requestQuote:!0,editQuote:!0,deleteQuote:!0,checkoutQuote:!0,viewQuoteTemplates:!0,manageQuoteTemplates:!0,generateQuoteFromTemplate:!0};const s=e["Magento_NegotiableQuote::all"]===!0,t=e["Magento_NegotiableQuoteTemplate::all"]===!0,o=s||e["Magento_NegotiableQuote::manage"]===!0;return{requestQuote:o,editQuote:o,deleteQuote:o,checkoutQuote:s||e["Magento_NegotiableQuote::checkout"]===!0,viewQuoteTemplates:t||e["Magento_NegotiableQuoteTemplate::view_template"]===!0,manageQuoteTemplates:t||e["Magento_NegotiableQuoteTemplate::manage"]===!0,generateQuoteFromTemplate:t||e["Magento_NegotiableQuoteTemplate::generate_quote"]===!0}}function p(e){if(r.quoteDataLoaded)return;const s=m.config.getConfig(),{quoteId:t,quoteTemplateId:o}=s;!e.editQuote||!t&&!o||(r.quoteDataLoaded=!0,t&&I(t).then(i=>{r.quoteDataInitialized||a.emit("quote-management/quote-data/initialized",{quote:i,permissions:e}),r.quoteDataInitialized=!0}).catch(i=>{r.quoteDataLoaded=!1,a.emit("quote-management/quote-data/error",{error:i})}),o&&L(o).catch(i=>{r.quoteDataLoaded=!1,a.emit("quote-management/quote-template-data/error",{error:i})}))}const m=new N({init:async e=>{const s={};m.config.setConfig({...s,...e}),await w().then(t=>{r.config=t}).catch(t=>{console.error("Failed to fetch store config: ",t),r.config=h}),r.initialized=!0,a.emit("quote-management/initialized",{})},listeners:()=>[a.on("authenticated",async e=>{r.authenticated=!!e,e||(r.permissions=f,r.quoteDataLoaded=!1,a.emit("quote-management/permissions",f))},{eager:!0}),a.on("auth/permissions",async e=>{const s=y(e);r.permissions=s,r.quoteDataLoaded=!1,a.emit("quote-management/permissions",r.permissions)},{eager:!0}),a.on("quote-management/permissions",async e=>{r.initialized&&p(e)},{eager:!0}),a.on("quote-management/initialized",async()=>{p(r.permissions)},{eager:!0}),a.on("checkout/updated",async e=>{r.initialized&&(e==null?void 0:e.type)==="quote"&&(r.quoteDataLoaded=!1,p(r.permissions))},{eager:!0})]}),B=m.config;function b(e){if(!e)return h;const s=t=>[n.TAX_EXCLUDED,n.TAX_INCLUDED,n.TAX_INCLUDED_AND_EXCLUDED].includes(t)?t:n.TAX_EXCLUDED;return{quoteSummaryDisplayTotal:e.cart_summary_display_quantity,quoteSummaryMaxItems:e.max_items_in_order_summary,quoteDisplaySettings:{zeroTax:e.shopping_cart_display_zero_tax,subtotal:s(e.shopping_cart_display_subtotal),price:s(e.shopping_cart_display_price),shipping:s(e.shopping_cart_display_shipping),fullSummary:e.shopping_cart_display_full_summary,grandTotal:e.shopping_cart_display_grand_total},useConfigurableParentThumbnail:e.configurable_thumbnail_source==="parent"}}const S=`
4
+ query STORE_CONFIG_QUERY {
5
+ storeConfig {
6
+ cart_summary_display_quantity
7
+ max_items_in_order_summary
8
+ shopping_cart_display_full_summary
9
+ shopping_cart_display_grand_total
10
+ shopping_cart_display_price
11
+ shopping_cart_display_shipping
12
+ shopping_cart_display_subtotal
13
+ shopping_cart_display_zero_tax
14
+ configurable_thumbnail_source
19
15
  }
20
- `,h=`
21
- query CUSTOMER_QUERY {
22
- customer {
23
- ...CUSTOMER_FRAGMENT
16
+ }
17
+ `,w=async()=>d(S,{method:"GET",cache:"force-cache"}).then(({errors:e,data:s})=>{if(e){const t=e.map(o=>o.message).join(", ");throw new Error(`Failed to get store config: ${t}`)}return b(s.storeConfig)}),F=`
18
+ mutation SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION(
19
+ $quoteUid: ID!
20
+ $addressId: ID
21
+ $addressData: NegotiableQuoteAddressInput
22
+ ) {
23
+ setNegotiableQuoteShippingAddress(
24
+ input: {
25
+ quote_uid: $quoteUid
26
+ shipping_addresses: {
27
+ customer_address_uid: $addressId
28
+ address: $addressData
24
29
  }
30
+ }
31
+ ) {
32
+ quote {
33
+ ...NegotiableQuoteFragment
34
+ }
35
+ }
36
+ }
37
+ ${D}
38
+ `;function U(e){const{additionalInput:s,...t}=e,o={city:t.city,company:t.company,country_code:t.countryCode,firstname:t.firstname,lastname:t.lastname,postcode:t.postcode,region:t.region,region_id:t.regionId,save_in_address_book:t.saveInAddressBook,street:t.street,telephone:t.telephone};return{...s||{},...o}}const H=async e=>{const{quoteUid:s,addressId:t,addressData:o}=e;if(!s)throw new Error("Quote UID is required");if(t===void 0&&!o)throw new Error("Either addressId or addressData must be provided");if(t!==void 0&&o)throw new Error("Cannot provide both addressId and addressData");const i=o?U(o):null;return d(F,{variables:{quoteUid:s,addressId:t||null,addressData:i}}).then(l=>{var c,_;const{errors:g}=l;if(g){const E=g.map(A=>A.message).join("; ");throw new Error(`Failed to set shipping address: ${E}`)}const u=q((_=(c=l.data)==null?void 0:c.setNegotiableQuoteShippingAddress)==null?void 0:_.quote);if(!u)throw new Error("Failed to transform quote data: Invalid response structure");return a.emit("quote-management/shipping-address-set",{quote:u,input:{quoteUid:s,addressId:t,addressData:o}}),u})},v=`
39
+ query QUOTE_TEMPLATE_DATA_QUERY($templateId: ID!) {
40
+ negotiableQuoteTemplate(templateId: $templateId) {
41
+ ...NegotiableQuoteTemplateFragment
25
42
  }
43
+ }
26
44
 
27
- ${d}
28
- `,p="All/Quotes/View/Request, Edit, Delete",f="All/Quotes/View/Request, Edit, Delete",Q="All/Quotes/View/Request, Edit, Delete",R=t=>{const e=[],s=(u,m=[])=>{for(const o of u){const c=[...m,o.text];o.children&&o.children.length>0?s(o.children,c):e.push(c.join("/"))}};return s(t),e};function g(t){const{role:{permissions:e}}=t,s=R(e);return{permissions:{canRequestQuote:s.includes(p),canEditQuote:s.includes(f),canDeleteQuote:s.includes(Q)}}}const S=async()=>{var t;if(!n.authenticated)return Promise.reject(new Error("Unauthorized"));try{const e=await T(h);if(!((t=e==null?void 0:e.data)!=null&&t.customer))throw new Error("No customer data received");return g(e.data.customer)}catch(e){return Promise.reject(e)}},a=new E({init:async t=>{const e={};a.config.setConfig({...e,...t})},listeners:()=>[i.on("authenticated",async t=>{n.authenticated=!!t,t?S().then(e=>{n.permissions={requestQuote:e.permissions.canRequestQuote,editQuote:e.permissions.canEditQuote,deleteQuote:e.permissions.canDeleteQuote},i.emit("quote-management/permissions",n.permissions)}).catch(e=>{console.error(e),n.permissions=r,i.emit("quote-management/permissions",r)}):(n.permissions=r,i.emit("quote-management/permissions",r))},{eager:!0})]}),N=a.config,{setEndpoint:O,setFetchGraphQlHeader:q,removeFetchGraphQlHeader:A,setFetchGraphQlHeaders:I,fetchGraphQl:T,getConfig:w}=new l().getMethods();export{N as config,T as fetchGraphQl,w as getConfig,S as getCustomerData,a as initialize,A as removeFetchGraphQlHeader,F as requestNegotiableQuote,O as setEndpoint,q as setFetchGraphQlHeader,I as setFetchGraphQlHeaders};
45
+ ${Q}
46
+ `,L=async e=>{var s;if(!r.authenticated)throw new Error("Unauthorized");if(!e)throw new Error("Template ID is required");try{const t=await d(v,{variables:{templateId:e}});if(!((s=t==null?void 0:t.data)!=null&&s.negotiableQuoteTemplate))throw new Error("Quote template not found");const o=T(t.data.negotiableQuoteTemplate);if(!o)throw new Error("Failed to transform quote template data");return a.emit("quote-management/quote-template-data",{quoteTemplate:o,permissions:r.permissions}),o}catch(t){return Promise.reject(t)}},M=`
47
+ mutation SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION(
48
+ $templateId: ID!
49
+ $shippingAddress: NegotiableQuoteTemplateShippingAddressInput!
50
+ ) {
51
+ setNegotiableQuoteTemplateShippingAddress(
52
+ input: {
53
+ template_id: $templateId
54
+ shipping_address: $shippingAddress
55
+ }
56
+ ) {
57
+ ...NegotiableQuoteTemplateFragment
58
+ }
59
+ }
60
+
61
+ ${Q}
62
+ `,X=async e=>{var s;if(!e.templateId)throw new Error("Template ID is required");if(!e.shippingAddress)throw new Error("Shipping address is required");if(!r.authenticated)throw new Error("Unauthorized");if(!e.shippingAddress.address&&!e.shippingAddress.customerAddressUid)throw new Error("Either address or customerAddressUid must be provided");try{const t=await d(M,{variables:{templateId:e.templateId,shippingAddress:{address:e.shippingAddress.address?{city:e.shippingAddress.address.city,company:e.shippingAddress.address.company,country_code:e.shippingAddress.address.countryCode,fax:e.shippingAddress.address.fax,firstname:e.shippingAddress.address.firstname,lastname:e.shippingAddress.address.lastname,middlename:e.shippingAddress.address.middlename,postcode:e.shippingAddress.address.postcode,prefix:e.shippingAddress.address.prefix,region:e.shippingAddress.address.region,region_id:e.shippingAddress.address.regionId,save_in_address_book:e.shippingAddress.address.saveInAddressBook,street:e.shippingAddress.address.street,suffix:e.shippingAddress.address.suffix,telephone:e.shippingAddress.address.telephone,vat_id:e.shippingAddress.address.vatId}:void 0,customer_address_uid:e.shippingAddress.customerAddressUid,customer_notes:e.shippingAddress.customerNotes}}});if(!((s=t==null?void 0:t.data)!=null&&s.setNegotiableQuoteTemplateShippingAddress))throw new Error("No quote template data received");const o=T(t.data.setNegotiableQuoteTemplateShippingAddress);if(!o)throw new Error("Failed to transform quote template data");return a.emit("quote-management/quote-template-data",{quoteTemplate:o,permissions:r.permissions}),o}catch(t){return Promise.reject(t)}};export{re as FilterMatchTypeEnum,ae as NegotiableQuoteSortableField,he as QuoteTemplateFilterStatus,Te as QuoteTemplateSortField,Qe as SortDirection,ie as SortEnum,Ie as acceptQuoteTemplate,Se as addQuoteTemplateLineItemNote,X as addQuoteTemplateShippingAddress,qe as cancelQuoteTemplate,V as closeNegotiableQuote,B as config,W as createQuoteTemplate,Z as deleteQuote,De as deleteQuoteTemplate,ee as duplicateQuote,d as fetchGraphQl,ve as generateQuoteFromTemplate,ue as getConfig,I as getQuoteData,L as getQuoteTemplateData,Ee as getQuoteTemplates,w as getStoreConfig,m as initialize,ne as negotiableQuotes,Ne as openQuoteTemplate,pe as removeFetchGraphQlHeader,Me as removeNegotiableQuoteItems,we as removeQuoteTemplateItems,te as renameNegotiableQuote,J as requestNegotiableQuote,se as sendForReview,ye as sendQuoteTemplateForReview,me as setEndpoint,le as setFetchGraphQlHeader,ge as setFetchGraphQlHeaders,Oe as setLineItemNote,H as setShippingAddress,xe as updateQuantities,Fe as updateQuoteTemplateItemQuantities,_e as uploadFile};
29
63
  //# sourceMappingURL=api.js.map
package/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["/@dropins/storefront-quote-management/src/api/graphql/CustomerFragment.ts","/@dropins/storefront-quote-management/src/api/getCustomerData/graphql/CustomerQuery.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-customer.ts","/@dropins/storefront-quote-management/src/api/getCustomerData/getCustomerData.ts","/@dropins/storefront-quote-management/src/api/initialize/initialize.ts","/@dropins/storefront-quote-management/src/api/fetch-graphql/fetch-graphql.ts"],"sourcesContent":["export const CUSTOMER_FRAGMENT = /* GraphQL */ `\n fragment CUSTOMER_FRAGMENT on Customer {\n role {\n permissions {\n text\n children {\n text\n children {\n text\n children {\n text\n }\n }\n }\n }\n }\n }\n`","import { CUSTOMER_FRAGMENT } from '@/quote-management/api/graphql/CustomerFragment';\n\nexport const CUSTOMER_QUERY = `\n query CUSTOMER_QUERY {\n customer {\n ...CUSTOMER_FRAGMENT\n }\n }\n\n ${CUSTOMER_FRAGMENT}\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 { CustomerModel } from \"../models\";\n\ntype PermissionsSchema = {\n text: string;\n children: PermissionsSchema[];\n}\n\nconst CAN_REQUEST_QUOTE_PERMISSION = 'All/Quotes/View/Request, Edit, Delete';\nconst CAN_EDIT_QUOTE_PERMISSION = 'All/Quotes/View/Request, Edit, Delete';\nconst CAN_DELETE_QUOTE_PERMISSION = 'All/Quotes/View/Request, Edit, Delete';\n\n/**\n * Flatten the permissions into a list of strings\n * @param permissions - The permissions to flatten\n * @returns A list of strings representing the flattened permissions\n */\nexport const flattenPermissions = (permissions: PermissionsSchema[]): string[] => {\n const result: string[] = [];\n \n // Recursively traverse the permissions and build the path\n const traverse = (nodes: PermissionsSchema[], path: string[] = []) => {\n for (const node of nodes) {\n const currentPath = [...path, node.text];\n \n if (node.children && node.children.length > 0) {\n traverse(node.children, currentPath);\n } else {\n result.push(currentPath.join('/'));\n }\n }\n };\n \n traverse(permissions);\n return result;\n}\n\nexport function transformCustomer(customerData: any): CustomerModel {\n const { role: { permissions } } = customerData;\n const flattenedPermissions = flattenPermissions(permissions);\n return {\n permissions: {\n canRequestQuote: flattenedPermissions.includes(CAN_REQUEST_QUOTE_PERMISSION),\n canEditQuote: flattenedPermissions.includes(CAN_EDIT_QUOTE_PERMISSION),\n canDeleteQuote: flattenedPermissions.includes(CAN_DELETE_QUOTE_PERMISSION),\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 { fetchGraphQl } from '@/quote-management/api/';\nimport { CUSTOMER_QUERY } from './graphql/CustomerQuery';\nimport { transformCustomer } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\n\nexport const getCustomerData = async () => { \n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n try {\n const results: any = await fetchGraphQl(CUSTOMER_QUERY);\n \n if (!results?.data?.customer) {\n throw new Error('No customer data received');\n }\n \n return transformCustomer(results.data.customer);\n } catch (error) {\n return Promise.reject(error);\n }\n}\n","import { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { state, DEFAULT_PERMISSIONS } from '@/quote-management/lib/state';\nimport { getCustomerData } from '@/quote-management/api/getCustomerData';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [\n events.on('authenticated', async (authenticated) => {\n state.authenticated = !!authenticated;\n\n if (authenticated) {\n getCustomerData().then((customerData) => {\n state.permissions = {\n requestQuote: customerData.permissions.canRequestQuote,\n editQuote: customerData.permissions.canEditQuote,\n deleteQuote: customerData.permissions.canDeleteQuote,\n };\n events.emit('quote-management/permissions', state.permissions);\n })\n .catch((error) => {\n console.error(error);\n state.permissions = DEFAULT_PERMISSIONS;\n events.emit('quote-management/permissions', DEFAULT_PERMISSIONS);\n });\n } else {\n state.permissions = DEFAULT_PERMISSIONS;\n events.emit('quote-management/permissions', DEFAULT_PERMISSIONS);\n }\n }, {\n eager: true,\n }),\n ],\n});\n\nexport const config = initialize.config;\n","import { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n"],"names":["CUSTOMER_FRAGMENT","CUSTOMER_QUERY","CAN_REQUEST_QUOTE_PERMISSION","CAN_EDIT_QUOTE_PERMISSION","CAN_DELETE_QUOTE_PERMISSION","flattenPermissions","permissions","result","traverse","nodes","path","node","currentPath","transformCustomer","customerData","flattenedPermissions","getCustomerData","state","results","fetchGraphQl","_a","error","initialize","Initializer","config","defaultConfig","events","authenticated","DEFAULT_PERMISSIONS","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getConfig","FetchGraphQL"],"mappings":"6RAAO,MAAMA,EAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECElCC,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOxBD,CAAiB;AAAA,ECOjBE,EAA+B,wCAC/BC,EAA4B,wCAC5BC,EAA8B,wCAOvBC,EAAsBC,GAA+C,CAC9E,MAAMC,EAAmB,CAAA,EAGnBC,EAAW,CAACC,EAA4BC,EAAiB,CAAA,IAAO,CAClE,UAAWC,KAAQF,EAAO,CACtB,MAAMG,EAAc,CAAC,GAAGF,EAAMC,EAAK,IAAI,EAEnCA,EAAK,UAAYA,EAAK,SAAS,OAAS,EACxCH,EAASG,EAAK,SAAUC,CAAW,EAEnCL,EAAO,KAAKK,EAAY,KAAK,GAAG,CAAC,CAEzC,CACJ,EAEA,OAAAJ,EAASF,CAAW,EACbC,CACX,EAEO,SAASM,EAAkBC,EAAkC,CAChE,KAAM,CAAE,KAAM,CAAE,YAAAR,CAAA,GAAkBQ,EAC5BC,EAAuBV,EAAmBC,CAAW,EAC3D,MAAO,CACH,YAAa,CACT,gBAAiBS,EAAqB,SAASb,CAA4B,EAC3E,aAAca,EAAqB,SAASZ,CAAyB,EACrE,eAAgBY,EAAqB,SAASX,CAA2B,CAAA,CAC7E,CAER,CCzCO,MAAMY,EAAkB,SAAY,OACvC,GAAI,CAACC,EAAM,cACP,OAAO,QAAQ,OAAO,IAAI,MAAM,cAAc,CAAC,EAGnD,GAAI,CACA,MAAMC,EAAe,MAAMC,EAAalB,CAAc,EAEtD,GAAI,GAACmB,EAAAF,GAAA,YAAAA,EAAS,OAAT,MAAAE,EAAe,UAChB,MAAM,IAAI,MAAM,2BAA2B,EAG/C,OAAOP,EAAkBK,EAAQ,KAAK,QAAQ,CAClD,OAASG,EAAO,CACZ,OAAO,QAAQ,OAAOA,CAAK,CAC/B,CACJ,ECpBaC,EAAa,IAAIC,EAAyB,CACrD,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAgB,CAAA,EAEtBH,EAAW,OAAO,UAAU,CAAE,GAAGG,EAAe,GAAGD,EAAQ,CAC7D,EAEA,UAAW,IAAM,CACfE,EAAO,GAAG,gBAAiB,MAAOC,GAAkB,CAClDV,EAAM,cAAgB,CAAC,CAACU,EAEpBA,EACFX,EAAA,EAAkB,KAAMF,GAAiB,CACvCG,EAAM,YAAc,CAClB,aAAcH,EAAa,YAAY,gBACvC,UAAWA,EAAa,YAAY,aACpC,YAAaA,EAAa,YAAY,cAAA,EAExCY,EAAO,KAAK,+BAAgCT,EAAM,WAAW,CAC/D,CAAC,EACE,MAAOI,GAAU,CAChB,QAAQ,MAAMA,CAAK,EACnBJ,EAAM,YAAcW,EACpBF,EAAO,KAAK,+BAAgCE,CAAmB,CACjE,CAAC,GAEHX,EAAM,YAAcW,EACpBF,EAAO,KAAK,+BAAgCE,CAAmB,EAEnE,EAAG,CACD,MAAO,EAAA,CACR,CAAA,CAEL,CAAC,EAEYJ,EAASF,EAAW,OC3CpB,CACX,YAAAO,EACA,sBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,aAAAb,EACA,UAAAc,CACF,EAAI,IAAIC,EAAA,EAAe,WAAA"}
1
+ {"version":3,"file":"api.js","sources":["/@dropins/storefront-quote-management/src/utils/mapAuthPermissions.ts","/@dropins/storefront-quote-management/src/api/initialize/initialize.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-store-config.ts","/@dropins/storefront-quote-management/src/api/getStoreConfig/graphql/StoreConfigQuery.ts","/@dropins/storefront-quote-management/src/api/getStoreConfig/getStoreConfig.ts","/@dropins/storefront-quote-management/src/api/setShippingAddress/graphql/SetNegotiableQuoteShippingAddressMutation.ts","/@dropins/storefront-quote-management/src/api/setShippingAddress/setShippingAddress.ts","/@dropins/storefront-quote-management/src/api/getQuoteTemplateData/graphql/getQuoteTemplateData.ts","/@dropins/storefront-quote-management/src/api/getQuoteTemplateData/getQuoteTemplateData.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateShippingAddress/graphql/setNegotiableQuoteTemplateShippingAddress.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateShippingAddress/addQuoteTemplateShippingAddress.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { State } from '@/quote-management/types/state.types';\n\n/**\n * Type definition for the auth/permissions event payload\n * Contains flat Adobe Commerce permission keys with boolean values\n */\nexport type AuthPermissionsPayload = {\n all?: boolean;\n 'Magento_NegotiableQuote::all'?: boolean;\n 'Magento_NegotiableQuote::manage'?: boolean;\n 'Magento_NegotiableQuote::checkout'?: boolean;\n 'Magento_NegotiableQuoteTemplate::all'?: boolean;\n 'Magento_NegotiableQuoteTemplate::view_template'?: boolean;\n 'Magento_NegotiableQuoteTemplate::manage'?: boolean;\n 'Magento_NegotiableQuoteTemplate::generate_quote'?: boolean;\n [key: string]: boolean | undefined;\n};\n\n/**\n * Maps the auth/permissions event payload to internal permissions structure.\n * \n * Implements hierarchical permission checking:\n * 1. Top-level \"all\": If true, grants all permissions\n * 2. Module-level \"::all\": Grants all permissions for that module\n * 3. Specific permissions: Maps individual keys to internal flags\n * \n * @param payload - The raw auth/permissions event payload\n * @returns Typed permissions object matching the state structure\n * \n * @example\n * ```typescript\n * const permissions = mapAuthPermissions({\n * \"Magento_NegotiableQuote::manage\": true,\n * \"Magento_NegotiableQuote::checkout\": true\n * });\n * // Returns: { requestQuote: true, editQuote: true, deleteQuote: true, checkoutQuote: true, ... }\n * ```\n */\nexport function mapAuthPermissions(\n payload: AuthPermissionsPayload | null | undefined\n): State['permissions'] {\n // Handle null/undefined payload - return all false\n if (!payload || typeof payload !== 'object') {\n return {\n requestQuote: false,\n editQuote: false,\n deleteQuote: false,\n checkoutQuote: false,\n viewQuoteTemplates: false,\n manageQuoteTemplates: false,\n generateQuoteFromTemplate: false,\n };\n }\n\n // If top-level \"all\" is true, grant all permissions\n if (payload.all === true) {\n return {\n requestQuote: true,\n editQuote: true,\n deleteQuote: true,\n checkoutQuote: true,\n viewQuoteTemplates: true,\n manageQuoteTemplates: true,\n generateQuoteFromTemplate: true,\n };\n }\n\n // Check module-level \"all\" permissions\n const hasAllQuotePermissions = payload['Magento_NegotiableQuote::all'] === true;\n const hasAllTemplatePermissions = payload['Magento_NegotiableQuoteTemplate::all'] === true;\n\n // Map specific permissions with fallback to module-level \"all\"\n const hasManagePermission = \n hasAllQuotePermissions || payload['Magento_NegotiableQuote::manage'] === true;\n\n return {\n // Magento_NegotiableQuote::manage maps to request, edit, and delete\n requestQuote: hasManagePermission,\n editQuote: hasManagePermission,\n deleteQuote: hasManagePermission,\n \n // Magento_NegotiableQuote::checkout maps to checkoutQuote\n checkoutQuote: \n hasAllQuotePermissions || payload['Magento_NegotiableQuote::checkout'] === true,\n \n // Template permissions\n viewQuoteTemplates: \n hasAllTemplatePermissions || payload['Magento_NegotiableQuoteTemplate::view_template'] === true,\n manageQuoteTemplates: \n hasAllTemplatePermissions || payload['Magento_NegotiableQuoteTemplate::manage'] === true,\n generateQuoteFromTemplate: \n hasAllTemplatePermissions || payload['Magento_NegotiableQuoteTemplate::generate_quote'] === true,\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 { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n state,\n DEFAULT_CONFIG,\n DEFAULT_PERMISSIONS,\n} from '@/quote-management/lib/state';\nimport {\n getQuoteData,\n getStoreConfig,\n getQuoteTemplateData,\n} from '@/quote-management/api';\nimport { mapAuthPermissions, AuthPermissionsPayload } from '@/quote-management/utils/mapAuthPermissions';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n quoteId?: string;\n quoteTemplateId?: string;\n};\n\nfunction loadQuoteData(permissions: typeof DEFAULT_PERMISSIONS) {\n // Prevent loading quote data twice\n if (state.quoteDataLoaded) return;\n\n const config = initialize.config.getConfig();\n const { quoteId, quoteTemplateId } = config;\n\n\n // Only proceed if we have permissions and at least one ID to load\n if (!permissions.editQuote || (!quoteId && !quoteTemplateId)) {\n return;\n }\n\n // Mark as loaded before starting the async operations to prevent duplicate calls\n state.quoteDataLoaded = true;\n\n if (quoteId) {\n getQuoteData(quoteId)\n .then((quote) => {\n if (!state.quoteDataInitialized) {\n events.emit('quote-management/quote-data/initialized', { quote, permissions });\n }\n state.quoteDataInitialized = true;\n })\n .catch((error) => {\n state.quoteDataLoaded = false;\n events.emit('quote-management/quote-data/error', { error });\n });\n }\n\n if (quoteTemplateId) {\n getQuoteTemplateData(quoteTemplateId)\n .catch((error) => {\n state.quoteDataLoaded = false;\n events.emit('quote-management/quote-template-data/error', { error });\n });\n }\n}\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n // Set config\n initialize.config.setConfig({ ...defaultConfig, ...config });\n\n // Fetch store config\n await getStoreConfig()\n .then((config) => {\n state.config = config;\n })\n .catch((error) => {\n console.error('Failed to fetch store config: ', error);\n state.config = DEFAULT_CONFIG;\n });\n\n // Mark initialization as complete\n state.initialized = true;\n events.emit('quote-management/initialized', {});\n },\n\n listeners: () => [\n events.on('authenticated', async (authenticated) => {\n state.authenticated = !!authenticated;\n\n // Defensive: reset permissions if user logs out\n // This ensures permissions are cleared even if auth/permissions event doesn't fire\n if (!authenticated) {\n state.permissions = DEFAULT_PERMISSIONS;\n state.quoteDataLoaded = false;\n events.emit('quote-management/permissions', DEFAULT_PERMISSIONS);\n }\n },\n {\n eager: true,\n }\n ),\n\n events.on('auth/permissions', async (payload: AuthPermissionsPayload) => {\n // Map the auth permissions payload to internal permissions structure\n const permissions = mapAuthPermissions(payload);\n\n state.permissions = permissions;\n // Reset quote data loaded flag when permissions change to allow reloading\n state.quoteDataLoaded = false;\n events.emit('quote-management/permissions', state.permissions);\n }, {\n eager: true,\n }),\n\n events.on('quote-management/permissions', async (permissions) => {\n // Only process quote data loading after initialization is complete\n if (!state.initialized) {\n return;\n }\n\n loadQuoteData(permissions);\n }, { eager: true }),\n\n events.on('quote-management/initialized', async () => {\n loadQuoteData(state.permissions);\n }, { eager: true }),\n\n events.on('checkout/updated', async (data) => {\n // Only process after initialization is complete\n if (!state.initialized) {\n return;\n }\n\n if (data?.type !== 'quote') {\n return;\n }\n\n // Reset the flag to allow reloading of quote data\n state.quoteDataLoaded = false;\n loadQuoteData(state.permissions);\n }, { eager: true }),\n ],\n});\n\nexport const config = initialize.config;\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 QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\nimport { DEFAULT_CONFIG } from '@/quote-management/lib/state';\n\nexport function transformStoreConfig(data: any): StoreConfigModel {\n if (!data) return DEFAULT_CONFIG;\n\n const transformQuoteDisplayAmountSetting = (\n quoteDisplayAmountSetting: number\n ) => {\n if (\n [\n QuoteDisplayAmount.TAX_EXCLUDED,\n QuoteDisplayAmount.TAX_INCLUDED,\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED,\n ].includes(quoteDisplayAmountSetting)\n ) {\n return quoteDisplayAmountSetting;\n }\n\n return QuoteDisplayAmount.TAX_EXCLUDED;\n };\n\n return {\n quoteSummaryDisplayTotal: data.cart_summary_display_quantity,\n quoteSummaryMaxItems: data.max_items_in_order_summary,\n quoteDisplaySettings: {\n zeroTax: data.shopping_cart_display_zero_tax,\n subtotal: transformQuoteDisplayAmountSetting(\n data.shopping_cart_display_subtotal\n ),\n price: transformQuoteDisplayAmountSetting(\n data.shopping_cart_display_price\n ),\n shipping: transformQuoteDisplayAmountSetting(\n data.shopping_cart_display_shipping\n ),\n fullSummary: data.shopping_cart_display_full_summary,\n grandTotal: data.shopping_cart_display_grand_total,\n },\n useConfigurableParentThumbnail:\n data.configurable_thumbnail_source === 'parent',\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\nexport const STORE_CONFIG_QUERY = /* GraphQL */ `\n query STORE_CONFIG_QUERY {\n storeConfig {\n cart_summary_display_quantity\n max_items_in_order_summary\n shopping_cart_display_full_summary\n shopping_cart_display_grand_total\n shopping_cart_display_price\n shopping_cart_display_shipping\n shopping_cart_display_subtotal\n shopping_cart_display_zero_tax\n configurable_thumbnail_source\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 { fetchGraphQl } from '@/quote-management/api';\nimport { StoreConfigModel } from '@/quote-management/data/models';\nimport { transformStoreConfig } from '@/quote-management/data/transforms';\nimport { STORE_CONFIG_QUERY } from './graphql/StoreConfigQuery';\n\nexport const getStoreConfig = async (): Promise<StoreConfigModel> => {\n return fetchGraphQl(STORE_CONFIG_QUERY, {\n method: 'GET',\n cache: 'force-cache',\n }).then(({ errors, data }) => {\n if (errors) {\n const errorMessage = errors.map((e: any) => e.message).join(', ');\n throw new Error(`Failed to get store config: ${errorMessage}`);\n }\n\n return transformStoreConfig(data.storeConfig);\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 { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION = `\n mutation SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION(\n $quoteUid: ID!\n $addressId: ID\n $addressData: NegotiableQuoteAddressInput\n ) {\n setNegotiableQuoteShippingAddress(\n input: {\n quote_uid: $quoteUid\n shipping_addresses: {\n customer_address_uid: $addressId\n address: $addressData\n }\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\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 { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION } from './graphql/SetNegotiableQuoteShippingAddressMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface AddressInput {\n /** City name */\n city: string;\n /** Optional company name */\n company?: string;\n /** Two-letter country code (e.g., 'US') */\n countryCode: string;\n /** First name */\n firstname: string;\n /** Last name */\n lastname: string;\n /** Postal/ZIP code */\n postcode: string;\n /** Optional state/province name */\n region?: string;\n /** Optional state/province ID */\n regionId?: number;\n /** Whether to save this address to the customer's address book */\n saveInAddressBook?: boolean;\n /** Street address lines (array) */\n street: string[];\n /** Phone number */\n telephone: string;\n /** \n * Additional input (optional custom fields for the address).\n * These fields will be merged into the address data sent to GraphQL.\n * Standard fields take precedence over additional fields to prevent\n * accidental override of required address attributes.\n * \n * @example\n * ```ts\n * additionalInput: {\n * vat_id: 'GB123456789',\n * custom_attribute: 'value',\n * delivery_instructions: 'Leave at door'\n * }\n * ```\n */\n additionalInput?: Record<string, any>;\n}\n\nexport interface SetShippingAddressInput {\n /** The unique ID of the negotiable quote */\n quoteUid: string;\n /** The ID of a saved customer address (use this OR addressData, not both) */\n addressId?: number;\n /** New address data (use this OR addressId, not both) */\n addressData?: AddressInput;\n}\n\n/**\n * Transform camelCase address data to snake_case for GraphQL mutation.\n * Additional fields from additionalInput are spread into the result, with\n * standard fields taking precedence (defensive flexibility approach).\n */\nfunction transformAddressToSnakeCase(address: AddressInput) {\n const { additionalInput, ...standardFields } = address;\n \n // Build the standard transformed fields\n const transformedStandardFields = {\n city: standardFields.city,\n company: standardFields.company,\n country_code: standardFields.countryCode,\n firstname: standardFields.firstname,\n lastname: standardFields.lastname,\n postcode: standardFields.postcode,\n region: standardFields.region,\n region_id: standardFields.regionId,\n save_in_address_book: standardFields.saveInAddressBook,\n street: standardFields.street,\n telephone: standardFields.telephone,\n };\n \n // Spread additional input first, then standard fields take precedence\n // This provides defensive flexibility: allows custom fields while protecting core fields\n return {\n ...(additionalInput || {}),\n ...transformedStandardFields,\n };\n}\n\n/**\n * Sets or updates the shipping address for a negotiable quote.\n * \n * @param input - The input parameters for setting the shipping address\n * @param input.quoteUid - The unique ID of the negotiable quote\n * @param input.addressId - Optional ID of a saved customer address (use this OR addressData)\n * @param input.addressData - Optional new address data (use this OR addressId)\n * @param input.addressData.additionalInput - Optional additional address fields to pass through to GraphQL\n * @returns Promise that resolves to the updated quote model with shipping addresses including uid field\n * @throws Error if validation fails or GraphQL operation fails\n * \n * @example\n * ```ts\n * // Using a saved address\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressId: 5\n * });\n * \n * // Using new address data\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressData: {\n * firstname: 'John',\n * lastname: 'Doe',\n * street: ['123 Main St'],\n * city: 'San Francisco',\n * countryCode: 'US',\n * postcode: '94103',\n * telephone: '555-1234'\n * }\n * });\n * \n * // Using address data with additional custom fields\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressData: {\n * firstname: 'John',\n * lastname: 'Doe',\n * street: ['123 Main St'],\n * city: 'San Francisco',\n * countryCode: 'US',\n * postcode: '94103',\n * telephone: '555-1234',\n * additionalInput: {\n * vat_id: 'GB123456789',\n * custom_attribute_1: 'value1',\n * delivery_instructions: 'Leave at door'\n * }\n * }\n * });\n * \n * // Access address identifier\n * if (quote?.shippingAddresses?.[0]) {\n * console.log('Address UID:', quote.shippingAddresses[0].uid);\n * }\n * ```\n */\nexport const setShippingAddress = async (\n input: SetShippingAddressInput\n): Promise<NegotiableQuoteModel | null> => {\n const { quoteUid, addressId, addressData } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n // Validate that exactly one of addressId or addressData is provided\n if (addressId === undefined && !addressData) {\n throw new Error('Either addressId or addressData must be provided');\n }\n\n if (addressId !== undefined && addressData) {\n throw new Error('Cannot provide both addressId and addressData');\n }\n\n // Transform addressData to snake_case if provided\n const transformedAddressData = addressData\n ? transformAddressToSnakeCase(addressData)\n : null;\n\n return fetchGraphQl(SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION, {\n variables: {\n quoteUid,\n addressId: addressId || null,\n addressData: transformedAddressData,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to set shipping address: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(\n response.data?.setNegotiableQuoteShippingAddress?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/shipping-address-set', {\n quote: quoteData,\n input: { quoteUid, addressId, addressData },\n });\n\n return quoteData;\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 { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const GET_QUOTE_TEMPLATE_DATA = /* GraphQL */ `\n query QUOTE_TEMPLATE_DATA_QUERY($templateId: ID!) {\n negotiableQuoteTemplate(templateId: $templateId) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\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 { fetchGraphQl } from '@/quote-management/api';\nimport { GET_QUOTE_TEMPLATE_DATA } from './graphql/getQuoteTemplateData';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { NegotiableQuoteTemplateModel } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const getQuoteTemplateData = async (templateId: string): Promise<NegotiableQuoteTemplateModel | null> => {\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n if (!templateId) {\n throw new Error('Template ID is required');\n }\n\n try {\n const results: any = await fetchGraphQl(GET_QUOTE_TEMPLATE_DATA, {\n variables: { templateId },\n });\n\n\n if (!results?.data?.negotiableQuoteTemplate) {\n throw new Error('Quote template not found');\n }\n\n const transformedData = transformQuoteTemplate(results.data.negotiableQuoteTemplate);\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\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 { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION = /* GraphQL */ `\n mutation SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION(\n $templateId: ID!\n $shippingAddress: NegotiableQuoteTemplateShippingAddressInput!\n ) {\n setNegotiableQuoteTemplateShippingAddress(\n input: {\n template_id: $templateId\n shipping_address: $shippingAddress\n }\n ) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n \n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\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 { fetchGraphQl } from '@/quote-management/api';\nimport { SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION } from './graphql/setNegotiableQuoteTemplateShippingAddress';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface NegotiableQuoteAddressInput {\n city: string;\n company?: string;\n countryCode: string;\n fax?: string;\n firstname: string;\n lastname: string;\n middlename?: string;\n postcode?: string;\n prefix?: string;\n region?: string;\n regionId?: number;\n saveInAddressBook?: boolean;\n street: string[];\n suffix?: string;\n telephone?: string;\n vatId?: string;\n}\n\nexport interface NegotiableQuoteTemplateShippingAddressInput {\n address?: NegotiableQuoteAddressInput;\n customerAddressUid?: string;\n customerNotes?: string;\n}\n\nexport interface AddQuoteTemplateShippingAddressParams {\n templateId: string;\n shippingAddress: NegotiableQuoteTemplateShippingAddressInput;\n}\n\nexport const addQuoteTemplateShippingAddress = async (\n params: AddQuoteTemplateShippingAddressParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.shippingAddress) {\n throw new Error('Shipping address is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n // Validate that at least one of address or customerAddressUid is provided\n if (\n !params.shippingAddress.address &&\n !params.shippingAddress.customerAddressUid\n ) {\n throw new Error('Either address or customerAddressUid must be provided');\n }\n\n try {\n const results: any = await fetchGraphQl(\n SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION,\n {\n variables: {\n templateId: params.templateId,\n shippingAddress: {\n address: params.shippingAddress.address\n ? {\n city: params.shippingAddress.address.city,\n company: params.shippingAddress.address.company,\n country_code: params.shippingAddress.address.countryCode,\n fax: params.shippingAddress.address.fax,\n firstname: params.shippingAddress.address.firstname,\n lastname: params.shippingAddress.address.lastname,\n middlename: params.shippingAddress.address.middlename,\n postcode: params.shippingAddress.address.postcode,\n prefix: params.shippingAddress.address.prefix,\n region: params.shippingAddress.address.region,\n region_id: params.shippingAddress.address.regionId,\n save_in_address_book:\n params.shippingAddress.address.saveInAddressBook,\n street: params.shippingAddress.address.street,\n suffix: params.shippingAddress.address.suffix,\n telephone: params.shippingAddress.address.telephone,\n vat_id: params.shippingAddress.address.vatId,\n }\n : undefined,\n customer_address_uid: params.shippingAddress.customerAddressUid,\n customer_notes: params.shippingAddress.customerNotes,\n },\n },\n }\n );\n\n if (!results?.data?.setNegotiableQuoteTemplateShippingAddress) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.setNegotiableQuoteTemplateShippingAddress\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n"],"names":["mapAuthPermissions","payload","hasAllQuotePermissions","hasAllTemplatePermissions","hasManagePermission","loadQuoteData","permissions","state","config","initialize","quoteId","quoteTemplateId","getQuoteData","quote","events","error","getQuoteTemplateData","Initializer","defaultConfig","getStoreConfig","DEFAULT_CONFIG","authenticated","DEFAULT_PERMISSIONS","data","transformStoreConfig","transformQuoteDisplayAmountSetting","quoteDisplayAmountSetting","QuoteDisplayAmount","STORE_CONFIG_QUERY","fetchGraphQl","errors","errorMessage","e","SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION","NEGOTIABLE_QUOTE_FRAGMENT","transformAddressToSnakeCase","address","additionalInput","standardFields","transformedStandardFields","setShippingAddress","input","quoteUid","addressId","addressData","transformedAddressData","response","errorMessages","quoteData","transformQuote","_b","_a","GET_QUOTE_TEMPLATE_DATA","NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT","templateId","results","transformedData","transformQuoteTemplate","SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION","addQuoteTemplateShippingAddress","params"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import*as s from"@dropins/tools/preact-compat.js";import{jsx as i,jsxs as o}from"@dropins/tools/preact-jsx-runtime.js";import{Button as u}from"@dropins/tools/components.js";import{S as h,a as g}from"./WarningFilled.js";import{useText as f}from"@dropins/tools/i18n.js";const w=t=>s.createElement("svg",{id:"Icon_Add_Base","data-name":"Icon \\u2013 Add \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...t},s.createElement("g",{id:"Large"},s.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),s.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},s.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_579","data-name":"Line 579",y2:12.7,transform:"translate(2.216 -4.087)",fill:"none",stroke:"currentColor"}),s.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_580","data-name":"Line 580",x2:12.7,transform:"translate(-4.079 2.263)",fill:"none",stroke:"currentColor"})))),v=t=>s.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},s.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),s.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),_=t=>{if(t===0)return"0 Bytes";const a=1024,l=["Bytes","KB","MB","GB"],r=Math.floor(Math.log(t)/Math.log(a)),e=Math.min(r,l.length-1),n=t/Math.pow(a,e);return`${Math.round(n*100)/100} ${l[e]}`},M=(t,a)=>!a||a.length===0?!0:a.includes(t),S=(t,a)=>a==null?!0:t<=a,B=({files:t,onRemove:a,disabled:l=!1})=>{const r=f({removeFile:"NegotiableQuote.Manage.removeFile",uploading:"NegotiableQuote.Manage.uploading",uploadSuccess:"NegotiableQuote.Manage.uploadSuccess",uploadError:"NegotiableQuote.Manage.uploadError"});return!t||t.length===0?null:i("div",{className:"attached-files-list","data-testid":"attached-files-list",children:t.map(e=>{const n=e.status==="uploading",c=e.status==="error",d=e.status==="success",m=!l&&!n;return o("div",{className:`attached-files-list__item attached-files-list__item--${e.status}`,"data-testid":`attached-file-${e.key}`,children:[o("div",{className:"attached-files-list__item-main",children:[o("div",{className:"attached-files-list__item-icon",children:[n&&i("div",{className:"attached-files-list__spinner","data-testid":"file-uploading-spinner","aria-label":r.uploading}),d&&i(h,{"data-testid":"file-success-icon","aria-label":r.uploadSuccess,className:"attached-files-list__success-icon"}),c&&i(g,{"data-testid":"file-error-icon","aria-label":r.uploadError,color:"var(--color-error)",className:"attached-files-list__error-icon"})]}),o("div",{className:"attached-files-list__item-info",children:[i("div",{className:"attached-files-list__item-name","data-testid":"file-name",children:e.name}),o("div",{className:"attached-files-list__item-size","data-testid":"file-size",children:[_(e.size),n&&` - ${r.uploading}`]})]}),i(u,{variant:"tertiary",onClick:()=>a(e.key),disabled:!m,type:"button","aria-label":`${r.removeFile}: ${e.name}`,"data-testid":`remove-file-${e.key}`,className:"attached-files-list__remove-button",children:i(v,{})})]}),c&&e.error&&i("div",{className:"attached-files-list__item-error","data-testid":"file-error-message",children:e.error})]},e.key)})})};export{B as A,w as S,M as a,_ as f,S as v};
4
+ //# sourceMappingURL=AttachedFilesList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachedFilesList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Add.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Close.svg","/@dropins/storefront-quote-management/src/utils/fileUtils.ts","/@dropins/storefront-quote-management/src/components/AttachedFilesList/AttachedFilesList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgAdd = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Add_Base\", \"data-name\": \"Icon \\\\u2013 Add \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Add_icon\", \"data-name\": \"Add icon\", transform: \"translate(9.734 9.737)\" }, /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_579\", \"data-name\": \"Line 579\", y2: 12.7, transform: \"translate(2.216 -4.087)\", fill: \"none\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_580\", \"data-name\": \"Line 580\", x2: 12.7, transform: \"translate(-4.079 2.263)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgAdd;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\n/**\n * Formats a file size in bytes to a human-readable string\n * @param bytes - The file size in bytes\n * @returns A formatted string with the appropriate unit (Bytes, KB, MB, GB)\n * \n * @example\n * formatFileSize(0) // '0 Bytes'\n * formatFileSize(1024) // '1 KB'\n * formatFileSize(1536) // '1.5 KB'\n * formatFileSize(1048576) // '1 MB'\n * formatFileSize(5242880) // '5 MB'\n */\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n \n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n // Ensure we don't go beyond our sizes array\n const sizeIndex = Math.min(i, sizes.length - 1);\n \n const size = bytes / Math.pow(k, sizeIndex);\n \n // Round to 2 decimal places\n const roundedSize = Math.round(size * 100) / 100;\n \n return `${roundedSize} ${sizes[sizeIndex]}`;\n};\n\n/**\n * Validates if a file type is accepted\n * @param fileType - The MIME type of the file\n * @param acceptedTypes - Array of accepted MIME types (e.g., ['image/png', 'application/pdf'])\n * @returns true if the file type is accepted, false otherwise\n * \n * @example\n * validateFileType('image/png', ['image/png', 'image/jpeg']) // true\n * validateFileType('application/pdf', ['image/png']) // false\n * validateFileType('image/png', []) // true (empty array means all types accepted)\n */\nexport const validateFileType = (\n fileType: string,\n acceptedTypes?: string[]\n): boolean => {\n if (!acceptedTypes || acceptedTypes.length === 0) {\n return true;\n }\n \n return acceptedTypes.includes(fileType);\n};\n\n/**\n * Validates if a file size is within the maximum limit\n * @param fileSize - The file size in bytes\n * @param maxSize - Maximum allowed file size in bytes\n * @returns true if the file size is within the limit, false otherwise\n * \n * @example\n * validateFileSize(1024, 2048) // true\n * validateFileSize(3072, 2048) // false\n * validateFileSize(1024, undefined) // true (no limit)\n */\nexport const validateFileSize = (\n fileSize: number,\n maxSize?: number\n): boolean => {\n if (maxSize === undefined || maxSize === null) {\n return true;\n }\n \n return fileSize <= maxSize;\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 { FunctionComponent } from 'preact';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { Close, CheckWithCircle, WarningFilled } from '@adobe-commerce/elsie/icons';\nimport { formatFileSize } from '@/quote-management/utils/fileUtils';\nimport './AttachedFilesList.css';\n\nexport interface AttachedFile {\n key: string;\n name: string;\n size: number;\n status: 'uploading' | 'success' | 'error';\n error?: string;\n}\n\nexport interface AttachedFilesListProps {\n files: AttachedFile[];\n onRemove: (key: string) => void;\n disabled?: boolean;\n}\n\nexport const AttachedFilesList: FunctionComponent<AttachedFilesListProps> = ({\n files,\n onRemove,\n disabled = false,\n}) => {\n const dictionary = useText({\n removeFile: 'NegotiableQuote.Manage.removeFile',\n uploading: 'NegotiableQuote.Manage.uploading',\n uploadSuccess: 'NegotiableQuote.Manage.uploadSuccess',\n uploadError: 'NegotiableQuote.Manage.uploadError',\n });\n\n if (!files || files.length === 0) {\n return null;\n }\n\n return (\n <div className=\"attached-files-list\" data-testid=\"attached-files-list\">\n {files.map((file) => {\n const isUploading = file.status === 'uploading';\n const isError = file.status === 'error';\n const isSuccess = file.status === 'success';\n const canRemove = !disabled && !isUploading;\n\n return (\n <div\n key={file.key}\n className={`attached-files-list__item attached-files-list__item--${file.status}`}\n data-testid={`attached-file-${file.key}`}\n >\n <div className=\"attached-files-list__item-main\">\n <div className=\"attached-files-list__item-icon\">\n {isUploading && (\n <div\n className=\"attached-files-list__spinner\"\n data-testid=\"file-uploading-spinner\"\n aria-label={dictionary.uploading}\n />\n )}\n {isSuccess && (\n <CheckWithCircle\n data-testid=\"file-success-icon\"\n aria-label={dictionary.uploadSuccess}\n className=\"attached-files-list__success-icon\"\n />\n )}\n {isError && (\n <WarningFilled\n data-testid=\"file-error-icon\"\n aria-label={dictionary.uploadError}\n color=\"var(--color-error)\"\n className=\"attached-files-list__error-icon\"\n />\n )}\n </div>\n\n <div className=\"attached-files-list__item-info\">\n <div className=\"attached-files-list__item-name\" data-testid=\"file-name\">\n {file.name}\n </div>\n <div className=\"attached-files-list__item-size\" data-testid=\"file-size\">\n {formatFileSize(file.size)}\n {isUploading && ` - ${dictionary.uploading}`}\n </div>\n </div>\n\n <Button\n variant=\"tertiary\"\n onClick={() => onRemove(file.key)}\n disabled={!canRemove}\n type=\"button\"\n aria-label={`${dictionary.removeFile}: ${file.name}`}\n data-testid={`remove-file-${file.key}`}\n className=\"attached-files-list__remove-button\"\n >\n <Close />\n </Button>\n </div>\n\n {isError && file.error && (\n <div\n className=\"attached-files-list__item-error\"\n data-testid=\"file-error-message\"\n >\n {file.error}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\n"],"names":["SvgAdd","props","React","SvgClose","formatFileSize","bytes","k","sizes","i","sizeIndex","size","validateFileType","fileType","acceptedTypes","validateFileSize","fileSize","maxSize","AttachedFilesList","files","onRemove","disabled","dictionary","useText","jsx","file","isUploading","isError","isSuccess","canRemove","jsxs","CheckWithCircle","WarningFilled","Button","Close"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import*as e from"@dropins/tools/preact-compat.js";const o=t=>e.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},e.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701",stroke:"currentColor",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round"}));export{o as S};
4
+ //# sourceMappingURL=ChevronDown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChevronDown.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/ChevronDown.svg"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n"],"names":["SvgChevronDown","props","React"],"mappings":"kDACK,MAACA,EAAkBC,GAA0BC,EAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAK,EAAoBC,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,kDAAmD,OAAQ,eAAgB,YAAa,EAAG,cAAe,SAAU,eAAgB,QAAS,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as i,jsxs as r}from"@dropins/tools/preact-jsx-runtime.js";import{Modal as v,Button as c}from"@dropins/tools/components.js";/* empty css */import{useText as N}from"@dropins/tools/i18n.js";const y=({open:d=!1,title:o,message:n,cancelLabel:s,confirmLabel:e,onCancel:a,onConfirm:l,onClose:f,showCloseButton:_,confirmationBanner:t,...h})=>{const m=N({cancel:"ConfirmationModal.cancel",confirm:"ConfirmationModal.confirm"});if(!d)return null;const{className:p,...u}=h;return i(v,{...u,size:"medium",onClose:f||a,clickToDismiss:!0,escapeToDismiss:!0,showCloseButton:_,"data-testid":"confirmation-modal",className:p,children:r("div",{className:"confirmation-modal__content",children:[t&&i("div",{className:"confirmation-modal__banner","data-testid":"confirmation-modal-banner",children:t}),o&&i("div",{className:"confirmation-modal__title","data-testid":"confirmation-modal-title",children:o}),n&&i("div",{className:"confirmation-modal__message","data-testid":"confirmation-modal-message",children:n}),r("div",{className:"confirmation-modal__actions","data-testid":"confirmation-modal-actions",children:[a&&i(c,{variant:"secondary",onClick:a,"data-testid":"confirmation-modal-cancel",children:s??m.cancel}),i(c,{variant:"primary",onClick:l,"data-testid":"confirmation-modal-confirm",children:e??m.confirm})]})]})})};export{y as C};
4
+ //# sourceMappingURL=ConfirmationModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmationModal.js","sources":["/@dropins/storefront-quote-management/src/components/ConfirmationModal/ConfirmationModal.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { Button, Modal } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/ConfirmationModal/ConfirmationModal.css';\n\nexport interface ConfirmationModalProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n open?: boolean;\n title?: VNode | string;\n message?: VNode | string;\n cancelLabel?: VNode | string;\n confirmLabel?: VNode | string;\n onCancel?: () => void;\n onConfirm?: () => void;\n onClose?: () => void;\n showCloseButton?: boolean;\n confirmationBanner?: VNode | null;\n}\n\nexport const ConfirmationModal: FunctionComponent<ConfirmationModalProps> = ({\n open = false,\n title,\n message,\n cancelLabel,\n confirmLabel,\n onCancel,\n onConfirm,\n onClose,\n showCloseButton,\n confirmationBanner,\n ...props\n}) => {\n const dictionary = useText({\n cancel: 'ConfirmationModal.cancel',\n confirm: 'ConfirmationModal.confirm',\n });\n\n if (!open) {\n return null;\n }\n\n const { className, ...restProps } = props;\n\n return (\n <Modal\n {...restProps}\n size={'medium'}\n onClose={onClose || onCancel}\n clickToDismiss={true}\n escapeToDismiss={true}\n showCloseButton={showCloseButton}\n data-testid=\"confirmation-modal\"\n className={className}\n >\n <div className=\"confirmation-modal__content\">\n {confirmationBanner && (\n <div\n className=\"confirmation-modal__banner\"\n data-testid=\"confirmation-modal-banner\"\n >\n {confirmationBanner}\n </div>\n )}\n {title && (\n <div\n className=\"confirmation-modal__title\"\n data-testid=\"confirmation-modal-title\"\n >\n {title}\n </div>\n )}\n {message && (\n <div\n className=\"confirmation-modal__message\"\n data-testid=\"confirmation-modal-message\"\n >\n {message}\n </div>\n )}\n <div\n className=\"confirmation-modal__actions\"\n data-testid=\"confirmation-modal-actions\"\n >\n {onCancel && (\n <Button\n variant=\"secondary\"\n onClick={onCancel}\n data-testid=\"confirmation-modal-cancel\"\n >\n {cancelLabel ?? dictionary.cancel}\n </Button>\n )}\n <Button\n variant=\"primary\"\n onClick={onConfirm}\n data-testid=\"confirmation-modal-confirm\"\n >\n {confirmLabel ?? dictionary.confirm}\n </Button>\n </div>\n </div>\n </Modal>\n );\n};\n"],"names":["ConfirmationModal","open","title","message","cancelLabel","confirmLabel","onCancel","onConfirm","onClose","showCloseButton","confirmationBanner","props","dictionary","useText","className","restProps","jsx","Modal","jsxs","Button"],"mappings":"2NA6BO,MAAMA,EAA+D,CAAC,CAC3E,KAAAC,EAAO,GACP,MAAAC,EACA,QAAAC,EACA,YAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EACA,QAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,GAAGC,CACL,IAAM,CACJ,MAAMC,EAAaC,EAAQ,CACzB,OAAQ,2BACR,QAAS,2BAAA,CACV,EAED,GAAI,CAACZ,EACH,OAAO,KAGT,KAAM,CAAE,UAAAa,EAAW,GAAGC,CAAA,EAAcJ,EAEpC,OACEK,EAACC,EAAA,CACE,GAAGF,EACJ,KAAM,SACN,QAASP,GAAWF,EACpB,eAAgB,GAChB,gBAAiB,GACjB,gBAAAG,EACA,cAAY,qBACZ,UAAAK,EAEA,SAAAI,EAAC,MAAA,CAAI,UAAU,8BACZ,SAAA,CAAAR,GACCM,EAAC,MAAA,CACC,UAAU,6BACV,cAAY,4BAEX,SAAAN,CAAA,CAAA,EAGJR,GACCc,EAAC,MAAA,CACC,UAAU,4BACV,cAAY,2BAEX,SAAAd,CAAA,CAAA,EAGJC,GACCa,EAAC,MAAA,CACC,UAAU,8BACV,cAAY,6BAEX,SAAAb,CAAA,CAAA,EAGLe,EAAC,MAAA,CACC,UAAU,8BACV,cAAY,6BAEX,SAAA,CAAAZ,GACCU,EAACG,EAAA,CACC,QAAQ,YACR,QAASb,EACT,cAAY,4BAEX,YAAeM,EAAW,MAAA,CAAA,EAG/BI,EAACG,EAAA,CACC,QAAQ,UACR,QAASZ,EACT,cAAY,6BAEX,YAAgBK,EAAW,OAAA,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAGN"}
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as n,jsxs as ye,Fragment as be}from"@dropins/tools/preact-jsx-runtime.js";import{useState as i,useEffect as T,useCallback as H}from"@dropins/tools/preact-compat.js";import{Slot as K}from"@dropins/tools/lib.js";import{events as P}from"@dropins/tools/event-bus.js";import{Price as V,InLineAlert as y}from"@dropins/tools/components.js";/* empty css */import{I as X,Q as Qe,P as ve,L as Ne}from"./LineItemNoteModal.js";import{C as Z}from"./ConfirmationModal.js";/* empty css *//* empty css */import"./state.js";import{u as R,s as Te,r as Ie}from"./setLineItemNote.js";import{S as ee,a as D}from"./WarningFilled.js";import{useText as he}from"@dropins/tools/i18n.js";const qe=3e3,ke=({quoteData:te,onItemCheckboxChange:I,onItemDropdownChange:g,onRemoveItemsRef:b,onRemoveModalStateChange:d,slots:p,...ae})=>{const[s,h]=i(te),[F,q]=i({}),[u,j]=i(null),[se,Q]=i(!1),[oe,A]=i(!1),[k,B]=i(""),[v,l]=i({type:null,message:""}),[ne,x]=i(!1),[f,S]=i([]),[re,C]=i(!1),[N,m]=i({type:null,message:""}),[_,c]=i({}),[ie,U]=i(!1),o=he({subtotal:"NegotiableQuote.Manage.quotePricesSummary.subtotal.excludingTax",grandTotal:"NegotiableQuote.Manage.quotePricesSummary.grandTotal.includingTax",appliedTaxes:"NegotiableQuote.Manage.quotePricesSummary.appliedTaxes",modalTitle:"NegotiableQuote.Manage.updateQuantitiesModal.title",modalDescription:"NegotiableQuote.Manage.updateQuantitiesModal.description",modalCancelButton:"NegotiableQuote.Manage.updateQuantitiesModal.cancelButton",modalUpdateButton:"NegotiableQuote.Manage.updateQuantitiesModal.updateButton",successHeading:"NegotiableQuote.Manage.updateQuantitiesModal.successHeading",successMessage:"NegotiableQuote.Manage.updateQuantitiesModal.successMessage",errorHeading:"NegotiableQuote.Manage.updateQuantitiesModal.errorHeading",errorMessage:"NegotiableQuote.Manage.updateQuantitiesModal.errorMessage",removeModalTitle:"NegotiableQuote.Manage.removeItemsModal.title",removeModalDescription:"NegotiableQuote.Manage.removeItemsModal.description",removeModalCancelButton:"NegotiableQuote.Manage.removeItemsModal.cancelButton",removeModalConfirmButton:"NegotiableQuote.Manage.removeItemsModal.confirmButton",removeModalConfirmButtonRemoving:"NegotiableQuote.Manage.removeItemsModal.confirmButtonRemoving",removeSuccessHeading:"NegotiableQuote.Manage.removeItemsModal.successHeading",removeSuccessMessage:"NegotiableQuote.Manage.removeItemsModal.successMessage",removeErrorHeading:"NegotiableQuote.Manage.removeItemsModal.errorHeading",removeErrorMessage:"NegotiableQuote.Manage.removeItemsModal.errorMessage"});T(()=>{const t=P.on("quote-management/quote-data",e=>{h(e.quote),q({}),l({type:null,message:""}),c({})},{eager:!0});return()=>t==null?void 0:t.off()},[]),T(()=>{const t=P.on("quote-management/quantities-updated",e=>{h(e.quote),q({}),l({type:"success",message:o.successMessage}),setTimeout(()=>{Q(!1),l({type:null,message:""})},3e3)});return()=>t==null?void 0:t.off()},[o.successMessage]),T(()=>{const t=P.on("quote-management/quote-items-removed",e=>{h(e.quote),S([]),C(!1),m({type:"success",message:o.removeSuccessMessage}),setTimeout(()=>{x(!1),m({type:null,message:""}),d==null||d(!1)},qe)});return()=>t==null?void 0:t.off()},[o.removeSuccessMessage,d]);const O=H(t=>{!t||t.length===0||(S(t),m({type:null,message:""}),x(!0))},[]);T(()=>{b==null||b(O)},[O,b]);const W=()=>{m({type:null,message:""})},w=(t,e)=>{const a=t;if(e==="edit"){j(a),A(!0),c(r=>({...r,[a.uid]:""}));return}if(e==="remove"){c(r=>({...r,[a.uid]:e})),O([a]),g==null||g(a,e),c(r=>({...r,[a.uid]:""}));return}e&&(g==null||g(a,e)),c(r=>{if(!(a.uid in r))return r;const M={...r};return delete M[a.uid],M})},ue=async()=>{if(!s||f.length===0)return;const t=f.map(e=>e.uid);C(!0),m({type:null,message:""});try{await Ie({quoteUid:s.uid,quoteItemUids:t})}catch(e){const a=e instanceof Error?e.message:o.removeErrorMessage;if(m({type:"error",message:a}),f.length===1){const r=f[0];c(M=>{if(!(r.uid in M))return M;const J={...M};return delete J[r.uid],J})}C(!1)}},le=()=>{if(x(!1),m({type:null,message:""}),d==null||d(!1),f.length===1){const t=f[0];c(e=>{if(!(t.uid in e))return e;const a={...e};return delete a[t.uid],a})}S([])},E=H(()=>{u&&c(t=>{const e={...t};return delete e[u.uid],e}),A(!1),j(null),U(!1),B("")},[u]),ce=H(async(t,e)=>{if(!(!u||!s)){U(!0);try{e!==u.quantity&&await R({quoteUid:s.uid,items:[{quoteItemUid:u.uid,quantity:e}]}),await Te({quoteUid:s.uid,itemUid:u.uid,note:t,quantity:e}),E()}catch(a){console.error("Failed to set line item note:",a);const r=a instanceof Error?a.message:"Unable to update the item. Please try again.";B(r),U(!1)}}},[u,s,E]);if(!s)return n(X,{loading:!0});const Y=!!s.canUpdateQuote,$=(t,e)=>{q(a=>({...a,[t.uid]:e}))},z=t=>{t.preventDefault(),l({type:null,message:""}),Q(!0)},de=async()=>{if(!s)return;if(Object.keys(F).length===0){Q(!1);return}l({type:null,message:""});const t=Object.entries(F).map(([e,a])=>({quoteItemUid:e,quantity:a}));try{await R({quoteUid:s.uid,items:t})}catch(e){const a=e instanceof Error?e.message:o.errorMessage;l({type:"error",message:a}),console.error("Failed to update quantities:",e)}},me=()=>{Q(!1),l({type:null,message:""})},G=()=>{l({type:null,message:""})},L=[];s.prices.subtotalExcludingTax&&L.push({label:o.subtotal,id:"subtotal",value:n(V,{amount:s.prices.subtotalExcludingTax.value,currency:s.prices.subtotalExcludingTax.currency,weight:"normal"})}),s.prices.grandTotal&&L.push({label:o.grandTotal,id:"total",value:n(V,{amount:s.prices.grandTotal.value,currency:s.prices.grandTotal.currency}),strong:!0});const ge=v.type==="success"?n(y,{type:"success",variant:"primary",icon:n(ee,{}),heading:o.successHeading,description:v.message,onDismiss:G,"data-testid":"update-quantities-success-banner"}):v.type==="error"?n(y,{type:"error",variant:"primary",icon:n(D,{}),heading:o.errorHeading,description:v.message,onDismiss:G,"data-testid":"update-quantities-error-banner"}):null,pe=I?(t,e)=>{I(t,e)}:void 0,fe=N.type==="success"?n(y,{type:"success",variant:"primary",icon:n(ee,{}),heading:o.removeSuccessHeading,description:N.message,onDismiss:W,"data-testid":"remove-items-success-banner"}):N.type==="error"?n(y,{type:"error",variant:"primary",icon:n(D,{}),heading:o.removeErrorHeading,description:N.message,onDismiss:W,"data-testid":"remove-items-error-banner"}):null,Me=k?n(y,{type:"error",variant:"primary",icon:n(D,{}),heading:o.errorHeading,description:k,onDismiss:()=>B(""),"data-testid":"line-item-note-error-banner"}):null;return ye(be,{children:[n(X,{"data-testid":"items-quoted-container",...ae,loading:!1,table:n(K,{name:"ProductListTable",slot:p==null?void 0:p.ProductListTable,context:{items:s.items,canEdit:Y,readOnly:s.readOnly,onItemCheckboxChange:I,onItemDropdownChange:w,onQuantityChange:$,onUpdate:z,dropdownSelections:_},children:n(ve,{items:s.items,canEdit:Y,onItemCheckboxChange:pe,readOnly:s.readOnly,onItemDropdownChange:w,onQuantityChange:$,onUpdate:z,dropdownSelections:_})}),pricesSummary:n(K,{name:"QuotePricesSummary",slot:p==null?void 0:p.QuotePricesSummary,context:{items:s.items,prices:s.prices},children:n(Qe,{entries:L})})}),n(Z,{open:se,title:o.modalTitle,message:o.modalDescription,cancelLabel:o.modalCancelButton,confirmLabel:o.modalUpdateButton,onCancel:me,onConfirm:de,confirmationBanner:ge,"data-testid":"update-quantities-modal"}),n(Z,{open:ne,title:o.removeModalTitle,message:o.removeModalDescription,cancelLabel:o.removeModalCancelButton,confirmLabel:re?o.removeModalConfirmButtonRemoving:o.removeModalConfirmButton,onCancel:le,onConfirm:ue,confirmationBanner:fe,"data-testid":"remove-items-modal"}),u&&n(Ne,{open:oe,item:u,onClose:E,onConfirm:ce,isSubmitting:ie,errorBanner:Me||void 0})]})};export{ke as I};
4
+ //# sourceMappingURL=ItemsQuoted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemsQuoted.js","sources":["/@dropins/storefront-quote-management/src/containers/ItemsQuoted/ItemsQuoted.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 useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Price, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n NegotiableQuoteModel,\n NegotiableQuoteCartItem,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport {\n ProductListTable,\n ProductListTableItem,\n QuotePricesSummary,\n ItemsQuoted as ItemsQuotedComponent,\n} from '@/quote-management/components';\nimport { CheckWithCircle, WarningFilled } from '@adobe-commerce/elsie/icons';\nimport { ConfirmationModal } from '@/quote-management/components/ConfirmationModal';\nimport { LineItemNoteModal } from '@/quote-management/components/LineItemNoteModal';\nimport { updateQuantities, setLineItemNote } from '@/quote-management/api';\nimport { removeNegotiableQuoteItems } from '@/quote-management/api/removeNegotiableQuoteItems';\n\nconst NOTIFICATION_AUTO_DISMISS_DELAY = 3000;\n\nexport interface ItemsQuotedProps extends HTMLAttributes<HTMLDivElement> {\n quoteData?: NegotiableQuoteModel;\n onItemCheckboxChange?: (\n item: NegotiableQuoteCartItem,\n isSelected: boolean\n ) => void;\n onItemDropdownChange?: (\n item: NegotiableQuoteCartItem,\n action: string\n ) => void;\n onUpdate?: (e: SubmitEvent) => void;\n onRemoveItemsRef?: (\n handler: (items: NegotiableQuoteCartItem[]) => void\n ) => void;\n onRemoveModalStateChange?: (isOpen: boolean) => void;\n slots?: {\n ProductListTable?: SlotProps<{\n items: NegotiableQuoteModel['items'];\n canEdit: boolean;\n readOnly?: boolean;\n onItemCheckboxChange?: (\n item: NegotiableQuoteCartItem,\n isSelected: boolean\n ) => void;\n onItemDropdownChange?: (\n item: NegotiableQuoteCartItem,\n action: string\n ) => void;\n onQuantityChange?: (\n item: NegotiableQuoteCartItem,\n newQuantity: number\n ) => void;\n onUpdate?: (e: SubmitEvent) => void;\n dropdownSelections?: Record<string, string | undefined>;\n }>;\n QuotePricesSummary?: SlotProps<{\n items: NegotiableQuoteModel['items'];\n prices: NegotiableQuoteModel['prices'];\n }>;\n };\n}\n\nexport const ItemsQuoted: Container<ItemsQuotedProps> = ({\n quoteData: initialData,\n onItemCheckboxChange,\n onItemDropdownChange,\n onRemoveItemsRef,\n onRemoveModalStateChange,\n slots,\n ...props\n}) => {\n const [quoteData, setQuoteData] = useState<NegotiableQuoteModel | undefined>(\n initialData\n );\n const [quantityChanges, setQuantityChanges] = useState<{\n [itemUid: string]: number;\n }>({});\n const [selectedItem, setSelectedItem] =\n useState<NegotiableQuoteCartItem | null>(null);\n const [isUpdateQuantitiesModalOpen, setIsUpdateQuantitiesModalOpen] =\n useState(false);\n const [isLineItemNoteModalOpen, setIsLineItemNoteModalOpen] = useState(false);\n const [modalErrorMessage, setModalErrorMessage] = useState('');\n const [notificationState, setNotificationState] = useState<{\n type: 'success' | 'error' | null;\n message: string;\n }>({ type: null, message: '' });\n // State for remove items functionality\n const [isRemoveModalOpen, setIsRemoveModalOpen] = useState(false);\n const [itemsToRemove, setItemsToRemove] = useState<NegotiableQuoteCartItem[]>(\n []\n );\n const [isRemoving, setIsRemoving] = useState(false);\n const [removeNotificationState, setRemoveNotificationState] = useState<{\n type: 'success' | 'error' | null;\n message: string;\n }>({ type: null, message: '' });\n const [dropdownSelections, setDropdownSelections] = useState<\n Record<string, string>\n >({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const dictionary = useText({\n subtotal: 'NegotiableQuote.Manage.quotePricesSummary.subtotal.excludingTax',\n grandTotal:\n 'NegotiableQuote.Manage.quotePricesSummary.grandTotal.includingTax',\n appliedTaxes: 'NegotiableQuote.Manage.quotePricesSummary.appliedTaxes',\n modalTitle: 'NegotiableQuote.Manage.updateQuantitiesModal.title',\n modalDescription:\n 'NegotiableQuote.Manage.updateQuantitiesModal.description',\n modalCancelButton:\n 'NegotiableQuote.Manage.updateQuantitiesModal.cancelButton',\n modalUpdateButton:\n 'NegotiableQuote.Manage.updateQuantitiesModal.updateButton',\n successHeading:\n 'NegotiableQuote.Manage.updateQuantitiesModal.successHeading',\n successMessage:\n 'NegotiableQuote.Manage.updateQuantitiesModal.successMessage',\n errorHeading: 'NegotiableQuote.Manage.updateQuantitiesModal.errorHeading',\n errorMessage: 'NegotiableQuote.Manage.updateQuantitiesModal.errorMessage',\n removeModalTitle: 'NegotiableQuote.Manage.removeItemsModal.title',\n removeModalDescription:\n 'NegotiableQuote.Manage.removeItemsModal.description',\n removeModalCancelButton:\n 'NegotiableQuote.Manage.removeItemsModal.cancelButton',\n removeModalConfirmButton:\n 'NegotiableQuote.Manage.removeItemsModal.confirmButton',\n removeModalConfirmButtonRemoving:\n 'NegotiableQuote.Manage.removeItemsModal.confirmButtonRemoving',\n removeSuccessHeading:\n 'NegotiableQuote.Manage.removeItemsModal.successHeading',\n removeSuccessMessage:\n 'NegotiableQuote.Manage.removeItemsModal.successMessage',\n removeErrorHeading: 'NegotiableQuote.Manage.removeItemsModal.errorHeading',\n removeErrorMessage: 'NegotiableQuote.Manage.removeItemsModal.errorMessage',\n });\n\n useEffect(() => {\n const quoteDataEvent = events.on(\n 'quote-management/quote-data',\n\n (data: { quote: NegotiableQuoteModel }) => {\n setQuoteData(data.quote);\n setQuantityChanges({});\n setNotificationState({ type: null, message: '' });\n setDropdownSelections({});\n },\n\n {\n eager: true,\n }\n );\n return () => quoteDataEvent?.off();\n }, []);\n\n useEffect(() => {\n const quantitiesUpdatedEvent = events.on(\n 'quote-management/quantities-updated',\n (data: { quote: NegotiableQuoteModel }) => {\n setQuoteData(data.quote);\n setQuantityChanges({});\n setNotificationState({\n type: 'success',\n message: dictionary.successMessage,\n });\n // Auto-close success notification after 3 seconds\n setTimeout(() => {\n setIsUpdateQuantitiesModalOpen(false);\n setNotificationState({ type: null, message: '' });\n }, 3000);\n }\n );\n return () => quantitiesUpdatedEvent?.off();\n }, [dictionary.successMessage]);\n\n // Listen for quote items removed event\n useEffect(() => {\n const itemsRemovedEvent = events.on(\n 'quote-management/quote-items-removed',\n (data: { quote: NegotiableQuoteModel }) => {\n setQuoteData(data.quote);\n setItemsToRemove([]);\n setIsRemoving(false);\n setRemoveNotificationState({\n type: 'success',\n message: dictionary.removeSuccessMessage,\n });\n // Auto-close success notification after 3 seconds\n setTimeout(() => {\n setIsRemoveModalOpen(false);\n setRemoveNotificationState({ type: null, message: '' });\n onRemoveModalStateChange?.(false);\n }, NOTIFICATION_AUTO_DISMISS_DELAY);\n }\n );\n return () => itemsRemovedEvent?.off();\n }, [dictionary.removeSuccessMessage, onRemoveModalStateChange]);\n\n // Unified handler for removing items (single or multiple)\n const handleRemoveItems = useCallback((items: NegotiableQuoteCartItem[]) => {\n if (!items || items.length === 0) {\n return;\n }\n setItemsToRemove(items);\n setRemoveNotificationState({ type: null, message: '' });\n setIsRemoveModalOpen(true);\n }, []);\n\n // Expose handler to parent component\n useEffect(() => {\n onRemoveItemsRef?.(handleRemoveItems);\n }, [handleRemoveItems, onRemoveItemsRef]);\n\n const handleDismissRemoveBanner = () => {\n setRemoveNotificationState({ type: null, message: '' });\n };\n\n const handleItemDropdownChange = (\n item: ProductListTableItem,\n action: string\n ) => {\n const cartItem = item as NegotiableQuoteCartItem;\n // Handle edit action - open line item note modal\n if (action === 'edit') {\n setSelectedItem(cartItem);\n setIsLineItemNoteModalOpen(true);\n // Reset dropdown immediately\n setDropdownSelections((prev) => ({ ...prev, [cartItem.uid]: '' }));\n return;\n }\n\n // Handle remove action\n if (action === 'remove') {\n setDropdownSelections((prev) => ({\n ...prev,\n [cartItem.uid]: action,\n }));\n handleRemoveItems([cartItem]); // Use unified handler\n onItemDropdownChange?.(cartItem, action);\n // Reset dropdown immediately (consistent with edit action)\n setDropdownSelections((prev) => ({ ...prev, [cartItem.uid]: '' }));\n return;\n }\n\n // For any other actions, pass through to parent (but ignore empty/placeholder selections)\n if (action) {\n onItemDropdownChange?.(cartItem, action);\n }\n\n // Clear dropdown selection for non-edit/remove actions\n /* istanbul ignore next: defensive cleanup - custom actions shouldn't have dropdown state due to proper cleanup in edit/remove handlers */\n setDropdownSelections((prev) => {\n if (!(cartItem.uid in prev)) {\n return prev;\n }\n const next = { ...prev };\n delete next[cartItem.uid];\n return next;\n });\n };\n\n const handleConfirmRemove = async () => {\n /* istanbul ignore next */\n if (!quoteData || itemsToRemove.length === 0) {\n return;\n }\n\n const uidsToRemove = itemsToRemove.map((item) => item.uid);\n\n setIsRemoving(true);\n setRemoveNotificationState({ type: null, message: '' });\n\n try {\n await removeNegotiableQuoteItems({\n quoteUid: quoteData.uid,\n quoteItemUids: uidsToRemove,\n });\n // Success is handled by the event listener\n } catch (err) {\n const errorMessage =\n /* istanbul ignore next */\n err instanceof Error ? err.message : dictionary.removeErrorMessage;\n setRemoveNotificationState({\n type: 'error',\n message: errorMessage,\n });\n // Clear dropdown selections for failed items (single item only)\n /* istanbul ignore next */ // UI-driven state; covered by tests but line sometimes mis-attributed in source maps\n if (itemsToRemove.length === 1) {\n const failedItem = itemsToRemove[0];\n setDropdownSelections((prev) => {\n if (!(failedItem.uid in prev)) {\n return prev;\n }\n const next = { ...prev };\n delete next[failedItem.uid];\n return next;\n });\n }\n setIsRemoving(false);\n }\n };\n\n const handleCancelRemove = () => {\n setIsRemoveModalOpen(false);\n setRemoveNotificationState({ type: null, message: '' });\n onRemoveModalStateChange?.(false);\n // Clear dropdown selections for single item cancellation\n /* istanbul ignore next */ // UI-driven state; covered by tests but line sometimes mis-attributed in source maps\n if (itemsToRemove.length === 1) {\n const cancelledItem = itemsToRemove[0];\n setDropdownSelections((prev) => {\n if (!(cancelledItem.uid in prev)) {\n return prev;\n }\n const next = { ...prev };\n delete next[cancelledItem.uid];\n return next;\n });\n }\n setItemsToRemove([]);\n };\n\n // Handle modal close\n const handleModalClose = useCallback(() => {\n // Clean up dropdown selection for the selected item before clearing it\n /* istanbul ignore else: defensive check - selectedItem should always be truthy when modal is open */\n if (selectedItem) {\n setDropdownSelections((prev) => {\n const next = { ...prev };\n delete next[selectedItem.uid];\n return next;\n });\n }\n setIsLineItemNoteModalOpen(false);\n setSelectedItem(null);\n setIsSubmitting(false);\n setModalErrorMessage('');\n }, [selectedItem]);\n\n // Handle modal confirm - submit note and quantity\n const handleModalConfirm = useCallback(\n async (note: string, quantity: number) => {\n /* istanbul ignore next: defensive guard for async race conditions - unreachable in normal flow as modal only renders with selectedItem and quoteData */\n if (!selectedItem || !quoteData) return;\n\n setIsSubmitting(true);\n try {\n // Check if quantity has changed from the original\n const quantityChanged = quantity !== selectedItem.quantity;\n\n // If quantity changed, update it first\n if (quantityChanged) {\n await updateQuantities({\n quoteUid: quoteData.uid,\n items: [{ quoteItemUid: selectedItem.uid, quantity }],\n });\n }\n\n // Then set the line item note\n await setLineItemNote({\n quoteUid: quoteData.uid,\n itemUid: selectedItem.uid,\n note,\n quantity,\n });\n\n // Close modal on success\n handleModalClose();\n } catch (error) {\n console.error('Failed to set line item note:', error);\n // Extract error message from API\n const errorMessage =\n /* istanbul ignore next */\n error instanceof Error\n ? error.message\n : 'Unable to update the item. Please try again.';\n setModalErrorMessage(errorMessage);\n setIsSubmitting(false);\n }\n },\n [selectedItem, quoteData, handleModalClose]\n );\n\n if (!quoteData) {\n return <ItemsQuotedComponent loading={true} />;\n }\n\n const canEdit = Boolean(quoteData.canUpdateQuote);\n\n const handleQuantityChange = (\n item: ProductListTableItem,\n newQuantity: number\n ) => {\n setQuantityChanges((prev) => ({\n ...prev,\n [(item as NegotiableQuoteCartItem).uid]: newQuantity,\n }));\n };\n\n const handleUpdate = (e: SubmitEvent) => {\n e.preventDefault();\n setNotificationState({ type: null, message: '' });\n setIsUpdateQuantitiesModalOpen(true);\n };\n\n const handleConfirmUpdate = async () => {\n /* istanbul ignore next */\n if (!quoteData) {\n return;\n }\n\n if (Object.keys(quantityChanges).length === 0) {\n setIsUpdateQuantitiesModalOpen(false);\n return;\n }\n\n // Clear any previous notifications\n setNotificationState({ type: null, message: '' });\n\n const items = Object.entries(quantityChanges).map(\n ([quoteItemUid, quantity]) => ({\n quoteItemUid,\n quantity,\n })\n );\n\n try {\n await updateQuantities({\n quoteUid: quoteData.uid,\n items,\n });\n // Success is handled by the event listener\n } catch (err) {\n const errorMessage =\n /* istanbul ignore next */\n err instanceof Error ? err.message : dictionary.errorMessage;\n setNotificationState({\n type: 'error',\n message: errorMessage,\n });\n console.error('Failed to update quantities:', err);\n }\n };\n\n const handleCancelUpdate = () => {\n setIsUpdateQuantitiesModalOpen(false);\n setNotificationState({ type: null, message: '' });\n };\n\n const handleDismissBanner = () => {\n setNotificationState({ type: null, message: '' });\n };\n\n const quotePricesSummaryEntries = [];\n\n quoteData.prices.subtotalExcludingTax &&\n quotePricesSummaryEntries.push({\n label: dictionary.subtotal,\n id: 'subtotal',\n value: (\n <Price\n amount={quoteData.prices.subtotalExcludingTax.value}\n currency={quoteData.prices.subtotalExcludingTax.currency}\n weight=\"normal\"\n />\n ),\n });\n\n quoteData.prices.grandTotal &&\n quotePricesSummaryEntries.push({\n label: dictionary.grandTotal,\n id: 'total',\n value: (\n <Price\n amount={quoteData.prices.grandTotal.value}\n currency={quoteData.prices.grandTotal.currency}\n />\n ),\n strong: true,\n });\n\n // Create confirmation banner based on notification state\n const confirmationBanner =\n notificationState.type === 'success' ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.successHeading}\n description={notificationState.message}\n onDismiss={handleDismissBanner}\n data-testid=\"update-quantities-success-banner\"\n />\n ) : notificationState.type === 'error' ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.errorHeading}\n description={notificationState.message}\n onDismiss={handleDismissBanner}\n data-testid=\"update-quantities-error-banner\"\n />\n ) : null;\n\n // Create wrapper that converts ProductListTableItem back to NegotiableQuoteCartItem\n const handleItemCheckboxChange = onItemCheckboxChange\n ? (item: ProductListTableItem, isSelected: boolean) => {\n onItemCheckboxChange(item as NegotiableQuoteCartItem, isSelected);\n }\n : undefined;\n\n // Create remove confirmation banner based on notification state\n const removeConfirmationBanner =\n removeNotificationState.type === 'success' ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.removeSuccessHeading}\n description={removeNotificationState.message}\n onDismiss={handleDismissRemoveBanner}\n data-testid=\"remove-items-success-banner\"\n />\n ) : removeNotificationState.type === 'error' ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.removeErrorHeading}\n description={removeNotificationState.message}\n onDismiss={handleDismissRemoveBanner}\n data-testid=\"remove-items-error-banner\"\n />\n ) : null;\n\n // Create modal error banner\n const modalErrorBanner = modalErrorMessage ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.errorHeading}\n description={modalErrorMessage}\n onDismiss={() => setModalErrorMessage('')}\n data-testid=\"line-item-note-error-banner\"\n />\n ) : null;\n\n return (\n <>\n <ItemsQuotedComponent\n data-testid=\"items-quoted-container\"\n {...props}\n loading={false}\n table={\n <Slot\n name=\"ProductListTable\"\n slot={slots?.ProductListTable}\n context={{\n items: quoteData.items,\n canEdit,\n readOnly: quoteData.readOnly,\n onItemCheckboxChange,\n onItemDropdownChange: handleItemDropdownChange,\n onQuantityChange: handleQuantityChange,\n onUpdate: handleUpdate,\n dropdownSelections,\n }}\n >\n <ProductListTable\n items={quoteData.items}\n canEdit={canEdit}\n onItemCheckboxChange={handleItemCheckboxChange}\n readOnly={quoteData.readOnly}\n onItemDropdownChange={handleItemDropdownChange}\n onQuantityChange={handleQuantityChange}\n onUpdate={handleUpdate}\n dropdownSelections={dropdownSelections}\n />\n </Slot>\n }\n pricesSummary={\n <Slot\n name=\"QuotePricesSummary\"\n slot={slots?.QuotePricesSummary}\n context={{\n items: quoteData.items,\n prices: quoteData.prices,\n }}\n >\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n\n {/* Update Quantities Modal */}\n <ConfirmationModal\n open={isUpdateQuantitiesModalOpen}\n title={dictionary.modalTitle}\n message={dictionary.modalDescription}\n cancelLabel={dictionary.modalCancelButton}\n confirmLabel={dictionary.modalUpdateButton}\n onCancel={handleCancelUpdate}\n onConfirm={handleConfirmUpdate}\n confirmationBanner={confirmationBanner}\n data-testid=\"update-quantities-modal\"\n />\n\n {/* Remove Items Modal */}\n <ConfirmationModal\n open={isRemoveModalOpen}\n title={dictionary.removeModalTitle}\n message={dictionary.removeModalDescription}\n cancelLabel={dictionary.removeModalCancelButton}\n confirmLabel={\n isRemoving\n ? dictionary.removeModalConfirmButtonRemoving\n : dictionary.removeModalConfirmButton\n }\n onCancel={handleCancelRemove}\n onConfirm={handleConfirmRemove}\n confirmationBanner={removeConfirmationBanner}\n data-testid=\"remove-items-modal\"\n />\n {/* Line Item Note Modal */}\n {selectedItem && (\n <LineItemNoteModal\n open={isLineItemNoteModalOpen}\n item={selectedItem}\n onClose={handleModalClose}\n onConfirm={handleModalConfirm}\n isSubmitting={isSubmitting}\n errorBanner={modalErrorBanner || undefined}\n />\n )}\n </>\n );\n};\n"],"names":["NOTIFICATION_AUTO_DISMISS_DELAY","ItemsQuoted","initialData","onItemCheckboxChange","onItemDropdownChange","onRemoveItemsRef","onRemoveModalStateChange","slots","props","quoteData","setQuoteData","useState","quantityChanges","setQuantityChanges","selectedItem","setSelectedItem","isUpdateQuantitiesModalOpen","setIsUpdateQuantitiesModalOpen","isLineItemNoteModalOpen","setIsLineItemNoteModalOpen","modalErrorMessage","setModalErrorMessage","notificationState","setNotificationState","isRemoveModalOpen","setIsRemoveModalOpen","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","dropdownSelections","setDropdownSelections","isSubmitting","setIsSubmitting","dictionary","useText","useEffect","quoteDataEvent","events","data","quantitiesUpdatedEvent","itemsRemovedEvent","handleRemoveItems","useCallback","items","handleDismissRemoveBanner","handleItemDropdownChange","item","action","cartItem","prev","next","handleConfirmRemove","uidsToRemove","removeNegotiableQuoteItems","err","errorMessage","failedItem","handleCancelRemove","cancelledItem","handleModalClose","handleModalConfirm","note","quantity","updateQuantities","setLineItemNote","error","jsx","ItemsQuotedComponent","canEdit","handleQuantityChange","newQuantity","handleUpdate","e","handleConfirmUpdate","quoteItemUid","handleCancelUpdate","handleDismissBanner","quotePricesSummaryEntries","Price","confirmationBanner","InLineAlert","CheckWithCircle","WarningFilled","handleItemCheckboxChange","isSelected","removeConfirmationBanner","modalErrorBanner","jsxs","Fragment","Slot","ProductListTable","QuotePricesSummary","ConfirmationModal","LineItemNoteModal"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as o,jsxs as ne,Fragment as se}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as O,useCallback as p}from"@dropins/tools/preact-compat.js";import{Slot as W}from"@dropins/tools/lib.js";import{events as H}from"@dropins/tools/event-bus.js";import{InLineAlert as B,Price as Y}from"@dropins/tools/components.js";/* empty css */import{I as $,Q as re,P as ie,L as le}from"./LineItemNoteModal.js";import{C as me}from"./ConfirmationModal.js";/* empty css *//* empty css */import"./state.js";import{r as de,u as ue,a as ce}from"./addQuoteTemplateLineItemNote.js";import{S as z,a as U}from"./WarningFilled.js";import{useText as pe}from"@dropins/tools/i18n.js";const ge=3e3,Me=b=>{const{templateId:r,onRemoveModalStateChange:a,removeSuccessMessage:e,removeErrorMessage:T}=b,[i,g]=l(!1),[M,s]=l([]),[u,m]=l(!1),[S,n]=l({type:null,message:""});O(()=>{const d=H.on("quote-management/quote-template-data",()=>{s([]),m(!1),n({type:"success",message:e}),setTimeout(()=>{g(!1),n({type:null,message:""}),a==null||a(!1)},ge)});return()=>d==null?void 0:d.off()},[e,a]);const N=p(d=>{!d||d.length===0||(s(d),n({type:null,message:""}),g(!0))},[]),Q=p(async()=>{if(!r||M.length===0)return;const d=M.map(I=>I.uid).filter(Boolean);if(d.length!==0){m(!0),n({type:null,message:""});try{await de({templateId:r,itemUids:d})}catch(I){const c=I instanceof Error?I.message:T;n({type:"error",message:c}),m(!1)}}},[r,M,T]),t=p(()=>{g(!1),n({type:null,message:""}),a==null||a(!1),s([])},[a]);return{handleRemoveItems:N,handleConfirmRemove:Q,handleCancelRemove:t,isRemoveModalOpen:i,itemsToRemove:M,isRemoving:u,removeNotificationState:S}},fe=b=>{const{handleRemoveItems:r}=b,[a,e]=l({}),T=p(()=>{},[]),i=p((g,M)=>{const s=g;if(M==="remove"){e(u=>({...u,[s.uid||""]:M})),r([s]),e(u=>({...u,[s.uid||""]:""}));return}e(u=>{if(!s.uid||!(s.uid in u))return u;const m={...u};return delete m[s.uid],m})},[r]);return{dropdownSelections:a,handleItemDropdownChange:i,handleDismissRemoveBanner:T}},ve=3e3,Te=b=>{const{templateId:r,onUpdateModalStateChange:a,updateSuccessMessage:e,updateErrorMessage:T}=b,[i,g]=l({}),[M,s]=l(!1),[u,m]=l(!1),[S,n]=l({type:null,message:""});O(()=>{const c=H.on("quote-management/quote-template-data",()=>{g({}),m(!1),n({type:"success",message:e}),setTimeout(()=>{s(!1),n({type:null,message:""}),a==null||a(!1)},ve)});return()=>c==null?void 0:c.off()},[e,a]);const N=p((c,y)=>{const h=c;if(!h.uid)return;const C=h.uid;g(R=>({...R,[C]:y}))},[]),Q=p(c=>{c.preventDefault(),n({type:null,message:""}),s(!0)},[]),t=p(async()=>{if(!r||Object.keys(i).length===0){s(!1);return}m(!0),n({type:null,message:""});const c=Object.entries(i).map(([y,h])=>({itemId:y,quantity:h}));try{await ue({templateId:r,items:c})}catch(y){const h=y instanceof Error?y.message:T;n({type:"error",message:h}),m(!1)}},[r,i,T]),d=p(()=>{s(!1),n({type:null,message:""}),a==null||a(!1),g({})},[a]),I=p(()=>{n({type:null,message:""})},[]);return{quantityChanges:i,handleQuantityChange:N,handleUpdate:Q,handleConfirmUpdate:t,handleCancelUpdate:d,handleDismissBanner:I,isUpdateModalOpen:M,isUpdating:u,updateNotificationState:S}},Ue=({templateData:b,slots:r,...a})=>{const[e,T]=l(b),[i,g]=l(null),[M,s]=l(!1),[u,m]=l(!1),[S,n]=l(""),[N,Q]=l({}),t=pe({subtotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax",grandTotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax",appliedTaxes:"NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes",removeModalTitle:"NegotiableQuoteTemplate.Manage.removeItemsModal.title",removeModalDescription:"NegotiableQuoteTemplate.Manage.removeItemsModal.description",removeModalCancelButton:"NegotiableQuoteTemplate.Manage.removeItemsModal.cancelButton",removeModalConfirmButton:"NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButton",removeModalConfirmButtonRemoving:"NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButtonRemoving",removeSuccessHeading:"NegotiableQuoteTemplate.Manage.removeItemsModal.successHeading",removeSuccessMessage:"NegotiableQuoteTemplate.Manage.removeItemsModal.successMessage",removeErrorHeading:"NegotiableQuoteTemplate.Manage.removeItemsModal.errorHeading",removeErrorMessage:"NegotiableQuoteTemplate.Manage.removeItemsModal.errorMessage",updateModalTitle:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.title",updateModalDescription:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.description",updateModalCancelButton:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.cancelButton",updateModalUpdateButton:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.updateButton",updateSuccessHeading:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successHeading",updateSuccessMessage:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successMessage",updateErrorHeading:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorHeading",updateErrorMessage:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorMessage",errorHeading:"NegotiableQuoteTemplate.Manage.lineItemNoteModal.errorHeading"}),{handleRemoveItems:d,handleConfirmRemove:I,handleCancelRemove:c,isRemoveModalOpen:y,isRemoving:h,removeNotificationState:C}=Me({templateId:e==null?void 0:e.id,removeSuccessMessage:t.removeSuccessMessage,removeErrorMessage:t.removeErrorMessage}),{dropdownSelections:R,handleItemDropdownChange:P,handleDismissRemoveBanner:q}=fe({handleRemoveItems:d}),{handleQuantityChange:L,handleUpdate:A,handleConfirmUpdate:G,handleCancelUpdate:J,handleDismissBanner:F,isUpdateModalOpen:K,updateNotificationState:E}=Te({templateId:e==null?void 0:e.id,updateSuccessMessage:t.updateSuccessMessage,updateErrorMessage:t.updateErrorMessage});O(()=>{const v=H.on("quote-management/quote-template-data",f=>{T(f.quoteTemplate),Q({})},{eager:!0});return()=>v==null?void 0:v.off()},[]);const _=p((v,f)=>{const D=v;if(f==="edit"){g(D),s(!0),Q(oe=>({...oe,[D.uid||""]:""}));return}P(v,f)},[P]),k={...R,...N},w=p(()=>{i&&Q(v=>{const f={...v};return delete f[i.uid||""],f}),s(!1),g(null),m(!1),n("")},[i]),V=p(async v=>{if(!(!i||!e)){m(!0),n("");try{await ce({templateId:e.id,itemId:i.uid||"",note:v}),w()}catch(f){console.error("Failed to set template line item note:",f);const D=f instanceof Error?f.message:"Unable to update the item. Please try again.";n(D),m(!1)}}},[i,e,w]),X=C.type==="success"?o(B,{type:"success",variant:"primary",icon:o(z,{}),heading:t.removeSuccessHeading,description:C.message,onDismiss:q,"data-testid":"remove-items-success-banner"}):C.type==="error"?o(B,{type:"error",variant:"primary",icon:o(U,{}),heading:t.removeErrorHeading,description:C.message,onDismiss:q,"data-testid":"remove-items-error-banner"}):null,Z=E.type==="success"?o(B,{type:"success",variant:"primary",icon:o(z,{}),heading:t.updateSuccessHeading,description:E.message,onDismiss:F,"data-testid":"update-quantities-success-banner"}):E.type==="error"?o(B,{type:"error",variant:"primary",icon:o(U,{}),heading:t.updateErrorHeading,description:E.message,onDismiss:F,"data-testid":"update-quantities-error-banner"}):null;if(!e)return o($,{loading:!0});const ee=y?{open:!0,title:t.removeModalTitle,message:t.removeModalDescription,cancelLabel:t.removeModalCancelButton,confirmLabel:h?t.removeModalConfirmButtonRemoving:t.removeModalConfirmButton,onCancel:c,onConfirm:I,confirmationBanner:X}:null,te=K?{open:!0,title:t.updateModalTitle,message:t.updateModalDescription,cancelLabel:t.updateModalCancelButton,confirmLabel:t.updateModalUpdateButton,onCancel:J,onConfirm:G,confirmationBanner:Z}:null,j=ee||te,x=[];e.prices.subtotalExcludingTax&&x.push({label:t.subtotal,id:"subtotal",value:o(Y,{amount:e.prices.subtotalExcludingTax.value,currency:e.prices.subtotalExcludingTax.currency,weight:"normal"})}),e.prices.grandTotal&&x.push({label:t.grandTotal,id:"total",value:o(Y,{amount:e.prices.grandTotal.value,currency:e.prices.grandTotal.currency}),strong:!0});const ae=S?o(B,{type:"error",variant:"primary",icon:o(U,{}),heading:t.errorHeading,description:S,onDismiss:()=>n(""),"data-testid":"line-item-note-error-banner"}):null;return ne(se,{children:[o($,{"data-testid":"items-quoted-template-container",...a,loading:!1,table:o(W,{name:"ProductListTable",slot:r==null?void 0:r.ProductListTable,context:{items:e.items,canEdit:e.canSendForReview,dropdownSelections:k,handleItemDropdownChange:_,handleQuantityChange:L,handleUpdate:A},children:o(ie,{items:e.items,canEdit:e.canSendForReview,showActions:e.canEditTemplateItems,onItemDropdownChange:_,onQuantityChange:L,onUpdate:A,dropdownSelections:k})}),pricesSummary:o(W,{name:"QuotePricesSummary",slot:r==null?void 0:r.QuotePricesSummary,context:{items:e.items,prices:e.prices},children:o(re,{entries:x})})}),j&&o(me,{...j}),i&&o(le,{open:M,item:i,onClose:w,onConfirm:V,isSubmitting:u,readOnlyQuantity:!0,errorBanner:ae||void 0})]})};export{Ue as I};
4
+ //# sourceMappingURL=ItemsQuotedTemplate.js.map