@dropins/storefront-quote-management 1.0.0-beta4 → 1.0.0-beta5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/api/getQuoteTemplates/graphql/getQuoteTemplates.d.ts +1 -1
  2. package/api/getStoreConfig/graphql/StoreConfigQuery.d.ts +1 -1
  3. package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +1 -1
  4. package/api.js +5 -3
  5. package/api.js.map +1 -1
  6. package/chunks/AttachedFilesList.js +1 -1
  7. package/chunks/AttachedFilesList.js.map +1 -1
  8. package/chunks/CheckWithCircle.js +4 -0
  9. package/chunks/CheckWithCircle.js.map +1 -0
  10. package/chunks/ItemsQuoted.js +1 -1
  11. package/chunks/ItemsQuoted.js.map +1 -1
  12. package/chunks/ItemsQuotedTemplate.js +1 -1
  13. package/chunks/ItemsQuotedTemplate.js.map +1 -1
  14. package/chunks/LineItemNoteModal.js +1 -1
  15. package/chunks/LineItemNoteModal.js.map +1 -1
  16. package/chunks/NegotiableQuoteTemplateFragment.js +4 -4
  17. package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -1
  18. package/chunks/ShippingAddressDisplay.js +1 -1
  19. package/chunks/ShippingAddressDisplay.js.map +1 -1
  20. package/chunks/WarningFilled.js +1 -1
  21. package/chunks/WarningFilled.js.map +1 -1
  22. package/chunks/addQuoteTemplateLineItemNote.js +1 -1
  23. package/chunks/addQuoteTemplateLineItemNote.js.map +1 -1
  24. package/chunks/getQuoteTemplates.js +13 -11
  25. package/chunks/getQuoteTemplates.js.map +1 -1
  26. package/chunks/state.js +1 -1
  27. package/chunks/state.js.map +1 -1
  28. package/chunks/transform-quote-template.js +1 -1
  29. package/chunks/transform-quote-template.js.map +1 -1
  30. package/components/ProductListTable/ProductListTable.d.ts +5 -49
  31. package/containers/ItemsQuoted.js +1 -1
  32. package/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.d.ts +3 -3
  33. package/containers/ItemsQuotedTemplate.js +1 -1
  34. package/containers/ManageNegotiableQuote.js +1 -1
  35. package/containers/ManageNegotiableQuote.js.map +1 -1
  36. package/containers/ManageNegotiableQuoteTemplate.js +2 -2
  37. package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
  38. package/containers/RequestNegotiableQuoteForm.js +1 -1
  39. package/containers/RequestNegotiableQuoteForm.js.map +1 -1
  40. package/containers/ShippingAddressDisplay.js +1 -1
  41. package/data/models/store-config-model.d.ts +2 -0
  42. package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +1 -0
  43. package/data/transforms/__fixtures__/storeConfigData.d.ts +4 -0
  44. package/hooks/useItemsQuotedTemplate.d.ts +1 -2
  45. package/hooks/useUpdateTemplateQuantities.d.ts +2 -2
  46. package/i18n/en_US.json.d.ts +8 -3
  47. package/package.json +1 -1
  48. package/render.js +2 -2
  49. package/render.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ManageNegotiableQuoteTemplate.js","sources":["/@dropins/storefront-quote-management/src/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.tsx","/@dropins/storefront-quote-management/src/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.tsx","/@dropins/storefront-quote-management/src/components/ReferenceDocumentsList/ReferenceDocumentsList.tsx","/@dropins/storefront-quote-management/src/hooks/useReferenceDocumentLinks.ts","/@dropins/storefront-quote-management/src/hooks/useRenameTemplate.ts","/@dropins/storefront-quote-management/src/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\n\nimport '@/quote-management/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.css';\n\nexport interface ManageNegotiableQuoteTemplateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n loading?: boolean;\n templateName: VNode;\n templateStatus: VNode;\n banner?: VNode;\n details?: VNode;\n actionBar?: VNode;\n referenceDocuments?: VNode;\n itemsTable: VNode;\n shippingInformationTitle?: VNode;\n shippingInformation?: VNode;\n commentsTitle: VNode;\n comments: VNode;\n footer?: VNode;\n}\n\nexport const ManageNegotiableQuoteTemplate: FunctionComponent<ManageNegotiableQuoteTemplateProps> = ({\n className,\n loading,\n templateName,\n templateStatus,\n banner,\n details,\n actionBar,\n referenceDocuments,\n itemsTable,\n shippingInformationTitle,\n shippingInformation,\n commentsTitle,\n comments,\n footer,\n ...props\n}) => {\n if (loading) {\n return <ManageNegotiableQuoteTemplateSkeleton />;\n }\n\n return (\n <div {...props} className={classes(['quote-management-manage-negotiable-quote-template', className])}>\n <div className={classes(['quote-management-manage-negotiable-quote-template__header'])}>\n {templateName &&\n <VComponent\n node={templateName}\n className={classes(['quote-management-manage-negotiable-quote-template__template-name'])}\n />\n }\n {templateStatus &&\n <VComponent\n node={templateStatus}\n className={classes(['quote-management-manage-negotiable-quote-template__template-status'])}\n />\n }\n </div>\n {banner &&\n <VComponent\n node={banner}\n className={classes(['quote-management-manage-negotiable-quote-template__banner'])}\n />\n }\n {details &&\n <VComponent\n node={details}\n className={classes(['quote-management-manage-negotiable-quote-template__details'])}\n />\n }\n {actionBar &&\n <VComponent\n node={actionBar}\n className={classes(['quote-management-manage-negotiable-quote-template__action-bar'])}\n />\n }\n {referenceDocuments &&\n <div data-testid=\"reference-documents-container\" className={classes(['quote-management-manage-negotiable-quote-template__reference-documents-container'])}>\n <VComponent\n node={referenceDocuments}\n className={classes(['quote-management-manage-negotiable-quote-template__reference-documents'])}\n />\n </div>\n }\n {itemsTable &&\n <VComponent\n node={itemsTable}\n className={classes(['quote-management-manage-negotiable-quote-template__items-table'])}\n />\n }\n <div data-testid=\"template-shipping-information-container\" className={classes(['quote-management-manage-negotiable-quote-template__shipping-information-container'])}>\n {shippingInformationTitle &&\n <VComponent\n node={shippingInformationTitle}\n className={classes(['quote-management-manage-negotiable-quote-template__shipping-information-title'])}\n />\n }\n {shippingInformation &&\n <VComponent\n node={shippingInformation}\n className={classes(['quote-management-manage-negotiable-quote-template__shipping-information'])}\n />\n }\n </div>\n <div data-testid=\"comments-container\" className={classes(['quote-management-manage-negotiable-quote-template__comments-container'])}>\n {commentsTitle &&\n <VComponent\n node={commentsTitle}\n className={classes(['quote-management-manage-negotiable-quote-template__comments-title'])}\n />\n }\n {comments &&\n <VComponent\n node={comments}\n className={classes(['quote-management-manage-negotiable-quote-template__comments'])}\n />\n }\n </div>\n {footer &&\n <VComponent\n node={footer}\n className={classes(['quote-management-manage-negotiable-quote-template__footer'])}\n />\n }\n </div>\n );\n};\n\nexport const ManageNegotiableQuoteTemplateSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"manage-negotiable-quote-template-skeleton\">\n <SkeletonRow variant=\"heading\" fullWidth={true} size=\"large\" />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n <SkeletonRow variant=\"row\" fullWidth={true} />\n <SkeletonRow variant=\"row\" fullWidth={true} size=\"xlarge\" lines={2} />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, useCallback, useEffect, useState, HTMLAttributes } from 'preact/compat';\nimport { VNode } from 'preact';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button, Input, Modal, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { WarningFilled } from '@adobe-commerce/elsie/icons';\nimport '@/quote-management/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.css';\n\nexport interface ReferenceDocument {\n uid?: string;\n name: string;\n identifier?: string;\n url: string;\n}\n\nexport interface ReferenceDocumentFormModalProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n open: boolean;\n document?: ReferenceDocument;\n /**\n * Optional error message string. If provided, automatically creates an InLineAlert error banner.\n * If both errorMessage and errorBanner are provided, errorBanner takes precedence.\n */\n errorMessage?: string;\n /**\n * Optional custom error banner VNode. Provides full control over error banner rendering.\n * If both errorMessage and errorBanner are provided, errorBanner takes precedence.\n */\n errorBanner?: VNode;\n successBanner?: VNode;\n showCloseButton?: boolean;\n isSubmitting?: boolean;\n onSave: (document: ReferenceDocument) => void;\n onClose?: () => void;\n}\n\nexport const ReferenceDocumentFormModal: FunctionComponent<ReferenceDocumentFormModalProps> = ({\n className,\n open,\n document,\n errorMessage,\n errorBanner,\n successBanner,\n showCloseButton = true,\n isSubmitting = false,\n onSave,\n onClose,\n}) => {\n const [documentName, setDocumentName] = useState('');\n const [documentIdentifier, setDocumentIdentifier] = useState('');\n const [referenceUrl, setReferenceUrl] = useState('');\n const [errors, setErrors] = useState<{\n documentName?: string;\n documentIdentifier?: string;\n referenceUrl?: string;\n }>({});\n\n const dictionary = useText({\n title: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.title',\n documentNameLabel: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentNameLabel',\n documentIdentifierLabel: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentIdentifierLabel',\n referenceUrlLabel: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.referenceUrlLabel',\n addButton: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.addButton',\n updateButton: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.updateButton',\n cancelButton: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.cancelButton',\n documentNameRequired: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentNameRequired',\n documentIdentifierRequired: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentIdentifierRequired',\n referenceUrlRequired: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.referenceUrlRequired',\n invalidUrl: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.invalidUrl',\n errorHeading: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.errorHeading',\n });\n\n // Create error banner from errorMessage if errorBanner is not provided\n const displayErrorBanner = errorBanner || (errorMessage ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.errorHeading}\n description={errorMessage}\n data-testid=\"reference-document-form-modal-error-banner-inline\"\n />\n ) : null);\n\n // Determine if we're in edit mode (document prop is provided)\n const isEditMode = !!document;\n\n // Reset form when modal opens or document changes\n useEffect(() => {\n if (open) {\n if (document) {\n setDocumentName(document.name || '');\n setDocumentIdentifier(document.identifier || '');\n setReferenceUrl(document.url || '');\n } else {\n setDocumentName('');\n setDocumentIdentifier('');\n setReferenceUrl('');\n }\n setErrors({});\n }\n }, [open, document]);\n\n const validateUrl = useCallback((url: string): boolean => {\n // istanbul ignore if - whitespace-only URL are caught before this function is called, but leaving this here for defensive programming.\n if (!url.trim()) {\n return false;\n }\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }, []);\n\n const handleSave = useCallback(() => {\n const newErrors: { documentName?: string; documentIdentifier?: string; referenceUrl?: string } = {};\n\n if (!documentName.trim()) {\n newErrors.documentName = dictionary.documentNameRequired;\n }\n\n if (!referenceUrl.trim()) {\n newErrors.referenceUrl = dictionary.referenceUrlRequired;\n } else if (!validateUrl(referenceUrl.trim())) {\n newErrors.referenceUrl = dictionary.invalidUrl;\n }\n\n if (!documentIdentifier.trim()) {\n newErrors.documentIdentifier = dictionary.documentIdentifierRequired;\n }\n\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors);\n return;\n }\n\n onSave({\n uid: document?.uid,\n name: documentName.trim(),\n identifier: documentIdentifier.trim(),\n url: referenceUrl.trim(),\n });\n }, [documentName, documentIdentifier, referenceUrl, document, dictionary, validateUrl, onSave]);\n\n const handleClose = useCallback(() => {\n setDocumentName('');\n setDocumentIdentifier('');\n setReferenceUrl('');\n setErrors({});\n onClose?.();\n }, [onClose]);\n\n if (!open) {\n return null;\n }\n\n return (\n <Modal\n open={open}\n size=\"medium\"\n title={<>{dictionary.title}</>}\n onClose={handleClose}\n clickToDismiss={true}\n escapeToDismiss={true}\n showCloseButton={showCloseButton}\n className={classes(['quote-management-reference-document-form-modal', className])}\n data-testid=\"reference-document-form-modal\"\n >\n {displayErrorBanner && (\n <div\n className={classes(['quote-management-reference-document-form-modal__error-banner'])}\n data-testid=\"reference-document-form-modal-error-banner\"\n >\n {displayErrorBanner}\n </div>\n )}\n\n {successBanner && (\n <div\n className={classes(['quote-management-reference-document-form-modal__success-banner'])}\n data-testid=\"reference-document-form-modal-success-banner\"\n >\n {successBanner}\n </div>\n )}\n\n <div className={classes(['quote-management-reference-document-form-modal__content'])}>\n <div>\n <Input\n name=\"documentName\"\n type=\"text\"\n value={documentName}\n onInput={(e: any) => {\n setDocumentName(e.target.value);\n setErrors({ ...errors, documentName: undefined });\n }}\n floatingLabel={dictionary.documentNameLabel}\n required\n error={!!errors.documentName}\n disabled={isSubmitting}\n data-testid=\"reference-document-name-input\"\n />\n {errors.documentName && (\n <span\n className={classes(['quote-management-reference-document-form-modal__error-text'])}\n data-testid=\"reference-document-name-error\"\n >\n {errors.documentName}\n </span>\n )}\n </div>\n\n <div>\n <Input\n name=\"documentIdentifier\"\n type=\"text\"\n value={documentIdentifier}\n onInput={(e: any) => {\n setDocumentIdentifier(e.target.value);\n setErrors({ ...errors, documentIdentifier: undefined });\n }}\n floatingLabel={dictionary.documentIdentifierLabel}\n error={!!errors.documentIdentifier}\n disabled={isSubmitting}\n data-testid=\"reference-document-identifier-input\"\n />\n {errors.documentIdentifier && (\n <span\n className={classes(['quote-management-reference-document-form-modal__error-text'])}\n data-testid=\"reference-document-identifier-error\"\n >\n {errors.documentIdentifier}\n </span>\n )}\n </div>\n\n <div>\n <Input\n name=\"referenceUrl\"\n type=\"url\"\n value={referenceUrl}\n onInput={(e: any) => {\n setReferenceUrl(e.target.value);\n setErrors({ ...errors, referenceUrl: undefined });\n }}\n floatingLabel={dictionary.referenceUrlLabel}\n required\n error={!!errors.referenceUrl}\n disabled={isSubmitting}\n data-testid=\"reference-document-url-input\"\n />\n {errors.referenceUrl && (\n <span\n className={classes(['quote-management-reference-document-form-modal__error-text'])}\n data-testid=\"reference-document-url-error\"\n >\n {errors.referenceUrl}\n </span>\n )}\n </div>\n </div>\n\n <div className={classes(['quote-management-reference-document-form-modal__actions'])}>\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={handleClose}\n disabled={isSubmitting}\n className={classes(['quote-management-reference-document-form-modal__cancel-button'])}\n data-testid=\"reference-document-form-cancel-button\"\n >\n {dictionary.cancelButton}\n </Button>\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={handleSave}\n disabled={isSubmitting}\n className={classes(['quote-management-reference-document-form-modal__save-button'])}\n data-testid=\"reference-document-form-save-button\"\n >\n {isEditMode ? dictionary.updateButton : dictionary.addButton}\n </Button>\n </div>\n </Modal>\n );\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport '@/quote-management/components/ReferenceDocumentsList/ReferenceDocumentsList.css';\n\nexport interface ReferenceDocument {\n uid?: string;\n name: string;\n identifier?: string;\n url: string;\n}\n\nexport interface ReferenceDocumentsListProps extends HTMLAttributes<HTMLDivElement> {\n documents: ReferenceDocument[];\n isEditable?: boolean;\n onAdd?: () => void;\n onEdit?: (document: ReferenceDocument) => void;\n onRemove?: (document: ReferenceDocument) => void;\n}\n\nexport const ReferenceDocumentsList: FunctionComponent<ReferenceDocumentsListProps> = ({\n className,\n documents,\n isEditable = false,\n onAdd,\n onEdit,\n onRemove,\n ...props\n}) => {\n const dictionary = useText({\n add: 'NegotiableQuoteTemplate.Manage.referenceDocuments.add',\n edit: 'NegotiableQuoteTemplate.Manage.referenceDocuments.edit',\n remove: 'NegotiableQuoteTemplate.Manage.referenceDocuments.remove',\n noReferenceDocuments: 'NegotiableQuoteTemplate.Manage.referenceDocuments.noReferenceDocuments',\n });\n\n const formatDocumentDisplay = (doc: ReferenceDocument): string => {\n if (doc.identifier) {\n return `${doc.name}, ${doc.identifier}`;\n }\n return `${doc.name} ${doc.url}`;\n };\n\n const handleDocumentClick = (e: Event, url: string) => {\n e.preventDefault();\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <div\n className={classes(['quote-management-reference-documents-list', className])}\n data-testid=\"reference-documents-list\"\n {...props}\n >\n <div className=\"quote-management-reference-documents-list__content\">\n {documents.map((doc) => (\n <div\n key={doc.uid || doc.url}\n className=\"quote-management-reference-documents-list__document\"\n data-testid={`reference-document-${doc.uid || doc.url}`}\n >\n <a\n href={doc.url}\n onClick={(e) => handleDocumentClick(e, doc.url)}\n className=\"quote-management-reference-documents-list__document-link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={`reference-document-link-${doc.uid || doc.url}`}\n >\n {formatDocumentDisplay(doc)}\n </a>\n {isEditable && (\n <div className=\"quote-management-reference-documents-list__document-actions\">\n <Button\n variant=\"tertiary\"\n onClick={() => onEdit?.(doc)}\n className=\"quote-management-reference-documents-list__edit-button\"\n data-testid={`reference-document-edit-${doc.uid || doc.url}`}\n >\n {dictionary.edit}\n </Button>\n <span className=\"quote-management-reference-documents-list__separator\">|</span>\n <Button\n variant=\"tertiary\"\n onClick={() => onRemove?.(doc)}\n className=\"quote-management-reference-documents-list__remove-button\"\n data-testid={`reference-document-remove-${doc.uid || doc.url}`}\n >\n {dictionary.remove}\n </Button>\n </div>\n )}\n </div>\n ))}\n {isEditable && (\n <Button\n variant=\"tertiary\"\n onClick={onAdd}\n className=\"quote-management-reference-documents-list__add-button\"\n data-testid=\"reference-documents-add-button\"\n >\n + {dictionary.add}\n </Button>\n )}\n {documents.length === 0 && !isEditable && (\n <div className=\"quote-management-reference-documents-list__empty\">\n {dictionary.noReferenceDocuments}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useMemo, useCallback } from 'preact/compat';\nimport { ReferenceDocument } from '@/quote-management/components';\nimport { ReferenceDocumentLinkInput } from '@/quote-management/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview';\n\nexport interface UseReferenceDocumentLinksParams {\n templateReferenceDocuments?: ReferenceDocument[];\n localReferenceDocuments: ReferenceDocument[];\n}\n\nexport interface UseReferenceDocumentLinksReturn {\n /**\n * Checks if a document exists in the template reference documents.\n * Matches by uid if both documents have it, otherwise matches by url.\n */\n isDocumentInTemplateData: (document: ReferenceDocument) => boolean;\n /**\n * Returns documents from localReferenceDocuments that are not in templateReferenceDocuments.\n */\n getNewDocuments: () => ReferenceDocument[];\n /**\n * Transforms all reference documents to API format.\n */\n getReferenceDocumentLinks: () => ReferenceDocumentLinkInput[];\n /**\n * Indicates if there are unsaved changes (new documents, removed documents, or modified documents).\n */\n hasUnsavedChanges: boolean;\n}\n\n/**\n * Custom hook to manage reference document links logic.\n * Handles document matching, filtering new documents, transformation to API format,\n * and detection of unsaved changes (new, removed, or modified documents).\n * Note: getReferenceDocumentLinks() returns all local reference documents, not just new ones.\n */\nexport const useReferenceDocumentLinks = (\n params: UseReferenceDocumentLinksParams\n): UseReferenceDocumentLinksReturn => {\n const { templateReferenceDocuments, localReferenceDocuments } = params;\n\n /**\n * Helper function to find a matching document in template data for a given document.\n * Matches by uid if both documents have it, otherwise matches by url.\n * Returns the matching template document or undefined if no match is found.\n */\n const findMatchingTemplateDocument = useCallback(\n (document: ReferenceDocument): ReferenceDocument | undefined => {\n if (!templateReferenceDocuments) {\n return undefined;\n }\n return templateReferenceDocuments.find((templateDoc) => {\n // If both documents have uids, match by uid\n if (document.uid && templateDoc.uid) {\n return templateDoc.uid === document.uid;\n }\n // Otherwise, match by URL\n return templateDoc.url === document.url;\n });\n },\n [templateReferenceDocuments]\n );\n\n /**\n * Helper function to check if a document is part of the template data.\n * A document is considered part of template data if:\n * - Its uid exists in templateReferenceDocuments (when uid is available), OR\n * - Its url exists in templateReferenceDocuments (when uid is not available)\n */\n const isDocumentInTemplateData = useCallback(\n (document: ReferenceDocument): boolean => {\n return findMatchingTemplateDocument(document) !== undefined;\n },\n [findMatchingTemplateDocument]\n );\n\n /**\n * Helper function to check if a document has been modified.\n * Compares all properties (name, identifier, url) between a local document and its matching template document.\n * Returns true if any property differs.\n */\n const isDocumentModified = useCallback(\n (localDoc: ReferenceDocument, templateDoc: ReferenceDocument): boolean => {\n // Compare all properties\n return (\n localDoc.name !== templateDoc.name ||\n localDoc.identifier !== templateDoc.identifier ||\n localDoc.url !== templateDoc.url\n );\n },\n []\n );\n\n /**\n * Returns documents from localReferenceDocuments that are not in templateReferenceDocuments.\n */\n const getNewDocuments = useCallback((): ReferenceDocument[] => {\n if (!templateReferenceDocuments) {\n // If no template documents exist, all local documents are new\n return localReferenceDocuments;\n }\n // Filter to only include documents not in template data\n return localReferenceDocuments.filter((doc) => {\n return !templateReferenceDocuments.some((templateDoc) => {\n // If both documents have uids, match by uid\n if (doc.uid && templateDoc.uid) {\n return templateDoc.uid === doc.uid;\n }\n // Otherwise, match by URL\n return templateDoc.url === doc.url;\n });\n });\n }, [templateReferenceDocuments, localReferenceDocuments]);\n\n /**\n * Transforms all reference documents to API format.\n */\n const getReferenceDocumentLinks = useCallback((): ReferenceDocumentLinkInput[] => {\n return localReferenceDocuments.map((doc) => ({\n uid: doc.uid,\n name: doc.name,\n identifier: doc.identifier,\n url: doc.url,\n }));\n }, [localReferenceDocuments]);\n\n /**\n * Checks if there are unsaved changes.\n * Returns true if there are:\n * - New documents: documents in local state that don't exist in template data\n * - Removed documents: documents in template data that don't exist in local state\n * - Modified documents: documents that exist in both but have different properties (name, identifier, or url)\n */\n const hasUnsavedChanges = useMemo(() => {\n if (!templateReferenceDocuments) {\n // If no template documents exist, any documents in local state are unsaved (new)\n return localReferenceDocuments.length > 0;\n }\n\n // Check for new documents: documents in local state not found in template data\n const hasNewDocuments = localReferenceDocuments.some((localDoc) => {\n return findMatchingTemplateDocument(localDoc) === undefined;\n });\n\n if (hasNewDocuments) {\n return true;\n }\n\n // Check for removed documents: documents in template data not found in local state\n const hasRemovedDocuments = templateReferenceDocuments.some((templateDoc) => {\n return !localReferenceDocuments.some((localDoc) => {\n // If both documents have uids, match by uid\n if (localDoc.uid && templateDoc.uid) {\n return localDoc.uid === templateDoc.uid;\n }\n // Otherwise, match by URL\n return localDoc.url === templateDoc.url;\n });\n });\n\n if (hasRemovedDocuments) {\n return true;\n }\n\n // Check for modified documents: documents that match but have different properties\n const hasModifiedDocuments = localReferenceDocuments.some((localDoc) => {\n const matchingTemplateDoc = findMatchingTemplateDocument(localDoc);\n // Defensive code: The falsy branch should be unreachable because we've already checked\n // for new documents above. If a document doesn't have a match, we would have\n // returned true in the hasNewDocuments check. This is kept for safety.\n /* istanbul ignore else */\n if (matchingTemplateDoc) {\n return isDocumentModified(localDoc, matchingTemplateDoc);\n }\n /* istanbul ignore next */\n return false;\n });\n\n return hasModifiedDocuments;\n }, [templateReferenceDocuments, localReferenceDocuments, findMatchingTemplateDocument, isDocumentModified]);\n\n return {\n isDocumentInTemplateData,\n getNewDocuments,\n getReferenceDocumentLinks,\n hasUnsavedChanges,\n };\n};\n\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useCallback } from 'preact/compat';\n\nexport interface UseRenameTemplateParams {\n initialTemplateName?: string;\n templateNameRequiredErrorMessage?: string;\n}\n\nexport interface UseRenameTemplateReturn {\n /**\n * Whether the rename modal is currently open.\n */\n isRenameModalOpen: boolean;\n /**\n * The new template name entered by the user.\n */\n renameTemplateName: string;\n /**\n * The reason for renaming the template.\n */\n renameReason: string;\n /**\n * Error message for rename operation.\n */\n renameError: string;\n /**\n * Error message for template name validation.\n */\n renameTemplateNameError: string;\n /**\n * Success message for rename operation.\n */\n renameSuccess: string;\n /**\n * Opens the rename modal and initializes state with the current template name.\n */\n handleRenameClick: (currentTemplateName?: string) => void;\n /**\n * Closes the rename modal and resets all state.\n */\n handleRenameClose: () => void;\n /**\n * Updates the template name and clears any name-related errors.\n */\n handleRenameTemplateNameChange: (value: string) => void;\n /**\n * Updates the rename reason.\n */\n handleRenameReasonChange: (value: string) => void;\n /**\n * Validates and saves the rename. Closes the modal if validation passes.\n * Does not make an API call - rename is tracked locally and included when submitting for review.\n */\n handleRenameSave: () => boolean;\n /**\n * Resets rename state (useful after successful submission).\n */\n resetRenameState: () => void;\n}\n\n/**\n * Custom hook to manage quote template rename functionality.\n * Handles state management for the rename modal, validation, and tracking rename changes.\n * Note: This hook does not make API calls. The rename is tracked locally and should be\n * included when calling sendQuoteTemplateForReview.\n */\nexport const useRenameTemplate = (\n params: UseRenameTemplateParams = {}\n): UseRenameTemplateReturn => {\n const { initialTemplateName, templateNameRequiredErrorMessage = 'Template name is required' } = params;\n\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [renameTemplateName, setRenameTemplateName] = useState<string>('');\n const [renameReason, setRenameReason] = useState<string>('');\n const [renameError, setRenameError] = useState<string>('');\n const [renameTemplateNameError, setRenameTemplateNameError] = useState<string>('');\n const [renameSuccess, setRenameSuccess] = useState<string>('');\n\n const handleRenameClick = useCallback((currentTemplateName?: string) => {\n setRenameTemplateName(currentTemplateName || initialTemplateName || '');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n setIsRenameModalOpen(true);\n }, [initialTemplateName]);\n\n const handleRenameClose = useCallback(() => {\n setIsRenameModalOpen(false);\n setRenameTemplateName('');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n }, []);\n\n const handleRenameTemplateNameChange = useCallback((value: string) => {\n setRenameTemplateName(value);\n if (value.trim()) {\n setRenameTemplateNameError('');\n }\n }, []);\n\n const handleRenameReasonChange = useCallback((value: string) => {\n setRenameReason(value);\n }, []);\n\n const handleRenameSave = useCallback((): boolean => {\n // Validate template name\n if (!renameTemplateName.trim()) {\n setRenameTemplateNameError(templateNameRequiredErrorMessage);\n return false;\n }\n\n // Clear any previous errors\n setRenameError('');\n setRenameTemplateNameError('');\n \n // Close modal - rename is tracked in state and will be included when submitting for review\n setIsRenameModalOpen(false);\n return true;\n }, [renameTemplateName, templateNameRequiredErrorMessage]);\n\n const resetRenameState = useCallback(() => {\n setRenameTemplateName('');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n }, []);\n\n return {\n isRenameModalOpen,\n renameTemplateName,\n renameReason,\n renameError,\n renameTemplateNameError,\n renameSuccess,\n handleRenameClick,\n handleRenameClose,\n handleRenameTemplateNameChange,\n handleRenameReasonChange,\n handleRenameSave,\n resetRenameState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n createPortal,\n useRef,\n} from 'preact/compat';\nimport {\n Container,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Button,\n TextArea,\n InLineAlert,\n Icon,\n} from '@adobe-commerce/elsie/components';\nimport { NegotiableQuoteTemplateModel, NegotiableQuoteTemplateStatus } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport {\n TabbedContent,\n ActionsBar,\n ConfirmationModal,\n ManageNegotiableQuoteTemplate as ManageNegotiableQuoteTemplateComponent,\n ManageNegotiableQuoteTemplateProps as ManageNegotiableQuoteTemplateComponentProps,\n ReferenceDocumentsList,\n ReferenceDocumentFormModal,\n ReferenceDocument,\n} from '@/quote-management/components';\nimport {\n ItemsQuotedTemplate,\n QuoteTemplateCommentsList,\n QuoteTemplateHistoryLog,\n ShippingAddressDisplay,\n} from '@/quote-management/containers';\nimport {\n WarningFilled,\n CheckWithCircle,\n Edit,\n} from '@adobe-commerce/elsie/icons';\nimport {\n sendQuoteTemplateForReview,\n deleteQuoteTemplate,\n cancelQuoteTemplate,\n generateQuoteFromTemplate,\n openQuoteTemplate,\n acceptQuoteTemplate,\n ReferenceDocumentLinkInput,\n} from '@/quote-management/api';\nimport { useReferenceDocumentLinks } from '@/quote-management/hooks/useReferenceDocumentLinks';\nimport { useRenameTemplate } from '@/quote-management/hooks/useRenameTemplate';\nimport { RenameQuoteModal } from '@/quote-management/components/RenameQuoteModal';\n\nexport interface ManageNegotiableQuoteTemplateProps\n extends HTMLAttributes<HTMLDivElement> {\n onActionsButtonClick?: (action: string) => void;\n onSendForReview?: (params: {\n templateData?: NegotiableQuoteTemplateModel;\n name?: string;\n comment?: string;\n referenceDocumentLinks?: ReferenceDocumentLinkInput[];\n }) => void;\n slots?: {\n TemplateName?: SlotProps<{\n templateName?: string;\n templateData?: NegotiableQuoteTemplateModel;\n templateDisplayName?: string;\n isRenameDisabled?: boolean;\n }>;\n TemplateStatus?: SlotProps<{\n templateStatus?: string;\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Banner?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Details?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ActionBar?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ReferenceDocuments?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n referenceDocuments?: ReferenceDocument[];\n isEditable?: boolean;\n onAddDocument?: () => void;\n onEditDocument?: (document: ReferenceDocument) => void;\n onRemoveDocument?: (document: ReferenceDocument) => void;\n referenceDocumentsTitle?: string;\n }>;\n ItemsTable?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ItemsQuotedTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n CommentsTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLogTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n CommentsTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Comments?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLogTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLog?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Footer?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n comment?: string;\n isSubmitting?: boolean;\n referenceDocuments?: ReferenceDocument[];\n hasUnsavedChanges?: boolean;\n handleSendForReview: () => void;\n showAcceptButton?: boolean;\n renameTemplateName?: string;\n renameReason?: string;\n }>;\n ShippingInformationTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ShippingInformation?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n loading?: boolean;\n setLoading?: (loading: boolean) => void;\n }>;\n };\n}\n\nexport const ManageNegotiableQuoteTemplate: Container<ManageNegotiableQuoteTemplateProps> = ({\n slots,\n onActionsButtonClick,\n onSendForReview,\n ...props\n}) => {\n const [templateData, setTemplateData] = useState<NegotiableQuoteTemplateModel | undefined>(undefined);\n const [loading, setLoading] = useState<boolean>(true);\n const [comment, setComment] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState<boolean>(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n const [deleteSuccess, setDeleteSuccess] = useState<boolean>(false);\n const [isCancelDialogOpen, setIsCancelDialogOpen] = useState<boolean>(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n const [cancelSuccess, setCancelSuccess] = useState<boolean>(false);\n const [referenceDocuments, setReferenceDocuments] = useState<ReferenceDocument[]>([]);\n const [isDocumentModalOpen, setIsDocumentModalOpen] = useState<boolean>(false);\n const [editingDocument, setEditingDocument] = useState<ReferenceDocument | undefined>(undefined);\n const [documentModalErrorMessage, setDocumentModalErrorMessage] = useState<string | null>(null);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [generateQuoteSuccessMessage, setGenerateQuoteSuccessMessage] = useState<string>('');\n const [generateQuoteErrorMessage, setGenerateQuoteErrorMessage] = useState<string>('');\n const [showAcceptModal, setShowAcceptModal] = useState<boolean>(false);\n const [isAccepting, setIsAccepting] = useState<boolean>(false);\n const [acceptSuccessMessage, setAcceptSuccessMessage] = useState<string>('');\n const [acceptErrorMessage, setAcceptErrorMessage] = useState<string>('');\n const hasAutoOpened = useRef<boolean>(false);\n\n // Use hook for reference document links logic\n const {\n getReferenceDocumentLinks,\n hasUnsavedChanges: hasUnsavedReferenceDocuments,\n } = useReferenceDocumentLinks({\n templateReferenceDocuments: templateData?.referenceDocuments,\n localReferenceDocuments: referenceDocuments,\n });\n\n const dictionary = useText({\n createdLabel: 'NegotiableQuoteTemplate.Manage.createdLabel',\n salesRepLabel: 'NegotiableQuoteTemplate.Manage.salesRepLabel',\n expiresLabel: 'NegotiableQuoteTemplate.Manage.expiresLabel',\n templateIdLabel: 'NegotiableQuoteTemplate.Manage.templateIdLabel',\n actionsLabel: 'NegotiableQuoteTemplate.Manage.actionsLabel',\n referenceDocumentsTitle: 'NegotiableQuoteTemplate.Manage.referenceDocuments.title',\n commentsTitle: 'NegotiableQuoteTemplate.Manage.comments.title',\n historyLogTitle: 'NegotiableQuoteTemplate.Manage.historyLog.title',\n itemsQuotedTab: 'NegotiableQuoteTemplate.Manage.tabs.itemsQuoted',\n commentsTab: 'NegotiableQuoteTemplate.Manage.tabs.comments',\n historyLogTab: 'NegotiableQuoteTemplate.Manage.tabs.historyLog',\n templateCommentsPlaceholder: 'NegotiableQuoteTemplate.Manage.templateComments.placeholder',\n sendForReview: 'NegotiableQuoteTemplate.Manage.actionButtons.sendForReview',\n delete: 'NegotiableQuoteTemplate.Manage.actionButtons.delete',\n cancel: 'NegotiableQuoteTemplate.Manage.actionButtons.cancel',\n confirmationModalDeleteTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.title',\n confirmationModalDeleteMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.message',\n confirmationModalDeleteConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.confirm',\n confirmationModalDeleteErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.errorHeading',\n confirmationModalDeleteErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.errorFallback',\n confirmationModalDeleteSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.successHeading',\n confirmationModalDeleteSuccessDescription: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.successDescription',\n confirmationModalCancelTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.title',\n confirmationModalCancelMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.message',\n confirmationModalCancelConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.confirm',\n confirmationModalCancelErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.errorHeading',\n confirmationModalCancelErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.errorFallback',\n confirmationModalCancelSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.successHeading',\n confirmationModalCancelSuccessDescription: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.successDescription',\n confirmationModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n accept: 'NegotiableQuoteTemplate.Manage.actionButtons.accept',\n generateQuote: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalTitle: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message',\n generateQuoteModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n generateQuoteModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm',\n generateQuoteModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading',\n generateQuoteModalSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successHeading',\n generateQuoteSuccessMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successDescription',\n generateQuoteModalErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorHeading',\n generateQuoteErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorFallback',\n acceptModalTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.title',\n acceptModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.message',\n acceptModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n acceptModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.confirm',\n acceptModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.confirmLoading',\n acceptModalSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.successHeading',\n acceptSuccessMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.successDescription',\n acceptModalErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.errorHeading',\n acceptErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.errorFallback',\n documentDuplicateUidError: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.duplicateUidError',\n renameTitle: 'NegotiableQuoteTemplate.Manage.rename.title',\n renameTemplateNameLabel: 'NegotiableQuoteTemplate.Manage.rename.templateNameLabel',\n renameReasonLabel: 'NegotiableQuoteTemplate.Manage.rename.reasonLabel',\n renameButton: 'NegotiableQuoteTemplate.Manage.rename.renameButton',\n renameCancelButton: 'NegotiableQuoteTemplate.Manage.rename.cancelButton',\n renameErrorHeading: 'NegotiableQuoteTemplate.Manage.rename.errorHeading',\n renameTemplateNameRequired: 'NegotiableQuoteTemplate.Manage.rename.templateNameRequired',\n renameErrorDefault: 'NegotiableQuoteTemplate.Manage.rename.errorDefault',\n renameSuccessHeading: 'NegotiableQuoteTemplate.Manage.rename.successHeading',\n renameSuccessMessage: 'NegotiableQuoteTemplate.Manage.rename.successMessage',\n shippingInformationTitle: 'NegotiableQuoteTemplate.Manage.shippingInformation.title',\n unsavedChangesWarningHeading: 'NegotiableQuoteTemplate.Manage.unsavedChangesWarningHeading',\n unsavedChangesWarningMessage: 'NegotiableQuoteTemplate.Manage.unsavedChangesWarningMessage',\n shippingAddressWarningHeading: 'NegotiableQuoteTemplate.Manage.shippingAddressWarningHeading',\n shippingAddressWarningMessage: 'NegotiableQuoteTemplate.Manage.shippingAddressWarningMessage',\n });\n\n // Use hook for rename template logic (after dictionary is defined)\n const {\n isRenameModalOpen,\n renameTemplateName,\n renameReason,\n renameError,\n renameTemplateNameError,\n renameSuccess,\n handleRenameClick,\n handleRenameClose,\n handleRenameTemplateNameChange,\n handleRenameReasonChange,\n handleRenameSave,\n resetRenameState,\n } = useRenameTemplate({\n initialTemplateName: templateData?.name,\n templateNameRequiredErrorMessage: dictionary.renameTemplateNameRequired,\n });\n\n // Check if there are unsaved rename changes\n const hasUnsavedRenameChanges = useMemo(() => {\n // A rename change exists when renameTemplateName is set and differs from current template name\n return renameTemplateName !== '' && renameTemplateName !== templateData?.name;\n }, [renameTemplateName, templateData?.name]);\n\n // Combine unsaved changes from reference documents and rename\n const hasUnsavedChanges = useMemo(() => {\n return hasUnsavedReferenceDocuments || hasUnsavedRenameChanges;\n }, [hasUnsavedReferenceDocuments, hasUnsavedRenameChanges]);\n\n /* Event listeners */\n useEffect(() => {\n const quoteTemplateDataEvent = events.on('quote-management/quote-template-data', (data) => {\n if (data.quoteTemplate) {\n setTemplateData(data.quoteTemplate);\n setLoading(false);\n // Reset comment and submitting state after successful update\n setComment('');\n setIsSubmitting(false);\n // Update reference documents from template data\n setReferenceDocuments(data.quoteTemplate.referenceDocuments || []);\n // Reset rename state after successful submission\n resetRenameState();\n }\n }, { eager: true });\n\n return () => quoteTemplateDataEvent?.off();\n }, [resetRenameState]);\n\n // Initialize reference documents when template data changes\n useEffect(() => {\n if (templateData?.referenceDocuments) {\n setReferenceDocuments(templateData.referenceDocuments);\n }\n }, [templateData?.referenceDocuments]);\n\n // Auto-open template if status is \"Updated\"\n useEffect(() => {\n if (templateData && templateData.status === NegotiableQuoteTemplateStatus.UPDATED && !hasAutoOpened.current) {\n hasAutoOpened.current = true;\n const openTemplate = async () => {\n try {\n await openQuoteTemplate({ templateId: templateData.id });\n // The event listener will handle updating state\n } catch (error) {\n console.error('Failed to auto-open quote template:', error);\n // Silently fail - template data is still available for viewing\n }\n };\n openTemplate();\n }\n }, [templateData]);\n\n /**\n * Handlers\n */\n const handleDeleteCancel = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeleteError(null);\n setDeleteSuccess(false);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n /* istanbul ignore next */ // If there is no template data, the button should not be enabled or even rendered\n if (!templateData?.id) {\n return;\n }\n\n setDeleteError(null);\n setDeleteSuccess(false);\n\n try {\n await deleteQuoteTemplate({\n templateId: templateData.id,\n });\n setDeleteSuccess(true);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setIsDeleteDialogOpen(false);\n setDeleteSuccess(false);\n }, 2000);\n } catch (error) {\n const errorMessage = (error as Error).message || dictionary.confirmationModalDeleteErrorFallback;\n setDeleteError(errorMessage);\n }\n }, [templateData, dictionary.confirmationModalDeleteErrorFallback]);\n\n const handleDismissError = useCallback(() => {\n setDeleteError(null);\n }, []);\n\n const handleDismissSuccess = useCallback(() => {\n setDeleteSuccess(false);\n }, []);\n\n const handleCancelCancel = useCallback(() => {\n setIsCancelDialogOpen(false);\n setCancelError(null);\n setCancelSuccess(false);\n }, []);\n\n const handleCancelConfirm = useCallback(async () => {\n /* istanbul ignore next */ // If there is no template data, the button should not be enabled or even rendered\n if (!templateData?.id) {\n return;\n }\n\n setCancelError(null);\n setCancelSuccess(false);\n\n try {\n await cancelQuoteTemplate({\n templateId: templateData.id,\n });\n setCancelSuccess(true);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setIsCancelDialogOpen(false);\n setCancelSuccess(false);\n }, 2000);\n } catch (error) {\n const errorMessage = (error as Error).message || dictionary.confirmationModalCancelErrorFallback;\n setCancelError(errorMessage);\n }\n }, [templateData, dictionary.confirmationModalCancelErrorFallback]);\n\n const handleDismissCancelError = useCallback(() => {\n setCancelError(null);\n }, []);\n\n const handleDismissCancelSuccess = useCallback(() => {\n setCancelSuccess(false);\n }, []);\n\n const handleSendForReview = useCallback(async () => {\n // Get all reference document links\n const referenceDocumentLinks = getReferenceDocumentLinks();\n\n // Combine comment with rename reason if rename reason exists\n const combinedComment = [renameReason.trim(), comment.trim()]\n .filter(Boolean)\n .join('\\n\\n')\n .trim() || undefined;\n\n // Include renamed name if it differs from current template name\n const templateName = renameTemplateName && renameTemplateName !== templateData?.name\n ? renameTemplateName\n : undefined;\n\n // If override prop is provided, use it instead of the API\n if (onSendForReview) {\n onSendForReview({\n templateData,\n name: templateName,\n comment: combinedComment,\n referenceDocumentLinks,\n });\n return;\n }\n // Otherwise, use the sendQuoteTemplateForReview API\n setIsSubmitting(true);\n\n try {\n await sendQuoteTemplateForReview({\n templateId: templateData!.id, // the button should be disabled if templateData is null\n name: templateName,\n comment: combinedComment,\n referenceDocumentLinks: referenceDocumentLinks.length > 0 ? referenceDocumentLinks : undefined,\n });\n // The quote-template-data event will handle updating state\n } catch (error) {\n console.error('Failed to send quote template for review:', error);\n setIsSubmitting(false);\n // TODO: Show error notification to user\n }\n }, [templateData, onSendForReview, comment, renameReason, renameTemplateName, getReferenceDocumentLinks]);\n\n const handleAddDocument = useCallback(() => {\n setEditingDocument(undefined);\n setDocumentModalErrorMessage(null);\n setIsDocumentModalOpen(true);\n }, []);\n\n const handleEditDocument = useCallback((document: ReferenceDocument) => {\n setEditingDocument(document);\n setDocumentModalErrorMessage(null);\n setIsDocumentModalOpen(true);\n }, []);\n\n const handleRemoveDocument = useCallback((document: ReferenceDocument) => {\n setReferenceDocuments((prev) => prev.filter((doc) => doc.uid !== document.uid || doc.url !== document.url));\n }, []);\n\n const handleSaveDocument = useCallback((document: ReferenceDocument) => {\n // Clear any previous error messages\n setDocumentModalErrorMessage(null);\n\n if (editingDocument) {\n // Update existing document\n setReferenceDocuments((prev) =>\n prev.map((doc) =>\n doc.identifier === editingDocument.identifier\n ? document\n : doc\n )\n );\n } else {\n // Add new document\n setReferenceDocuments((prev) => [...prev, document]);\n }\n setIsDocumentModalOpen(false);\n setEditingDocument(undefined);\n }, [editingDocument]);\n\n const handleDocumentModalClose = useCallback(() => {\n setIsDocumentModalOpen(false);\n setEditingDocument(undefined);\n setDocumentModalErrorMessage(null);\n }, []);\n\n // Generate quote handler\n const handleGenerateQuote = useCallback(async () => {\n setIsGeneratingQuote(true);\n setGenerateQuoteErrorMessage('');\n setGenerateQuoteSuccessMessage('');\n try {\n await generateQuoteFromTemplate({ templateId: templateData!.id });\n // Show success message\n setGenerateQuoteSuccessMessage(dictionary.generateQuoteSuccessMessage);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n const errorMessage = error instanceof Error ? error.message : dictionary.generateQuoteErrorFallback;\n setGenerateQuoteErrorMessage(errorMessage);\n } finally {\n setIsGeneratingQuote(false);\n }\n }, [templateData, dictionary.generateQuoteSuccessMessage, dictionary.generateQuoteErrorFallback]);\n\n const handleGenerateQuoteModalCancel = useCallback(() => {\n setShowGenerateQuoteModal(false);\n setGenerateQuoteErrorMessage('');\n setGenerateQuoteSuccessMessage('');\n }, []);\n\n // Accept quote template handler\n const handleAcceptQuote = useCallback(async () => {\n setIsAccepting(true);\n setAcceptErrorMessage('');\n setAcceptSuccessMessage('');\n try {\n await acceptQuoteTemplate({ templateId: templateData!.id });\n // Show success message\n setAcceptSuccessMessage(dictionary.acceptSuccessMessage);\n } catch (error) {\n console.error('Failed to accept quote template:', error);\n const errorMessage = error instanceof Error ? error.message : dictionary.acceptErrorFallback;\n setAcceptErrorMessage(errorMessage);\n } finally {\n setIsAccepting(false);\n }\n }, [templateData, dictionary.acceptSuccessMessage, dictionary.acceptErrorFallback]);\n\n const handleAcceptModalCancel = useCallback(() => {\n setShowAcceptModal(false);\n setAcceptErrorMessage('');\n setAcceptSuccessMessage('');\n }, []);\n\n /**\n * VNodes for the ManageNegotiableQuoteTemplate component\n */\n\n // Template name\n const templateName = useMemo(() => {\n // Determine if rename is disabled based on canSendForReview permission\n const isRenameDisabled = !templateData?.canSendForReview;\n\n // Use the renamed template name if it exists\n const templateDisplayName = renameTemplateName || templateData?.name;\n\n return (\n <Slot\n name=\"TemplateName\"\n slot={slots?.TemplateName}\n context={{ templateName: templateData?.name, templateData, templateDisplayName, isRenameDisabled }}\n >\n <div className=\"quote-management-manage-negotiable-quote-template__template-name-wrapper\">\n <h1\n data-testid=\"template-name\"\n className=\"quote-management-manage-negotiable-quote-template__template-name-title\"\n >\n {templateDisplayName}\n </h1>\n <button\n onClick={() => handleRenameClick(templateDisplayName)}\n disabled={isRenameDisabled}\n data-testid=\"rename-template-button\"\n className=\"quote-management-manage-negotiable-quote-template__rename-button\"\n aria-label=\"Rename template\"\n >\n <Edit />\n </button>\n </div>\n </Slot>\n );\n }, [slots?.TemplateName, templateData, handleRenameClick, renameTemplateName]);\n\n // Template Status\n const templateStatus = useMemo(() => {\n return (\n <Slot\n name=\"TemplateStatus\"\n slot={slots?.TemplateStatus}\n context={{ templateStatus: templateData?.status, templateData }}\n >\n <div data-testid=\"template-status\">{templateData?.status}</div>\n </Slot>\n );\n }, [slots?.TemplateStatus, templateData]);\n\n // Details\n const details = useMemo(() => {\n if (!templateData) {\n return;\n }\n\n // Format expiration date if it exists\n const expirationDate = templateData.expirationDate ? formattedDate(templateData.expirationDate, 'short') : undefined;\n\n return (\n <Slot name=\"Details\" slot={slots?.Details} context={{ templateData }}>\n {/* template id data */}\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"template-id-label\"\n >\n {dictionary.templateIdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"template-id-value\"\n >\n {templateData.id}\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"created-label\"\n >\n {dictionary.createdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"created-value\"\n >\n {formattedDate(templateData.createdAt, 'short')} (\n {templateData.buyer.firstname} {templateData.buyer.lastname})\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"sales-rep-label\"\n >\n {dictionary.salesRepLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"sales-rep-value\"\n >\n {templateData.salesRepName}\n </span>\n </div>\n\n {expirationDate && (\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"expires-label\"\n >\n {dictionary.expiresLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"expires-value\"\n >\n {expirationDate}\n </span>\n </div>\n )}\n </Slot>\n );\n }, [slots?.Details, dictionary, templateData]);\n\n\n // Action bar\n const buttons: { label: string; value: string; disabled?: boolean }[] =\n useMemo(() => {\n return [\n {\n label: dictionary.generateQuote,\n value: 'generateQuote',\n disabled: !templateData?.canGenerateQuoteFromTemplate,\n },\n ];\n }, [dictionary, templateData?.canGenerateQuoteFromTemplate]);\n\n const actionBar = useMemo(() => {\n const handleActionsButtonClick = (action: string) => {\n switch (action) {\n case 'generateQuote':\n setShowGenerateQuoteModal(true);\n setGenerateQuoteErrorMessage(''); // Clear modal errors\n setGenerateQuoteSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n }\n };\n\n return (\n <Slot\n name=\"ActionBar\"\n slot={slots?.ActionBar}\n context={{ templateData }}\n >\n <ActionsBar\n dropdownPlaceholder={dictionary.actionsLabel}\n dropdownOptions={[]}\n buttons={buttons.map((button) => (\n <Button\n key={button.value}\n variant=\"tertiary\"\n onClick={() => handleActionsButtonClick(button.value)}\n data-testid={`actions-bar-${button.value}-button`}\n data-action={button.value}\n disabled={button.disabled}\n >\n {button.label}\n </Button>\n ))}\n />\n </Slot>\n );\n }, [\n buttons,\n dictionary,\n slots?.ActionBar,\n templateData,\n onActionsButtonClick,\n ]);\n\n // Reference documents\n const isEditable = useMemo(() => {\n const status = templateData?.status as string;\n return status === 'Draft' || status === 'Open';\n }, [templateData?.status]);\n\n\n const referenceDocumentsNode = useMemo(() => {\n const shouldShowTitle = referenceDocuments.length > 0 || isEditable;\n const title = shouldShowTitle ? dictionary.referenceDocumentsTitle : undefined;\n\n return (\n <Slot\n name=\"ReferenceDocuments\"\n slot={slots?.ReferenceDocuments}\n context={{ templateData, referenceDocuments, isEditable, onAddDocument: handleAddDocument, onEditDocument: handleEditDocument, onRemoveDocument: handleRemoveDocument, referenceDocumentsTitle: dictionary.referenceDocumentsTitle }}\n >\n <div data-testid=\"reference-documents\">\n {shouldShowTitle && <h2>{title}</h2>}\n <ReferenceDocumentsList\n documents={referenceDocuments}\n isEditable={isEditable}\n onAdd={handleAddDocument}\n onEdit={handleEditDocument}\n onRemove={handleRemoveDocument}\n />\n </div>\n </Slot>\n );\n }, [slots?.ReferenceDocuments, dictionary, templateData, referenceDocuments, isEditable, handleAddDocument, handleEditDocument, handleRemoveDocument]);\n\n // Shipping information title\n const shippingInformationTitle = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformationTitle\"\n slot={slots?.ShippingInformationTitle}\n context={{ templateData }}\n >\n <h2>{dictionary.shippingInformationTitle}</h2>\n </Slot>\n );\n }, [slots?.ShippingInformationTitle, templateData, dictionary]);\n\n // Shipping information\n const shippingInformation = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformation\"\n slot={slots?.ShippingInformation}\n context={{ templateData, loading, setLoading }}\n >\n <ShippingAddressDisplay\n shippingAddress={templateData?.shippingAddresses?.[0]}\n loading={loading}\n data-testid=\"manage-template-shipping-address\"\n />\n </Slot>\n );\n }, [slots?.ShippingInformation, templateData, loading, setLoading]);\n\n // Items table (using TabbedContent with ItemsQuoted)\n const itemsTable = useMemo(() => {\n return (\n <Slot\n name=\"ItemsTable\"\n slot={slots?.ItemsTable}\n context={{ templateData }}\n >\n <TabbedContent\n tabs={\n new Map([\n ['items-quoted', dictionary.itemsQuotedTab],\n ['comments', dictionary.commentsTab],\n ['history-log', dictionary.historyLogTab],\n ])\n }\n tabsContent={\n new Map([\n [\n 'items-quoted',\n <Slot\n key=\"items-quoted\"\n name=\"ItemsQuotedTab\"\n slot={slots?.ItemsQuotedTab}\n context={{ templateData }}\n >\n <ItemsQuotedTemplate templateData={templateData} />\n </Slot>,\n ],\n [\n 'comments',\n <Slot\n key=\"comments\"\n name=\"CommentsTab\"\n slot={slots?.CommentsTab}\n context={{ templateData }}\n >\n <QuoteTemplateCommentsList templateData={templateData} />\n </Slot>,\n ],\n [\n 'history-log',\n <Slot\n key=\"history-log\"\n name=\"HistoryLogTab\"\n slot={slots?.HistoryLogTab}\n context={{ templateData }}\n >\n <QuoteTemplateHistoryLog templateData={templateData} />\n </Slot>,\n ],\n ])\n }\n />\n </Slot>\n );\n }, [\n slots?.ItemsTable,\n slots?.ItemsQuotedTab,\n slots?.CommentsTab,\n slots?.HistoryLogTab,\n dictionary,\n templateData,\n ]);\n\n // Comments title\n const commentsTitle = useMemo(() => {\n return (\n <Slot\n name=\"CommentsTitle\"\n slot={slots?.CommentsTitle}\n context={{ templateData }}\n >\n <h2>{dictionary.commentsTitle}</h2>\n </Slot>\n );\n }, [slots?.CommentsTitle, dictionary, templateData]);\n\n // Comments\n const comments = useMemo(() => {\n return (\n <Slot\n name=\"Comments\"\n slot={slots?.Comments}\n context={{ templateData }}\n >\n <TextArea\n name=\"templateComments\"\n placeholder={dictionary.templateCommentsPlaceholder}\n rows={3}\n value={comment}\n onInput={(e) => {\n setComment((e.target as HTMLTextAreaElement).value);\n }}\n disabled={!templateData?.canSendForReview || isSubmitting}\n />\n </Slot>\n );\n }, [slots?.Comments, dictionary, templateData, comment, isSubmitting]);\n\n\n // Unsaved changes warning banner\n const unsavedChangesBanner = useMemo(\n () =>\n hasUnsavedChanges ? (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.unsavedChangesWarningHeading}\n description={dictionary.unsavedChangesWarningMessage}\n data-testid=\"unsaved-changes-warning-alert\"\n />\n ) : undefined,\n [hasUnsavedChanges, dictionary.unsavedChangesWarningHeading, dictionary.unsavedChangesWarningMessage]\n );\n\n // Shipping address warning banner\n const shippingAddressWarningBanner = useMemo(() => {\n return templateData?.shippingAddresses?.length ? undefined : (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.shippingAddressWarningHeading}\n description={dictionary.shippingAddressWarningMessage}\n data-testid=\"shipping-address-warning-alert\"\n />\n );\n }, [templateData?.shippingAddresses?.length, dictionary.shippingAddressWarningHeading, dictionary.shippingAddressWarningMessage]);\n\n const banners = useMemo(() => {\n return <>\n {unsavedChangesBanner}\n {shippingAddressWarningBanner}\n </>\n }, [unsavedChangesBanner, shippingAddressWarningBanner]);\n\n // Footer\n const footer = useMemo(() => {\n const showAcceptButton = templateData?.status === NegotiableQuoteTemplateStatus.OPEN && templateData?.canAccept;\n\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ templateData, comment, isSubmitting, referenceDocuments, hasUnsavedChanges, handleSendForReview, showAcceptButton, renameTemplateName, renameReason }}\n >\n {showAcceptButton && (\n <Button\n variant=\"primary\"\n onClick={() => {\n setShowAcceptModal(true);\n setAcceptErrorMessage(''); // Clear modal errors\n setAcceptSuccessMessage(''); // Clear modal success messages\n }}\n data-testid=\"accept-button\"\n disabled={isSubmitting || hasUnsavedChanges}\n >\n {dictionary.accept}\n </Button>\n )}\n\n {templateData?.canSendForReview && (\n <Button\n variant=\"primary\"\n onClick={handleSendForReview}\n data-testid=\"send-for-review-button\"\n disabled={isSubmitting || !templateData?.shippingAddresses?.length}\n >\n {dictionary.sendForReview}\n </Button>\n )}\n {templateData?.canCancel && (\n <Button\n variant=\"tertiary\"\n onClick={() => setIsCancelDialogOpen(true)}\n data-testid=\"cancel-template-button\"\n disabled={isSubmitting}\n >\n {dictionary.cancel}\n </Button>\n )}\n {templateData?.canDelete && (\n <Button\n variant=\"tertiary\"\n onClick={() => setIsDeleteDialogOpen(true)}\n data-testid=\"delete-template-button\"\n disabled={isSubmitting}\n >\n {dictionary.delete}\n </Button>\n )}\n </Slot>\n );\n }, [\n slots?.Footer,\n dictionary,\n templateData,\n comment,\n isSubmitting,\n handleSendForReview,\n referenceDocuments,\n hasUnsavedChanges,\n renameTemplateName,\n renameReason,\n ]);\n\n // Delete error banner\n const deleteErrorBanner = deleteError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDeleteErrorHeading}\n description={deleteError}\n onDismiss={handleDismissError}\n data-testid=\"confirmation-modal-error-banner\"\n />\n ) : null;\n\n // Delete success banner\n const deleteSuccessBanner = deleteSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalDeleteSuccessHeading}\n description={dictionary.confirmationModalDeleteSuccessDescription}\n onDismiss={handleDismissSuccess}\n data-testid=\"confirmation-modal-success-banner\"\n />\n ) : null;\n\n const deleteBanner = deleteSuccessBanner || deleteErrorBanner;\n\n // Cancel error banner\n const cancelErrorBanner = cancelError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalCancelErrorHeading}\n description={cancelError}\n onDismiss={handleDismissCancelError}\n data-testid=\"confirmation-modal-cancel-error-banner\"\n />\n ) : null;\n\n // Cancel success banner\n const cancelSuccessBanner = cancelSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalCancelSuccessHeading}\n description={dictionary.confirmationModalCancelSuccessDescription}\n onDismiss={handleDismissCancelSuccess}\n data-testid=\"confirmation-modal-cancel-success-banner\"\n />\n ) : null;\n\n const cancelBanner = cancelSuccessBanner || cancelErrorBanner;\n\n // Rename modal error banner\n const renameErrorBanner = useMemo(\n () =>\n renameError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled color=\"var(--color-error)\" />}\n heading={dictionary.renameErrorHeading}\n description={renameError}\n />\n ) : undefined,\n [renameError, dictionary.renameErrorHeading]\n );\n\n // Rename modal success banner\n const renameSuccessBanner = useMemo(\n () =>\n renameSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.renameSuccessHeading}\n description={renameSuccess}\n />\n ) : undefined,\n [renameSuccess, dictionary.renameSuccessHeading]\n );\n\n const manageNegotiableQuoteTemplateProps: ManageNegotiableQuoteTemplateComponentProps = {\n ...props,\n loading,\n templateName,\n templateStatus,\n banner: banners,\n details,\n actionBar,\n referenceDocuments: referenceDocumentsNode,\n itemsTable,\n shippingInformationTitle,\n shippingInformation,\n commentsTitle,\n comments,\n footer,\n };\n\n // Create banner for generate quote modal based on success/error state\n let generateQuoteModalBanner = null;\n if (generateQuoteSuccessMessage) {\n generateQuoteModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<Icon source=\"CheckWithCircle\" />}\n heading={dictionary.generateQuoteModalSuccessHeading}\n description={generateQuoteSuccessMessage}\n data-testid=\"generate-quote-success-banner\"\n />\n );\n } else if (generateQuoteErrorMessage) {\n generateQuoteModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<Icon source=\"WarningFilled\" />}\n heading={dictionary.generateQuoteModalErrorHeading}\n description={generateQuoteErrorMessage}\n data-testid=\"generate-quote-error-banner\"\n />\n );\n }\n\n // Create banner for accept modal based on success/error state\n let acceptModalBanner = null;\n if (acceptSuccessMessage) {\n acceptModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<Icon source=\"CheckWithCircle\" />}\n heading={dictionary.acceptModalSuccessHeading}\n description={acceptSuccessMessage}\n data-testid=\"accept-success-banner\"\n />\n );\n } else if (acceptErrorMessage) {\n acceptModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<Icon source=\"WarningFilled\" />}\n heading={dictionary.acceptModalErrorHeading}\n description={acceptErrorMessage}\n data-testid=\"accept-error-banner\"\n />\n );\n }\n\n return (\n <>\n <ManageNegotiableQuoteTemplateComponent {...manageNegotiableQuoteTemplateProps} />\n {isDeleteDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isDeleteDialogOpen}\n title={dictionary.confirmationModalDeleteTitle}\n message={dictionary.confirmationModalDeleteMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalDeleteConfirm}\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n showCloseButton={!deleteBanner}\n confirmationBanner={deleteBanner}\n />,\n document.body\n )}\n {isCancelDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isCancelDialogOpen}\n title={dictionary.confirmationModalCancelTitle}\n message={dictionary.confirmationModalCancelMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalCancelConfirm}\n onCancel={handleCancelCancel}\n onConfirm={handleCancelConfirm}\n showCloseButton={!cancelBanner}\n confirmationBanner={cancelBanner}\n />,\n document.body\n )}\n {isDocumentModalOpen &&\n createPortal(\n <ReferenceDocumentFormModal\n open={isDocumentModalOpen}\n document={editingDocument}\n errorMessage={documentModalErrorMessage || undefined}\n onSave={handleSaveDocument}\n onClose={handleDocumentModalClose}\n isSubmitting={isSubmitting}\n />,\n document.body\n )}\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuoteModalTitle}\n message={dictionary.generateQuoteModalMessage}\n cancelLabel={dictionary.generateQuoteModalCancel}\n confirmLabel={\n isGeneratingQuote\n ? dictionary.generateQuoteModalConfirmLoading\n : dictionary.generateQuoteModalConfirm\n }\n onCancel={handleGenerateQuoteModalCancel}\n onConfirm={isGeneratingQuote ? undefined : handleGenerateQuote}\n showCloseButton={true}\n confirmationBanner={generateQuoteModalBanner}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n {showAcceptModal &&\n createPortal(\n <ConfirmationModal\n open={showAcceptModal}\n title={dictionary.acceptModalTitle}\n message={dictionary.acceptModalMessage}\n cancelLabel={dictionary.acceptModalCancel}\n confirmLabel={\n isAccepting\n ? dictionary.acceptModalConfirmLoading\n : dictionary.acceptModalConfirm\n }\n onCancel={handleAcceptModalCancel}\n onConfirm={isAccepting ? undefined : handleAcceptQuote}\n showCloseButton={true}\n confirmationBanner={acceptModalBanner}\n data-testid=\"accept-confirmation-modal\"\n />,\n document.body\n )}\n {isRenameModalOpen &&\n createPortal(\n <RenameQuoteModal\n open={isRenameModalOpen}\n quoteName={renameTemplateName}\n renameReason={renameReason}\n quoteNameError={renameTemplateNameError}\n errorBanner={renameErrorBanner}\n successBanner={renameSuccessBanner}\n onQuoteNameChange={handleRenameTemplateNameChange}\n onRenameReasonChange={handleRenameReasonChange}\n onSave={handleRenameSave}\n onClose={handleRenameClose}\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["ManageNegotiableQuoteTemplate","className","loading","templateName","templateStatus","banner","details","actionBar","referenceDocuments","itemsTable","shippingInformationTitle","shippingInformation","commentsTitle","comments","footer","props","ManageNegotiableQuoteTemplateSkeleton","jsxs","classes","jsx","VComponent","Skeleton","SkeletonRow","ReferenceDocumentFormModal","open","document","errorMessage","errorBanner","successBanner","showCloseButton","isSubmitting","onSave","onClose","documentName","setDocumentName","useState","documentIdentifier","setDocumentIdentifier","referenceUrl","setReferenceUrl","errors","setErrors","dictionary","useText","displayErrorBanner","InLineAlert","WarningFilled","isEditMode","useEffect","validateUrl","useCallback","url","handleSave","newErrors","handleClose","Modal","Fragment","Input","e","Button","ReferenceDocumentsList","documents","isEditable","onAdd","onEdit","onRemove","formatDocumentDisplay","doc","handleDocumentClick","useReferenceDocumentLinks","params","templateReferenceDocuments","localReferenceDocuments","findMatchingTemplateDocument","templateDoc","isDocumentInTemplateData","isDocumentModified","localDoc","getNewDocuments","getReferenceDocumentLinks","hasUnsavedChanges","useMemo","matchingTemplateDoc","useRenameTemplate","initialTemplateName","templateNameRequiredErrorMessage","isRenameModalOpen","setIsRenameModalOpen","renameTemplateName","setRenameTemplateName","renameReason","setRenameReason","renameError","setRenameError","renameTemplateNameError","setRenameTemplateNameError","renameSuccess","setRenameSuccess","handleRenameClick","currentTemplateName","handleRenameClose","handleRenameTemplateNameChange","value","handleRenameReasonChange","handleRenameSave","resetRenameState","slots","onActionsButtonClick","onSendForReview","templateData","setTemplateData","setLoading","comment","setComment","setIsSubmitting","isDeleteDialogOpen","setIsDeleteDialogOpen","deleteError","setDeleteError","deleteSuccess","setDeleteSuccess","isCancelDialogOpen","setIsCancelDialogOpen","cancelError","setCancelError","cancelSuccess","setCancelSuccess","setReferenceDocuments","isDocumentModalOpen","setIsDocumentModalOpen","editingDocument","setEditingDocument","documentModalErrorMessage","setDocumentModalErrorMessage","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","generateQuoteSuccessMessage","setGenerateQuoteSuccessMessage","generateQuoteErrorMessage","setGenerateQuoteErrorMessage","showAcceptModal","setShowAcceptModal","isAccepting","setIsAccepting","acceptSuccessMessage","setAcceptSuccessMessage","acceptErrorMessage","setAcceptErrorMessage","hasAutoOpened","useRef","hasUnsavedReferenceDocuments","hasUnsavedRenameChanges","quoteTemplateDataEvent","events","data","NegotiableQuoteTemplateStatus","openQuoteTemplate","error","handleDeleteCancel","handleDeleteConfirm","deleteQuoteTemplate","handleDismissError","handleDismissSuccess","handleCancelCancel","handleCancelConfirm","cancelQuoteTemplate","handleDismissCancelError","handleDismissCancelSuccess","handleSendForReview","referenceDocumentLinks","combinedComment","sendQuoteTemplateForReview","handleAddDocument","handleEditDocument","handleRemoveDocument","prev","handleSaveDocument","handleDocumentModalClose","handleGenerateQuote","generateQuoteFromTemplate","handleGenerateQuoteModalCancel","handleAcceptQuote","acceptQuoteTemplate","handleAcceptModalCancel","isRenameDisabled","templateDisplayName","Slot","Edit","expirationDate","formattedDate","buttons","handleActionsButtonClick","action","ActionsBar","button","status","referenceDocumentsNode","shouldShowTitle","title","ShippingAddressDisplay","_a","TabbedContent","ItemsQuotedTemplate","QuoteTemplateCommentsList","QuoteTemplateHistoryLog","TextArea","unsavedChangesBanner","shippingAddressWarningBanner","banners","showAcceptButton","deleteErrorBanner","deleteBanner","CheckWithCircle","cancelErrorBanner","cancelBanner","renameErrorBanner","renameSuccessBanner","manageNegotiableQuoteTemplateProps","generateQuoteModalBanner","Icon","acceptModalBanner","ManageNegotiableQuoteTemplateComponent","createPortal","ConfirmationModal","RenameQuoteModal"],"mappings":"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"}
1
+ {"version":3,"file":"ManageNegotiableQuoteTemplate.js","sources":["/@dropins/storefront-quote-management/src/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.tsx","/@dropins/storefront-quote-management/src/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.tsx","/@dropins/storefront-quote-management/src/components/ReferenceDocumentsList/ReferenceDocumentsList.tsx","/@dropins/storefront-quote-management/src/hooks/useReferenceDocumentLinks.ts","/@dropins/storefront-quote-management/src/hooks/useRenameTemplate.ts","/@dropins/storefront-quote-management/src/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\n\nimport '@/quote-management/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.css';\n\nexport interface ManageNegotiableQuoteTemplateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n loading?: boolean;\n templateName: VNode;\n templateStatus: VNode;\n banner?: VNode;\n details?: VNode;\n actionBar?: VNode;\n referenceDocuments?: VNode;\n itemsTable: VNode;\n shippingInformationTitle?: VNode;\n shippingInformation?: VNode;\n commentsTitle: VNode;\n comments: VNode;\n footer?: VNode;\n}\n\nexport const ManageNegotiableQuoteTemplate: FunctionComponent<ManageNegotiableQuoteTemplateProps> = ({\n className,\n loading,\n templateName,\n templateStatus,\n banner,\n details,\n actionBar,\n referenceDocuments,\n itemsTable,\n shippingInformationTitle,\n shippingInformation,\n commentsTitle,\n comments,\n footer,\n ...props\n}) => {\n if (loading) {\n return <ManageNegotiableQuoteTemplateSkeleton />;\n }\n\n return (\n <div {...props} className={classes(['quote-management-manage-negotiable-quote-template', className])}>\n <div className={classes(['quote-management-manage-negotiable-quote-template__header'])}>\n {templateName &&\n <VComponent\n node={templateName}\n className={classes(['quote-management-manage-negotiable-quote-template__template-name'])}\n />\n }\n {templateStatus &&\n <VComponent\n node={templateStatus}\n className={classes(['quote-management-manage-negotiable-quote-template__template-status'])}\n />\n }\n </div>\n {banner &&\n <VComponent\n node={banner}\n className={classes(['quote-management-manage-negotiable-quote-template__banner'])}\n />\n }\n {details &&\n <VComponent\n node={details}\n className={classes(['quote-management-manage-negotiable-quote-template__details'])}\n />\n }\n {actionBar &&\n <VComponent\n node={actionBar}\n className={classes(['quote-management-manage-negotiable-quote-template__action-bar'])}\n />\n }\n {referenceDocuments &&\n <div data-testid=\"reference-documents-container\" className={classes(['quote-management-manage-negotiable-quote-template__reference-documents-container'])}>\n <VComponent\n node={referenceDocuments}\n className={classes(['quote-management-manage-negotiable-quote-template__reference-documents'])}\n />\n </div>\n }\n {itemsTable &&\n <VComponent\n node={itemsTable}\n className={classes(['quote-management-manage-negotiable-quote-template__items-table'])}\n />\n }\n <div data-testid=\"template-shipping-information-container\" className={classes(['quote-management-manage-negotiable-quote-template__shipping-information-container'])}>\n {shippingInformationTitle &&\n <VComponent\n node={shippingInformationTitle}\n className={classes(['quote-management-manage-negotiable-quote-template__shipping-information-title'])}\n />\n }\n {shippingInformation &&\n <VComponent\n node={shippingInformation}\n className={classes(['quote-management-manage-negotiable-quote-template__shipping-information'])}\n />\n }\n </div>\n <div data-testid=\"comments-container\" className={classes(['quote-management-manage-negotiable-quote-template__comments-container'])}>\n {commentsTitle &&\n <VComponent\n node={commentsTitle}\n className={classes(['quote-management-manage-negotiable-quote-template__comments-title'])}\n />\n }\n {comments &&\n <VComponent\n node={comments}\n className={classes(['quote-management-manage-negotiable-quote-template__comments'])}\n />\n }\n </div>\n {footer &&\n <VComponent\n node={footer}\n className={classes(['quote-management-manage-negotiable-quote-template__footer'])}\n />\n }\n </div>\n );\n};\n\nexport const ManageNegotiableQuoteTemplateSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"manage-negotiable-quote-template-skeleton\">\n <SkeletonRow variant=\"heading\" fullWidth={true} size=\"large\" />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n <SkeletonRow variant=\"row\" fullWidth={true} />\n <SkeletonRow variant=\"row\" fullWidth={true} size=\"xlarge\" lines={2} />\n <SkeletonRow variant=\"row\" fullWidth={false} size=\"small\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent, useCallback, useEffect, useState, HTMLAttributes } from 'preact/compat';\nimport { VNode } from 'preact';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button, Input, Modal, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { WarningFilled } from '@adobe-commerce/elsie/icons';\nimport '@/quote-management/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.css';\n\nexport interface ReferenceDocument {\n uid?: string;\n name: string;\n identifier?: string;\n url: string;\n}\n\nexport interface ReferenceDocumentFormModalProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n open: boolean;\n document?: ReferenceDocument;\n /**\n * Optional error message string. If provided, automatically creates an InLineAlert error banner.\n * If both errorMessage and errorBanner are provided, errorBanner takes precedence.\n */\n errorMessage?: string;\n /**\n * Optional custom error banner VNode. Provides full control over error banner rendering.\n * If both errorMessage and errorBanner are provided, errorBanner takes precedence.\n */\n errorBanner?: VNode;\n successBanner?: VNode;\n showCloseButton?: boolean;\n isSubmitting?: boolean;\n onSave: (document: ReferenceDocument) => void;\n onClose?: () => void;\n}\n\nexport const ReferenceDocumentFormModal: FunctionComponent<ReferenceDocumentFormModalProps> = ({\n className,\n open,\n document,\n errorMessage,\n errorBanner,\n successBanner,\n showCloseButton = true,\n isSubmitting = false,\n onSave,\n onClose,\n}) => {\n const [documentName, setDocumentName] = useState('');\n const [documentIdentifier, setDocumentIdentifier] = useState('');\n const [referenceUrl, setReferenceUrl] = useState('');\n const [errors, setErrors] = useState<{\n documentName?: string;\n documentIdentifier?: string;\n referenceUrl?: string;\n }>({});\n\n const dictionary = useText({\n title: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.title',\n documentNameLabel: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentNameLabel',\n documentIdentifierLabel: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentIdentifierLabel',\n referenceUrlLabel: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.referenceUrlLabel',\n addButton: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.addButton',\n updateButton: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.updateButton',\n cancelButton: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.cancelButton',\n documentNameRequired: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentNameRequired',\n documentIdentifierRequired: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.documentIdentifierRequired',\n referenceUrlRequired: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.referenceUrlRequired',\n invalidUrl: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.invalidUrl',\n errorHeading: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.errorHeading',\n });\n\n // Create error banner from errorMessage if errorBanner is not provided\n const displayErrorBanner = errorBanner || (errorMessage ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.errorHeading}\n description={errorMessage}\n data-testid=\"reference-document-form-modal-error-banner-inline\"\n />\n ) : null);\n\n // Determine if we're in edit mode (document prop is provided)\n const isEditMode = !!document;\n\n // Reset form when modal opens or document changes\n useEffect(() => {\n if (open) {\n if (document) {\n setDocumentName(document.name || '');\n setDocumentIdentifier(document.identifier || '');\n setReferenceUrl(document.url || '');\n } else {\n setDocumentName('');\n setDocumentIdentifier('');\n setReferenceUrl('');\n }\n setErrors({});\n }\n }, [open, document]);\n\n const validateUrl = useCallback((url: string): boolean => {\n // istanbul ignore if - whitespace-only URL are caught before this function is called, but leaving this here for defensive programming.\n if (!url.trim()) {\n return false;\n }\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }, []);\n\n const handleSave = useCallback(() => {\n const newErrors: { documentName?: string; documentIdentifier?: string; referenceUrl?: string } = {};\n\n if (!documentName.trim()) {\n newErrors.documentName = dictionary.documentNameRequired;\n }\n\n if (!referenceUrl.trim()) {\n newErrors.referenceUrl = dictionary.referenceUrlRequired;\n } else if (!validateUrl(referenceUrl.trim())) {\n newErrors.referenceUrl = dictionary.invalidUrl;\n }\n\n if (!documentIdentifier.trim()) {\n newErrors.documentIdentifier = dictionary.documentIdentifierRequired;\n }\n\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors);\n return;\n }\n\n onSave({\n uid: document?.uid,\n name: documentName.trim(),\n identifier: documentIdentifier.trim(),\n url: referenceUrl.trim(),\n });\n }, [documentName, documentIdentifier, referenceUrl, document, dictionary, validateUrl, onSave]);\n\n const handleClose = useCallback(() => {\n setDocumentName('');\n setDocumentIdentifier('');\n setReferenceUrl('');\n setErrors({});\n onClose?.();\n }, [onClose]);\n\n if (!open) {\n return null;\n }\n\n return (\n <Modal\n open={open}\n size=\"medium\"\n title={<>{dictionary.title}</>}\n onClose={handleClose}\n clickToDismiss={true}\n escapeToDismiss={true}\n showCloseButton={showCloseButton}\n className={classes(['quote-management-reference-document-form-modal', className])}\n data-testid=\"reference-document-form-modal\"\n >\n {displayErrorBanner && (\n <div\n className={classes(['quote-management-reference-document-form-modal__error-banner'])}\n data-testid=\"reference-document-form-modal-error-banner\"\n >\n {displayErrorBanner}\n </div>\n )}\n\n {successBanner && (\n <div\n className={classes(['quote-management-reference-document-form-modal__success-banner'])}\n data-testid=\"reference-document-form-modal-success-banner\"\n >\n {successBanner}\n </div>\n )}\n\n <div className={classes(['quote-management-reference-document-form-modal__content'])}>\n <div>\n <Input\n name=\"documentName\"\n type=\"text\"\n value={documentName}\n onInput={(e: any) => {\n setDocumentName(e.target.value);\n setErrors({ ...errors, documentName: undefined });\n }}\n floatingLabel={dictionary.documentNameLabel}\n required\n error={!!errors.documentName}\n disabled={isSubmitting}\n data-testid=\"reference-document-name-input\"\n />\n {errors.documentName && (\n <span\n className={classes(['quote-management-reference-document-form-modal__error-text'])}\n data-testid=\"reference-document-name-error\"\n >\n {errors.documentName}\n </span>\n )}\n </div>\n\n <div>\n <Input\n name=\"documentIdentifier\"\n type=\"text\"\n value={documentIdentifier}\n onInput={(e: any) => {\n setDocumentIdentifier(e.target.value);\n setErrors({ ...errors, documentIdentifier: undefined });\n }}\n floatingLabel={dictionary.documentIdentifierLabel}\n error={!!errors.documentIdentifier}\n disabled={isSubmitting}\n data-testid=\"reference-document-identifier-input\"\n />\n {errors.documentIdentifier && (\n <span\n className={classes(['quote-management-reference-document-form-modal__error-text'])}\n data-testid=\"reference-document-identifier-error\"\n >\n {errors.documentIdentifier}\n </span>\n )}\n </div>\n\n <div>\n <Input\n name=\"referenceUrl\"\n type=\"url\"\n value={referenceUrl}\n onInput={(e: any) => {\n setReferenceUrl(e.target.value);\n setErrors({ ...errors, referenceUrl: undefined });\n }}\n floatingLabel={dictionary.referenceUrlLabel}\n required\n error={!!errors.referenceUrl}\n disabled={isSubmitting}\n data-testid=\"reference-document-url-input\"\n />\n {errors.referenceUrl && (\n <span\n className={classes(['quote-management-reference-document-form-modal__error-text'])}\n data-testid=\"reference-document-url-error\"\n >\n {errors.referenceUrl}\n </span>\n )}\n </div>\n </div>\n\n <div className={classes(['quote-management-reference-document-form-modal__actions'])}>\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={handleClose}\n disabled={isSubmitting}\n className={classes(['quote-management-reference-document-form-modal__cancel-button'])}\n data-testid=\"reference-document-form-cancel-button\"\n >\n {dictionary.cancelButton}\n </Button>\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={handleSave}\n disabled={isSubmitting}\n className={classes(['quote-management-reference-document-form-modal__save-button'])}\n data-testid=\"reference-document-form-save-button\"\n >\n {isEditMode ? dictionary.updateButton : dictionary.addButton}\n </Button>\n </div>\n </Modal>\n );\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport '@/quote-management/components/ReferenceDocumentsList/ReferenceDocumentsList.css';\n\nexport interface ReferenceDocument {\n uid?: string;\n name: string;\n identifier?: string;\n url: string;\n}\n\nexport interface ReferenceDocumentsListProps extends HTMLAttributes<HTMLDivElement> {\n documents: ReferenceDocument[];\n isEditable?: boolean;\n onAdd?: () => void;\n onEdit?: (document: ReferenceDocument) => void;\n onRemove?: (document: ReferenceDocument) => void;\n}\n\nexport const ReferenceDocumentsList: FunctionComponent<ReferenceDocumentsListProps> = ({\n className,\n documents,\n isEditable = false,\n onAdd,\n onEdit,\n onRemove,\n ...props\n}) => {\n const dictionary = useText({\n add: 'NegotiableQuoteTemplate.Manage.referenceDocuments.add',\n edit: 'NegotiableQuoteTemplate.Manage.referenceDocuments.edit',\n remove: 'NegotiableQuoteTemplate.Manage.referenceDocuments.remove',\n noReferenceDocuments: 'NegotiableQuoteTemplate.Manage.referenceDocuments.noReferenceDocuments',\n });\n\n const formatDocumentDisplay = (doc: ReferenceDocument): string => {\n if (doc.identifier) {\n return `${doc.name}, ${doc.identifier}`;\n }\n return `${doc.name} ${doc.url}`;\n };\n\n const handleDocumentClick = (e: Event, url: string) => {\n e.preventDefault();\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n return (\n <div\n className={classes(['quote-management-reference-documents-list', className])}\n data-testid=\"reference-documents-list\"\n {...props}\n >\n <div className=\"quote-management-reference-documents-list__content\">\n {documents.map((doc) => (\n <div\n key={doc.uid || doc.url}\n className=\"quote-management-reference-documents-list__document\"\n data-testid={`reference-document-${doc.uid || doc.url}`}\n >\n <a\n href={doc.url}\n onClick={(e) => handleDocumentClick(e, doc.url)}\n className=\"quote-management-reference-documents-list__document-link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={`reference-document-link-${doc.uid || doc.url}`}\n >\n {formatDocumentDisplay(doc)}\n </a>\n {isEditable && (\n <div className=\"quote-management-reference-documents-list__document-actions\">\n <Button\n variant=\"tertiary\"\n onClick={() => onEdit?.(doc)}\n className=\"quote-management-reference-documents-list__edit-button\"\n data-testid={`reference-document-edit-${doc.uid || doc.url}`}\n >\n {dictionary.edit}\n </Button>\n <span className=\"quote-management-reference-documents-list__separator\">|</span>\n <Button\n variant=\"tertiary\"\n onClick={() => onRemove?.(doc)}\n className=\"quote-management-reference-documents-list__remove-button\"\n data-testid={`reference-document-remove-${doc.uid || doc.url}`}\n >\n {dictionary.remove}\n </Button>\n </div>\n )}\n </div>\n ))}\n {isEditable && (\n <Button\n variant=\"tertiary\"\n onClick={onAdd}\n className=\"quote-management-reference-documents-list__add-button\"\n data-testid=\"reference-documents-add-button\"\n >\n + {dictionary.add}\n </Button>\n )}\n {documents.length === 0 && !isEditable && (\n <div className=\"quote-management-reference-documents-list__empty\">\n {dictionary.noReferenceDocuments}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useMemo, useCallback } from 'preact/compat';\nimport { ReferenceDocument } from '@/quote-management/components';\nimport { ReferenceDocumentLinkInput } from '@/quote-management/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview';\n\nexport interface UseReferenceDocumentLinksParams {\n templateReferenceDocuments?: ReferenceDocument[];\n localReferenceDocuments: ReferenceDocument[];\n}\n\nexport interface UseReferenceDocumentLinksReturn {\n /**\n * Checks if a document exists in the template reference documents.\n * Matches by uid if both documents have it, otherwise matches by url.\n */\n isDocumentInTemplateData: (document: ReferenceDocument) => boolean;\n /**\n * Returns documents from localReferenceDocuments that are not in templateReferenceDocuments.\n */\n getNewDocuments: () => ReferenceDocument[];\n /**\n * Transforms all reference documents to API format.\n */\n getReferenceDocumentLinks: () => ReferenceDocumentLinkInput[];\n /**\n * Indicates if there are unsaved changes (new documents, removed documents, or modified documents).\n */\n hasUnsavedChanges: boolean;\n}\n\n/**\n * Custom hook to manage reference document links logic.\n * Handles document matching, filtering new documents, transformation to API format,\n * and detection of unsaved changes (new, removed, or modified documents).\n * Note: getReferenceDocumentLinks() returns all local reference documents, not just new ones.\n */\nexport const useReferenceDocumentLinks = (\n params: UseReferenceDocumentLinksParams\n): UseReferenceDocumentLinksReturn => {\n const { templateReferenceDocuments, localReferenceDocuments } = params;\n\n /**\n * Helper function to find a matching document in template data for a given document.\n * Matches by uid if both documents have it, otherwise matches by url.\n * Returns the matching template document or undefined if no match is found.\n */\n const findMatchingTemplateDocument = useCallback(\n (document: ReferenceDocument): ReferenceDocument | undefined => {\n if (!templateReferenceDocuments) {\n return undefined;\n }\n return templateReferenceDocuments.find((templateDoc) => {\n // If both documents have uids, match by uid\n if (document.uid && templateDoc.uid) {\n return templateDoc.uid === document.uid;\n }\n // Otherwise, match by URL\n return templateDoc.url === document.url;\n });\n },\n [templateReferenceDocuments]\n );\n\n /**\n * Helper function to check if a document is part of the template data.\n * A document is considered part of template data if:\n * - Its uid exists in templateReferenceDocuments (when uid is available), OR\n * - Its url exists in templateReferenceDocuments (when uid is not available)\n */\n const isDocumentInTemplateData = useCallback(\n (document: ReferenceDocument): boolean => {\n return findMatchingTemplateDocument(document) !== undefined;\n },\n [findMatchingTemplateDocument]\n );\n\n /**\n * Helper function to check if a document has been modified.\n * Compares all properties (name, identifier, url) between a local document and its matching template document.\n * Returns true if any property differs.\n */\n const isDocumentModified = useCallback(\n (localDoc: ReferenceDocument, templateDoc: ReferenceDocument): boolean => {\n // Compare all properties\n return (\n localDoc.name !== templateDoc.name ||\n localDoc.identifier !== templateDoc.identifier ||\n localDoc.url !== templateDoc.url\n );\n },\n []\n );\n\n /**\n * Returns documents from localReferenceDocuments that are not in templateReferenceDocuments.\n */\n const getNewDocuments = useCallback((): ReferenceDocument[] => {\n if (!templateReferenceDocuments) {\n // If no template documents exist, all local documents are new\n return localReferenceDocuments;\n }\n // Filter to only include documents not in template data\n return localReferenceDocuments.filter((doc) => {\n return !templateReferenceDocuments.some((templateDoc) => {\n // If both documents have uids, match by uid\n if (doc.uid && templateDoc.uid) {\n return templateDoc.uid === doc.uid;\n }\n // Otherwise, match by URL\n return templateDoc.url === doc.url;\n });\n });\n }, [templateReferenceDocuments, localReferenceDocuments]);\n\n /**\n * Transforms all reference documents to API format.\n */\n const getReferenceDocumentLinks = useCallback((): ReferenceDocumentLinkInput[] => {\n return localReferenceDocuments.map((doc) => ({\n uid: doc.uid,\n name: doc.name,\n identifier: doc.identifier,\n url: doc.url,\n }));\n }, [localReferenceDocuments]);\n\n /**\n * Checks if there are unsaved changes.\n * Returns true if there are:\n * - New documents: documents in local state that don't exist in template data\n * - Removed documents: documents in template data that don't exist in local state\n * - Modified documents: documents that exist in both but have different properties (name, identifier, or url)\n */\n const hasUnsavedChanges = useMemo(() => {\n if (!templateReferenceDocuments) {\n // If no template documents exist, any documents in local state are unsaved (new)\n return localReferenceDocuments.length > 0;\n }\n\n // Check for new documents: documents in local state not found in template data\n const hasNewDocuments = localReferenceDocuments.some((localDoc) => {\n return findMatchingTemplateDocument(localDoc) === undefined;\n });\n\n if (hasNewDocuments) {\n return true;\n }\n\n // Check for removed documents: documents in template data not found in local state\n const hasRemovedDocuments = templateReferenceDocuments.some((templateDoc) => {\n return !localReferenceDocuments.some((localDoc) => {\n // If both documents have uids, match by uid\n if (localDoc.uid && templateDoc.uid) {\n return localDoc.uid === templateDoc.uid;\n }\n // Otherwise, match by URL\n return localDoc.url === templateDoc.url;\n });\n });\n\n if (hasRemovedDocuments) {\n return true;\n }\n\n // Check for modified documents: documents that match but have different properties\n const hasModifiedDocuments = localReferenceDocuments.some((localDoc) => {\n const matchingTemplateDoc = findMatchingTemplateDocument(localDoc);\n // Defensive code: The falsy branch should be unreachable because we've already checked\n // for new documents above. If a document doesn't have a match, we would have\n // returned true in the hasNewDocuments check. This is kept for safety.\n /* istanbul ignore else */\n if (matchingTemplateDoc) {\n return isDocumentModified(localDoc, matchingTemplateDoc);\n }\n /* istanbul ignore next */\n return false;\n });\n\n return hasModifiedDocuments;\n }, [templateReferenceDocuments, localReferenceDocuments, findMatchingTemplateDocument, isDocumentModified]);\n\n return {\n isDocumentInTemplateData,\n getNewDocuments,\n getReferenceDocumentLinks,\n hasUnsavedChanges,\n };\n};\n\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { useState, useCallback } from 'preact/compat';\n\nexport interface UseRenameTemplateParams {\n initialTemplateName?: string;\n templateNameRequiredErrorMessage?: string;\n}\n\nexport interface UseRenameTemplateReturn {\n /**\n * Whether the rename modal is currently open.\n */\n isRenameModalOpen: boolean;\n /**\n * The new template name entered by the user.\n */\n renameTemplateName: string;\n /**\n * The reason for renaming the template.\n */\n renameReason: string;\n /**\n * Error message for rename operation.\n */\n renameError: string;\n /**\n * Error message for template name validation.\n */\n renameTemplateNameError: string;\n /**\n * Success message for rename operation.\n */\n renameSuccess: string;\n /**\n * Opens the rename modal and initializes state with the current template name.\n */\n handleRenameClick: (currentTemplateName?: string) => void;\n /**\n * Closes the rename modal and resets all state.\n */\n handleRenameClose: () => void;\n /**\n * Updates the template name and clears any name-related errors.\n */\n handleRenameTemplateNameChange: (value: string) => void;\n /**\n * Updates the rename reason.\n */\n handleRenameReasonChange: (value: string) => void;\n /**\n * Validates and saves the rename. Closes the modal if validation passes.\n * Does not make an API call - rename is tracked locally and included when submitting for review.\n */\n handleRenameSave: () => boolean;\n /**\n * Resets rename state (useful after successful submission).\n */\n resetRenameState: () => void;\n}\n\n/**\n * Custom hook to manage quote template rename functionality.\n * Handles state management for the rename modal, validation, and tracking rename changes.\n * Note: This hook does not make API calls. The rename is tracked locally and should be\n * included when calling sendQuoteTemplateForReview.\n */\nexport const useRenameTemplate = (\n params: UseRenameTemplateParams = {}\n): UseRenameTemplateReturn => {\n const { initialTemplateName, templateNameRequiredErrorMessage = 'Template name is required' } = params;\n\n const [isRenameModalOpen, setIsRenameModalOpen] = useState<boolean>(false);\n const [renameTemplateName, setRenameTemplateName] = useState<string>('');\n const [renameReason, setRenameReason] = useState<string>('');\n const [renameError, setRenameError] = useState<string>('');\n const [renameTemplateNameError, setRenameTemplateNameError] = useState<string>('');\n const [renameSuccess, setRenameSuccess] = useState<string>('');\n\n const handleRenameClick = useCallback((currentTemplateName?: string) => {\n setRenameTemplateName(currentTemplateName || initialTemplateName || '');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n setIsRenameModalOpen(true);\n }, [initialTemplateName]);\n\n const handleRenameClose = useCallback(() => {\n setIsRenameModalOpen(false);\n setRenameTemplateName('');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n }, []);\n\n const handleRenameTemplateNameChange = useCallback((value: string) => {\n setRenameTemplateName(value);\n if (value.trim()) {\n setRenameTemplateNameError('');\n }\n }, []);\n\n const handleRenameReasonChange = useCallback((value: string) => {\n setRenameReason(value);\n }, []);\n\n const handleRenameSave = useCallback((): boolean => {\n // Validate template name\n if (!renameTemplateName.trim()) {\n setRenameTemplateNameError(templateNameRequiredErrorMessage);\n return false;\n }\n\n // Clear any previous errors\n setRenameError('');\n setRenameTemplateNameError('');\n \n // Close modal - rename is tracked in state and will be included when submitting for review\n setIsRenameModalOpen(false);\n return true;\n }, [renameTemplateName, templateNameRequiredErrorMessage]);\n\n const resetRenameState = useCallback(() => {\n setRenameTemplateName('');\n setRenameReason('');\n setRenameError('');\n setRenameTemplateNameError('');\n setRenameSuccess('');\n }, []);\n\n return {\n isRenameModalOpen,\n renameTemplateName,\n renameReason,\n renameError,\n renameTemplateNameError,\n renameSuccess,\n handleRenameClick,\n handleRenameClose,\n handleRenameTemplateNameChange,\n handleRenameReasonChange,\n handleRenameSave,\n resetRenameState,\n };\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n createPortal,\n useRef,\n} from 'preact/compat';\nimport {\n Container,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Button,\n TextArea,\n InLineAlert,\n Icon,\n} from '@adobe-commerce/elsie/components';\nimport { NegotiableQuoteTemplateModel, NegotiableQuoteTemplateStatus } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport {\n TabbedContent,\n ActionsBar,\n ConfirmationModal,\n ManageNegotiableQuoteTemplate as ManageNegotiableQuoteTemplateComponent,\n ManageNegotiableQuoteTemplateProps as ManageNegotiableQuoteTemplateComponentProps,\n ReferenceDocumentsList,\n ReferenceDocumentFormModal,\n ReferenceDocument,\n} from '@/quote-management/components';\nimport {\n ItemsQuotedTemplate,\n QuoteTemplateCommentsList,\n QuoteTemplateHistoryLog,\n ShippingAddressDisplay,\n} from '@/quote-management/containers';\nimport {\n WarningFilled,\n CheckWithCircle,\n Edit,\n} from '@adobe-commerce/elsie/icons';\nimport {\n sendQuoteTemplateForReview,\n deleteQuoteTemplate,\n cancelQuoteTemplate,\n generateQuoteFromTemplate,\n openQuoteTemplate,\n acceptQuoteTemplate,\n ReferenceDocumentLinkInput,\n} from '@/quote-management/api';\nimport { useReferenceDocumentLinks } from '@/quote-management/hooks/useReferenceDocumentLinks';\nimport { useRenameTemplate } from '@/quote-management/hooks/useRenameTemplate';\nimport { RenameQuoteModal } from '@/quote-management/components/RenameQuoteModal';\n\nexport interface ManageNegotiableQuoteTemplateProps\n extends HTMLAttributes<HTMLDivElement> {\n onActionsButtonClick?: (action: string) => void;\n onSendForReview?: (params: {\n templateData?: NegotiableQuoteTemplateModel;\n name?: string;\n comment?: string;\n referenceDocumentLinks?: ReferenceDocumentLinkInput[];\n }) => void;\n slots?: {\n TemplateName?: SlotProps<{\n templateName?: string;\n templateData?: NegotiableQuoteTemplateModel;\n templateDisplayName?: string;\n isRenameDisabled?: boolean;\n }>;\n TemplateStatus?: SlotProps<{\n templateStatus?: string;\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Banner?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Details?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ActionBar?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ReferenceDocuments?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n referenceDocuments?: ReferenceDocument[];\n isEditable?: boolean;\n onAddDocument?: () => void;\n onEditDocument?: (document: ReferenceDocument) => void;\n onRemoveDocument?: (document: ReferenceDocument) => void;\n referenceDocumentsTitle?: string;\n }>;\n ItemsTable?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ItemsQuotedTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n CommentsTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLogTab?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n CommentsTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Comments?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLogTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n HistoryLog?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n Footer?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n comment?: string;\n isSubmitting?: boolean;\n referenceDocuments?: ReferenceDocument[];\n hasUnsavedChanges?: boolean;\n handleSendForReview: () => void;\n showAcceptButton?: boolean;\n renameTemplateName?: string;\n renameReason?: string;\n }>;\n ShippingInformationTitle?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n }>;\n ShippingInformation?: SlotProps<{\n templateData?: NegotiableQuoteTemplateModel;\n loading?: boolean;\n setLoading?: (loading: boolean) => void;\n }>;\n };\n}\n\nexport const ManageNegotiableQuoteTemplate: Container<ManageNegotiableQuoteTemplateProps> = ({\n slots,\n onActionsButtonClick,\n onSendForReview,\n ...props\n}) => {\n const [templateData, setTemplateData] = useState<NegotiableQuoteTemplateModel | undefined>(undefined);\n const [loading, setLoading] = useState<boolean>(true);\n const [comment, setComment] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState<boolean>(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n const [deleteSuccess, setDeleteSuccess] = useState<boolean>(false);\n const [isCancelDialogOpen, setIsCancelDialogOpen] = useState<boolean>(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n const [cancelSuccess, setCancelSuccess] = useState<boolean>(false);\n const [referenceDocuments, setReferenceDocuments] = useState<ReferenceDocument[]>([]);\n const [isDocumentModalOpen, setIsDocumentModalOpen] = useState<boolean>(false);\n const [editingDocument, setEditingDocument] = useState<ReferenceDocument | undefined>(undefined);\n const [documentModalErrorMessage, setDocumentModalErrorMessage] = useState<string | null>(null);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [generateQuoteSuccessMessage, setGenerateQuoteSuccessMessage] = useState<string>('');\n const [generateQuoteErrorMessage, setGenerateQuoteErrorMessage] = useState<string>('');\n const [showAcceptModal, setShowAcceptModal] = useState<boolean>(false);\n const [isAccepting, setIsAccepting] = useState<boolean>(false);\n const [acceptSuccessMessage, setAcceptSuccessMessage] = useState<string>('');\n const [acceptErrorMessage, setAcceptErrorMessage] = useState<string>('');\n const hasAutoOpened = useRef<boolean>(false);\n\n // Use hook for reference document links logic\n const {\n getReferenceDocumentLinks,\n hasUnsavedChanges: hasUnsavedReferenceDocuments,\n } = useReferenceDocumentLinks({\n templateReferenceDocuments: templateData?.referenceDocuments,\n localReferenceDocuments: referenceDocuments,\n });\n\n const dictionary = useText({\n createdLabel: 'NegotiableQuoteTemplate.Manage.createdLabel',\n salesRepLabel: 'NegotiableQuoteTemplate.Manage.salesRepLabel',\n expiresLabel: 'NegotiableQuoteTemplate.Manage.expiresLabel',\n templateIdLabel: 'NegotiableQuoteTemplate.Manage.templateIdLabel',\n actionsLabel: 'NegotiableQuoteTemplate.Manage.actionsLabel',\n referenceDocumentsTitle: 'NegotiableQuoteTemplate.Manage.referenceDocuments.title',\n commentsTitle: 'NegotiableQuoteTemplate.Manage.comments.title',\n historyLogTitle: 'NegotiableQuoteTemplate.Manage.historyLog.title',\n itemsQuotedTab: 'NegotiableQuoteTemplate.Manage.tabs.itemsQuoted',\n commentsTab: 'NegotiableQuoteTemplate.Manage.tabs.comments',\n historyLogTab: 'NegotiableQuoteTemplate.Manage.tabs.historyLog',\n templateCommentsPlaceholder: 'NegotiableQuoteTemplate.Manage.templateComments.placeholder',\n sendForReview: 'NegotiableQuoteTemplate.Manage.actionButtons.sendForReview',\n delete: 'NegotiableQuoteTemplate.Manage.actionButtons.delete',\n cancel: 'NegotiableQuoteTemplate.Manage.actionButtons.cancel',\n confirmationModalDeleteTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.title',\n confirmationModalDeleteMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.message',\n confirmationModalDeleteConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.confirm',\n confirmationModalDeleteErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.errorHeading',\n confirmationModalDeleteErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.errorFallback',\n confirmationModalDeleteSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.successHeading',\n confirmationModalDeleteSuccessDescription: 'NegotiableQuoteTemplate.Manage.confirmationModal.delete.successDescription',\n confirmationModalCancelTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.title',\n confirmationModalCancelMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.message',\n confirmationModalCancelConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.confirm',\n confirmationModalCancelErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.errorHeading',\n confirmationModalCancelErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.errorFallback',\n confirmationModalCancelSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.successHeading',\n confirmationModalCancelSuccessDescription: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancelTemplate.successDescription',\n confirmationModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n accept: 'NegotiableQuoteTemplate.Manage.actionButtons.accept',\n generateQuote: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalTitle: 'NegotiableQuoteTemplate.Manage.actionButtons.generateQuote',\n generateQuoteModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message',\n generateQuoteModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n generateQuoteModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm',\n generateQuoteModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading',\n generateQuoteModalSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successHeading',\n generateQuoteSuccessMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successDescription',\n generateQuoteModalErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorHeading',\n generateQuoteErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorFallback',\n acceptModalTitle: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.title',\n acceptModalMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.message',\n acceptModalCancel: 'NegotiableQuoteTemplate.Manage.confirmationModal.cancel',\n acceptModalConfirm: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.confirm',\n acceptModalConfirmLoading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.confirmLoading',\n acceptModalSuccessHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.successHeading',\n acceptSuccessMessage: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.successDescription',\n acceptModalErrorHeading: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.errorHeading',\n acceptErrorFallback: 'NegotiableQuoteTemplate.Manage.confirmationModal.accept.errorFallback',\n documentDuplicateUidError: 'NegotiableQuoteTemplate.Manage.referenceDocuments.form.duplicateUidError',\n renameTitle: 'NegotiableQuoteTemplate.Manage.rename.title',\n renameTemplateNameLabel: 'NegotiableQuoteTemplate.Manage.rename.templateNameLabel',\n renameReasonLabel: 'NegotiableQuoteTemplate.Manage.rename.reasonLabel',\n renameButton: 'NegotiableQuoteTemplate.Manage.rename.renameButton',\n renameCancelButton: 'NegotiableQuoteTemplate.Manage.rename.cancelButton',\n renameErrorHeading: 'NegotiableQuoteTemplate.Manage.rename.errorHeading',\n renameTemplateNameRequired: 'NegotiableQuoteTemplate.Manage.rename.templateNameRequired',\n renameErrorDefault: 'NegotiableQuoteTemplate.Manage.rename.errorDefault',\n renameSuccessHeading: 'NegotiableQuoteTemplate.Manage.rename.successHeading',\n renameSuccessMessage: 'NegotiableQuoteTemplate.Manage.rename.successMessage',\n shippingInformationTitle: 'NegotiableQuoteTemplate.Manage.shippingInformation.title',\n unsavedChangesWarningHeading: 'NegotiableQuoteTemplate.Manage.unsavedChangesWarningHeading',\n unsavedChangesWarningMessage: 'NegotiableQuoteTemplate.Manage.unsavedChangesWarningMessage',\n shippingAddressWarningHeading: 'NegotiableQuoteTemplate.Manage.shippingAddressWarningHeading',\n shippingAddressWarningMessage: 'NegotiableQuoteTemplate.Manage.shippingAddressWarningMessage',\n });\n\n // Use hook for rename template logic (after dictionary is defined)\n const {\n isRenameModalOpen,\n renameTemplateName,\n renameReason,\n renameError,\n renameTemplateNameError,\n renameSuccess,\n handleRenameClick,\n handleRenameClose,\n handleRenameTemplateNameChange,\n handleRenameReasonChange,\n handleRenameSave,\n resetRenameState,\n } = useRenameTemplate({\n initialTemplateName: templateData?.name,\n templateNameRequiredErrorMessage: dictionary.renameTemplateNameRequired,\n });\n\n // Check if there are unsaved rename changes\n const hasUnsavedRenameChanges = useMemo(() => {\n // A rename change exists when renameTemplateName is set and differs from current template name\n return renameTemplateName !== '' && renameTemplateName !== templateData?.name;\n }, [renameTemplateName, templateData?.name]);\n\n // Combine unsaved changes from reference documents and rename\n const hasUnsavedChanges = useMemo(() => {\n return hasUnsavedReferenceDocuments || hasUnsavedRenameChanges;\n }, [hasUnsavedReferenceDocuments, hasUnsavedRenameChanges]);\n\n /* Event listeners */\n useEffect(() => {\n const quoteTemplateDataEvent = events.on('quote-management/quote-template-data', (data) => {\n if (data.quoteTemplate) {\n setTemplateData(data.quoteTemplate);\n setLoading(false);\n // Reset comment and submitting state after successful update\n setComment('');\n setIsSubmitting(false);\n // Update reference documents from template data\n setReferenceDocuments(data.quoteTemplate.referenceDocuments || []);\n // Reset rename state after successful submission\n resetRenameState();\n }\n }, { eager: true });\n\n return () => quoteTemplateDataEvent?.off();\n }, [resetRenameState]);\n\n // Initialize reference documents when template data changes\n useEffect(() => {\n if (templateData?.referenceDocuments) {\n setReferenceDocuments(templateData.referenceDocuments);\n }\n }, [templateData?.referenceDocuments]);\n\n // Auto-open template if status is \"Updated\"\n useEffect(() => {\n if (templateData && templateData.status === NegotiableQuoteTemplateStatus.UPDATED && !hasAutoOpened.current) {\n hasAutoOpened.current = true;\n const openTemplate = async () => {\n try {\n await openQuoteTemplate({ templateId: templateData.id });\n // The event listener will handle updating state\n } catch (error) {\n console.error('Failed to auto-open quote template:', error);\n // Silently fail - template data is still available for viewing\n }\n };\n openTemplate();\n }\n }, [templateData]);\n\n /**\n * Handlers\n */\n const handleDeleteCancel = useCallback(() => {\n setIsDeleteDialogOpen(false);\n setDeleteError(null);\n setDeleteSuccess(false);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n /* istanbul ignore next */ // If there is no template data, the button should not be enabled or even rendered\n if (!templateData?.id) {\n return;\n }\n\n setDeleteError(null);\n setDeleteSuccess(false);\n\n try {\n await deleteQuoteTemplate({\n templateId: templateData.id,\n });\n setDeleteSuccess(true);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setIsDeleteDialogOpen(false);\n setDeleteSuccess(false);\n }, 2000);\n } catch (error) {\n const errorMessage = (error as Error).message || dictionary.confirmationModalDeleteErrorFallback;\n setDeleteError(errorMessage);\n }\n }, [templateData, dictionary.confirmationModalDeleteErrorFallback]);\n\n const handleDismissError = useCallback(() => {\n setDeleteError(null);\n }, []);\n\n const handleDismissSuccess = useCallback(() => {\n setDeleteSuccess(false);\n }, []);\n\n const handleCancelCancel = useCallback(() => {\n setIsCancelDialogOpen(false);\n setCancelError(null);\n setCancelSuccess(false);\n }, []);\n\n const handleCancelConfirm = useCallback(async () => {\n /* istanbul ignore next */ // If there is no template data, the button should not be enabled or even rendered\n if (!templateData?.id) {\n return;\n }\n\n setCancelError(null);\n setCancelSuccess(false);\n\n try {\n await cancelQuoteTemplate({\n templateId: templateData.id,\n });\n setCancelSuccess(true);\n // Close modal after a delay to show success message\n setTimeout(() => {\n setIsCancelDialogOpen(false);\n setCancelSuccess(false);\n }, 2000);\n } catch (error) {\n const errorMessage = (error as Error).message || dictionary.confirmationModalCancelErrorFallback;\n setCancelError(errorMessage);\n }\n }, [templateData, dictionary.confirmationModalCancelErrorFallback]);\n\n const handleDismissCancelError = useCallback(() => {\n setCancelError(null);\n }, []);\n\n const handleDismissCancelSuccess = useCallback(() => {\n setCancelSuccess(false);\n }, []);\n\n const handleSendForReview = useCallback(async () => {\n // Get all reference document links\n const referenceDocumentLinks = getReferenceDocumentLinks();\n\n // Combine comment with rename reason if rename reason exists\n const combinedComment = [renameReason.trim(), comment.trim()]\n .filter(Boolean)\n .join('\\n\\n')\n .trim() || undefined;\n\n // Include renamed name if it differs from current template name\n const templateName = renameTemplateName && renameTemplateName !== templateData?.name\n ? renameTemplateName\n : undefined;\n\n // If override prop is provided, use it instead of the API\n if (onSendForReview) {\n onSendForReview({\n templateData,\n name: templateName,\n comment: combinedComment,\n referenceDocumentLinks,\n });\n return;\n }\n // Otherwise, use the sendQuoteTemplateForReview API\n setIsSubmitting(true);\n\n try {\n await sendQuoteTemplateForReview({\n templateId: templateData!.id, // the button should be disabled if templateData is null\n name: templateName,\n comment: combinedComment,\n referenceDocumentLinks: referenceDocumentLinks.length > 0 ? referenceDocumentLinks : undefined,\n });\n // The quote-template-data event will handle updating state\n } catch (error) {\n console.error('Failed to send quote template for review:', error);\n setIsSubmitting(false);\n // TODO: Show error notification to user\n }\n }, [templateData, onSendForReview, comment, renameReason, renameTemplateName, getReferenceDocumentLinks]);\n\n const handleAddDocument = useCallback(() => {\n setEditingDocument(undefined);\n setDocumentModalErrorMessage(null);\n setIsDocumentModalOpen(true);\n }, []);\n\n const handleEditDocument = useCallback((document: ReferenceDocument) => {\n setEditingDocument(document);\n setDocumentModalErrorMessage(null);\n setIsDocumentModalOpen(true);\n }, []);\n\n const handleRemoveDocument = useCallback((document: ReferenceDocument) => {\n setReferenceDocuments((prev) => prev.filter((doc) => doc.uid !== document.uid || doc.url !== document.url));\n }, []);\n\n const handleSaveDocument = useCallback((document: ReferenceDocument) => {\n // Clear any previous error messages\n setDocumentModalErrorMessage(null);\n\n if (editingDocument) {\n // Update existing document\n setReferenceDocuments((prev) =>\n prev.map((doc) =>\n doc.identifier === editingDocument.identifier\n ? document\n : doc\n )\n );\n } else {\n // Add new document\n setReferenceDocuments((prev) => [...prev, document]);\n }\n setIsDocumentModalOpen(false);\n setEditingDocument(undefined);\n }, [editingDocument]);\n\n const handleDocumentModalClose = useCallback(() => {\n setIsDocumentModalOpen(false);\n setEditingDocument(undefined);\n setDocumentModalErrorMessage(null);\n }, []);\n\n // Generate quote handler\n const handleGenerateQuote = useCallback(async () => {\n setIsGeneratingQuote(true);\n setGenerateQuoteErrorMessage('');\n setGenerateQuoteSuccessMessage('');\n try {\n await generateQuoteFromTemplate({ templateId: templateData!.id });\n // Show success message\n setGenerateQuoteSuccessMessage(dictionary.generateQuoteSuccessMessage);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n const errorMessage = error instanceof Error ? error.message : dictionary.generateQuoteErrorFallback;\n setGenerateQuoteErrorMessage(errorMessage);\n } finally {\n setIsGeneratingQuote(false);\n }\n }, [templateData, dictionary.generateQuoteSuccessMessage, dictionary.generateQuoteErrorFallback]);\n\n const handleGenerateQuoteModalCancel = useCallback(() => {\n setShowGenerateQuoteModal(false);\n setGenerateQuoteErrorMessage('');\n setGenerateQuoteSuccessMessage('');\n }, []);\n\n // Accept quote template handler\n const handleAcceptQuote = useCallback(async () => {\n setIsAccepting(true);\n setAcceptErrorMessage('');\n setAcceptSuccessMessage('');\n try {\n await acceptQuoteTemplate({ templateId: templateData!.id });\n // Show success message\n setAcceptSuccessMessage(dictionary.acceptSuccessMessage);\n } catch (error) {\n console.error('Failed to accept quote template:', error);\n const errorMessage = error instanceof Error ? error.message : dictionary.acceptErrorFallback;\n setAcceptErrorMessage(errorMessage);\n } finally {\n setIsAccepting(false);\n }\n }, [templateData, dictionary.acceptSuccessMessage, dictionary.acceptErrorFallback]);\n\n const handleAcceptModalCancel = useCallback(() => {\n setShowAcceptModal(false);\n setAcceptErrorMessage('');\n setAcceptSuccessMessage('');\n }, []);\n\n /**\n * VNodes for the ManageNegotiableQuoteTemplate component\n */\n\n // Template name\n const templateName = useMemo(() => {\n // Determine if rename is disabled based on canSendForReview permission\n const isRenameDisabled = !templateData?.canSendForReview;\n\n // Use the renamed template name if it exists\n const templateDisplayName = renameTemplateName || templateData?.name;\n\n return (\n <Slot\n name=\"TemplateName\"\n slot={slots?.TemplateName}\n context={{ templateName: templateData?.name, templateData, templateDisplayName, isRenameDisabled }}\n >\n <div className=\"quote-management-manage-negotiable-quote-template__template-name-wrapper\">\n <h1\n data-testid=\"template-name\"\n className=\"quote-management-manage-negotiable-quote-template__template-name-title\"\n >\n {templateDisplayName}\n </h1>\n <button\n onClick={() => handleRenameClick(templateDisplayName)}\n disabled={isRenameDisabled}\n data-testid=\"rename-template-button\"\n className=\"quote-management-manage-negotiable-quote-template__rename-button\"\n aria-label=\"Rename template\"\n >\n <Edit />\n </button>\n </div>\n </Slot>\n );\n }, [slots?.TemplateName, templateData, handleRenameClick, renameTemplateName]);\n\n // Template Status\n const templateStatus = useMemo(() => {\n return (\n <Slot\n name=\"TemplateStatus\"\n slot={slots?.TemplateStatus}\n context={{ templateStatus: templateData?.status, templateData }}\n >\n <div data-testid=\"template-status\">{templateData?.status}</div>\n </Slot>\n );\n }, [slots?.TemplateStatus, templateData]);\n\n // Details\n const details = useMemo(() => {\n if (!templateData) {\n return;\n }\n\n // Format expiration date if it exists\n const expirationDate = templateData.expirationDate ? formattedDate(templateData.expirationDate, 'short') : undefined;\n\n return (\n <Slot name=\"Details\" slot={slots?.Details} context={{ templateData }}>\n {/* template id data */}\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"template-id-label\"\n >\n {dictionary.templateIdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"template-id-value\"\n >\n {templateData.id}\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"created-label\"\n >\n {dictionary.createdLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"created-value\"\n >\n {formattedDate(templateData.createdAt, 'short')} (\n {templateData.buyer.firstname} {templateData.buyer.lastname})\n </span>\n </div>\n\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"sales-rep-label\"\n >\n {dictionary.salesRepLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"sales-rep-value\"\n >\n {templateData.salesRepName}\n </span>\n </div>\n\n {expirationDate && (\n <div className=\"quote-management-manage-negotiable-quote-template__detail\">\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-title\"\n data-testid=\"expires-label\"\n >\n {dictionary.expiresLabel}\n </span>\n <span\n className=\"quote-management-manage-negotiable-quote-template__detail-content\"\n data-testid=\"expires-value\"\n >\n {expirationDate}\n </span>\n </div>\n )}\n </Slot>\n );\n }, [slots?.Details, dictionary, templateData]);\n\n\n // Action bar\n const buttons: { label: string; value: string; disabled?: boolean }[] =\n useMemo(() => {\n return [\n {\n label: dictionary.generateQuote,\n value: 'generateQuote',\n disabled: !templateData?.canGenerateQuoteFromTemplate,\n },\n ];\n }, [dictionary, templateData?.canGenerateQuoteFromTemplate]);\n\n const actionBar = useMemo(() => {\n const handleActionsButtonClick = (action: string) => {\n switch (action) {\n case 'generateQuote':\n setShowGenerateQuoteModal(true);\n setGenerateQuoteErrorMessage(''); // Clear modal errors\n setGenerateQuoteSuccessMessage(''); // Clear modal success messages\n onActionsButtonClick?.(action);\n break;\n }\n };\n\n return (\n <Slot\n name=\"ActionBar\"\n slot={slots?.ActionBar}\n context={{ templateData }}\n >\n <ActionsBar\n dropdownPlaceholder={dictionary.actionsLabel}\n dropdownOptions={[]}\n buttons={buttons.map((button) => (\n <Button\n key={button.value}\n variant=\"tertiary\"\n onClick={() => handleActionsButtonClick(button.value)}\n data-testid={`actions-bar-${button.value}-button`}\n data-action={button.value}\n disabled={button.disabled}\n >\n {button.label}\n </Button>\n ))}\n />\n </Slot>\n );\n }, [\n buttons,\n dictionary,\n slots?.ActionBar,\n templateData,\n onActionsButtonClick,\n ]);\n\n // Reference documents\n const isEditable = useMemo(() => {\n const status = templateData?.status as string;\n return status === 'Draft' || status === 'Open';\n }, [templateData?.status]);\n\n\n const referenceDocumentsNode = useMemo(() => {\n const shouldShowTitle = referenceDocuments.length > 0 || isEditable;\n const title = shouldShowTitle ? dictionary.referenceDocumentsTitle : undefined;\n\n return (\n <Slot\n name=\"ReferenceDocuments\"\n slot={slots?.ReferenceDocuments}\n context={{ templateData, referenceDocuments, isEditable, onAddDocument: handleAddDocument, onEditDocument: handleEditDocument, onRemoveDocument: handleRemoveDocument, referenceDocumentsTitle: dictionary.referenceDocumentsTitle }}\n >\n <div data-testid=\"reference-documents\">\n {shouldShowTitle && <h2>{title}</h2>}\n <ReferenceDocumentsList\n documents={referenceDocuments}\n isEditable={isEditable}\n onAdd={handleAddDocument}\n onEdit={handleEditDocument}\n onRemove={handleRemoveDocument}\n />\n </div>\n </Slot>\n );\n }, [slots?.ReferenceDocuments, dictionary, templateData, referenceDocuments, isEditable, handleAddDocument, handleEditDocument, handleRemoveDocument]);\n\n // Shipping information title\n const shippingInformationTitle = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformationTitle\"\n slot={slots?.ShippingInformationTitle}\n context={{ templateData }}\n >\n <h2>{dictionary.shippingInformationTitle}</h2>\n </Slot>\n );\n }, [slots?.ShippingInformationTitle, templateData, dictionary]);\n\n // Shipping information\n const shippingInformation = useMemo(() => {\n return (\n <Slot\n name=\"ShippingInformation\"\n slot={slots?.ShippingInformation}\n context={{ templateData, loading, setLoading }}\n >\n <ShippingAddressDisplay\n shippingAddress={templateData?.shippingAddresses?.[0]}\n loading={loading}\n data-testid=\"manage-template-shipping-address\"\n />\n </Slot>\n );\n }, [slots?.ShippingInformation, templateData, loading, setLoading]);\n\n // Items table (using TabbedContent with ItemsQuoted)\n const itemsTable = useMemo(() => {\n return (\n <Slot\n name=\"ItemsTable\"\n slot={slots?.ItemsTable}\n context={{ templateData }}\n >\n <TabbedContent\n tabs={\n new Map([\n ['items-quoted', dictionary.itemsQuotedTab],\n ['comments', dictionary.commentsTab],\n ['history-log', dictionary.historyLogTab],\n ])\n }\n tabsContent={\n new Map([\n [\n 'items-quoted',\n <Slot\n key=\"items-quoted\"\n name=\"ItemsQuotedTab\"\n slot={slots?.ItemsQuotedTab}\n context={{ templateData }}\n >\n <ItemsQuotedTemplate templateData={templateData} />\n </Slot>,\n ],\n [\n 'comments',\n <Slot\n key=\"comments\"\n name=\"CommentsTab\"\n slot={slots?.CommentsTab}\n context={{ templateData }}\n >\n <QuoteTemplateCommentsList templateData={templateData} />\n </Slot>,\n ],\n [\n 'history-log',\n <Slot\n key=\"history-log\"\n name=\"HistoryLogTab\"\n slot={slots?.HistoryLogTab}\n context={{ templateData }}\n >\n <QuoteTemplateHistoryLog templateData={templateData} />\n </Slot>,\n ],\n ])\n }\n />\n </Slot>\n );\n }, [\n slots?.ItemsTable,\n slots?.ItemsQuotedTab,\n slots?.CommentsTab,\n slots?.HistoryLogTab,\n dictionary,\n templateData,\n ]);\n\n // Comments title\n const commentsTitle = useMemo(() => {\n return (\n <Slot\n name=\"CommentsTitle\"\n slot={slots?.CommentsTitle}\n context={{ templateData }}\n >\n <h2>{dictionary.commentsTitle}</h2>\n </Slot>\n );\n }, [slots?.CommentsTitle, dictionary, templateData]);\n\n // Comments\n const comments = useMemo(() => {\n return (\n <Slot\n name=\"Comments\"\n slot={slots?.Comments}\n context={{ templateData }}\n >\n <TextArea\n name=\"templateComments\"\n placeholder={dictionary.templateCommentsPlaceholder}\n rows={3}\n value={comment}\n onInput={(e) => {\n setComment((e.target as HTMLTextAreaElement).value);\n }}\n disabled={!templateData?.canSendForReview || isSubmitting}\n />\n </Slot>\n );\n }, [slots?.Comments, dictionary, templateData, comment, isSubmitting]);\n\n\n // Unsaved changes warning banner\n const unsavedChangesBanner = useMemo(\n () =>\n hasUnsavedChanges ? (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.unsavedChangesWarningHeading}\n description={dictionary.unsavedChangesWarningMessage}\n data-testid=\"unsaved-changes-warning-alert\"\n />\n ) : undefined,\n [hasUnsavedChanges, dictionary.unsavedChangesWarningHeading, dictionary.unsavedChangesWarningMessage]\n );\n\n // Shipping address warning banner\n const shippingAddressWarningBanner = useMemo(() => {\n return templateData?.shippingAddresses?.length ? undefined : (\n <InLineAlert\n type=\"warning\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.shippingAddressWarningHeading}\n description={dictionary.shippingAddressWarningMessage}\n data-testid=\"shipping-address-warning-alert\"\n />\n );\n }, [templateData?.shippingAddresses?.length, dictionary.shippingAddressWarningHeading, dictionary.shippingAddressWarningMessage]);\n\n const banners = useMemo(() => {\n return <>\n {unsavedChangesBanner}\n {shippingAddressWarningBanner}\n </>\n }, [unsavedChangesBanner, shippingAddressWarningBanner]);\n\n // Footer\n const footer = useMemo(() => {\n const showAcceptButton = templateData?.status === NegotiableQuoteTemplateStatus.OPEN && templateData?.canAccept;\n\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ templateData, comment, isSubmitting, referenceDocuments, hasUnsavedChanges, handleSendForReview, showAcceptButton, renameTemplateName, renameReason }}\n >\n {showAcceptButton && (\n <Button\n variant=\"primary\"\n onClick={() => {\n setShowAcceptModal(true);\n setAcceptErrorMessage(''); // Clear modal errors\n setAcceptSuccessMessage(''); // Clear modal success messages\n }}\n data-testid=\"accept-button\"\n disabled={isSubmitting || hasUnsavedChanges}\n >\n {dictionary.accept}\n </Button>\n )}\n\n {templateData?.canSendForReview && (\n <Button\n variant=\"primary\"\n onClick={handleSendForReview}\n data-testid=\"send-for-review-button\"\n disabled={isSubmitting || !templateData?.shippingAddresses?.length}\n >\n {dictionary.sendForReview}\n </Button>\n )}\n {templateData?.canCancel && (\n <Button\n variant=\"tertiary\"\n onClick={() => setIsCancelDialogOpen(true)}\n data-testid=\"cancel-template-button\"\n disabled={isSubmitting}\n >\n {dictionary.cancel}\n </Button>\n )}\n {templateData?.canDelete && (\n <Button\n variant=\"tertiary\"\n onClick={() => setIsDeleteDialogOpen(true)}\n data-testid=\"delete-template-button\"\n disabled={isSubmitting}\n >\n {dictionary.delete}\n </Button>\n )}\n </Slot>\n );\n }, [\n slots?.Footer,\n dictionary,\n templateData,\n comment,\n isSubmitting,\n handleSendForReview,\n referenceDocuments,\n hasUnsavedChanges,\n renameTemplateName,\n renameReason,\n ]);\n\n // Delete error banner\n const deleteErrorBanner = deleteError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalDeleteErrorHeading}\n description={deleteError}\n onDismiss={handleDismissError}\n data-testid=\"confirmation-modal-error-banner\"\n />\n ) : null;\n\n // Delete success banner\n const deleteSuccessBanner = deleteSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalDeleteSuccessHeading}\n description={dictionary.confirmationModalDeleteSuccessDescription}\n onDismiss={handleDismissSuccess}\n data-testid=\"confirmation-modal-success-banner\"\n />\n ) : null;\n\n const deleteBanner = deleteSuccessBanner || deleteErrorBanner;\n\n // Cancel error banner\n const cancelErrorBanner = cancelError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled />}\n heading={dictionary.confirmationModalCancelErrorHeading}\n description={cancelError}\n onDismiss={handleDismissCancelError}\n data-testid=\"confirmation-modal-cancel-error-banner\"\n />\n ) : null;\n\n // Cancel success banner\n const cancelSuccessBanner = cancelSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.confirmationModalCancelSuccessHeading}\n description={dictionary.confirmationModalCancelSuccessDescription}\n onDismiss={handleDismissCancelSuccess}\n data-testid=\"confirmation-modal-cancel-success-banner\"\n />\n ) : null;\n\n const cancelBanner = cancelSuccessBanner || cancelErrorBanner;\n\n // Rename modal error banner\n const renameErrorBanner = useMemo(\n () =>\n renameError ? (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<WarningFilled color=\"var(--color-error)\" />}\n heading={dictionary.renameErrorHeading}\n description={renameError}\n />\n ) : undefined,\n [renameError, dictionary.renameErrorHeading]\n );\n\n // Rename modal success banner\n const renameSuccessBanner = useMemo(\n () =>\n renameSuccess ? (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<CheckWithCircle />}\n heading={dictionary.renameSuccessHeading}\n description={renameSuccess}\n />\n ) : undefined,\n [renameSuccess, dictionary.renameSuccessHeading]\n );\n\n const manageNegotiableQuoteTemplateProps: ManageNegotiableQuoteTemplateComponentProps = {\n ...props,\n loading,\n templateName,\n templateStatus,\n banner: banners,\n details,\n actionBar,\n referenceDocuments: referenceDocumentsNode,\n itemsTable,\n shippingInformationTitle,\n shippingInformation,\n commentsTitle,\n comments,\n footer,\n };\n\n // Create banner for generate quote modal based on success/error state\n let generateQuoteModalBanner = null;\n if (generateQuoteSuccessMessage) {\n generateQuoteModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<Icon source=\"CheckWithCircle\" />}\n heading={dictionary.generateQuoteModalSuccessHeading}\n description={generateQuoteSuccessMessage}\n data-testid=\"generate-quote-success-banner\"\n />\n );\n } else if (generateQuoteErrorMessage) {\n generateQuoteModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<Icon source=\"WarningFilled\" />}\n heading={dictionary.generateQuoteModalErrorHeading}\n description={generateQuoteErrorMessage}\n data-testid=\"generate-quote-error-banner\"\n />\n );\n }\n\n // Create banner for accept modal based on success/error state\n let acceptModalBanner = null;\n if (acceptSuccessMessage) {\n acceptModalBanner = (\n <InLineAlert\n type=\"success\"\n variant=\"primary\"\n icon={<Icon source=\"CheckWithCircle\" />}\n heading={dictionary.acceptModalSuccessHeading}\n description={acceptSuccessMessage}\n data-testid=\"accept-success-banner\"\n />\n );\n } else if (acceptErrorMessage) {\n acceptModalBanner = (\n <InLineAlert\n type=\"error\"\n variant=\"primary\"\n icon={<Icon source=\"WarningFilled\" />}\n heading={dictionary.acceptModalErrorHeading}\n description={acceptErrorMessage}\n data-testid=\"accept-error-banner\"\n />\n );\n }\n\n return (\n <>\n <ManageNegotiableQuoteTemplateComponent {...manageNegotiableQuoteTemplateProps} />\n {isDeleteDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isDeleteDialogOpen}\n title={dictionary.confirmationModalDeleteTitle}\n message={dictionary.confirmationModalDeleteMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalDeleteConfirm}\n onCancel={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n showCloseButton={!deleteBanner}\n confirmationBanner={deleteBanner}\n />,\n document.body\n )}\n {isCancelDialogOpen &&\n createPortal(\n <ConfirmationModal\n open={isCancelDialogOpen}\n title={dictionary.confirmationModalCancelTitle}\n message={dictionary.confirmationModalCancelMessage}\n cancelLabel={dictionary.confirmationModalCancel}\n confirmLabel={dictionary.confirmationModalCancelConfirm}\n onCancel={handleCancelCancel}\n onConfirm={handleCancelConfirm}\n showCloseButton={!cancelBanner}\n confirmationBanner={cancelBanner}\n />,\n document.body\n )}\n {isDocumentModalOpen &&\n createPortal(\n <ReferenceDocumentFormModal\n open={isDocumentModalOpen}\n document={editingDocument}\n errorMessage={documentModalErrorMessage || undefined}\n onSave={handleSaveDocument}\n onClose={handleDocumentModalClose}\n isSubmitting={isSubmitting}\n />,\n document.body\n )}\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuoteModalTitle}\n message={dictionary.generateQuoteModalMessage}\n cancelLabel={dictionary.generateQuoteModalCancel}\n confirmLabel={\n isGeneratingQuote\n ? dictionary.generateQuoteModalConfirmLoading\n : dictionary.generateQuoteModalConfirm\n }\n onCancel={handleGenerateQuoteModalCancel}\n onConfirm={isGeneratingQuote ? undefined : handleGenerateQuote}\n showCloseButton={true}\n confirmationBanner={generateQuoteModalBanner}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n {showAcceptModal &&\n createPortal(\n <ConfirmationModal\n open={showAcceptModal}\n title={dictionary.acceptModalTitle}\n message={dictionary.acceptModalMessage}\n cancelLabel={dictionary.acceptModalCancel}\n confirmLabel={\n isAccepting\n ? dictionary.acceptModalConfirmLoading\n : dictionary.acceptModalConfirm\n }\n onCancel={handleAcceptModalCancel}\n onConfirm={isAccepting ? undefined : handleAcceptQuote}\n showCloseButton={true}\n confirmationBanner={acceptModalBanner}\n data-testid=\"accept-confirmation-modal\"\n />,\n document.body\n )}\n {isRenameModalOpen &&\n createPortal(\n <RenameQuoteModal\n open={isRenameModalOpen}\n quoteName={renameTemplateName}\n renameReason={renameReason}\n quoteNameError={renameTemplateNameError}\n errorBanner={renameErrorBanner}\n successBanner={renameSuccessBanner}\n onQuoteNameChange={handleRenameTemplateNameChange}\n onRenameReasonChange={handleRenameReasonChange}\n onSave={handleRenameSave}\n onClose={handleRenameClose}\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["ManageNegotiableQuoteTemplate","className","loading","templateName","templateStatus","banner","details","actionBar","referenceDocuments","itemsTable","shippingInformationTitle","shippingInformation","commentsTitle","comments","footer","props","ManageNegotiableQuoteTemplateSkeleton","jsxs","classes","jsx","VComponent","Skeleton","SkeletonRow","ReferenceDocumentFormModal","open","document","errorMessage","errorBanner","successBanner","showCloseButton","isSubmitting","onSave","onClose","documentName","setDocumentName","useState","documentIdentifier","setDocumentIdentifier","referenceUrl","setReferenceUrl","errors","setErrors","dictionary","useText","displayErrorBanner","InLineAlert","WarningFilled","isEditMode","useEffect","validateUrl","useCallback","url","handleSave","newErrors","handleClose","Modal","Fragment","Input","e","Button","ReferenceDocumentsList","documents","isEditable","onAdd","onEdit","onRemove","formatDocumentDisplay","doc","handleDocumentClick","useReferenceDocumentLinks","params","templateReferenceDocuments","localReferenceDocuments","findMatchingTemplateDocument","templateDoc","isDocumentInTemplateData","isDocumentModified","localDoc","getNewDocuments","getReferenceDocumentLinks","hasUnsavedChanges","useMemo","matchingTemplateDoc","useRenameTemplate","initialTemplateName","templateNameRequiredErrorMessage","isRenameModalOpen","setIsRenameModalOpen","renameTemplateName","setRenameTemplateName","renameReason","setRenameReason","renameError","setRenameError","renameTemplateNameError","setRenameTemplateNameError","renameSuccess","setRenameSuccess","handleRenameClick","currentTemplateName","handleRenameClose","handleRenameTemplateNameChange","value","handleRenameReasonChange","handleRenameSave","resetRenameState","slots","onActionsButtonClick","onSendForReview","templateData","setTemplateData","setLoading","comment","setComment","setIsSubmitting","isDeleteDialogOpen","setIsDeleteDialogOpen","deleteError","setDeleteError","deleteSuccess","setDeleteSuccess","isCancelDialogOpen","setIsCancelDialogOpen","cancelError","setCancelError","cancelSuccess","setCancelSuccess","setReferenceDocuments","isDocumentModalOpen","setIsDocumentModalOpen","editingDocument","setEditingDocument","documentModalErrorMessage","setDocumentModalErrorMessage","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","generateQuoteSuccessMessage","setGenerateQuoteSuccessMessage","generateQuoteErrorMessage","setGenerateQuoteErrorMessage","showAcceptModal","setShowAcceptModal","isAccepting","setIsAccepting","acceptSuccessMessage","setAcceptSuccessMessage","acceptErrorMessage","setAcceptErrorMessage","hasAutoOpened","useRef","hasUnsavedReferenceDocuments","hasUnsavedRenameChanges","quoteTemplateDataEvent","events","data","NegotiableQuoteTemplateStatus","openQuoteTemplate","error","handleDeleteCancel","handleDeleteConfirm","deleteQuoteTemplate","handleDismissError","handleDismissSuccess","handleCancelCancel","handleCancelConfirm","cancelQuoteTemplate","handleDismissCancelError","handleDismissCancelSuccess","handleSendForReview","referenceDocumentLinks","combinedComment","sendQuoteTemplateForReview","handleAddDocument","handleEditDocument","handleRemoveDocument","prev","handleSaveDocument","handleDocumentModalClose","handleGenerateQuote","generateQuoteFromTemplate","handleGenerateQuoteModalCancel","handleAcceptQuote","acceptQuoteTemplate","handleAcceptModalCancel","isRenameDisabled","templateDisplayName","Slot","Edit","expirationDate","formattedDate","buttons","handleActionsButtonClick","action","ActionsBar","button","status","referenceDocumentsNode","shouldShowTitle","title","ShippingAddressDisplay","_a","TabbedContent","ItemsQuotedTemplate","QuoteTemplateCommentsList","QuoteTemplateHistoryLog","TextArea","unsavedChangesBanner","shippingAddressWarningBanner","banners","showAcceptButton","deleteErrorBanner","deleteBanner","CheckWithCircle","cancelErrorBanner","cancelBanner","renameErrorBanner","renameSuccessBanner","manageNegotiableQuoteTemplateProps","generateQuoteModalBanner","Icon","acceptModalBanner","ManageNegotiableQuoteTemplateComponent","createPortal","ConfirmationModal","RenameQuoteModal"],"mappings":"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"}