@dropins/storefront-quote-management 1.0.0-beta4 → 1.0.0-beta5
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/getQuoteTemplates/graphql/getQuoteTemplates.d.ts +1 -1
- package/api/getStoreConfig/graphql/StoreConfigQuery.d.ts +1 -1
- package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +1 -1
- package/api.js +5 -3
- package/api.js.map +1 -1
- package/chunks/AttachedFilesList.js +1 -1
- package/chunks/AttachedFilesList.js.map +1 -1
- package/chunks/CheckWithCircle.js +4 -0
- package/chunks/CheckWithCircle.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/LineItemNoteModal.js +1 -1
- package/chunks/LineItemNoteModal.js.map +1 -1
- package/chunks/NegotiableQuoteTemplateFragment.js +4 -4
- package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -1
- package/chunks/ShippingAddressDisplay.js +1 -1
- package/chunks/ShippingAddressDisplay.js.map +1 -1
- package/chunks/WarningFilled.js +1 -1
- package/chunks/WarningFilled.js.map +1 -1
- package/chunks/addQuoteTemplateLineItemNote.js +1 -1
- package/chunks/addQuoteTemplateLineItemNote.js.map +1 -1
- package/chunks/getQuoteTemplates.js +13 -11
- package/chunks/getQuoteTemplates.js.map +1 -1
- package/chunks/state.js +1 -1
- package/chunks/state.js.map +1 -1
- package/chunks/transform-quote-template.js +1 -1
- package/chunks/transform-quote-template.js.map +1 -1
- package/components/ProductListTable/ProductListTable.d.ts +5 -49
- package/containers/ItemsQuoted.js +1 -1
- package/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.d.ts +3 -3
- package/containers/ItemsQuotedTemplate.js +1 -1
- package/containers/ManageNegotiableQuote.js +1 -1
- package/containers/ManageNegotiableQuote.js.map +1 -1
- package/containers/ManageNegotiableQuoteTemplate.js +2 -2
- package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
- package/containers/RequestNegotiableQuoteForm.js +1 -1
- package/containers/RequestNegotiableQuoteForm.js.map +1 -1
- package/containers/ShippingAddressDisplay.js +1 -1
- package/data/models/store-config-model.d.ts +2 -0
- package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +1 -0
- package/data/transforms/__fixtures__/storeConfigData.d.ts +4 -0
- package/hooks/useItemsQuotedTemplate.d.ts +1 -2
- package/hooks/useUpdateTemplateQuantities.d.ts +2 -2
- package/i18n/en_US.json.d.ts +8 -3
- package/package.json +1 -1
- package/render.js +2 -2
- package/render.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemsQuoted.js","sources":["/@dropins/storefront-quote-management/src/containers/ItemsQuoted/ItemsQuoted.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Price, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n NegotiableQuoteModel,\n CartItemModel,\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: CartItemModel,\n isSelected: boolean\n ) => void;\n onItemDropdownChange?: (\n item: CartItemModel,\n action: string\n ) => void;\n onUpdate?: (e: SubmitEvent) => void;\n onRemoveItemsRef?: (\n handler: (items: CartItemModel[]) => 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: CartItemModel,\n isSelected: boolean\n ) => void;\n onItemDropdownChange?: (\n item: CartItemModel,\n action: string\n ) => void;\n onQuantityChange?: (\n item: CartItemModel,\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<CartItemModel | 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<CartItemModel[]>(\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: CartItemModel[]) => {\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 CartItemModel;\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 CartItemModel).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 CartItemModel\n const handleItemCheckboxChange = onItemCheckboxChange\n ? (item: ProductListTableItem, isSelected: boolean) => {\n onItemCheckboxChange(item as CartItemModel, isSelected);\n }\n : undefined;\n\n // Create remove confirmation banner based on notification state\n const removeConfirmationBanner =\n removeNotificationState.type === 'success' ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.removeSuccessHeading}\n description={removeNotificationState.message}\n onDismiss={handleDismissRemoveBanner}\n data-testid=\"remove-items-success-banner\"\n />\n ) : removeNotificationState.type === 'error' ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.removeErrorHeading}\n description={removeNotificationState.message}\n onDismiss={handleDismissRemoveBanner}\n data-testid=\"remove-items-error-banner\"\n />\n ) : null;\n\n // Create modal error banner\n const modalErrorBanner = modalErrorMessage ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.errorHeading}\n description={modalErrorMessage}\n onDismiss={() => setModalErrorMessage('')}\n data-testid=\"line-item-note-error-banner\"\n />\n ) : null;\n\n return (\n <>\n <ItemsQuotedComponent\n data-testid=\"items-quoted-container\"\n {...props}\n loading={false}\n table={\n <Slot\n name=\"ProductListTable\"\n slot={slots?.ProductListTable}\n context={{\n items: quoteData.items,\n canEdit,\n readOnly: quoteData.readOnly,\n onItemCheckboxChange,\n onItemDropdownChange: handleItemDropdownChange,\n onQuantityChange: handleQuantityChange,\n onUpdate: handleUpdate,\n dropdownSelections,\n }}\n >\n <ProductListTable\n items={quoteData.items}\n canEdit={canEdit}\n onItemCheckboxChange={handleItemCheckboxChange}\n readOnly={quoteData.readOnly}\n onItemDropdownChange={handleItemDropdownChange}\n onQuantityChange={handleQuantityChange}\n onUpdate={handleUpdate}\n dropdownSelections={dropdownSelections}\n />\n </Slot>\n }\n pricesSummary={\n <Slot\n name=\"QuotePricesSummary\"\n slot={slots?.QuotePricesSummary}\n context={{\n items: quoteData.items,\n prices: quoteData.prices,\n }}\n >\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n\n {/* Update Quantities Modal */}\n <ConfirmationModal\n open={isUpdateQuantitiesModalOpen}\n title={dictionary.modalTitle}\n message={dictionary.modalDescription}\n cancelLabel={dictionary.modalCancelButton}\n confirmLabel={dictionary.modalUpdateButton}\n onCancel={handleCancelUpdate}\n onConfirm={handleConfirmUpdate}\n confirmationBanner={confirmationBanner}\n data-testid=\"update-quantities-modal\"\n />\n\n {/* Remove Items Modal */}\n <ConfirmationModal\n open={isRemoveModalOpen}\n title={dictionary.removeModalTitle}\n message={dictionary.removeModalDescription}\n cancelLabel={dictionary.removeModalCancelButton}\n confirmLabel={\n isRemoving\n ? dictionary.removeModalConfirmButtonRemoving\n : dictionary.removeModalConfirmButton\n }\n onCancel={handleCancelRemove}\n onConfirm={handleConfirmRemove}\n confirmationBanner={removeConfirmationBanner}\n data-testid=\"remove-items-modal\"\n />\n {/* Line Item Note Modal */}\n {selectedItem && (\n <LineItemNoteModal\n open={isLineItemNoteModalOpen}\n item={selectedItem}\n onClose={handleModalClose}\n onConfirm={handleModalConfirm}\n isSubmitting={isSubmitting}\n errorBanner={modalErrorBanner || undefined}\n />\n )}\n </>\n );\n};\n"],"names":["NOTIFICATION_AUTO_DISMISS_DELAY","ItemsQuoted","initialData","onItemCheckboxChange","onItemDropdownChange","onRemoveItemsRef","onRemoveModalStateChange","slots","props","quoteData","setQuoteData","useState","quantityChanges","setQuantityChanges","selectedItem","setSelectedItem","isUpdateQuantitiesModalOpen","setIsUpdateQuantitiesModalOpen","isLineItemNoteModalOpen","setIsLineItemNoteModalOpen","modalErrorMessage","setModalErrorMessage","notificationState","setNotificationState","isRemoveModalOpen","setIsRemoveModalOpen","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","dropdownSelections","setDropdownSelections","isSubmitting","setIsSubmitting","dictionary","useText","useEffect","quoteDataEvent","events","data","quantitiesUpdatedEvent","itemsRemovedEvent","handleRemoveItems","useCallback","items","handleDismissRemoveBanner","handleItemDropdownChange","item","action","cartItem","prev","next","handleConfirmRemove","uidsToRemove","removeNegotiableQuoteItems","err","errorMessage","failedItem","handleCancelRemove","cancelledItem","handleModalClose","handleModalConfirm","note","quantity","updateQuantities","setLineItemNote","error","jsx","ItemsQuotedComponent","canEdit","handleQuantityChange","newQuantity","handleUpdate","e","handleConfirmUpdate","quoteItemUid","handleCancelUpdate","handleDismissBanner","quotePricesSummaryEntries","Price","confirmationBanner","InLineAlert","CheckWithCircle","WarningFilled","handleItemCheckboxChange","isSelected","removeConfirmationBanner","modalErrorBanner","jsxs","Fragment","Slot","ProductListTable","QuotePricesSummary","ConfirmationModal","LineItemNoteModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ItemsQuoted.js","sources":["/@dropins/storefront-quote-management/src/containers/ItemsQuoted/ItemsQuoted.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Price, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n NegotiableQuoteModel,\n CartItemModel,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport {\n ProductListTable,\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: CartItemModel,\n isSelected: boolean\n ) => void;\n onItemDropdownChange?: (\n item: CartItemModel,\n action: string\n ) => void;\n onUpdate?: (e: SubmitEvent) => void;\n onRemoveItemsRef?: (\n handler: (items: CartItemModel[]) => 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: CartItemModel,\n isSelected: boolean\n ) => void;\n onItemDropdownChange?: (\n item: CartItemModel,\n action: string\n ) => void;\n onQuantityChange?: (\n item: CartItemModel,\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<CartItemModel | 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<CartItemModel[]>(\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: CartItemModel[]) => {\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: CartItemModel,\n action: string\n ) => {\n const cartItem = item;\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: CartItemModel,\n newQuantity: number\n ) => {\n setQuantityChanges((prev) => ({\n ...prev,\n [item.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 for checkbox change handler\n const handleItemCheckboxChange = onItemCheckboxChange\n ? (item: CartItemModel, isSelected: boolean) => {\n onItemCheckboxChange(item, isSelected);\n }\n : undefined;\n\n // Create remove confirmation banner based on notification state\n const removeConfirmationBanner =\n removeNotificationState.type === 'success' ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.removeSuccessHeading}\n description={removeNotificationState.message}\n onDismiss={handleDismissRemoveBanner}\n data-testid=\"remove-items-success-banner\"\n />\n ) : removeNotificationState.type === 'error' ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.removeErrorHeading}\n description={removeNotificationState.message}\n onDismiss={handleDismissRemoveBanner}\n data-testid=\"remove-items-error-banner\"\n />\n ) : null;\n\n // Create modal error banner\n const modalErrorBanner = modalErrorMessage ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.errorHeading}\n description={modalErrorMessage}\n onDismiss={() => setModalErrorMessage('')}\n data-testid=\"line-item-note-error-banner\"\n />\n ) : null;\n\n return (\n <>\n <ItemsQuotedComponent\n data-testid=\"items-quoted-container\"\n {...props}\n loading={false}\n table={\n <Slot\n name=\"ProductListTable\"\n slot={slots?.ProductListTable}\n context={{\n items: quoteData.items,\n canEdit,\n readOnly: quoteData.readOnly,\n onItemCheckboxChange,\n onItemDropdownChange: handleItemDropdownChange,\n onQuantityChange: handleQuantityChange,\n onUpdate: handleUpdate,\n dropdownSelections,\n }}\n >\n <ProductListTable\n items={quoteData.items}\n canEdit={canEdit}\n onItemCheckboxChange={handleItemCheckboxChange}\n readOnly={quoteData.readOnly}\n onItemDropdownChange={handleItemDropdownChange}\n onQuantityChange={handleQuantityChange}\n onUpdate={handleUpdate}\n dropdownSelections={dropdownSelections}\n />\n </Slot>\n }\n pricesSummary={\n <Slot\n name=\"QuotePricesSummary\"\n slot={slots?.QuotePricesSummary}\n context={{\n items: quoteData.items,\n prices: quoteData.prices,\n }}\n >\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n\n {/* Update Quantities Modal */}\n <ConfirmationModal\n open={isUpdateQuantitiesModalOpen}\n title={dictionary.modalTitle}\n message={dictionary.modalDescription}\n cancelLabel={dictionary.modalCancelButton}\n confirmLabel={dictionary.modalUpdateButton}\n onCancel={handleCancelUpdate}\n onConfirm={handleConfirmUpdate}\n confirmationBanner={confirmationBanner}\n data-testid=\"update-quantities-modal\"\n />\n\n {/* Remove Items Modal */}\n <ConfirmationModal\n open={isRemoveModalOpen}\n title={dictionary.removeModalTitle}\n message={dictionary.removeModalDescription}\n cancelLabel={dictionary.removeModalCancelButton}\n confirmLabel={\n isRemoving\n ? dictionary.removeModalConfirmButtonRemoving\n : dictionary.removeModalConfirmButton\n }\n onCancel={handleCancelRemove}\n onConfirm={handleConfirmRemove}\n confirmationBanner={removeConfirmationBanner}\n data-testid=\"remove-items-modal\"\n />\n {/* Line Item Note Modal */}\n {selectedItem && (\n <LineItemNoteModal\n open={isLineItemNoteModalOpen}\n item={selectedItem}\n onClose={handleModalClose}\n onConfirm={handleModalConfirm}\n isSubmitting={isSubmitting}\n errorBanner={modalErrorBanner || undefined}\n />\n )}\n </>\n );\n};\n"],"names":["NOTIFICATION_AUTO_DISMISS_DELAY","ItemsQuoted","initialData","onItemCheckboxChange","onItemDropdownChange","onRemoveItemsRef","onRemoveModalStateChange","slots","props","quoteData","setQuoteData","useState","quantityChanges","setQuantityChanges","selectedItem","setSelectedItem","isUpdateQuantitiesModalOpen","setIsUpdateQuantitiesModalOpen","isLineItemNoteModalOpen","setIsLineItemNoteModalOpen","modalErrorMessage","setModalErrorMessage","notificationState","setNotificationState","isRemoveModalOpen","setIsRemoveModalOpen","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","dropdownSelections","setDropdownSelections","isSubmitting","setIsSubmitting","dictionary","useText","useEffect","quoteDataEvent","events","data","quantitiesUpdatedEvent","itemsRemovedEvent","handleRemoveItems","useCallback","items","handleDismissRemoveBanner","handleItemDropdownChange","item","action","cartItem","prev","next","handleConfirmRemove","uidsToRemove","removeNegotiableQuoteItems","err","errorMessage","failedItem","handleCancelRemove","cancelledItem","handleModalClose","handleModalConfirm","note","quantity","updateQuantities","setLineItemNote","error","jsx","ItemsQuotedComponent","canEdit","handleQuantityChange","newQuantity","handleUpdate","e","handleConfirmUpdate","quoteItemUid","handleCancelUpdate","handleDismissBanner","quotePricesSummaryEntries","Price","confirmationBanner","InLineAlert","CheckWithCircle","WarningFilled","handleItemCheckboxChange","isSelected","removeConfirmationBanner","modalErrorBanner","jsxs","Fragment","Slot","ProductListTable","QuotePricesSummary","ConfirmationModal","LineItemNoteModal"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as o,jsxs as ne,Fragment as se}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as O,useCallback as p}from"@dropins/tools/preact-compat.js";import{Slot as W}from"@dropins/tools/lib.js";import{events as H}from"@dropins/tools/event-bus.js";import{InLineAlert as B,Price as Y}from"@dropins/tools/components.js";/* empty css */import{I as $,Q as re,P as ie,L as le}from"./LineItemNoteModal.js";import{C as me}from"./ConfirmationModal.js";/* empty css *//* empty css */import"./state.js";import{r as de,u as ue,a as ce}from"./addQuoteTemplateLineItemNote.js";import{S as z
|
|
3
|
+
import{jsx as o,jsxs as ne,Fragment as se}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as O,useCallback as p}from"@dropins/tools/preact-compat.js";import{Slot as W}from"@dropins/tools/lib.js";import{events as H}from"@dropins/tools/event-bus.js";import{InLineAlert as B,Price as Y}from"@dropins/tools/components.js";/* empty css */import{I as $,Q as re,P as ie,L as le}from"./LineItemNoteModal.js";import{C as me}from"./ConfirmationModal.js";/* empty css *//* empty css */import"./state.js";import{r as de,u as ue,a as ce}from"./addQuoteTemplateLineItemNote.js";import{S as z}from"./CheckWithCircle.js";import{S as U}from"./WarningFilled.js";import{useText as pe}from"@dropins/tools/i18n.js";const ge=3e3,Me=b=>{const{templateId:r,onRemoveModalStateChange:a,removeSuccessMessage:e,removeErrorMessage:T}=b,[i,g]=l(!1),[M,s]=l([]),[u,m]=l(!1),[S,n]=l({type:null,message:""});O(()=>{const d=H.on("quote-management/quote-template-data",()=>{s([]),m(!1),n({type:"success",message:e}),setTimeout(()=>{g(!1),n({type:null,message:""}),a==null||a(!1)},ge)});return()=>d==null?void 0:d.off()},[e,a]);const N=p(d=>{!d||d.length===0||(s(d),n({type:null,message:""}),g(!0))},[]),Q=p(async()=>{if(!r||M.length===0)return;const d=M.map(I=>I.uid).filter(Boolean);if(d.length!==0){m(!0),n({type:null,message:""});try{await de({templateId:r,itemUids:d})}catch(I){const c=I instanceof Error?I.message:T;n({type:"error",message:c}),m(!1)}}},[r,M,T]),t=p(()=>{g(!1),n({type:null,message:""}),a==null||a(!1),s([])},[a]);return{handleRemoveItems:N,handleConfirmRemove:Q,handleCancelRemove:t,isRemoveModalOpen:i,itemsToRemove:M,isRemoving:u,removeNotificationState:S}},fe=b=>{const{handleRemoveItems:r}=b,[a,e]=l({}),T=p(()=>{},[]),i=p((g,M)=>{const s=g;if(M==="remove"){e(u=>({...u,[s.uid||""]:M})),r([s]),e(u=>({...u,[s.uid||""]:""}));return}e(u=>{if(!s.uid||!(s.uid in u))return u;const m={...u};return delete m[s.uid],m})},[r]);return{dropdownSelections:a,handleItemDropdownChange:i,handleDismissRemoveBanner:T}},ve=3e3,Te=b=>{const{templateId:r,onUpdateModalStateChange:a,updateSuccessMessage:e,updateErrorMessage:T}=b,[i,g]=l({}),[M,s]=l(!1),[u,m]=l(!1),[S,n]=l({type:null,message:""});O(()=>{const c=H.on("quote-management/quote-template-data",()=>{g({}),m(!1),n({type:"success",message:e}),setTimeout(()=>{s(!1),n({type:null,message:""}),a==null||a(!1)},ve)});return()=>c==null?void 0:c.off()},[e,a]);const N=p((c,y)=>{const h=c;if(!h.uid)return;const C=h.uid;g(R=>({...R,[C]:y}))},[]),Q=p(c=>{c.preventDefault(),n({type:null,message:""}),s(!0)},[]),t=p(async()=>{if(!r||Object.keys(i).length===0){s(!1);return}m(!0),n({type:null,message:""});const c=Object.entries(i).map(([y,h])=>({itemId:y,quantity:h}));try{await ue({templateId:r,items:c})}catch(y){const h=y instanceof Error?y.message:T;n({type:"error",message:h}),m(!1)}},[r,i,T]),d=p(()=>{s(!1),n({type:null,message:""}),a==null||a(!1),g({})},[a]),I=p(()=>{n({type:null,message:""})},[]);return{quantityChanges:i,handleQuantityChange:N,handleUpdate:Q,handleConfirmUpdate:t,handleCancelUpdate:d,handleDismissBanner:I,isUpdateModalOpen:M,isUpdating:u,updateNotificationState:S}},Oe=({templateData:b,slots:r,...a})=>{const[e,T]=l(b),[i,g]=l(null),[M,s]=l(!1),[u,m]=l(!1),[S,n]=l(""),[N,Q]=l({}),t=pe({subtotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax",grandTotal:"NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax",appliedTaxes:"NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes",removeModalTitle:"NegotiableQuoteTemplate.Manage.removeItemsModal.title",removeModalDescription:"NegotiableQuoteTemplate.Manage.removeItemsModal.description",removeModalCancelButton:"NegotiableQuoteTemplate.Manage.removeItemsModal.cancelButton",removeModalConfirmButton:"NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButton",removeModalConfirmButtonRemoving:"NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButtonRemoving",removeSuccessHeading:"NegotiableQuoteTemplate.Manage.removeItemsModal.successHeading",removeSuccessMessage:"NegotiableQuoteTemplate.Manage.removeItemsModal.successMessage",removeErrorHeading:"NegotiableQuoteTemplate.Manage.removeItemsModal.errorHeading",removeErrorMessage:"NegotiableQuoteTemplate.Manage.removeItemsModal.errorMessage",updateModalTitle:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.title",updateModalDescription:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.description",updateModalCancelButton:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.cancelButton",updateModalUpdateButton:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.updateButton",updateSuccessHeading:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successHeading",updateSuccessMessage:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successMessage",updateErrorHeading:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorHeading",updateErrorMessage:"NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorMessage",errorHeading:"NegotiableQuoteTemplate.Manage.lineItemNoteModal.errorHeading"}),{handleRemoveItems:d,handleConfirmRemove:I,handleCancelRemove:c,isRemoveModalOpen:y,isRemoving:h,removeNotificationState:C}=Me({templateId:e==null?void 0:e.id,removeSuccessMessage:t.removeSuccessMessage,removeErrorMessage:t.removeErrorMessage}),{dropdownSelections:R,handleItemDropdownChange:P,handleDismissRemoveBanner:q}=fe({handleRemoveItems:d}),{handleQuantityChange:L,handleUpdate:A,handleConfirmUpdate:G,handleCancelUpdate:J,handleDismissBanner:F,isUpdateModalOpen:K,updateNotificationState:E}=Te({templateId:e==null?void 0:e.id,updateSuccessMessage:t.updateSuccessMessage,updateErrorMessage:t.updateErrorMessage});O(()=>{const v=H.on("quote-management/quote-template-data",f=>{T(f.quoteTemplate),Q({})},{eager:!0});return()=>v==null?void 0:v.off()},[]);const _=p((v,f)=>{const D=v;if(f==="edit"){g(D),s(!0),Q(oe=>({...oe,[D.uid]:""}));return}P(v,f)},[P]),k={...R,...N},w=p(()=>{i&&Q(v=>{const f={...v};return delete f[i.uid],f}),s(!1),g(null),m(!1),n("")},[i]),V=p(async v=>{if(!(!i||!e)){m(!0),n("");try{await ce({templateId:e.id,itemId:i.uid,note:v}),w()}catch(f){console.error("Failed to set template line item note:",f);const D=f instanceof Error?f.message:"Unable to update the item. Please try again.";n(D),m(!1)}}},[i,e,w]),X=C.type==="success"?o(B,{type:"success",variant:"primary",icon:o(z,{}),heading:t.removeSuccessHeading,description:C.message,onDismiss:q,"data-testid":"remove-items-success-banner"}):C.type==="error"?o(B,{type:"error",variant:"primary",icon:o(U,{}),heading:t.removeErrorHeading,description:C.message,onDismiss:q,"data-testid":"remove-items-error-banner"}):null,Z=E.type==="success"?o(B,{type:"success",variant:"primary",icon:o(z,{}),heading:t.updateSuccessHeading,description:E.message,onDismiss:F,"data-testid":"update-quantities-success-banner"}):E.type==="error"?o(B,{type:"error",variant:"primary",icon:o(U,{}),heading:t.updateErrorHeading,description:E.message,onDismiss:F,"data-testid":"update-quantities-error-banner"}):null;if(!e)return o($,{loading:!0});const ee=y?{open:!0,title:t.removeModalTitle,message:t.removeModalDescription,cancelLabel:t.removeModalCancelButton,confirmLabel:h?t.removeModalConfirmButtonRemoving:t.removeModalConfirmButton,onCancel:c,onConfirm:I,confirmationBanner:X}:null,te=K?{open:!0,title:t.updateModalTitle,message:t.updateModalDescription,cancelLabel:t.updateModalCancelButton,confirmLabel:t.updateModalUpdateButton,onCancel:J,onConfirm:G,confirmationBanner:Z}:null,j=ee||te,x=[];e.prices.subtotalExcludingTax&&x.push({label:t.subtotal,id:"subtotal",value:o(Y,{amount:e.prices.subtotalExcludingTax.value,currency:e.prices.subtotalExcludingTax.currency,weight:"normal"})}),e.prices.grandTotal&&x.push({label:t.grandTotal,id:"total",value:o(Y,{amount:e.prices.grandTotal.value,currency:e.prices.grandTotal.currency}),strong:!0});const ae=S?o(B,{type:"error",variant:"primary",icon:o(U,{}),heading:t.errorHeading,description:S,onDismiss:()=>n(""),"data-testid":"line-item-note-error-banner"}):null;return ne(se,{children:[o($,{"data-testid":"items-quoted-template-container",...a,loading:!1,table:o(W,{name:"ProductListTable",slot:r==null?void 0:r.ProductListTable,context:{items:e.items,canEdit:e.canSendForReview,dropdownSelections:k,handleItemDropdownChange:_,handleQuantityChange:L,handleUpdate:A},children:o(ie,{items:e.items,canEdit:e.canSendForReview,showActions:e.canEditTemplateItems,onItemDropdownChange:_,onQuantityChange:L,onUpdate:A,dropdownSelections:k})}),pricesSummary:o(W,{name:"QuotePricesSummary",slot:r==null?void 0:r.QuotePricesSummary,context:{items:e.items,prices:e.prices},children:o(re,{entries:x})})}),j&&o(me,{...j}),i&&o(le,{open:M,item:i,onClose:w,onConfirm:V,isSubmitting:u,readOnlyQuantity:!0,errorBanner:ae||void 0})]})};export{Oe as I};
|
|
4
4
|
//# sourceMappingURL=ItemsQuotedTemplate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemsQuotedTemplate.js","sources":["/@dropins/storefront-quote-management/src/hooks/useRemoveTemplateItems.ts","/@dropins/storefront-quote-management/src/hooks/useItemsQuotedTemplate.ts","/@dropins/storefront-quote-management/src/hooks/useUpdateTemplateQuantities.ts","/@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 { useState, useEffect, useCallback } from 'preact/compat';\nimport { events } from '@adobe-commerce/event-bus';\nimport { removeQuoteTemplateItems } from '@/quote-management/api/removeQuoteTemplateItems';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\n\nconst NOTIFICATION_AUTO_DISMISS_DELAY = 3000;\n\nexport interface UseRemoveTemplateItemsReturn {\n handleRemoveItems: (items: CartItemModel[]) => void;\n handleConfirmRemove: () => Promise<void>;\n handleCancelRemove: () => void;\n isRemoveModalOpen: boolean;\n itemsToRemove: CartItemModel[];\n isRemoving: boolean;\n removeNotificationState: {\n type: 'success' | 'error' | null;\n message: string;\n };\n}\n\nexport interface UseRemoveTemplateItemsParams {\n templateId?: string;\n onRemoveModalStateChange?: (isOpen: boolean) => void;\n removeSuccessMessage: string;\n removeErrorMessage: string;\n}\n\n/**\n * Custom hook to manage removing items from a quote template\n */\nexport const useRemoveTemplateItems = (\n params: UseRemoveTemplateItemsParams\n): UseRemoveTemplateItemsReturn => {\n const {\n templateId,\n onRemoveModalStateChange,\n removeSuccessMessage,\n removeErrorMessage,\n } = params;\n\n const [isRemoveModalOpen, setIsRemoveModalOpen] = useState(false);\n const [itemsToRemove, setItemsToRemove] = useState<CartItemModel[]>([]);\n const [isRemoving, setIsRemoving] = useState(false);\n const [removeNotificationState, setRemoveNotificationState] = useState<{\n type: 'success' | 'error' | null;\n message: string;\n }>({ type: null, message: '' });\n\n // Listen for quote template data event (successful removal)\n useEffect(() => {\n const templateDataEvent = events.on(\n 'quote-management/quote-template-data',\n () => {\n setItemsToRemove([]);\n setIsRemoving(false);\n setRemoveNotificationState({\n type: 'success',\n message: removeSuccessMessage,\n });\n // Auto-close success notification after delay\n setTimeout(() => {\n setIsRemoveModalOpen(false);\n setRemoveNotificationState({ type: null, message: '' });\n onRemoveModalStateChange?.(false);\n }, NOTIFICATION_AUTO_DISMISS_DELAY);\n }\n );\n return () => templateDataEvent?.off();\n }, [removeSuccessMessage, onRemoveModalStateChange]);\n\n // Unified handler for removing items (single or multiple)\n const handleRemoveItems = useCallback((items: CartItemModel[]) => {\n if (!items || items.length === 0) {\n return;\n }\n setItemsToRemove(items);\n setRemoveNotificationState({ type: null, message: '' });\n setIsRemoveModalOpen(true);\n }, []);\n\n const handleConfirmRemove = useCallback(async () => {\n if (!templateId || itemsToRemove.length === 0) {\n return;\n }\n\n const uidsToRemove = itemsToRemove.map((item) => item.uid).filter(Boolean) as string[];\n\n if (uidsToRemove.length === 0) {\n return;\n }\n\n setIsRemoving(true);\n setRemoveNotificationState({ type: null, message: '' });\n\n try {\n await removeQuoteTemplateItems({\n templateId,\n itemUids: uidsToRemove,\n });\n // Success is handled by the event listener\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : removeErrorMessage;\n setRemoveNotificationState({\n type: 'error',\n message: errorMessage,\n });\n setIsRemoving(false);\n }\n }, [templateId, itemsToRemove, removeErrorMessage]);\n\n const handleCancelRemove = useCallback(() => {\n setIsRemoveModalOpen(false);\n setRemoveNotificationState({ type: null, message: '' });\n onRemoveModalStateChange?.(false);\n setItemsToRemove([]);\n }, [onRemoveModalStateChange]);\n\n return {\n handleRemoveItems,\n handleConfirmRemove,\n handleCancelRemove,\n isRemoveModalOpen,\n itemsToRemove,\n isRemoving,\n removeNotificationState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useCallback } from 'preact/compat';\nimport { ProductListTableItem } from '@/quote-management/components';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\n\nexport interface UseItemsQuotedTemplateReturn {\n dropdownSelections: Record<string, string | undefined>;\n handleItemDropdownChange: (item: ProductListTableItem, action: string) => void;\n handleDismissRemoveBanner: () => void;\n}\n\nexport interface UseItemsQuotedTemplateParams {\n handleRemoveItems: (items: CartItemModel[]) => void;\n}\n\n/**\n * Custom hook to manage dropdown selections and item actions for quote template items\n */\nexport const useItemsQuotedTemplate = (\n params: UseItemsQuotedTemplateParams\n): UseItemsQuotedTemplateReturn => {\n const { handleRemoveItems } = params;\n\n const [dropdownSelections, setDropdownSelections] = useState<\n Record<string, string | undefined>\n >({});\n\n const handleDismissRemoveBanner = useCallback(() => {\n // The hook manages its own notification state, but we can add custom dismiss logic if needed\n }, []);\n\n const handleItemDropdownChange = useCallback(\n (item: ProductListTableItem, action: string) => {\n const cartItem = item as CartItemModel;\n\n // Handle remove action\n if (action === 'remove') {\n setDropdownSelections((prev) => ({\n ...prev,\n [cartItem.uid || '']: action,\n }));\n handleRemoveItems([cartItem]);\n // Reset dropdown immediately\n setDropdownSelections((prev) => ({ ...prev, [cartItem.uid || '']: '' }));\n return;\n }\n\n // Clear dropdown selection for other actions\n setDropdownSelections((prev) => {\n if (!cartItem.uid || !(cartItem.uid in prev)) {\n return prev;\n }\n const next = { ...prev };\n delete next[cartItem.uid];\n return next;\n });\n },\n [handleRemoveItems]\n );\n\n return {\n dropdownSelections,\n handleItemDropdownChange,\n handleDismissRemoveBanner,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useEffect, useCallback } from 'preact/compat';\nimport { events } from '@adobe-commerce/event-bus';\nimport { updateQuoteTemplateItemQuantities } from '@/quote-management/api/updateQuoteTemplateItemQuantities';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { ProductListTableItem } from '@/quote-management/components';\n\nconst NOTIFICATION_AUTO_DISMISS_DELAY = 3000;\n\nexport interface UseUpdateTemplateQuantitiesReturn {\n quantityChanges: Record<string, number>;\n handleQuantityChange: (item: ProductListTableItem, newQuantity: number) => void;\n handleUpdate: (e: SubmitEvent) => void;\n handleConfirmUpdate: () => Promise<void>;\n handleCancelUpdate: () => void;\n handleDismissBanner: () => void;\n isUpdateModalOpen: boolean;\n isUpdating: boolean;\n updateNotificationState: {\n type: 'success' | 'error' | null;\n message: string;\n };\n}\n\nexport interface UseUpdateTemplateQuantitiesParams {\n templateId?: string;\n onUpdateModalStateChange?: (isOpen: boolean) => void;\n updateSuccessMessage: string;\n updateErrorMessage: string;\n}\n\n/**\n * Custom hook to manage updating quantities of items in a quote template\n */\nexport const useUpdateTemplateQuantities = (\n params: UseUpdateTemplateQuantitiesParams\n): UseUpdateTemplateQuantitiesReturn => {\n const {\n templateId,\n onUpdateModalStateChange,\n updateSuccessMessage,\n updateErrorMessage,\n } = params;\n\n const [quantityChanges, setQuantityChanges] = useState<Record<string, number>>({});\n const [isUpdateModalOpen, setIsUpdateModalOpen] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [updateNotificationState, setUpdateNotificationState] = useState<{\n type: 'success' | 'error' | null;\n message: string;\n }>({ type: null, message: '' });\n\n // Listen for quote template data event (successful update)\n useEffect(() => {\n const templateDataEvent = events.on(\n 'quote-management/quote-template-data',\n () => {\n setQuantityChanges({});\n setIsUpdating(false);\n setUpdateNotificationState({\n type: 'success',\n message: updateSuccessMessage,\n });\n // Auto-close success notification after delay\n setTimeout(() => {\n setIsUpdateModalOpen(false);\n setUpdateNotificationState({ type: null, message: '' });\n onUpdateModalStateChange?.(false);\n }, NOTIFICATION_AUTO_DISMISS_DELAY);\n }\n );\n return () => templateDataEvent?.off();\n }, [updateSuccessMessage, onUpdateModalStateChange]);\n\n const handleQuantityChange = useCallback(\n (item: ProductListTableItem, newQuantity: number) => {\n const cartItem = item as CartItemModel;\n if (!cartItem.uid) {\n return;\n }\n const itemUid = cartItem.uid;\n setQuantityChanges((prev) => ({\n ...prev,\n [itemUid]: newQuantity,\n }));\n },\n []\n );\n\n const handleUpdate = useCallback((e: SubmitEvent) => {\n e.preventDefault();\n setUpdateNotificationState({ type: null, message: '' });\n setIsUpdateModalOpen(true);\n }, []);\n\n const handleConfirmUpdate = useCallback(async () => {\n if (!templateId || Object.keys(quantityChanges).length === 0) {\n setIsUpdateModalOpen(false);\n return;\n }\n\n setIsUpdating(true);\n setUpdateNotificationState({ type: null, message: '' });\n\n // Map quantity changes to API format\n const items = Object.entries(quantityChanges).map(([itemId, quantity]) => ({\n itemId,\n quantity,\n }));\n\n try {\n await updateQuoteTemplateItemQuantities({\n templateId,\n items,\n });\n // Success is handled by the event listener\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : updateErrorMessage;\n setUpdateNotificationState({\n type: 'error',\n message: errorMessage,\n });\n setIsUpdating(false);\n }\n }, [templateId, quantityChanges, updateErrorMessage]);\n\n const handleCancelUpdate = useCallback(() => {\n setIsUpdateModalOpen(false);\n setUpdateNotificationState({ type: null, message: '' });\n onUpdateModalStateChange?.(false);\n setQuantityChanges({});\n }, [onUpdateModalStateChange]);\n\n const handleDismissBanner = useCallback(() => {\n setUpdateNotificationState({ type: null, message: '' });\n }, []);\n\n return {\n quantityChanges,\n handleQuantityChange,\n handleUpdate,\n handleConfirmUpdate,\n handleCancelUpdate,\n handleDismissBanner,\n isUpdateModalOpen,\n isUpdating,\n updateNotificationState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n 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 { CheckWithCircle, WarningFilled } from '@adobe-commerce/elsie/icons';\nimport {\n NegotiableQuoteTemplateModel,\n} from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport {\n QuotePricesSummary,\n ProductListTable,\n ItemsQuoted as ItemsQuotedComponent,\n ProductListTableItem,\n ConfirmationModal,\n} from '@/quote-management/components';\nimport { LineItemNoteModal } from '@/quote-management/components/LineItemNoteModal';\nimport { addQuoteTemplateLineItemNote } from '@/quote-management/api';\nimport { useRemoveTemplateItems } from '@/quote-management/hooks/useRemoveTemplateItems';\nimport { useItemsQuotedTemplate } from '@/quote-management/hooks/useItemsQuotedTemplate';\nimport { useUpdateTemplateQuantities } from '@/quote-management/hooks/useUpdateTemplateQuantities';\n\nexport interface ItemsQuotedTemplateProps\n extends HTMLAttributes<HTMLDivElement> {\n templateData?: NegotiableQuoteTemplateModel;\n slots?: {\n ProductListTable?: SlotProps<{\n items: NegotiableQuoteTemplateModel['items'];\n canEdit: boolean;\n dropdownSelections: Record<string, string | undefined>;\n handleItemDropdownChange: (item: ProductListTableItem, action: string) => void;\n handleQuantityChange: (item: ProductListTableItem, newQuantity: number) => void;\n handleUpdate: (e: SubmitEvent) => void;\n onItemDropdownChange?: (item: any, action: string) => void;\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<\n NegotiableQuoteTemplateModel | undefined\n >(initialData);\n const [selectedItem, setSelectedItem] =\n useState<CartItemModel | null>(null);\n const [isLineItemNoteModalOpen, setIsLineItemNoteModalOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [modalErrorMessage, setModalErrorMessage] = useState('');\n const [dropdownSelections, setDropdownSelections] = useState<\n Record<string, string>\n >({});\n\n const dictionary = useText({\n subtotal:\n 'NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax',\n grandTotal:\n 'NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax',\n appliedTaxes:\n 'NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes',\n removeModalTitle: 'NegotiableQuoteTemplate.Manage.removeItemsModal.title',\n removeModalDescription: 'NegotiableQuoteTemplate.Manage.removeItemsModal.description',\n removeModalCancelButton: 'NegotiableQuoteTemplate.Manage.removeItemsModal.cancelButton',\n removeModalConfirmButton: 'NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButton',\n removeModalConfirmButtonRemoving: 'NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButtonRemoving',\n removeSuccessHeading: 'NegotiableQuoteTemplate.Manage.removeItemsModal.successHeading',\n removeSuccessMessage: 'NegotiableQuoteTemplate.Manage.removeItemsModal.successMessage',\n removeErrorHeading: 'NegotiableQuoteTemplate.Manage.removeItemsModal.errorHeading',\n removeErrorMessage: 'NegotiableQuoteTemplate.Manage.removeItemsModal.errorMessage',\n updateModalTitle: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.title',\n updateModalDescription: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.description',\n updateModalCancelButton: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.cancelButton',\n updateModalUpdateButton: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.updateButton',\n updateSuccessHeading: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successHeading',\n updateSuccessMessage: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successMessage',\n updateErrorHeading: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorHeading',\n updateErrorMessage: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorMessage',\n errorHeading:\n 'NegotiableQuoteTemplate.Manage.lineItemNoteModal.errorHeading',\n });\n\n // Use the remove template items hook\n const {\n handleRemoveItems,\n handleConfirmRemove,\n handleCancelRemove,\n isRemoveModalOpen,\n isRemoving,\n removeNotificationState,\n } = useRemoveTemplateItems({\n templateId: templateData?.id,\n removeSuccessMessage: dictionary.removeSuccessMessage,\n removeErrorMessage: dictionary.removeErrorMessage,\n });\n\n // Use the items quoted template hook for dropdown and interaction logic\n const {\n dropdownSelections: hookDropdownSelections,\n handleItemDropdownChange: hookHandleItemDropdownChange,\n handleDismissRemoveBanner,\n } = useItemsQuotedTemplate({\n handleRemoveItems,\n });\n\n // Use the update template quantities hook\n const {\n handleQuantityChange,\n handleUpdate,\n handleConfirmUpdate,\n handleCancelUpdate,\n handleDismissBanner,\n isUpdateModalOpen,\n updateNotificationState,\n } = useUpdateTemplateQuantities({\n templateId: templateData?.id,\n updateSuccessMessage: dictionary.updateSuccessMessage,\n updateErrorMessage: dictionary.updateErrorMessage,\n });\n\n useEffect(() => {\n const templateDataEvent = events.on(\n 'quote-management/quote-template-data',\n (payload) => {\n setTemplateData(payload.quoteTemplate);\n setDropdownSelections({});\n },\n { eager: true }\n );\n\n return () => templateDataEvent?.off();\n }, []);\n\n // Combined handler for dropdown selection that handles both remove (via hook) and edit (for line item notes)\n const handleItemDropdownChange = useCallback(\n (item: ProductListTableItem, action: string) => {\n const templateItem = item as CartItemModel;\n \n // Handle edit action - open line item note modal\n if (action === 'edit') {\n setSelectedItem(templateItem);\n setIsLineItemNoteModalOpen(true);\n // Reset dropdown immediately\n setDropdownSelections((prev) => ({\n ...prev,\n [templateItem.uid]: '',\n }));\n return;\n }\n\n // For remove and other actions, delegate to hook handler\n hookHandleItemDropdownChange(item, action);\n },\n [hookHandleItemDropdownChange]\n );\n\n // Merge dropdown selections from hook and local state\n const mergedDropdownSelections = { ...hookDropdownSelections, ...dropdownSelections };\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 only (quantity is read-only for templates)\n const handleModalConfirm = useCallback(\n async (note: string) => {\n /* istanbul ignore next: defensive guard for async race conditions - unreachable in normal flow as modal only renders with selectedItem and templateData */\n if (!selectedItem || !templateData) return;\n\n setIsSubmitting(true);\n setModalErrorMessage('');\n\n try {\n // Set the line item note\n await addQuoteTemplateLineItemNote({\n templateId: templateData.id,\n itemId: selectedItem.uid,\n note,\n });\n\n // Close modal on success\n handleModalClose();\n } catch (error) {\n console.error('Failed to set template line item note:', error);\n const errorMessage =\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, templateData, handleModalClose]\n );\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 update quantities confirmation banner based on notification state\n const updateConfirmationBanner =\n updateNotificationState.type === 'success' ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.updateSuccessHeading}\n description={updateNotificationState.message}\n onDismiss={handleDismissBanner}\n data-testid=\"update-quantities-success-banner\"\n />\n ) : updateNotificationState.type === 'error' ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.updateErrorHeading}\n description={updateNotificationState.message}\n onDismiss={handleDismissBanner}\n data-testid=\"update-quantities-error-banner\"\n />\n ) : null;\n\n if (!templateData) {\n return <ItemsQuotedComponent loading={true} />;\n }\n\n const removeConfirmationModalProps = isRemoveModalOpen ? {\n open: true,\n title: dictionary.removeModalTitle,\n message: dictionary.removeModalDescription,\n cancelLabel: dictionary.removeModalCancelButton,\n confirmLabel: isRemoving\n ? dictionary.removeModalConfirmButtonRemoving\n : dictionary.removeModalConfirmButton,\n onCancel: handleCancelRemove,\n onConfirm: handleConfirmRemove,\n confirmationBanner: removeConfirmationBanner,\n } : null;\n\n const updateConfirmationModalProps = isUpdateModalOpen ? {\n open: true,\n title: dictionary.updateModalTitle,\n message: dictionary.updateModalDescription,\n cancelLabel: dictionary.updateModalCancelButton,\n confirmLabel: dictionary.updateModalUpdateButton,\n onCancel: handleCancelUpdate,\n onConfirm: handleConfirmUpdate,\n confirmationBanner: updateConfirmationBanner,\n } : null;\n\n // Only define a single confirmation modal\n const confirmationModalProps = removeConfirmationModalProps || updateConfirmationModalProps;\n\n const quotePricesSummaryEntries = [];\n\n templateData.prices.subtotalExcludingTax &&\n quotePricesSummaryEntries.push({\n label: dictionary.subtotal,\n id: 'subtotal',\n value: (\n <Price\n amount={templateData.prices.subtotalExcludingTax.value}\n currency={templateData.prices.subtotalExcludingTax.currency}\n weight=\"normal\"\n />\n ),\n });\n\n templateData.prices.grandTotal &&\n quotePricesSummaryEntries.push({\n label: dictionary.grandTotal,\n id: 'total',\n value: (\n <Price\n amount={templateData.prices.grandTotal.value}\n currency={templateData.prices.grandTotal.currency}\n />\n ),\n strong: true,\n });\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-template-container\"\n {...props}\n loading={false}\n table={\n <Slot\n name=\"ProductListTable\"\n slot={slots?.ProductListTable}\n context={{\n items: templateData.items,\n canEdit: templateData.canSendForReview,\n dropdownSelections: mergedDropdownSelections,\n handleItemDropdownChange,\n handleQuantityChange,\n handleUpdate,\n }}\n >\n <ProductListTable\n items={templateData.items as ProductListTableItem[]}\n canEdit={templateData.canSendForReview}\n showActions={templateData.canEditTemplateItems}\n onItemDropdownChange={handleItemDropdownChange}\n onQuantityChange={handleQuantityChange}\n onUpdate={handleUpdate}\n dropdownSelections={mergedDropdownSelections}\n />\n </Slot>\n }\n pricesSummary={\n <Slot\n name=\"QuotePricesSummary\"\n slot={slots?.QuotePricesSummary}\n context={{\n items: templateData.items,\n prices: templateData.prices,\n }}\n >\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n {/* Confirmation Modal for remove/update */}\n {confirmationModalProps && (\n <ConfirmationModal\n {...confirmationModalProps}\n />\n )}\n {/* Line Item Note Modal */}\n {selectedItem && (\n <LineItemNoteModal\n open={isLineItemNoteModalOpen}\n item={selectedItem as any}\n onClose={handleModalClose}\n onConfirm={handleModalConfirm}\n isSubmitting={isSubmitting}\n readOnlyQuantity={true}\n errorBanner={modalErrorBanner || undefined}\n />\n )}\n </>\n );\n};\n"],"names":["NOTIFICATION_AUTO_DISMISS_DELAY","useRemoveTemplateItems","params","templateId","onRemoveModalStateChange","removeSuccessMessage","removeErrorMessage","isRemoveModalOpen","setIsRemoveModalOpen","useState","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","useEffect","templateDataEvent","events","handleRemoveItems","useCallback","items","handleConfirmRemove","uidsToRemove","item","removeQuoteTemplateItems","err","errorMessage","handleCancelRemove","useItemsQuotedTemplate","dropdownSelections","setDropdownSelections","handleDismissRemoveBanner","handleItemDropdownChange","action","cartItem","prev","next","useUpdateTemplateQuantities","onUpdateModalStateChange","updateSuccessMessage","updateErrorMessage","quantityChanges","setQuantityChanges","isUpdateModalOpen","setIsUpdateModalOpen","isUpdating","setIsUpdating","updateNotificationState","setUpdateNotificationState","handleQuantityChange","newQuantity","itemUid","handleUpdate","e","handleConfirmUpdate","itemId","quantity","updateQuoteTemplateItemQuantities","handleCancelUpdate","handleDismissBanner","ItemsQuotedTemplate","initialData","slots","props","templateData","setTemplateData","selectedItem","setSelectedItem","isLineItemNoteModalOpen","setIsLineItemNoteModalOpen","isSubmitting","setIsSubmitting","modalErrorMessage","setModalErrorMessage","dictionary","useText","hookDropdownSelections","hookHandleItemDropdownChange","payload","templateItem","mergedDropdownSelections","handleModalClose","handleModalConfirm","note","addQuoteTemplateLineItemNote","error","removeConfirmationBanner","jsx","InLineAlert","CheckWithCircle","WarningFilled","updateConfirmationBanner","ItemsQuotedComponent","removeConfirmationModalProps","updateConfirmationModalProps","confirmationModalProps","quotePricesSummaryEntries","Price","modalErrorBanner","jsxs","Fragment","Slot","ProductListTable","QuotePricesSummary","ConfirmationModal","LineItemNoteModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ItemsQuotedTemplate.js","sources":["/@dropins/storefront-quote-management/src/hooks/useRemoveTemplateItems.ts","/@dropins/storefront-quote-management/src/hooks/useItemsQuotedTemplate.ts","/@dropins/storefront-quote-management/src/hooks/useUpdateTemplateQuantities.ts","/@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 { useState, useEffect, useCallback } from 'preact/compat';\nimport { events } from '@adobe-commerce/event-bus';\nimport { removeQuoteTemplateItems } from '@/quote-management/api/removeQuoteTemplateItems';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\n\nconst NOTIFICATION_AUTO_DISMISS_DELAY = 3000;\n\nexport interface UseRemoveTemplateItemsReturn {\n handleRemoveItems: (items: CartItemModel[]) => void;\n handleConfirmRemove: () => Promise<void>;\n handleCancelRemove: () => void;\n isRemoveModalOpen: boolean;\n itemsToRemove: CartItemModel[];\n isRemoving: boolean;\n removeNotificationState: {\n type: 'success' | 'error' | null;\n message: string;\n };\n}\n\nexport interface UseRemoveTemplateItemsParams {\n templateId?: string;\n onRemoveModalStateChange?: (isOpen: boolean) => void;\n removeSuccessMessage: string;\n removeErrorMessage: string;\n}\n\n/**\n * Custom hook to manage removing items from a quote template\n */\nexport const useRemoveTemplateItems = (\n params: UseRemoveTemplateItemsParams\n): UseRemoveTemplateItemsReturn => {\n const {\n templateId,\n onRemoveModalStateChange,\n removeSuccessMessage,\n removeErrorMessage,\n } = params;\n\n const [isRemoveModalOpen, setIsRemoveModalOpen] = useState(false);\n const [itemsToRemove, setItemsToRemove] = useState<CartItemModel[]>([]);\n const [isRemoving, setIsRemoving] = useState(false);\n const [removeNotificationState, setRemoveNotificationState] = useState<{\n type: 'success' | 'error' | null;\n message: string;\n }>({ type: null, message: '' });\n\n // Listen for quote template data event (successful removal)\n useEffect(() => {\n const templateDataEvent = events.on(\n 'quote-management/quote-template-data',\n () => {\n setItemsToRemove([]);\n setIsRemoving(false);\n setRemoveNotificationState({\n type: 'success',\n message: removeSuccessMessage,\n });\n // Auto-close success notification after delay\n setTimeout(() => {\n setIsRemoveModalOpen(false);\n setRemoveNotificationState({ type: null, message: '' });\n onRemoveModalStateChange?.(false);\n }, NOTIFICATION_AUTO_DISMISS_DELAY);\n }\n );\n return () => templateDataEvent?.off();\n }, [removeSuccessMessage, onRemoveModalStateChange]);\n\n // Unified handler for removing items (single or multiple)\n const handleRemoveItems = useCallback((items: CartItemModel[]) => {\n if (!items || items.length === 0) {\n return;\n }\n setItemsToRemove(items);\n setRemoveNotificationState({ type: null, message: '' });\n setIsRemoveModalOpen(true);\n }, []);\n\n const handleConfirmRemove = useCallback(async () => {\n if (!templateId || itemsToRemove.length === 0) {\n return;\n }\n\n const uidsToRemove = itemsToRemove.map((item) => item.uid).filter(Boolean) as string[];\n\n if (uidsToRemove.length === 0) {\n return;\n }\n\n setIsRemoving(true);\n setRemoveNotificationState({ type: null, message: '' });\n\n try {\n await removeQuoteTemplateItems({\n templateId,\n itemUids: uidsToRemove,\n });\n // Success is handled by the event listener\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : removeErrorMessage;\n setRemoveNotificationState({\n type: 'error',\n message: errorMessage,\n });\n setIsRemoving(false);\n }\n }, [templateId, itemsToRemove, removeErrorMessage]);\n\n const handleCancelRemove = useCallback(() => {\n setIsRemoveModalOpen(false);\n setRemoveNotificationState({ type: null, message: '' });\n onRemoveModalStateChange?.(false);\n setItemsToRemove([]);\n }, [onRemoveModalStateChange]);\n\n return {\n handleRemoveItems,\n handleConfirmRemove,\n handleCancelRemove,\n isRemoveModalOpen,\n itemsToRemove,\n isRemoving,\n removeNotificationState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useCallback } from 'preact/compat';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\n\nexport interface UseItemsQuotedTemplateReturn {\n dropdownSelections: Record<string, string | undefined>;\n handleItemDropdownChange: (item: CartItemModel, action: string) => void;\n handleDismissRemoveBanner: () => void;\n}\n\nexport interface UseItemsQuotedTemplateParams {\n handleRemoveItems: (items: CartItemModel[]) => void;\n}\n\n/**\n * Custom hook to manage dropdown selections and item actions for quote template items\n */\nexport const useItemsQuotedTemplate = (\n params: UseItemsQuotedTemplateParams\n): UseItemsQuotedTemplateReturn => {\n const { handleRemoveItems } = params;\n\n const [dropdownSelections, setDropdownSelections] = useState<\n Record<string, string | undefined>\n >({});\n\n const handleDismissRemoveBanner = useCallback(() => {\n // The hook manages its own notification state, but we can add custom dismiss logic if needed\n }, []);\n\n const handleItemDropdownChange = useCallback(\n (item: CartItemModel, action: string) => {\n const cartItem = item;\n\n // Handle remove action\n if (action === 'remove') {\n setDropdownSelections((prev) => ({\n ...prev,\n [cartItem.uid || '']: action,\n }));\n handleRemoveItems([cartItem]);\n // Reset dropdown immediately\n setDropdownSelections((prev) => ({ ...prev, [cartItem.uid || '']: '' }));\n return;\n }\n\n // Clear dropdown selection for other actions\n setDropdownSelections((prev) => {\n if (!cartItem.uid || !(cartItem.uid in prev)) {\n return prev;\n }\n const next = { ...prev };\n delete next[cartItem.uid];\n return next;\n });\n },\n [handleRemoveItems]\n );\n\n return {\n dropdownSelections,\n handleItemDropdownChange,\n handleDismissRemoveBanner,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useEffect, useCallback } from 'preact/compat';\nimport { events } from '@adobe-commerce/event-bus';\nimport { updateQuoteTemplateItemQuantities } from '@/quote-management/api/updateQuoteTemplateItemQuantities';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\n\nconst NOTIFICATION_AUTO_DISMISS_DELAY = 3000;\n\nexport interface UseUpdateTemplateQuantitiesReturn {\n quantityChanges: Record<string, number>;\n handleQuantityChange: (item: CartItemModel, newQuantity: number) => void;\n handleUpdate: (e: SubmitEvent) => void;\n handleConfirmUpdate: () => Promise<void>;\n handleCancelUpdate: () => void;\n handleDismissBanner: () => void;\n isUpdateModalOpen: boolean;\n isUpdating: boolean;\n updateNotificationState: {\n type: 'success' | 'error' | null;\n message: string;\n };\n}\n\nexport interface UseUpdateTemplateQuantitiesParams {\n templateId?: string;\n onUpdateModalStateChange?: (isOpen: boolean) => void;\n updateSuccessMessage: string;\n updateErrorMessage: string;\n}\n\n/**\n * Custom hook to manage updating quantities of items in a quote template\n */\nexport const useUpdateTemplateQuantities = (\n params: UseUpdateTemplateQuantitiesParams\n): UseUpdateTemplateQuantitiesReturn => {\n const {\n templateId,\n onUpdateModalStateChange,\n updateSuccessMessage,\n updateErrorMessage,\n } = params;\n\n const [quantityChanges, setQuantityChanges] = useState<Record<string, number>>({});\n const [isUpdateModalOpen, setIsUpdateModalOpen] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [updateNotificationState, setUpdateNotificationState] = useState<{\n type: 'success' | 'error' | null;\n message: string;\n }>({ type: null, message: '' });\n\n // Listen for quote template data event (successful update)\n useEffect(() => {\n const templateDataEvent = events.on(\n 'quote-management/quote-template-data',\n () => {\n setQuantityChanges({});\n setIsUpdating(false);\n setUpdateNotificationState({\n type: 'success',\n message: updateSuccessMessage,\n });\n // Auto-close success notification after delay\n setTimeout(() => {\n setIsUpdateModalOpen(false);\n setUpdateNotificationState({ type: null, message: '' });\n onUpdateModalStateChange?.(false);\n }, NOTIFICATION_AUTO_DISMISS_DELAY);\n }\n );\n return () => templateDataEvent?.off();\n }, [updateSuccessMessage, onUpdateModalStateChange]);\n\n const handleQuantityChange = useCallback(\n (item: CartItemModel, newQuantity: number) => {\n const cartItem = item;\n if (!cartItem.uid) {\n return;\n }\n const itemUid = cartItem.uid;\n setQuantityChanges((prev) => ({\n ...prev,\n [itemUid]: newQuantity,\n }));\n },\n []\n );\n\n const handleUpdate = useCallback((e: SubmitEvent) => {\n e.preventDefault();\n setUpdateNotificationState({ type: null, message: '' });\n setIsUpdateModalOpen(true);\n }, []);\n\n const handleConfirmUpdate = useCallback(async () => {\n if (!templateId || Object.keys(quantityChanges).length === 0) {\n setIsUpdateModalOpen(false);\n return;\n }\n\n setIsUpdating(true);\n setUpdateNotificationState({ type: null, message: '' });\n\n // Map quantity changes to API format\n const items = Object.entries(quantityChanges).map(([itemId, quantity]) => ({\n itemId,\n quantity,\n }));\n\n try {\n await updateQuoteTemplateItemQuantities({\n templateId,\n items,\n });\n // Success is handled by the event listener\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : updateErrorMessage;\n setUpdateNotificationState({\n type: 'error',\n message: errorMessage,\n });\n setIsUpdating(false);\n }\n }, [templateId, quantityChanges, updateErrorMessage]);\n\n const handleCancelUpdate = useCallback(() => {\n setIsUpdateModalOpen(false);\n setUpdateNotificationState({ type: null, message: '' });\n onUpdateModalStateChange?.(false);\n setQuantityChanges({});\n }, [onUpdateModalStateChange]);\n\n const handleDismissBanner = useCallback(() => {\n setUpdateNotificationState({ type: null, message: '' });\n }, []);\n\n return {\n quantityChanges,\n handleQuantityChange,\n handleUpdate,\n handleConfirmUpdate,\n handleCancelUpdate,\n handleDismissBanner,\n isUpdateModalOpen,\n isUpdating,\n updateNotificationState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n 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 { CheckWithCircle, WarningFilled } from '@adobe-commerce/elsie/icons';\nimport {\n NegotiableQuoteTemplateModel,\n} from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { CartItemModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport {\n QuotePricesSummary,\n ProductListTable,\n ItemsQuoted as ItemsQuotedComponent,\n ConfirmationModal,\n} from '@/quote-management/components';\nimport { LineItemNoteModal } from '@/quote-management/components/LineItemNoteModal';\nimport { addQuoteTemplateLineItemNote } from '@/quote-management/api';\nimport { useRemoveTemplateItems } from '@/quote-management/hooks/useRemoveTemplateItems';\nimport { useItemsQuotedTemplate } from '@/quote-management/hooks/useItemsQuotedTemplate';\nimport { useUpdateTemplateQuantities } from '@/quote-management/hooks/useUpdateTemplateQuantities';\n\nexport interface ItemsQuotedTemplateProps\n extends HTMLAttributes<HTMLDivElement> {\n templateData?: NegotiableQuoteTemplateModel;\n slots?: {\n ProductListTable?: SlotProps<{\n items: NegotiableQuoteTemplateModel['items'];\n canEdit: boolean;\n dropdownSelections: Record<string, string | undefined>;\n handleItemDropdownChange: (item: CartItemModel, action: string) => void;\n handleQuantityChange: (item: CartItemModel, newQuantity: number) => void;\n handleUpdate: (e: SubmitEvent) => void;\n onItemDropdownChange?: (item: any, action: string) => void;\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<\n NegotiableQuoteTemplateModel | undefined\n >(initialData);\n const [selectedItem, setSelectedItem] =\n useState<CartItemModel | null>(null);\n const [isLineItemNoteModalOpen, setIsLineItemNoteModalOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [modalErrorMessage, setModalErrorMessage] = useState('');\n const [dropdownSelections, setDropdownSelections] = useState<\n Record<string, string>\n >({});\n\n const dictionary = useText({\n subtotal:\n 'NegotiableQuoteTemplate.Manage.quotePricesSummary.subtotal.excludingTax',\n grandTotal:\n 'NegotiableQuoteTemplate.Manage.quotePricesSummary.grandTotal.includingTax',\n appliedTaxes:\n 'NegotiableQuoteTemplate.Manage.quotePricesSummary.appliedTaxes',\n removeModalTitle: 'NegotiableQuoteTemplate.Manage.removeItemsModal.title',\n removeModalDescription: 'NegotiableQuoteTemplate.Manage.removeItemsModal.description',\n removeModalCancelButton: 'NegotiableQuoteTemplate.Manage.removeItemsModal.cancelButton',\n removeModalConfirmButton: 'NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButton',\n removeModalConfirmButtonRemoving: 'NegotiableQuoteTemplate.Manage.removeItemsModal.confirmButtonRemoving',\n removeSuccessHeading: 'NegotiableQuoteTemplate.Manage.removeItemsModal.successHeading',\n removeSuccessMessage: 'NegotiableQuoteTemplate.Manage.removeItemsModal.successMessage',\n removeErrorHeading: 'NegotiableQuoteTemplate.Manage.removeItemsModal.errorHeading',\n removeErrorMessage: 'NegotiableQuoteTemplate.Manage.removeItemsModal.errorMessage',\n updateModalTitle: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.title',\n updateModalDescription: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.description',\n updateModalCancelButton: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.cancelButton',\n updateModalUpdateButton: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.updateButton',\n updateSuccessHeading: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successHeading',\n updateSuccessMessage: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.successMessage',\n updateErrorHeading: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorHeading',\n updateErrorMessage: 'NegotiableQuoteTemplate.Manage.updateQuantitiesModal.errorMessage',\n errorHeading:\n 'NegotiableQuoteTemplate.Manage.lineItemNoteModal.errorHeading',\n });\n\n // Use the remove template items hook\n const {\n handleRemoveItems,\n handleConfirmRemove,\n handleCancelRemove,\n isRemoveModalOpen,\n isRemoving,\n removeNotificationState,\n } = useRemoveTemplateItems({\n templateId: templateData?.id,\n removeSuccessMessage: dictionary.removeSuccessMessage,\n removeErrorMessage: dictionary.removeErrorMessage,\n });\n\n // Use the items quoted template hook for dropdown and interaction logic\n const {\n dropdownSelections: hookDropdownSelections,\n handleItemDropdownChange: hookHandleItemDropdownChange,\n handleDismissRemoveBanner,\n } = useItemsQuotedTemplate({\n handleRemoveItems,\n });\n\n // Use the update template quantities hook\n const {\n handleQuantityChange,\n handleUpdate,\n handleConfirmUpdate,\n handleCancelUpdate,\n handleDismissBanner,\n isUpdateModalOpen,\n updateNotificationState,\n } = useUpdateTemplateQuantities({\n templateId: templateData?.id,\n updateSuccessMessage: dictionary.updateSuccessMessage,\n updateErrorMessage: dictionary.updateErrorMessage,\n });\n\n useEffect(() => {\n const templateDataEvent = events.on(\n 'quote-management/quote-template-data',\n (payload) => {\n setTemplateData(payload.quoteTemplate);\n setDropdownSelections({});\n },\n { eager: true }\n );\n\n return () => templateDataEvent?.off();\n }, []);\n\n // Combined handler for dropdown selection that handles both remove (via hook) and edit (for line item notes)\n const handleItemDropdownChange = useCallback(\n (item: CartItemModel, action: string) => {\n const templateItem = item;\n \n // Handle edit action - open line item note modal\n if (action === 'edit') {\n setSelectedItem(templateItem);\n setIsLineItemNoteModalOpen(true);\n // Reset dropdown immediately\n setDropdownSelections((prev) => ({\n ...prev,\n [templateItem.uid]: '',\n }));\n return;\n }\n\n // For remove and other actions, delegate to hook handler\n hookHandleItemDropdownChange(item, action);\n },\n [hookHandleItemDropdownChange]\n );\n\n // Merge dropdown selections from hook and local state\n const mergedDropdownSelections = { ...hookDropdownSelections, ...dropdownSelections };\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 only (quantity is read-only for templates)\n const handleModalConfirm = useCallback(\n async (note: string) => {\n /* istanbul ignore next: defensive guard for async race conditions - unreachable in normal flow as modal only renders with selectedItem and templateData */\n if (!selectedItem || !templateData) return;\n\n setIsSubmitting(true);\n setModalErrorMessage('');\n\n try {\n // Set the line item note\n await addQuoteTemplateLineItemNote({\n templateId: templateData.id,\n itemId: selectedItem.uid,\n note,\n });\n\n // Close modal on success\n handleModalClose();\n } catch (error) {\n console.error('Failed to set template line item note:', error);\n const errorMessage =\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, templateData, handleModalClose]\n );\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 update quantities confirmation banner based on notification state\n const updateConfirmationBanner =\n updateNotificationState.type === 'success' ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.updateSuccessHeading}\n description={updateNotificationState.message}\n onDismiss={handleDismissBanner}\n data-testid=\"update-quantities-success-banner\"\n />\n ) : updateNotificationState.type === 'error' ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.updateErrorHeading}\n description={updateNotificationState.message}\n onDismiss={handleDismissBanner}\n data-testid=\"update-quantities-error-banner\"\n />\n ) : null;\n\n if (!templateData) {\n return <ItemsQuotedComponent loading={true} />;\n }\n\n const removeConfirmationModalProps = isRemoveModalOpen ? {\n open: true,\n title: dictionary.removeModalTitle,\n message: dictionary.removeModalDescription,\n cancelLabel: dictionary.removeModalCancelButton,\n confirmLabel: isRemoving\n ? dictionary.removeModalConfirmButtonRemoving\n : dictionary.removeModalConfirmButton,\n onCancel: handleCancelRemove,\n onConfirm: handleConfirmRemove,\n confirmationBanner: removeConfirmationBanner,\n } : null;\n\n const updateConfirmationModalProps = isUpdateModalOpen ? {\n open: true,\n title: dictionary.updateModalTitle,\n message: dictionary.updateModalDescription,\n cancelLabel: dictionary.updateModalCancelButton,\n confirmLabel: dictionary.updateModalUpdateButton,\n onCancel: handleCancelUpdate,\n onConfirm: handleConfirmUpdate,\n confirmationBanner: updateConfirmationBanner,\n } : null;\n\n // Only define a single confirmation modal\n const confirmationModalProps = removeConfirmationModalProps || updateConfirmationModalProps;\n\n const quotePricesSummaryEntries = [];\n\n templateData.prices.subtotalExcludingTax &&\n quotePricesSummaryEntries.push({\n label: dictionary.subtotal,\n id: 'subtotal',\n value: (\n <Price\n amount={templateData.prices.subtotalExcludingTax.value}\n currency={templateData.prices.subtotalExcludingTax.currency}\n weight=\"normal\"\n />\n ),\n });\n\n templateData.prices.grandTotal &&\n quotePricesSummaryEntries.push({\n label: dictionary.grandTotal,\n id: 'total',\n value: (\n <Price\n amount={templateData.prices.grandTotal.value}\n currency={templateData.prices.grandTotal.currency}\n />\n ),\n strong: true,\n });\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-template-container\"\n {...props}\n loading={false}\n table={\n <Slot\n name=\"ProductListTable\"\n slot={slots?.ProductListTable}\n context={{\n items: templateData.items,\n canEdit: templateData.canSendForReview,\n dropdownSelections: mergedDropdownSelections,\n handleItemDropdownChange,\n handleQuantityChange,\n handleUpdate,\n }}\n >\n <ProductListTable\n items={templateData.items}\n canEdit={templateData.canSendForReview}\n showActions={templateData.canEditTemplateItems}\n onItemDropdownChange={handleItemDropdownChange}\n onQuantityChange={handleQuantityChange}\n onUpdate={handleUpdate}\n dropdownSelections={mergedDropdownSelections}\n />\n </Slot>\n }\n pricesSummary={\n <Slot\n name=\"QuotePricesSummary\"\n slot={slots?.QuotePricesSummary}\n context={{\n items: templateData.items,\n prices: templateData.prices,\n }}\n >\n <QuotePricesSummary entries={quotePricesSummaryEntries} />\n </Slot>\n }\n />\n {/* Confirmation Modal for remove/update */}\n {confirmationModalProps && (\n <ConfirmationModal\n {...confirmationModalProps}\n />\n )}\n {/* Line Item Note Modal */}\n {selectedItem && (\n <LineItemNoteModal\n open={isLineItemNoteModalOpen}\n item={selectedItem as any}\n onClose={handleModalClose}\n onConfirm={handleModalConfirm}\n isSubmitting={isSubmitting}\n readOnlyQuantity={true}\n errorBanner={modalErrorBanner || undefined}\n />\n )}\n </>\n );\n};\n"],"names":["NOTIFICATION_AUTO_DISMISS_DELAY","useRemoveTemplateItems","params","templateId","onRemoveModalStateChange","removeSuccessMessage","removeErrorMessage","isRemoveModalOpen","setIsRemoveModalOpen","useState","itemsToRemove","setItemsToRemove","isRemoving","setIsRemoving","removeNotificationState","setRemoveNotificationState","useEffect","templateDataEvent","events","handleRemoveItems","useCallback","items","handleConfirmRemove","uidsToRemove","item","removeQuoteTemplateItems","err","errorMessage","handleCancelRemove","useItemsQuotedTemplate","dropdownSelections","setDropdownSelections","handleDismissRemoveBanner","handleItemDropdownChange","action","cartItem","prev","next","useUpdateTemplateQuantities","onUpdateModalStateChange","updateSuccessMessage","updateErrorMessage","quantityChanges","setQuantityChanges","isUpdateModalOpen","setIsUpdateModalOpen","isUpdating","setIsUpdating","updateNotificationState","setUpdateNotificationState","handleQuantityChange","newQuantity","itemUid","handleUpdate","e","handleConfirmUpdate","itemId","quantity","updateQuoteTemplateItemQuantities","handleCancelUpdate","handleDismissBanner","ItemsQuotedTemplate","initialData","slots","props","templateData","setTemplateData","selectedItem","setSelectedItem","isLineItemNoteModalOpen","setIsLineItemNoteModalOpen","isSubmitting","setIsSubmitting","modalErrorMessage","setModalErrorMessage","dictionary","useText","hookDropdownSelections","hookHandleItemDropdownChange","payload","templateItem","mergedDropdownSelections","handleModalClose","handleModalConfirm","note","addQuoteTemplateLineItemNote","error","removeConfirmationBanner","jsx","InLineAlert","CheckWithCircle","WarningFilled","updateConfirmationBanner","ItemsQuotedComponent","removeConfirmationModalProps","updateConfirmationModalProps","confirmationModalProps","quotePricesSummaryEntries","Price","modalErrorBanner","jsxs","Fragment","Slot","ProductListTable","QuotePricesSummary","ConfirmationModal","LineItemNoteModal"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as t,jsxs as o,Fragment as G}from"@dropins/tools/preact-jsx-runtime.js";import{classes as v,VComponent as E}from"@dropins/tools/lib.js";/* empty css */import{Skeleton as C,SkeletonRow as ee,Input as V,Picker as te,Price as Q,Checkbox as ae,Button as F,Table as W,Accordion as ne,AccordionSection as oe,Modal as le,TextArea as ie}from"@dropins/tools/components.js";import{h as z}from"@dropins/tools/preact.js";import{useState as R,useEffect as se}from"@dropins/tools/preact-hooks.js";import{g as ue}from"./dateUtils.js";import{useText as Z}from"@dropins/tools/i18n.js";import{useState as D,useEffect as re,useCallback as O}from"@dropins/tools/preact-compat.js";const ye=({className:N,loading:c,table:a,pricesSummary:u,...i})=>c?t(ce,{}):o("div",{className:v(["quote-management-items-quoted",N]),...i,children:[a&&t(E,{node:a,className:v(["quote-management-items-quoted__table"]),"data-testid":"quote-management-items-quoted__table"}),u&&t(E,{node:u,className:v(["quote-management-items-quoted__prices-summary"]),"data-testid":"quote-management-items-quoted__prices-summary"})]}),ce=()=>t(C,{"data-testid":"items-quoted-skeleton",children:t(ee,{variant:"row",fullWidth:!0,size:"medium",lines:4,multilineGap:"xsmall"})}),ve=({className:N,items:c,canEdit:a,readOnly:u=!1,showActions:i,onItemCheckboxChange:d,onItemDropdownChange:p,onQuantityChange:k,onUpdate:M,dropdownSelections:q,..._})=>{const[T,f]=R({}),[h,b]=R({});se(()=>{const e={};c.forEach(s=>{e[s.uid]=s.quantity}),f(e),b(e)},[c]);const y=Object.keys(h).some(e=>h[e]!==T[e]),n=Z({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"}),I=[{label:n.productNameHeader,key:"productName"},{label:n.skuHeader,key:"sku"},{label:n.priceHeader,key:"price"},{label:n.quantityHeader,key:"quantity"},{label:n.discountHeader,key:"discount"},{label:n.subtotalHeader,key:"subtotal"}];a&&!u&&I.unshift({label:"",key:"checkbox"}),(i??a)&&!u&&I.push({label:n.actionsHeader,key:"actions"});const j=(e,s)=>{const l=e.target.checked;d==null||d(s,l)},S=(e,s)=>{const l=e.target.value;p==null||p(s,l)},B=(e,s)=>{const l=parseInt(e.target.value,10);!isNaN(l)&&l>0&&(b(g=>({...g,[s.uid]:l})),k==null||k(s,l))},$=e=>{e.preventDefault(),M==null||M(e)},r=(e,s)=>e>0?o("div",{className:"quote-management-product-list-table__discount-container",children:[o("span",{className:"quote-management-product-list-table__discount-percent",children:[s,"%"]}),o("span",{className:"quote-management-product-list-table__discount-price",children:["(",t(Q,{amount:e}),")"]})]}):void 0,L=e=>{var g,H;const s=(g=e.configurableOptions)==null?void 0:g.map(m=>o("div",{className:"quote-management-product-list-table__configurable-option",children:[o("span",{className:"quote-management-product-list-table__configurable-option-label",children:[m.optionLabel,":"]}),t("span",{className:"quote-management-product-list-table__configurable-option-value",children:m.valueLabel})]},m.optionLabel)),l=(H=e.bundleOptions)==null?void 0:H.map(m=>o("div",{className:"quote-management-product-list-table__bundle-option",children:[t("span",{className:"quote-management-product-list-table__bundle-option-label",children:m.label}),t("div",{className:"quote-management-product-list-table__bundle-option-values",children:m.values.map(w=>o("span",{className:"quote-management-product-list-table__bundle-option-value",children:[o("span",{className:"quote-management-product-list-table__bundle-option-value-quantity",children:[w.quantity," x"]}),t("span",{className:"quote-management-product-list-table__bundle-option-value-label",children:w.label}),t(Q,{className:"quote-management-product-list-table__bundle-option-value-original-price",amount:w.originalPrice.value,currency:w.originalPrice.currency,weight:"normal"})]},w.label))})]},m.label));return o("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,l]})},A=e=>new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0,timeZone:ue()}),x=e=>{if(!e.noteFromBuyer||e.noteFromBuyer.length===0)return null;const s=e.noteFromBuyer.filter(l=>l&&l.note&&l.note.trim()!=="");return s.length===0?null:o("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:n.notesHeader}),t("div",{className:"quote-management-product-list-table__notes-list",children:s.map((l,g)=>o("div",{className:"quote-management-product-list-table__note-item",children:[o("div",{className:"quote-management-product-list-table__note-content",children:[o("strong",{className:"quote-management-product-list-table__note-meta",children:[A(l.createdAt)," (",n.buyer,")"]})," ",n.leftANote]}),o("div",{className:"quote-management-product-list-table__note-text",children:[l.note," "]})]},l.noteUid||g))})]})},J=c.flatMap(e=>{var H;const s=a?t(V,{className:"quote-management-product-list-table__quantity-input",type:"number",min:"1",value:((H=h[e.uid])==null?void 0:H.toString())||e.quantity.toString(),onChange:m=>B(m,e),disabled:u||!a,"data-testid":`quantity-input-${e.product.sku}`}):t("span",{className:"quote-management-product-list-table__quantity",children:e.quantity}),l={checkbox:t(ae,{className:"quote-management-product-list-table__checkbox",name:"itemSelected","data-testid":`item-checkbox-${e.product.sku}`,onChange:m=>j(m,e),value:e.product.sku}),productName:L(e),sku:t("span",{className:"quote-management-product-list-table__sku",children:e.product.sku}),price:t(Q,{className:"quote-management-product-list-table__price",amount:e.prices.originalItemPrice.value,currency:e.prices.originalItemPrice.currency}),quantity:s,discount:e.catalogDiscount?r(e.catalogDiscount.amountOff,e.catalogDiscount.percentOff):void 0,subtotal:t(Q,{className:"quote-management-product-list-table__subtotal",amount:e.prices.rowTotal.value,currency:e.prices.rowTotal.currency}),actions:t(te,{className:"quote-management-product-list-table__actions","data-testid":`item-dropdown-${e.product.sku}`,name:`item-dropdown-${e.product.sku}`,handleSelect:m=>S(m,e),placeholder:"Select",value:(q==null?void 0:q[e.uid])??"",options:[{text:n.editNoteToSeller,value:"edit"},{text:n.remove,value:"remove"}]})},g=x(e);return g?[l,{checkbox:"",productName:t("div",{className:"quote-management-product-list-table__notes-row-wrapper",children:g}),sku:"",price:"",quantity:"",discount:"",subtotal:"",actions:""}]:[l]}),K=t(W,{columns:I,rowData:J,"data-testid":"product-list-table",mobileLayout:"stacked"}),U=a?z("form",{}):z("div",{}),X=a?{onSubmit:$,..._}:_,Y=t(F,{type:"submit",disabled:u||!a||!y,"data-testid":"product-list-table-submit-button",children:n.updateButton});return o(E,{node:U,className:v(["quote-management-product-list-table-container",N]),"data-testid":"product-list-table-container",...X,children:[K,t("div",{className:"quote-management-product-list-table-container__submit-container",children:Y})]})},ke=({className:N,entries:c,...a})=>{const u=i=>{var p;const d=(p=i.children)==null?void 0:p.map(u);return t("div",{className:"quote-management-quote-prices-summary__entry","data-testid":`quote-prices-summary-entry-${i.id}`,children:d?t(ne,{className:"quote-management-quote-prices-summary__accordion","data-testid":`quote-prices-summary-entry-accordion-${i.id}`,children:t(oe,{className:"quote-management-quote-prices-summary__accordion-section",title:i.label,ariaLabelTitle:i.label,secondaryText:i.value,children:d})}):o(G,{children:[t("span",{className:v(["quote-management-quote-prices-summary__label",["quote-management-quote-prices-summary__label--strong",i.strong]]),"data-testid":`quote-prices-summary-entry-label-${i.id}`,children:i.label}),t("span",{className:"quote-management-quote-prices-summary__value","data-testid":`quote-prices-summary-entry-value-${i.id}`,children:i.value})]})},i.id)};return t("div",{className:v(["quote-management-quote-prices-summary",N]),"data-testid":"quote-prices-summary",...a,children:c==null?void 0:c.map(u)})},fe=({className:N,open:c,item:a,onClose:u,onConfirm:i,isSubmitting:d=!1,errorBanner:p,successBanner:k,showCloseButton:M=!0,readOnlyQuantity:q=!1})=>{const[_,T]=D(""),[f,h]=D(a.quantity),[b,y]=D({}),n=Z({title:"NegotiableQuote.Manage.lineItemNote.title",productLabel:"NegotiableQuote.Manage.lineItemNote.productLabel",skuLabel:"NegotiableQuote.Manage.lineItemNote.skuLabel",priceLabel:"NegotiableQuote.Manage.lineItemNote.priceLabel",stockLabel:"NegotiableQuote.Manage.lineItemNote.stockLabel",quantityLabel:"NegotiableQuote.Manage.lineItemNote.quantityLabel",discountLabel:"NegotiableQuote.Manage.lineItemNote.discountLabel",subtotalLabel:"NegotiableQuote.Manage.lineItemNote.subtotalLabel",noteLabel:"NegotiableQuote.Manage.lineItemNote.noteLabel",notePlaceholder:"NegotiableQuote.Manage.lineItemNote.notePlaceholder",noteHelper:"NegotiableQuote.Manage.lineItemNote.noteHelper",confirmButton:"NegotiableQuote.Manage.lineItemNote.confirmButton",cancelButton:"NegotiableQuote.Manage.lineItemNote.cancelButton",noteError:"NegotiableQuote.Manage.lineItemNote.noteError",quantityError:"NegotiableQuote.Manage.lineItemNote.quantityError"});re(()=>{var r;if(c){const L=((r=a.noteFromBuyer)==null?void 0:r.filter(x=>x&&x.note))||[],A=L.length>0?L[0].note:"";T(A||""),h(a.quantity),y({})}},[c,a.quantity,a.noteFromBuyer]);const I=O(()=>{const r={};if(_.trim()||(r.note=n.noteError),!q&&f<=0&&(r.quantity=n.quantityError),Object.keys(r).length>0){y(r);return}i(_.trim(),f)},[_,f,i,n,q]),P=O(()=>{T(""),h(a.quantity),y({}),u==null||u()},[u,a.quantity]);if(!c)return null;const S=a.discounts&&a.discounts.length>0?a.discounts.map(r=>r.label).join(", "):"-",B=[{label:n.productLabel,key:"productName"},{label:n.priceLabel,key:"price"},{label:n.stockLabel,key:"stock"},{label:n.quantityLabel,key:"quantity"},{label:n.discountLabel,key:"discount"},{label:n.subtotalLabel,key:"subtotal"}],$=[{productName:o("div",{className:"quote-management-line-item-note-modal__product-info",children:[t("div",{className:"quote-management-line-item-note-modal__product-name",children:a.product.name}),o("div",{className:"quote-management-line-item-note-modal__product-sku",children:[n.skuLabel,": ",a.product.sku]})]}),price:t(Q,{amount:a.prices.originalItemPrice.value,currency:a.prices.originalItemPrice.currency}),stock:t("span",{className:"quote-management-line-item-note-modal__stock",children:a.stockStatus}),quantity:q?t("span",{className:"quote-management-line-item-note-modal__quantity-readonly",children:a.quantity}):t(V,{name:"quantity",type:"number",min:"1",value:f.toString(),onInput:r=>{const L=parseInt(r.target.value,10)||0;h(L),y({...b,quantity:void 0})},disabled:d,error:!!b.quantity,required:!0,"data-testid":"line-item-note-quantity-input",className:"quote-management-line-item-note-modal__quantity-input"}),discount:t("span",{className:"quote-management-line-item-note-modal__discount",children:S}),subtotal:t(Q,{amount:a.prices.rowTotal.value,currency:a.prices.rowTotal.currency})}];return o(le,{open:c,size:"medium",title:t(G,{children:n.title}),onClose:P,clickToDismiss:!0,escapeToDismiss:!0,showCloseButton:M,className:v(["quote-management-line-item-note-modal",N]),"data-testid":"line-item-note-modal",children:[p&&t("div",{className:"quote-management-line-item-note-modal__error-banner","data-testid":"line-item-note-modal-error-banner",children:p}),k&&t("div",{className:"quote-management-line-item-note-modal__success-banner","data-testid":"line-item-note-modal-success-banner",children:k}),o("div",{className:"quote-management-line-item-note-modal__content",children:[o("div",{className:"quote-management-line-item-note-modal__details",children:[t(W,{columns:B,rowData:$,"data-testid":"line-item-note-table",mobileLayout:"stacked",className:"quote-management-line-item-note-modal__details-table"}),b.quantity&&t("div",{className:"quote-management-line-item-note-modal__table-error",children:b.quantity})]}),o("div",{className:"quote-management-line-item-note-modal__form-field",children:[t(ie,{name:"note",placeholder:n.notePlaceholder,rows:4,value:_,onInput:r=>{T(r.target.value),y({...b,note:void 0})},label:n.noteLabel,disabled:d,"data-testid":"line-item-note-textarea"}),!b.note&&t("span",{className:"quote-management-line-item-note-modal__helper-text",children:n.noteHelper}),b.note&&t("span",{className:"quote-management-line-item-note-modal__error-text",children:b.note})]})]}),o("div",{className:"quote-management-line-item-note-modal__actions",children:[t(F,{variant:"secondary",size:"medium",onClick:P,disabled:d,className:"quote-management-line-item-note-modal__cancel-button","data-testid":"line-item-note-cancel-button",children:n.cancelButton}),t(F,{variant:"primary",size:"medium",onClick:I,disabled:d,className:"quote-management-line-item-note-modal__confirm-button","data-testid":"line-item-note-confirm-button",children:n.confirmButton})]})]})};export{ye as I,fe as L,ve as P,ke as Q};
|
|
3
|
+
import{jsx as t,jsxs as n,Fragment as F}from"@dropins/tools/preact-jsx-runtime.js";import{classes as f,VComponent as D}from"@dropins/tools/lib.js";/* empty css */import{Skeleton as te,SkeletonRow as ae,Input as V,InLineAlert as oe,Picker as ne,Price as T,Checkbox as le,Button as E,Table as Z,Accordion as ie,AccordionSection as se,Modal as re,TextArea as ue}from"@dropins/tools/components.js";import{h as R}from"@dropins/tools/preact.js";import{useState as W,useEffect as ce}from"@dropins/tools/preact-hooks.js";import{g as de}from"./dateUtils.js";import{S as me}from"./WarningFilled.js";import{useText as J}from"@dropins/tools/i18n.js";import{useState as A,useEffect as be,useCallback as G}from"@dropins/tools/preact-compat.js";const Qe=({className:q,loading:d,table:o,pricesSummary:u,...i})=>d?t(pe,{}):n("div",{className:f(["quote-management-items-quoted",q]),...i,children:[o&&t(D,{node:o,className:f(["quote-management-items-quoted__table"]),"data-testid":"quote-management-items-quoted__table"}),u&&t(D,{node:u,className:f(["quote-management-items-quoted__prices-summary"]),"data-testid":"quote-management-items-quoted__prices-summary"})]}),pe=()=>t(te,{"data-testid":"items-quoted-skeleton",children:t(ae,{variant:"row",fullWidth:!0,size:"medium",lines:4,multilineGap:"xsmall"})}),Me=({className:q,items:d,canEdit:o,readOnly:u=!1,showActions:i,onItemCheckboxChange:b,onItemDropdownChange:g,onQuantityChange:k,onUpdate:S,dropdownSelections:_,...h})=>{const[I,L]=W({}),[y,p]=W({});ce(()=>{const e={};d.forEach(s=>{e[s.uid]=s.quantity}),L(e),p(e)},[d]);const v=Object.keys(y).some(e=>y[e]!==I[e]),a=J({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",seller:"NegotiableQuote.Manage.productListTable.notes.seller",outOfStock:"NegotiableQuote.Manage.productListTable.outOfStock",outOfStockMessage:"NegotiableQuote.Manage.productListTable.outOfStockMessage"}),w=[{label:a.productNameHeader,key:"productName"},{label:a.skuHeader,key:"sku"},{label:a.priceHeader,key:"price"},{label:a.quantityHeader,key:"quantity"},{label:a.discountHeader,key:"discount"},{label:a.subtotalHeader,key:"subtotal"}];o&&!u&&w.unshift({label:"",key:"checkbox"}),(i??o)&&!u&&w.push({label:a.actionsHeader,key:"actions"});const j=(e,s)=>{const r=e.target.checked;b==null||b(s,r)},P=(e,s)=>{const r=e.target.value;g==null||g(s,r)},B=(e,s)=>{const r=parseInt(e.target.value,10);!isNaN(r)&&r>0&&(p(N=>({...N,[s.uid]:r})),k==null||k(s,r))},O=e=>{e.preventDefault(),S==null||S(e)},c=(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(T,{amount:e}),")"]})]}):void 0,Q=e=>{var N,M;const s=(N=e.configurableOptions)==null?void 0:N.map(m=>n("div",{className:"quote-management-product-list-table__configurable-option",children:[n("span",{className:"quote-management-product-list-table__configurable-option-label",children:[m.optionLabel,":"]}),t("span",{className:"quote-management-product-list-table__configurable-option-value",children:m.valueLabel})]},m.optionLabel)),r=(M=e.bundleOptions)==null?void 0:M.map(m=>n("div",{className:"quote-management-product-list-table__bundle-option",children:[t("span",{className:"quote-management-product-list-table__bundle-option-label",children:m.label}),t("div",{className:"quote-management-product-list-table__bundle-option-values",children:m.values.map(l=>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:[l.quantity," x"]}),t("span",{className:"quote-management-product-list-table__bundle-option-value-label",children:l.label}),t(T,{className:"quote-management-product-list-table__bundle-option-value-original-price",amount:l.originalPrice.value,currency:l.originalPrice.currency,weight:"normal"})]},l.label))})]},m.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,r]})},$=e=>new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0,timeZone:de()}),H=e=>{var M,m;const s=((M=e.noteFromBuyer)==null?void 0:M.filter(l=>l&&l.note&&l.note.trim()!==""))||[],r=((m=e.noteFromSeller)==null?void 0:m.filter(l=>l&&l.note&&l.note.trim()!==""))||[],N=[...s,...r];return N.length===0?null:n("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:a.notesHeader}),t("div",{className:"quote-management-product-list-table__notes-list",children:N.map((l,ee)=>n("div",{className:"quote-management-product-list-table__note-item",children:[n("div",{className:"quote-management-product-list-table__note-content",children:[n("strong",{className:"quote-management-product-list-table__note-meta",children:[$(l.createdAt)," (",s.includes(l)?a.buyer:a.seller,")"]})," ",a.leftANote]}),n("div",{className:"quote-management-product-list-table__note-text",children:[l.note," "]})]},l.noteUid||ee))})]})},z=new Set,K=d.flatMap((e,s)=>{var m;const r=H(e);(r||e.outOfStock)&&z.add(s);const N=o?t(V,{className:"quote-management-product-list-table__quantity-input",type:"number",min:"1",value:((m=y[e.uid])==null?void 0:m.toString())||e.quantity.toString(),onChange:l=>B(l,e),disabled:u||!o,"data-testid":`quantity-input-${e.product.sku}`}):t("span",{className:"quote-management-product-list-table__quantity",children:e.quantity});return[{checkbox:t(le,{className:"quote-management-product-list-table__checkbox",name:"itemSelected","data-testid":`item-checkbox-${e.product.sku}`,onChange:l=>j(l,e),value:e.product.sku}),productName:Q(e),sku:t("span",{className:"quote-management-product-list-table__sku",children:e.product.sku}),price:t(T,{className:"quote-management-product-list-table__price",amount:e.prices.originalItemPrice.value,currency:e.prices.originalItemPrice.currency}),quantity:N,discount:e.catalogDiscount?c(e.catalogDiscount.amountOff,e.catalogDiscount.percentOff):void 0,subtotal:t(T,{className:"quote-management-product-list-table__subtotal",amount:e.prices.rowTotal.value,currency:e.prices.rowTotal.currency}),actions:t(ne,{className:"quote-management-product-list-table__actions","data-testid":`item-dropdown-${e.product.sku}`,name:`item-dropdown-${e.product.sku}`,handleSelect:l=>P(l,e),placeholder:"Select",value:(_==null?void 0:_[e.uid])??"",options:[{text:a.editNoteToSeller,value:"edit"},{text:a.remove,value:"remove"}]}),_rowDetails:n(F,{children:[e.outOfStock&&t("div",{className:"quote-management-product-list-table__out-of-stock-message",children:t(oe,{type:"warning",variant:"primary",icon:t(me,{}),heading:a.outOfStock,description:a.outOfStockMessage})}),r&&t("div",{className:"quote-management-product-list-table__notes-row-wrapper",children:r})]})}]}),U=t(Z,{columns:w,rowData:K,"data-testid":"product-list-table",mobileLayout:"stacked",expandedRows:z}),X=o?R("form",{}):R("div",{}),Y=o?{onSubmit:O,...h}:h,C=t(E,{type:"submit",disabled:u||!o||!v,"data-testid":"product-list-table-submit-button",children:a.updateButton});return n(D,{node:X,className:f(["quote-management-product-list-table-container",q]),"data-testid":"product-list-table-container",...Y,children:[U,t("div",{className:"quote-management-product-list-table-container__submit-container",children:C})]})},Te=({className:q,entries:d,...o})=>{const u=i=>{var g;const b=(g=i.children)==null?void 0:g.map(u);return t("div",{className:"quote-management-quote-prices-summary__entry","data-testid":`quote-prices-summary-entry-${i.id}`,children:b?t(ie,{className:"quote-management-quote-prices-summary__accordion","data-testid":`quote-prices-summary-entry-accordion-${i.id}`,children:t(se,{className:"quote-management-quote-prices-summary__accordion-section",title:i.label,ariaLabelTitle:i.label,secondaryText:i.value,children:b})}):n(F,{children:[t("span",{className:f(["quote-management-quote-prices-summary__label",["quote-management-quote-prices-summary__label--strong",i.strong]]),"data-testid":`quote-prices-summary-entry-label-${i.id}`,children:i.label}),t("span",{className:"quote-management-quote-prices-summary__value","data-testid":`quote-prices-summary-entry-value-${i.id}`,children:i.value})]})},i.id)};return t("div",{className:f(["quote-management-quote-prices-summary",q]),"data-testid":"quote-prices-summary",...o,children:d==null?void 0:d.map(u)})},Se=({className:q,open:d,item:o,onClose:u,onConfirm:i,isSubmitting:b=!1,errorBanner:g,successBanner:k,showCloseButton:S=!0,readOnlyQuantity:_=!1})=>{const[h,I]=A(""),[L,y]=A(o.quantity),[p,v]=A({}),a=J({title:"NegotiableQuote.Manage.lineItemNote.title",productLabel:"NegotiableQuote.Manage.lineItemNote.productLabel",skuLabel:"NegotiableQuote.Manage.lineItemNote.skuLabel",priceLabel:"NegotiableQuote.Manage.lineItemNote.priceLabel",stockLabel:"NegotiableQuote.Manage.lineItemNote.stockLabel",quantityLabel:"NegotiableQuote.Manage.lineItemNote.quantityLabel",discountLabel:"NegotiableQuote.Manage.lineItemNote.discountLabel",subtotalLabel:"NegotiableQuote.Manage.lineItemNote.subtotalLabel",noteLabel:"NegotiableQuote.Manage.lineItemNote.noteLabel",notePlaceholder:"NegotiableQuote.Manage.lineItemNote.notePlaceholder",noteHelper:"NegotiableQuote.Manage.lineItemNote.noteHelper",confirmButton:"NegotiableQuote.Manage.lineItemNote.confirmButton",cancelButton:"NegotiableQuote.Manage.lineItemNote.cancelButton",noteError:"NegotiableQuote.Manage.lineItemNote.noteError",quantityError:"NegotiableQuote.Manage.lineItemNote.quantityError"});be(()=>{var c;if(d){const Q=((c=o.noteFromBuyer)==null?void 0:c.filter(H=>H&&H.note))||[],$=Q.length>0?Q[0].note:"";I($||""),y(o.quantity),v({})}},[d,o.quantity,o.noteFromBuyer]);const w=G(()=>{const c={};if(h.trim()||(c.note=a.noteError),!_&&L<=0&&(c.quantity=a.quantityError),Object.keys(c).length>0){v(c);return}i(h.trim(),L)},[h,L,i,a,_]),x=G(()=>{I(""),y(o.quantity),v({}),u==null||u()},[u,o.quantity]);if(!d)return null;const P=o.discounts&&o.discounts.length>0?o.discounts.map(c=>c.label).join(", "):"-",B=[{label:a.productLabel,key:"productName"},{label:a.priceLabel,key:"price"},{label:a.stockLabel,key:"stock"},{label:a.quantityLabel,key:"quantity"},{label:a.discountLabel,key:"discount"},{label:a.subtotalLabel,key:"subtotal"}],O=[{productName:n("div",{className:"quote-management-line-item-note-modal__product-info",children:[t("div",{className:"quote-management-line-item-note-modal__product-name",children:o.product.name}),n("div",{className:"quote-management-line-item-note-modal__product-sku",children:[a.skuLabel,": ",o.product.sku]})]}),price:t(T,{amount:o.prices.originalItemPrice.value,currency:o.prices.originalItemPrice.currency}),stock:t("span",{className:"quote-management-line-item-note-modal__stock",children:o.stockStatus}),quantity:_?t("span",{className:"quote-management-line-item-note-modal__quantity-readonly",children:o.quantity}):t(V,{name:"quantity",type:"number",min:"1",value:L.toString(),onInput:c=>{const Q=parseInt(c.target.value,10)||0;y(Q),v({...p,quantity:void 0})},disabled:b,error:!!p.quantity,required:!0,"data-testid":"line-item-note-quantity-input",className:"quote-management-line-item-note-modal__quantity-input"}),discount:t("span",{className:"quote-management-line-item-note-modal__discount",children:P}),subtotal:t(T,{amount:o.prices.rowTotal.value,currency:o.prices.rowTotal.currency})}];return n(re,{open:d,size:"medium",title:t(F,{children:a.title}),onClose:x,clickToDismiss:!0,escapeToDismiss:!0,showCloseButton:S,className:f(["quote-management-line-item-note-modal",q]),"data-testid":"line-item-note-modal",children:[g&&t("div",{className:"quote-management-line-item-note-modal__error-banner","data-testid":"line-item-note-modal-error-banner",children:g}),k&&t("div",{className:"quote-management-line-item-note-modal__success-banner","data-testid":"line-item-note-modal-success-banner",children:k}),n("div",{className:"quote-management-line-item-note-modal__content",children:[n("div",{className:"quote-management-line-item-note-modal__details",children:[t(Z,{columns:B,rowData:O,"data-testid":"line-item-note-table",mobileLayout:"stacked",className:"quote-management-line-item-note-modal__details-table"}),p.quantity&&t("div",{className:"quote-management-line-item-note-modal__table-error",children:p.quantity})]}),n("div",{className:"quote-management-line-item-note-modal__form-field",children:[t(ue,{name:"note",placeholder:a.notePlaceholder,rows:4,value:h,onInput:c=>{I(c.target.value),v({...p,note:void 0})},label:a.noteLabel,disabled:b,"data-testid":"line-item-note-textarea"}),!p.note&&t("span",{className:"quote-management-line-item-note-modal__helper-text",children:a.noteHelper}),p.note&&t("span",{className:"quote-management-line-item-note-modal__error-text",children:p.note})]})]}),n("div",{className:"quote-management-line-item-note-modal__actions",children:[t(E,{variant:"secondary",size:"medium",onClick:x,disabled:b,className:"quote-management-line-item-note-modal__cancel-button","data-testid":"line-item-note-cancel-button",children:a.cancelButton}),t(E,{variant:"primary",size:"medium",onClick:w,disabled:b,className:"quote-management-line-item-note-modal__confirm-button","data-testid":"line-item-note-confirm-button",children:a.confirmButton})]})]})};export{Qe as I,Se as L,Me as P,Te as Q};
|
|
4
4
|
//# sourceMappingURL=LineItemNoteModal.js.map
|