@dropins/storefront-quote-management 0.0.1-alpha27 → 0.0.1-alpha29

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 (79) hide show
  1. package/api/duplicateNegotiableQuote/duplicateNegotiableQuote.d.ts +8 -0
  2. package/api/duplicateNegotiableQuote/graphql/duplicateNegotiableQuoteMutation.d.ts +10 -0
  3. package/api/duplicateNegotiableQuote/index.d.ts +10 -0
  4. package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +1 -1
  5. package/api/index.d.ts +2 -0
  6. package/api/setLineItemNote/graphql/SetLineItemNoteMutation.d.ts +10 -0
  7. package/api/setLineItemNote/index.d.ts +10 -0
  8. package/api/setLineItemNote/setLineItemNote.d.ts +10 -0
  9. package/api.js +11 -239
  10. package/api.js.map +1 -1
  11. package/chunks/ConfirmationModal.js +4 -0
  12. package/chunks/ConfirmationModal.js.map +1 -0
  13. package/chunks/ItemsQuoted.js +1 -1
  14. package/chunks/ItemsQuoted.js.map +1 -1
  15. package/chunks/ItemsQuotedTemplate.js +1 -1
  16. package/chunks/ItemsQuotedTemplate.js.map +1 -1
  17. package/chunks/NegotiableQuoteTemplateFragment.js +190 -0
  18. package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -0
  19. package/chunks/OrderSummaryLine.js +1 -1
  20. package/chunks/OrderSummaryLine.js.map +1 -1
  21. package/chunks/QuotePricesSummary.js +1 -1
  22. package/chunks/QuotePricesSummary.js.map +1 -1
  23. package/chunks/TabbedContent.js +1 -1
  24. package/chunks/TabbedContent.js.map +1 -1
  25. package/chunks/dateUtils.js +1 -1
  26. package/chunks/dateUtils.js.map +1 -1
  27. package/chunks/duplicateNegotiableQuote.js +121 -0
  28. package/chunks/duplicateNegotiableQuote.js.map +1 -0
  29. package/chunks/generateQuoteFromTemplate.js +12 -0
  30. package/chunks/generateQuoteFromTemplate.js.map +1 -0
  31. package/chunks/getQuoteTemplates.js +2 -2
  32. package/chunks/getQuoteTemplates.js.map +1 -1
  33. package/chunks/openQuoteTemplate.js +31 -0
  34. package/chunks/openQuoteTemplate.js.map +1 -0
  35. package/chunks/setLineItemNote.js +47 -0
  36. package/chunks/setLineItemNote.js.map +1 -0
  37. package/chunks/state.js +1 -1
  38. package/chunks/state.js.map +1 -1
  39. package/chunks/transform-quote-template.js +4 -0
  40. package/chunks/transform-quote-template.js.map +1 -0
  41. package/chunks/transform-quote.js +1 -1
  42. package/chunks/transform-quote.js.map +1 -1
  43. package/components/LineItemNoteModal/LineItemNoteModal.d.ts +16 -0
  44. package/components/LineItemNoteModal/index.d.ts +11 -0
  45. package/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +0 -2
  46. package/components/ProductListTable/ProductListTable.d.ts +8 -0
  47. package/components/index.d.ts +1 -0
  48. package/containers/ItemsQuoted/ItemsQuoted.d.ts +1 -1
  49. package/containers/ItemsQuoted.js +1 -1
  50. package/containers/ItemsQuotedTemplate.js +1 -1
  51. package/containers/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +4 -0
  52. package/containers/ManageNegotiableQuote.js +1 -1
  53. package/containers/ManageNegotiableQuote.js.map +1 -1
  54. package/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +13 -0
  55. package/containers/ManageNegotiableQuoteTemplate.js +1 -1
  56. package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
  57. package/containers/OrderSummary.js +1 -1
  58. package/containers/OrderSummary.js.map +1 -1
  59. package/containers/OrderSummaryLine.js +1 -1
  60. package/containers/QuoteSummaryList.js +1 -1
  61. package/containers/QuoteSummaryList.js.map +1 -1
  62. package/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.d.ts +2 -0
  63. package/containers/QuoteTemplatesListTable.js +1 -1
  64. package/containers/QuoteTemplatesListTable.js.map +1 -1
  65. package/containers/QuotesListTable.js +1 -1
  66. package/containers/QuotesListTable.js.map +1 -1
  67. package/containers/RequestNegotiableQuoteForm.js +1 -1
  68. package/containers/RequestNegotiableQuoteForm.js.map +1 -1
  69. package/data/models/negotiable-quote-template-model.d.ts +18 -8
  70. package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +6 -0
  71. package/i18n/en_US.json.d.ts +72 -0
  72. package/package.json +1 -1
  73. package/render.js +3 -3
  74. package/render.js.map +1 -1
  75. package/types/state.types.d.ts +3 -0
  76. package/chunks/removeNegotiableQuoteItems.js +0 -38
  77. package/chunks/removeNegotiableQuoteItems.js.map +0 -1
  78. package/chunks/renameNegotiableQuote.js +0 -104
  79. package/chunks/renameNegotiableQuote.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ItemsQuoted.js","sources":["/@dropins/storefront-quote-management/src/components/ConfirmationModal/ConfirmationModal.tsx","/@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 { 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","/********************************************************************\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 { NegotiableQuoteModel, NegotiableQuoteCartItem } from '@/quote-management/data/models/negotiable-quote-model';\nimport { ProductListTable, ProductListTableItem, QuotePricesSummary, ItemsQuoted as ItemsQuotedComponent } from '@/quote-management/components';\nimport { CheckWithCircle, WarningFilled } from '@adobe-commerce/elsie/icons';\nimport { ConfirmationModal } from '@/quote-management/components/ConfirmationModal';\nimport { updateQuantities } from '@/quote-management/api/updateQuantities';\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>;\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 onUpdate,\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 [isModalOpen, setIsModalOpen] = useState(false);\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\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 setIsModalOpen(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 if (action === 'remove') {\n setDropdownSelections((prev) => ({\n ...prev,\n [cartItem.uid]: action,\n }));\n handleRemoveItems([cartItem]); // Use unified handler\n onItemDropdownChange?.(cartItem, action);\n return;\n }\n\n onItemDropdownChange?.(cartItem, action);\n\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 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 setIsModalOpen(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 setIsModalOpen(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 setIsModalOpen(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 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,\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={isModalOpen}\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 </>\n );\n};\n"],"names":["ConfirmationModal","open","title","message","cancelLabel","confirmLabel","onCancel","onConfirm","onClose","showCloseButton","confirmationBanner","props","dictionary","useText","className","restProps","jsx","Modal","jsxs","Button","NOTIFICATION_AUTO_DISMISS_DELAY","ItemsQuoted","initialData","onItemCheckboxChange","onItemDropdownChange","onUpdate","onRemoveItemsRef","onRemoveModalStateChange","slots","quoteData","setQuoteData","useState","quantityChanges","setQuantityChanges","isModalOpen","setIsModalOpen","notificationState","setNotificationState","isRemoveModalOpen","setIsRemoveModalOpen","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","dropdownSelections","setDropdownSelections","useEffect","quoteDataEvent","events","data","quantitiesUpdatedEvent","itemsRemovedEvent","handleRemoveItems","useCallback","items","handleDismissRemoveBanner","handleItemDropdownChange","item","action","cartItem","prev","next","handleConfirmRemove","uidsToRemove","removeNegotiableQuoteItems","err","errorMessage","failedItem","handleCancelRemove","cancelledItem","ItemsQuotedComponent","canEdit","handleQuantityChange","newQuantity","handleUpdate","handleConfirmUpdate","quoteItemUid","quantity","updateQuantities","handleCancelUpdate","handleDismissBanner","quotePricesSummaryEntries","Price","InLineAlert","CheckWithCircle","WarningFilled","handleItemCheckboxChange","isSelected","removeConfirmationBanner","Fragment","Slot","ProductListTable","QuotePricesSummary"],"mappings":"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"}
1
+ {"version":3,"file":"ItemsQuoted.js","sources":["/@dropins/storefront-quote-management/src/components/LineItemNoteModal/LineItemNoteModal.tsx","/@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 { FunctionComponent, VNode } from 'preact';\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Button,\n TextArea,\n Input,\n Modal,\n Price,\n Table,\n} from '@adobe-commerce/elsie/components';\nimport { NegotiableQuoteCartItem } from '@/quote-management/data/models/negotiable-quote-model';\nimport '@/quote-management/components/LineItemNoteModal/LineItemNoteModal.css';\n\nexport interface LineItemNoteModalProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n open: boolean;\n item: NegotiableQuoteCartItem;\n onClose?: () => void;\n onConfirm: (note: string, quantity: number) => void;\n isSubmitting?: boolean;\n errorBanner?: VNode;\n successBanner?: VNode;\n showCloseButton?: boolean;\n}\n\nexport const LineItemNoteModal: FunctionComponent<LineItemNoteModalProps> = ({\n className,\n open,\n item,\n onClose,\n onConfirm,\n isSubmitting = false,\n errorBanner,\n successBanner,\n showCloseButton = true,\n}) => {\n const [note, setNote] = useState('');\n const [quantity, setQuantity] = useState(item.quantity);\n const [errors, setErrors] = useState<{ note?: string; quantity?: string }>(\n {}\n );\n\n const dictionary = useText({\n title: 'NegotiableQuote.Manage.lineItemNote.title',\n productLabel: 'NegotiableQuote.Manage.lineItemNote.productLabel',\n skuLabel: 'NegotiableQuote.Manage.lineItemNote.skuLabel',\n priceLabel: 'NegotiableQuote.Manage.lineItemNote.priceLabel',\n stockLabel: 'NegotiableQuote.Manage.lineItemNote.stockLabel',\n quantityLabel: 'NegotiableQuote.Manage.lineItemNote.quantityLabel',\n discountLabel: 'NegotiableQuote.Manage.lineItemNote.discountLabel',\n subtotalLabel: 'NegotiableQuote.Manage.lineItemNote.subtotalLabel',\n noteLabel: 'NegotiableQuote.Manage.lineItemNote.noteLabel',\n notePlaceholder: 'NegotiableQuote.Manage.lineItemNote.notePlaceholder',\n noteHelper: 'NegotiableQuote.Manage.lineItemNote.noteHelper',\n confirmButton: 'NegotiableQuote.Manage.lineItemNote.confirmButton',\n cancelButton: 'NegotiableQuote.Manage.lineItemNote.cancelButton',\n noteError: 'NegotiableQuote.Manage.lineItemNote.noteError',\n quantityError: 'NegotiableQuote.Manage.lineItemNote.quantityError',\n });\n\n // Reset form when modal opens with new item\n useEffect(() => {\n if (open) {\n // Get the most recent valid note from buyer (if exists)\n const validNotes =\n item.noteFromBuyer?.filter((note) => note && note.note) || [];\n const existingNote = validNotes.length > 0 ? validNotes[0].note : '';\n setNote(existingNote || '');\n setQuantity(item.quantity);\n setErrors({});\n }\n }, [open, item.quantity, item.noteFromBuyer]);\n\n const handleConfirm = useCallback(() => {\n const newErrors: { note?: string; quantity?: string } = {};\n\n // Check if the note field is empty\n if (!note.trim()) {\n newErrors.note = dictionary.noteError;\n }\n\n if (quantity <= 0) {\n newErrors.quantity = dictionary.quantityError;\n }\n\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors);\n return;\n }\n\n onConfirm(note.trim(), quantity);\n }, [note, quantity, onConfirm, dictionary]);\n\n const handleCancel = useCallback(() => {\n setNote('');\n setQuantity(item.quantity);\n setErrors({});\n onClose?.();\n }, [onClose, item.quantity]);\n\n if (!open) {\n return null;\n }\n\n // Calculate discount display\n const hasDiscount = item.discounts && item.discounts.length > 0;\n const discountDisplay = hasDiscount\n ? item.discounts.map((d) => d.label).join(', ')\n : '-';\n\n // Define table columns\n const columns = [\n {\n label: dictionary.productLabel,\n key: 'productName',\n },\n {\n label: dictionary.priceLabel,\n key: 'price',\n },\n {\n label: dictionary.stockLabel,\n key: 'stock',\n },\n {\n label: dictionary.quantityLabel,\n key: 'quantity',\n },\n {\n label: dictionary.discountLabel,\n key: 'discount',\n },\n {\n label: dictionary.subtotalLabel,\n key: 'subtotal',\n },\n ];\n\n // Define table row data\n const rowData = [\n {\n productName: (\n <div className=\"quote-management-line-item-note-modal__product-info\">\n <div className=\"quote-management-line-item-note-modal__product-name\">\n {item.product.name}\n </div>\n <div className=\"quote-management-line-item-note-modal__product-sku\">\n {dictionary.skuLabel}: {item.product.sku}\n </div>\n </div>\n ),\n price: (\n <Price\n amount={item.prices.originalItemPrice.value}\n currency={item.prices.originalItemPrice.currency}\n />\n ),\n stock: (\n <span className=\"quote-management-line-item-note-modal__stock\">\n {item.stockStatus}\n </span>\n ),\n quantity: (\n <Input\n name=\"quantity\"\n type=\"number\"\n min=\"1\"\n value={quantity.toString()}\n onInput={(e: any) => {\n const newQuantity = parseInt(e.target.value, 10) || 0;\n setQuantity(newQuantity);\n setErrors({ ...errors, quantity: undefined });\n }}\n disabled={isSubmitting}\n error={!!errors.quantity}\n required\n data-testid=\"line-item-note-quantity-input\"\n className=\"quote-management-line-item-note-modal__quantity-input\"\n />\n ),\n discount: (\n <span className=\"quote-management-line-item-note-modal__discount\">\n {discountDisplay}\n </span>\n ),\n subtotal: (\n <Price\n amount={item.prices.rowTotal.value}\n currency={item.prices.rowTotal.currency}\n />\n ),\n },\n ];\n\n return (\n <Modal\n open={open}\n size=\"medium\"\n title={<>{dictionary.title}</>}\n onClose={handleCancel}\n clickToDismiss={true}\n escapeToDismiss={true}\n showCloseButton={showCloseButton}\n className={classes(['quote-management-line-item-note-modal', className])}\n data-testid=\"line-item-note-modal\"\n >\n {errorBanner && (\n <div\n className=\"quote-management-line-item-note-modal__error-banner\"\n data-testid=\"line-item-note-modal-error-banner\"\n >\n {errorBanner}\n </div>\n )}\n\n {successBanner && (\n <div\n className=\"quote-management-line-item-note-modal__success-banner\"\n data-testid=\"line-item-note-modal-success-banner\"\n >\n {successBanner}\n </div>\n )}\n\n <div className=\"quote-management-line-item-note-modal__content\">\n {/* Product Details Table */}\n <div className=\"quote-management-line-item-note-modal__details\">\n <Table\n columns={columns}\n rowData={rowData}\n data-testid=\"line-item-note-table\"\n mobileLayout=\"stacked\"\n className=\"quote-management-line-item-note-modal__details-table\"\n />\n {errors.quantity && (\n <div className=\"quote-management-line-item-note-modal__table-error\">\n {errors.quantity}\n </div>\n )}\n </div>\n\n {/* Note TextArea */}\n <div className=\"quote-management-line-item-note-modal__form-field\">\n <TextArea\n name=\"note\"\n placeholder={dictionary.notePlaceholder}\n rows={4}\n value={note}\n onInput={(e: any) => {\n setNote(e.target.value);\n setErrors({ ...errors, note: undefined });\n }}\n label={dictionary.noteLabel}\n disabled={isSubmitting}\n data-testid=\"line-item-note-textarea\"\n />\n {!errors.note && (\n <span className=\"quote-management-line-item-note-modal__helper-text\">\n {dictionary.noteHelper}\n </span>\n )}\n {errors.note && (\n <span className=\"quote-management-line-item-note-modal__error-text\">\n {errors.note}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"quote-management-line-item-note-modal__actions\">\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={handleCancel}\n disabled={isSubmitting}\n className=\"quote-management-line-item-note-modal__cancel-button\"\n data-testid=\"line-item-note-cancel-button\"\n >\n {dictionary.cancelButton}\n </Button>\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={handleConfirm}\n disabled={isSubmitting}\n className=\"quote-management-line-item-note-modal__confirm-button\"\n data-testid=\"line-item-note-confirm-button\"\n >\n {dictionary.confirmButton}\n </Button>\n </div>\n </Modal>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n 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":["LineItemNoteModal","className","open","item","onClose","onConfirm","isSubmitting","errorBanner","successBanner","showCloseButton","note","setNote","useState","quantity","setQuantity","errors","setErrors","dictionary","useText","useEffect","validNotes","_a","existingNote","handleConfirm","useCallback","newErrors","handleCancel","discountDisplay","d","columns","rowData","jsxs","jsx","Price","Input","e","newQuantity","Modal","Fragment","classes","Table","TextArea","Button","NOTIFICATION_AUTO_DISMISS_DELAY","ItemsQuoted","initialData","onItemCheckboxChange","onItemDropdownChange","onRemoveItemsRef","onRemoveModalStateChange","slots","props","quoteData","setQuoteData","quantityChanges","setQuantityChanges","selectedItem","setSelectedItem","isUpdateQuantitiesModalOpen","setIsUpdateQuantitiesModalOpen","isLineItemNoteModalOpen","setIsLineItemNoteModalOpen","modalErrorMessage","setModalErrorMessage","notificationState","setNotificationState","isRemoveModalOpen","setIsRemoveModalOpen","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","dropdownSelections","setDropdownSelections","setIsSubmitting","quoteDataEvent","events","data","quantitiesUpdatedEvent","itemsRemovedEvent","handleRemoveItems","items","handleDismissRemoveBanner","handleItemDropdownChange","action","cartItem","prev","next","handleConfirmRemove","uidsToRemove","removeNegotiableQuoteItems","err","errorMessage","failedItem","handleCancelRemove","cancelledItem","handleModalClose","handleModalConfirm","updateQuantities","setLineItemNote","error","ItemsQuotedComponent","canEdit","handleQuantityChange","handleUpdate","handleConfirmUpdate","quoteItemUid","handleCancelUpdate","handleDismissBanner","quotePricesSummaryEntries","confirmationBanner","InLineAlert","CheckWithCircle","WarningFilled","handleItemCheckboxChange","isSelected","removeConfirmationBanner","modalErrorBanner","Slot","ProductListTable","QuotePricesSummary","ConfirmationModal"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as d,useEffect as g}from"@dropins/tools/preact-compat.js";import{Slot as u}from"@dropins/tools/lib.js";import{events as T}from"@dropins/tools/event-bus.js";import{Price as m}from"@dropins/tools/components.js";/* empty css */import{I as n,Q as b,P as x}from"./QuotePricesSummary.js";/* empty css *//* empty css *//* empty css */import{useText as f}from"@dropins/tools/i18n.js";const N=({templateData:c,slots:a,...l})=>{const[e,s]=d(c),i=f({subtotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax",grandTotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax",appliedTaxes:"NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes"});if(g(()=>{const o=T.on("quote-management/quote-template-data",p=>{s(p.quoteTemplate)},{eager:!0});return()=>o==null?void 0:o.off()},[]),!e)return t(n,{loading:!0});const r=[];return e.prices.subtotalExcludingTax&&r.push({label:i.subtotal,id:"subtotal",value:t(m,{amount:e.prices.subtotalExcludingTax.value,currency:e.prices.subtotalExcludingTax.currency,weight:"normal"})}),e.prices.grandTotal&&r.push({label:i.grandTotal,id:"total",value:t(m,{amount:e.prices.grandTotal.value,currency:e.prices.grandTotal.currency}),strong:!0}),t(n,{"data-testid":"items-quoted-template-container",...l,loading:!1,table:t(u,{name:"ProductListTable",slot:a==null?void 0:a.ProductListTable,context:{items:e.items,canEdit:!1},children:t(x,{items:e.items,canEdit:!1})}),pricesSummary:t(u,{name:"QuotePricesSummary",slot:a==null?void 0:a.QuotePricesSummary,context:{items:e.items,prices:e.prices},children:t(b,{entries:r})})})};export{N as I};
3
+ import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as d,useEffect as g}from"@dropins/tools/preact-compat.js";import{Slot as u}from"@dropins/tools/lib.js";import{events as T}from"@dropins/tools/event-bus.js";import{Price as m}from"@dropins/tools/components.js";/* empty css */import{I as n,Q as b,P as x}from"./QuotePricesSummary.js";/* empty css *//* empty css *//* empty css */import{useText as f}from"@dropins/tools/i18n.js";const N=({templateData:c,slots:a,...l})=>{const[e,s]=d(c),i=f({subtotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax",grandTotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax",appliedTaxes:"NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes"});if(g(()=>{const o=T.on("quote-management/quote-template-data",p=>{s(p.quoteTemplate)},{eager:!0});return()=>o==null?void 0:o.off()},[]),!e)return t(n,{loading:!0});const r=[];return e.prices.subtotalExcludingTax&&r.push({label:i.subtotal,id:"subtotal",value:t(m,{amount:e.prices.subtotalExcludingTax.value,currency:e.prices.subtotalExcludingTax.currency,weight:"normal"})}),e.prices.grandTotal&&r.push({label:i.grandTotal,id:"total",value:t(m,{amount:e.prices.grandTotal.value,currency:e.prices.grandTotal.currency}),strong:!0}),t(n,{"data-testid":"items-quoted-template-container",...l,loading:!1,table:t(u,{name:"ProductListTable",slot:a==null?void 0:a.ProductListTable,context:{items:e.items,canEdit:!1},children:t(x,{items:e.items,canEdit:!1})}),pricesSummary:t(u,{name:"QuotePricesSummary",slot:a==null?void 0:a.QuotePricesSummary,context:{items:e.items,prices:e.prices},children:t(b,{entries:r})})})};export{N as I};
4
4
  //# sourceMappingURL=ItemsQuotedTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ItemsQuotedTemplate.js","sources":["/@dropins/storefront-quote-management/src/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.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 { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { NegotiableQuoteTemplateModel } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { QuotePricesSummary, ProductListTable, ItemsQuoted as ItemsQuotedComponent } from '@/quote-management/components';\n\nexport interface ItemsQuotedTemplateProps extends HTMLAttributes<HTMLDivElement> {\n templateData?: NegotiableQuoteTemplateModel;\n slots?: {\n ProductListTable?: SlotProps<{\n items: NegotiableQuoteTemplateModel['items'];\n canEdit: boolean;\n }>;\n QuotePricesSummary?: SlotProps<{\n items: NegotiableQuoteTemplateModel['items'];\n prices: NegotiableQuoteTemplateModel['prices'];\n }>;\n }\n}\n\nexport const ItemsQuotedTemplate: Container<ItemsQuotedTemplateProps> = ({\n templateData: initialData,\n slots,\n ...props\n}) => {\n const [templateData, setTemplateData] = useState<NegotiableQuoteTemplateModel | undefined>(initialData);\n\n const dictionary = useText({\n subtotal: 'NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax',\n grandTotal: 'NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax',\n appliedTaxes: 'NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes',\n });\n\n useEffect(() => {\n const templateDataEvent = events.on('quote-management/quote-template-data', (payload) => {\n setTemplateData(payload.quoteTemplate);\n }, { eager: true });\n\n return () => templateDataEvent?.off();\n }, []);\n\n if (!templateData) {\n return <ItemsQuotedComponent loading={true} />;\n }\n\n const quotePricesSummaryEntries = [];\n\n templateData.prices.subtotalExcludingTax && quotePricesSummaryEntries.push({\n label: dictionary.subtotal,\n id: 'subtotal',\n value: <Price amount={templateData.prices.subtotalExcludingTax.value} currency={templateData.prices.subtotalExcludingTax.currency} weight='normal' />,\n });\n\n templateData.prices.grandTotal && quotePricesSummaryEntries.push({\n label: dictionary.grandTotal,\n id: 'total',\n value: <Price amount={templateData.prices.grandTotal.value} currency={templateData.prices.grandTotal.currency} />,\n strong: true,\n })\n\n return (\n <ItemsQuotedComponent data-testid=\"items-quoted-template-container\" {...props} loading={false}\n table={\n <Slot name=\"ProductListTable\" slot={slots?.ProductListTable}\n context={{\n items: templateData.items,\n canEdit: false,\n }}>\n\n <ProductListTable items={templateData.items} canEdit={false} />\n </Slot>\n }\n pricesSummary={<Slot name=\"QuotePricesSummary\" slot={slots?.QuotePricesSummary} context={{\n items: templateData.items,\n prices: templateData.prices,\n }}>\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n );\n};\n"],"names":["ItemsQuotedTemplate","initialData","slots","props","templateData","setTemplateData","useState","dictionary","useText","useEffect","templateDataEvent","events","payload","jsx","ItemsQuotedComponent","quotePricesSummaryEntries","Price","Slot","ProductListTable","QuotePricesSummary"],"mappings":"whBA+BO,MAAMA,EAA2D,CAAC,CACvE,aAAcC,EACd,MAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAmDL,CAAW,EAEhGM,EAAaC,EAAQ,CACzB,SAAU,0EACV,WAAY,4EACZ,aAAc,gEAAA,CACf,EAUD,GARAC,EAAU,IAAM,CACd,MAAMC,EAAoBC,EAAO,GAAG,uCAAyCC,GAAY,CACvFP,EAAgBO,EAAQ,aAAa,CACvC,EAAG,CAAE,MAAO,GAAM,EAElB,MAAO,IAAMF,GAAA,YAAAA,EAAmB,KAClC,EAAG,CAAA,CAAE,EAED,CAACN,EACH,OAAOS,EAACC,EAAA,CAAqB,QAAS,EAAA,CAAM,EAG9C,MAAMC,EAA4B,CAAA,EAElC,OAAAX,EAAa,OAAO,sBAAwBW,EAA0B,KAAK,CACzE,MAAOR,EAAW,SAClB,GAAI,WACJ,MAAOM,EAACG,EAAA,CAAM,OAAQZ,EAAa,OAAO,qBAAqB,MAAO,SAAUA,EAAa,OAAO,qBAAqB,SAAU,OAAO,QAAA,CAAS,CAAA,CACpJ,EAEDA,EAAa,OAAO,YAAcW,EAA0B,KAAK,CAC/D,MAAOR,EAAW,WAClB,GAAI,QACJ,MAAOM,EAACG,EAAA,CAAM,OAAQZ,EAAa,OAAO,WAAW,MAAO,SAAUA,EAAa,OAAO,WAAW,QAAA,CAAU,EAC/G,OAAQ,EAAA,CACT,EAGCS,EAACC,EAAA,CAAqB,cAAY,kCAAmC,GAAGX,EAAO,QAAS,GACtF,MACEU,EAACI,EAAA,CAAK,KAAK,mBAAmB,KAAMf,GAAA,YAAAA,EAAO,iBACzC,QAAS,CACP,MAAOE,EAAa,MACpB,QAAS,EAAA,EAGX,WAACc,EAAA,CAAiB,MAAOd,EAAa,MAAO,QAAS,EAAA,CAAO,CAAA,CAAA,EAGjE,gBAAgBa,EAAA,CAAK,KAAK,qBAAqB,KAAMf,GAAA,YAAAA,EAAO,mBAAoB,QAAS,CACvF,MAAOE,EAAa,MACpB,OAAQA,EAAa,MAAA,EAErB,SAAAS,EAACM,EAAA,CAAmB,QAASJ,EAA2B,CAAA,CAC1D,CAAA,CAAA,CAIN"}
1
+ {"version":3,"file":"ItemsQuotedTemplate.js","sources":["/@dropins/storefront-quote-management/src/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.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 { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { NegotiableQuoteTemplateModel } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { QuotePricesSummary, ProductListTable, ItemsQuoted as ItemsQuotedComponent } from '@/quote-management/components';\n\nexport interface ItemsQuotedTemplateProps extends HTMLAttributes<HTMLDivElement> {\n templateData?: NegotiableQuoteTemplateModel;\n slots?: {\n ProductListTable?: SlotProps<{\n items: NegotiableQuoteTemplateModel['items'];\n canEdit: boolean;\n }>;\n QuotePricesSummary?: SlotProps<{\n items: NegotiableQuoteTemplateModel['items'];\n prices: NegotiableQuoteTemplateModel['prices'];\n }>;\n }\n}\n\nexport const ItemsQuotedTemplate: Container<ItemsQuotedTemplateProps> = ({\n templateData: initialData,\n slots,\n ...props\n}) => {\n const [templateData, setTemplateData] = useState<NegotiableQuoteTemplateModel | undefined>(initialData);\n\n const dictionary = useText({\n subtotal: 'NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax',\n grandTotal: 'NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax',\n appliedTaxes: 'NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes',\n });\n\n useEffect(() => {\n const templateDataEvent = events.on('quote-management/quote-template-data', (payload) => {\n setTemplateData(payload.quoteTemplate);\n }, { eager: true });\n\n return () => templateDataEvent?.off();\n }, []);\n\n if (!templateData) {\n return <ItemsQuotedComponent loading={true} />;\n }\n\n const quotePricesSummaryEntries = [];\n\n templateData.prices.subtotalExcludingTax && quotePricesSummaryEntries.push({\n label: dictionary.subtotal,\n id: 'subtotal',\n value: <Price amount={templateData.prices.subtotalExcludingTax.value} currency={templateData.prices.subtotalExcludingTax.currency} weight='normal' />,\n });\n\n templateData.prices.grandTotal && quotePricesSummaryEntries.push({\n label: dictionary.grandTotal,\n id: 'total',\n value: <Price amount={templateData.prices.grandTotal.value} currency={templateData.prices.grandTotal.currency} />,\n strong: true,\n })\n\n return (\n <ItemsQuotedComponent data-testid=\"items-quoted-template-container\" {...props} loading={false}\n table={\n <Slot name=\"ProductListTable\" slot={slots?.ProductListTable}\n context={{\n items: templateData.items,\n canEdit: false,\n }}>\n\n <ProductListTable items={templateData.items} canEdit={false} />\n </Slot>\n }\n pricesSummary={<Slot name=\"QuotePricesSummary\" slot={slots?.QuotePricesSummary} context={{\n items: templateData.items,\n prices: templateData.prices,\n }}>\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n );\n};\n"],"names":["ItemsQuotedTemplate","initialData","slots","props","templateData","setTemplateData","useState","dictionary","useText","useEffect","templateDataEvent","events","payload","jsx","ItemsQuotedComponent","quotePricesSummaryEntries","Price","Slot","ProductListTable","QuotePricesSummary"],"mappings":"4gBA+BO,MAAMA,EAA2D,CAAC,CACvE,aAAcC,EACd,MAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAmDL,CAAW,EAEhGM,EAAaC,EAAQ,CACzB,SAAU,0EACV,WAAY,4EACZ,aAAc,gEAAA,CACf,EAUD,GARAC,EAAU,IAAM,CACd,MAAMC,EAAoBC,EAAO,GAAG,uCAAyCC,GAAY,CACvFP,EAAgBO,EAAQ,aAAa,CACvC,EAAG,CAAE,MAAO,GAAM,EAElB,MAAO,IAAMF,GAAA,YAAAA,EAAmB,KAClC,EAAG,CAAA,CAAE,EAED,CAACN,EACH,OAAOS,EAACC,EAAA,CAAqB,QAAS,EAAA,CAAM,EAG9C,MAAMC,EAA4B,CAAA,EAElC,OAAAX,EAAa,OAAO,sBAAwBW,EAA0B,KAAK,CACzE,MAAOR,EAAW,SAClB,GAAI,WACJ,MAAOM,EAACG,EAAA,CAAM,OAAQZ,EAAa,OAAO,qBAAqB,MAAO,SAAUA,EAAa,OAAO,qBAAqB,SAAU,OAAO,QAAA,CAAS,CAAA,CACpJ,EAEDA,EAAa,OAAO,YAAcW,EAA0B,KAAK,CAC/D,MAAOR,EAAW,WAClB,GAAI,QACJ,MAAOM,EAACG,EAAA,CAAM,OAAQZ,EAAa,OAAO,WAAW,MAAO,SAAUA,EAAa,OAAO,WAAW,QAAA,CAAU,EAC/G,OAAQ,EAAA,CACT,EAGCS,EAACC,EAAA,CAAqB,cAAY,kCAAmC,GAAGX,EAAO,QAAS,GACtF,MACEU,EAACI,EAAA,CAAK,KAAK,mBAAmB,KAAMf,GAAA,YAAAA,EAAO,iBACzC,QAAS,CACP,MAAOE,EAAa,MACpB,QAAS,EAAA,EAGX,WAACc,EAAA,CAAiB,MAAOd,EAAa,MAAO,QAAS,EAAA,CAAO,CAAA,CAAA,EAGjE,gBAAgBa,EAAA,CAAK,KAAK,qBAAqB,KAAMf,GAAA,YAAAA,EAAO,mBAAoB,QAAS,CACvF,MAAOE,EAAa,MACpB,OAAQA,EAAa,MAAA,EAErB,SAAAS,EAACM,EAAA,CAAmB,QAASJ,EAA2B,CAAA,CAC1D,CAAA,CAAA,CAIN"}
@@ -0,0 +1,190 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ const e=`
4
+ fragment NegotiableQuoteTemplateFragment on NegotiableQuoteTemplate {
5
+ # uid
6
+ template_id
7
+ name
8
+ # created_at
9
+ # updated_at
10
+ status
11
+ # sales_rep_name
12
+ expiration_date
13
+ buyer {
14
+ firstname
15
+ lastname
16
+ }
17
+ comments {
18
+ uid
19
+ created_at
20
+ author {
21
+ firstname
22
+ lastname
23
+ }
24
+ text
25
+ attachments {
26
+ name
27
+ url
28
+ }
29
+ }
30
+ items {
31
+ uid
32
+ product {
33
+ name
34
+ sku
35
+ uid
36
+ stock_status
37
+ }
38
+ prices {
39
+ price {
40
+ currency
41
+ value
42
+ }
43
+ original_item_price {
44
+ currency
45
+ value
46
+ }
47
+ row_total {
48
+ currency
49
+ value
50
+ }
51
+ catalog_discount {
52
+ amount_off
53
+ percent_off
54
+ }
55
+ discounts {
56
+ label
57
+ value
58
+ amount {
59
+ currency
60
+ value
61
+ }
62
+ }
63
+ }
64
+ quantity
65
+ note_from_buyer {
66
+ created_at
67
+ creator_id
68
+ creator_type
69
+ # negotiable_quote_template_item_uid
70
+ note
71
+ note_uid
72
+ }
73
+ note_from_seller {
74
+ created_at
75
+ creator_id
76
+ creator_type
77
+ # negotiable_quote_template_item_uid
78
+ note
79
+ note_uid
80
+ }
81
+ ... on ConfigurableCartItem {
82
+ configurable_options {
83
+ option_label
84
+ value_label
85
+ }
86
+ }
87
+ ... on BundleCartItem {
88
+ bundle_options {
89
+ label
90
+ values {
91
+ label
92
+ quantity
93
+ original_price {
94
+ currency
95
+ value
96
+ }
97
+ priceV2 {
98
+ currency
99
+ value
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ history {
106
+ uid
107
+ created_at
108
+ author {
109
+ firstname
110
+ lastname
111
+ }
112
+ change_type
113
+ changes {
114
+ comment_added {
115
+ comment
116
+ }
117
+ custom_changes {
118
+ new_value
119
+ old_value
120
+ title
121
+ }
122
+ statuses {
123
+ changes {
124
+ new_status
125
+ old_status
126
+ }
127
+ }
128
+ expiration {
129
+ new_expiration
130
+ old_expiration
131
+ }
132
+ total {
133
+ new_price {
134
+ currency
135
+ value
136
+ }
137
+ old_price {
138
+ currency
139
+ value
140
+ }
141
+ }
142
+ }
143
+ }
144
+ prices {
145
+ subtotal_excluding_tax {
146
+ currency
147
+ value
148
+ }
149
+ subtotal_including_tax {
150
+ currency
151
+ value
152
+ }
153
+ subtotal_with_discount_excluding_tax {
154
+ currency
155
+ value
156
+ }
157
+ applied_taxes {
158
+ amount {
159
+ currency
160
+ value
161
+ }
162
+ label
163
+ }
164
+ grand_total {
165
+ currency
166
+ value
167
+ }
168
+ }
169
+ shipping_addresses {
170
+ uid
171
+ firstname
172
+ lastname
173
+ company
174
+ street
175
+ city
176
+ region {
177
+ code
178
+ label
179
+ region_id
180
+ }
181
+ postcode
182
+ country {
183
+ code
184
+ label
185
+ }
186
+ telephone
187
+ }
188
+ }
189
+ `;export{e as N};
190
+ //# sourceMappingURL=NegotiableQuoteTemplateFragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NegotiableQuoteTemplateFragment.js","sources":["/@dropins/storefront-quote-management/src/api/graphql/NegotiableQuoteTemplateFragment.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\nexport const NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT = /* GraphQL */ `\n fragment NegotiableQuoteTemplateFragment on NegotiableQuoteTemplate {\n # uid\n template_id\n name\n # created_at\n # updated_at\n status\n # sales_rep_name\n expiration_date\n buyer {\n firstname\n lastname\n }\n comments {\n uid\n created_at\n author {\n firstname\n lastname\n }\n text\n attachments {\n name\n url\n }\n }\n items {\n uid\n product {\n name\n sku\n uid\n stock_status\n }\n prices {\n price {\n currency\n value\n }\n original_item_price {\n currency\n value\n }\n row_total {\n currency\n value\n }\n catalog_discount {\n amount_off\n percent_off\n }\n discounts {\n label\n value\n amount {\n currency\n value\n }\n }\n }\n quantity\n note_from_buyer {\n created_at\n creator_id\n creator_type\n # negotiable_quote_template_item_uid\n note\n note_uid\n }\n note_from_seller {\n created_at\n creator_id\n creator_type\n # negotiable_quote_template_item_uid\n note\n note_uid\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n value_label\n }\n }\n ... on BundleCartItem {\n bundle_options {\n label\n values {\n label\n quantity\n original_price {\n currency\n value\n }\n priceV2 {\n currency\n value\n }\n }\n }\n }\n }\n history {\n uid\n created_at\n author {\n firstname\n lastname\n }\n change_type\n changes {\n comment_added {\n comment\n }\n custom_changes {\n new_value\n old_value\n title\n }\n statuses {\n changes {\n new_status\n old_status\n }\n }\n expiration {\n new_expiration\n old_expiration\n }\n total {\n new_price {\n currency\n value\n }\n old_price {\n currency\n value\n }\n }\n }\n }\n prices {\n subtotal_excluding_tax {\n currency\n value\n }\n subtotal_including_tax {\n currency\n value\n }\n subtotal_with_discount_excluding_tax {\n currency\n value\n }\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n }\n shipping_addresses {\n uid\n firstname\n lastname\n company\n street\n city\n region {\n code\n label\n region_id\n }\n postcode\n country {\n code\n label\n }\n telephone\n }\n }\n`;\n"],"names":["NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT"],"mappings":"AASO,MAAMA,EAAmD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as i,jsxs as u}from"@dropins/tools/preact-jsx-runtime.js";import{classes as p,VComponent as _}from"@dropins/tools/lib.js";/* empty css */import"@dropins/tools/components.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css *//* empty css */const g=({label:o,price:e,classSuffixes:t=[],labelClassSuffix:r,testId:m,children:s,...a})=>i(y,{...a,label:o,price:e,classSuffixes:t,labelClassSuffix:r,testId:m,children:s}),y=({label:o,price:e,classSuffixes:t=[],labelClassSuffix:r,testId:m,children:s,...a})=>{const n="quote-order-summary__label",c="quote-order-summary__price";return u("div",{...a,...m?{"data-testid":m}:{},className:p(["quote-order-summary__entry",...t.map(d=>`quote-order-summary__${d}`)]),children:[i("span",{className:p([n,...r?[`${n}--${r}`]:[]]),children:o}),i(_,{node:e,className:p([c,...r?[`${c}--${r}`]:[]])}),s]})};export{g as O};
3
+ import{jsx as i,jsxs as u}from"@dropins/tools/preact-jsx-runtime.js";import{classes as p,VComponent as _}from"@dropins/tools/lib.js";/* empty css */import"@dropins/tools/components.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css *//* empty css */const g=({label:o,price:e,classSuffixes:t=[],labelClassSuffix:r,testId:m,children:s,...a})=>i(y,{...a,label:o,price:e,classSuffixes:t,labelClassSuffix:r,testId:m,children:s}),y=({label:o,price:e,classSuffixes:t=[],labelClassSuffix:r,testId:m,children:s,...a})=>{const n="quote-order-summary__label",c="quote-order-summary__price";return u("div",{...a,...m?{"data-testid":m}:{},className:p(["quote-order-summary__entry",...t.map(d=>`quote-order-summary__${d}`)]),children:[i("span",{className:p([n,...r?[`${n}--${r}`]:[]]),children:o}),i(_,{node:e,className:p([c,...r?[`${c}--${r}`]:[]])}),s]})};export{g as O};
4
4
  //# sourceMappingURL=OrderSummaryLine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderSummaryLine.js","sources":["/@dropins/storefront-quote-management/src/containers/OrderSummaryLine/OrderSummaryLine.tsx","/@dropins/storefront-quote-management/src/components/OrderSummaryLine/OrderSummaryLine.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 { HTMLAttributes } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { VNode } from 'preact';\nimport { OrderSummaryLine as OrderSummaryLineComponent } from '@/quote-management/components';\n\nexport interface OrderSummaryLineProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'label'> {\n label: VNode | string;\n price: VNode<HTMLAttributes<HTMLSpanElement>>;\n classSuffixes?: Array<string>;\n labelClassSuffix?: string;\n testId?: string;\n children?: any;\n}\n\nexport const OrderSummaryLine: Container<OrderSummaryLineProps> = ({\n label,\n price,\n classSuffixes = [],\n labelClassSuffix,\n testId,\n children,\n ...props\n}) => {\n return (\n <OrderSummaryLineComponent\n {...props}\n label={label}\n price={price}\n classSuffixes={classSuffixes}\n labelClassSuffix={labelClassSuffix}\n testId={testId}\n >\n {children}\n </OrderSummaryLineComponent>\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 '@/quote-management/components/OrderSummaryLine/OrderSummaryLine.css';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nexport interface OrderSummaryLineComponentProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'label'> {\n label: VNode | string;\n price: VNode<HTMLAttributes<HTMLSpanElement>>;\n classSuffixes?: Array<string>;\n labelClassSuffix?: string;\n testId?: string;\n children?: any;\n}\n\nexport const OrderSummaryLine: FunctionComponent<\n OrderSummaryLineComponentProps\n> = ({\n label,\n price,\n classSuffixes = [],\n labelClassSuffix,\n testId,\n children,\n ...props\n}) => {\n const labelClass = 'quote-order-summary__label';\n const priceClass = 'quote-order-summary__price';\n return (\n <div\n {...props}\n {...(testId ? { 'data-testid': testId } : {})}\n className={classes([\n 'quote-order-summary__entry',\n ...classSuffixes.map(\n (classSuffix) => `quote-order-summary__${classSuffix}`\n ),\n ])}\n >\n <span\n className={classes([\n labelClass,\n ...(labelClassSuffix ? [`${labelClass}--${labelClassSuffix}`] : []),\n ])}\n >\n {label}\n </span>\n\n <VComponent\n node={price}\n className={classes([\n priceClass,\n ...(labelClassSuffix ? [`${priceClass}--${labelClassSuffix}`] : []),\n ])}\n />\n\n {children}\n </div>\n );\n};\n"],"names":["OrderSummaryLine","label","price","classSuffixes","labelClassSuffix","testId","children","props","jsx","OrderSummaryLineComponent","labelClass","priceClass","jsxs","classes","classSuffix","VComponent"],"mappings":"2aAwBO,MAAMA,EAAqD,CAAC,CACjE,MAAAC,EACA,MAAAC,EACA,cAAAC,EAAgB,CAAA,EAChB,iBAAAC,EACA,OAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAEIC,EAACC,EAAA,CACE,GAAGF,EACJ,MAAAN,EACA,MAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,OAAAC,EAEC,SAAAC,CAAA,CAAA,ECnBMN,EAET,CAAC,CACH,MAAAC,EACA,MAAAC,EACA,cAAAC,EAAgB,CAAA,EAChB,iBAAAC,EACA,OAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAAM,CACJ,MAAMG,EAAa,6BACbC,EAAa,6BACnB,OACEC,EAAC,MAAA,CACE,GAAGL,EACH,GAAIF,EAAS,CAAE,cAAeA,CAAA,EAAW,CAAA,EAC1C,UAAWQ,EAAQ,CACjB,6BACA,GAAGV,EAAc,IACdW,GAAgB,wBAAwBA,CAAW,EAAA,CACtD,CACD,EAED,SAAA,CAAAN,EAAC,OAAA,CACC,UAAWK,EAAQ,CACjBH,EACA,GAAIN,EAAmB,CAAC,GAAGM,CAAU,KAAKN,CAAgB,EAAE,EAAI,CAAA,CAAC,CAClE,EAEA,SAAAH,CAAA,CAAA,EAGHO,EAACO,EAAA,CACC,KAAMb,EACN,UAAWW,EAAQ,CACjBF,EACA,GAAIP,EAAmB,CAAC,GAAGO,CAAU,KAAKP,CAAgB,EAAE,EAAI,CAAA,CAAC,CAClE,CAAA,CAAA,EAGFE,CAAA,CAAA,CAAA,CAGP"}
1
+ {"version":3,"file":"OrderSummaryLine.js","sources":["/@dropins/storefront-quote-management/src/containers/OrderSummaryLine/OrderSummaryLine.tsx","/@dropins/storefront-quote-management/src/components/OrderSummaryLine/OrderSummaryLine.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 { HTMLAttributes } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { VNode } from 'preact';\nimport { OrderSummaryLine as OrderSummaryLineComponent } from '@/quote-management/components';\n\nexport interface OrderSummaryLineProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'label'> {\n label: VNode | string;\n price: VNode<HTMLAttributes<HTMLSpanElement>>;\n classSuffixes?: Array<string>;\n labelClassSuffix?: string;\n testId?: string;\n children?: any;\n}\n\nexport const OrderSummaryLine: Container<OrderSummaryLineProps> = ({\n label,\n price,\n classSuffixes = [],\n labelClassSuffix,\n testId,\n children,\n ...props\n}) => {\n return (\n <OrderSummaryLineComponent\n {...props}\n label={label}\n price={price}\n classSuffixes={classSuffixes}\n labelClassSuffix={labelClassSuffix}\n testId={testId}\n >\n {children}\n </OrderSummaryLineComponent>\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 '@/quote-management/components/OrderSummaryLine/OrderSummaryLine.css';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nexport interface OrderSummaryLineComponentProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'label'> {\n label: VNode | string;\n price: VNode<HTMLAttributes<HTMLSpanElement>>;\n classSuffixes?: Array<string>;\n labelClassSuffix?: string;\n testId?: string;\n children?: any;\n}\n\nexport const OrderSummaryLine: FunctionComponent<\n OrderSummaryLineComponentProps\n> = ({\n label,\n price,\n classSuffixes = [],\n labelClassSuffix,\n testId,\n children,\n ...props\n}) => {\n const labelClass = 'quote-order-summary__label';\n const priceClass = 'quote-order-summary__price';\n return (\n <div\n {...props}\n {...(testId ? { 'data-testid': testId } : {})}\n className={classes([\n 'quote-order-summary__entry',\n ...classSuffixes.map(\n (classSuffix) => `quote-order-summary__${classSuffix}`\n ),\n ])}\n >\n <span\n className={classes([\n labelClass,\n ...(labelClassSuffix ? [`${labelClass}--${labelClassSuffix}`] : []),\n ])}\n >\n {label}\n </span>\n\n <VComponent\n node={price}\n className={classes([\n priceClass,\n ...(labelClassSuffix ? [`${priceClass}--${labelClassSuffix}`] : []),\n ])}\n />\n\n {children}\n </div>\n );\n};\n"],"names":["OrderSummaryLine","label","price","classSuffixes","labelClassSuffix","testId","children","props","jsx","OrderSummaryLineComponent","labelClass","priceClass","jsxs","classes","classSuffix","VComponent"],"mappings":"+ZAwBO,MAAMA,EAAqD,CAAC,CACjE,MAAAC,EACA,MAAAC,EACA,cAAAC,EAAgB,CAAA,EAChB,iBAAAC,EACA,OAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAEIC,EAACC,EAAA,CACE,GAAGF,EACJ,MAAAN,EACA,MAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,OAAAC,EAEC,SAAAC,CAAA,CAAA,ECnBMN,EAET,CAAC,CACH,MAAAC,EACA,MAAAC,EACA,cAAAC,EAAgB,CAAA,EAChB,iBAAAC,EACA,OAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAAM,CACJ,MAAMG,EAAa,6BACbC,EAAa,6BACnB,OACEC,EAAC,MAAA,CACE,GAAGL,EACH,GAAIF,EAAS,CAAE,cAAeA,CAAA,EAAW,CAAA,EAC1C,UAAWQ,EAAQ,CACjB,6BACA,GAAGV,EAAc,IACdW,GAAgB,wBAAwBA,CAAW,EAAA,CACtD,CACD,EAED,SAAA,CAAAN,EAAC,OAAA,CACC,UAAWK,EAAQ,CACjBH,EACA,GAAIN,EAAmB,CAAC,GAAGM,CAAU,KAAKN,CAAgB,EAAE,EAAI,CAAA,CAAC,CAClE,EAEA,SAAAH,CAAA,CAAA,EAGHO,EAACO,EAAA,CACC,KAAMb,EACN,UAAWW,EAAQ,CACjBF,EACA,GAAIP,EAAmB,CAAC,GAAGO,CAAU,KAAKP,CAAgB,EAAE,EAAI,CAAA,CAAC,CAClE,CAAA,CAAA,EAGFE,CAAA,CAAA,CAAA,CAGP"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as t,jsxs as n,Fragment as I}from"@dropins/tools/preact-jsx-runtime.js";import{classes as b,VComponent as k}from"@dropins/tools/lib.js";/* empty css */import{Skeleton as R,SkeletonRow as V,Input as W,Picker as E,Price as _,Checkbox as J,Button as K,Table as X,Accordion as Y,AccordionSection as Z}from"@dropins/tools/components.js";import{h as L}from"@dropins/tools/preact.js";import{useState as H,useEffect as U}from"@dropins/tools/preact-hooks.js";import{useText as C}from"@dropins/tools/i18n.js";const ce=({className:g,loading:i,table:l,pricesSummary:r,...a})=>i?t(ee,{}):n("div",{className:b(["quote-management-items-quoted",g]),...a,children:[l&&t(k,{node:l,className:b(["quote-management-items-quoted__table"]),"data-testid":"quote-management-items-quoted__table"}),r&&t(k,{node:r,className:b(["quote-management-items-quoted__prices-summary"]),"data-testid":"quote-management-items-quoted__prices-summary"})]}),ee=()=>t(R,{"data-testid":"items-quoted-skeleton",children:t(V,{variant:"row",fullWidth:!0,size:"medium",lines:4,multilineGap:"xsmall"})}),ie=({className:g,items:i,canEdit:l,readOnly:r=!1,onItemCheckboxChange:a,onItemDropdownChange:m,onQuantityChange:p,onUpdate:N,dropdownSelections:h,...f})=>{const[x,P]=H({}),[y,T]=H({});U(()=>{const e={};i.forEach(s=>{e[s.uid]=s.quantity}),P(e),T(e)},[i]);const S=Object.keys(y).some(e=>y[e]!==x[e]),u=C({updateButton:"NegotiableQuote.Manage.productListTable.submitButton",productNameHeader:"NegotiableQuote.Manage.productListTable.headers.productName",skuHeader:"NegotiableQuote.Manage.productListTable.headers.sku",priceHeader:"NegotiableQuote.Manage.productListTable.headers.price",quantityHeader:"NegotiableQuote.Manage.productListTable.headers.quantity",discountHeader:"NegotiableQuote.Manage.productListTable.headers.discount",subtotalHeader:"NegotiableQuote.Manage.productListTable.headers.subtotal",actionsHeader:"NegotiableQuote.Manage.productListTable.headers.actions",editNoteToSeller:"NegotiableQuote.Manage.productListTable.actions.editNoteToSeller",remove:"NegotiableQuote.Manage.productListTable.actions.remove"}),v=[{label:u.productNameHeader,key:"productName"},{label:u.skuHeader,key:"sku"},{label:u.priceHeader,key:"price"},{label:u.quantityHeader,key:"quantity"},{label:u.discountHeader,key:"discount"},{label:u.subtotalHeader,key:"subtotal"}];l&&!r&&(v.unshift({label:"",key:"checkbox"}),v.push({label:u.actionsHeader,key:"actions"}));const M=(e,s)=>{const o=e.target.checked;a==null||a(s,o)},$=(e,s)=>{const o=e.target.value;m==null||m(s,o)},B=(e,s)=>{const o=parseInt(e.target.value,10);!isNaN(o)&&o>0&&(T(c=>({...c,[s.uid]:o})),p==null||p(s,o))},O=e=>{e.preventDefault(),N==null||N(e)},w=(e,s)=>e>0?n("div",{className:"quote-management-product-list-table__discount-container",children:[n("span",{className:"quote-management-product-list-table__discount-percent",children:[s,"%"]}),n("span",{className:"quote-management-product-list-table__discount-price",children:["(",t(_,{amount:e}),")"]})]}):void 0,j=e=>{var c,Q;const s=(c=e.configurableOptions)==null?void 0:c.map(d=>n("div",{className:"quote-management-product-list-table__configurable-option",children:[n("span",{className:"quote-management-product-list-table__configurable-option-label",children:[d.optionLabel,":"]}),t("span",{className:"quote-management-product-list-table__configurable-option-value",children:d.valueLabel})]},d.optionLabel)),o=(Q=e.bundleOptions)==null?void 0:Q.map(d=>n("div",{className:"quote-management-product-list-table__bundle-option",children:[t("span",{className:"quote-management-product-list-table__bundle-option-label",children:d.label}),t("div",{className:"quote-management-product-list-table__bundle-option-values",children:d.values.map(q=>n("span",{className:"quote-management-product-list-table__bundle-option-value",children:[n("span",{className:"quote-management-product-list-table__bundle-option-value-quantity",children:[q.quantity," x"]}),t("span",{className:"quote-management-product-list-table__bundle-option-value-label",children:q.label}),t(_,{className:"quote-management-product-list-table__bundle-option-value-original-price",amount:q.originalPrice.value,currency:q.originalPrice.currency,weight:"normal"})]},q.label))})]},d.label));return n("div",{className:"quote-management-product-list-table__product-name-container",children:[t("span",{className:"quote-management-product-list-table__product-name",children:e.product.name}),s,o]})},A=i.map(e=>{var o;const s=l?t(W,{className:"quote-management-product-list-table__quantity-input",type:"number",min:"1",value:((o=y[e.uid])==null?void 0:o.toString())||e.quantity.toString(),onChange:c=>B(c,e),disabled:r||!l,"data-testid":`quantity-input-${e.product.sku}`}):t("span",{className:"quote-management-product-list-table__quantity",children:e.quantity});return{checkbox:t(J,{className:"quote-management-product-list-table__checkbox",name:"itemSelected","data-testid":`item-checkbox-${e.product.sku}`,onChange:c=>M(c,e),value:e.product.sku}),productName:j(e),sku:t("span",{className:"quote-management-product-list-table__sku",children:e.product.sku}),price:t(_,{className:"quote-management-product-list-table__price",amount:e.prices.originalItemPrice.value,currency:e.prices.originalItemPrice.currency}),quantity:s,discount:e.catalogDiscount?w(e.catalogDiscount.amountOff,e.catalogDiscount.percentOff):void 0,subtotal:t(_,{className:"quote-management-product-list-table__subtotal",amount:e.prices.rowTotal.value,currency:e.prices.rowTotal.currency}),actions:t(E,{className:"quote-management-product-list-table__actions","data-testid":`item-dropdown-${e.product.sku}`,name:`item-dropdown-${e.product.sku}`,handleSelect:c=>$(c,e),placeholder:"Select",value:(h==null?void 0:h[e.uid])??"",options:[{text:u.editNoteToSeller,value:"edit"},{text:u.remove,value:"remove"}]})}}),D=t(X,{columns:v,rowData:A,"data-testid":"product-list-table",mobileLayout:"stacked"}),z=l?L("form",{}):L("div",{}),F=l?{onSubmit:O,...f}:f,G=t(K,{type:"submit",disabled:r||!l||!S,"data-testid":"product-list-table-submit-button",children:u.updateButton});return n(k,{node:z,className:b(["quote-management-product-list-table-container",g]),"data-testid":"product-list-table-container",...F,children:[D,t("div",{className:"quote-management-product-list-table-container__submit-container",children:G})]})},re=({className:g,entries:i,...l})=>{const r=a=>{var p;const m=(p=a.children)==null?void 0:p.map(r);return t("div",{className:"quote-management-quote-prices-summary__entry","data-testid":`quote-prices-summary-entry-${a.id}`,children:m?t(Y,{className:"quote-management-quote-prices-summary__accordion","data-testid":`quote-prices-summary-entry-accordion-${a.id}`,children:t(Z,{className:"quote-management-quote-prices-summary__accordion-section",title:a.label,ariaLabelTitle:a.label,secondaryText:a.value,children:m})}):n(I,{children:[t("span",{className:b(["quote-management-quote-prices-summary__label",["quote-management-quote-prices-summary__label--strong",a.strong]]),"data-testid":`quote-prices-summary-entry-label-${a.id}`,children:a.label}),t("span",{className:"quote-management-quote-prices-summary__value","data-testid":`quote-prices-summary-entry-value-${a.id}`,children:a.value})]})},a.id)};return t("div",{className:b(["quote-management-quote-prices-summary",g]),"data-testid":"quote-prices-summary",...l,children:i==null?void 0:i.map(r)})};export{ce as I,ie as P,re as Q};
3
+ import{jsx as t,jsxs as s,Fragment as V}from"@dropins/tools/preact-jsx-runtime.js";import{classes as b,VComponent as k}from"@dropins/tools/lib.js";/* empty css */import{Skeleton as W,SkeletonRow as Z,Input as E,Picker as J,Price as N,Checkbox as K,Button as U,Table as X,Accordion as Y,AccordionSection as C}from"@dropins/tools/components.js";import{h as Q}from"@dropins/tools/preact.js";import{useState as H,useEffect as ee}from"@dropins/tools/preact-hooks.js";import{g as te}from"./dateUtils.js";import{useText as ae}from"@dropins/tools/i18n.js";const me=({className:g,loading:c,table:r,pricesSummary:i,...n})=>c?t(oe,{}):s("div",{className:b(["quote-management-items-quoted",g]),...n,children:[r&&t(k,{node:r,className:b(["quote-management-items-quoted__table"]),"data-testid":"quote-management-items-quoted__table"}),i&&t(k,{node:i,className:b(["quote-management-items-quoted__prices-summary"]),"data-testid":"quote-management-items-quoted__prices-summary"})]}),oe=()=>t(W,{"data-testid":"items-quoted-skeleton",children:t(Z,{variant:"row",fullWidth:!0,size:"medium",lines:4,multilineGap:"xsmall"})}),pe=({className:g,items:c,canEdit:r,readOnly:i=!1,onItemCheckboxChange:n,onItemDropdownChange:m,onQuantityChange:p,onUpdate:h,dropdownSelections:y,...T})=>{const[M,x]=H({}),[v,L]=H({});ee(()=>{const e={};c.forEach(o=>{e[o.uid]=o.quantity}),x(e),L(e)},[c]);const S=Object.keys(v).some(e=>v[e]!==M[e]),u=ae({updateButton:"NegotiableQuote.Manage.productListTable.submitButton",productNameHeader:"NegotiableQuote.Manage.productListTable.headers.productName",skuHeader:"NegotiableQuote.Manage.productListTable.headers.sku",priceHeader:"NegotiableQuote.Manage.productListTable.headers.price",quantityHeader:"NegotiableQuote.Manage.productListTable.headers.quantity",discountHeader:"NegotiableQuote.Manage.productListTable.headers.discount",subtotalHeader:"NegotiableQuote.Manage.productListTable.headers.subtotal",actionsHeader:"NegotiableQuote.Manage.productListTable.headers.actions",editNoteToSeller:"NegotiableQuote.Manage.productListTable.actions.editNoteToSeller",remove:"NegotiableQuote.Manage.productListTable.actions.remove",notesHeader:"NegotiableQuote.Manage.productListTable.notes.header",leftANote:"NegotiableQuote.Manage.productListTable.notes.leftANote",buyer:"NegotiableQuote.Manage.productListTable.notes.buyer"}),f=[{label:u.productNameHeader,key:"productName"},{label:u.skuHeader,key:"sku"},{label:u.priceHeader,key:"price"},{label:u.quantityHeader,key:"quantity"},{label:u.discountHeader,key:"discount"},{label:u.subtotalHeader,key:"subtotal"}];r&&!i&&(f.unshift({label:"",key:"checkbox"}),f.push({label:u.actionsHeader,key:"actions"}));const P=(e,o)=>{const a=e.target.checked;n==null||n(o,a)},w=(e,o)=>{const a=e.target.value;m==null||m(o,a)},$=(e,o)=>{const a=parseInt(e.target.value,10);!isNaN(a)&&a>0&&(L(d=>({...d,[o.uid]:a})),p==null||p(o,a))},B=e=>{e.preventDefault(),h==null||h(e)},A=(e,o)=>e>0?s("div",{className:"quote-management-product-list-table__discount-container",children:[s("span",{className:"quote-management-product-list-table__discount-percent",children:[o,"%"]}),s("span",{className:"quote-management-product-list-table__discount-price",children:["(",t(N,{amount:e}),")"]})]}):void 0,O=e=>{var d,_;const o=(d=e.configurableOptions)==null?void 0:d.map(l=>s("div",{className:"quote-management-product-list-table__configurable-option",children:[s("span",{className:"quote-management-product-list-table__configurable-option-label",children:[l.optionLabel,":"]}),t("span",{className:"quote-management-product-list-table__configurable-option-value",children:l.valueLabel})]},l.optionLabel)),a=(_=e.bundleOptions)==null?void 0:_.map(l=>s("div",{className:"quote-management-product-list-table__bundle-option",children:[t("span",{className:"quote-management-product-list-table__bundle-option-label",children:l.label}),t("div",{className:"quote-management-product-list-table__bundle-option-values",children:l.values.map(q=>s("span",{className:"quote-management-product-list-table__bundle-option-value",children:[s("span",{className:"quote-management-product-list-table__bundle-option-value-quantity",children:[q.quantity," x"]}),t("span",{className:"quote-management-product-list-table__bundle-option-value-label",children:q.label}),t(N,{className:"quote-management-product-list-table__bundle-option-value-original-price",amount:q.originalPrice.value,currency:q.originalPrice.currency,weight:"normal"})]},q.label))})]},l.label));return s("div",{className:"quote-management-product-list-table__product-name-container",children:[t("span",{className:"quote-management-product-list-table__product-name",children:e.product.name}),o,a]})},F=e=>new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0,timeZone:te()}),R=e=>{if(!e.noteFromBuyer||e.noteFromBuyer.length===0)return null;const o=e.noteFromBuyer.filter(a=>a&&a.note&&a.note.trim()!=="");return o.length===0?null:s("div",{className:"quote-management-product-list-table__notes-container","data-testid":`item-notes-${e.product.sku}`,children:[t("div",{className:"quote-management-product-list-table__notes-header",children:u.notesHeader}),t("div",{className:"quote-management-product-list-table__notes-list",children:o.map((a,d)=>s("div",{className:"quote-management-product-list-table__note-item",children:[s("div",{className:"quote-management-product-list-table__note-content",children:[s("strong",{className:"quote-management-product-list-table__note-meta",children:[F(a.createdAt)," (",u.buyer,")"]})," ",u.leftANote]}),s("div",{className:"quote-management-product-list-table__note-text",children:[a.note," "]})]},a.noteUid||d))})]})},j=c.flatMap(e=>{var _;const o=r?t(E,{className:"quote-management-product-list-table__quantity-input",type:"number",min:"1",value:((_=v[e.uid])==null?void 0:_.toString())||e.quantity.toString(),onChange:l=>$(l,e),disabled:i||!r,"data-testid":`quantity-input-${e.product.sku}`}):t("span",{className:"quote-management-product-list-table__quantity",children:e.quantity}),a={checkbox:t(K,{className:"quote-management-product-list-table__checkbox",name:"itemSelected","data-testid":`item-checkbox-${e.product.sku}`,onChange:l=>P(l,e),value:e.product.sku}),productName:O(e),sku:t("span",{className:"quote-management-product-list-table__sku",children:e.product.sku}),price:t(N,{className:"quote-management-product-list-table__price",amount:e.prices.originalItemPrice.value,currency:e.prices.originalItemPrice.currency}),quantity:o,discount:e.catalogDiscount?A(e.catalogDiscount.amountOff,e.catalogDiscount.percentOff):void 0,subtotal:t(N,{className:"quote-management-product-list-table__subtotal",amount:e.prices.rowTotal.value,currency:e.prices.rowTotal.currency}),actions:t(J,{className:"quote-management-product-list-table__actions","data-testid":`item-dropdown-${e.product.sku}`,name:`item-dropdown-${e.product.sku}`,handleSelect:l=>w(l,e),placeholder:"Select",value:(y==null?void 0:y[e.uid])??"",options:[{text:u.editNoteToSeller,value:"edit"},{text:u.remove,value:"remove"}]})},d=R(e);return d?[a,{checkbox:"",productName:t("div",{className:"quote-management-product-list-table__notes-row-wrapper",children:d}),sku:"",price:"",quantity:"",discount:"",subtotal:"",actions:""}]:[a]}),D=t(X,{columns:f,rowData:j,"data-testid":"product-list-table",mobileLayout:"stacked"}),z=r?Q("form",{}):Q("div",{}),G=r?{onSubmit:B,...T}:T,I=t(U,{type:"submit",disabled:i||!r||!S,"data-testid":"product-list-table-submit-button",children:u.updateButton});return s(k,{node:z,className:b(["quote-management-product-list-table-container",g]),"data-testid":"product-list-table-container",...G,children:[D,t("div",{className:"quote-management-product-list-table-container__submit-container",children:I})]})},be=({className:g,entries:c,...r})=>{const i=n=>{var p;const m=(p=n.children)==null?void 0:p.map(i);return t("div",{className:"quote-management-quote-prices-summary__entry","data-testid":`quote-prices-summary-entry-${n.id}`,children:m?t(Y,{className:"quote-management-quote-prices-summary__accordion","data-testid":`quote-prices-summary-entry-accordion-${n.id}`,children:t(C,{className:"quote-management-quote-prices-summary__accordion-section",title:n.label,ariaLabelTitle:n.label,secondaryText:n.value,children:m})}):s(V,{children:[t("span",{className:b(["quote-management-quote-prices-summary__label",["quote-management-quote-prices-summary__label--strong",n.strong]]),"data-testid":`quote-prices-summary-entry-label-${n.id}`,children:n.label}),t("span",{className:"quote-management-quote-prices-summary__value","data-testid":`quote-prices-summary-entry-value-${n.id}`,children:n.value})]})},n.id)};return t("div",{className:b(["quote-management-quote-prices-summary",g]),"data-testid":"quote-prices-summary",...r,children:c==null?void 0:c.map(i)})};export{me as I,pe as P,be as Q};
4
4
  //# sourceMappingURL=QuotePricesSummary.js.map