@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.
- package/api/duplicateNegotiableQuote/duplicateNegotiableQuote.d.ts +8 -0
- package/api/duplicateNegotiableQuote/graphql/duplicateNegotiableQuoteMutation.d.ts +10 -0
- package/api/duplicateNegotiableQuote/index.d.ts +10 -0
- package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +1 -1
- package/api/index.d.ts +2 -0
- package/api/setLineItemNote/graphql/SetLineItemNoteMutation.d.ts +10 -0
- package/api/setLineItemNote/index.d.ts +10 -0
- package/api/setLineItemNote/setLineItemNote.d.ts +10 -0
- package/api.js +11 -239
- package/api.js.map +1 -1
- package/chunks/ConfirmationModal.js +4 -0
- package/chunks/ConfirmationModal.js.map +1 -0
- package/chunks/ItemsQuoted.js +1 -1
- package/chunks/ItemsQuoted.js.map +1 -1
- package/chunks/ItemsQuotedTemplate.js +1 -1
- package/chunks/ItemsQuotedTemplate.js.map +1 -1
- package/chunks/NegotiableQuoteTemplateFragment.js +190 -0
- package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -0
- package/chunks/OrderSummaryLine.js +1 -1
- package/chunks/OrderSummaryLine.js.map +1 -1
- package/chunks/QuotePricesSummary.js +1 -1
- package/chunks/QuotePricesSummary.js.map +1 -1
- package/chunks/TabbedContent.js +1 -1
- package/chunks/TabbedContent.js.map +1 -1
- package/chunks/dateUtils.js +1 -1
- package/chunks/dateUtils.js.map +1 -1
- package/chunks/duplicateNegotiableQuote.js +121 -0
- package/chunks/duplicateNegotiableQuote.js.map +1 -0
- package/chunks/generateQuoteFromTemplate.js +12 -0
- package/chunks/generateQuoteFromTemplate.js.map +1 -0
- package/chunks/getQuoteTemplates.js +2 -2
- package/chunks/getQuoteTemplates.js.map +1 -1
- package/chunks/openQuoteTemplate.js +31 -0
- package/chunks/openQuoteTemplate.js.map +1 -0
- package/chunks/setLineItemNote.js +47 -0
- package/chunks/setLineItemNote.js.map +1 -0
- package/chunks/state.js +1 -1
- package/chunks/state.js.map +1 -1
- package/chunks/transform-quote-template.js +4 -0
- package/chunks/transform-quote-template.js.map +1 -0
- package/chunks/transform-quote.js +1 -1
- package/chunks/transform-quote.js.map +1 -1
- package/components/LineItemNoteModal/LineItemNoteModal.d.ts +16 -0
- package/components/LineItemNoteModal/index.d.ts +11 -0
- package/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +0 -2
- package/components/ProductListTable/ProductListTable.d.ts +8 -0
- package/components/index.d.ts +1 -0
- package/containers/ItemsQuoted/ItemsQuoted.d.ts +1 -1
- package/containers/ItemsQuoted.js +1 -1
- package/containers/ItemsQuotedTemplate.js +1 -1
- package/containers/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +4 -0
- package/containers/ManageNegotiableQuote.js +1 -1
- package/containers/ManageNegotiableQuote.js.map +1 -1
- package/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +13 -0
- package/containers/ManageNegotiableQuoteTemplate.js +1 -1
- package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
- package/containers/OrderSummary.js +1 -1
- package/containers/OrderSummary.js.map +1 -1
- package/containers/OrderSummaryLine.js +1 -1
- package/containers/QuoteSummaryList.js +1 -1
- package/containers/QuoteSummaryList.js.map +1 -1
- package/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.d.ts +2 -0
- package/containers/QuoteTemplatesListTable.js +1 -1
- package/containers/QuoteTemplatesListTable.js.map +1 -1
- package/containers/QuotesListTable.js +1 -1
- package/containers/QuotesListTable.js.map +1 -1
- package/containers/RequestNegotiableQuoteForm.js +1 -1
- package/containers/RequestNegotiableQuoteForm.js.map +1 -1
- package/data/models/negotiable-quote-template-model.d.ts +18 -8
- package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +6 -0
- package/i18n/en_US.json.d.ts +72 -0
- package/package.json +1 -1
- package/render.js +3 -3
- package/render.js.map +1 -1
- package/types/state.types.d.ts +3 -0
- package/chunks/removeNegotiableQuoteItems.js +0 -38
- package/chunks/removeNegotiableQuoteItems.js.map +0 -1
- package/chunks/renameNegotiableQuote.js +0 -104
- 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
|
|
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":"
|
|
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
|
|
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":"
|
|
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
|
|
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
|