@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,4 +1,4 @@
|
|
|
1
|
-
/*! Copyright
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
import{Q as f,Q as l}from"../chunks/QuoteTemplateHistoryLog.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/event-bus.js";import"../chunks/QuoteHistoryLog.js";import"@dropins/tools/lib.js";import"../chunks/dateUtils.js";/* empty css */import"@dropins/tools/i18n.js";export{f as QuoteTemplateHistoryLog,l as default};
|
|
4
4
|
//# sourceMappingURL=QuoteTemplateHistoryLog.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Copyright
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as m,jsx as t,Fragment as ie}from"@dropins/tools/preact-jsx-runtime.js";import{useState as d,useEffect as ce,createPortal as le}from"@dropins/tools/preact-compat.js";import{classes as se,Slot as s}from"@dropins/tools/lib.js";import{Table as de,IllustratedMessage as ue,Picker as ge,Pagination as me,InLineAlert as R,Icon as A,Button as j,Price as pe}from"@dropins/tools/components.js";import{events as Qe}from"@dropins/tools/event-bus.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{f as D}from"../chunks/dateUtils.js";import{useText as $}from"@dropins/tools/i18n.js";import{C as he}from"../chunks/ConfirmationModal.js";/* empty css *//* empty css */import{g as W}from"../chunks/transform-quote.js";import"../chunks/state.js";import{g as fe}from"../chunks/getQuoteTemplates.js";import{g as Me}from"../chunks/generateQuoteFromTemplate.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/transform-quote-template.js";const be=({rowData:p=[],loading:Q=!1,className:x,emptyStateMessage:S,showItemRange:z=!0,itemRangeMessage:u,showPageSizePicker:h=!0,pageSizePickerMessage:g,showPagination:i=!0,paginationMessage:P,...l})=>{const o=$({name:"QuoteManagement.QuoteTemplatesListTable.name",state:"QuoteManagement.QuoteTemplatesListTable.state",status:"QuoteManagement.QuoteTemplatesListTable.status",validUntil:"QuoteManagement.QuoteTemplatesListTable.validUntil",minQuoteTotal:"QuoteManagement.QuoteTemplatesListTable.minQuoteTotal",ordersPlaced:"QuoteManagement.QuoteTemplatesListTable.ordersPlaced",lastOrdered:"QuoteManagement.QuoteTemplatesListTable.lastOrdered",actions:"QuoteManagement.QuoteTemplatesListTable.actions"}),y=[{key:"name",label:o.name},{key:"state",label:o.state},{key:"status",label:o.status},{key:"validUntil",label:o.validUntil},{key:"minQuoteTotal",label:o.minQuoteTotal},{key:"ordersPlaced",label:o.ordersPlaced},{key:"lastOrdered",label:o.lastOrdered},{key:"actions",label:o.actions}],q=Q||p.length>0,f=!Q&&p.length===0&&S,M=z&&u,b=h&&g,T=i&&P,v=M||b||T;return m("div",{...l,className:se(["quote-management-quote-templates-list-table",x]),children:[q&&t(de,{columns:y,rowData:p,loading:Q,mobileLayout:"none",className:"quote-management-quote-templates-list-table__table"}),f&&t("div",{className:"quote-templates-list-table__empty-state",children:S}),v&&m("div",{className:"quote-templates-list-table__footer",children:[t("div",{className:"quote-templates-list-table__item-range",children:M&&u}),t("div",{className:"quote-templates-list-table__pagination",children:T&&P}),t("div",{className:"quote-templates-list-table__page-size-picker",children:b&&g})]})]})},Ue=({pageSize:p,showItemRange:Q=!0,showPageSizePicker:x=!0,showPagination:S=!0,onViewQuoteTemplate:z,onGenerateQuoteFromTemplate:u,onPageSizeChange:h,onPageChange:g,slots:i,...P})=>{const l=$({view:"QuoteManagement.QuoteTemplatesListTable.view",generateQuote:"NegotiableQuoteTemplate.Manage.actionButtons.generateQuote",generateQuoteModalMessage:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.message",generateQuoteModalCancel:"NegotiableQuoteTemplate.Manage.confirmationModal.cancel",generateQuoteModalConfirm:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirm",generateQuoteModalConfirmLoading:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.confirmLoading",generateQuoteModalSuccessHeading:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successHeading",generateQuoteSuccessMessage:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.successDescription",generateQuoteModalErrorHeading:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorHeading",generateQuoteErrorFallback:"NegotiableQuoteTemplate.Manage.confirmationModal.generateQuote.errorFallback"}),[o,y]=d(null),[q,f]=d(!0),[M,b]=d(!1),[T,v]=d(!1),[I,O]=d(null),[_,N]=d(""),[w,k]=d(""),J=W()[0],[E,K]=d(p||J),[G,F]=d(1);ce(()=>{const n=async()=>{try{f(!0);const c=await fe({pageSize:E,currentPage:G});y(c)}catch(c){console.error("Failed to fetch quote templates:",c)}finally{f(!1)}},e=Qe.on("authenticated",c=>{c?n():(y(null),f(!1))},{eager:!0});return()=>{e==null||e.off()}},[E,G]);const U=n=>{K(n),F(1),h==null||h(n)},H=n=>{F(n),g==null||g(n)},X=n=>{const e=n.target,c=e==null?void 0:e.value;c&&U(Number(c))},Y=(n,e)=>{O({id:n,name:e}),N(""),k(""),b(!0)},Z=async n=>{v(!0),N(""),k("");try{const e=await Me({templateId:n.id});N(l.generateQuoteSuccessMessage),u==null||u(n.id,n.name,e.quoteId)}catch(e){console.error("Failed to generate quote from template:",e);const c=e instanceof Error?e.message:l.generateQuoteErrorFallback;k(c)}finally{v(!1)}},V=()=>{b(!1),O(null),N(""),k("")},ee=(n,e,c)=>n.filter(a=>a==null?void 0:a.uid).map(a=>{var B;return{id:a.id,name:t(s,{name:"Name",slot:e==null?void 0:e.Name,context:{template:a},children:t("span",{children:a.name})}),state:t(s,{name:"State",slot:e==null?void 0:e.State,context:{template:a},children:t("span",{style:{textTransform:"capitalize"},children:((B=a.state)==null?void 0:B.replace(/_/g," "))||"-"})}),status:t(s,{name:"Status",slot:e==null?void 0:e.Status,context:{template:a},children:t("span",{children:a.status})}),validUntil:t(s,{name:"ValidUntil",slot:e==null?void 0:e.ValidUntil,context:{template:a},children:t("span",{children:D(a.expirationDate,"short")})}),minQuoteTotal:t(s,{name:"MinQuoteTotal",slot:e==null?void 0:e.MinQuoteTotal,context:{template:a},children:t(pe,{amount:a.prices.minNegotiatedGrandTotal.value,currency:a.prices.minNegotiatedGrandTotal.currency})}),ordersPlaced:t(s,{name:"OrdersPlaced",slot:e==null?void 0:e.OrdersPlaced,context:{template:a},children:t("span",{children:a.ordersPlaced})}),lastOrdered:t(s,{name:"LastOrdered",slot:e==null?void 0:e.LastOrdered,context:{template:a},children:t("span",{children:D(a.lastOrderedAt,"short")})}),actions:m(s,{name:"Actions",slot:e==null?void 0:e.Actions,context:{template:a,onViewQuoteTemplate:c},className:"quote-management-quote-templates-list-table__actions-cell",children:[t(j,{variant:"tertiary",size:"medium",onClick:()=>c==null?void 0:c(a.id,a.name,a.status),children:l.view}),a.canGenerateQuoteFromTemplate&&t(j,{variant:"primary",size:"medium",onClick:()=>Y(a.id,a.name),"data-testid":`generate-quote-button-${a.id}`,children:l.generateQuote})]})}}),te=o!=null&&o.items?ee(o.items,i,z):[],r=o!=null&&o.paginationInfo?{...o.paginationInfo,pageSizeOptions:W()}:void 0,C=!!r,ae=t(s,{name:"EmptyTemplates",slot:i==null?void 0:i.EmptyTemplates,context:{templatesData:o},children:t(ue,{heading:"No Quote Templates Found"})}),ne=r?t(s,{name:"ItemRange",slot:i==null?void 0:i.ItemRange,context:r,children:m("span",{children:["Items ",r.startItem," to ",r.endItem," of"," ",r.totalCount," total"]})}):void 0,oe=r&&r.pageSizeOptions?m(s,{name:"PageSizePicker",slot:i==null?void 0:i.PageSizePicker,context:{pageSize:r.pageSize,pageSizeOptions:r.pageSizeOptions,onPageSizeChange:U},children:[t("span",{children:"Show "}),t(ge,{variant:"primary",size:"medium",value:String(r.pageSize),options:r.pageSizeOptions.map(n=>({value:String(n),text:String(n)})),handleSelect:X}),t("span",{children:" per page"})]}):void 0,re=r?t(s,{name:"Pagination",slot:i==null?void 0:i.Pagination,context:{currentPage:r.currentPage,totalPages:r.totalPages,onChange:H},children:t(me,{currentPage:r.currentPage,totalPages:r.totalPages,onChange:H})}):void 0;let L=null;return _?L=t(R,{type:"success",variant:"primary",icon:t(A,{source:"CheckWithCircle"}),heading:l.generateQuoteModalSuccessHeading,description:_,"data-testid":"generate-quote-success-banner"}):w&&(L=t(R,{type:"error",variant:"primary",icon:t(A,{source:"WarningFilled"}),heading:l.generateQuoteModalErrorHeading,description:w,"data-testid":"generate-quote-error-banner"})),m(ie,{children:[t(be,{rowData:te,loading:q,className:P.className,emptyStateMessage:ae,showItemRange:Q&&C,itemRangeMessage:ne,showPageSizePicker:x&&C,pageSizePickerMessage:oe,showPagination:S&&C,paginationMessage:re}),M&&le(t(he,{open:M,title:l.generateQuote,message:l.generateQuoteModalMessage,cancelLabel:l.generateQuoteModalCancel,confirmLabel:T?l.generateQuoteModalConfirmLoading:l.generateQuoteModalConfirm,onCancel:V,onConfirm:T||!I?void 0:()=>Z(I),showCloseButton:!L,confirmationBanner:L,"data-testid":"generate-quote-confirmation-modal"}),document.body)]})};export{Ue as QuoteTemplatesListTable,Ue as default};
|
|
4
4
|
//# sourceMappingURL=QuoteTemplatesListTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuoteTemplatesListTable.js","sources":["/@dropins/storefront-quote-management/src/components/QuoteTemplatesListTable/QuoteTemplatesListTable.tsx","/@dropins/storefront-quote-management/src/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.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 } from '@adobe-commerce/elsie/lib';\nimport { Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/QuoteTemplatesListTable/QuoteTemplatesListTable.css';\n\ntype Column = {\n key: string;\n label: string;\n};\n\nexport interface QuoteTemplatesListTableProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading' | 'children'> {\n rowData: QuoteTemplateRowData[];\n loading?: boolean;\n className?: string;\n emptyStateMessage?: VNode;\n showItemRange?: boolean;\n itemRangeMessage?: VNode;\n showPageSizePicker?: boolean;\n pageSizePickerMessage?: VNode;\n showPagination?: boolean;\n paginationMessage?: VNode;\n}\n\nexport type QuoteTemplateRowData = {\n id: string;\n name: VNode;\n state: VNode;\n status: VNode;\n validUntil: VNode;\n minQuoteTotal: VNode;\n ordersPlaced: VNode;\n lastOrdered: VNode;\n actions: VNode;\n [key: string]: VNode | string | number | undefined;\n};\n\nexport const QuoteTemplatesListTable: FunctionComponent<\n QuoteTemplatesListTableProps\n> = ({\n rowData = [],\n loading = false,\n className,\n emptyStateMessage,\n showItemRange = true,\n itemRangeMessage,\n showPageSizePicker = true,\n pageSizePickerMessage,\n showPagination = true,\n paginationMessage,\n ...props\n}) => {\n const dictionary = useText({\n name: 'QuoteManagement.QuoteTemplatesListTable.name',\n state: 'QuoteManagement.QuoteTemplatesListTable.state',\n status: 'QuoteManagement.QuoteTemplatesListTable.status',\n validUntil: 'QuoteManagement.QuoteTemplatesListTable.validUntil',\n minQuoteTotal: 'QuoteManagement.QuoteTemplatesListTable.minQuoteTotal',\n ordersPlaced: 'QuoteManagement.QuoteTemplatesListTable.ordersPlaced',\n lastOrdered: 'QuoteManagement.QuoteTemplatesListTable.lastOrdered',\n actions: 'QuoteManagement.QuoteTemplatesListTable.actions',\n });\n\n const columns: Column[] = [\n { key: 'name', label: dictionary.name },\n { key: 'state', label: dictionary.state },\n { key: 'status', label: dictionary.status },\n { key: 'validUntil', label: dictionary.validUntil },\n { key: 'minQuoteTotal', label: dictionary.minQuoteTotal },\n { key: 'ordersPlaced', label: dictionary.ordersPlaced },\n { key: 'lastOrdered', label: dictionary.lastOrdered },\n { key: 'actions', label: dictionary.actions },\n ];\n\n // Check if we should show empty state\n const shouldShowEmptyState =\n !loading && rowData.length === 0 && emptyStateMessage;\n\n // Show item range if requested and message is provided\n const shouldShowItemRange = showItemRange && itemRangeMessage;\n\n // Show page size picker if requested and message is provided\n const shouldShowPageSizePicker = showPageSizePicker && pageSizePickerMessage;\n\n // Show pagination if requested and message is provided\n const shouldShowPagination = showPagination && paginationMessage;\n\n // Show footer if any pagination element should be shown\n const shouldShowFooter =\n shouldShowItemRange || shouldShowPageSizePicker || shouldShowPagination;\n\n return (\n <div\n {...props}\n className={classes([\n 'quote-management-quote-templates-list-table',\n className,\n ])}\n >\n <Table\n columns={columns}\n rowData={rowData}\n loading={loading}\n mobileLayout=\"none\"\n className=\"quote-management-quote-templates-list-table__table\"\n />\n {shouldShowEmptyState && (\n <div className=\"quote-templates-list-table__empty-state\">\n {emptyStateMessage}\n </div>\n )}\n {shouldShowFooter && (\n <div className=\"quote-templates-list-table__footer\">\n <div className=\"quote-templates-list-table__item-range\">\n {shouldShowItemRange && itemRangeMessage}\n </div>\n <div className=\"quote-templates-list-table__pagination\">\n {shouldShowPagination && paginationMessage}\n </div>\n <div className=\"quote-templates-list-table__page-size-picker\">\n {shouldShowPageSizePicker && pageSizePickerMessage}\n </div>\n </div>\n )}\n </div>\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, useEffect, useState, createPortal } from 'preact/compat';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n Price,\n Button,\n IllustratedMessage,\n Picker,\n Pagination,\n type PickerOption,\n} from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n QuoteTemplatesListTable as QuoteTemplatesListTableComponent,\n QuoteTemplateRowData,\n ConfirmationModal,\n} from '@/quote-management/components';\nimport { getQuoteTemplates, generateQuoteFromTemplate } from '@/quote-management/api';\nimport { getDefaultPageSizeOptions } from '@/quote-management/data/transforms';\nimport {\n NegotiableQuoteTemplatesListModel,\n NegotiableQuoteTemplateListEntry,\n} from '@/quote-management/data/models';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\n\nexport interface QuoteTemplatesListTableProps\n extends HTMLAttributes<HTMLDivElement> {\n pageSize?: number;\n showItemRange?: boolean;\n showPageSizePicker?: boolean;\n showPagination?: boolean;\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (templateId: string, templateName: string, quoteId: string) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n slots?: {\n /** Slot for customizing the template name cell content */\n Name?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the state cell content */\n State?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the status cell content */\n Status?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the valid until cell content */\n ValidUntil?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the min quote total cell content */\n MinQuoteTotal?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the orders placed cell content */\n OrdersPlaced?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the last ordered cell content */\n LastOrdered?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the actions cell content */\n Actions?: SlotProps<{\n template: NegotiableQuoteTemplateListEntry;\n onViewQuoteTemplate?: (id: string, name: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (id: string, name: string) => void;\n }>;\n /** Slot for customizing the empty templates message */\n EmptyTemplates?: SlotProps;\n /** Slot for customizing the item range display */\n ItemRange?: SlotProps<{\n startItem: number;\n endItem: number;\n totalCount: number;\n currentPage: number;\n pageSize: number;\n }>;\n /** Slot for customizing the page size picker */\n PageSizePicker?: SlotProps<{\n pageSize: number;\n pageSizeOptions: number[];\n onPageSizeChange?: (pageSize: number) => void;\n }>;\n /** Slot for customizing the pagination */\n Pagination?: SlotProps<{\n currentPage: number;\n totalPages: number;\n onChange?: (page: number) => void;\n }>;\n };\n}\n\nexport const QuoteTemplatesListTable: Container<\n QuoteTemplatesListTableProps\n> = ({\n pageSize,\n showItemRange = true,\n showPageSizePicker = true,\n showPagination = true,\n onViewQuoteTemplate,\n onGenerateQuoteFromTemplate,\n onPageSizeChange,\n onPageChange,\n slots,\n ...props\n}) => {\n const dictionary = useText({\n view: 'QuoteManagement.QuoteTemplatesListTable.view',\n generateQuote: '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 });\n\n const [templatesData, setTemplatesData] =\n useState<NegotiableQuoteTemplatesListModel | null>(null);\n const [loading, setLoading] = useState(true);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [selectedTemplate, setSelectedTemplate] = useState<{ id: string; name: string } | null>(null);\n\n // Default to first page size option if no pageSize prop provided\n const defaultPageSize = getDefaultPageSizeOptions()[0];\n const [currentPageSize, setCurrentPageSize] = useState(\n pageSize || defaultPageSize\n );\n const [currentPage, setCurrentPage] = useState(1);\n\n // Fetch quote templates data when authenticated\n useEffect(() => {\n const fetchTemplates = async () => {\n try {\n setLoading(true);\n const data = await getQuoteTemplates({\n pageSize: currentPageSize,\n currentPage,\n });\n setTemplatesData(data);\n } catch (error) {\n console.error('Failed to fetch quote templates:', error);\n } finally {\n setLoading(false);\n }\n };\n\n // Listen for authentication events\n const unsubscribe = events.on(\n 'authenticated',\n (isAuthenticated) => {\n if (isAuthenticated) {\n fetchTemplates();\n } else {\n setTemplatesData(null);\n setLoading(false);\n }\n },\n { eager: true }\n ); // eager: true means it fires immediately with current state\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Handle page size change\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1); // Reset to page 1 when page size changes\n onPageSizeChange?.(newPageSize); // Also call parent callback\n };\n\n // Handle page change\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n onPageChange?.(newPage); // Also call parent callback\n };\n\n // Handle page size picker selection\n const handlePageSizeSelect = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target?.value;\n if (value) {\n handlePageSizeChange(Number(value));\n }\n };\n\n // Handle generate quote button click\n const handleGenerateQuoteClick = (templateId: string, templateName: string) => {\n setSelectedTemplate({ id: templateId, name: templateName });\n setShowGenerateQuoteModal(true);\n };\n\n // Handle generate quote confirmation\n const handleGenerateQuote = async (template: { id: string; name: string }) => { \n setIsGeneratingQuote(true);\n \n try {\n const result = await generateQuoteFromTemplate({ templateId: template.id });\n \n // Call the callback AFTER successful generation\n onGenerateQuoteFromTemplate?.(template.id, template.name, result.quoteId);\n \n // Close modal on success\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n // Keep modal open on error so user can try again or cancel\n } finally {\n setIsGeneratingQuote(false);\n }\n };\n\n // Handle generate quote modal cancel\n const handleGenerateQuoteModalCancel = () => {\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n };\n\n // Prepare transformed quote template data for table component\n const prepareRowData = (\n templates: NegotiableQuoteTemplateListEntry[],\n slots?: QuoteTemplatesListTableProps['slots'],\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void\n ): QuoteTemplateRowData[] => {\n return templates\n .filter((template) => template?.uid) // Filter out null templates\n .map((template) => {\n return {\n id: template.id,\n name: (\n <Slot name=\"Name\" slot={slots?.Name} context={{ template }}>\n <span>{template.name}</span>\n </Slot>\n ),\n state: (\n <Slot name=\"State\" slot={slots?.State} context={{ template }}>\n <span style={{ textTransform: 'capitalize' }}>\n {template.state?.replace(/_/g, ' ') || '-'}\n </span>\n </Slot>\n ),\n status: (\n <Slot name=\"Status\" slot={slots?.Status} context={{ template }}>\n <span>{template.status}</span>\n </Slot>\n ),\n validUntil: (\n <Slot\n name=\"ValidUntil\"\n slot={slots?.ValidUntil}\n context={{ template }}\n >\n <span>{formattedDate(template.expirationDate, 'short')}</span>\n </Slot>\n ),\n minQuoteTotal: (\n <Slot\n name=\"MinQuoteTotal\"\n slot={slots?.MinQuoteTotal}\n context={{ template }}\n >\n <Price\n amount={template.prices.minNegotiatedGrandTotal.value}\n currency={template.prices.minNegotiatedGrandTotal.currency}\n />\n </Slot>\n ),\n ordersPlaced: (\n <Slot\n name=\"OrdersPlaced\"\n slot={slots?.OrdersPlaced}\n context={{ template }}\n >\n <span>{template.ordersPlaced}</span>\n </Slot>\n ),\n lastOrdered: (\n <Slot\n name=\"LastOrdered\"\n slot={slots?.LastOrdered}\n context={{ template }}\n >\n <span>{formattedDate(template.lastOrderedAt, 'short')}</span>\n </Slot>\n ),\n actions: (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{ template, onViewQuoteTemplate }}\n className=\"quote-management-quote-templates-list-table__actions-cell\"\n >\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n onClick={() => onViewQuoteTemplate?.(template.id, template.name, template.status)}\n >\n {dictionary.view}\n </Button>\n {template.canGenerateQuoteFromTemplate && (\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={() => handleGenerateQuoteClick(template.id, template.name)}\n data-testid={`generate-quote-button-${template.id}`}\n >\n {dictionary.generateQuote}\n </Button>\n )}\n </Slot>\n ),\n };\n });\n };\n\n // Prepare data for rendering\n const rowData = templatesData?.items\n ? prepareRowData(templatesData.items, slots, onViewQuoteTemplate)\n : [];\n\n // Use pagination info directly from API response, merging in pageSizeOptions if needed\n const paginationInfo = templatesData?.paginationInfo\n ? {\n ...templatesData.paginationInfo,\n pageSizeOptions: getDefaultPageSizeOptions(),\n }\n : undefined;\n\n const shouldShowPagination = !!paginationInfo;\n\n // Empty state message\n const emptyStateMessage = (\n <Slot\n name=\"EmptyTemplates\"\n slot={slots?.EmptyTemplates}\n context={{ templatesData }}\n >\n <IllustratedMessage heading=\"No Quote Templates Found\" />\n </Slot>\n );\n\n // Item range message\n const itemRangeMessage = paginationInfo ? (\n <Slot name=\"ItemRange\" slot={slots?.ItemRange} context={paginationInfo}>\n <span>\n Items {paginationInfo.startItem} to {paginationInfo.endItem} of{' '}\n {paginationInfo.totalCount} total\n </span>\n </Slot>\n ) : undefined;\n\n // Prepare page size picker message for component\n const pageSizePickerMessage =\n paginationInfo && paginationInfo.pageSizeOptions ? (\n <Slot\n name=\"PageSizePicker\"\n slot={slots?.PageSizePicker}\n context={{\n pageSize: paginationInfo.pageSize,\n pageSizeOptions: paginationInfo.pageSizeOptions,\n onPageSizeChange: handlePageSizeChange,\n }}\n >\n <span>Show </span>\n <Picker\n variant=\"primary\"\n size=\"medium\"\n value={String(paginationInfo.pageSize)}\n options={paginationInfo.pageSizeOptions.map(\n (size): PickerOption => ({\n value: String(size),\n text: String(size),\n })\n )}\n handleSelect={handlePageSizeSelect}\n />\n <span> per page</span>\n </Slot>\n ) : undefined;\n\n // Prepare pagination message for component\n const paginationMessage = paginationInfo ? (\n <Slot\n name=\"Pagination\"\n slot={slots?.Pagination}\n context={{\n currentPage: paginationInfo.currentPage,\n totalPages: paginationInfo.totalPages,\n onChange: handlePageChange,\n }}\n >\n <Pagination\n currentPage={paginationInfo.currentPage}\n totalPages={paginationInfo.totalPages}\n onChange={handlePageChange}\n />\n </Slot>\n ) : undefined;\n\n return (\n <>\n <QuoteTemplatesListTableComponent\n rowData={rowData}\n loading={loading}\n className={props.className as string}\n emptyStateMessage={emptyStateMessage}\n showItemRange={showItemRange && shouldShowPagination}\n itemRangeMessage={itemRangeMessage}\n showPageSizePicker={showPageSizePicker && shouldShowPagination}\n pageSizePickerMessage={pageSizePickerMessage}\n showPagination={showPagination && shouldShowPagination}\n paginationMessage={paginationMessage}\n />\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuote}\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 || !selectedTemplate ? undefined : () => handleGenerateQuote(selectedTemplate)}\n showCloseButton={true}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["QuoteTemplatesListTable","rowData","loading","className","emptyStateMessage","showItemRange","itemRangeMessage","showPageSizePicker","pageSizePickerMessage","showPagination","paginationMessage","props","dictionary","useText","columns","shouldShowEmptyState","shouldShowItemRange","shouldShowPageSizePicker","shouldShowPagination","shouldShowFooter","jsxs","classes","jsx","Table","pageSize","onViewQuoteTemplate","onGenerateQuoteFromTemplate","onPageSizeChange","onPageChange","slots","templatesData","setTemplatesData","useState","setLoading","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","selectedTemplate","setSelectedTemplate","defaultPageSize","getDefaultPageSizeOptions","currentPageSize","setCurrentPageSize","currentPage","setCurrentPage","useEffect","fetchTemplates","data","getQuoteTemplates","error","unsubscribe","events","isAuthenticated","handlePageSizeChange","newPageSize","handlePageChange","newPage","handlePageSizeSelect","event","target","value","handleGenerateQuoteClick","templateId","templateName","handleGenerateQuote","template","result","generateQuoteFromTemplate","handleGenerateQuoteModalCancel","prepareRowData","templates","Slot","_a","formattedDate","Price","Button","paginationInfo","IllustratedMessage","Picker","size","Pagination","Fragment","QuoteTemplatesListTableComponent","createPortal","ConfirmationModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuoteTemplatesListTable.js","sources":["/@dropins/storefront-quote-management/src/components/QuoteTemplatesListTable/QuoteTemplatesListTable.tsx","/@dropins/storefront-quote-management/src/containers/QuoteTemplatesListTable/QuoteTemplatesListTable.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 } from '@adobe-commerce/elsie/lib';\nimport { Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/QuoteTemplatesListTable/QuoteTemplatesListTable.css';\n\ntype Column = {\n key: string;\n label: string;\n};\n\nexport interface QuoteTemplatesListTableProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading' | 'children'> {\n rowData: QuoteTemplateRowData[];\n loading?: boolean;\n className?: string;\n emptyStateMessage?: VNode;\n showItemRange?: boolean;\n itemRangeMessage?: VNode;\n showPageSizePicker?: boolean;\n pageSizePickerMessage?: VNode;\n showPagination?: boolean;\n paginationMessage?: VNode;\n}\n\nexport type QuoteTemplateRowData = {\n id: string;\n name: VNode;\n state: VNode;\n status: VNode;\n validUntil: VNode;\n minQuoteTotal: VNode;\n ordersPlaced: VNode;\n lastOrdered: VNode;\n actions: VNode;\n [key: string]: VNode | string | number | undefined;\n};\n\nexport const QuoteTemplatesListTable: FunctionComponent<\n QuoteTemplatesListTableProps\n> = ({\n rowData = [],\n loading = false,\n className,\n emptyStateMessage,\n showItemRange = true,\n itemRangeMessage,\n showPageSizePicker = true,\n pageSizePickerMessage,\n showPagination = true,\n paginationMessage,\n ...props\n}) => {\n const dictionary = useText({\n name: 'QuoteManagement.QuoteTemplatesListTable.name',\n state: 'QuoteManagement.QuoteTemplatesListTable.state',\n status: 'QuoteManagement.QuoteTemplatesListTable.status',\n validUntil: 'QuoteManagement.QuoteTemplatesListTable.validUntil',\n minQuoteTotal: 'QuoteManagement.QuoteTemplatesListTable.minQuoteTotal',\n ordersPlaced: 'QuoteManagement.QuoteTemplatesListTable.ordersPlaced',\n lastOrdered: 'QuoteManagement.QuoteTemplatesListTable.lastOrdered',\n actions: 'QuoteManagement.QuoteTemplatesListTable.actions',\n });\n\n const columns: Column[] = [\n { key: 'name', label: dictionary.name },\n { key: 'state', label: dictionary.state },\n { key: 'status', label: dictionary.status },\n { key: 'validUntil', label: dictionary.validUntil },\n { key: 'minQuoteTotal', label: dictionary.minQuoteTotal },\n { key: 'ordersPlaced', label: dictionary.ordersPlaced },\n { key: 'lastOrdered', label: dictionary.lastOrdered },\n { key: 'actions', label: dictionary.actions },\n ];\n\n // Check if should show the table when loading or there is data\n const shouldShowTable = loading || rowData.length > 0;\n\n // Check if we should show empty state\n const shouldShowEmptyState =\n !loading && rowData.length === 0 && emptyStateMessage;\n\n // Show item range if requested and message is provided\n const shouldShowItemRange = showItemRange && itemRangeMessage;\n\n // Show page size picker if requested and message is provided\n const shouldShowPageSizePicker = showPageSizePicker && pageSizePickerMessage;\n\n // Show pagination if requested and message is provided\n const shouldShowPagination = showPagination && paginationMessage;\n\n // Show footer if any pagination element should be shown\n const shouldShowFooter =\n shouldShowItemRange || shouldShowPageSizePicker || shouldShowPagination;\n\n return (\n <div\n {...props}\n className={classes([\n 'quote-management-quote-templates-list-table',\n className,\n ])}\n >\n {shouldShowTable && (\n <Table\n columns={columns}\n rowData={rowData}\n loading={loading}\n mobileLayout=\"none\"\n className=\"quote-management-quote-templates-list-table__table\"\n />\n )}\n {shouldShowEmptyState && (\n <div className=\"quote-templates-list-table__empty-state\">\n {emptyStateMessage}\n </div>\n )}\n {shouldShowFooter && (\n <div className=\"quote-templates-list-table__footer\">\n <div className=\"quote-templates-list-table__item-range\">\n {shouldShowItemRange && itemRangeMessage}\n </div>\n <div className=\"quote-templates-list-table__pagination\">\n {shouldShowPagination && paginationMessage}\n </div>\n <div className=\"quote-templates-list-table__page-size-picker\">\n {shouldShowPageSizePicker && pageSizePickerMessage}\n </div>\n </div>\n )}\n </div>\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, useEffect, useState, createPortal } from 'preact/compat';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n Price,\n Button,\n IllustratedMessage,\n Picker,\n Pagination,\n InLineAlert,\n Icon,\n type PickerOption,\n} from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n QuoteTemplatesListTable as QuoteTemplatesListTableComponent,\n QuoteTemplateRowData,\n ConfirmationModal,\n} from '@/quote-management/components';\nimport { getQuoteTemplates, generateQuoteFromTemplate } from '@/quote-management/api';\nimport { getDefaultPageSizeOptions } from '@/quote-management/data/transforms';\nimport {\n NegotiableQuoteTemplatesListModel,\n NegotiableQuoteTemplateListEntry,\n} from '@/quote-management/data/models';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\n\nexport interface QuoteTemplatesListTableProps\n extends HTMLAttributes<HTMLDivElement> {\n pageSize?: number;\n showItemRange?: boolean;\n showPageSizePicker?: boolean;\n showPagination?: boolean;\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (templateId: string, templateName: string, quoteId: string) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n slots?: {\n /** Slot for customizing the template name cell content */\n Name?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the state cell content */\n State?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the status cell content */\n Status?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the valid until cell content */\n ValidUntil?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the min quote total cell content */\n MinQuoteTotal?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the orders placed cell content */\n OrdersPlaced?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the last ordered cell content */\n LastOrdered?: SlotProps<{ template: NegotiableQuoteTemplateListEntry }>;\n /** Slot for customizing the actions cell content */\n Actions?: SlotProps<{\n template: NegotiableQuoteTemplateListEntry;\n onViewQuoteTemplate?: (id: string, name: string, status: string) => void;\n onGenerateQuoteFromTemplate?: (id: string, name: string) => void;\n }>;\n /** Slot for customizing the empty templates message */\n EmptyTemplates?: SlotProps;\n /** Slot for customizing the item range display */\n ItemRange?: SlotProps<{\n startItem: number;\n endItem: number;\n totalCount: number;\n currentPage: number;\n pageSize: number;\n }>;\n /** Slot for customizing the page size picker */\n PageSizePicker?: SlotProps<{\n pageSize: number;\n pageSizeOptions: number[];\n onPageSizeChange?: (pageSize: number) => void;\n }>;\n /** Slot for customizing the pagination */\n Pagination?: SlotProps<{\n currentPage: number;\n totalPages: number;\n onChange?: (page: number) => void;\n }>;\n };\n}\n\nexport const QuoteTemplatesListTable: Container<\n QuoteTemplatesListTableProps\n> = ({\n pageSize,\n showItemRange = true,\n showPageSizePicker = true,\n showPagination = true,\n onViewQuoteTemplate,\n onGenerateQuoteFromTemplate,\n onPageSizeChange,\n onPageChange,\n slots,\n ...props\n}) => {\n const dictionary = useText({\n view: 'QuoteManagement.QuoteTemplatesListTable.view',\n generateQuote: '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 });\n\n const [templatesData, setTemplatesData] =\n useState<NegotiableQuoteTemplatesListModel | null>(null);\n const [loading, setLoading] = useState(true);\n const [showGenerateQuoteModal, setShowGenerateQuoteModal] = useState<boolean>(false);\n const [isGeneratingQuote, setIsGeneratingQuote] = useState<boolean>(false);\n const [selectedTemplate, setSelectedTemplate] = useState<{ id: string; name: string } | null>(null);\n const [generateQuoteSuccessMessage, setGenerateQuoteSuccessMessage] = useState<string>('');\n const [generateQuoteErrorMessage, setGenerateQuoteErrorMessage] = useState<string>('');\n\n // Default to first page size option if no pageSize prop provided\n const defaultPageSize = getDefaultPageSizeOptions()[0];\n const [currentPageSize, setCurrentPageSize] = useState(\n pageSize || defaultPageSize\n );\n const [currentPage, setCurrentPage] = useState(1);\n\n // Fetch quote templates data when authenticated\n useEffect(() => {\n const fetchTemplates = async () => {\n try {\n setLoading(true);\n const data = await getQuoteTemplates({\n pageSize: currentPageSize,\n currentPage,\n });\n setTemplatesData(data);\n } catch (error) {\n console.error('Failed to fetch quote templates:', error);\n } finally {\n setLoading(false);\n }\n };\n\n // Listen for authentication events\n const unsubscribe = events.on(\n 'authenticated',\n (isAuthenticated) => {\n if (isAuthenticated) {\n fetchTemplates();\n } else {\n setTemplatesData(null);\n setLoading(false);\n }\n },\n { eager: true }\n ); // eager: true means it fires immediately with current state\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Handle page size change\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1); // Reset to page 1 when page size changes\n onPageSizeChange?.(newPageSize); // Also call parent callback\n };\n\n // Handle page change\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n onPageChange?.(newPage); // Also call parent callback\n };\n\n // Handle page size picker selection\n const handlePageSizeSelect = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target?.value;\n if (value) {\n handlePageSizeChange(Number(value));\n }\n };\n\n // Handle generate quote button click\n const handleGenerateQuoteClick = (templateId: string, templateName: string) => {\n setSelectedTemplate({ id: templateId, name: templateName });\n setGenerateQuoteSuccessMessage('');\n setGenerateQuoteErrorMessage('');\n setShowGenerateQuoteModal(true);\n };\n\n // Handle generate quote confirmation\n const handleGenerateQuote = async (template: { id: string; name: string }) => { \n setIsGeneratingQuote(true);\n setGenerateQuoteSuccessMessage('');\n setGenerateQuoteErrorMessage('');\n \n try {\n const result = await generateQuoteFromTemplate({ templateId: template.id });\n \n // Show success message\n setGenerateQuoteSuccessMessage(dictionary.generateQuoteSuccessMessage);\n \n // Call the callback AFTER successful generation\n onGenerateQuoteFromTemplate?.(template.id, template.name, result.quoteId);\n } catch (error) {\n console.error('Failed to generate quote from template:', error);\n // Show error message and keep modal open so user can try again or cancel\n const errorMessage = error instanceof Error ? error.message : dictionary.generateQuoteErrorFallback;\n setGenerateQuoteErrorMessage(errorMessage);\n } finally {\n setIsGeneratingQuote(false);\n }\n };\n\n // Handle generate quote modal cancel\n const handleGenerateQuoteModalCancel = () => {\n setShowGenerateQuoteModal(false);\n setSelectedTemplate(null);\n setGenerateQuoteSuccessMessage('');\n setGenerateQuoteErrorMessage('');\n };\n\n // Prepare transformed quote template data for table component\n const prepareRowData = (\n templates: NegotiableQuoteTemplateListEntry[],\n slots?: QuoteTemplatesListTableProps['slots'],\n onViewQuoteTemplate?: (templateId: string, templateName: string, status: string) => void\n ): QuoteTemplateRowData[] => {\n return templates\n .filter((template) => template?.uid) // Filter out null templates\n .map((template) => {\n return {\n id: template.id,\n name: (\n <Slot name=\"Name\" slot={slots?.Name} context={{ template }}>\n <span>{template.name}</span>\n </Slot>\n ),\n state: (\n <Slot name=\"State\" slot={slots?.State} context={{ template }}>\n <span style={{ textTransform: 'capitalize' }}>\n {template.state?.replace(/_/g, ' ') || '-'}\n </span>\n </Slot>\n ),\n status: (\n <Slot name=\"Status\" slot={slots?.Status} context={{ template }}>\n <span>{template.status}</span>\n </Slot>\n ),\n validUntil: (\n <Slot\n name=\"ValidUntil\"\n slot={slots?.ValidUntil}\n context={{ template }}\n >\n <span>{formattedDate(template.expirationDate, 'short')}</span>\n </Slot>\n ),\n minQuoteTotal: (\n <Slot\n name=\"MinQuoteTotal\"\n slot={slots?.MinQuoteTotal}\n context={{ template }}\n >\n <Price\n amount={template.prices.minNegotiatedGrandTotal.value}\n currency={template.prices.minNegotiatedGrandTotal.currency}\n />\n </Slot>\n ),\n ordersPlaced: (\n <Slot\n name=\"OrdersPlaced\"\n slot={slots?.OrdersPlaced}\n context={{ template }}\n >\n <span>{template.ordersPlaced}</span>\n </Slot>\n ),\n lastOrdered: (\n <Slot\n name=\"LastOrdered\"\n slot={slots?.LastOrdered}\n context={{ template }}\n >\n <span>{formattedDate(template.lastOrderedAt, 'short')}</span>\n </Slot>\n ),\n actions: (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{ template, onViewQuoteTemplate }}\n className=\"quote-management-quote-templates-list-table__actions-cell\"\n >\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n onClick={() => onViewQuoteTemplate?.(template.id, template.name, template.status)}\n >\n {dictionary.view}\n </Button>\n {template.canGenerateQuoteFromTemplate && (\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={() => handleGenerateQuoteClick(template.id, template.name)}\n data-testid={`generate-quote-button-${template.id}`}\n >\n {dictionary.generateQuote}\n </Button>\n )}\n </Slot>\n ),\n };\n });\n };\n\n // Prepare data for rendering\n const rowData = templatesData?.items\n ? prepareRowData(templatesData.items, slots, onViewQuoteTemplate)\n : [];\n\n // Use pagination info directly from API response, merging in pageSizeOptions if needed\n const paginationInfo = templatesData?.paginationInfo\n ? {\n ...templatesData.paginationInfo,\n pageSizeOptions: getDefaultPageSizeOptions(),\n }\n : undefined;\n\n const shouldShowPagination = !!paginationInfo;\n\n // Empty state message\n const emptyStateMessage = (\n <Slot\n name=\"EmptyTemplates\"\n slot={slots?.EmptyTemplates}\n context={{ templatesData }}\n >\n <IllustratedMessage heading=\"No Quote Templates Found\" />\n </Slot>\n );\n\n // Item range message\n const itemRangeMessage = paginationInfo ? (\n <Slot name=\"ItemRange\" slot={slots?.ItemRange} context={paginationInfo}>\n <span>\n Items {paginationInfo.startItem} to {paginationInfo.endItem} of{' '}\n {paginationInfo.totalCount} total\n </span>\n </Slot>\n ) : undefined;\n\n // Prepare page size picker message for component\n const pageSizePickerMessage =\n paginationInfo && paginationInfo.pageSizeOptions ? (\n <Slot\n name=\"PageSizePicker\"\n slot={slots?.PageSizePicker}\n context={{\n pageSize: paginationInfo.pageSize,\n pageSizeOptions: paginationInfo.pageSizeOptions,\n onPageSizeChange: handlePageSizeChange,\n }}\n >\n <span>Show </span>\n <Picker\n variant=\"primary\"\n size=\"medium\"\n value={String(paginationInfo.pageSize)}\n options={paginationInfo.pageSizeOptions.map(\n (size): PickerOption => ({\n value: String(size),\n text: String(size),\n })\n )}\n handleSelect={handlePageSizeSelect}\n />\n <span> per page</span>\n </Slot>\n ) : undefined;\n\n // Prepare pagination message for component\n const paginationMessage = paginationInfo ? (\n <Slot\n name=\"Pagination\"\n slot={slots?.Pagination}\n context={{\n currentPage: paginationInfo.currentPage,\n totalPages: paginationInfo.totalPages,\n onChange: handlePageChange,\n }}\n >\n <Pagination\n currentPage={paginationInfo.currentPage}\n totalPages={paginationInfo.totalPages}\n onChange={handlePageChange}\n />\n </Slot>\n ) : undefined;\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 return (\n <>\n <QuoteTemplatesListTableComponent\n rowData={rowData}\n loading={loading}\n className={props.className as string}\n emptyStateMessage={emptyStateMessage}\n showItemRange={showItemRange && shouldShowPagination}\n itemRangeMessage={itemRangeMessage}\n showPageSizePicker={showPageSizePicker && shouldShowPagination}\n pageSizePickerMessage={pageSizePickerMessage}\n showPagination={showPagination && shouldShowPagination}\n paginationMessage={paginationMessage}\n />\n {showGenerateQuoteModal &&\n createPortal(\n <ConfirmationModal\n open={showGenerateQuoteModal}\n title={dictionary.generateQuote}\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 || !selectedTemplate ? undefined : () => handleGenerateQuote(selectedTemplate)}\n showCloseButton={!generateQuoteModalBanner}\n confirmationBanner={generateQuoteModalBanner}\n data-testid=\"generate-quote-confirmation-modal\"\n />,\n document.body\n )}\n </>\n );\n};\n"],"names":["QuoteTemplatesListTable","rowData","loading","className","emptyStateMessage","showItemRange","itemRangeMessage","showPageSizePicker","pageSizePickerMessage","showPagination","paginationMessage","props","dictionary","useText","columns","shouldShowTable","shouldShowEmptyState","shouldShowItemRange","shouldShowPageSizePicker","shouldShowPagination","shouldShowFooter","jsxs","classes","jsx","Table","pageSize","onViewQuoteTemplate","onGenerateQuoteFromTemplate","onPageSizeChange","onPageChange","slots","templatesData","setTemplatesData","useState","setLoading","showGenerateQuoteModal","setShowGenerateQuoteModal","isGeneratingQuote","setIsGeneratingQuote","selectedTemplate","setSelectedTemplate","generateQuoteSuccessMessage","setGenerateQuoteSuccessMessage","generateQuoteErrorMessage","setGenerateQuoteErrorMessage","defaultPageSize","getDefaultPageSizeOptions","currentPageSize","setCurrentPageSize","currentPage","setCurrentPage","useEffect","fetchTemplates","data","getQuoteTemplates","error","unsubscribe","events","isAuthenticated","handlePageSizeChange","newPageSize","handlePageChange","newPage","handlePageSizeSelect","event","target","value","handleGenerateQuoteClick","templateId","templateName","handleGenerateQuote","template","result","generateQuoteFromTemplate","errorMessage","handleGenerateQuoteModalCancel","prepareRowData","templates","Slot","_a","formattedDate","Price","Button","paginationInfo","IllustratedMessage","Picker","size","Pagination","generateQuoteModalBanner","InLineAlert","Icon","Fragment","QuoteTemplatesListTableComponent","createPortal","ConfirmationModal"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Copyright
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as N,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as P,useEffect as A}from"@dropins/tools/preact-compat.js";import{classes as J,Slot as o}from"@dropins/tools/lib.js";import{Table as K,IllustratedMessage as W,Picker as X,Pagination as Y,Button as Z,Price as q}from"@dropins/tools/components.js";import{events as U}from"@dropins/tools/event-bus.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{f as C}from"../chunks/dateUtils.js";import{useText as V}from"@dropins/tools/i18n.js";/* empty css *//* empty css */import{g as ee}from"../chunks/transform-quote.js";import"../chunks/state.js";import{n as O}from"../chunks/negotiableQuotes.js";import"@dropins/tools/fetch-graphql.js";const te=({rowData:p=[],loading:g=!1,className:v,emptyStateMessage:b,showItemRange:x=!0,itemRangeMessage:u,showPageSizePicker:h=!0,pageSizePickerMessage:i,showPagination:z=!0,paginationMessage:m,...f})=>{const l=V({quoteName:"QuoteManagement.QuotesListTable.quoteName",created:"QuoteManagement.QuotesListTable.created",createdBy:"QuoteManagement.QuotesListTable.createdBy",status:"QuoteManagement.QuotesListTable.status",lastUpdated:"QuoteManagement.QuotesListTable.lastUpdated",quoteTemplate:"QuoteManagement.QuotesListTable.quoteTemplate",quoteTotal:"QuoteManagement.QuotesListTable.quoteTotal",actions:"QuoteManagement.QuotesListTable.actions"}),y=[{key:"quoteName",label:l.quoteName},{key:"created",label:l.created},{key:"createdBy",label:l.createdBy},{key:"status",label:l.status},{key:"lastUpdated",label:l.lastUpdated},{key:"quoteTemplate",label:l.quoteTemplate},{key:"quoteTotal",label:l.quoteTotal},{key:"actions",label:l.actions}],k=g||p.length>0,s=!g&&p.length===0&&b,T=x&&u,d=h&&i,S=z&&m,Q=T||d||S;return N("div",{...f,className:J(["quote-management-quotes-list-table",v]),children:[k&&t(K,{columns:y,rowData:p,loading:g,mobileLayout:"none",className:"quote-management-quotes-list-table__table"}),s&&t("div",{className:"quotes-list-table__empty-state",children:b}),Q&&N("div",{className:"quotes-list-table__footer",children:[t("div",{className:"quotes-list-table__item-range",children:T&&u}),t("div",{className:"quotes-list-table__pagination",children:S&&m}),t("div",{className:"quotes-list-table__page-size-picker",children:d&&i})]})]})},Se=({pageSize:p,showItemRange:g=!0,showPageSizePicker:v=!0,showPagination:b=!0,onViewQuote:x,onPageSizeChange:u,onPageChange:h,slots:i,...z})=>{const[m,f]=P(null),[l,y]=P(!0),k=ee()[0],[s,T]=P(p||k),[d,S]=P(1);A(()=>{const c=async()=>{try{y(!0);const r=await O({pageSize:s,currentPage:d});f(r)}catch(r){console.error("Failed to fetch quotes:",r)}finally{y(!1)}},e=U.on("authenticated",r=>{r?c():(f(null),y(!1))},{eager:!0});return()=>{e==null||e.off()}},[s,d]),A(()=>{const c=async()=>{try{const r=await O({pageSize:s,currentPage:d});f(r)}catch(r){console.error("Failed to fetch quotes:",r)}},e=U.on("quote-management/quote-renamed",()=>{c()},{eager:!0});return()=>{e==null||e.off()}},[s,d]);const Q=c=>{T(c),S(1),u==null||u(c)},_=c=>{S(c),h==null||h(c)},R=c=>{const e=c.target,r=e==null?void 0:e.value;r&&Q(Number(r))},E=(c,e,r)=>c.filter(a=>a==null?void 0:a.uid).map(a=>{var I,B,M,w;const H=`${a.buyer.firstname} ${a.buyer.lastname}`;return{id:a.uid,quoteName:t(o,{name:"QuoteName",slot:e==null?void 0:e.QuoteName,context:{quote:a},children:t("span",{children:a.name})}),created:t(o,{name:"Created",slot:e==null?void 0:e.Created,context:{quote:a},children:t("span",{children:a.createdAt?C(a.createdAt,"short"):"N/A"})}),createdBy:t(o,{name:"CreatedBy",slot:e==null?void 0:e.CreatedBy,context:{quote:a},children:t("span",{children:H})}),status:t(o,{name:"Status",slot:e==null?void 0:e.Status,context:{quote:a},children:t("span",{children:a.status})}),lastUpdated:t(o,{name:"LastUpdated",slot:e==null?void 0:e.LastUpdated,context:{quote:a},children:t("span",{children:a.updatedAt?C(a.updatedAt,"short"):"N/A"})}),quoteTemplate:t(o,{name:"QuoteTemplate",slot:e==null?void 0:e.QuoteTemplate,context:{quote:a},children:t("span",{children:a.templateName})}),quoteTotal:t(o,{name:"QuoteTotal",slot:e==null?void 0:e.QuoteTotal,context:{quote:a},children:t(q,{amount:(B=(I=a.prices)==null?void 0:I.grandTotal)==null?void 0:B.value,currency:(w=(M=a.prices)==null?void 0:M.grandTotal)==null?void 0:w.currency})}),actions:t(o,{name:"Actions",slot:e==null?void 0:e.Actions,context:{quote:a,onViewQuote:r},children:t(Z,{variant:"tertiary",size:"medium",onClick:()=>r==null?void 0:r(a.uid,a.name,a.status),children:"View"})})}}),F=m!=null&&m.items?E(m.items,i,x):[],n=m==null?void 0:m.paginationInfo,L=!!n,$=t(o,{name:"EmptyQuotes",slot:i==null?void 0:i.EmptyQuotes,context:{quotesData:m},children:t(W,{heading:"No Quotes Found"})}),j=n?t(o,{name:"ItemRange",slot:i==null?void 0:i.ItemRange,context:n,children:N("span",{children:["Items ",n.startItem," to ",n.endItem," of"," ",n.totalCount," total"]})}):void 0,D=n&&n.pageSizeOptions?N(o,{name:"PageSizePicker",slot:i==null?void 0:i.PageSizePicker,context:{pageSize:n.pageSize,pageSizeOptions:n.pageSizeOptions,onPageSizeChange:Q},children:[t("span",{children:"Show "}),t(X,{variant:"primary",size:"medium",value:String(n.pageSize),options:n.pageSizeOptions.map(c=>({value:String(c),text:String(c)})),handleSelect:R}),t("span",{children:" per page"})]}):void 0,G=n?t(o,{name:"Pagination",slot:i==null?void 0:i.Pagination,context:{currentPage:n.currentPage,totalPages:n.totalPages,onChange:_},children:t(Y,{currentPage:n.currentPage,totalPages:n.totalPages,onChange:_})}):void 0;return t(te,{rowData:F,loading:l,className:z.className,emptyStateMessage:$,showItemRange:g&&L,itemRangeMessage:j,showPageSizePicker:v&&L,pageSizePickerMessage:D,showPagination:b&&L,paginationMessage:G})};export{Se as QuotesListTable,Se as default};
|
|
4
4
|
//# sourceMappingURL=QuotesListTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuotesListTable.js","sources":["/@dropins/storefront-quote-management/src/components/QuotesListTable/QuotesListTable.tsx","/@dropins/storefront-quote-management/src/containers/QuotesListTable/QuotesListTable.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 } from '@adobe-commerce/elsie/lib';\nimport { Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/QuotesListTable/QuotesListTable.css';\n\ntype Column = {\n key: string;\n label: string;\n};\n\nexport interface QuotesListTableProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading' | 'children'> {\n rowData: QuoteRowData[];\n loading?: boolean;\n className?: string;\n emptyStateMessage?: VNode;\n showItemRange?: boolean;\n itemRangeMessage?: VNode;\n showPageSizePicker?: boolean;\n pageSizePickerMessage?: VNode;\n showPagination?: boolean;\n paginationMessage?: VNode;\n}\n\nexport type QuoteRowData = {\n id: string;\n quoteName: VNode;\n created: VNode;\n createdBy: VNode;\n status: VNode;\n lastUpdated: VNode;\n quoteTemplate: VNode;\n quoteTotal: VNode;\n actions: VNode;\n [key: string]: VNode | string | number | undefined;\n};\n\nexport const QuotesListTable: FunctionComponent<QuotesListTableProps> = ({\n rowData = [],\n loading = false,\n className,\n emptyStateMessage,\n showItemRange = true,\n itemRangeMessage,\n showPageSizePicker = true,\n pageSizePickerMessage,\n showPagination = true,\n paginationMessage,\n ...props\n}) => {\n const dictionary = useText({\n quoteName: 'QuoteManagement.QuotesListTable.quoteName',\n created: 'QuoteManagement.QuotesListTable.created',\n createdBy: 'QuoteManagement.QuotesListTable.createdBy',\n status: 'QuoteManagement.QuotesListTable.status',\n lastUpdated: 'QuoteManagement.QuotesListTable.lastUpdated',\n quoteTemplate: 'QuoteManagement.QuotesListTable.quoteTemplate',\n quoteTotal: 'QuoteManagement.QuotesListTable.quoteTotal',\n actions: 'QuoteManagement.QuotesListTable.actions',\n });\n\n const columns: Column[] = [\n { key: 'quoteName', label: dictionary.quoteName },\n { key: 'created', label: dictionary.created },\n { key: 'createdBy', label: dictionary.createdBy },\n { key: 'status', label: dictionary.status },\n { key: 'lastUpdated', label: dictionary.lastUpdated },\n { key: 'quoteTemplate', label: dictionary.quoteTemplate },\n { key: 'quoteTotal', label: dictionary.quoteTotal },\n { key: 'actions', label: dictionary.actions },\n ];\n\n // Check if we should show empty state\n const shouldShowEmptyState =\n !loading && rowData.length === 0 && emptyStateMessage;\n\n // Show item range if requested and message is provided\n const shouldShowItemRange = showItemRange && itemRangeMessage;\n\n // Show page size picker if requested and message is provided\n const shouldShowPageSizePicker = showPageSizePicker && pageSizePickerMessage;\n\n // Show pagination if requested and message is provided\n const shouldShowPagination = showPagination && paginationMessage;\n\n // Show footer if any pagination element should be shown\n const shouldShowFooter =\n shouldShowItemRange || shouldShowPageSizePicker || shouldShowPagination;\n\n return (\n <div\n {...props}\n className={classes(['quote-management-quotes-list-table', className])}\n >\n <Table\n columns={columns}\n rowData={rowData}\n loading={loading}\n mobileLayout=\"none\"\n className=\"quote-management-quotes-list-table__table\"\n />\n {shouldShowEmptyState && (\n <div className=\"quotes-list-table__empty-state\">\n {emptyStateMessage}\n </div>\n )}\n {shouldShowFooter && (\n <div className=\"quotes-list-table__footer\">\n <div className=\"quotes-list-table__item-range\">\n {shouldShowItemRange && itemRangeMessage}\n </div>\n <div className=\"quotes-list-table__pagination\">\n {shouldShowPagination && paginationMessage}\n </div>\n <div className=\"quotes-list-table__page-size-picker\">\n {shouldShowPageSizePicker && pageSizePickerMessage}\n </div>\n </div>\n )}\n </div>\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, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n Price,\n Button,\n IllustratedMessage,\n Picker,\n Pagination,\n type PickerOption,\n} from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n QuotesListTable as QuotesListTableComponent,\n QuoteRowData,\n} from '@/quote-management/components';\nimport { negotiableQuotes } from '@/quote-management/api';\nimport { getDefaultPageSizeOptions } from '@/quote-management/data/transforms';\nimport {\n NegotiableQuotesListModel,\n NegotiableQuoteListEntry,\n} from '@/quote-management/data/models';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\n\nexport interface QuotesListTableProps extends HTMLAttributes<HTMLDivElement> {\n pageSize?: number;\n showItemRange?: boolean;\n showPageSizePicker?: boolean;\n showPagination?: boolean;\n onViewQuote?: (quoteId: string, quoteName: string, status: string) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n slots?: {\n /** Slot for customizing the quote name cell content */\n QuoteName?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the created date cell content */\n Created?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the created by cell content */\n CreatedBy?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the status cell content */\n Status?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the last updated cell content */\n LastUpdated?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the quote template cell content */\n QuoteTemplate?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the quote total cell content */\n QuoteTotal?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the actions cell content */\n Actions?: SlotProps<{\n quote: NegotiableQuoteListEntry;\n onViewQuote?: (id: string, name: string, status: string) => void;\n }>;\n /** Slot for customizing the empty quotes message */\n EmptyQuotes?: SlotProps;\n /** Slot for customizing the item range display */\n ItemRange?: SlotProps<{\n startItem: number;\n endItem: number;\n totalCount: number;\n currentPage: number;\n pageSize: number;\n }>;\n /** Slot for customizing the page size picker */\n PageSizePicker?: SlotProps<{\n pageSize: number;\n pageSizeOptions: number[];\n onPageSizeChange?: (pageSize: number) => void;\n }>;\n /** Slot for customizing the pagination */\n Pagination?: SlotProps<{\n currentPage: number;\n totalPages: number;\n onChange?: (page: number) => void;\n }>;\n };\n}\n\nexport const QuotesListTable: Container<QuotesListTableProps> = ({\n pageSize,\n showItemRange = true,\n showPageSizePicker = true,\n showPagination = true,\n onViewQuote,\n onPageSizeChange,\n onPageChange,\n slots,\n ...props\n}) => {\n const [quotesData, setQuotesData] =\n useState<NegotiableQuotesListModel | null>(null);\n const [loading, setLoading] = useState(true);\n\n // Default to first page size option if no pageSize prop provided\n const defaultPageSize = getDefaultPageSizeOptions()[0];\n const [currentPageSize, setCurrentPageSize] = useState(\n pageSize || defaultPageSize\n );\n const [currentPage, setCurrentPage] = useState(1);\n\n // Fetch quotes data when authenticated\n useEffect(() => {\n const fetchQuotes = async () => {\n try {\n setLoading(true);\n const data = await negotiableQuotes({\n pageSize: currentPageSize,\n currentPage,\n });\n setQuotesData(data);\n } catch (error) {\n console.error('Failed to fetch quotes:', error);\n } finally {\n setLoading(false);\n }\n };\n\n // Listen for authentication events\n const unsubscribe = events.on(\n 'authenticated',\n (isAuthenticated) => {\n if (isAuthenticated) {\n fetchQuotes();\n } else {\n setQuotesData(null);\n setLoading(false);\n }\n },\n { eager: true }\n ); // eager: true means it fires immediately with current state\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Listen for quote renamed event to refresh the list\n useEffect(() => {\n const fetchQuotes = async () => {\n try {\n const data = await negotiableQuotes({\n pageSize: currentPageSize,\n currentPage,\n });\n setQuotesData(data);\n } catch (error) {\n console.error('Failed to fetch quotes:', error);\n }\n };\n\n const unsubscribe = events.on(\n 'quote-management/quote-renamed',\n () => {\n // Refetch quotes list to show the updated name\n fetchQuotes();\n },\n { eager: true }\n );\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Handle page size change\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1); // Reset to page 1 when page size changes\n onPageSizeChange?.(newPageSize); // Also call parent callback\n };\n\n // Handle page change\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n onPageChange?.(newPage); // Also call parent callback\n };\n\n // Handle page size picker selection\n const handlePageSizeSelect = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target?.value;\n if (value) {\n handlePageSizeChange(Number(value));\n }\n };\n\n // Prepare transformed quote data for table component\n const prepareRowData = (\n quotes: NegotiableQuoteListEntry[],\n slots?: QuotesListTableProps['slots'],\n onViewQuote?: (quoteId: string, quoteName: string, status: string) => void\n ): QuoteRowData[] => {\n return quotes\n .filter((quote) => quote?.uid) // Filter out null quotes\n .map((quote) => {\n const createdByName = `${quote.buyer.firstname} ${quote.buyer.lastname}`;\n\n return {\n id: quote.uid,\n quoteName: (\n <Slot name=\"QuoteName\" slot={slots?.QuoteName} context={{ quote }}>\n <span>{quote.name}</span>\n </Slot>\n ),\n created: (\n <Slot name=\"Created\" slot={slots?.Created} context={{ quote }}>\n <span>\n {quote.createdAt\n ? formattedDate(quote.createdAt, 'short')\n : 'N/A'}\n </span>\n </Slot>\n ),\n createdBy: (\n <Slot name=\"CreatedBy\" slot={slots?.CreatedBy} context={{ quote }}>\n <span>{createdByName}</span>\n </Slot>\n ),\n status: (\n <Slot name=\"Status\" slot={slots?.Status} context={{ quote }}>\n <span>{quote.status}</span>\n </Slot>\n ),\n lastUpdated: (\n <Slot\n name=\"LastUpdated\"\n slot={slots?.LastUpdated}\n context={{ quote }}\n >\n <span>\n {quote.updatedAt\n ? formattedDate(quote.updatedAt, 'short')\n : 'N/A'}\n </span>\n </Slot>\n ),\n quoteTemplate: (\n <Slot\n name=\"QuoteTemplate\"\n slot={slots?.QuoteTemplate}\n context={{ quote }}\n >\n <span>{quote.templateName}</span>\n </Slot>\n ),\n quoteTotal: (\n <Slot\n name=\"QuoteTotal\"\n slot={slots?.QuoteTotal}\n context={{ quote }}\n >\n <Price\n amount={quote.prices?.grandTotal?.value}\n currency={quote.prices?.grandTotal?.currency}\n />\n </Slot>\n ),\n actions: (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{ quote, onViewQuote }}\n >\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n onClick={() =>\n onViewQuote?.(quote.uid, quote.name, quote.status)\n }\n >\n View\n </Button>\n </Slot>\n ),\n };\n });\n };\n\n // Prepare data for rendering\n const rowData = quotesData?.items\n ? prepareRowData(quotesData.items, slots, onViewQuote)\n : [];\n\n const paginationInfo = quotesData?.paginationInfo;\n const shouldShowPagination = !!paginationInfo;\n\n // Empty state message\n const emptyStateMessage = (\n <Slot name=\"EmptyQuotes\" slot={slots?.EmptyQuotes} context={{ quotesData }}>\n <IllustratedMessage heading=\"No Quotes Found\" />\n </Slot>\n );\n\n // Item range message\n const itemRangeMessage = paginationInfo ? (\n <Slot name=\"ItemRange\" slot={slots?.ItemRange} context={paginationInfo}>\n <span>\n Items {paginationInfo.startItem} to {paginationInfo.endItem} of{' '}\n {paginationInfo.totalCount} total\n </span>\n </Slot>\n ) : undefined;\n\n // Prepare page size picker message for component\n const pageSizePickerMessage =\n paginationInfo && paginationInfo.pageSizeOptions ? (\n <Slot\n name=\"PageSizePicker\"\n slot={slots?.PageSizePicker}\n context={{\n pageSize: paginationInfo.pageSize,\n pageSizeOptions: paginationInfo.pageSizeOptions,\n onPageSizeChange: handlePageSizeChange,\n }}\n >\n <span>Show </span>\n <Picker\n variant=\"primary\"\n size=\"medium\"\n value={String(paginationInfo.pageSize)}\n options={paginationInfo.pageSizeOptions.map(\n (size): PickerOption => ({\n value: String(size),\n text: String(size),\n })\n )}\n handleSelect={handlePageSizeSelect}\n />\n <span> per page</span>\n </Slot>\n ) : undefined;\n\n // Prepare pagination message for component\n const paginationMessage = paginationInfo ? (\n <Slot\n name=\"Pagination\"\n slot={slots?.Pagination}\n context={{\n currentPage: paginationInfo.currentPage,\n totalPages: paginationInfo.totalPages,\n onChange: handlePageChange,\n }}\n >\n <Pagination\n currentPage={paginationInfo.currentPage}\n totalPages={paginationInfo.totalPages}\n onChange={handlePageChange}\n />\n </Slot>\n ) : undefined;\n\n return (\n <QuotesListTableComponent\n rowData={rowData}\n loading={loading}\n className={props.className as string}\n emptyStateMessage={emptyStateMessage}\n showItemRange={showItemRange && shouldShowPagination}\n itemRangeMessage={itemRangeMessage}\n showPageSizePicker={showPageSizePicker && shouldShowPagination}\n pageSizePickerMessage={pageSizePickerMessage}\n showPagination={showPagination && shouldShowPagination}\n paginationMessage={paginationMessage}\n />\n );\n};\n"],"names":["QuotesListTable","rowData","loading","className","emptyStateMessage","showItemRange","itemRangeMessage","showPageSizePicker","pageSizePickerMessage","showPagination","paginationMessage","props","dictionary","useText","columns","shouldShowEmptyState","shouldShowItemRange","shouldShowPageSizePicker","shouldShowPagination","shouldShowFooter","jsxs","classes","jsx","Table","pageSize","onViewQuote","onPageSizeChange","onPageChange","slots","quotesData","setQuotesData","useState","setLoading","defaultPageSize","getDefaultPageSizeOptions","currentPageSize","setCurrentPageSize","currentPage","setCurrentPage","useEffect","fetchQuotes","data","negotiableQuotes","error","unsubscribe","events","isAuthenticated","handlePageSizeChange","newPageSize","handlePageChange","newPage","handlePageSizeSelect","event","target","value","prepareRowData","quotes","quote","createdByName","Slot","formattedDate","Price","_b","_a","_d","_c","Button","paginationInfo","IllustratedMessage","Picker","size","Pagination","QuotesListTableComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuotesListTable.js","sources":["/@dropins/storefront-quote-management/src/components/QuotesListTable/QuotesListTable.tsx","/@dropins/storefront-quote-management/src/containers/QuotesListTable/QuotesListTable.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 } from '@adobe-commerce/elsie/lib';\nimport { Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/quote-management/components/QuotesListTable/QuotesListTable.css';\n\ntype Column = {\n key: string;\n label: string;\n};\n\nexport interface QuotesListTableProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading' | 'children'> {\n rowData: QuoteRowData[];\n loading?: boolean;\n className?: string;\n emptyStateMessage?: VNode;\n showItemRange?: boolean;\n itemRangeMessage?: VNode;\n showPageSizePicker?: boolean;\n pageSizePickerMessage?: VNode;\n showPagination?: boolean;\n paginationMessage?: VNode;\n}\n\nexport type QuoteRowData = {\n id: string;\n quoteName: VNode;\n created: VNode;\n createdBy: VNode;\n status: VNode;\n lastUpdated: VNode;\n quoteTemplate: VNode;\n quoteTotal: VNode;\n actions: VNode;\n [key: string]: VNode | string | number | undefined;\n};\n\nexport const QuotesListTable: FunctionComponent<QuotesListTableProps> = ({\n rowData = [],\n loading = false,\n className,\n emptyStateMessage,\n showItemRange = true,\n itemRangeMessage,\n showPageSizePicker = true,\n pageSizePickerMessage,\n showPagination = true,\n paginationMessage,\n ...props\n}) => {\n const dictionary = useText({\n quoteName: 'QuoteManagement.QuotesListTable.quoteName',\n created: 'QuoteManagement.QuotesListTable.created',\n createdBy: 'QuoteManagement.QuotesListTable.createdBy',\n status: 'QuoteManagement.QuotesListTable.status',\n lastUpdated: 'QuoteManagement.QuotesListTable.lastUpdated',\n quoteTemplate: 'QuoteManagement.QuotesListTable.quoteTemplate',\n quoteTotal: 'QuoteManagement.QuotesListTable.quoteTotal',\n actions: 'QuoteManagement.QuotesListTable.actions',\n });\n\n const columns: Column[] = [\n { key: 'quoteName', label: dictionary.quoteName },\n { key: 'created', label: dictionary.created },\n { key: 'createdBy', label: dictionary.createdBy },\n { key: 'status', label: dictionary.status },\n { key: 'lastUpdated', label: dictionary.lastUpdated },\n { key: 'quoteTemplate', label: dictionary.quoteTemplate },\n { key: 'quoteTotal', label: dictionary.quoteTotal },\n { key: 'actions', label: dictionary.actions },\n ];\n\n // Check if should show the table when loading or there is data\n const shouldShowTable = loading || rowData.length > 0;\n\n // Check if we should show empty state\n const shouldShowEmptyState =\n !loading && rowData.length === 0 && emptyStateMessage;\n\n // Show item range if requested and message is provided\n const shouldShowItemRange = showItemRange && itemRangeMessage;\n\n // Show page size picker if requested and message is provided\n const shouldShowPageSizePicker = showPageSizePicker && pageSizePickerMessage;\n\n // Show pagination if requested and message is provided\n const shouldShowPagination = showPagination && paginationMessage;\n\n // Show footer if any pagination element should be shown\n const shouldShowFooter =\n shouldShowItemRange || shouldShowPageSizePicker || shouldShowPagination;\n\n return (\n <div\n {...props}\n className={classes(['quote-management-quotes-list-table', className])}\n >\n {shouldShowTable && (\n <Table\n columns={columns}\n rowData={rowData}\n loading={loading}\n mobileLayout=\"none\"\n className=\"quote-management-quotes-list-table__table\"\n />\n )}\n {shouldShowEmptyState && (\n <div className=\"quotes-list-table__empty-state\">\n {emptyStateMessage}\n </div>\n )}\n {shouldShowFooter && (\n <div className=\"quotes-list-table__footer\">\n <div className=\"quotes-list-table__item-range\">\n {shouldShowItemRange && itemRangeMessage}\n </div>\n <div className=\"quotes-list-table__pagination\">\n {shouldShowPagination && paginationMessage}\n </div>\n <div className=\"quotes-list-table__page-size-picker\">\n {shouldShowPageSizePicker && pageSizePickerMessage}\n </div>\n </div>\n )}\n </div>\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, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport {\n Price,\n Button,\n IllustratedMessage,\n Picker,\n Pagination,\n type PickerOption,\n} from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n QuotesListTable as QuotesListTableComponent,\n QuoteRowData,\n} from '@/quote-management/components';\nimport { negotiableQuotes } from '@/quote-management/api';\nimport { getDefaultPageSizeOptions } from '@/quote-management/data/transforms';\nimport {\n NegotiableQuotesListModel,\n NegotiableQuoteListEntry,\n} from '@/quote-management/data/models';\nimport { formattedDate } from '@/quote-management/utils/dateUtils';\n\nexport interface QuotesListTableProps extends HTMLAttributes<HTMLDivElement> {\n pageSize?: number;\n showItemRange?: boolean;\n showPageSizePicker?: boolean;\n showPagination?: boolean;\n onViewQuote?: (quoteId: string, quoteName: string, status: string) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n slots?: {\n /** Slot for customizing the quote name cell content */\n QuoteName?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the created date cell content */\n Created?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the created by cell content */\n CreatedBy?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the status cell content */\n Status?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the last updated cell content */\n LastUpdated?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the quote template cell content */\n QuoteTemplate?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the quote total cell content */\n QuoteTotal?: SlotProps<{ quote: NegotiableQuoteListEntry }>;\n /** Slot for customizing the actions cell content */\n Actions?: SlotProps<{\n quote: NegotiableQuoteListEntry;\n onViewQuote?: (id: string, name: string, status: string) => void;\n }>;\n /** Slot for customizing the empty quotes message */\n EmptyQuotes?: SlotProps;\n /** Slot for customizing the item range display */\n ItemRange?: SlotProps<{\n startItem: number;\n endItem: number;\n totalCount: number;\n currentPage: number;\n pageSize: number;\n }>;\n /** Slot for customizing the page size picker */\n PageSizePicker?: SlotProps<{\n pageSize: number;\n pageSizeOptions: number[];\n onPageSizeChange?: (pageSize: number) => void;\n }>;\n /** Slot for customizing the pagination */\n Pagination?: SlotProps<{\n currentPage: number;\n totalPages: number;\n onChange?: (page: number) => void;\n }>;\n };\n}\n\nexport const QuotesListTable: Container<QuotesListTableProps> = ({\n pageSize,\n showItemRange = true,\n showPageSizePicker = true,\n showPagination = true,\n onViewQuote,\n onPageSizeChange,\n onPageChange,\n slots,\n ...props\n}) => {\n const [quotesData, setQuotesData] =\n useState<NegotiableQuotesListModel | null>(null);\n const [loading, setLoading] = useState(true);\n\n // Default to first page size option if no pageSize prop provided\n const defaultPageSize = getDefaultPageSizeOptions()[0];\n const [currentPageSize, setCurrentPageSize] = useState(\n pageSize || defaultPageSize\n );\n const [currentPage, setCurrentPage] = useState(1);\n\n // Fetch quotes data when authenticated\n useEffect(() => {\n const fetchQuotes = async () => {\n try {\n setLoading(true);\n const data = await negotiableQuotes({\n pageSize: currentPageSize,\n currentPage,\n });\n setQuotesData(data);\n } catch (error) {\n console.error('Failed to fetch quotes:', error);\n } finally {\n setLoading(false);\n }\n };\n\n // Listen for authentication events\n const unsubscribe = events.on(\n 'authenticated',\n (isAuthenticated) => {\n if (isAuthenticated) {\n fetchQuotes();\n } else {\n setQuotesData(null);\n setLoading(false);\n }\n },\n { eager: true }\n ); // eager: true means it fires immediately with current state\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Listen for quote renamed event to refresh the list\n useEffect(() => {\n const fetchQuotes = async () => {\n try {\n const data = await negotiableQuotes({\n pageSize: currentPageSize,\n currentPage,\n });\n setQuotesData(data);\n } catch (error) {\n console.error('Failed to fetch quotes:', error);\n }\n };\n\n const unsubscribe = events.on(\n 'quote-management/quote-renamed',\n () => {\n // Refetch quotes list to show the updated name\n fetchQuotes();\n },\n { eager: true }\n );\n\n return () => {\n unsubscribe?.off();\n };\n }, [currentPageSize, currentPage]);\n\n // Handle page size change\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1); // Reset to page 1 when page size changes\n onPageSizeChange?.(newPageSize); // Also call parent callback\n };\n\n // Handle page change\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n onPageChange?.(newPage); // Also call parent callback\n };\n\n // Handle page size picker selection\n const handlePageSizeSelect = (event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target?.value;\n if (value) {\n handlePageSizeChange(Number(value));\n }\n };\n\n // Prepare transformed quote data for table component\n const prepareRowData = (\n quotes: NegotiableQuoteListEntry[],\n slots?: QuotesListTableProps['slots'],\n onViewQuote?: (quoteId: string, quoteName: string, status: string) => void\n ): QuoteRowData[] => {\n return quotes\n .filter((quote) => quote?.uid) // Filter out null quotes\n .map((quote) => {\n const createdByName = `${quote.buyer.firstname} ${quote.buyer.lastname}`;\n\n return {\n id: quote.uid,\n quoteName: (\n <Slot name=\"QuoteName\" slot={slots?.QuoteName} context={{ quote }}>\n <span>{quote.name}</span>\n </Slot>\n ),\n created: (\n <Slot name=\"Created\" slot={slots?.Created} context={{ quote }}>\n <span>\n {quote.createdAt\n ? formattedDate(quote.createdAt, 'short')\n : 'N/A'}\n </span>\n </Slot>\n ),\n createdBy: (\n <Slot name=\"CreatedBy\" slot={slots?.CreatedBy} context={{ quote }}>\n <span>{createdByName}</span>\n </Slot>\n ),\n status: (\n <Slot name=\"Status\" slot={slots?.Status} context={{ quote }}>\n <span>{quote.status}</span>\n </Slot>\n ),\n lastUpdated: (\n <Slot\n name=\"LastUpdated\"\n slot={slots?.LastUpdated}\n context={{ quote }}\n >\n <span>\n {quote.updatedAt\n ? formattedDate(quote.updatedAt, 'short')\n : 'N/A'}\n </span>\n </Slot>\n ),\n quoteTemplate: (\n <Slot\n name=\"QuoteTemplate\"\n slot={slots?.QuoteTemplate}\n context={{ quote }}\n >\n <span>{quote.templateName}</span>\n </Slot>\n ),\n quoteTotal: (\n <Slot\n name=\"QuoteTotal\"\n slot={slots?.QuoteTotal}\n context={{ quote }}\n >\n <Price\n amount={quote.prices?.grandTotal?.value}\n currency={quote.prices?.grandTotal?.currency}\n />\n </Slot>\n ),\n actions: (\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{ quote, onViewQuote }}\n >\n <Button\n variant=\"tertiary\"\n size=\"medium\"\n onClick={() =>\n onViewQuote?.(quote.uid, quote.name, quote.status)\n }\n >\n View\n </Button>\n </Slot>\n ),\n };\n });\n };\n\n // Prepare data for rendering\n const rowData = quotesData?.items\n ? prepareRowData(quotesData.items, slots, onViewQuote)\n : [];\n\n const paginationInfo = quotesData?.paginationInfo;\n const shouldShowPagination = !!paginationInfo;\n\n // Empty state message\n const emptyStateMessage = (\n <Slot name=\"EmptyQuotes\" slot={slots?.EmptyQuotes} context={{ quotesData }}>\n <IllustratedMessage heading=\"No Quotes Found\" />\n </Slot>\n );\n\n // Item range message\n const itemRangeMessage = paginationInfo ? (\n <Slot name=\"ItemRange\" slot={slots?.ItemRange} context={paginationInfo}>\n <span>\n Items {paginationInfo.startItem} to {paginationInfo.endItem} of{' '}\n {paginationInfo.totalCount} total\n </span>\n </Slot>\n ) : undefined;\n\n // Prepare page size picker message for component\n const pageSizePickerMessage =\n paginationInfo && paginationInfo.pageSizeOptions ? (\n <Slot\n name=\"PageSizePicker\"\n slot={slots?.PageSizePicker}\n context={{\n pageSize: paginationInfo.pageSize,\n pageSizeOptions: paginationInfo.pageSizeOptions,\n onPageSizeChange: handlePageSizeChange,\n }}\n >\n <span>Show </span>\n <Picker\n variant=\"primary\"\n size=\"medium\"\n value={String(paginationInfo.pageSize)}\n options={paginationInfo.pageSizeOptions.map(\n (size): PickerOption => ({\n value: String(size),\n text: String(size),\n })\n )}\n handleSelect={handlePageSizeSelect}\n />\n <span> per page</span>\n </Slot>\n ) : undefined;\n\n // Prepare pagination message for component\n const paginationMessage = paginationInfo ? (\n <Slot\n name=\"Pagination\"\n slot={slots?.Pagination}\n context={{\n currentPage: paginationInfo.currentPage,\n totalPages: paginationInfo.totalPages,\n onChange: handlePageChange,\n }}\n >\n <Pagination\n currentPage={paginationInfo.currentPage}\n totalPages={paginationInfo.totalPages}\n onChange={handlePageChange}\n />\n </Slot>\n ) : undefined;\n\n return (\n <QuotesListTableComponent\n rowData={rowData}\n loading={loading}\n className={props.className as string}\n emptyStateMessage={emptyStateMessage}\n showItemRange={showItemRange && shouldShowPagination}\n itemRangeMessage={itemRangeMessage}\n showPageSizePicker={showPageSizePicker && shouldShowPagination}\n pageSizePickerMessage={pageSizePickerMessage}\n showPagination={showPagination && shouldShowPagination}\n paginationMessage={paginationMessage}\n />\n );\n};\n"],"names":["QuotesListTable","rowData","loading","className","emptyStateMessage","showItemRange","itemRangeMessage","showPageSizePicker","pageSizePickerMessage","showPagination","paginationMessage","props","dictionary","useText","columns","shouldShowTable","shouldShowEmptyState","shouldShowItemRange","shouldShowPageSizePicker","shouldShowPagination","shouldShowFooter","jsxs","classes","jsx","Table","pageSize","onViewQuote","onPageSizeChange","onPageChange","slots","quotesData","setQuotesData","useState","setLoading","defaultPageSize","getDefaultPageSizeOptions","currentPageSize","setCurrentPageSize","currentPage","setCurrentPage","useEffect","fetchQuotes","data","negotiableQuotes","error","unsubscribe","events","isAuthenticated","handlePageSizeChange","newPageSize","handlePageChange","newPage","handlePageSizeSelect","event","target","value","prepareRowData","quotes","quote","createdByName","Slot","formattedDate","Price","_b","_a","_d","_c","Button","paginationInfo","IllustratedMessage","Picker","size","Pagination","QuotesListTableComponent"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Copyright
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as K,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as x,useEffect as L,useCallback as G}from"@dropins/tools/preact-compat.js";import{classes as c,VComponent as N,Slot as b,getFormErrors as J,getFormValues as me}from"@dropins/tools/lib.js";import{TextArea as ce,Field as de,Input as le,InputFile as fe,Button as T,InLineAlert as qe}from"@dropins/tools/components.js";/* empty css
|
|
3
|
+
import{jsxs as K,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as x,useEffect as L,useCallback as G}from"@dropins/tools/preact-compat.js";import{classes as c,VComponent as N,Slot as b,getFormErrors as J,getFormValues as me}from"@dropins/tools/lib.js";import{TextArea as ce,Field as de,Input as le,InputFile as fe,Button as T,InLineAlert as qe}from"@dropins/tools/components.js";/* empty css */import{events as U}from"@dropins/tools/event-bus.js";import{r as H}from"../chunks/requestNegotiableQuote.js";import"../chunks/state.js";import{u as ge}from"../chunks/uploadFile.js";import{v as he,f as Ne,a as be,S as pe,A as ve}from"../chunks/AttachedFilesList.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{S as Fe}from"../chunks/CheckWithCircle.js";import{S as Qe}from"../chunks/WarningFilled.js";import{useText as Re}from"@dropins/tools/i18n.js";import"../chunks/NegotiableQuoteFragment.js";import"../chunks/transform-quote.js";import"@dropins/tools/fetch-graphql.js";const xe=({className:S,title:t,banner:B,commentField:D,quoteNameField:C,attachFile:d,attachedFilesList:p,requestButton:z,saveButton:v,onSubmit:_,...g})=>K("form",{...g,className:c(["request-negotiable-quote-form",S]),onSubmit:_,children:[B&&a(N,{node:B,className:c(["request-negotiable-quote-form__banner"])}),t&&a(N,{node:t,className:c(["request-negotiable-quote-form__title"])}),D&&a(N,{node:D,className:c(["request-negotiable-quote-form__comment-field"])}),C&&a(N,{node:C,className:c(["request-negotiable-quote-form__quote-name-field"])}),d&&a(N,{node:d,className:c(["request-negotiable-quote-form__attach-file-field"])}),p&&a(N,{node:p,className:c(["request-negotiable-quote-form__attached-files-list"])}),K("div",{className:c(["request-negotiable-quote-form__actions"]),children:[z&&a(N,{node:z,className:c(["request-negotiable-quote-form__request-button"])}),v&&a(N,{node:v,className:c(["request-negotiable-quote-form__save-button"])})]})]}),We=({cartId:S,slots:t,onRequestNegotiableQuote:B,onSaveNegotiableQuote:D,onAttachFiles:C,onSubmitErrors:d,onError:p,className:z,maxFiles:v,maxFileSize:_,acceptedFileTypes:g})=>{const[w,X]=x(void 0),[P,Y]=x(void 0),[F,E]=x([]),[y,k]=x(void 0),[h,u]=x({}),[j,Z]=x(void 0),[i,l]=x(!1),n=Re({title:"NegotiableQuote.Request.title",comment:"NegotiableQuote.Request.comment",commentError:"NegotiableQuote.Request.commentError",quoteName:"NegotiableQuote.Request.quoteName",quoteNameError:"NegotiableQuote.Request.quoteNameError",attachmentsError:"NegotiableQuote.Request.attachmentsError",maxFilesExceeded:"NegotiableQuote.Request.maxFilesExceeded",maxFileSizeExceeded:"NegotiableQuote.Request.maxFileSizeExceeded",invalidFileType:"NegotiableQuote.Request.invalidFileType",requestCta:"NegotiableQuote.Request.requestCta",saveDraftCta:"NegotiableQuote.Request.saveDraftCta",errorHeader:"NegotiableQuote.Request.error.header",unauthenticated:"NegotiableQuote.Request.error.unauthenticated",unauthorized:"NegotiableQuote.Request.error.unauthorized",missingCart:"NegotiableQuote.Request.error.missingCart",successHeader:"NegotiableQuote.Request.success.header",submitSuccess:"NegotiableQuote.Request.success.submitted",draftSuccess:"NegotiableQuote.Request.success.draftSaved"});L(()=>{const e=U.on("quote-management/permissions",o=>{k(void 0),o.requestQuote?l(!1):(k(n.unauthorized),l(!0))},{eager:!0});return()=>e==null?void 0:e.off()},[n.unauthorized]),L(()=>{const e=U.on("authenticated",o=>{k(void 0),o?l(!1):(k(n.unauthenticated),l(!0))},{eager:!0});return()=>e==null?void 0:e.off()},[n.unauthenticated]),L(()=>{S||(k(n.missingCart),l(!0))},[S,n.missingCart]),L(()=>{y&&(p==null||p({error:y,isFormDisabled:i,setIsFormDisabled:l}))},[y,p,i]);const V=G(async e=>{var s;if(!(e!=null&&e.length))return;if(v&&F.length+e.length>v){u(r=>({...r,attachments:n.maxFilesExceeded.replace("{maxFiles}",String(v))}));return}for(const r of e){if(_&&!he(r.size,_)){u(m=>({...m,attachments:n.maxFileSizeExceeded.replace("{maxSize}",Ne(_))}));return}if(g&&!be(r.type,g)){u(m=>({...m,attachments:n.invalidFileType}));return}}if(u(r=>{const{attachments:m,...f}=r;return f}),C){(s=C(e))==null||s.catch(()=>{u(r=>({...r,attachments:n.attachmentsError}))});return}const o=e.map(r=>({key:`temp-${Date.now()}-${Math.random()}-${r.name}`,name:r.name,size:r.size,status:"uploading"}));E(r=>[...r,...o]);for(let r=0;r<e.length;r++){const m=e[r],f=o[r].key;try{const Q=await ge(m);E(R=>R.map(q=>q.key===f?{...q,key:Q.key,status:"success"}:q))}catch(Q){u(R=>({...R,attachments:Q.message})),E(R=>R.map(q=>q.key===f?{...q,status:"error",error:Q.message}:q))}}},[C,n,v,_,g,F]),I=G(e=>{E(o=>o.filter(s=>s.key!==e))},[]),ee=()=>{let e,o;if(j?(o={name:"SuccessBanner",slot:t==null?void 0:t.SuccessBanner,context:{message:j},"data-testid":"form-success-banner"},e={type:"success",variant:"primary",icon:a(Fe,{}),heading:n.successHeader,description:j,className:"request-negotiable-quote-form__success-banner"}):y&&(o={name:"ErrorBanner",slot:t==null?void 0:t.ErrorBanner,context:{message:y},"data-testid":"form-error-banner"},e={type:"error",variant:"primary",icon:a(Qe,{}),heading:n.errorHeader,description:y,className:"request-negotiable-quote-form__error-banner"}),o&&e)return a(b,{...o,children:a(qe,{...e})})},O=e=>{u({});const o=e.target.closest("form"),s=J(o);Object.keys(s).length>0&&(u(s),d==null||d(s))},te=e=>{var W;e.preventDefault(),l(!0);const o=e.target,r={...J(o),...h};if(Object.keys(r).length>0){d==null||d(r);return}const m=e.submitter,f=me(o);X(f.comment),Y(f.quoteName);const Q=((W=m==null?void 0:m.dataset)==null?void 0:W.draft)==="true"||!1,R=F.filter(A=>A.status==="success").map(A=>({key:A.key})),q={cartId:S,quoteName:f.quoteName,comment:f.comment,attachments:R,isDraft:Q};let M,$;Q?(M=D??H,$=n.draftSuccess):(M=B??H,$=n.submitSuccess),M(q).then(()=>{Z($)}).catch(A=>{k(A.message)})},ae=a(b,{name:"Title",slot:t==null?void 0:t.Title,context:{text:n.title},children:a("span",{"data-testid":"form-title",children:n.title})}),re=a(b,{name:"CommentField",slot:t==null?void 0:t.CommentField,context:{value:w,required:!0,errorMessage:h.comment,setFormErrors:u,isFormDisabled:i},children:a(ce,{name:"comment",value:w,label:n.comment,required:!0,autoComplete:"off","data-testid":"form-comment-field",errorMessage:h.comment,disabled:i})}),oe=a(b,{name:"QuoteNameField",slot:t==null?void 0:t.QuoteNameField,context:{value:P,required:!0,errorMessage:h.quoteName,setFormErrors:u,isFormDisabled:i},children:a(de,{error:h.quoteName,disabled:i,children:a(le,{value:P,name:"quoteName",floatingLabel:n.quoteName,required:!0,autoComplete:"off","data-testid":"form-quote-name-field"})})}),ne=a(b,{name:"AttachFileField",slot:t==null?void 0:t.AttachFileField,context:{onChange:V,formErrors:h,isFormDisabled:i,attachedFiles:F},children:a(fe,{multiple:!0,onChange:e=>{const o=e.target,s=o==null?void 0:o.files,r=s?Array.from(s):[];r.length>0&&V(r)},icon:a(pe,{}),disabled:i,"data-testid":"form-attach-file-field",accept:g==null?void 0:g.join(",")})}),ie=F.length>0?a(b,{name:"AttachedFilesList",slot:t==null?void 0:t.AttachedFilesList,context:{files:F,onRemove:I,disabled:i},children:a(ve,{files:F,onRemove:I,disabled:i})}):void 0,se=a(b,{name:"RequestButton",slot:t==null?void 0:t.RequestButton,context:{requestNegotiableQuote:H,formErrors:h,isFormDisabled:i,setIsFormDisabled:l},children:a(T,{type:"submit","data-testid":"form-request-button",onClick:O,disabled:i,children:n.requestCta})}),ue=a(b,{name:"SaveDraftButton",slot:t==null?void 0:t.SaveDraftButton,context:{requestNegotiableQuote:H,formErrors:h,isFormDisabled:i,setIsFormDisabled:l},children:a(T,{type:"submit","data-draft":"true",variant:"secondary","data-testid":"form-save-draft-button",onClick:O,disabled:i,children:n.saveDraftCta})});return a(xe,{title:ae,banner:ee(),commentField:re,quoteNameField:oe,attachFile:ne,attachedFilesList:ie,requestButton:se,saveButton:ue,onSubmit:te,className:z,disabled:i,"data-testid":"form-container"})};export{We as RequestNegotiableQuoteForm,We as default};
|
|
4
4
|
//# sourceMappingURL=RequestNegotiableQuoteForm.js.map
|