@dropins/storefront-quote-management 0.0.1-alpha32 → 0.0.1-alpha33
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/LICENSE.md +25 -26
- package/api/getStoreConfig/graphql/StoreConfigQuery.d.ts +1 -1
- package/api.js +5 -3
- package/api.js.map +1 -1
- package/chunks/state.js +1 -1
- package/chunks/state.js.map +1 -1
- package/chunks/transform-quote.js +1 -1
- package/chunks/transform-quote.js.map +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/QuoteTemplatesListTable.js +1 -1
- package/containers/QuoteTemplatesListTable.js.map +1 -1
- package/containers/QuotesListTable.js +1 -1
- package/containers/QuotesListTable.js.map +1 -1
- package/data/models/store-config-model.d.ts +2 -0
- package/data/transforms/__fixtures__/storeConfigData.d.ts +4 -0
- package/i18n/en_US.json.d.ts +0 -10
- package/package.json +1 -1
- package/render.js +1 -1
- package/render.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-quote.js","sources":["/@dropins/storefront-quote-management/src/data/models/negotiable-quote-model.ts","/@dropins/storefront-quote-management/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-history.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote-items.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport interface ShippingAddress {\n /**\n * The unique string identifier of the address\n */\n uid?: string;\n firstname: string;\n lastname: string;\n company?: string;\n street: string[];\n city: string;\n region?: {\n code: string;\n label: string;\n regionId: number;\n };\n postcode: string;\n country: {\n code: string;\n label: string;\n };\n telephone: string;\n}\n\nexport interface NegotiableQuoteModel {\n uid: string;\n name: string;\n createdAt: string;\n salesRepName: string;\n expirationDate: string;\n updatedAt: string;\n status: NegotiableQuoteStatus;\n isVirtual: boolean;\n buyer: {\n firstname: string;\n lastname: string;\n };\n templateName?: string;\n totalQuantity: number;\n comments?: {\n uid: string;\n createdAt: string;\n author: {\n firstname: string;\n lastname: string;\n };\n text: string;\n attachments?: {\n name: string;\n url: string;\n }[];\n }[];\n history?: NegotiableQuoteHistoryEntry[];\n prices: {\n appliedDiscounts?: Discount[];\n appliedTaxes?: Tax[];\n discount?: Currency;\n grandTotal?: Currency;\n grandTotalExcludingTax?: Currency;\n shippingExcludingTax?: Currency;\n shippingIncludingTax?: Currency;\n subtotalExcludingTax?: Currency;\n subtotalIncludingTax?: Currency;\n subtotalWithDiscountExcludingTax?: Currency;\n totalTax?: Currency;\n };\n items: CartItemModel[];\n shippingAddresses?: ShippingAddress[];\n canCheckout: boolean;\n canSendForReview: boolean;\n lockedForEditing?: boolean;\n canDelete: boolean;\n canClose: boolean;\n canUpdateQuote: boolean;\n readOnly: boolean;\n}\n\nexport interface ConfigurableOption {\n optionLabel: string;\n valueLabel: string;\n}\n\nexport interface BundleOption {\n label: string;\n values: {\n label: string;\n quantity: number;\n originalPrice: Currency;\n price: Currency;\n }[];\n}\n\nexport interface CustomizableOption {\n type: string;\n label: string;\n values: {\n label: string;\n value: string;\n }[];\n}\n\nexport interface CartItemModel {\n itemType: string;\n uid: string;\n product: {\n uid: string;\n sku: string;\n name: string;\n templateId?: string;\n templateName?: string;\n priceRange: {\n maximumPrice: {\n regularPrice: Currency;\n };\n };\n };\n image: ItemImage;\n links?: ItemLinks;\n discounted: boolean;\n discountedTotal: Currency;\n catalogDiscount: {\n amountOff: number;\n percentOff: number;\n };\n discounts: {\n label: string;\n value: string;\n amount: Currency;\n }[];\n discountPercentage?: number;\n insufficientQuantity?: boolean;\n outOfStock?: boolean;\n stockStatus: string;\n quantity: number;\n prices: {\n regularPrice: Currency;\n priceIncludingTax: Currency;\n originalItemPrice: Currency;\n originalRowTotal: Currency;\n rowTotal: Currency;\n rowTotalIncludingTax: Currency;\n };\n savingsAmount?: Currency;\n configurableOptions?: ConfigurableOption[];\n bundleOptions?: BundleOption[];\n customizableOptions?: CustomizableOption[];\n noteFromBuyer?: ItemNote[];\n noteFromSeller?: ItemNote[];\n}\n\ninterface ItemImage {\n src: string;\n alt: string;\n}\n\ninterface ItemLinks {\n count: number;\n result: string;\n}\n\nexport interface ItemNote {\n createdAt: string;\n creatorId: number;\n creatorType: number;\n negotiableQuoteItemUid: string;\n note: string;\n noteUid: string;\n}\n\nexport interface Currency {\n value: number;\n currency: string;\n}\n\nexport interface Tax {\n amount: Currency;\n label: string;\n}\n\nexport interface Discount {\n amount: Currency;\n label: string;\n coupon?: Coupon;\n}\n\nexport interface Coupon {\n code: string;\n}\n\nexport interface NegotiableQuoteListEntry {\n uid: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n status: NegotiableQuoteStatus;\n buyer: {\n firstname: string;\n lastname: string;\n };\n templateName: string;\n prices: {\n grandTotal: Currency;\n };\n}\nexport interface NegotiableQuotesListModel {\n items: NegotiableQuoteListEntry[];\n pageInfo: {\n currentPage: number;\n pageSize: number;\n totalPages: number;\n };\n totalCount: number;\n paginationInfo?: PaginationInfo;\n sortFields?: {\n default: string;\n options: Array<{\n label: string;\n value: string;\n }>;\n };\n}\n\nexport interface NegotiableQuoteHistoryEntry {\n author: {\n firstname: string;\n lastname: string;\n };\n changeType: NegotiableQuoteHistoryEntryChangeType;\n changes: {\n commentAdded?: {\n comment: string;\n };\n customChanges?: {\n new_value: string;\n old_value: string;\n title: string;\n };\n expiration?: {\n newExpiration: string;\n oldExpiration: string;\n };\n productsRemoved?: {\n productsRemovedFromCatalog: string[];\n productsRemovedFromQuote?: {\n uid: string;\n name: string;\n sku: string;\n quantity: number;\n }[];\n };\n statuses?: {\n changes: {\n newStatus: string;\n oldStatus: string;\n }[];\n };\n total?: {\n newPrice: Currency;\n oldPrice: Currency;\n };\n };\n createdAt: string;\n uid: string;\n}\n\nexport enum NegotiableQuoteHistoryEntryChangeType {\n CREATED = 'CREATED',\n UPDATED = 'UPDATED',\n CLOSED = 'CLOSED',\n UPDATED_BY_SYSTEM = 'UPDATED_BY_SYSTEM',\n}\n\n// See: https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/quotes/quotes#quote-status\nexport enum NegotiableQuoteStatus {\n NEW = 'NEW', // Currently not returned by the API, but is used to indicate a new quote\n SUBMITTED = 'SUBMITTED',\n PENDING = 'PENDING',\n UPDATED = 'UPDATED',\n OPEN = 'OPEN',\n ORDERED = 'ORDERED',\n CLOSED = 'CLOSED',\n DECLINED = 'DECLINED',\n EXPIRED = 'EXPIRED',\n DRAFT = 'DRAFT',\n}\n\nexport interface PaginationInfo {\n currentPage: number;\n totalCount: number;\n pageSize: number;\n startItem: number;\n endItem: number;\n totalPages: number;\n pageSizeOptions?: number[];\n}\n","import { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\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 { NegotiableQuoteHistoryEntry, NegotiableQuoteHistoryEntryChangeType } from '../models/negotiable-quote-model';\n\n/**\n * Transforms a history entry from the API format to the model format\n * @param historyEntry - Raw history entry from API\n * @returns Transformed history entry\n */\nexport function transformHistoryEntry(\n historyEntry: any\n): NegotiableQuoteHistoryEntry {\n return {\n uid: historyEntry.uid,\n createdAt: historyEntry.created_at,\n author: {\n firstname: historyEntry.author.firstname,\n lastname: historyEntry.author.lastname,\n },\n changeType: historyEntry.change_type as NegotiableQuoteHistoryEntryChangeType,\n changes: {\n commentAdded: historyEntry.changes?.comment_added && {\n comment: historyEntry.changes.comment_added.comment,\n },\n customChanges: historyEntry.changes?.custom_changes && {\n new_value: historyEntry.changes.custom_changes.new_value,\n old_value: historyEntry.changes.custom_changes.old_value,\n title: historyEntry.changes.custom_changes.title,\n },\n expiration: historyEntry.changes?.expiration && {\n newExpiration: historyEntry.changes.expiration.new_expiration,\n oldExpiration: historyEntry.changes.expiration.old_expiration,\n },\n productsRemoved: historyEntry.changes?.products_removed && {\n productsRemovedFromCatalog:\n historyEntry.changes.products_removed.products_removed_from_catalog ||\n [],\n productsRemovedFromQuote:\n historyEntry.changes.products_removed.products_removed_from_quote ||\n [],\n },\n statuses: historyEntry.changes?.statuses && {\n changes:\n historyEntry.changes.statuses.changes?.map((change: any) => ({\n newStatus: change?.new_status,\n oldStatus: change?.old_status,\n })) || [],\n },\n total:\n historyEntry.changes?.total &&\n historyEntry.changes.total.new_price &&\n historyEntry.changes.total.old_price && {\n newPrice: {\n value: historyEntry.changes.total.new_price.value,\n currency: historyEntry.changes.total.new_price.currency,\n },\n oldPrice: {\n value: historyEntry.changes.total.old_price.value,\n currency: historyEntry.changes.total.old_price.currency,\n },\n },\n },\n };\n}\n\n/**\n * Transforms an array of history entries from the API format to the model format\n * @param historyEntries - Array of raw history entries from API\n * @returns Array of transformed history entries\n */\nexport function transformHistory(\n historyEntries: any[] | null | undefined\n): NegotiableQuoteHistoryEntry[] | undefined {\n if (!historyEntries) {\n return undefined;\n }\n\n return historyEntries.map(transformHistoryEntry);\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 { CartItemModel } from '../models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\n\n/**\n * Finds the most applicable price tier for a given quantity\n * @param priceTiers - Array of price tier objects\n * @param quantity - Current item quantity\n * @returns The applicable tier or null if none found\n */\nfunction findApplicablePriceTier(priceTiers: any[], quantity: number) {\n if (!priceTiers?.length) return null;\n\n // Sort price tiers by quantity in descending order to find the highest applicable tier\n const sortedTiers = [...priceTiers].sort(\n (a: any, b: any) => b.quantity - a.quantity\n );\n\n // Find the highest tier where the current quantity meets or exceeds the tier's minimum quantity\n return sortedTiers.find((tier: any) => quantity >= tier.quantity) || null;\n}\n\n/**\n * Helper function to get the image for a cart item component\n * @param item - Cart item from API\n * @returns Image object with src and alt\n */\nfunction getImage(item: any) {\n const config = state.config;\n\n return {\n // Use parent thumbnail if configured, otherwise use own variant. Use the parent thumbnail as a fallback\n src: config?.useConfigurableParentThumbnail\n ? item.product.thumbnail.url\n : item.configured_variant?.thumbnail?.url || item.product.thumbnail.url,\n alt: config?.useConfigurableParentThumbnail\n ? item.product.thumbnail.label\n : item.configured_variant?.thumbnail?.label ||\n item.product.thumbnail.label,\n };\n}\n\n/**\n * Helper function to get downloadable links for a cart item component\n * @param item - Cart item from API\n * @returns Links object with count and result, or null if no links\n */\nfunction getLinks(item: any) {\n return item.links?.length > 0\n ? {\n count: item.links.length,\n result: item.links.map((link: any) => link.title).join(', '),\n }\n : null;\n}\n\n/**\n * Helper function to check if an item is discounted\n * @param item - Cart item from API\n * @returns True if the item has a discount\n */\nfunction getDiscounted(item: any) {\n const quantity = item.quantity;\n const isConfigurable = item.__typename === 'ConfigurableCartItem';\n\n // Get price tiers and price range based on item type\n const priceTiers = isConfigurable\n ? item.configured_variant?.price_tiers\n : item.product.price_tiers;\n const priceRange = isConfigurable\n ? item.configured_variant?.price_range\n : item.product.price_range;\n\n // Check price tiers first for discount eligibility\n const applicableTier = findApplicablePriceTier(priceTiers, quantity);\n if (applicableTier) {\n return applicableTier.discount.amount_off > 0;\n }\n\n // Fallback to regular price range discount\n return (priceRange?.maximum_price?.discount?.amount_off ?? 0) > 0;\n}\n\n/**\n * Helper function to get the discount percentage of an item\n * @param item - Cart item from API\n * @returns Discount percentage rounded to nearest integer, or undefined if no discount\n */\nfunction getDiscountPercentage(item: any) {\n const quantity = item.quantity;\n\n // Check price tiers first for discount percentage\n const applicableTier = findApplicablePriceTier(\n item.product.price_tiers,\n quantity\n );\n\n if (applicableTier) {\n return Math.round(applicableTier.discount.percent_off);\n }\n\n // Fallback to product-specific discount percentage\n let percent_off;\n\n if (item.__typename === 'ConfigurableCartItem') {\n percent_off =\n item?.configured_variant?.price_range?.maximum_price?.discount\n ?.percent_off;\n } else if (item.__typename === 'BundleCartItem') {\n return undefined;\n } else {\n percent_off =\n item?.product?.price_range?.maximum_price?.discount?.percent_off;\n }\n\n if (percent_off === 0) {\n return undefined;\n }\n\n return Math.round(percent_off);\n}\n\n/**\n * Helper function to get the regular price of an item\n * @param item - Cart item from API\n * @returns Regular price object with value and currency\n */\nfunction getRegularPrice(item: any) {\n if (item.__typename === 'ConfigurableCartItem') {\n return {\n value:\n item.configured_variant?.price_range?.maximum_price.regular_price.value,\n currency:\n item.configured_variant?.price_range?.maximum_price.regular_price\n .currency,\n };\n }\n return {\n value: item.prices.original_item_price.value,\n currency: item.prices.original_item_price.currency,\n };\n}\n\n/**\n * Helper function to get the savings amount of an item\n * @param item - Cart item from API\n * @returns Savings amount object with value and currency, or undefined if no savings\n */\nfunction getSavingsAmount(item: any) {\n let amount_off;\n let currency;\n\n amount_off =\n item?.prices?.original_row_total?.value - item?.prices?.row_total?.value;\n currency = item?.prices?.row_total?.currency;\n\n if (amount_off === 0) {\n return undefined;\n }\n return {\n value: amount_off,\n currency,\n };\n}\n\n/**\n * Transforms a single quote item from the API format to the model format\n * @param item - Raw quote item from API\n * @returns Transformed quote item\n */\nexport function transformQuoteItem(item: any): CartItemModel {\n return {\n itemType: item.__typename,\n uid: item.uid,\n product: {\n uid: item.product.uid,\n sku: item.product.sku,\n name: item.product.name,\n priceRange: {\n maximumPrice: {\n regularPrice: {\n value:\n item.product.price_range.maximum_price.regular_price.value,\n currency:\n item.product.price_range.maximum_price.regular_price.currency,\n },\n },\n },\n },\n image: getImage(item),\n links: getLinks(item),\n discounted: getDiscounted(item),\n discountedTotal: {\n value: item.prices.row_total.value,\n currency: item.prices.row_total.currency,\n },\n catalogDiscount: {\n amountOff: item.prices.catalog_discount.amount_off,\n percentOff: item.prices.catalog_discount.percent_off,\n },\n discounts:\n item.prices?.discounts?.map((discount: any) => ({\n label: discount.label,\n value: discount.value,\n amount: {\n value: discount.amount.value,\n currency: discount.amount.currency,\n },\n })) ?? [],\n discountPercentage: getDiscountPercentage(item),\n insufficientQuantity:\n (item.__typename === 'ConfigurableCartItem'\n ? item.configured_variant?.stock_status ?? item.product.stock_status\n : item.product.stock_status\n ) === 'IN_STOCK' && !item.is_available,\n outOfStock: item.product.stock_status === 'OUT_OF_STOCK',\n stockStatus: item.product.stock_status,\n quantity: item.quantity,\n prices: {\n regularPrice: getRegularPrice(item),\n priceIncludingTax: {\n value: item.prices.price_including_tax.value,\n currency: item.prices.price_including_tax.currency,\n },\n originalItemPrice: {\n value: item.prices.original_item_price.value,\n currency: item.prices.original_item_price.currency,\n },\n originalRowTotal: {\n value: item.prices.original_row_total.value,\n currency: item.prices.original_row_total.currency,\n },\n rowTotal: {\n value: item.prices.row_total.value,\n currency: item.prices.row_total.currency,\n },\n rowTotalIncludingTax: {\n value: item.prices.row_total_including_tax.value,\n currency: item.prices.row_total_including_tax.currency,\n },\n },\n savingsAmount: getSavingsAmount(item),\n noteFromBuyer: item.note_from_buyer?.map((note: any) => ({\n createdAt: note.created_at,\n creatorId: note.creator_id,\n creatorType: note.creator_type,\n negotiableQuoteItemUid: note.negotiable_quote_item_uid,\n note: note.note,\n noteUid: note.note_uid,\n })),\n noteFromSeller: item.note_from_seller?.map((note: any) => ({\n createdAt: note.created_at,\n creatorId: note.creator_id,\n creatorType: note.creator_type,\n negotiableQuoteItemUid: note.negotiable_quote_item_uid,\n note: note.note,\n noteUid: note.note_uid,\n })),\n configurableOptions: item.configurable_options?.map((option: any) => ({\n optionLabel: option.option_label,\n valueLabel: option.value_label,\n })),\n bundleOptions: item.bundle_options?.map((option: any) => ({\n label: option.label,\n values: option.values.map((value: any) => ({\n label: value.label,\n quantity: value.quantity,\n originalPrice: {\n value: value.original_price.value,\n currency: value.original_price.currency,\n },\n price: {\n value: value.priceV2.value,\n currency: value.priceV2.currency,\n },\n })),\n })),\n customizableOptions: item.customizable_options?.map((option: any) => ({\n type: option.type,\n label: option.label,\n values: option.values.map((value: any) => ({\n label: value.label,\n value: value.value,\n })),\n })),\n };\n}\n\n/**\n * Transforms an array of quote items from the API format to the model format\n * @param items - Array of raw quote items from API\n * @returns Array of transformed quote items\n */\nexport function transformQuoteItems(\n items: any[] | null | undefined\n): CartItemModel[] {\n if (!items) {\n return [];\n }\n\n return items.map(transformQuoteItem);\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 CartItemModel,\n NegotiableQuoteListEntry,\n NegotiableQuoteModel,\n NegotiableQuotesListModel,\n NegotiableQuoteStatus,\n PaginationInfo,\n ShippingAddress,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\nimport { transformHistory } from './transform-history';\nimport { transformQuoteItems } from './transform-quote-items';\n\n// Quote statuses that allow editing/sending for review\nconst EDITABLE_QUOTE_STATUSES = [\n 'DRAFT',\n 'UPDATED',\n 'DECLINED',\n 'EXPIRED',\n 'NEW',\n 'OPEN',\n] as const;\n\n// Helper function to get the total quantity of a quote (number of quote line items or total quantity)\nfunction getTotalQuantity(quote: any) {\n if (!quote.items) return 0;\n\n const config = state.config;\n\n if (config?.quoteSummaryDisplayTotal === 0) return quote.items.length;\n if (config?.quoteSummaryDisplayTotal === 1) return quote.total_quantity;\n // Default to items count if unexpected config value or error returned\n return quote.items.length;\n}\n\nfunction checkAllItemsHaveStock(items: CartItemModel[]): boolean {\n return items.every((item) => !item.outOfStock && !item.insufficientQuantity);\n}\n\n// Base helper that transforms a single quote object directly\nfunction transformSingleQuote(quote: any): NegotiableQuoteModel {\n const isQuoteNew = isNewQuote(quote);\n const quoteItems = transformQuoteItems(quote.items);\n return {\n uid: quote.uid,\n name: quote.name,\n createdAt: quote.created_at,\n updatedAt: quote.updated_at,\n expirationDate: quote.expiration_date,\n status: isQuoteNew ? NegotiableQuoteStatus.NEW : quote.status,\n isVirtual: Boolean(quote.is_virtual),\n salesRepName: quote.sales_rep_name,\n buyer: {\n firstname: quote.buyer.firstname,\n lastname: quote.buyer.lastname,\n },\n templateName: quote.template_name,\n totalQuantity: getTotalQuantity(quote),\n comments: quote.comments?.map((comment: any) => {\n const baseComment: any = {\n uid: comment.uid,\n createdAt: comment.created_at,\n author: {\n firstname: comment.author.firstname,\n lastname: comment.author.lastname,\n },\n text: comment.text,\n };\n\n if (\n Array.isArray(comment.attachments) &&\n comment.attachments.length > 0\n ) {\n baseComment.attachments = comment.attachments.map((a: any) => ({\n name: a.name,\n url: a.url,\n }));\n }\n\n return baseComment;\n }),\n prices: quote.prices && {\n appliedDiscounts: quote.prices.discounts?.map((discount: any) => ({\n amount: {\n value: discount.amount.value,\n currency: discount.amount.currency,\n },\n label: discount.label,\n coupon: discount.coupon,\n })),\n appliedTaxes: quote.prices.applied_taxes?.map((tax: any) => ({\n amount: { value: tax.amount.value, currency: tax.amount.currency },\n label: tax.label,\n })),\n discount:\n quote.prices.discounts &&\n quote.prices.grand_total &&\n calculateTotal(\n quote.prices.discounts,\n quote.prices.grand_total.currency\n ),\n grandTotal: quote.prices.grand_total && {\n value: quote.prices.grand_total.value,\n currency: quote.prices.grand_total.currency,\n },\n grandTotalExcludingTax: quote.prices.grand_total_excluding_tax && {\n value: quote.prices.grand_total_excluding_tax.value,\n currency: quote.prices.grand_total_excluding_tax.currency,\n },\n subtotalExcludingTax: quote.prices.subtotal_excluding_tax && {\n value: quote.prices.subtotal_excluding_tax.value,\n currency: quote.prices.subtotal_excluding_tax.currency,\n },\n subtotalIncludingTax: quote.prices.subtotal_including_tax && {\n value: quote.prices.subtotal_including_tax.value,\n currency: quote.prices.subtotal_including_tax.currency,\n },\n subtotalWithDiscountExcludingTax: quote.prices\n .subtotal_with_discount_excluding_tax && {\n value: quote.prices.subtotal_with_discount_excluding_tax.value,\n currency: quote.prices.subtotal_with_discount_excluding_tax.currency,\n },\n ...transformShippingPrices(quote),\n totalTax:\n quote.prices.applied_taxes &&\n quote.prices.grand_total &&\n calculateTotal(\n quote.prices.applied_taxes,\n quote.prices.grand_total.currency\n ),\n },\n history: transformHistory(quote.history),\n items: quoteItems,\n shippingAddresses: quote.shipping_addresses?.map((address: any) => {\n const shippingAddress: ShippingAddress = {\n uid: address.uid,\n firstname: address.firstname,\n lastname: address.lastname,\n company: address.company,\n street: address.street,\n city: address.city,\n postcode: address.postcode,\n country: {\n code: address.country.code,\n label: address.country.label,\n },\n telephone: address.telephone,\n };\n\n if (address.region) {\n shippingAddress.region = {\n code: address.region.code,\n label: address.region.label,\n regionId: address.region.region_id,\n };\n }\n\n return shippingAddress;\n }),\n canCheckout:\n ['UPDATED', 'DECLINED'].includes(quote.status) &&\n state.permissions.checkoutQuote &&\n quote.shipping_addresses?.length > 0 &&\n checkAllItemsHaveStock(quoteItems),\n canSendForReview:\n (isQuoteNew || EDITABLE_QUOTE_STATUSES.includes(quote.status)) &&\n state.permissions.editQuote,\n canUpdateQuote:\n (isQuoteNew || EDITABLE_QUOTE_STATUSES.includes(quote.status)) &&\n state.permissions.editQuote,\n canDelete:\n !['PENDING', 'SUBMITTED', 'ORDERED'].includes(quote.status) &&\n state.permissions.deleteQuote,\n canClose: quote.status\n ? !['DRAFT', 'CLOSED', 'ORDERED', 'OPEN'].includes(quote.status)\n : false,\n readOnly:\n (!isQuoteNew &&\n ['ORDERED', 'SUBMITTED', 'CLOSED', 'PENDING'].includes(quote.status)) ||\n !state.permissions.editQuote,\n };\n}\n\nexport function transformQuote(quoteData: any): NegotiableQuoteModel | null {\n if (!quoteData) {\n return null;\n }\n\n return transformSingleQuote(quoteData);\n}\n\n// quote is new if it has a status of SUBMITTED and there is no history entry that\n// has a change_type of UPDATED with a non-empty array of status changes\nfunction isNewQuote(quote: any): boolean {\n return (\n quote.status === 'SUBMITTED' &&\n !(quote.history ?? []).some(\n (history: any) =>\n history.change_type === 'UPDATED' &&\n (history.changes?.statuses?.changes ?? []).length > 0\n )\n );\n}\n\nfunction transformNegotiableQuoteListEntry(\n quote: any\n): NegotiableQuoteListEntry {\n const isQuoteNew = isNewQuote(quote);\n return {\n uid: quote.uid,\n name: quote.name,\n createdAt: quote.created_at,\n updatedAt: quote.updated_at,\n status: isQuoteNew ? NegotiableQuoteStatus.NEW : quote.status,\n buyer: {\n firstname: quote.buyer.firstname,\n lastname: quote.buyer.lastname,\n },\n templateName: quote.template_name,\n prices: {\n grandTotal: {\n value: quote.prices.grand_total.value,\n currency: quote.prices.grand_total.currency,\n },\n },\n };\n}\n\nexport function transformNegotiableQuotesList(\n quotesData: any\n): NegotiableQuotesListModel | null {\n if (!quotesData) {\n return null;\n }\n\n const transformedModel = {\n items:\n quotesData.items\n ?.filter((quote: any) => quote?.uid)\n .map(transformNegotiableQuoteListEntry) || [],\n pageInfo: {\n currentPage: quotesData.page_info.current_page,\n pageSize: quotesData.page_info.page_size,\n totalPages: quotesData.page_info.total_pages,\n },\n totalCount: quotesData.total_count,\n sortFields: quotesData.sort_fields\n ? {\n default: quotesData.sort_fields.default,\n options: quotesData.sort_fields.options,\n }\n : undefined,\n };\n\n // Calculate pagination info\n const paginationInfo = transformPaginationInfo(transformedModel);\n\n return {\n ...transformedModel,\n paginationInfo: paginationInfo || undefined,\n };\n}\n\nexport function transformPaginationInfo(\n quotesData: NegotiableQuotesListModel | null\n): PaginationInfo | null {\n if (!quotesData?.pageInfo || !quotesData.totalCount) {\n return null;\n }\n\n const { currentPage, pageSize, totalPages } = quotesData.pageInfo;\n const { totalCount } = quotesData;\n\n const startItem = totalCount > 0 ? (currentPage - 1) * pageSize + 1 : 0;\n const endItem = Math.min(currentPage * pageSize, totalCount);\n\n const pageSizeOptions = [20, 30, 50, 100, 200]; // Default page size options\n\n return {\n currentPage,\n totalCount,\n pageSize,\n startItem,\n endItem,\n totalPages,\n pageSizeOptions,\n };\n}\n\n// TODO: Check if admin has this configuration\nexport const getDefaultPageSizeOptions = () => [20, 30, 50, 100, 200];\n\nexport function calculateTotal(data: any[], currency: string) {\n if (!data?.length)\n return {\n value: 0,\n currency,\n };\n\n return data.reduce(\n (acc: any, item: any) => {\n return {\n value: acc.value + item.amount.value,\n currency: item.amount.currency,\n };\n },\n { value: 0, currency }\n );\n}\n\nexport function transformShippingPrices(quote: any) {\n if (!quote || !quote.shipping_addresses?.length) {\n return {};\n }\n\n const shippingAddress = quote.shipping_addresses[0];\n const selectedShippingMethod = shippingAddress.selected_shipping_method;\n\n if (!selectedShippingMethod) {\n return {};\n }\n\n return {\n shippingIncludingTax: selectedShippingMethod.price_incl_tax && {\n value: selectedShippingMethod.price_incl_tax.value,\n currency: selectedShippingMethod.price_incl_tax.currency,\n },\n shippingExcludingTax: selectedShippingMethod.price_excl_tax && {\n value: selectedShippingMethod.price_excl_tax.value,\n currency: selectedShippingMethod.price_excl_tax.currency,\n },\n };\n}\n"],"names":["NegotiableQuoteStatus","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","transformHistoryEntry","historyEntry","_a","_b","_c","_d","_e","_f","change","_g","transformHistory","historyEntries","findApplicablePriceTier","priceTiers","quantity","a","b","tier","getImage","item","config","state","getLinks","link","getDiscounted","isConfigurable","priceRange","applicableTier","getDiscountPercentage","percent_off","_h","getRegularPrice","getSavingsAmount","amount_off","currency","transformQuoteItem","discount","note","option","value","transformQuoteItems","items","EDITABLE_QUOTE_STATUSES","getTotalQuantity","quote","checkAllItemsHaveStock","transformSingleQuote","isQuoteNew","isNewQuote","quoteItems","comment","baseComment","tax","calculateTotal","transformShippingPrices","address","shippingAddress","transformQuote","quoteData","history","transformNegotiableQuoteListEntry","transformNegotiableQuotesList","quotesData","transformedModel","paginationInfo","transformPaginationInfo","currentPage","pageSize","totalPages","totalCount","startItem","endItem","getDefaultPageSizeOptions","data","acc","selectedShippingMethod"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transform-quote.js","sources":["/@dropins/storefront-quote-management/src/data/models/negotiable-quote-model.ts","/@dropins/storefront-quote-management/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-history.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote-items.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport interface ShippingAddress {\n /**\n * The unique string identifier of the address\n */\n uid?: string;\n firstname: string;\n lastname: string;\n company?: string;\n street: string[];\n city: string;\n region?: {\n code: string;\n label: string;\n regionId: number;\n };\n postcode: string;\n country: {\n code: string;\n label: string;\n };\n telephone: string;\n}\n\nexport interface NegotiableQuoteModel {\n uid: string;\n name: string;\n createdAt: string;\n salesRepName: string;\n expirationDate: string;\n updatedAt: string;\n status: NegotiableQuoteStatus;\n isVirtual: boolean;\n buyer: {\n firstname: string;\n lastname: string;\n };\n templateName?: string;\n totalQuantity: number;\n comments?: {\n uid: string;\n createdAt: string;\n author: {\n firstname: string;\n lastname: string;\n };\n text: string;\n attachments?: {\n name: string;\n url: string;\n }[];\n }[];\n history?: NegotiableQuoteHistoryEntry[];\n prices: {\n appliedDiscounts?: Discount[];\n appliedTaxes?: Tax[];\n discount?: Currency;\n grandTotal?: Currency;\n grandTotalExcludingTax?: Currency;\n shippingExcludingTax?: Currency;\n shippingIncludingTax?: Currency;\n subtotalExcludingTax?: Currency;\n subtotalIncludingTax?: Currency;\n subtotalWithDiscountExcludingTax?: Currency;\n totalTax?: Currency;\n };\n items: CartItemModel[];\n shippingAddresses?: ShippingAddress[];\n canCheckout: boolean;\n canSendForReview: boolean;\n lockedForEditing?: boolean;\n canDelete: boolean;\n canClose: boolean;\n canUpdateQuote: boolean;\n readOnly: boolean;\n}\n\nexport interface ConfigurableOption {\n optionLabel: string;\n valueLabel: string;\n}\n\nexport interface BundleOption {\n label: string;\n values: {\n label: string;\n quantity: number;\n originalPrice: Currency;\n price: Currency;\n }[];\n}\n\nexport interface CustomizableOption {\n type: string;\n label: string;\n values: {\n label: string;\n value: string;\n }[];\n}\n\nexport interface CartItemModel {\n itemType: string;\n uid: string;\n product: {\n uid: string;\n sku: string;\n name: string;\n templateId?: string;\n templateName?: string;\n priceRange: {\n maximumPrice: {\n regularPrice: Currency;\n };\n };\n };\n image: ItemImage;\n links?: ItemLinks;\n discounted: boolean;\n discountedTotal: Currency;\n catalogDiscount: {\n amountOff: number;\n percentOff: number;\n };\n discounts: {\n label: string;\n value: string;\n amount: Currency;\n }[];\n discountPercentage?: number;\n insufficientQuantity?: boolean;\n outOfStock?: boolean;\n stockStatus: string;\n quantity: number;\n prices: {\n regularPrice: Currency;\n priceIncludingTax: Currency;\n originalItemPrice: Currency;\n originalRowTotal: Currency;\n rowTotal: Currency;\n rowTotalIncludingTax: Currency;\n };\n savingsAmount?: Currency;\n configurableOptions?: ConfigurableOption[];\n bundleOptions?: BundleOption[];\n customizableOptions?: CustomizableOption[];\n noteFromBuyer?: ItemNote[];\n noteFromSeller?: ItemNote[];\n}\n\ninterface ItemImage {\n src: string;\n alt: string;\n}\n\ninterface ItemLinks {\n count: number;\n result: string;\n}\n\nexport interface ItemNote {\n createdAt: string;\n creatorId: number;\n creatorType: number;\n negotiableQuoteItemUid: string;\n note: string;\n noteUid: string;\n}\n\nexport interface Currency {\n value: number;\n currency: string;\n}\n\nexport interface Tax {\n amount: Currency;\n label: string;\n}\n\nexport interface Discount {\n amount: Currency;\n label: string;\n coupon?: Coupon;\n}\n\nexport interface Coupon {\n code: string;\n}\n\nexport interface NegotiableQuoteListEntry {\n uid: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n status: NegotiableQuoteStatus;\n buyer: {\n firstname: string;\n lastname: string;\n };\n templateName: string;\n prices: {\n grandTotal: Currency;\n };\n}\nexport interface NegotiableQuotesListModel {\n items: NegotiableQuoteListEntry[];\n pageInfo: {\n currentPage: number;\n pageSize: number;\n totalPages: number;\n };\n totalCount: number;\n paginationInfo?: PaginationInfo;\n sortFields?: {\n default: string;\n options: Array<{\n label: string;\n value: string;\n }>;\n };\n}\n\nexport interface NegotiableQuoteHistoryEntry {\n author: {\n firstname: string;\n lastname: string;\n };\n changeType: NegotiableQuoteHistoryEntryChangeType;\n changes: {\n commentAdded?: {\n comment: string;\n };\n customChanges?: {\n new_value: string;\n old_value: string;\n title: string;\n };\n expiration?: {\n newExpiration: string;\n oldExpiration: string;\n };\n productsRemoved?: {\n productsRemovedFromCatalog: string[];\n productsRemovedFromQuote?: {\n uid: string;\n name: string;\n sku: string;\n quantity: number;\n }[];\n };\n statuses?: {\n changes: {\n newStatus: string;\n oldStatus: string;\n }[];\n };\n total?: {\n newPrice: Currency;\n oldPrice: Currency;\n };\n };\n createdAt: string;\n uid: string;\n}\n\nexport enum NegotiableQuoteHistoryEntryChangeType {\n CREATED = 'CREATED',\n UPDATED = 'UPDATED',\n CLOSED = 'CLOSED',\n UPDATED_BY_SYSTEM = 'UPDATED_BY_SYSTEM',\n}\n\n// See: https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/quotes/quotes#quote-status\nexport enum NegotiableQuoteStatus {\n NEW = 'NEW', // Currently not returned by the API, but is used to indicate a new quote\n SUBMITTED = 'SUBMITTED',\n PENDING = 'PENDING',\n UPDATED = 'UPDATED',\n OPEN = 'OPEN',\n ORDERED = 'ORDERED',\n CLOSED = 'CLOSED',\n DECLINED = 'DECLINED',\n EXPIRED = 'EXPIRED',\n DRAFT = 'DRAFT',\n}\n\nexport interface PaginationInfo {\n currentPage: number;\n totalCount: number;\n pageSize: number;\n startItem: number;\n endItem: number;\n totalPages: number;\n pageSizeOptions?: number[];\n}\n","import { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\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 { NegotiableQuoteHistoryEntry, NegotiableQuoteHistoryEntryChangeType } from '../models/negotiable-quote-model';\n\n/**\n * Transforms a history entry from the API format to the model format\n * @param historyEntry - Raw history entry from API\n * @returns Transformed history entry\n */\nexport function transformHistoryEntry(\n historyEntry: any\n): NegotiableQuoteHistoryEntry {\n return {\n uid: historyEntry.uid,\n createdAt: historyEntry.created_at,\n author: {\n firstname: historyEntry.author.firstname,\n lastname: historyEntry.author.lastname,\n },\n changeType: historyEntry.change_type as NegotiableQuoteHistoryEntryChangeType,\n changes: {\n commentAdded: historyEntry.changes?.comment_added && {\n comment: historyEntry.changes.comment_added.comment,\n },\n customChanges: historyEntry.changes?.custom_changes && {\n new_value: historyEntry.changes.custom_changes.new_value,\n old_value: historyEntry.changes.custom_changes.old_value,\n title: historyEntry.changes.custom_changes.title,\n },\n expiration: historyEntry.changes?.expiration && {\n newExpiration: historyEntry.changes.expiration.new_expiration,\n oldExpiration: historyEntry.changes.expiration.old_expiration,\n },\n productsRemoved: historyEntry.changes?.products_removed && {\n productsRemovedFromCatalog:\n historyEntry.changes.products_removed.products_removed_from_catalog ||\n [],\n productsRemovedFromQuote:\n historyEntry.changes.products_removed.products_removed_from_quote ||\n [],\n },\n statuses: historyEntry.changes?.statuses && {\n changes:\n historyEntry.changes.statuses.changes?.map((change: any) => ({\n newStatus: change?.new_status,\n oldStatus: change?.old_status,\n })) || [],\n },\n total:\n historyEntry.changes?.total &&\n historyEntry.changes.total.new_price &&\n historyEntry.changes.total.old_price && {\n newPrice: {\n value: historyEntry.changes.total.new_price.value,\n currency: historyEntry.changes.total.new_price.currency,\n },\n oldPrice: {\n value: historyEntry.changes.total.old_price.value,\n currency: historyEntry.changes.total.old_price.currency,\n },\n },\n },\n };\n}\n\n/**\n * Transforms an array of history entries from the API format to the model format\n * @param historyEntries - Array of raw history entries from API\n * @returns Array of transformed history entries\n */\nexport function transformHistory(\n historyEntries: any[] | null | undefined\n): NegotiableQuoteHistoryEntry[] | undefined {\n if (!historyEntries) {\n return undefined;\n }\n\n return historyEntries.map(transformHistoryEntry);\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 { CartItemModel } from '../models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\n\n/**\n * Finds the most applicable price tier for a given quantity\n * @param priceTiers - Array of price tier objects\n * @param quantity - Current item quantity\n * @returns The applicable tier or null if none found\n */\nfunction findApplicablePriceTier(priceTiers: any[], quantity: number) {\n if (!priceTiers?.length) return null;\n\n // Sort price tiers by quantity in descending order to find the highest applicable tier\n const sortedTiers = [...priceTiers].sort(\n (a: any, b: any) => b.quantity - a.quantity\n );\n\n // Find the highest tier where the current quantity meets or exceeds the tier's minimum quantity\n return sortedTiers.find((tier: any) => quantity >= tier.quantity) || null;\n}\n\n/**\n * Helper function to get the image for a cart item component\n * @param item - Cart item from API\n * @returns Image object with src and alt\n */\nfunction getImage(item: any) {\n const config = state.config;\n\n return {\n // Use parent thumbnail if configured, otherwise use own variant. Use the parent thumbnail as a fallback\n src: config?.useConfigurableParentThumbnail\n ? item.product.thumbnail.url\n : item.configured_variant?.thumbnail?.url || item.product.thumbnail.url,\n alt: config?.useConfigurableParentThumbnail\n ? item.product.thumbnail.label\n : item.configured_variant?.thumbnail?.label ||\n item.product.thumbnail.label,\n };\n}\n\n/**\n * Helper function to get downloadable links for a cart item component\n * @param item - Cart item from API\n * @returns Links object with count and result, or null if no links\n */\nfunction getLinks(item: any) {\n return item.links?.length > 0\n ? {\n count: item.links.length,\n result: item.links.map((link: any) => link.title).join(', '),\n }\n : null;\n}\n\n/**\n * Helper function to check if an item is discounted\n * @param item - Cart item from API\n * @returns True if the item has a discount\n */\nfunction getDiscounted(item: any) {\n const quantity = item.quantity;\n const isConfigurable = item.__typename === 'ConfigurableCartItem';\n\n // Get price tiers and price range based on item type\n const priceTiers = isConfigurable\n ? item.configured_variant?.price_tiers\n : item.product.price_tiers;\n const priceRange = isConfigurable\n ? item.configured_variant?.price_range\n : item.product.price_range;\n\n // Check price tiers first for discount eligibility\n const applicableTier = findApplicablePriceTier(priceTiers, quantity);\n if (applicableTier) {\n return applicableTier.discount.amount_off > 0;\n }\n\n // Fallback to regular price range discount\n return (priceRange?.maximum_price?.discount?.amount_off ?? 0) > 0;\n}\n\n/**\n * Helper function to get the discount percentage of an item\n * @param item - Cart item from API\n * @returns Discount percentage rounded to nearest integer, or undefined if no discount\n */\nfunction getDiscountPercentage(item: any) {\n const quantity = item.quantity;\n\n // Check price tiers first for discount percentage\n const applicableTier = findApplicablePriceTier(\n item.product.price_tiers,\n quantity\n );\n\n if (applicableTier) {\n return Math.round(applicableTier.discount.percent_off);\n }\n\n // Fallback to product-specific discount percentage\n let percent_off;\n\n if (item.__typename === 'ConfigurableCartItem') {\n percent_off =\n item?.configured_variant?.price_range?.maximum_price?.discount\n ?.percent_off;\n } else if (item.__typename === 'BundleCartItem') {\n return undefined;\n } else {\n percent_off =\n item?.product?.price_range?.maximum_price?.discount?.percent_off;\n }\n\n if (percent_off === 0) {\n return undefined;\n }\n\n return Math.round(percent_off);\n}\n\n/**\n * Helper function to get the regular price of an item\n * @param item - Cart item from API\n * @returns Regular price object with value and currency\n */\nfunction getRegularPrice(item: any) {\n if (item.__typename === 'ConfigurableCartItem') {\n return {\n value:\n item.configured_variant?.price_range?.maximum_price.regular_price.value,\n currency:\n item.configured_variant?.price_range?.maximum_price.regular_price\n .currency,\n };\n }\n return {\n value: item.prices.original_item_price.value,\n currency: item.prices.original_item_price.currency,\n };\n}\n\n/**\n * Helper function to get the savings amount of an item\n * @param item - Cart item from API\n * @returns Savings amount object with value and currency, or undefined if no savings\n */\nfunction getSavingsAmount(item: any) {\n let amount_off;\n let currency;\n\n amount_off =\n item?.prices?.original_row_total?.value - item?.prices?.row_total?.value;\n currency = item?.prices?.row_total?.currency;\n\n if (amount_off === 0) {\n return undefined;\n }\n return {\n value: amount_off,\n currency,\n };\n}\n\n/**\n * Transforms a single quote item from the API format to the model format\n * @param item - Raw quote item from API\n * @returns Transformed quote item\n */\nexport function transformQuoteItem(item: any): CartItemModel {\n return {\n itemType: item.__typename,\n uid: item.uid,\n product: {\n uid: item.product.uid,\n sku: item.product.sku,\n name: item.product.name,\n priceRange: {\n maximumPrice: {\n regularPrice: {\n value:\n item.product.price_range.maximum_price.regular_price.value,\n currency:\n item.product.price_range.maximum_price.regular_price.currency,\n },\n },\n },\n },\n image: getImage(item),\n links: getLinks(item),\n discounted: getDiscounted(item),\n discountedTotal: {\n value: item.prices.row_total.value,\n currency: item.prices.row_total.currency,\n },\n catalogDiscount: {\n amountOff: item.prices.catalog_discount.amount_off,\n percentOff: item.prices.catalog_discount.percent_off,\n },\n discounts:\n item.prices?.discounts?.map((discount: any) => ({\n label: discount.label,\n value: discount.value,\n amount: {\n value: discount.amount.value,\n currency: discount.amount.currency,\n },\n })) ?? [],\n discountPercentage: getDiscountPercentage(item),\n insufficientQuantity:\n (item.__typename === 'ConfigurableCartItem'\n ? item.configured_variant?.stock_status ?? item.product.stock_status\n : item.product.stock_status\n ) === 'IN_STOCK' && !item.is_available,\n outOfStock: item.product.stock_status === 'OUT_OF_STOCK',\n stockStatus: item.product.stock_status,\n quantity: item.quantity,\n prices: {\n regularPrice: getRegularPrice(item),\n priceIncludingTax: {\n value: item.prices.price_including_tax.value,\n currency: item.prices.price_including_tax.currency,\n },\n originalItemPrice: {\n value: item.prices.original_item_price.value,\n currency: item.prices.original_item_price.currency,\n },\n originalRowTotal: {\n value: item.prices.original_row_total.value,\n currency: item.prices.original_row_total.currency,\n },\n rowTotal: {\n value: item.prices.row_total.value,\n currency: item.prices.row_total.currency,\n },\n rowTotalIncludingTax: {\n value: item.prices.row_total_including_tax.value,\n currency: item.prices.row_total_including_tax.currency,\n },\n },\n savingsAmount: getSavingsAmount(item),\n noteFromBuyer: item.note_from_buyer?.map((note: any) => ({\n createdAt: note.created_at,\n creatorId: note.creator_id,\n creatorType: note.creator_type,\n negotiableQuoteItemUid: note.negotiable_quote_item_uid,\n note: note.note,\n noteUid: note.note_uid,\n })),\n noteFromSeller: item.note_from_seller?.map((note: any) => ({\n createdAt: note.created_at,\n creatorId: note.creator_id,\n creatorType: note.creator_type,\n negotiableQuoteItemUid: note.negotiable_quote_item_uid,\n note: note.note,\n noteUid: note.note_uid,\n })),\n configurableOptions: item.configurable_options?.map((option: any) => ({\n optionLabel: option.option_label,\n valueLabel: option.value_label,\n })),\n bundleOptions: item.bundle_options?.map((option: any) => ({\n label: option.label,\n values: option.values.map((value: any) => ({\n label: value.label,\n quantity: value.quantity,\n originalPrice: {\n value: value.original_price.value,\n currency: value.original_price.currency,\n },\n price: {\n value: value.priceV2.value,\n currency: value.priceV2.currency,\n },\n })),\n })),\n customizableOptions: item.customizable_options?.map((option: any) => ({\n type: option.type,\n label: option.label,\n values: option.values.map((value: any) => ({\n label: value.label,\n value: value.value,\n })),\n })),\n };\n}\n\n/**\n * Transforms an array of quote items from the API format to the model format\n * @param items - Array of raw quote items from API\n * @returns Array of transformed quote items\n */\nexport function transformQuoteItems(\n items: any[] | null | undefined\n): CartItemModel[] {\n if (!items) {\n return [];\n }\n\n return items.map(transformQuoteItem);\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 CartItemModel,\n NegotiableQuoteListEntry,\n NegotiableQuoteModel,\n NegotiableQuotesListModel,\n NegotiableQuoteStatus,\n PaginationInfo,\n ShippingAddress,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\nimport { transformHistory } from './transform-history';\nimport { transformQuoteItems } from './transform-quote-items';\n\n// Quote statuses that allow editing/sending for review\nconst EDITABLE_QUOTE_STATUSES = [\n 'DRAFT',\n 'UPDATED',\n 'DECLINED',\n 'EXPIRED',\n 'NEW',\n 'OPEN',\n] as const;\n\n// Helper function to get the total quantity of a quote (number of quote line items or total quantity)\nfunction getTotalQuantity(quote: any) {\n if (!quote.items) return 0;\n\n const config = state.config;\n\n if (config?.quoteSummaryDisplayTotal === 0) return quote.items.length;\n if (config?.quoteSummaryDisplayTotal === 1) return quote.total_quantity;\n // Default to items count if unexpected config value or error returned\n return quote.items.length;\n}\n\nfunction checkAllItemsHaveStock(items: CartItemModel[]): boolean {\n return items.every((item) => !item.outOfStock && !item.insufficientQuantity);\n}\n\n// Base helper that transforms a single quote object directly\nfunction transformSingleQuote(quote: any): NegotiableQuoteModel {\n const isQuoteNew = isNewQuote(quote);\n const isGeneratedFromTemplate = Boolean(quote.template_name?.trim());\n const quoteItems = transformQuoteItems(quote.items);\n return {\n uid: quote.uid,\n name: quote.name,\n createdAt: quote.created_at,\n updatedAt: quote.updated_at,\n expirationDate: quote.expiration_date,\n status: isQuoteNew ? NegotiableQuoteStatus.NEW : quote.status,\n isVirtual: Boolean(quote.is_virtual),\n salesRepName: quote.sales_rep_name,\n buyer: {\n firstname: quote.buyer.firstname,\n lastname: quote.buyer.lastname,\n },\n templateName: quote.template_name,\n totalQuantity: getTotalQuantity(quote),\n comments: quote.comments?.map((comment: any) => {\n const baseComment: any = {\n uid: comment.uid,\n createdAt: comment.created_at,\n author: {\n firstname: comment.author.firstname,\n lastname: comment.author.lastname,\n },\n text: comment.text,\n };\n\n if (\n Array.isArray(comment.attachments) &&\n comment.attachments.length > 0\n ) {\n baseComment.attachments = comment.attachments.map((a: any) => ({\n name: a.name,\n url: a.url,\n }));\n }\n\n return baseComment;\n }),\n prices: quote.prices && {\n appliedDiscounts: quote.prices.discounts?.map((discount: any) => ({\n amount: {\n value: discount.amount.value,\n currency: discount.amount.currency,\n },\n label: discount.label,\n coupon: discount.coupon,\n })),\n appliedTaxes: quote.prices.applied_taxes?.map((tax: any) => ({\n amount: { value: tax.amount.value, currency: tax.amount.currency },\n label: tax.label,\n })),\n discount:\n quote.prices.discounts &&\n quote.prices.grand_total &&\n calculateTotal(\n quote.prices.discounts,\n quote.prices.grand_total.currency\n ),\n grandTotal: quote.prices.grand_total && {\n value: quote.prices.grand_total.value,\n currency: quote.prices.grand_total.currency,\n },\n grandTotalExcludingTax: quote.prices.grand_total_excluding_tax && {\n value: quote.prices.grand_total_excluding_tax.value,\n currency: quote.prices.grand_total_excluding_tax.currency,\n },\n subtotalExcludingTax: quote.prices.subtotal_excluding_tax && {\n value: quote.prices.subtotal_excluding_tax.value,\n currency: quote.prices.subtotal_excluding_tax.currency,\n },\n subtotalIncludingTax: quote.prices.subtotal_including_tax && {\n value: quote.prices.subtotal_including_tax.value,\n currency: quote.prices.subtotal_including_tax.currency,\n },\n subtotalWithDiscountExcludingTax: quote.prices\n .subtotal_with_discount_excluding_tax && {\n value: quote.prices.subtotal_with_discount_excluding_tax.value,\n currency: quote.prices.subtotal_with_discount_excluding_tax.currency,\n },\n ...transformShippingPrices(quote),\n totalTax:\n quote.prices.applied_taxes &&\n quote.prices.grand_total &&\n calculateTotal(\n quote.prices.applied_taxes,\n quote.prices.grand_total.currency\n ),\n },\n history: transformHistory(quote.history),\n items: quoteItems,\n shippingAddresses: quote.shipping_addresses?.map((address: any) => {\n const shippingAddress: ShippingAddress = {\n uid: address.uid,\n firstname: address.firstname,\n lastname: address.lastname,\n company: address.company,\n street: address.street,\n city: address.city,\n postcode: address.postcode,\n country: {\n code: address.country.code,\n label: address.country.label,\n },\n telephone: address.telephone,\n };\n\n if (address.region) {\n shippingAddress.region = {\n code: address.region.code,\n label: address.region.label,\n regionId: address.region.region_id,\n };\n }\n\n return shippingAddress;\n }),\n canCheckout:\n ['UPDATED', 'DECLINED'].includes(quote.status) &&\n state.permissions.checkoutQuote &&\n quote.shipping_addresses?.length > 0 &&\n checkAllItemsHaveStock(quoteItems),\n canSendForReview:\n !isGeneratedFromTemplate &&\n (isQuoteNew || EDITABLE_QUOTE_STATUSES.includes(quote.status)) &&\n state.permissions.editQuote,\n canUpdateQuote:\n !isGeneratedFromTemplate &&\n (isQuoteNew || EDITABLE_QUOTE_STATUSES.includes(quote.status)) &&\n state.permissions.editQuote,\n canDelete:\n !isGeneratedFromTemplate &&\n !['PENDING', 'SUBMITTED', 'ORDERED'].includes(quote.status) &&\n state.permissions.deleteQuote,\n canClose: quote.status\n ? !isGeneratedFromTemplate &&\n !['DRAFT', 'CLOSED', 'ORDERED', 'OPEN'].includes(quote.status)\n : false,\n readOnly:\n isGeneratedFromTemplate ||\n (!isQuoteNew &&\n ['ORDERED', 'SUBMITTED', 'CLOSED', 'PENDING'].includes(quote.status)) ||\n !state.permissions.editQuote,\n };\n}\n\nexport function transformQuote(quoteData: any): NegotiableQuoteModel | null {\n if (!quoteData) {\n return null;\n }\n\n return transformSingleQuote(quoteData);\n}\n\n// quote is new if it has a status of SUBMITTED and there is no history entry that\n// has a change_type of UPDATED with a non-empty array of status changes\nfunction isNewQuote(quote: any): boolean {\n return (\n quote.status === 'SUBMITTED' &&\n !(quote.history ?? []).some(\n (history: any) =>\n history.change_type === 'UPDATED' &&\n (history.changes?.statuses?.changes ?? []).length > 0\n )\n );\n}\n\nfunction transformNegotiableQuoteListEntry(\n quote: any\n): NegotiableQuoteListEntry {\n const isQuoteNew = isNewQuote(quote);\n return {\n uid: quote.uid,\n name: quote.name,\n createdAt: quote.created_at,\n updatedAt: quote.updated_at,\n status: isQuoteNew ? NegotiableQuoteStatus.NEW : quote.status,\n buyer: {\n firstname: quote.buyer.firstname,\n lastname: quote.buyer.lastname,\n },\n templateName: quote.template_name,\n prices: {\n grandTotal: {\n value: quote.prices.grand_total.value,\n currency: quote.prices.grand_total.currency,\n },\n },\n };\n}\n\nexport function transformNegotiableQuotesList(\n quotesData: any\n): NegotiableQuotesListModel | null {\n if (!quotesData) {\n return null;\n }\n\n const transformedModel = {\n items:\n quotesData.items\n ?.filter((quote: any) => quote?.uid)\n .map(transformNegotiableQuoteListEntry) || [],\n pageInfo: {\n currentPage: quotesData.page_info.current_page,\n pageSize: quotesData.page_info.page_size,\n totalPages: quotesData.page_info.total_pages,\n },\n totalCount: quotesData.total_count,\n sortFields: quotesData.sort_fields\n ? {\n default: quotesData.sort_fields.default,\n options: quotesData.sort_fields.options,\n }\n : undefined,\n };\n\n // Calculate pagination info\n const paginationInfo = transformPaginationInfo(transformedModel);\n\n return {\n ...transformedModel,\n paginationInfo: paginationInfo || undefined,\n };\n}\n\nexport function transformPaginationInfo(\n quotesData: NegotiableQuotesListModel | null\n): PaginationInfo | null {\n if (!quotesData?.pageInfo || !quotesData.totalCount) {\n return null;\n }\n\n const { currentPage, pageSize, totalPages } = quotesData.pageInfo;\n const { totalCount } = quotesData;\n\n const startItem = totalCount > 0 ? (currentPage - 1) * pageSize + 1 : 0;\n const endItem = Math.min(currentPage * pageSize, totalCount);\n\n const pageSizeOptions = [20, 30, 50, 100, 200]; // Default page size options\n\n return {\n currentPage,\n totalCount,\n pageSize,\n startItem,\n endItem,\n totalPages,\n pageSizeOptions,\n };\n}\n\n// TODO: Check if admin has this configuration\nexport const getDefaultPageSizeOptions = () => [20, 30, 50, 100, 200];\n\nexport function calculateTotal(data: any[], currency: string) {\n if (!data?.length)\n return {\n value: 0,\n currency,\n };\n\n return data.reduce(\n (acc: any, item: any) => {\n return {\n value: acc.value + item.amount.value,\n currency: item.amount.currency,\n };\n },\n { value: 0, currency }\n );\n}\n\nexport function transformShippingPrices(quote: any) {\n if (!quote || !quote.shipping_addresses?.length) {\n return {};\n }\n\n const shippingAddress = quote.shipping_addresses[0];\n const selectedShippingMethod = shippingAddress.selected_shipping_method;\n\n if (!selectedShippingMethod) {\n return {};\n }\n\n return {\n shippingIncludingTax: selectedShippingMethod.price_incl_tax && {\n value: selectedShippingMethod.price_incl_tax.value,\n currency: selectedShippingMethod.price_incl_tax.currency,\n },\n shippingExcludingTax: selectedShippingMethod.price_excl_tax && {\n value: selectedShippingMethod.price_excl_tax.value,\n currency: selectedShippingMethod.price_excl_tax.currency,\n },\n };\n}\n"],"names":["NegotiableQuoteStatus","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","transformHistoryEntry","historyEntry","_a","_b","_c","_d","_e","_f","change","_g","transformHistory","historyEntries","findApplicablePriceTier","priceTiers","quantity","a","b","tier","getImage","item","config","state","getLinks","link","getDiscounted","isConfigurable","priceRange","applicableTier","getDiscountPercentage","percent_off","_h","getRegularPrice","getSavingsAmount","amount_off","currency","transformQuoteItem","discount","note","option","value","transformQuoteItems","items","EDITABLE_QUOTE_STATUSES","getTotalQuantity","quote","checkAllItemsHaveStock","transformSingleQuote","isQuoteNew","isNewQuote","isGeneratedFromTemplate","quoteItems","comment","baseComment","tax","calculateTotal","transformShippingPrices","address","shippingAddress","transformQuote","quoteData","history","transformNegotiableQuoteListEntry","transformNegotiableQuotesList","quotesData","transformedModel","paginationInfo","transformPaginationInfo","currentPage","pageSize","totalPages","totalCount","startItem","endItem","getDefaultPageSizeOptions","data","acc","selectedShippingMethod"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as n,jsxs as p,Fragment as la}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useRef as Ee,useEffect as N,useCallback as c,useMemo as f,createPortal as W}from"@dropins/tools/preact-compat.js";import{classes as u,VComponent as M,Slot as g}from"@dropins/tools/lib.js";import{f as ca}from"../chunks/dateUtils.js";/* empty css */import{Skeleton as Ga,SkeletonRow as z,InLineAlert as b,Button as sa,TextArea as Ka,InputFile as Xa}from"@dropins/tools/components.js";import{events as C}from"@dropins/tools/event-bus.js";import{S as Ja,A as Ya,T as Za,R as et}from"../chunks/RenameQuoteModal.js";import{v as at,f as tt,a as nt,S as ot,A as it}from"../chunks/AttachedFilesList.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{C as K}from"../chunks/ConfirmationModal.js";/* empty css *//* empty css */import{S as rt}from"../chunks/ShippingAddressDisplay.js";import{Q as lt}from"../chunks/QuoteHistoryLog3.js";import{g as ct,r as st,c as mt,a as dt,s as ut,d as gt,b as ft}from"../chunks/duplicateNegotiableQuote.js";import"../chunks/state.js";import{u as pt}from"../chunks/uploadFile.js";import{I as Mt}from"../chunks/ItemsQuoted.js";import{Q as bt}from"../chunks/QuoteCommentsList3.js";import{S as y}from"../chunks/WarningFilled.js";import{S as X}from"../chunks/CheckWithCircle.js";import{useText as ht}from"@dropins/tools/i18n.js";import"../chunks/QuoteHistoryLog.js";import"../chunks/transform-quote.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/NegotiableQuoteFragment.js";import"../chunks/transform-quote-template.js";import"../chunks/NegotiableQuoteTemplateFragment.js";import"../chunks/LineItemNoteModal.js";import"../chunks/setLineItemNote.js";import"../chunks/QuoteCommentsList.js";const Nt=({className:x,loading:t,quoteName:m,quoteStatus:R,banner:E,details:_,actionBar:S,quoteContent:L,shippingInformationTitle:J,shippingInformation:e,quoteCommentsTitle:Q,quoteComments:D,attachFilesField:k,attachedFilesList:P,footer:Y,...Z})=>t?n(St,{}):p("div",{...Z,className:u(["quote-management-manage-negotiable-quote",x]),children:[p("div",{className:u(["quote-management-manage-negotiable-quote__header"]),children:[m&&n(M,{node:m,className:u(["quote-management-manage-negotiable-quote__quote-name"])}),R&&n(M,{node:R,className:u(["quote-management-manage-negotiable-quote__quote-status"])})]}),E&&n(M,{node:E,className:u(["quote-management-manage-negotiable-quote__banner"])}),_&&n(M,{node:_,className:u(["quote-management-manage-negotiable-quote__details"])}),S&&n(M,{node:S,className:u(["quote-management-manage-negotiable-quote__action-bar"])}),L&&n(M,{node:L,className:u(["quote-management-manage-negotiable-quote__quote-content"])}),p("div",{"data-testid":"quote-shipping-information-container",className:u(["quote-management-manage-negotiable-quote__shipping-information-container"]),children:[J&&n(M,{node:J,className:u(["quote-management-manage-negotiable-quote__shipping-information-title"])}),e&&n(M,{node:e,className:u(["quote-management-manage-negotiable-quote__shipping-information"])})]}),p("div",{"data-testid":"quote-comments-container",className:u(["quote-management-manage-negotiable-quote__quote-comments-container"]),children:[Q&&n(M,{node:Q,className:u(["quote-management-manage-negotiable-quote__quote-comments-title"])}),D&&n(M,{node:D,className:u(["quote-management-manage-negotiable-quote__quote-comments"])}),k&&n(M,{node:k,className:u(["quote-management-manage-negotiable-quote__attach-files-field"])}),P&&n(M,{node:P,className:u(["quote-management-manage-negotiable-quote__attached-files-list"])})]}),n(M,{node:Y,className:u(["quote-management-manage-negotiable-quote__footer"])})]}),St=()=>p(Ga,{"data-testid":"manage-negotiable-quote-skeleton",children:[n(z,{variant:"heading",fullWidth:!0,size:"large"}),n(z,{variant:"row",fullWidth:!1,size:"small"}),n(z,{variant:"row",fullWidth:!1,size:"small"}),n(z,{variant:"row",fullWidth:!0}),n(z,{variant:"row",fullWidth:!0,size:"xlarge",lines:2}),n(z,{variant:"row",fullWidth:!1,size:"small"})]}),nn=({onActionsDropdownChange:x,slots:t,onActionsButtonClick:m,onSendForReview:R,maxFiles:E,maxFileSize:_,acceptedFileTypes:S,onDuplicateQuote:L,...J})=>{const[e,Q]=l(void 0),[D,k]=l(!0),[P,Y]=l(!1),[Z,$]=l(null),[ma,ee]=l(!1),[_e,se]=l(!1),[De,F]=l(null),[da,H]=l(!1),[Fe,Ie]=l(!1),[I,we]=l(""),[q,me]=l(!1),[xe,de]=l(!1),[Re,ue]=l(!1),[Le,O]=l(""),[ke,V]=l(""),[He,ge]=l(!1),[Oe,Ue]=l(!1),[Be,A]=l(""),[We,ae]=l(""),[ze,fe]=l(!1),[te,ne]=l(""),[pe,oe]=l(""),[Me,j]=l(""),[ua,U]=l(""),[be,ie]=l(""),[h,G]=l([]),[re,le]=l(void 0),[he,Pe]=l(new Set),$e=Ee(he),Ne=Ee(null),[B,Se]=l(""),ce=Ee(B),[Ve,Ae]=l(!1),[ga,fa]=l(!0);N(()=>{$e.current=he},[he]),N(()=>{ce.current=B},[B]);const o=ht({createdLabel:"NegotiableQuote.Manage.createdLabel",salesRepLabel:"NegotiableQuote.Manage.salesRepLabel",expiresLabel:"NegotiableQuote.Manage.expiresLabel",actionsLabel:"NegotiableQuote.Manage.actionsLabel",remove:"NegotiableQuote.Manage.actions.remove",close:"NegotiableQuote.Manage.actionButtons.close",delete:"NegotiableQuote.Manage.actionButtons.delete",print:"NegotiableQuote.Manage.actionButtons.print",createTemplate:"NegotiableQuote.Manage.actionButtons.createTemplate",createCopy:"NegotiableQuote.Manage.actionButtons.createCopy",shippingInformationTitle:"NegotiableQuote.Manage.shippingInformation.title",quoteCommentsTitle:"NegotiableQuote.Manage.quoteComments.title",quoteCommentsPlaceholder:"NegotiableQuote.Manage.quoteComments.placeholder",sendForReview:"NegotiableQuote.Manage.actionButtons.sendForReview",bannerTitle:"NegotiableQuote.Manage.bannerTitle",statusSubmitted:"NegotiableQuote.Manage.bannerStatusMessages.submitted",statusPending:"NegotiableQuote.Manage.bannerStatusMessages.pending",statusExpired:"NegotiableQuote.Manage.bannerStatusMessages.expired",errorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",closeSuccessMessage:"NegotiableQuote.Manage.confirmationModal.close.successDescription",closeModalTitle:"NegotiableQuote.Manage.actionButtons.close",closeModalMessage:"NegotiableQuote.Manage.confirmationModal.close.message",closeModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",closeModalConfirm:"NegotiableQuote.Manage.confirmationModal.close.confirm",closeModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.close.confirmLoading",closeModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.close.successHeading",createTemplateModalTitle:"NegotiableQuote.Manage.actionButtons.createTemplate",createTemplateModalMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.message",createTemplateModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",createTemplateModalConfirm:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirm",createTemplateModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirmLoading",createTemplateModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.successHeading",createTemplateSuccessMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.successDescription",createTemplateModalErrorHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorHeading",createTemplateErrorFallback:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorFallback",renameErrorHeading:"NegotiableQuote.Manage.rename.errorHeading",renameQuoteNameRequired:"NegotiableQuote.Manage.rename.quoteNameRequired",renameErrorDefault:"NegotiableQuote.Manage.rename.errorDefault",renameSuccessHeading:"NegotiableQuote.Manage.rename.successHeading",renameSuccessMessage:"NegotiableQuote.Manage.rename.successMessage",confirmationModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",confirmationModalDeleteTitle:"NegotiableQuote.Manage.confirmationModal.delete.title",confirmationModalDeleteMessage:"NegotiableQuote.Manage.confirmationModal.delete.message",confirmationModalDeleteConfirm:"NegotiableQuote.Manage.confirmationModal.delete.confirm",confirmationModalDeleteErrorHeading:"NegotiableQuote.Manage.confirmationModal.delete.errorHeading",confirmationModalDeleteErrorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",confirmationModalDeleteSuccessHeading:"NegotiableQuote.Manage.confirmationModal.delete.successHeading",confirmationModalDeleteSuccessDescription:"NegotiableQuote.Manage.confirmationModal.delete.successDescription",confirmationModalDuplicateTitle:"NegotiableQuote.Manage.confirmationModal.duplicate.title",confirmationModalDuplicateMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.message",confirmationModalDuplicateConfirm:"NegotiableQuote.Manage.confirmationModal.duplicate.confirm",confirmationModalDuplicateErrorHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.errorHeading",confirmationModalDuplicateErrorFallback:"NegotiableQuote.Manage.confirmationModal.duplicate.errorFallback",confirmationModalDuplicateSuccessHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.successHeading",confirmationModalDuplicateSuccessDescription:"NegotiableQuote.Manage.confirmationModal.duplicate.successDescription",duplicateOutOfStockWarningHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningHeading",duplicateOutOfStockWarningMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningMessage",noItemsSelectedModalTitle:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.title",noItemsSelectedModalMessage:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.message",noItemsSelectedModalConfirm:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.confirm",attachFiles:"NegotiableQuote.Manage.attachFiles",fileUploadError:"NegotiableQuote.Manage.fileUploadError",maxFilesExceeded:"NegotiableQuote.Manage.maxFilesExceeded",maxFileSizeExceeded:"NegotiableQuote.Manage.maxFileSizeExceeded",invalidFileType:"NegotiableQuote.Manage.invalidFileType",noEditQuoteAccessTitle:"QuoteManagement.permissions.noEditQuoteAccessTitle",noEditQuoteAccessMessage:"QuoteManagement.permissions.noEditQuoteAccessMessage"});N(()=>{const a=C.on("quote-management/permissions",i=>{fa(!!i.editQuote)},{eager:!0});return()=>a==null?void 0:a.off()},[]),N(()=>{const a=C.on("quote-management/quote-data",i=>{const{quote:r}=i;if(r){Q(r),k(!1);const s=`duplicate-outOfStock-warning-${r.uid}`;sessionStorage.getItem(s)==="true"&&(Ie(!0),sessionStorage.removeItem(s))}},{eager:!0});return()=>a==null?void 0:a.off()},[]),N(()=>{const a=C.on("quote-management/shipping-address-set",i=>{const{quote:r}=i;r&&Q(r)},{eager:!0});return()=>a==null?void 0:a.off()},[]),N(()=>{const a=C.on("quote-management/quote-sent-for-review",i=>{const{quote:r}=i;Q(r),we(""),G([]),me(!1)},{eager:!0});return()=>a==null?void 0:a.off()},[]),N(()=>{const a=C.on("quote-management/quote-items-removed",i=>{const{quote:r,removedItemUids:s}=i;r&&Q(r),s&&Pe(d=>{const v=new Set(d);return s.forEach(w=>v.delete(w)),v})},{eager:!0});return()=>a==null?void 0:a.off()},[]);const je=c((a,i)=>{Pe(r=>{const s=new Set(r);return i?s.add(a.uid):s.delete(a.uid),s})},[]),Ge=c(a=>{const i=a.target.value,r=$e.current;if(i==="remove"){if(Se(i),ce.current=i,r.size===0)Ae(!0);else if(e&&Ne.current){const s=e.items.filter(d=>r.has(d.uid));Ne.current(s)}}x==null||x(a)},[x,e]),Ke=c(()=>{Ae(!1),Se(""),ce.current=""},[]);N(()=>{const a=C.on("quote-management/negotiable-quote-closed",async i=>{ue(!1),V(""),O(o.closeSuccessMessage),Q(r=>{var s;return r!=null&&r.uid&&((s=i.closedQuoteUids)!=null&&s.includes(r.uid))&&ct(r.uid).then(d=>{Q(d)}).catch(d=>{console.warn("Failed to refresh quote data after closure:",d)}),r}),setTimeout(()=>{de(!1),O("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[o.closeSuccessMessage]),N(()=>{const a=C.on("quote-management/negotiable-quote-close-error",i=>{console.log("Close error event received:",i),ue(!1),O("");const r=i.error.message||o.errorFallback;V(r)},{eager:!0});return()=>a==null?void 0:a.off()},[o.errorFallback]),N(()=>{const a=C.on("quote-management/quote-renamed",i=>{const{quote:r}=i;Q(r),j(""),U(""),ie(o.renameSuccessMessage),setTimeout(()=>{fe(!1),ne(""),oe(""),ie("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[o.renameSuccessMessage]),N(()=>{const a=C.on("quote-management/quote-duplicated",i=>{const{quote:r}=i;e&&L&&L({quoteData:e,newQuote:r}),H(!0),F(null),setTimeout(()=>{se(!1),H(!1),F(null)},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[e,L]);const Qe=c(async a=>{if(E&&h.length+a.length>E){le(o.maxFilesExceeded.replace("{maxFiles}",String(E)));return}for(const r of a){if(_&&!at(r.size,_)){le(o.maxFileSizeExceeded.replace("{maxSize}",tt(_)));return}if(S&&!nt(r.type,S)){le(o.invalidFileType);return}}le(void 0);const i=a.map(r=>({key:`temp-${Date.now()}-${Math.random()}-${r.name}`,name:r.name,size:r.size,status:"uploading"}));G(r=>[...r,...i]);for(let r=0;r<a.length;r++){const s=a[r],d=i[r].key;try{const v=await pt(s);G(w=>w.map(T=>T.key===d?{...T,key:v.key,status:"success"}:T))}catch(v){G(w=>w.map(T=>T.key===d?{...T,status:"error",error:v.message}:T))}}},[E,_,S,h,o]),qe=c(a=>{G(i=>i.filter(r=>r.key!==a))},[]),Xe=c(()=>{ne((e==null?void 0:e.name)||""),oe(""),j(""),U(""),ie(""),fe(!0)},[e]),pa=c(()=>{fe(!1),ne(""),oe(""),j(""),U(""),ie("")},[]),Ma=c(a=>{ne(a),a.trim()&&U("")},[]),Je=c(()=>{se(!0),F(null),H(!1)},[]),ba=c(async()=>{if(!te.trim()){U(o.renameQuoteNameRequired);return}try{j(""),U(""),await st({quoteUid:e.uid,quoteName:te,quoteComment:pe.trim()||void 0})}catch(a){j(a.message||o.renameErrorDefault)}},[e,te,pe,o.renameQuoteNameRequired,o.renameErrorDefault]),ha=f(()=>{const a=e&&(e.lockedForEditing===!0||e.lockedForEditing===void 0&&(e.status==="SUBMITTED"||e.status==="PENDING"||e.status==="ORDERED"||e.status==="CLOSED"));return n(g,{name:"QuoteName",slot:t==null?void 0:t.QuoteName,context:{quoteName:e==null?void 0:e.name,quoteData:e},children:p("div",{className:"quote-management-manage-negotiable-quote__quote-name-wrapper",children:[n("h1",{"data-testid":"quote-name",className:"quote-management-manage-negotiable-quote__quote-name-title",children:e==null?void 0:e.name}),n("button",{onClick:Xe,disabled:a,"data-testid":"rename-quote-button",className:"quote-management-manage-negotiable-quote__rename-button","aria-label":"Rename quote",children:n(Ja,{})})]})})},[t==null?void 0:t.QuoteName,e,Xe]),Na=f(()=>n(g,{name:"QuoteStatus",slot:t==null?void 0:t.QuoteStatus,context:{quoteStatus:e==null?void 0:e.status,quoteData:e},children:n("div",{"data-testid":"quote-status",children:e==null?void 0:e.status})}),[t==null?void 0:t.QuoteStatus,e]),Ye=c(a=>{switch(a){case"SUBMITTED":return o.statusSubmitted;case"PENDING":return o.statusPending;case"EXPIRED":return o.statusExpired;default:return null}},[o])(e==null?void 0:e.status),Ze=!ga&&e?n(b,{type:"warning",variant:"primary",icon:n(y,{}),heading:o.noEditQuoteAccessTitle,description:o.noEditQuoteAccessMessage,"data-testid":"quote-permission-warning-banner"}):Ye?n(b,{type:"warning",variant:"secondary",icon:n(y,{}),heading:o.bannerTitle,description:Ye}):null,ea=Ze&&n(g,{name:"Banner","data-testid":"banner",slot:t==null?void 0:t.Banner,context:{quoteData:e},children:Ze}),Sa=c(()=>{Ie(!1)},[]),aa=Fe&&n(g,{name:"DuplicateQuoteWarningBanner","data-testid":"duplicate-outOfStock-warning-banner",slot:t==null?void 0:t.DuplicateQuoteWarningBanner,context:{outOfStockWarning:Fe},children:n(b,{type:"warning",variant:"primary",icon:n(y,{}),heading:o.duplicateOutOfStockWarningHeading,description:o.duplicateOutOfStockWarningMessage,onDismiss:Sa,"data-testid":"duplicate-outOfStock-warning-alert"})}),Qa=f(()=>{if(!e)return;const a=e.expirationDate?ca(e.expirationDate,"short"):void 0;return p(g,{name:"Details",slot:t==null?void 0:t.Details,context:{quoteData:e},children:[p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"created-label",children:o.createdLabel}),p("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"created-value",children:[ca(e.createdAt,"short")," (",e.buyer.firstname," ",e.buyer.lastname,")"]})]}),p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"sales-rep-label",children:o.salesRepLabel}),n("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"sales-rep-value",children:e.salesRepName})]}),p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"expires-label",children:o.expiresLabel}),n("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"expires-value",children:a})]})]})},[t==null?void 0:t.Details,o,e]),ta=f(()=>[{label:o.close,value:"close",disabled:!(e!=null&&e.canClose)},{label:o.delete,value:"delete",disabled:!(e!=null&&e.canDelete)},{label:o.print,value:"print"},{label:o.createTemplate,value:"createTemplate"},{label:o.createCopy,value:"createCopy"}],[o,e==null?void 0:e.canDelete,e==null?void 0:e.canClose]),qa=f(()=>{const a=i=>{switch(i){case"close":de(!0),V(""),O(""),m==null||m(i);break;case"delete":Y(!0),m==null||m(i);break;case"print":m==null||m(i);break;case"createTemplate":ge(!0),ae(""),A(""),m==null||m(i);break;case"createCopy":Je(),m==null||m(i);break}};return n(g,{name:"ActionBar",slot:t==null?void 0:t.ActionBar,context:{quoteData:e,actionsBarDropdownValue:B},children:n(Ya,{dropdownPlaceholder:o.actionsLabel,dropdownOptions:[{label:o.remove,value:"remove"}],dropdownValue:B,handleDropdownChange:Ge,buttons:ta.map(i=>n(sa,{variant:"tertiary",onClick:()=>a(i.value),"data-testid":`actions-bar-${i.value}-button`,"data-action":i.value,disabled:i.disabled,children:i.label},i.value))})})},[ta,o,t==null?void 0:t.ActionBar,e,Ge,m,Je,B]),va=f(()=>n(g,{name:"QuoteContent",slot:t==null?void 0:t.QuoteContent,context:{quoteData:e},children:n(Za,{tabs:new Map([["items-quoted","Items Quoted"],["comments","Comments"],["history-log","History Log"]]),tabsContent:new Map([["items-quoted",n(g,{name:"ItemsQuotedTab",slot:t==null?void 0:t.ItemsQuotedTab,context:{quoteData:e},children:n(Mt,{quoteData:e,onItemCheckboxChange:je,onRemoveItemsRef:a=>{Ne.current=a},onRemoveModalStateChange:a=>{!a&&ce.current==="remove"&&Se("")}})},"items-quoted")],["comments",n(g,{name:"CommentsTab",slot:t==null?void 0:t.CommentsTab,context:{quoteData:e},children:n(bt,{quoteData:e})},"comments")],["history-log",n(g,{name:"HistoryLogTab",slot:t==null?void 0:t.HistoryLogTab,context:{quoteData:e},children:n(lt,{quoteData:e})},"history-log")]])})}),[t==null?void 0:t.QuoteContent,t==null?void 0:t.HistoryLogTab,t==null?void 0:t.CommentsTab,t==null?void 0:t.ItemsQuotedTab,e,je]),Ta=f(()=>n(g,{name:"ShippingInformationTitle",slot:t==null?void 0:t.ShippingInformationTitle,context:{quoteData:e},children:n("h2",{children:o.shippingInformationTitle})}),[t==null?void 0:t.ShippingInformationTitle,e,o]),Ca=f(()=>{var a;return n(g,{name:"ShippingInformation",slot:t==null?void 0:t.ShippingInformation,context:{quoteData:e,loading:D,setLoading:k},children:n(rt,{shippingAddress:(a=e==null?void 0:e.shippingAddresses)==null?void 0:a[0],loading:D,"data-testid":"manage-quote-shipping-address"})})},[t==null?void 0:t.ShippingInformation,e,D,k]),ya=f(()=>n(g,{name:"QuoteCommentsTitle",slot:t==null?void 0:t.QuoteCommentsTitle,context:{quoteData:e},children:n("h2",{children:o.quoteCommentsTitle})}),[t==null?void 0:t.QuoteCommentsTitle,o,e]),Ea=f(()=>n(g,{name:"QuoteComments",slot:t==null?void 0:t.QuoteComments,context:{quoteData:e},children:n(Ka,{name:"quoteComments",placeholder:o.quoteCommentsPlaceholder,rows:3,value:I,onInput:a=>{we(a.target.value)},disabled:!(e!=null&&e.canSendForReview)||q})}),[t==null?void 0:t.QuoteComments,o,e,I,q]),na=f(()=>!(e!=null&&e.canSendForReview),[e]),_a=f(()=>{const a=q||na;return n(g,{name:"AttachFilesField",slot:t==null?void 0:t.AttachFilesField,context:{onFileChange:Qe,attachedFiles:h,fileUploadError:re,disabled:a},children:p("div",{className:"quote-management-manage-negotiable-quote__attach-files",...a?{"data-disabled":!0}:{},"aria-disabled":a,children:[n(Xa,{id:"manage-quote-attach-files",multiple:!0,onChange:i=>{const r=i.target,s=r==null?void 0:r.files,d=s?Array.from(s):[];d.length>0&&Qe(d)},icon:n(ot,{}),disabled:a,"data-testid":"manage-quote-attach-files",accept:S==null?void 0:S.join(","),children:o.attachFiles}),re&&n("div",{className:"quote-management-manage-negotiable-quote__file-error","data-testid":"file-upload-error",children:re})]})})},[t==null?void 0:t.AttachFilesField,Qe,q,na,S,re,o,h]),Da=f(()=>{if(h.length)return n(g,{name:"AttachedFilesList",slot:t==null?void 0:t.AttachedFilesList,context:{files:h,onRemove:qe,disabled:q},children:n(it,{files:h,onRemove:qe,disabled:q})})},[h,qe,q,t==null?void 0:t.AttachedFilesList]),Fa=c(async()=>{if(e!=null&&e.uid){ue(!0),V(""),O("");try{await mt({quoteUids:[e.uid]})}catch(a){console.error("Failed to close quote:",a)}}},[e]),Ia=c(()=>{de(!1),V(""),O("")},[]),wa=c(async()=>{if(e!=null&&e.uid){Ue(!0),ae(""),A("");try{await dt(e.uid),A(o.createTemplateSuccessMessage),setTimeout(()=>{ge(!1),A("")},2e3)}catch(a){console.error("Failed to create quote template:",a);const i=a instanceof Error?a.message:o.createTemplateErrorFallback;ae(i)}finally{Ue(!1)}}},[e,o.createTemplateSuccessMessage,o.createTemplateErrorFallback]),xa=c(()=>{ge(!1),ae(""),A("")},[]),ve=c(async()=>{const a=h.filter(i=>i.status==="success");if(R){R({quoteData:e,comment:I.trim()||void 0,attachments:a.length?a:void 0});return}me(!0);try{await ut({quoteUid:e.uid,comment:I.trim()||void 0,attachments:a.length?a.map(i=>({key:i.key})):void 0})}catch(i){console.error("Failed to send quote for review:",i),me(!1)}},[e,R,I,h]),Ra=f(()=>n(g,{name:"Footer",slot:t==null?void 0:t.Footer,context:{quoteData:e,comment:I,isSubmitting:q,attachments:h,handleSendForReview:ve},children:n(sa,{variant:"primary",onClick:ve,"data-testid":"send-for-review-button",disabled:!(e!=null&&e.canSendForReview)||q,children:o.sendForReview})}),[t==null?void 0:t.Footer,o,e,I,q,h,ve]),La=f(()=>Me?n(b,{type:"error",variant:"primary",icon:n(y,{color:"var(--color-error)"}),heading:o.renameErrorHeading,description:Me}):void 0,[Me,o.renameErrorHeading]),ka=f(()=>be?n(b,{type:"success",variant:"primary",icon:n(X,{}),heading:o.renameSuccessHeading,description:be}):void 0,[be,o.renameSuccessHeading]),Te=c(a=>a.errors&&Array.isArray(a.errors)&&a.errors.length>0?a.errors[0].message||o.confirmationModalDeleteErrorFallback:(a==null?void 0:a.message)||o.confirmationModalDeleteErrorFallback,[o.confirmationModalDeleteErrorFallback]),Ha=c(()=>{Y(!1),$(null),ee(!1)},[]),Oa=c(async()=>{if(e!=null&&e.uid){$(null),ee(!1);try{const{operationResults:a}=await gt(e.uid),i=a.find(r=>r.__typename==="DeleteNegotiableQuoteOperationFailure");if(i){const r=Te(i);$(r);return}ee(!0)}catch(a){const i=Te(a);$(i)}}},[e,Te]),Ua=c(()=>{$(null)},[]),Ba=c(()=>{ee(!1)},[]),oa=c(a=>(a==null?void 0:a.message)||o.confirmationModalDuplicateErrorFallback,[o.confirmationModalDuplicateErrorFallback]),Wa=c(()=>{se(!1),F(null),H(!1)},[]),za=c(async()=>{var a;if(e!=null&&e.uid){F(null),H(!1);try{const i=((a=e.items)==null?void 0:a.filter(v=>v.outOfStock))||[],s=(v=>{const w=v.slice(0,-8),T=crypto.randomUUID().slice(0,8);return w+T})(e.uid),d=i.length>0;d&&sessionStorage.setItem(`duplicate-outOfStock-warning-${s}`,"true"),await ft({quoteUid:e.uid,duplicatedQuoteUid:s,hasOutOfStockItems:d})}catch(i){const r=oa(i);F(r)}}},[e,oa]),Pa=c(()=>{F(null)},[]),$a=c(()=>{H(!1)},[]),Va=Z?n(b,{type:"error",variant:"primary",icon:n(y,{}),heading:o.confirmationModalDeleteErrorHeading,description:Z,onDismiss:Ua,"data-testid":"confirmation-modal-error-banner"}):null,ia=(ma?n(b,{type:"success",variant:"primary",icon:n(X,{}),heading:o.confirmationModalDeleteSuccessHeading,description:o.confirmationModalDeleteSuccessDescription,onDismiss:Ba,"data-testid":"confirmation-modal-success-banner"}):null)||Va,Aa=De?n(b,{type:"error",variant:"primary",icon:n(y,{}),heading:o.confirmationModalDuplicateErrorHeading,description:De,onDismiss:Pa,"data-testid":"confirmation-modal-duplicate-error-banner"}):null,ra=(da?n(b,{type:"success",variant:"primary",icon:n(X,{}),heading:o.confirmationModalDuplicateSuccessHeading,description:o.confirmationModalDuplicateSuccessDescription,onDismiss:$a,"data-testid":"confirmation-modal-duplicate-success-banner"}):null)||Aa,ja={...J,loading:D,quoteName:ha,quoteStatus:Na,banner:aa||ea?p(la,{children:[aa,ea]}):void 0,details:Qa,actionBar:qa,quoteContent:va,shippingInformationTitle:Ta,shippingInformation:Ca,quoteCommentsTitle:ya,quoteComments:Ea,attachFilesField:_a,attachedFilesList:Da,footer:Ra};let Ce=null;Le?Ce=n(b,{type:"success",variant:"primary",icon:n(X,{}),heading:o.closeModalSuccessHeading,description:Le,"data-testid":"close-quote-success-banner"}):ke&&(Ce=n(b,{type:"error",variant:"primary",icon:n(y,{}),heading:o.confirmationModalDeleteErrorHeading,description:ke,"data-testid":"close-quote-error-banner"}));let ye=null;return Be?ye=n(b,{type:"success",variant:"primary",icon:n(X,{}),heading:o.createTemplateModalSuccessHeading,description:Be,"data-testid":"create-template-success-banner"}):We&&(ye=n(b,{type:"error",variant:"primary",icon:n(y,{}),heading:o.createTemplateModalErrorHeading,description:We,"data-testid":"create-template-error-banner"})),p(la,{children:[n(Nt,{...ja}),ze&&W(n(et,{open:ze,quoteName:te,renameReason:pe,quoteNameError:ua,errorBanner:La,successBanner:ka,onQuoteNameChange:Ma,onRenameReasonChange:oe,onSave:ba,onClose:pa}),document.body),P&&W(n(K,{open:P,title:o.confirmationModalDeleteTitle,message:o.confirmationModalDeleteMessage,cancelLabel:o.confirmationModalCancel,confirmLabel:o.confirmationModalDeleteConfirm,onCancel:Ha,onConfirm:Oa,showCloseButton:!ia,confirmationBanner:ia}),document.body),_e&&W(n(K,{open:_e,title:o.confirmationModalDuplicateTitle,message:o.confirmationModalDuplicateMessage,cancelLabel:o.confirmationModalCancel,confirmLabel:o.confirmationModalDuplicateConfirm,onCancel:Wa,onConfirm:za,showCloseButton:!ra,confirmationBanner:ra}),document.body),xe&&W(n(K,{open:xe,title:o.closeModalTitle,message:o.closeModalMessage,cancelLabel:o.closeModalCancel,confirmLabel:Re?o.closeModalConfirmLoading:o.closeModalConfirm,onCancel:Ia,onConfirm:Re?void 0:Fa,showCloseButton:!0,confirmationBanner:Ce,"data-testid":"close-quote-confirmation-modal"}),document.body),He&&W(n(K,{open:He,title:o.createTemplateModalTitle,message:o.createTemplateModalMessage,cancelLabel:o.createTemplateModalCancel,confirmLabel:Oe?o.createTemplateModalConfirmLoading:o.createTemplateModalConfirm,onCancel:xa,onConfirm:Oe?void 0:wa,showCloseButton:!0,confirmationBanner:ye,"data-testid":"create-template-confirmation-modal"}),document.body),Ve&&W(n(K,{open:Ve,title:o.noItemsSelectedModalTitle,message:o.noItemsSelectedModalMessage,confirmLabel:o.noItemsSelectedModalConfirm,onConfirm:Ke,onClose:Ke,showCloseButton:!0,"data-testid":"no-items-selected-modal"}),document.body)]})};export{nn as ManageNegotiableQuote,nn as default};
|
|
3
|
+
import{jsx as n,jsxs as p,Fragment as la}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useRef as _e,useEffect as q,useCallback as c,useMemo as f,createPortal as W}from"@dropins/tools/preact-compat.js";import{classes as u,VComponent as M,Slot as g}from"@dropins/tools/lib.js";import{f as ca}from"../chunks/dateUtils.js";/* empty css */import{Skeleton as ja,SkeletonRow as z,InLineAlert as h,Button as sa,TextArea as Ga,InputFile as Ka}from"@dropins/tools/components.js";import{events as C}from"@dropins/tools/event-bus.js";import{S as Xa,A as Ja,T as Ya,R as Za}from"../chunks/RenameQuoteModal.js";import{v as Aa,f as et,a as at,S as tt,A as nt}from"../chunks/AttachedFilesList.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{C as X}from"../chunks/ConfirmationModal.js";/* empty css *//* empty css */import{S as ot}from"../chunks/ShippingAddressDisplay.js";import{Q as it}from"../chunks/QuoteHistoryLog3.js";import{g as rt,r as lt,c as ct,a as st,s as mt,d as dt,b as ut}from"../chunks/duplicateNegotiableQuote.js";import"../chunks/state.js";import{u as gt}from"../chunks/uploadFile.js";import{I as ft}from"../chunks/ItemsQuoted.js";import{Q as pt}from"../chunks/QuoteCommentsList3.js";import{S as w}from"../chunks/WarningFilled.js";import{S as J}from"../chunks/CheckWithCircle.js";import{useText as Mt}from"@dropins/tools/i18n.js";import"../chunks/QuoteHistoryLog.js";import"../chunks/transform-quote.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/NegotiableQuoteFragment.js";import"../chunks/transform-quote-template.js";import"../chunks/NegotiableQuoteTemplateFragment.js";import"../chunks/LineItemNoteModal.js";import"../chunks/setLineItemNote.js";import"../chunks/QuoteCommentsList.js";const bt=({className:x,loading:t,quoteName:m,quoteStatus:R,banner:y,details:_,actionBar:N,quoteContent:L,shippingInformationTitle:Y,shippingInformation:e,quoteCommentsTitle:S,quoteComments:E,attachFilesField:k,attachedFilesList:P,footer:Z,...A})=>t?n(ht,{}):p("div",{...A,className:u(["quote-management-manage-negotiable-quote",x]),children:[p("div",{className:u(["quote-management-manage-negotiable-quote__header"]),children:[m&&n(M,{node:m,className:u(["quote-management-manage-negotiable-quote__quote-name"])}),R&&n(M,{node:R,className:u(["quote-management-manage-negotiable-quote__quote-status"])})]}),y&&n(M,{node:y,className:u(["quote-management-manage-negotiable-quote__banner"])}),_&&n(M,{node:_,className:u(["quote-management-manage-negotiable-quote__details"])}),N&&n(M,{node:N,className:u(["quote-management-manage-negotiable-quote__action-bar"])}),L&&n(M,{node:L,className:u(["quote-management-manage-negotiable-quote__quote-content"])}),p("div",{"data-testid":"quote-shipping-information-container",className:u(["quote-management-manage-negotiable-quote__shipping-information-container"]),children:[Y&&n(M,{node:Y,className:u(["quote-management-manage-negotiable-quote__shipping-information-title"])}),e&&n(M,{node:e,className:u(["quote-management-manage-negotiable-quote__shipping-information"])})]}),p("div",{"data-testid":"quote-comments-container",className:u(["quote-management-manage-negotiable-quote__quote-comments-container"]),children:[S&&n(M,{node:S,className:u(["quote-management-manage-negotiable-quote__quote-comments-title"])}),E&&n(M,{node:E,className:u(["quote-management-manage-negotiable-quote__quote-comments"])}),k&&n(M,{node:k,className:u(["quote-management-manage-negotiable-quote__attach-files-field"])}),P&&n(M,{node:P,className:u(["quote-management-manage-negotiable-quote__attached-files-list"])})]}),n(M,{node:Z,className:u(["quote-management-manage-negotiable-quote__footer"])})]}),ht=()=>p(ja,{"data-testid":"manage-negotiable-quote-skeleton",children:[n(z,{variant:"heading",fullWidth:!0,size:"large"}),n(z,{variant:"row",fullWidth:!1,size:"small"}),n(z,{variant:"row",fullWidth:!1,size:"small"}),n(z,{variant:"row",fullWidth:!0}),n(z,{variant:"row",fullWidth:!0,size:"xlarge",lines:2}),n(z,{variant:"row",fullWidth:!1,size:"small"})]}),an=({onActionsDropdownChange:x,slots:t,onActionsButtonClick:m,onSendForReview:R,maxFiles:y,maxFileSize:_,acceptedFileTypes:N,onDuplicateQuote:L,...Y})=>{const[e,S]=l(void 0),[E,k]=l(!0),[P,Z]=l(!1),[A,$]=l(null),[ma,ee]=l(!1),[Ee,se]=l(!1),[Fe,F]=l(null),[da,H]=l(!1),[Ie,De]=l(!1),[I,we]=l(""),[Q,me]=l(!1),[xe,de]=l(!1),[Re,ue]=l(!1),[Le,O]=l(""),[ke,V]=l(""),[He,ge]=l(!1),[Oe,Be]=l(!1),[Ue,j]=l(""),[We,ae]=l(""),[ze,fe]=l(!1),[te,ne]=l(""),[pe,oe]=l(""),[Me,G]=l(""),[ua,B]=l(""),[be,ie]=l(""),[b,K]=l([]),[re,le]=l(void 0),[he,Pe]=l(new Set),$e=_e(he),Ne=_e(null),[U,Se]=l(""),ce=_e(U),[Ve,je]=l(!1);q(()=>{$e.current=he},[he]),q(()=>{ce.current=U},[U]);const o=Mt({createdLabel:"NegotiableQuote.Manage.createdLabel",salesRepLabel:"NegotiableQuote.Manage.salesRepLabel",expiresLabel:"NegotiableQuote.Manage.expiresLabel",actionsLabel:"NegotiableQuote.Manage.actionsLabel",remove:"NegotiableQuote.Manage.actions.remove",close:"NegotiableQuote.Manage.actionButtons.close",delete:"NegotiableQuote.Manage.actionButtons.delete",print:"NegotiableQuote.Manage.actionButtons.print",createTemplate:"NegotiableQuote.Manage.actionButtons.createTemplate",createCopy:"NegotiableQuote.Manage.actionButtons.createCopy",shippingInformationTitle:"NegotiableQuote.Manage.shippingInformation.title",quoteCommentsTitle:"NegotiableQuote.Manage.quoteComments.title",quoteCommentsPlaceholder:"NegotiableQuote.Manage.quoteComments.placeholder",sendForReview:"NegotiableQuote.Manage.actionButtons.sendForReview",bannerTitle:"NegotiableQuote.Manage.bannerTitle",statusSubmitted:"NegotiableQuote.Manage.bannerStatusMessages.submitted",statusPending:"NegotiableQuote.Manage.bannerStatusMessages.pending",statusExpired:"NegotiableQuote.Manage.bannerStatusMessages.expired",errorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",closeSuccessMessage:"NegotiableQuote.Manage.confirmationModal.close.successDescription",closeModalTitle:"NegotiableQuote.Manage.actionButtons.close",closeModalMessage:"NegotiableQuote.Manage.confirmationModal.close.message",closeModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",closeModalConfirm:"NegotiableQuote.Manage.confirmationModal.close.confirm",closeModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.close.confirmLoading",closeModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.close.successHeading",createTemplateModalTitle:"NegotiableQuote.Manage.actionButtons.createTemplate",createTemplateModalMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.message",createTemplateModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",createTemplateModalConfirm:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirm",createTemplateModalConfirmLoading:"NegotiableQuote.Manage.confirmationModal.createTemplate.confirmLoading",createTemplateModalSuccessHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.successHeading",createTemplateSuccessMessage:"NegotiableQuote.Manage.confirmationModal.createTemplate.successDescription",createTemplateModalErrorHeading:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorHeading",createTemplateErrorFallback:"NegotiableQuote.Manage.confirmationModal.createTemplate.errorFallback",renameErrorHeading:"NegotiableQuote.Manage.rename.errorHeading",renameQuoteNameRequired:"NegotiableQuote.Manage.rename.quoteNameRequired",renameErrorDefault:"NegotiableQuote.Manage.rename.errorDefault",renameSuccessHeading:"NegotiableQuote.Manage.rename.successHeading",renameSuccessMessage:"NegotiableQuote.Manage.rename.successMessage",confirmationModalCancel:"NegotiableQuote.Manage.confirmationModal.cancel",confirmationModalDeleteTitle:"NegotiableQuote.Manage.confirmationModal.delete.title",confirmationModalDeleteMessage:"NegotiableQuote.Manage.confirmationModal.delete.message",confirmationModalDeleteConfirm:"NegotiableQuote.Manage.confirmationModal.delete.confirm",confirmationModalDeleteErrorHeading:"NegotiableQuote.Manage.confirmationModal.delete.errorHeading",confirmationModalDeleteErrorFallback:"NegotiableQuote.Manage.confirmationModal.delete.errorFallback",confirmationModalDeleteSuccessHeading:"NegotiableQuote.Manage.confirmationModal.delete.successHeading",confirmationModalDeleteSuccessDescription:"NegotiableQuote.Manage.confirmationModal.delete.successDescription",confirmationModalDuplicateTitle:"NegotiableQuote.Manage.confirmationModal.duplicate.title",confirmationModalDuplicateMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.message",confirmationModalDuplicateConfirm:"NegotiableQuote.Manage.confirmationModal.duplicate.confirm",confirmationModalDuplicateErrorHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.errorHeading",confirmationModalDuplicateErrorFallback:"NegotiableQuote.Manage.confirmationModal.duplicate.errorFallback",confirmationModalDuplicateSuccessHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.successHeading",confirmationModalDuplicateSuccessDescription:"NegotiableQuote.Manage.confirmationModal.duplicate.successDescription",duplicateOutOfStockWarningHeading:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningHeading",duplicateOutOfStockWarningMessage:"NegotiableQuote.Manage.confirmationModal.duplicate.outOfStockWarningMessage",noItemsSelectedModalTitle:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.title",noItemsSelectedModalMessage:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.message",noItemsSelectedModalConfirm:"NegotiableQuote.Manage.confirmationModal.noItemsSelected.confirm",attachFiles:"NegotiableQuote.Manage.attachFiles",fileUploadError:"NegotiableQuote.Manage.fileUploadError",maxFilesExceeded:"NegotiableQuote.Manage.maxFilesExceeded",maxFileSizeExceeded:"NegotiableQuote.Manage.maxFileSizeExceeded",invalidFileType:"NegotiableQuote.Manage.invalidFileType"});q(()=>{const a=C.on("quote-management/quote-data",i=>{const{quote:r}=i;if(r){S(r),k(!1);const s=`duplicate-outOfStock-warning-${r.uid}`;sessionStorage.getItem(s)==="true"&&(De(!0),sessionStorage.removeItem(s))}},{eager:!0});return()=>a==null?void 0:a.off()},[]),q(()=>{const a=C.on("quote-management/shipping-address-set",i=>{const{quote:r}=i;r&&S(r)},{eager:!0});return()=>a==null?void 0:a.off()},[]),q(()=>{const a=C.on("quote-management/quote-sent-for-review",i=>{const{quote:r}=i;S(r),we(""),K([]),me(!1)},{eager:!0});return()=>a==null?void 0:a.off()},[]),q(()=>{const a=C.on("quote-management/quote-items-removed",i=>{const{quote:r,removedItemUids:s}=i;r&&S(r),s&&Pe(d=>{const v=new Set(d);return s.forEach(D=>v.delete(D)),v})},{eager:!0});return()=>a==null?void 0:a.off()},[]);const Ge=c((a,i)=>{Pe(r=>{const s=new Set(r);return i?s.add(a.uid):s.delete(a.uid),s})},[]),Ke=c(a=>{const i=a.target.value,r=$e.current;if(i==="remove"){if(Se(i),ce.current=i,r.size===0)je(!0);else if(e&&Ne.current){const s=e.items.filter(d=>r.has(d.uid));Ne.current(s)}}x==null||x(a)},[x,e]),Xe=c(()=>{je(!1),Se(""),ce.current=""},[]);q(()=>{const a=C.on("quote-management/negotiable-quote-closed",async i=>{ue(!1),V(""),O(o.closeSuccessMessage),S(r=>{var s;return r!=null&&r.uid&&((s=i.closedQuoteUids)!=null&&s.includes(r.uid))&&rt(r.uid).then(d=>{S(d)}).catch(d=>{console.warn("Failed to refresh quote data after closure:",d)}),r}),setTimeout(()=>{de(!1),O("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[o.closeSuccessMessage]),q(()=>{const a=C.on("quote-management/negotiable-quote-close-error",i=>{console.log("Close error event received:",i),ue(!1),O("");const r=i.error.message||o.errorFallback;V(r)},{eager:!0});return()=>a==null?void 0:a.off()},[o.errorFallback]),q(()=>{const a=C.on("quote-management/quote-renamed",i=>{const{quote:r}=i;S(r),G(""),B(""),ie(o.renameSuccessMessage),setTimeout(()=>{fe(!1),ne(""),oe(""),ie("")},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[o.renameSuccessMessage]),q(()=>{const a=C.on("quote-management/quote-duplicated",i=>{const{quote:r}=i;e&&L&&L({quoteData:e,newQuote:r}),H(!0),F(null),setTimeout(()=>{se(!1),H(!1),F(null)},2e3)},{eager:!0});return()=>a==null?void 0:a.off()},[e,L]);const Qe=c(async a=>{if(y&&b.length+a.length>y){le(o.maxFilesExceeded.replace("{maxFiles}",String(y)));return}for(const r of a){if(_&&!Aa(r.size,_)){le(o.maxFileSizeExceeded.replace("{maxSize}",et(_)));return}if(N&&!at(r.type,N)){le(o.invalidFileType);return}}le(void 0);const i=a.map(r=>({key:`temp-${Date.now()}-${Math.random()}-${r.name}`,name:r.name,size:r.size,status:"uploading"}));K(r=>[...r,...i]);for(let r=0;r<a.length;r++){const s=a[r],d=i[r].key;try{const v=await gt(s);K(D=>D.map(T=>T.key===d?{...T,key:v.key,status:"success"}:T))}catch(v){K(D=>D.map(T=>T.key===d?{...T,status:"error",error:v.message}:T))}}},[y,_,N,b,o]),ve=c(a=>{K(i=>i.filter(r=>r.key!==a))},[]),Je=c(()=>{ne((e==null?void 0:e.name)||""),oe(""),G(""),B(""),ie(""),fe(!0)},[e]),ga=c(()=>{fe(!1),ne(""),oe(""),G(""),B(""),ie("")},[]),fa=c(a=>{ne(a),a.trim()&&B("")},[]),Ye=c(()=>{se(!0),F(null),H(!1)},[]),pa=c(async()=>{if(!te.trim()){B(o.renameQuoteNameRequired);return}try{G(""),B(""),await lt({quoteUid:e.uid,quoteName:te,quoteComment:pe.trim()||void 0})}catch(a){G(a.message||o.renameErrorDefault)}},[e,te,pe,o.renameQuoteNameRequired,o.renameErrorDefault]),Ma=f(()=>{const a=e&&(e.lockedForEditing===!0||e.lockedForEditing===void 0&&(e.status==="SUBMITTED"||e.status==="PENDING"||e.status==="ORDERED"||e.status==="CLOSED"));return n(g,{name:"QuoteName",slot:t==null?void 0:t.QuoteName,context:{quoteName:e==null?void 0:e.name,quoteData:e},children:p("div",{className:"quote-management-manage-negotiable-quote__quote-name-wrapper",children:[n("h1",{"data-testid":"quote-name",className:"quote-management-manage-negotiable-quote__quote-name-title",children:e==null?void 0:e.name}),n("button",{onClick:Je,disabled:a,"data-testid":"rename-quote-button",className:"quote-management-manage-negotiable-quote__rename-button","aria-label":"Rename quote",children:n(Xa,{})})]})})},[t==null?void 0:t.QuoteName,e,Je]),ba=f(()=>n(g,{name:"QuoteStatus",slot:t==null?void 0:t.QuoteStatus,context:{quoteStatus:e==null?void 0:e.status,quoteData:e},children:n("div",{"data-testid":"quote-status",children:e==null?void 0:e.status})}),[t==null?void 0:t.QuoteStatus,e]),Ze=c(a=>{switch(a){case"SUBMITTED":return o.statusSubmitted;case"PENDING":return o.statusPending;case"EXPIRED":return o.statusExpired;default:return null}},[o])(e==null?void 0:e.status),Ae=Ze&&n(h,{type:"warning",variant:"secondary",icon:n(w,{}),heading:o.bannerTitle,description:Ze}),ea=Ae&&n(g,{name:"Banner","data-testid":"banner",slot:t==null?void 0:t.Banner,context:{quoteData:e},children:Ae}),ha=c(()=>{De(!1)},[]),aa=Ie&&n(g,{name:"DuplicateQuoteWarningBanner","data-testid":"duplicate-outOfStock-warning-banner",slot:t==null?void 0:t.DuplicateQuoteWarningBanner,context:{outOfStockWarning:Ie},children:n(h,{type:"warning",variant:"primary",icon:n(w,{}),heading:o.duplicateOutOfStockWarningHeading,description:o.duplicateOutOfStockWarningMessage,onDismiss:ha,"data-testid":"duplicate-outOfStock-warning-alert"})}),Na=f(()=>{if(!e)return;const a=e.expirationDate?ca(e.expirationDate,"short"):void 0;return p(g,{name:"Details",slot:t==null?void 0:t.Details,context:{quoteData:e},children:[p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"created-label",children:o.createdLabel}),p("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"created-value",children:[ca(e.createdAt,"short")," (",e.buyer.firstname," ",e.buyer.lastname,")"]})]}),p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"sales-rep-label",children:o.salesRepLabel}),n("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"sales-rep-value",children:e.salesRepName})]}),p("div",{className:"quote-management-manage-negotiable-quote__detail",children:[n("span",{className:"quote-management-manage-negotiable-quote__detail-title","data-testid":"expires-label",children:o.expiresLabel}),n("span",{className:"quote-management-manage-negotiable-quote__detail-content","data-testid":"expires-value",children:a})]})]})},[t==null?void 0:t.Details,o,e]),ta=f(()=>[{label:o.close,value:"close",disabled:!(e!=null&&e.canClose)},{label:o.delete,value:"delete",disabled:!(e!=null&&e.canDelete)},{label:o.print,value:"print"},{label:o.createTemplate,value:"createTemplate",disabled:!!(e!=null&&e.templateName)},{label:o.createCopy,value:"createCopy"}],[o,e==null?void 0:e.canDelete,e==null?void 0:e.canClose,e==null?void 0:e.templateName]),Sa=f(()=>{const a=i=>{switch(i){case"close":de(!0),V(""),O(""),m==null||m(i);break;case"delete":Z(!0),m==null||m(i);break;case"print":m==null||m(i);break;case"createTemplate":ge(!0),ae(""),j(""),m==null||m(i);break;case"createCopy":Ye(),m==null||m(i);break}};return n(g,{name:"ActionBar",slot:t==null?void 0:t.ActionBar,context:{quoteData:e,actionsBarDropdownValue:U},children:n(Ja,{dropdownPlaceholder:o.actionsLabel,dropdownOptions:[{label:o.remove,value:"remove"}],dropdownValue:U,handleDropdownChange:Ke,buttons:ta.map(i=>n(sa,{variant:"tertiary",onClick:()=>a(i.value),"data-testid":`actions-bar-${i.value}-button`,"data-action":i.value,disabled:i.disabled,children:i.label},i.value))})})},[ta,o,t==null?void 0:t.ActionBar,e,Ke,m,Ye,U]),Qa=f(()=>n(g,{name:"QuoteContent",slot:t==null?void 0:t.QuoteContent,context:{quoteData:e},children:n(Ya,{tabs:new Map([["items-quoted","Items Quoted"],["comments","Comments"],["history-log","History Log"]]),tabsContent:new Map([["items-quoted",n(g,{name:"ItemsQuotedTab",slot:t==null?void 0:t.ItemsQuotedTab,context:{quoteData:e},children:n(ft,{quoteData:e,onItemCheckboxChange:Ge,onRemoveItemsRef:a=>{Ne.current=a},onRemoveModalStateChange:a=>{!a&&ce.current==="remove"&&Se("")}})},"items-quoted")],["comments",n(g,{name:"CommentsTab",slot:t==null?void 0:t.CommentsTab,context:{quoteData:e},children:n(pt,{quoteData:e})},"comments")],["history-log",n(g,{name:"HistoryLogTab",slot:t==null?void 0:t.HistoryLogTab,context:{quoteData:e},children:n(it,{quoteData:e})},"history-log")]])})}),[t==null?void 0:t.QuoteContent,t==null?void 0:t.HistoryLogTab,t==null?void 0:t.CommentsTab,t==null?void 0:t.ItemsQuotedTab,e,Ge]),va=f(()=>n(g,{name:"ShippingInformationTitle",slot:t==null?void 0:t.ShippingInformationTitle,context:{quoteData:e},children:n("h2",{children:o.shippingInformationTitle})}),[t==null?void 0:t.ShippingInformationTitle,e,o]),qa=f(()=>{var a;return n(g,{name:"ShippingInformation",slot:t==null?void 0:t.ShippingInformation,context:{quoteData:e,loading:E,setLoading:k},children:n(ot,{shippingAddress:(a=e==null?void 0:e.shippingAddresses)==null?void 0:a[0],loading:E,"data-testid":"manage-quote-shipping-address"})})},[t==null?void 0:t.ShippingInformation,e,E,k]),Ta=f(()=>n(g,{name:"QuoteCommentsTitle",slot:t==null?void 0:t.QuoteCommentsTitle,context:{quoteData:e},children:n("h2",{children:o.quoteCommentsTitle})}),[t==null?void 0:t.QuoteCommentsTitle,o,e]),Ca=f(()=>n(g,{name:"QuoteComments",slot:t==null?void 0:t.QuoteComments,context:{quoteData:e},children:n(Ga,{name:"quoteComments",placeholder:o.quoteCommentsPlaceholder,rows:3,value:I,onInput:a=>{we(a.target.value)},disabled:!(e!=null&&e.canSendForReview)||Q})}),[t==null?void 0:t.QuoteComments,o,e,I,Q]),na=f(()=>!(e!=null&&e.canSendForReview),[e]),ya=f(()=>{const a=Q||na;return n(g,{name:"AttachFilesField",slot:t==null?void 0:t.AttachFilesField,context:{onFileChange:Qe,attachedFiles:b,fileUploadError:re,disabled:a},children:p("div",{className:"quote-management-manage-negotiable-quote__attach-files",...a?{"data-disabled":!0}:{},"aria-disabled":a,children:[n(Ka,{id:"manage-quote-attach-files",multiple:!0,onChange:i=>{const r=i.target,s=r==null?void 0:r.files,d=s?Array.from(s):[];d.length>0&&Qe(d)},icon:n(tt,{}),disabled:a,"data-testid":"manage-quote-attach-files",accept:N==null?void 0:N.join(","),children:o.attachFiles}),re&&n("div",{className:"quote-management-manage-negotiable-quote__file-error","data-testid":"file-upload-error",children:re})]})})},[t==null?void 0:t.AttachFilesField,Qe,Q,na,N,re,o,b]),_a=f(()=>{if(b.length)return n(g,{name:"AttachedFilesList",slot:t==null?void 0:t.AttachedFilesList,context:{files:b,onRemove:ve,disabled:Q},children:n(nt,{files:b,onRemove:ve,disabled:Q})})},[b,ve,Q,t==null?void 0:t.AttachedFilesList]),Ea=c(async()=>{if(e!=null&&e.uid){ue(!0),V(""),O("");try{await ct({quoteUids:[e.uid]})}catch(a){console.error("Failed to close quote:",a)}}},[e]),Fa=c(()=>{de(!1),V(""),O("")},[]),Ia=c(async()=>{if(e!=null&&e.uid){Be(!0),ae(""),j("");try{await st(e.uid),j(o.createTemplateSuccessMessage),setTimeout(()=>{ge(!1),j("")},2e3)}catch(a){console.error("Failed to create quote template:",a);const i=a instanceof Error?a.message:o.createTemplateErrorFallback;ae(i)}finally{Be(!1)}}},[e,o.createTemplateSuccessMessage,o.createTemplateErrorFallback]),Da=c(()=>{ge(!1),ae(""),j("")},[]),qe=c(async()=>{const a=b.filter(i=>i.status==="success");if(R){R({quoteData:e,comment:I.trim()||void 0,attachments:a.length?a:void 0});return}me(!0);try{await mt({quoteUid:e.uid,comment:I.trim()||void 0,attachments:a.length?a.map(i=>({key:i.key})):void 0})}catch(i){console.error("Failed to send quote for review:",i),me(!1)}},[e,R,I,b]),wa=f(()=>n(g,{name:"Footer",slot:t==null?void 0:t.Footer,context:{quoteData:e,comment:I,isSubmitting:Q,attachments:b,handleSendForReview:qe},children:n(sa,{variant:"primary",onClick:qe,"data-testid":"send-for-review-button",disabled:!(e!=null&&e.canSendForReview)||Q,children:o.sendForReview})}),[t==null?void 0:t.Footer,o,e,I,Q,b,qe]),xa=f(()=>Me?n(h,{type:"error",variant:"primary",icon:n(w,{color:"var(--color-error)"}),heading:o.renameErrorHeading,description:Me}):void 0,[Me,o.renameErrorHeading]),Ra=f(()=>be?n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.renameSuccessHeading,description:be}):void 0,[be,o.renameSuccessHeading]),Te=c(a=>a.errors&&Array.isArray(a.errors)&&a.errors.length>0?a.errors[0].message||o.confirmationModalDeleteErrorFallback:(a==null?void 0:a.message)||o.confirmationModalDeleteErrorFallback,[o.confirmationModalDeleteErrorFallback]),La=c(()=>{Z(!1),$(null),ee(!1)},[]),ka=c(async()=>{if(e!=null&&e.uid){$(null),ee(!1);try{const{operationResults:a}=await dt(e.uid),i=a.find(r=>r.__typename==="DeleteNegotiableQuoteOperationFailure");if(i){const r=Te(i);$(r);return}ee(!0)}catch(a){const i=Te(a);$(i)}}},[e,Te]),Ha=c(()=>{$(null)},[]),Oa=c(()=>{ee(!1)},[]),oa=c(a=>(a==null?void 0:a.message)||o.confirmationModalDuplicateErrorFallback,[o.confirmationModalDuplicateErrorFallback]),Ba=c(()=>{se(!1),F(null),H(!1)},[]),Ua=c(async()=>{var a;if(e!=null&&e.uid){F(null),H(!1);try{const i=((a=e.items)==null?void 0:a.filter(v=>v.outOfStock))||[],s=(v=>{const D=v.slice(0,-8),T=crypto.randomUUID().slice(0,8);return D+T})(e.uid),d=i.length>0;d&&sessionStorage.setItem(`duplicate-outOfStock-warning-${s}`,"true"),await ut({quoteUid:e.uid,duplicatedQuoteUid:s,hasOutOfStockItems:d})}catch(i){const r=oa(i);F(r)}}},[e,oa]),Wa=c(()=>{F(null)},[]),za=c(()=>{H(!1)},[]),Pa=A?n(h,{type:"error",variant:"primary",icon:n(w,{}),heading:o.confirmationModalDeleteErrorHeading,description:A,onDismiss:Ha,"data-testid":"confirmation-modal-error-banner"}):null,ia=(ma?n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.confirmationModalDeleteSuccessHeading,description:o.confirmationModalDeleteSuccessDescription,onDismiss:Oa,"data-testid":"confirmation-modal-success-banner"}):null)||Pa,$a=Fe?n(h,{type:"error",variant:"primary",icon:n(w,{}),heading:o.confirmationModalDuplicateErrorHeading,description:Fe,onDismiss:Wa,"data-testid":"confirmation-modal-duplicate-error-banner"}):null,ra=(da?n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.confirmationModalDuplicateSuccessHeading,description:o.confirmationModalDuplicateSuccessDescription,onDismiss:za,"data-testid":"confirmation-modal-duplicate-success-banner"}):null)||$a,Va={...Y,loading:E,quoteName:Ma,quoteStatus:ba,banner:aa||ea?p(la,{children:[aa,ea]}):void 0,details:Na,actionBar:Sa,quoteContent:Qa,shippingInformationTitle:va,shippingInformation:qa,quoteCommentsTitle:Ta,quoteComments:Ca,attachFilesField:ya,attachedFilesList:_a,footer:wa};let Ce=null;Le?Ce=n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.closeModalSuccessHeading,description:Le,"data-testid":"close-quote-success-banner"}):ke&&(Ce=n(h,{type:"error",variant:"primary",icon:n(w,{}),heading:o.confirmationModalDeleteErrorHeading,description:ke,"data-testid":"close-quote-error-banner"}));let ye=null;return Ue?ye=n(h,{type:"success",variant:"primary",icon:n(J,{}),heading:o.createTemplateModalSuccessHeading,description:Ue,"data-testid":"create-template-success-banner"}):We&&(ye=n(h,{type:"error",variant:"primary",icon:n(w,{}),heading:o.createTemplateModalErrorHeading,description:We,"data-testid":"create-template-error-banner"})),p(la,{children:[n(bt,{...Va}),ze&&W(n(Za,{open:ze,quoteName:te,renameReason:pe,quoteNameError:ua,errorBanner:xa,successBanner:Ra,onQuoteNameChange:fa,onRenameReasonChange:oe,onSave:pa,onClose:ga}),document.body),P&&W(n(X,{open:P,title:o.confirmationModalDeleteTitle,message:o.confirmationModalDeleteMessage,cancelLabel:o.confirmationModalCancel,confirmLabel:o.confirmationModalDeleteConfirm,onCancel:La,onConfirm:ka,showCloseButton:!ia,confirmationBanner:ia}),document.body),Ee&&W(n(X,{open:Ee,title:o.confirmationModalDuplicateTitle,message:o.confirmationModalDuplicateMessage,cancelLabel:o.confirmationModalCancel,confirmLabel:o.confirmationModalDuplicateConfirm,onCancel:Ba,onConfirm:Ua,showCloseButton:!ra,confirmationBanner:ra}),document.body),xe&&W(n(X,{open:xe,title:o.closeModalTitle,message:o.closeModalMessage,cancelLabel:o.closeModalCancel,confirmLabel:Re?o.closeModalConfirmLoading:o.closeModalConfirm,onCancel:Fa,onConfirm:Re?void 0:Ea,showCloseButton:!0,confirmationBanner:Ce,"data-testid":"close-quote-confirmation-modal"}),document.body),He&&W(n(X,{open:He,title:o.createTemplateModalTitle,message:o.createTemplateModalMessage,cancelLabel:o.createTemplateModalCancel,confirmLabel:Oe?o.createTemplateModalConfirmLoading:o.createTemplateModalConfirm,onCancel:Da,onConfirm:Oe?void 0:Ia,showCloseButton:!0,confirmationBanner:ye,"data-testid":"create-template-confirmation-modal"}),document.body),Ve&&W(n(X,{open:Ve,title:o.noItemsSelectedModalTitle,message:o.noItemsSelectedModalMessage,confirmLabel:o.noItemsSelectedModalConfirm,onConfirm:Xe,onClose:Xe,showCloseButton:!0,"data-testid":"no-items-selected-modal"}),document.body)]})};export{an as ManageNegotiableQuote,an as default};
|
|
4
4
|
//# sourceMappingURL=ManageNegotiableQuote.js.map
|