@dropins/storefront-quote-management 1.0.0-beta1 → 1.0.0-beta11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +25 -26
- package/api/duplicateNegotiableQuote/duplicateNegotiableQuote.d.ts +1 -0
- package/api/getQuoteTemplates/graphql/getQuoteTemplates.d.ts +1 -1
- package/api/getStoreConfig/graphql/StoreConfigQuery.d.ts +1 -1
- package/api/graphql/NegotiableQuoteTemplateFragment.d.ts +1 -1
- package/api/sendForReview/index.d.ts +1 -1
- package/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview.d.ts +10 -0
- package/api.js +11 -48
- package/api.js.map +1 -1
- package/chunks/AttachedFilesList.js +2 -2
- package/chunks/AttachedFilesList.js.map +1 -1
- package/chunks/CheckWithCircle.js +1 -1
- package/chunks/ChevronDown.js +1 -1
- package/chunks/ConfirmationModal.js +2 -2
- package/chunks/ConfirmationModal.js.map +1 -1
- package/chunks/ItemsQuoted.js +2 -2
- package/chunks/ItemsQuoted.js.map +1 -1
- package/chunks/ItemsQuotedTemplate.js +2 -2
- package/chunks/ItemsQuotedTemplate.js.map +1 -1
- package/chunks/LineItemNoteModal.js +4 -0
- package/chunks/LineItemNoteModal.js.map +1 -0
- package/chunks/NegotiableQuoteFragment.js +2 -1
- package/chunks/NegotiableQuoteFragment.js.map +1 -1
- package/chunks/NegotiableQuoteTemplateFragment.js +155 -7
- package/chunks/NegotiableQuoteTemplateFragment.js.map +1 -1
- package/chunks/OrderSummaryLine.js +2 -2
- package/chunks/OrderSummaryLine.js.map +1 -1
- package/chunks/QuoteCommentsList.js +1 -1
- package/chunks/QuoteCommentsList3.js +1 -1
- package/chunks/QuoteHistoryLog.js +1 -1
- package/chunks/QuoteHistoryLog3.js +1 -1
- package/chunks/QuoteTemplateCommentsList.js +2 -2
- package/chunks/QuoteTemplateCommentsList.js.map +1 -1
- package/chunks/QuoteTemplateHistoryLog.js +1 -1
- package/chunks/RenameQuoteModal.js +4 -0
- package/chunks/RenameQuoteModal.js.map +1 -0
- package/chunks/ShippingAddressDisplay.js +2 -2
- package/chunks/ShippingAddressDisplay.js.map +1 -1
- package/chunks/WarningFilled.js +1 -1
- package/chunks/addQuoteTemplateLineItemNote.js +24 -4
- package/chunks/addQuoteTemplateLineItemNote.js.map +1 -1
- package/chunks/dateUtils.js +1 -1
- package/chunks/duplicateNegotiableQuote.js +6 -6
- package/chunks/duplicateNegotiableQuote.js.map +1 -1
- package/chunks/generateQuoteFromTemplate.js +1 -1
- package/chunks/getQuoteTemplates.js +14 -12
- package/chunks/getQuoteTemplates.js.map +1 -1
- package/chunks/negotiableQuotes.js +2 -2
- package/chunks/openQuoteTemplate.js +30 -9
- package/chunks/openQuoteTemplate.js.map +1 -1
- package/chunks/requestNegotiableQuote.js +1 -1
- package/chunks/setLineItemNote.js +1 -1
- package/chunks/state.js +2 -2
- package/chunks/state.js.map +1 -1
- package/chunks/transform-quote-template.js +2 -2
- package/chunks/transform-quote-template.js.map +1 -1
- package/chunks/transform-quote.js +2 -2
- package/chunks/transform-quote.js.map +1 -1
- package/chunks/uploadFile.js +1 -1
- package/components/LineItemNoteModal/LineItemNoteModal.d.ts +2 -2
- package/components/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +5 -2
- package/components/ProductListTable/ProductListTable.d.ts +5 -49
- package/components/ReferenceDocumentFormModal/ReferenceDocumentFormModal.d.ts +30 -0
- package/components/ReferenceDocumentFormModal/index.d.ts +11 -0
- package/components/ReferenceDocumentsList/ReferenceDocumentsList.d.ts +18 -0
- package/components/ReferenceDocumentsList/index.d.ts +11 -0
- package/components/index.d.ts +2 -0
- package/containers/ItemsQuoted/ItemsQuoted.d.ts +7 -7
- package/containers/ItemsQuoted.js +2 -2
- package/containers/ItemsQuotedTemplate/ItemsQuotedTemplate.d.ts +5 -1
- package/containers/ItemsQuotedTemplate.js +2 -2
- package/containers/ManageNegotiableQuote/ManageNegotiableQuote.d.ts +3 -0
- package/containers/ManageNegotiableQuote.js +2 -2
- package/containers/ManageNegotiableQuote.js.map +1 -1
- package/containers/ManageNegotiableQuoteTemplate/ManageNegotiableQuoteTemplate.d.ts +46 -5
- package/containers/ManageNegotiableQuoteTemplate.js +4 -2
- package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
- package/containers/OrderSummary.js +2 -2
- package/containers/OrderSummary.js.map +1 -1
- package/containers/OrderSummaryLine.js +2 -2
- package/containers/QuoteCommentsList.js +1 -1
- package/containers/QuoteHistoryLog.js +1 -1
- package/containers/QuoteSummaryList/QuoteSummaryList.d.ts +1 -1
- package/containers/QuoteSummaryList.js +2 -2
- package/containers/QuoteSummaryList.js.map +1 -1
- package/containers/QuoteTemplateCommentsList.js +1 -1
- package/containers/QuoteTemplateHistoryLog.js +1 -1
- package/containers/QuoteTemplatesListTable.js +2 -2
- package/containers/QuoteTemplatesListTable.js.map +1 -1
- package/containers/QuotesListTable.js +2 -2
- package/containers/QuotesListTable.js.map +1 -1
- package/containers/RequestNegotiableQuoteForm.js +2 -2
- package/containers/RequestNegotiableQuoteForm.js.map +1 -1
- package/containers/ShippingAddressDisplay/ShippingAddressDisplay.d.ts +2 -2
- package/containers/ShippingAddressDisplay.js +2 -2
- package/data/models/__fixtures__/negotiableQuoteModel.d.ts +5 -5
- package/data/models/negotiable-quote-model.d.ts +3 -2
- package/data/models/negotiable-quote-template-model.d.ts +4 -39
- package/data/models/store-config-model.d.ts +2 -0
- package/data/transforms/__fixtures__/negotiableQuoteData.d.ts +8 -0
- package/data/transforms/__fixtures__/negotiableQuoteTemplateData.d.ts +616 -75
- package/data/transforms/__fixtures__/storeConfigData.d.ts +4 -0
- package/data/transforms/transform-history.d.ts +15 -0
- package/data/transforms/transform-quote-items.d.ts +15 -0
- package/hooks/useItemsQuotedTemplate.d.ts +15 -0
- package/hooks/useReferenceDocumentLinks.d.ts +34 -0
- package/hooks/useRemoveTemplateItems.d.ts +25 -0
- package/hooks/useRenameTemplate.d.ts +71 -0
- package/hooks/useUpdateTemplateQuantities.d.ts +27 -0
- package/i18n/en_US.json.d.ts +93 -6
- package/lib/itemFormatters.d.ts +1 -1
- package/lib/priceCalculators.d.ts +1 -1
- package/package.json +1 -1
- package/render.js +4 -4
- package/render.js.map +1 -1
- package/chunks/LineItemNoteModal2.js +0 -4
- package/chunks/LineItemNoteModal2.js.map +0 -1
- package/chunks/TabbedContent.js +0 -4
- package/chunks/TabbedContent.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestNegotiableQuoteForm.js","sources":["/@dropins/storefront-quote-management/src/components/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.tsx","/@dropins/storefront-quote-management/src/containers/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.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 '@/quote-management/components/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.css';\n\nexport interface RequestNegotiableQuoteFormProps extends Omit<HTMLAttributes<HTMLFormElement>, 'title'> {\n title: VNode;\n banner?: VNode;\n commentField?: VNode;\n quoteNameField?: VNode;\n attachFile?: VNode;\n attachedFilesList?: VNode;\n requestButton?: VNode;\n saveButton?: VNode;\n onSubmit: (e: Event) => void;\n}\n\nexport const RequestNegotiableQuoteForm: FunctionComponent<RequestNegotiableQuoteFormProps> = ({\n className,\n title,\n banner,\n commentField,\n quoteNameField,\n attachFile,\n attachedFilesList,\n requestButton,\n saveButton,\n onSubmit,\n ...props\n}) => {\n return (\n <form {...props} className={classes(['request-negotiable-quote-form', className])} onSubmit={onSubmit}>\n {banner &&\n <VComponent\n node={banner}\n className={classes(['request-negotiable-quote-form__banner'])}\n />\n }\n {title &&\n <VComponent\n node={title}\n className={classes(['request-negotiable-quote-form__title'])}\n />\n }\n {commentField &&\n <VComponent\n node={commentField}\n className={classes(['request-negotiable-quote-form__comment-field'])}\n />\n }\n {quoteNameField &&\n <VComponent\n node={quoteNameField}\n className={classes(['request-negotiable-quote-form__quote-name-field'])}\n />\n }\n {attachFile &&\n <VComponent\n node={attachFile}\n className={classes(['request-negotiable-quote-form__attach-file-field'])}\n />\n }\n {attachedFilesList &&\n <VComponent\n node={attachedFilesList}\n className={classes(['request-negotiable-quote-form__attached-files-list'])}\n />\n }\n <div className={classes(['request-negotiable-quote-form__actions'])}>\n {requestButton &&\n <VComponent\n node={requestButton}\n className={classes(['request-negotiable-quote-form__request-button'])}\n />\n }\n {saveButton &&\n <VComponent\n node={saveButton}\n className={classes(['request-negotiable-quote-form__save-button'])}\n />\n }\n </div>\n </form>\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 { HTMLAttributes, useCallback, useEffect, useState } from 'preact/compat';\nimport { Container, getFormErrors, getFormValues, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { InLineAlert, Button, InputFile, TextArea, Input, Field, InLineAlertProps } from '@adobe-commerce/elsie/components';\nimport { WarningFilled, CheckWithCircle, Add } from '@adobe-commerce/elsie/icons';\nimport RequestNegotiableQuoteFormComponent from '@/quote-management/components/RequestNegotiableQuoteForm';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { requestNegotiableQuote, RequestNegotiableQuoteInput, uploadFile } from '@/quote-management/api';\nimport { state } from '@/quote-management/lib/state';\nimport { AttachedFilesList, AttachedFile } from '@/quote-management/components';\nimport { formatFileSize, validateFileType, validateFileSize } from '@/quote-management/utils/fileUtils';\n\nexport type RequestNegotiableQuoteHandlers = {\n onAttachFiles?: (files: File[]) => Promise<void>;\n onRequestNegotiableQuote?: typeof requestNegotiableQuote;\n onSaveNegotiableQuote?: typeof requestNegotiableQuote;\n onSubmitErrors?: (errors: Record<string, string>) => void;\n onError?: (props: {\n error: string,\n isFormDisabled: boolean,\n setIsFormDisabled: (isFormDisabled: boolean) => void,\n }) => void;\n};\n\nexport interface RequestNegotiableQuoteFormProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onError'>,\n RequestNegotiableQuoteHandlers {\n cartId: string;\n maxFiles?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n slots?: {\n ErrorBanner?: SlotProps<{\n message: string,\n }>;\n SuccessBanner?: SlotProps<{\n message: string,\n }>;\n Title?: SlotProps<{\n text: string,\n }>;\n CommentField?: SlotProps<{\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setFormErrors: (errors: Record<string, string>) => void;\n }>;\n QuoteNameField?: SlotProps<{\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setFormErrors: (errors: Record<string, string>) => void;\n }>;\n AttachFileField?: SlotProps<{\n onChange: (files: File[]) => void, formErrors: Record<string, string>,\n isFormDisabled: boolean,\n attachedFiles: AttachedFile[]\n }>;\n AttachedFilesList?: SlotProps<{\n files: AttachedFile[];\n onRemove: (key: string) => void;\n disabled?: boolean;\n }>;\n RequestButton?: SlotProps<{\n requestNegotiableQuote: typeof requestNegotiableQuote;\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setIsFormDisabled: (isFormDisabled: boolean) => void;\n }>;\n SaveDraftButton?: SlotProps<{\n requestNegotiableQuote: typeof requestNegotiableQuote;\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setIsFormDisabled: (isFormDisabled: boolean) => void;\n }>;\n };\n}\n\nexport const RequestNegotiableQuoteForm: Container<RequestNegotiableQuoteFormProps> = ({\n cartId,\n slots,\n onRequestNegotiableQuote,\n onSaveNegotiableQuote,\n onAttachFiles,\n onSubmitErrors,\n onError,\n className,\n maxFiles,\n maxFileSize,\n acceptedFileTypes,\n}) => {\n const [comment, setComment] = useState<string | undefined>(undefined);\n const [quoteName, setQuoteName] = useState<string | undefined>(undefined);\n const [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n const [error, setError] = useState<string | undefined>(undefined);\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [success, setSuccess] = useState<string | undefined>(undefined);\n const [isFormDisabled, setIsFormDisabled] = useState<boolean>(false);\n\n const dictionary = useText({\n title: 'NegotiableQuote.Request.title',\n comment: 'NegotiableQuote.Request.comment',\n commentError: 'NegotiableQuote.Request.commentError',\n quoteName: 'NegotiableQuote.Request.quoteName',\n quoteNameError: 'NegotiableQuote.Request.quoteNameError',\n attachmentsError: 'NegotiableQuote.Request.attachmentsError',\n maxFilesExceeded: 'NegotiableQuote.Request.maxFilesExceeded',\n maxFileSizeExceeded: 'NegotiableQuote.Request.maxFileSizeExceeded',\n invalidFileType: 'NegotiableQuote.Request.invalidFileType',\n requestCta: 'NegotiableQuote.Request.requestCta',\n saveDraftCta: 'NegotiableQuote.Request.saveDraftCta',\n errorHeader: 'NegotiableQuote.Request.error.header',\n unauthenticated: 'NegotiableQuote.Request.error.unauthenticated',\n unauthorized: 'NegotiableQuote.Request.error.unauthorized',\n missingCart: 'NegotiableQuote.Request.error.missingCart',\n successHeader: 'NegotiableQuote.Request.success.header',\n submitSuccess: 'NegotiableQuote.Request.success.submitted',\n draftSuccess: 'NegotiableQuote.Request.success.draftSaved',\n });\n\n useEffect(() => {\n const permissionsEvent = events.on(\n 'quote-management/permissions',\n (permissions: typeof state.permissions) => {\n setError(undefined);\n if (!permissions.requestQuote) {\n setError(dictionary.unauthorized);\n setIsFormDisabled(true);\n }\n else {\n setIsFormDisabled(false);\n }\n },\n { eager: true }\n );\n return () => permissionsEvent?.off();\n }, [dictionary.unauthorized]);\n\n useEffect(() => {\n const authenticatedEvent = events.on(\n 'authenticated',\n (authenticated: boolean) => {\n setError(undefined);\n if (!authenticated) {\n setError(dictionary.unauthenticated);\n setIsFormDisabled(true);\n }\n else {\n setIsFormDisabled(false);\n }\n },\n { eager: true }\n );\n return () => authenticatedEvent?.off();\n }, [dictionary.unauthenticated]);\n\n useEffect(() => {\n if (!cartId) {\n setError(dictionary.missingCart);\n setIsFormDisabled(true);\n }\n }, [cartId, dictionary.missingCart]);\n\n useEffect(() => {\n if (error) {\n onError?.({ error, isFormDisabled, setIsFormDisabled });\n }\n }, [error, onError, isFormDisabled]);\n\n const handleAttachFiles = useCallback(async (files: File[]) => {\n /* istanbul ignore next: defensive guard; */\n if (!files?.length) return;\n\n // Check maxFiles limit\n if (maxFiles && attachedFiles.length + files.length > maxFiles) {\n setFormErrors(prev => ({\n ...prev,\n attachments: dictionary.maxFilesExceeded.replace('{maxFiles}', String(maxFiles))\n }));\n return;\n }\n\n // Validate file types and sizes before uploading\n for (const file of files) {\n if (maxFileSize && !validateFileSize(file.size, maxFileSize)) {\n setFormErrors(prev => ({\n ...prev,\n attachments: dictionary.maxFileSizeExceeded.replace('{maxSize}', formatFileSize(maxFileSize))\n }));\n return;\n }\n\n if (acceptedFileTypes && !validateFileType(file.type, acceptedFileTypes)) {\n setFormErrors(prev => ({ ...prev, attachments: dictionary.invalidFileType }));\n return;\n }\n }\n\n // Set form errors without attachments key\n setFormErrors(prev => { \n // Disable eslint rule for unused attachments key\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { attachments, ...rest } = prev;\n return rest;\n });\n\n\n if (onAttachFiles) {\n onAttachFiles(files)?.catch(() => {\n setFormErrors(prev => ({ ...prev, attachments: dictionary.attachmentsError }));\n });\n return;\n }\n\n // Add files with 'uploading' status\n const newFiles: AttachedFile[] = files.map(file => ({\n key: `temp-${Date.now()}-${Math.random()}-${file.name}`,\n name: file.name,\n size: file.size,\n status: 'uploading',\n }));\n\n setAttachedFiles(prev => [...prev, ...newFiles]);\n\n // Upload each file and update its status\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const tempKey = newFiles[i].key;\n\n try {\n const result = await uploadFile(file);\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, key: result.key, status: 'success' }\n : f\n ));\n } catch (error) {\n setFormErrors(prev => ({ ...prev, attachments: (error as Error).message }));\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, status: 'error', error: (error as Error).message }\n : f\n ));\n }\n }\n }, [onAttachFiles, dictionary, maxFiles, maxFileSize, acceptedFileTypes, attachedFiles]);\n\n const handleRemoveFile = useCallback((key: string) => {\n setAttachedFiles(prev => prev.filter(f => f.key !== key));\n }, []);\n\n /*\n * This function is used to get the banner node.\n * It can be used to render a success or error banner depending on the success or error state.\n */\n const getBannerNode = () => {\n let inlineAlertProps: InLineAlertProps | undefined;\n let slotProps: any | undefined;\n\n if (success) {\n slotProps = {\n name: 'SuccessBanner',\n slot: slots?.SuccessBanner,\n context: {\n message: success,\n },\n 'data-testid': 'form-success-banner',\n };\n inlineAlertProps = {\n type: 'success',\n variant: 'primary',\n icon: <CheckWithCircle />,\n heading: dictionary.successHeader,\n description: success,\n className: 'request-negotiable-quote-form__success-banner',\n };\n }\n else if (error) {\n slotProps = {\n name: 'ErrorBanner',\n slot: slots?.ErrorBanner,\n context: {\n message: error,\n },\n 'data-testid': 'form-error-banner',\n };\n inlineAlertProps = {\n type: 'error',\n variant: 'primary',\n icon: <WarningFilled />,\n heading: dictionary.errorHeader,\n description: error,\n className: 'request-negotiable-quote-form__error-banner',\n };\n }\n\n if (slotProps && inlineAlertProps) {\n return <Slot {...slotProps}>\n <InLineAlert {...inlineAlertProps} />\n </Slot>;\n }\n\n return undefined;\n }\n\n /*\n * This function is used to validate the parent form of the button that was clicked.\n */\n const validateParentForm = (e: Event) => {\n setFormErrors({});\n const closestForm = (e.target as HTMLElement).closest('form') as HTMLFormElement;\n const formErrors = getFormErrors(closestForm);\n if (Object.keys(formErrors).length > 0) {\n setFormErrors(formErrors);\n onSubmitErrors?.(formErrors);\n }\n };\n\n const formSubmitHandler = (e: Event) => {\n e.preventDefault();\n setIsFormDisabled(true);\n\n const form = (e.target as HTMLFormElement);\n\n const currentFormErrors = getFormErrors(form);\n\n const mergedFormErrors = { ...currentFormErrors, ...formErrors };\n\n if (Object.keys(mergedFormErrors).length > 0) {\n onSubmitErrors?.(mergedFormErrors)\n return;\n }\n\n // Since we have multiple submit buttons, we need to determine which one was clicked.\n const buttonTarget = (e as SubmitEvent).submitter as HTMLButtonElement;\n\n const formValues = getFormValues(form);\n\n setComment(formValues.comment);\n setQuoteName(formValues.quoteName);\n\n const isDraft = buttonTarget?.dataset?.draft === 'true' || false;\n\n // Only include successfully uploaded files\n const successfulAttachments = attachedFiles\n .filter(f => f.status === 'success')\n .map(f => ({ key: f.key }));\n\n const contextData: RequestNegotiableQuoteInput = {\n cartId: cartId!,\n quoteName: formValues.quoteName,\n comment: formValues.comment,\n attachments: successfulAttachments,\n isDraft,\n }\n\n let submitHandler;\n let successMessage;\n\n if (isDraft) {\n submitHandler = onSaveNegotiableQuote ?? requestNegotiableQuote;\n successMessage = dictionary.draftSuccess;\n } else {\n submitHandler = onRequestNegotiableQuote ?? requestNegotiableQuote;\n successMessage = dictionary.submitSuccess;\n }\n\n submitHandler(contextData).then(() => {\n setSuccess(successMessage);\n })\n .catch(error => {\n setError(error.message);\n })\n };\n\n const titleNode = (\n <Slot name=\"Title\" slot={slots?.Title} context={{ text: dictionary.title }}>\n <span data-testid=\"form-title\">{dictionary.title}</span>\n </Slot>\n );\n\n const commentFieldNode = (\n <Slot\n name=\"CommentField\"\n slot={slots?.CommentField}\n context={{\n value: comment,\n required: true,\n errorMessage: formErrors.comment,\n setFormErrors,\n isFormDisabled\n } as any}\n >\n <TextArea\n name=\"comment\"\n value={comment}\n label={dictionary.comment}\n required\n autoComplete=\"off\"\n data-testid=\"form-comment-field\"\n errorMessage={formErrors.comment}\n disabled={isFormDisabled}\n />\n </Slot>\n );\n\n const quoteNameFieldNode = (\n <Slot\n name=\"QuoteNameField\"\n slot={slots?.QuoteNameField}\n context={{\n value: quoteName,\n required: true,\n errorMessage: formErrors.quoteName,\n setFormErrors,\n isFormDisabled\n } as any}\n >\n <Field\n error={formErrors.quoteName}\n disabled={isFormDisabled}\n >\n <Input\n value={quoteName}\n name=\"quoteName\"\n floatingLabel={dictionary.quoteName}\n required\n autoComplete=\"off\"\n data-testid=\"form-quote-name-field\"\n />\n </Field>\n </Slot>\n );\n\n const attachFileNode = (\n <Slot\n name=\"AttachFileField\"\n slot={slots?.AttachFileField}\n context={{ onChange: handleAttachFiles, formErrors, isFormDisabled, attachedFiles }}\n >\n <InputFile\n multiple\n onChange={(e: Event) => {\n const target = e.target as HTMLInputElement;\n const fileList = target?.files;\n const files = fileList ? Array.from(fileList) : [];\n\n if (files.length > 0) {\n void handleAttachFiles(files);\n }\n }}\n icon={<Add />}\n disabled={isFormDisabled}\n data-testid=\"form-attach-file-field\"\n accept={acceptedFileTypes?.join(',')}\n />\n </Slot>\n );\n\n const attachedFilesListNode = attachedFiles.length > 0 ? (\n <Slot\n name=\"AttachedFilesList\"\n slot={slots?.AttachedFilesList}\n context={{ files: attachedFiles, onRemove: handleRemoveFile, disabled: isFormDisabled }}\n >\n <AttachedFilesList\n files={attachedFiles}\n onRemove={handleRemoveFile}\n disabled={isFormDisabled}\n />\n </Slot>\n ) : undefined;\n\n const requestButtonNode = (\n <Slot\n name=\"RequestButton\"\n slot={slots?.RequestButton}\n context={\n {\n requestNegotiableQuote,\n formErrors,\n isFormDisabled,\n setIsFormDisabled\n }\n }\n >\n <Button\n type=\"submit\"\n data-testid=\"form-request-button\"\n onClick={validateParentForm}\n disabled={isFormDisabled}\n >\n {dictionary.requestCta}\n </Button>\n </Slot>\n );\n\n const saveButtonNode = (\n <Slot\n name=\"SaveDraftButton\"\n slot={slots?.SaveDraftButton}\n context={\n {\n requestNegotiableQuote,\n formErrors,\n isFormDisabled,\n setIsFormDisabled\n }\n }\n >\n <Button\n type=\"submit\"\n data-draft=\"true\"\n variant=\"secondary\"\n data-testid=\"form-save-draft-button\"\n onClick={validateParentForm}\n disabled={isFormDisabled}\n >\n {dictionary.saveDraftCta}\n </Button>\n </Slot>\n );\n\n return (\n <RequestNegotiableQuoteFormComponent\n title={titleNode}\n banner={getBannerNode()}\n commentField={commentFieldNode}\n quoteNameField={quoteNameFieldNode}\n attachFile={attachFileNode}\n attachedFilesList={attachedFilesListNode}\n requestButton={requestButtonNode}\n saveButton={saveButtonNode}\n onSubmit={formSubmitHandler}\n className={className}\n disabled={isFormDisabled}\n data-testid=\"form-container\"\n />\n );\n};\n"],"names":["RequestNegotiableQuoteForm","className","title","banner","commentField","quoteNameField","attachFile","attachedFilesList","requestButton","saveButton","onSubmit","props","jsxs","classes","jsx","VComponent","cartId","slots","onRequestNegotiableQuote","onSaveNegotiableQuote","onAttachFiles","onSubmitErrors","onError","maxFiles","maxFileSize","acceptedFileTypes","comment","setComment","useState","quoteName","setQuoteName","attachedFiles","setAttachedFiles","error","setError","formErrors","setFormErrors","success","setSuccess","isFormDisabled","setIsFormDisabled","dictionary","useText","useEffect","permissionsEvent","events","permissions","authenticatedEvent","authenticated","handleAttachFiles","useCallback","files","prev","file","validateFileSize","formatFileSize","validateFileType","attachments","rest","_a","newFiles","i","tempKey","result","uploadFile","f","handleRemoveFile","key","getBannerNode","inlineAlertProps","slotProps","CheckWithCircle","WarningFilled","Slot","InLineAlert","validateParentForm","closestForm","getFormErrors","formSubmitHandler","form","mergedFormErrors","buttonTarget","formValues","getFormValues","isDraft","successfulAttachments","contextData","submitHandler","successMessage","requestNegotiableQuote","titleNode","commentFieldNode","TextArea","quoteNameFieldNode","Field","Input","attachFileNode","InputFile","target","fileList","Add","attachedFilesListNode","AttachedFilesList","requestButtonNode","Button","saveButtonNode","RequestNegotiableQuoteFormComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RequestNegotiableQuoteForm.js","sources":["/@dropins/storefront-quote-management/src/components/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.tsx","/@dropins/storefront-quote-management/src/containers/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.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 '@/quote-management/components/RequestNegotiableQuoteForm/RequestNegotiableQuoteForm.css';\n\nexport interface RequestNegotiableQuoteFormProps extends Omit<HTMLAttributes<HTMLFormElement>, 'title'> {\n title: VNode;\n banner?: VNode;\n commentField?: VNode;\n quoteNameField?: VNode;\n attachFile?: VNode;\n attachedFilesList?: VNode;\n requestButton?: VNode;\n saveButton?: VNode;\n onSubmit: (e: Event) => void;\n}\n\nexport const RequestNegotiableQuoteForm: FunctionComponent<RequestNegotiableQuoteFormProps> = ({\n className,\n title,\n banner,\n commentField,\n quoteNameField,\n attachFile,\n attachedFilesList,\n requestButton,\n saveButton,\n onSubmit,\n ...props\n}) => {\n return (\n <form {...props} className={classes(['request-negotiable-quote-form', className])} onSubmit={onSubmit}>\n {banner &&\n <VComponent\n node={banner}\n className={classes(['request-negotiable-quote-form__banner'])}\n />\n }\n {title &&\n <VComponent\n node={title}\n className={classes(['request-negotiable-quote-form__title'])}\n />\n }\n {commentField &&\n <VComponent\n node={commentField}\n className={classes(['request-negotiable-quote-form__comment-field'])}\n />\n }\n {quoteNameField &&\n <VComponent\n node={quoteNameField}\n className={classes(['request-negotiable-quote-form__quote-name-field'])}\n />\n }\n {attachFile &&\n <VComponent\n node={attachFile}\n className={classes(['request-negotiable-quote-form__attach-file-field'])}\n />\n }\n {attachedFilesList &&\n <VComponent\n node={attachedFilesList}\n className={classes(['request-negotiable-quote-form__attached-files-list'])}\n />\n }\n <div className={classes(['request-negotiable-quote-form__actions'])}>\n {requestButton &&\n <VComponent\n node={requestButton}\n className={classes(['request-negotiable-quote-form__request-button'])}\n />\n }\n {saveButton &&\n <VComponent\n node={saveButton}\n className={classes(['request-negotiable-quote-form__save-button'])}\n />\n }\n </div>\n </form>\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 { HTMLAttributes, useCallback, useEffect, useState } from 'preact/compat';\nimport { Container, getFormErrors, getFormValues, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { InLineAlert, Button, InputFile, TextArea, Input, Field, InLineAlertProps } from '@adobe-commerce/elsie/components';\nimport { WarningFilled, CheckWithCircle, Add } from '@adobe-commerce/elsie/icons';\nimport RequestNegotiableQuoteFormComponent from '@/quote-management/components/RequestNegotiableQuoteForm';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { requestNegotiableQuote, RequestNegotiableQuoteInput, uploadFile } from '@/quote-management/api';\nimport { state } from '@/quote-management/lib/state';\nimport { AttachedFilesList, AttachedFile } from '@/quote-management/components';\nimport { formatFileSize, validateFileType, validateFileSize } from '@/quote-management/utils/fileUtils';\n\nexport type RequestNegotiableQuoteHandlers = {\n onAttachFiles?: (files: File[]) => Promise<void>;\n onRequestNegotiableQuote?: typeof requestNegotiableQuote;\n onSaveNegotiableQuote?: typeof requestNegotiableQuote;\n onSubmitErrors?: (errors: Record<string, string>) => void;\n onError?: (props: {\n error: string,\n isFormDisabled: boolean,\n setIsFormDisabled: (isFormDisabled: boolean) => void,\n }) => void;\n};\n\nexport interface RequestNegotiableQuoteFormProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onError'>,\n RequestNegotiableQuoteHandlers {\n cartId: string;\n maxFiles?: number;\n maxFileSize?: number;\n acceptedFileTypes?: string[];\n slots?: {\n ErrorBanner?: SlotProps<{\n message: string,\n }>;\n SuccessBanner?: SlotProps<{\n message: string,\n }>;\n Title?: SlotProps<{\n text: string,\n }>;\n CommentField?: SlotProps<{\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setFormErrors: (errors: Record<string, string>) => void;\n }>;\n QuoteNameField?: SlotProps<{\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setFormErrors: (errors: Record<string, string>) => void;\n }>;\n AttachFileField?: SlotProps<{\n onChange: (files: File[]) => void, formErrors: Record<string, string>,\n isFormDisabled: boolean,\n attachedFiles: AttachedFile[]\n }>;\n AttachedFilesList?: SlotProps<{\n files: AttachedFile[];\n onRemove: (key: string) => void;\n disabled?: boolean;\n }>;\n RequestButton?: SlotProps<{\n requestNegotiableQuote: typeof requestNegotiableQuote;\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setIsFormDisabled: (isFormDisabled: boolean) => void;\n }>;\n SaveDraftButton?: SlotProps<{\n requestNegotiableQuote: typeof requestNegotiableQuote;\n formErrors: Record<string, string>;\n isFormDisabled: boolean;\n setIsFormDisabled: (isFormDisabled: boolean) => void;\n }>;\n };\n}\n\nexport const RequestNegotiableQuoteForm: Container<RequestNegotiableQuoteFormProps> = ({\n cartId,\n slots,\n onRequestNegotiableQuote,\n onSaveNegotiableQuote,\n onAttachFiles,\n onSubmitErrors,\n onError,\n className,\n maxFiles,\n maxFileSize,\n acceptedFileTypes,\n}) => {\n const [comment, setComment] = useState<string | undefined>(undefined);\n const [quoteName, setQuoteName] = useState<string | undefined>(undefined);\n const [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n const [error, setError] = useState<string | undefined>(undefined);\n const [formErrors, setFormErrors] = useState<Record<string, string>>({});\n const [success, setSuccess] = useState<string | undefined>(undefined);\n const [isFormDisabled, setIsFormDisabled] = useState<boolean>(false);\n\n const dictionary = useText({\n title: 'NegotiableQuote.Request.title',\n comment: 'NegotiableQuote.Request.comment',\n commentError: 'NegotiableQuote.Request.commentError',\n quoteName: 'NegotiableQuote.Request.quoteName',\n quoteNameError: 'NegotiableQuote.Request.quoteNameError',\n attachmentsError: 'NegotiableQuote.Request.attachmentsError',\n maxFilesExceeded: 'NegotiableQuote.Request.maxFilesExceeded',\n maxFileSizeExceeded: 'NegotiableQuote.Request.maxFileSizeExceeded',\n invalidFileType: 'NegotiableQuote.Request.invalidFileType',\n requestCta: 'NegotiableQuote.Request.requestCta',\n saveDraftCta: 'NegotiableQuote.Request.saveDraftCta',\n errorHeader: 'NegotiableQuote.Request.error.header',\n unauthenticated: 'NegotiableQuote.Request.error.unauthenticated',\n unauthorized: 'NegotiableQuote.Request.error.unauthorized',\n missingCart: 'NegotiableQuote.Request.error.missingCart',\n successHeader: 'NegotiableQuote.Request.success.header',\n submitSuccess: 'NegotiableQuote.Request.success.submitted',\n draftSuccess: 'NegotiableQuote.Request.success.draftSaved',\n });\n\n useEffect(() => {\n const permissionsEvent = events.on(\n 'quote-management/permissions',\n (permissions: typeof state.permissions) => {\n setError(undefined);\n if (!permissions.requestQuote) {\n setError(dictionary.unauthorized);\n setIsFormDisabled(true);\n }\n else {\n setIsFormDisabled(false);\n }\n },\n { eager: true }\n );\n return () => permissionsEvent?.off();\n }, [dictionary.unauthorized]);\n\n useEffect(() => {\n const authenticatedEvent = events.on(\n 'authenticated',\n (authenticated: boolean) => {\n setError(undefined);\n if (!authenticated) {\n setError(dictionary.unauthenticated);\n setIsFormDisabled(true);\n }\n else {\n setIsFormDisabled(false);\n }\n },\n { eager: true }\n );\n return () => authenticatedEvent?.off();\n }, [dictionary.unauthenticated]);\n\n useEffect(() => {\n if (!cartId) {\n setError(dictionary.missingCart);\n setIsFormDisabled(true);\n }\n }, [cartId, dictionary.missingCart]);\n\n useEffect(() => {\n if (error) {\n onError?.({ error, isFormDisabled, setIsFormDisabled });\n }\n }, [error, onError, isFormDisabled]);\n\n const handleAttachFiles = useCallback(async (files: File[]) => {\n /* istanbul ignore next: defensive guard; */\n if (!files?.length) return;\n\n // Check maxFiles limit\n if (maxFiles && attachedFiles.length + files.length > maxFiles) {\n setFormErrors(prev => ({\n ...prev,\n attachments: dictionary.maxFilesExceeded.replace('{maxFiles}', String(maxFiles))\n }));\n return;\n }\n\n // Validate file types and sizes before uploading\n for (const file of files) {\n if (maxFileSize && !validateFileSize(file.size, maxFileSize)) {\n setFormErrors(prev => ({\n ...prev,\n attachments: dictionary.maxFileSizeExceeded.replace('{maxSize}', formatFileSize(maxFileSize))\n }));\n return;\n }\n\n if (acceptedFileTypes && !validateFileType(file.type, acceptedFileTypes)) {\n setFormErrors(prev => ({ ...prev, attachments: dictionary.invalidFileType }));\n return;\n }\n }\n\n // Set form errors without attachments key\n setFormErrors(prev => { \n // Disable eslint rule for unused attachments key\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { attachments, ...rest } = prev;\n return rest;\n });\n\n\n if (onAttachFiles) {\n onAttachFiles(files)?.catch(() => {\n setFormErrors(prev => ({ ...prev, attachments: dictionary.attachmentsError }));\n });\n return;\n }\n\n // Add files with 'uploading' status\n const newFiles: AttachedFile[] = files.map(file => ({\n key: `temp-${Date.now()}-${Math.random()}-${file.name}`,\n name: file.name,\n size: file.size,\n status: 'uploading',\n }));\n\n setAttachedFiles(prev => [...prev, ...newFiles]);\n\n // Upload each file and update its status\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const tempKey = newFiles[i].key;\n\n try {\n const result = await uploadFile(file);\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, key: result.key, status: 'success' }\n : f\n ));\n } catch (error) {\n setFormErrors(prev => ({ ...prev, attachments: (error as Error).message }));\n setAttachedFiles(prev => prev.map(f =>\n f.key === tempKey\n ? { ...f, status: 'error', error: (error as Error).message }\n : f\n ));\n }\n }\n }, [onAttachFiles, dictionary, maxFiles, maxFileSize, acceptedFileTypes, attachedFiles]);\n\n const handleRemoveFile = useCallback((key: string) => {\n setAttachedFiles(prev => prev.filter(f => f.key !== key));\n }, []);\n\n /*\n * This function is used to get the banner node.\n * It can be used to render a success or error banner depending on the success or error state.\n */\n const getBannerNode = () => {\n let inlineAlertProps: InLineAlertProps | undefined;\n let slotProps: any | undefined;\n\n if (success) {\n slotProps = {\n name: 'SuccessBanner',\n slot: slots?.SuccessBanner,\n context: {\n message: success,\n },\n 'data-testid': 'form-success-banner',\n };\n inlineAlertProps = {\n type: 'success',\n variant: 'primary',\n icon: <CheckWithCircle />,\n heading: dictionary.successHeader,\n description: success,\n className: 'request-negotiable-quote-form__success-banner',\n };\n }\n else if (error) {\n slotProps = {\n name: 'ErrorBanner',\n slot: slots?.ErrorBanner,\n context: {\n message: error,\n },\n 'data-testid': 'form-error-banner',\n };\n inlineAlertProps = {\n type: 'error',\n variant: 'primary',\n icon: <WarningFilled />,\n heading: dictionary.errorHeader,\n description: error,\n className: 'request-negotiable-quote-form__error-banner',\n };\n }\n\n if (slotProps && inlineAlertProps) {\n return <Slot {...slotProps}>\n <InLineAlert {...inlineAlertProps} />\n </Slot>;\n }\n\n return undefined;\n }\n\n /*\n * This function is used to validate the parent form of the button that was clicked.\n */\n const validateParentForm = (e: Event) => {\n setFormErrors({});\n const closestForm = (e.target as HTMLElement).closest('form') as HTMLFormElement;\n const formErrors = getFormErrors(closestForm);\n if (Object.keys(formErrors).length > 0) {\n setFormErrors(formErrors);\n onSubmitErrors?.(formErrors);\n }\n };\n\n const formSubmitHandler = (e: Event) => {\n e.preventDefault();\n setIsFormDisabled(true);\n\n const form = (e.target as HTMLFormElement);\n\n const currentFormErrors = getFormErrors(form);\n\n const mergedFormErrors = { ...currentFormErrors, ...formErrors };\n\n if (Object.keys(mergedFormErrors).length > 0) {\n onSubmitErrors?.(mergedFormErrors)\n return;\n }\n\n // Since we have multiple submit buttons, we need to determine which one was clicked.\n const buttonTarget = (e as SubmitEvent).submitter as HTMLButtonElement;\n\n const formValues = getFormValues(form);\n\n setComment(formValues.comment);\n setQuoteName(formValues.quoteName);\n\n const isDraft = buttonTarget?.dataset?.draft === 'true' || false;\n\n // Only include successfully uploaded files\n const successfulAttachments = attachedFiles\n .filter(f => f.status === 'success')\n .map(f => ({ key: f.key }));\n\n const contextData: RequestNegotiableQuoteInput = {\n cartId: cartId!,\n quoteName: formValues.quoteName,\n comment: formValues.comment,\n attachments: successfulAttachments,\n isDraft,\n }\n\n let submitHandler;\n let successMessage;\n\n if (isDraft) {\n submitHandler = onSaveNegotiableQuote ?? requestNegotiableQuote;\n successMessage = dictionary.draftSuccess;\n } else {\n submitHandler = onRequestNegotiableQuote ?? requestNegotiableQuote;\n successMessage = dictionary.submitSuccess;\n }\n\n submitHandler(contextData).then(() => {\n setSuccess(successMessage);\n })\n .catch(error => {\n setError(error.message);\n })\n };\n\n const titleNode = (\n <Slot name=\"Title\" slot={slots?.Title} context={{ text: dictionary.title }}>\n <span data-testid=\"form-title\">{dictionary.title}</span>\n </Slot>\n );\n\n const commentFieldNode = (\n <Slot\n name=\"CommentField\"\n slot={slots?.CommentField}\n context={{\n value: comment,\n required: true,\n errorMessage: formErrors.comment,\n setFormErrors,\n isFormDisabled\n } as any}\n >\n <TextArea\n name=\"comment\"\n value={comment}\n label={dictionary.comment}\n required\n autoComplete=\"off\"\n data-testid=\"form-comment-field\"\n errorMessage={formErrors.comment}\n disabled={isFormDisabled}\n />\n </Slot>\n );\n\n const quoteNameFieldNode = (\n <Slot\n name=\"QuoteNameField\"\n slot={slots?.QuoteNameField}\n context={{\n value: quoteName,\n required: true,\n errorMessage: formErrors.quoteName,\n setFormErrors,\n isFormDisabled\n } as any}\n >\n <Field\n error={formErrors.quoteName}\n disabled={isFormDisabled}\n >\n <Input\n value={quoteName}\n name=\"quoteName\"\n floatingLabel={dictionary.quoteName}\n required\n autoComplete=\"off\"\n data-testid=\"form-quote-name-field\"\n />\n </Field>\n </Slot>\n );\n\n const attachFileNode = (\n <Slot\n name=\"AttachFileField\"\n slot={slots?.AttachFileField}\n context={{ onChange: handleAttachFiles, formErrors, isFormDisabled, attachedFiles }}\n >\n <InputFile\n multiple\n onChange={(e: Event) => {\n const target = e.target as HTMLInputElement;\n const fileList = target?.files;\n const files = fileList ? Array.from(fileList) : [];\n\n if (files.length > 0) {\n void handleAttachFiles(files);\n }\n }}\n icon={<Add />}\n disabled={isFormDisabled}\n data-testid=\"form-attach-file-field\"\n accept={acceptedFileTypes?.join(',')}\n />\n </Slot>\n );\n\n const attachedFilesListNode = attachedFiles.length > 0 ? (\n <Slot\n name=\"AttachedFilesList\"\n slot={slots?.AttachedFilesList}\n context={{ files: attachedFiles, onRemove: handleRemoveFile, disabled: isFormDisabled }}\n >\n <AttachedFilesList\n files={attachedFiles}\n onRemove={handleRemoveFile}\n disabled={isFormDisabled}\n />\n </Slot>\n ) : undefined;\n\n const requestButtonNode = (\n <Slot\n name=\"RequestButton\"\n slot={slots?.RequestButton}\n context={\n {\n requestNegotiableQuote,\n formErrors,\n isFormDisabled,\n setIsFormDisabled\n }\n }\n >\n <Button\n type=\"submit\"\n data-testid=\"form-request-button\"\n onClick={validateParentForm}\n disabled={isFormDisabled}\n >\n {dictionary.requestCta}\n </Button>\n </Slot>\n );\n\n const saveButtonNode = (\n <Slot\n name=\"SaveDraftButton\"\n slot={slots?.SaveDraftButton}\n context={\n {\n requestNegotiableQuote,\n formErrors,\n isFormDisabled,\n setIsFormDisabled\n }\n }\n >\n <Button\n type=\"submit\"\n data-draft=\"true\"\n variant=\"secondary\"\n data-testid=\"form-save-draft-button\"\n onClick={validateParentForm}\n disabled={isFormDisabled}\n >\n {dictionary.saveDraftCta}\n </Button>\n </Slot>\n );\n\n return (\n <RequestNegotiableQuoteFormComponent\n title={titleNode}\n banner={getBannerNode()}\n commentField={commentFieldNode}\n quoteNameField={quoteNameFieldNode}\n attachFile={attachFileNode}\n attachedFilesList={attachedFilesListNode}\n requestButton={requestButtonNode}\n saveButton={saveButtonNode}\n onSubmit={formSubmitHandler}\n className={className}\n disabled={isFormDisabled}\n data-testid=\"form-container\"\n />\n );\n};\n"],"names":["RequestNegotiableQuoteForm","className","title","banner","commentField","quoteNameField","attachFile","attachedFilesList","requestButton","saveButton","onSubmit","props","jsxs","classes","jsx","VComponent","cartId","slots","onRequestNegotiableQuote","onSaveNegotiableQuote","onAttachFiles","onSubmitErrors","onError","maxFiles","maxFileSize","acceptedFileTypes","comment","setComment","useState","quoteName","setQuoteName","attachedFiles","setAttachedFiles","error","setError","formErrors","setFormErrors","success","setSuccess","isFormDisabled","setIsFormDisabled","dictionary","useText","useEffect","permissionsEvent","events","permissions","authenticatedEvent","authenticated","handleAttachFiles","useCallback","files","prev","file","validateFileSize","formatFileSize","validateFileType","attachments","rest","_a","newFiles","i","tempKey","result","uploadFile","f","handleRemoveFile","key","getBannerNode","inlineAlertProps","slotProps","CheckWithCircle","WarningFilled","Slot","InLineAlert","validateParentForm","closestForm","getFormErrors","formSubmitHandler","form","mergedFormErrors","buttonTarget","formValues","getFormValues","isDraft","successfulAttachments","contextData","submitHandler","successMessage","requestNegotiableQuote","titleNode","commentFieldNode","TextArea","quoteNameFieldNode","Field","Input","attachFileNode","InputFile","target","fileList","Add","attachedFilesListNode","AttachedFilesList","requestButtonNode","Button","saveButtonNode","RequestNegotiableQuoteFormComponent"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
2
|
import { Container } from '@dropins/tools/types/elsie/src/lib';
|
|
3
|
-
import {
|
|
3
|
+
import { ShippingAddress } from '../../data/models/negotiable-quote-model';
|
|
4
4
|
|
|
5
5
|
export interface ShippingAddressDisplayProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {
|
|
6
|
-
|
|
6
|
+
shippingAddress?: ShippingAddress;
|
|
7
7
|
loading?: boolean;
|
|
8
8
|
}
|
|
9
9
|
export declare const ShippingAddressDisplay: Container<ShippingAddressDisplayProps>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Copyright
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{S as
|
|
3
|
+
import{S as e}from"../chunks/ShippingAddressDisplay.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";import"../chunks/WarningFilled.js";import"@dropins/tools/i18n.js";import"@dropins/tools/event-bus.js";export{e as ShippingAddressDisplay};
|
|
4
4
|
//# sourceMappingURL=ShippingAddressDisplay.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CartItemModel, NegotiableQuoteModel } from '../negotiable-quote-model';
|
|
2
2
|
|
|
3
|
-
export declare const baseCartItem:
|
|
4
|
-
export declare const configurableCartItem:
|
|
5
|
-
export declare const bundleCartItem:
|
|
6
|
-
export declare const downloadableCartItem:
|
|
3
|
+
export declare const baseCartItem: CartItemModel;
|
|
4
|
+
export declare const configurableCartItem: CartItemModel;
|
|
5
|
+
export declare const bundleCartItem: CartItemModel;
|
|
6
|
+
export declare const downloadableCartItem: CartItemModel;
|
|
7
7
|
export declare const base: NegotiableQuoteModel;
|
|
8
8
|
//# sourceMappingURL=negotiableQuoteModel.d.ts.map
|
|
@@ -41,6 +41,7 @@ export interface NegotiableQuoteModel {
|
|
|
41
41
|
firstname: string;
|
|
42
42
|
lastname: string;
|
|
43
43
|
};
|
|
44
|
+
email?: string;
|
|
44
45
|
templateName?: string;
|
|
45
46
|
totalQuantity: number;
|
|
46
47
|
comments?: {
|
|
@@ -70,7 +71,7 @@ export interface NegotiableQuoteModel {
|
|
|
70
71
|
subtotalWithDiscountExcludingTax?: Currency;
|
|
71
72
|
totalTax?: Currency;
|
|
72
73
|
};
|
|
73
|
-
items:
|
|
74
|
+
items: CartItemModel[];
|
|
74
75
|
shippingAddresses?: ShippingAddress[];
|
|
75
76
|
canCheckout: boolean;
|
|
76
77
|
canSendForReview: boolean;
|
|
@@ -101,7 +102,7 @@ export interface CustomizableOption {
|
|
|
101
102
|
value: string;
|
|
102
103
|
}[];
|
|
103
104
|
}
|
|
104
|
-
export interface
|
|
105
|
+
export interface CartItemModel {
|
|
105
106
|
itemType: string;
|
|
106
107
|
uid: string;
|
|
107
108
|
product: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Currency,
|
|
1
|
+
import { Currency, PaginationInfo, ShippingAddress, NegotiableQuoteHistoryEntry, CartItemModel } from './negotiable-quote-model';
|
|
2
2
|
|
|
3
3
|
export interface NegotiableQuoteTemplateModel {
|
|
4
4
|
id: string;
|
|
@@ -14,7 +14,7 @@ export interface NegotiableQuoteTemplateModel {
|
|
|
14
14
|
lastname: string;
|
|
15
15
|
};
|
|
16
16
|
comments?: QuoteTemplateComment[];
|
|
17
|
-
history?:
|
|
17
|
+
history?: NegotiableQuoteHistoryEntry[];
|
|
18
18
|
prices: {
|
|
19
19
|
subtotalExcludingTax?: Currency;
|
|
20
20
|
subtotalIncludingTax?: Currency;
|
|
@@ -25,11 +25,12 @@ export interface NegotiableQuoteTemplateModel {
|
|
|
25
25
|
label: string;
|
|
26
26
|
}[];
|
|
27
27
|
};
|
|
28
|
-
items:
|
|
28
|
+
items: CartItemModel[];
|
|
29
29
|
shippingAddresses?: ShippingAddress[];
|
|
30
30
|
referenceDocuments?: {
|
|
31
31
|
uid: string;
|
|
32
32
|
name: string;
|
|
33
|
+
identifier?: string;
|
|
33
34
|
url: string;
|
|
34
35
|
}[];
|
|
35
36
|
quantityThresholds?: {
|
|
@@ -60,32 +61,6 @@ export declare enum NegotiableQuoteTemplateStatus {
|
|
|
60
61
|
CANCELED = "Canceled",
|
|
61
62
|
EXPIRED = "Expired"
|
|
62
63
|
}
|
|
63
|
-
export interface QuoteTemplateCartItem {
|
|
64
|
-
uid?: string;
|
|
65
|
-
product: {
|
|
66
|
-
uid: string;
|
|
67
|
-
sku: string;
|
|
68
|
-
name: string;
|
|
69
|
-
};
|
|
70
|
-
quantity: number;
|
|
71
|
-
prices: {
|
|
72
|
-
originalItemPrice: Currency;
|
|
73
|
-
rowTotal: Currency;
|
|
74
|
-
};
|
|
75
|
-
catalogDiscount?: {
|
|
76
|
-
amountOff: number;
|
|
77
|
-
percentOff: number;
|
|
78
|
-
};
|
|
79
|
-
discounts?: {
|
|
80
|
-
label: string;
|
|
81
|
-
value: string;
|
|
82
|
-
amount: Currency;
|
|
83
|
-
}[];
|
|
84
|
-
noteFromBuyer?: ItemNote[];
|
|
85
|
-
noteFromSeller?: ItemNote[];
|
|
86
|
-
configurableOptions?: ConfigurableOption[];
|
|
87
|
-
bundleOptions?: BundleOption[];
|
|
88
|
-
}
|
|
89
64
|
export interface QuoteTemplateComment {
|
|
90
65
|
uid: string;
|
|
91
66
|
createdAt: string;
|
|
@@ -99,16 +74,6 @@ export interface QuoteTemplateComment {
|
|
|
99
74
|
url: string;
|
|
100
75
|
}[];
|
|
101
76
|
}
|
|
102
|
-
export interface QuoteTemplateHistoryEntry {
|
|
103
|
-
uid: string;
|
|
104
|
-
createdAt: string;
|
|
105
|
-
author: {
|
|
106
|
-
firstname: string;
|
|
107
|
-
lastname: string;
|
|
108
|
-
};
|
|
109
|
-
changeType: string;
|
|
110
|
-
changes: any;
|
|
111
|
-
}
|
|
112
77
|
export interface NegotiableQuoteTemplatesListModel {
|
|
113
78
|
items: NegotiableQuoteTemplateListEntry[];
|
|
114
79
|
pageInfo: {
|
|
@@ -13,6 +13,7 @@ export declare const mockGraphQLResponse: {
|
|
|
13
13
|
firstname: string;
|
|
14
14
|
lastname: string;
|
|
15
15
|
};
|
|
16
|
+
email: string;
|
|
16
17
|
comments: {
|
|
17
18
|
uid: string;
|
|
18
19
|
created_at: string;
|
|
@@ -111,6 +112,7 @@ export declare const mockQuoteData: {
|
|
|
111
112
|
firstname: string;
|
|
112
113
|
lastname: string;
|
|
113
114
|
};
|
|
115
|
+
email: string;
|
|
114
116
|
comments: {
|
|
115
117
|
uid: string;
|
|
116
118
|
created_at: string;
|
|
@@ -198,6 +200,7 @@ export declare const mockQuoteData: {
|
|
|
198
200
|
}[];
|
|
199
201
|
};
|
|
200
202
|
quantity: number;
|
|
203
|
+
is_available: boolean;
|
|
201
204
|
note_from_buyer: {
|
|
202
205
|
created_at: string;
|
|
203
206
|
creator_id: number;
|
|
@@ -282,6 +285,7 @@ export declare const mockQuoteData: {
|
|
|
282
285
|
discounts: never[];
|
|
283
286
|
};
|
|
284
287
|
quantity: number;
|
|
288
|
+
is_available: boolean;
|
|
285
289
|
configurable_options: {
|
|
286
290
|
option_label: string;
|
|
287
291
|
value_label: string;
|
|
@@ -296,6 +300,7 @@ export declare const mockQuoteData: {
|
|
|
296
300
|
}[];
|
|
297
301
|
note_from_seller: never[];
|
|
298
302
|
configured_variant: {
|
|
303
|
+
stock_status: string;
|
|
299
304
|
thumbnail: {
|
|
300
305
|
label: string;
|
|
301
306
|
url: string;
|
|
@@ -400,6 +405,7 @@ export declare const mockQuoteData: {
|
|
|
400
405
|
}[];
|
|
401
406
|
};
|
|
402
407
|
quantity: number;
|
|
408
|
+
is_available: boolean;
|
|
403
409
|
bundle_options: {
|
|
404
410
|
label: string;
|
|
405
411
|
values: {
|
|
@@ -511,6 +517,7 @@ export declare const mockQuoteData: {
|
|
|
511
517
|
}[];
|
|
512
518
|
};
|
|
513
519
|
quantity: number;
|
|
520
|
+
is_available: boolean;
|
|
514
521
|
links: {
|
|
515
522
|
sort_order: number;
|
|
516
523
|
title: string;
|
|
@@ -643,6 +650,7 @@ export declare const mockNegotiableQuotesResponse: {
|
|
|
643
650
|
firstname: string;
|
|
644
651
|
lastname: string;
|
|
645
652
|
};
|
|
653
|
+
email: string;
|
|
646
654
|
items: {
|
|
647
655
|
uid: string;
|
|
648
656
|
product: {
|