@dropins/storefront-requisition-list 1.2.0-beta.1 → 1.2.0-beta.3
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/CHANGELOG.md +28 -0
- package/api.js +1 -8
- package/api.js.map +1 -1
- package/chunks/RequisitionListForm2.js +2 -2
- package/chunks/RequisitionListForm2.js.map +1 -1
- package/chunks/addRequisitionListItemsToCart.js +5 -5
- package/chunks/addRequisitionListItemsToCart.js.map +1 -1
- package/chunks/deleteRequisitionList.js +2 -2
- package/chunks/deleteRequisitionList.js.map +1 -1
- package/chunks/fetch-graphql.js +4 -0
- package/chunks/fetch-graphql.js.map +1 -0
- package/chunks/getRequisitionLists.js +3 -3
- package/chunks/getRequisitionLists.js.map +1 -1
- package/chunks/initialize.js +11 -0
- package/chunks/initialize.js.map +1 -0
- package/chunks/updateRequisitionList.js +5 -5
- package/chunks/updateRequisitionList.js.map +1 -1
- package/containers/RequisitionListForm.js +1 -1
- package/containers/RequisitionListGrid.js +1 -1
- package/containers/RequisitionListGrid.js.map +1 -1
- package/containers/RequisitionListHeader.js +1 -1
- package/containers/RequisitionListSelector.js +4 -4
- package/containers/RequisitionListSelector.js.map +1 -1
- package/containers/RequisitionListView.js +1 -1
- package/containers/RequisitionListView.js.map +1 -1
- package/package.json +5 -1
- package/render.js +1 -1
- package/render.js.map +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as h,jsx as t,Fragment as z}from"@dropins/tools/preact-jsx-runtime.js";import{useState as M,useCallback as q,useMemo as S,useEffect as T}from"@dropins/tools/preact-compat.js";import{Button as N,Header as G,InLineAlert as U,Table as V,Pagination as B,Card as j}from"@dropins/tools/components.js";import{Slot as J,classes as v,VComponent as Z}from"@dropins/tools/lib.js";import{D,R as $}from"../chunks/RequisitionListForm.js";import"@dropins/tools/preact-hooks.js";import{R as I}from"../chunks/RequisitionListForm2.js";import{events as y}from"@dropins/tools/event-bus.js";import"../chunks/state.js";import"@dropins/tools/preact.js";import{u as K,a as Q,E as X}from"../chunks/RequisitionListView.js";import{R as Y}from"../chunks/RequisitionListActions.js";import{R as x}from"../chunks/RequisitionListModal.js";import{N as ii,P as ei,a as ti}from"../chunks/PaginationItemsCounter.js";import{useText as E}from"@dropins/tools/i18n.js";import{g as W}from"../chunks/getRequisitionLists.js";import{d as ni}from"../chunks/deleteRequisitionList.js";import{u as si}from"../chunks/updateRequisitionList.js";import"@dropins/tools/fetch-graphql.js";function oi(u,L,d){const R=E({actionRename:"RequisitionList.RequisitionListView.actionRename",actionDeleteList:"RequisitionList.RequisitionListView.actionDeleteList"}),[i,a]=M(null),[p,f]=M(!1),[w,_]=M(!1),C=q(()=>{d&&d(),f(!0)},[d]),A=q(()=>f(!1),[]),c=S(()=>{if(u)return{handleOpenRenameModal:e=>{f(s=>s&&!1),u.handleOpenRenameModal(e)},handleOpenDeleteModal:e=>{f(s=>s&&!1),u.handleOpenDeleteModal(e)}}},[u]),l=q(async(e,s)=>{var r,n,m;_(!0);try{const o=await W(e,s),O=((r=o==null?void 0:o.page_info)==null?void 0:r.current_page)??1,F=((n=o==null?void 0:o.page_info)==null?void 0:n.total_pages)??0;if(!((((m=o==null?void 0:o.items)==null?void 0:m.length)??0)>0)&&O>1&&F>=O-1){const k=O-1,H=await W(k,s);a(H)}else a(o)}finally{_(!1)}},[]);T(()=>{const e=y.on("requisitionLists/data",s=>{s&&s.items&&a(s)},{eager:!0});return()=>{e==null||e.off()}},[]),T(()=>{i||l(1,D)},[i,l]);const g=q(e=>{var n,m;const s=e??((n=i==null?void 0:i.page_info)==null?void 0:n.current_page)??1,r=((m=i==null?void 0:i.page_info)==null?void 0:m.page_size)??D;return l(s,r)},[l,i]),b=q(async e=>{await l(1,e)},[l]);return{rows:S(()=>((i==null?void 0:i.items)??[]).map(e=>({name:h("div",{className:"requisition-list-grid-wrapper__name",children:[t("div",{className:"requisition-list-grid-wrapper__name__title",children:t("a",{href:"#",onClick:s=>{if(s.preventDefault(),L){const r=L(e.uid);typeof r=="string"&&(window.location.href=r)}},children:e.name})}),e.description&&t("div",{className:"requisition-list-grid-wrapper__name__description",children:e.description})]}),items_count:e.items_count,last_updated:new Date(e.updated_at).toLocaleString(),actions:h("div",{className:"requisition-list-grid-wrapper__actions",children:[t(N,{variant:"tertiary",type:"button","data-testid":"rename-button",onClick:()=>c==null?void 0:c.handleOpenRenameModal(e),children:R.actionRename}),t(N,{variant:"tertiary",type:"button","data-testid":"delete-button",onClick:()=>c==null?void 0:c.handleOpenDeleteModal(e),children:R.actionDeleteList})]})})),[i==null?void 0:i.items,R.actionRename,R.actionDeleteList,c,L]),isLoading:w||!i,pageInfo:i==null?void 0:i.page_info,totalCount:i==null?void 0:i.total_count,handlePageChange:g,handlePageSizeChange:b,isAdding:p,handleAddNew:C,handleCancelCreate:A}}const
|
|
3
|
+
import{jsxs as h,jsx as t,Fragment as z}from"@dropins/tools/preact-jsx-runtime.js";import{useState as M,useCallback as q,useMemo as S,useEffect as T}from"@dropins/tools/preact-compat.js";import{Button as N,Header as G,InLineAlert as U,Table as V,Pagination as B,Card as j}from"@dropins/tools/components.js";import{Slot as J,classes as v,VComponent as Z}from"@dropins/tools/lib.js";import{D,R as $}from"../chunks/RequisitionListForm.js";import"@dropins/tools/preact-hooks.js";import{R as I}from"../chunks/RequisitionListForm2.js";import{events as y}from"@dropins/tools/event-bus.js";import"../chunks/state.js";import"@dropins/tools/preact.js";import{u as K,a as Q,E as X}from"../chunks/RequisitionListView.js";import{R as Y}from"../chunks/RequisitionListActions.js";import{R as x}from"../chunks/RequisitionListModal.js";import{N as ii,P as ei,a as ti}from"../chunks/PaginationItemsCounter.js";import{useText as E}from"@dropins/tools/i18n.js";import{g as W}from"../chunks/getRequisitionLists.js";import{d as ni}from"../chunks/deleteRequisitionList.js";import{u as si}from"../chunks/updateRequisitionList.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";function oi(u,L,d){const R=E({actionRename:"RequisitionList.RequisitionListView.actionRename",actionDeleteList:"RequisitionList.RequisitionListView.actionDeleteList"}),[i,a]=M(null),[p,f]=M(!1),[w,_]=M(!1),C=q(()=>{d&&d(),f(!0)},[d]),A=q(()=>f(!1),[]),c=S(()=>{if(u)return{handleOpenRenameModal:e=>{f(s=>s&&!1),u.handleOpenRenameModal(e)},handleOpenDeleteModal:e=>{f(s=>s&&!1),u.handleOpenDeleteModal(e)}}},[u]),l=q(async(e,s)=>{var r,n,m;_(!0);try{const o=await W(e,s),O=((r=o==null?void 0:o.page_info)==null?void 0:r.current_page)??1,F=((n=o==null?void 0:o.page_info)==null?void 0:n.total_pages)??0;if(!((((m=o==null?void 0:o.items)==null?void 0:m.length)??0)>0)&&O>1&&F>=O-1){const k=O-1,H=await W(k,s);a(H)}else a(o)}finally{_(!1)}},[]);T(()=>{const e=y.on("requisitionLists/data",s=>{s&&s.items&&a(s)},{eager:!0});return()=>{e==null||e.off()}},[]),T(()=>{i||l(1,D)},[i,l]);const g=q(e=>{var n,m;const s=e??((n=i==null?void 0:i.page_info)==null?void 0:n.current_page)??1,r=((m=i==null?void 0:i.page_info)==null?void 0:m.page_size)??D;return l(s,r)},[l,i]),b=q(async e=>{await l(1,e)},[l]);return{rows:S(()=>((i==null?void 0:i.items)??[]).map(e=>({name:h("div",{className:"requisition-list-grid-wrapper__name",children:[t("div",{className:"requisition-list-grid-wrapper__name__title",children:t("a",{href:"#",onClick:s=>{if(s.preventDefault(),L){const r=L(e.uid);typeof r=="string"&&(window.location.href=r)}},children:e.name})}),e.description&&t("div",{className:"requisition-list-grid-wrapper__name__description",children:e.description})]}),items_count:e.items_count,last_updated:new Date(e.updated_at).toLocaleString(),actions:h("div",{className:"requisition-list-grid-wrapper__actions",children:[t(N,{variant:"tertiary",type:"button","data-testid":"rename-button",onClick:()=>c==null?void 0:c.handleOpenRenameModal(e),children:R.actionRename}),t(N,{variant:"tertiary",type:"button","data-testid":"delete-button",onClick:()=>c==null?void 0:c.handleOpenDeleteModal(e),children:R.actionDeleteList})]})})),[i==null?void 0:i.items,R.actionRename,R.actionDeleteList,c,L]),isLoading:w||!i,pageInfo:i==null?void 0:i.page_info,totalCount:i==null?void 0:i.total_count,handlePageChange:g,handlePageSizeChange:b,isAdding:p,handleAddNew:C,handleCancelCreate:A}}const vi=({routeRequisitionListDetails:u,fallbackRoute:L="/customer/account",slots:d})=>{const{isEnabled:R}=K(),[i,a]=M({type:null,isOpen:!1,isLoading:!1,requisitionList:null}),p=q(()=>{a({type:null,isOpen:!1,isLoading:!1,requisitionList:null})},[]),f=q(o=>{a({type:"rename",isOpen:!0,isLoading:!1,requisitionList:o})},[]),w=q(o=>{a({type:"delete",isOpen:!0,isLoading:!1,requisitionList:o})},[]),{rows:_,isLoading:C,pageInfo:A,totalCount:c,handlePageChange:l,handlePageSizeChange:g,isAdding:b,handleAddNew:P,handleCancelCreate:e}=oi({handleOpenRenameModal:f,handleOpenDeleteModal:w},u,p),s=q(async o=>{if(i.requisitionList)try{await si(i.requisitionList.uid,o.name,o.description),y.emit("requisitionList/alert",{action:"update",type:"success",context:"requisitionList"}),await l(),p()}catch{y.emit("requisitionList/alert",{action:"update",type:"error",context:"requisitionList"})}},[i.requisitionList,l,p]),r=async()=>{i.requisitionList&&(a({...i,isLoading:!0}),await ni(i.requisitionList.uid).then(async()=>{y.emit("requisitionList/alert",{type:"success",action:"delete",context:"requisitionList"})}).catch(()=>{y.emit("requisitionList/alert",{type:"error",action:"delete",context:"requisitionList"})}).finally(async()=>{await l(),p()}))},n=E({containerTitle:"RequisitionList.containerTitle",updateTitle:"RequisitionList.RequisitionListForm.updateTitle",deleteRequisitionListTitle:"RequisitionList.RequisitionListWrapper.deleteRequisitionListTitle",deleteRequisitionListMessage:"RequisitionList.RequisitionListWrapper.deleteRequisitionListMessage",cancelAction:"RequisitionList.RequisitionListWrapper.cancelAction",confirmAction:"RequisitionList.RequisitionListWrapper.confirmAction",notEnabledTitle:"RequisitionList.RequisitionListsNotEnabled.title",notEnabledMessage:"RequisitionList.RequisitionListsNotEnabled.message",notEnabledActionLabel:"RequisitionList.RequisitionListsNotEnabled.actionLabel"}),m=q(()=>d!=null&&d.Header?t(J,{name:"Header","aria-label":n.containerTitle,title:n.containerTitle,slot:d.Header}):t(G,{"aria-label":n.containerTitle,role:"region",title:n.containerTitle}),[d,n.containerTitle]);return R===!1?t(ii,{title:n.notEnabledTitle,message:n.notEnabledMessage,actionLabel:n.notEnabledActionLabel,onAction:()=>{window.location.href=L}}):h(z,{children:[t(ai,{header:m(),rows:_,skeletonRowCount:10,isLoading:C,pageInfo:A,totalCount:c,handlePageChange:l,handlePageSizeChange:g,defaultPageSize:10,isAdding:b,handleAddNew:P,handleCancelCreate:e}),i.type==="rename"&&i.isOpen&&i.requisitionList&&t(x,{isOpen:i.isOpen,isLoading:i.isLoading,title:n.updateTitle,modalContent:t($,{mode:"update",defaultValues:{name:i.requisitionList.name,description:i.requisitionList.description||""},onSubmit:s,onCancel:p}),handleModalOnClose:p}),i.type==="delete"&&i.isOpen&&t(x,{isOpen:i.isOpen,isLoading:i.isLoading,title:n.deleteRequisitionListTitle,modalContent:n.deleteRequisitionListMessage,confirmBtnCaption:n.confirmAction,closeBtnCaption:n.cancelAction,handleModalOnClose:p,handleModalOnConfirm:r})]})},ai=({className:u,isLoading:L=!1,header:d,rows:R=[],skeletonRowCount:i=10,pageInfo:a,totalCount:p=0,handlePageChange:f,handlePageSizeChange:w,defaultPageSize:_=10,isAdding:C,handleAddNew:A,handleCancelCreate:c,...l})=>{const g=E({name:"RequisitionList.RequisitionListWrapper.name",itemsCount:"RequisitionList.RequisitionListWrapper.itemsCount",lastUpdated:"RequisitionList.RequisitionListWrapper.lastUpdated",actions:"RequisitionList.RequisitionListWrapper.actions",emptyList:"RequisitionList.RequisitionListWrapper.emptyList",show:"RequisitionList.PageSizePicker.show"}),b=((a==null?void 0:a.total_pages)??0)>0,P=!L&&R.length===0&&!b,{alert:e,setAlert:s,handleRequisitionListAlert:r}=Q();return T(()=>{const n=y.on("requisitionList/alert",r);try{const m=localStorage.getItem("requisitionListPendingAlert");if(m){const o=JSON.parse(m);r(o),localStorage.removeItem("requisitionListPendingAlert")}}catch{}return()=>{n==null||n.off()}},[r]),h("div",{...l,className:v(["requisition-list-grid-wrapper",u]),"data-testid":"requisition-list-grid-wrapper",children:[d&&t("div",{className:v(["requisition-list-grid-wrapper__header",u]),"data-testid":"requisition-list-grid-wrapper-header",children:t(Z,{node:d})}),e&&t("div",{className:"requisition-list__alert-wrapper",children:t(U,{heading:e.description,type:e.type,variant:"primary",onDismiss:()=>s(null)})}),P?t(X,{textContent:g.emptyList}):h(z,{children:[t(V,{columns:[{key:"name",label:g.name},{key:"items_count",label:g.itemsCount},{key:"last_updated",label:g.lastUpdated},{key:"actions",label:g.actions}],rowData:R,loading:L,skeletonRowCount:i}),a&&h("div",{className:v(["requisition-list-grid-wrapper__pagination",u]),children:[t(ei,{pageInfo:a,totalCount:p}),(a.total_pages||0)>1&&t(B,{totalPages:a.total_pages,currentPage:a.current_page||1,onChange:f,disabled:L}),h("div",{className:"requisition-list-grid-wrapper__pagination-picker",children:[t("span",{children:g.show}),t(ti,{currentPageSize:a.page_size||_,onPageSizeChange:w||(()=>Promise.resolve()),disabled:L})]})]})]}),t("div",{className:v(["requisition-list-grid-wrapper__add-new",u]),children:C?t(j,{variant:"secondary",children:t(I,{mode:"create",onSuccess:async()=>{await f(),c(),r({type:"success",action:"create",context:"requisitionList"})},onError:()=>{r({type:"error",action:"create",context:"requisitionList"})},onCancel:c})}):t(Y,{onAddNew:A})})]})};export{vi as RequisitionListGrid,vi as default};
|
|
4
4
|
//# sourceMappingURL=RequisitionListGrid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequisitionListGrid.js","sources":["/@dropins/storefront-requisition-list/src/hooks/useRequisitionListGrid.tsx","/@dropins/storefront-requisition-list/src/containers/RequisitionListGrid/RequisitionListGrid.tsx","/@dropins/storefront-requisition-list/src/components/RequisitionListGridWrapper/RequisitionListGridWrapper.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useMemo, useState, useCallback, useEffect } from 'preact/compat';\nimport { VNode } from 'preact';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { RequisitionList as RequisitionListModel } from '@/requisitionList/data/models/requisitionList';\nimport { getRequisitionLists } from '@/requisitionList/api/getRequisitionLists';\nimport { RequisitionLists } from '@/requisitionList/data/models/requisitionLists';\nimport { events } from '@adobe-commerce/event-bus';\nimport { DEFAULT_PAGE_SIZE } from '@/requisitionList/lib/constants';\n\ntype Row = Record<string, VNode | string | number | undefined>;\ntype Callbacks = {\n handleOpenRenameModal: (rl: RequisitionListModel) => void;\n handleOpenDeleteModal: (rl: RequisitionListModel) => void;\n};\n\nexport function useRequisitionListGrid(\n callbacks?: Callbacks,\n routeRequisitionListDetails?: (uid: string) => string | void,\n closeModal?: () => void\n) {\n const translations = useText({\n actionRename: 'RequisitionList.RequisitionListView.actionRename',\n actionDeleteList: 'RequisitionList.RequisitionListView.actionDeleteList',\n });\n\n const [reqLists, setReqLists] = useState<RequisitionLists | null>(null);\n const [isAdding, setIsAdding] = useState(false);\n const [isFetching, setIsFetching] = useState(false);\n\n const handleAddNew = useCallback(() => {\n // Close any open modal before opening create form\n if (closeModal) {\n closeModal();\n }\n setIsAdding(true);\n }, [closeModal]);\n\n const handleCancelCreate = useCallback(() => setIsAdding(false), []);\n\n // Wrap callbacks to close create form when opening modals\n const wrappedCallbacks = useMemo(() => {\n if (!callbacks) return undefined;\n\n return {\n handleOpenRenameModal: (rl: RequisitionListModel) => {\n // Close create form if open - use functional update to avoid dependency on isAdding\n setIsAdding((current) => {\n if (current) return false;\n return current;\n });\n callbacks.handleOpenRenameModal(rl);\n },\n handleOpenDeleteModal: (rl: RequisitionListModel) => {\n // Close create form if open - use functional update to avoid dependency on isAdding\n setIsAdding((current) => {\n if (current) return false;\n return current;\n });\n callbacks.handleOpenDeleteModal(rl);\n },\n };\n }, [callbacks]);\n\n const fetchPage = useCallback(async (page: number, pageSize: number) => {\n setIsFetching(true);\n try {\n const data = await getRequisitionLists(page, pageSize);\n const currentPage = data?.page_info?.current_page ?? 1;\n const totalPages = data?.page_info?.total_pages ?? 0;\n const hasRows = (data?.items?.length ?? 0) > 0;\n\n if (!hasRows && currentPage > 1 && totalPages >= currentPage - 1) {\n const prev = currentPage - 1;\n const prevData = await getRequisitionLists(prev, pageSize);\n setReqLists(prevData);\n } else {\n setReqLists(data);\n }\n } finally {\n setIsFetching(false);\n }\n }, []);\n\n useEffect(() => {\n const requisitionListsEvent = events.on(\n 'requisitionLists/data',\n (data: RequisitionLists) => {\n if (data && data.items) {\n setReqLists(data);\n }\n },\n { eager: true }\n );\n return () => {\n requisitionListsEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n if (!reqLists) {\n void fetchPage(1, DEFAULT_PAGE_SIZE);\n }\n }, [reqLists, fetchPage]);\n\n const handlePageChange = useCallback(\n (page?: number) => {\n const currentPage = page ?? reqLists?.page_info?.current_page ?? 1;\n const currentPageSize =\n reqLists?.page_info?.page_size ?? DEFAULT_PAGE_SIZE;\n return fetchPage(currentPage, currentPageSize);\n },\n [fetchPage, reqLists]\n );\n\n const handlePageSizeChange = useCallback(\n async (pageSize: number) => {\n // Reset to page 1 when changing page size\n await fetchPage(1, pageSize);\n },\n [fetchPage]\n );\n\n const rows: Row[] = useMemo(\n () =>\n (reqLists?.items ?? []).map((rl: RequisitionListModel) => {\n return {\n name: (\n <div className=\"requisition-list-grid-wrapper__name\">\n <div className=\"requisition-list-grid-wrapper__name__title\">\n <a\n href=\"#\"\n onClick={(e: Event): void => {\n e.preventDefault();\n if (routeRequisitionListDetails) {\n const result = routeRequisitionListDetails(rl.uid);\n if (typeof result === 'string') {\n window.location.href = result;\n }\n }\n }}\n >\n {rl.name}\n </a>\n </div>\n {rl.description && (\n <div className=\"requisition-list-grid-wrapper__name__description\">\n {rl.description}\n </div>\n )}\n </div>\n ),\n items_count: rl.items_count,\n last_updated: new Date(rl.updated_at).toLocaleString(),\n actions: (\n <div className=\"requisition-list-grid-wrapper__actions\">\n <Button\n variant=\"tertiary\"\n type=\"button\"\n data-testid=\"rename-button\"\n onClick={() => wrappedCallbacks?.handleOpenRenameModal(rl)}\n >\n {translations.actionRename}\n </Button>\n <Button\n variant=\"tertiary\"\n type=\"button\"\n data-testid=\"delete-button\"\n onClick={() => wrappedCallbacks?.handleOpenDeleteModal(rl)}\n >\n {translations.actionDeleteList}\n </Button>\n </div>\n ),\n };\n }),\n [\n reqLists?.items,\n translations.actionRename,\n translations.actionDeleteList,\n wrappedCallbacks,\n routeRequisitionListDetails,\n ]\n );\n\n return {\n rows,\n isLoading: isFetching || !reqLists,\n pageInfo: reqLists?.page_info,\n totalCount: reqLists?.total_count,\n handlePageChange,\n handlePageSizeChange,\n isAdding,\n handleAddNew,\n handleCancelCreate,\n };\n}\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useCallback } from 'preact/compat';\nimport { Header } from '@adobe-commerce/elsie/components';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { RequisitionList as RequisitionListModel } from '@/requisitionList/data/models/requisitionList';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n RequisitionListGridWrapper,\n RequisitionListModal,\n RequisitionListForm,\n NotFound,\n} from '@/requisitionList/components';\nimport { useRequisitionListGrid } from '@/requisitionList/hooks/useRequisitionListGrid';\nimport { useRequisitionListEnabled } from '@/requisitionList/hooks/useRequisitionListEnabled';\nimport { deleteRequisitionList } from '@/requisitionList/api/deleteRequisitionList/deleteRequisitionList';\nimport { updateRequisitionList } from '@/requisitionList/api/updateRequisitionList';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface RequisitionListGridProps\n extends HTMLAttributes<HTMLDivElement> {\n routeRequisitionListDetails?: (uid: string) => string | void;\n /**\n * Fallback URL to redirect when requisition lists are not enabled.\n * Defaults to '/customer/account'\n */\n fallbackRoute?: string;\n slots?: {\n Header?: SlotProps;\n };\n}\n\nexport const RequisitionListGrid: Container<RequisitionListGridProps> = ({\n routeRequisitionListDetails,\n fallbackRoute = '/customer/account',\n slots,\n}: RequisitionListGridProps) => {\n const { isEnabled } = useRequisitionListEnabled();\n\n const [modal, setModal] = useState<{\n type: 'rename' | 'delete' | null;\n isOpen: boolean;\n isLoading: boolean;\n requisitionList: RequisitionListModel | null;\n }>({\n type: null,\n isOpen: false,\n isLoading: false,\n requisitionList: null,\n });\n\n const closeModal = useCallback(() => {\n setModal({\n type: null,\n isOpen: false,\n isLoading: false,\n requisitionList: null,\n });\n }, []);\n\n const handleOpenRenameModal = useCallback((rl: RequisitionListModel) => {\n setModal({\n type: 'rename',\n isOpen: true,\n isLoading: false,\n requisitionList: rl,\n });\n }, []);\n\n const handleOpenDeleteModal = useCallback((rl: RequisitionListModel) => {\n setModal({\n type: 'delete',\n isOpen: true,\n isLoading: false,\n requisitionList: rl,\n });\n }, []);\n\n const {\n rows,\n isLoading,\n pageInfo,\n totalCount,\n handlePageChange,\n handlePageSizeChange,\n isAdding,\n handleAddNew,\n handleCancelCreate,\n } = useRequisitionListGrid(\n { handleOpenRenameModal, handleOpenDeleteModal },\n routeRequisitionListDetails,\n closeModal\n );\n\n const handleRenameSubmit = useCallback(\n async (values: { name: string; description?: string }) => {\n /* istanbul ignore next: Defensive check - modal.requisitionList should always be set when this function is called */\n if (!modal.requisitionList) return;\n\n try {\n await updateRequisitionList(\n modal.requisitionList.uid,\n values.name,\n values.description\n );\n events.emit('requisitionList/alert', {\n action: 'update',\n type: 'success',\n context: 'requisitionList',\n });\n await handlePageChange();\n closeModal();\n } catch (error) {\n events.emit('requisitionList/alert', {\n action: 'update',\n type: 'error',\n context: 'requisitionList',\n });\n }\n },\n [modal.requisitionList, handlePageChange, closeModal]\n );\n\n const handleDeleteConfirm = async () => {\n /* istanbul ignore next: Defensive check - modal.requisitionList should always be set when this function is called */\n if (!modal.requisitionList) return;\n setModal({ ...modal, isLoading: true });\n await deleteRequisitionList(modal.requisitionList.uid)\n .then(async () => {\n events.emit('requisitionList/alert', {\n type: 'success',\n action: 'delete',\n context: 'requisitionList',\n });\n })\n .catch(() => {\n events.emit('requisitionList/alert', {\n type: 'error',\n action: 'delete',\n context: 'requisitionList',\n });\n })\n .finally(async () => {\n await handlePageChange();\n closeModal();\n });\n };\n\n const translations = useText({\n containerTitle: `RequisitionList.containerTitle`,\n updateTitle: `RequisitionList.RequisitionListForm.updateTitle`,\n deleteRequisitionListTitle:\n 'RequisitionList.RequisitionListWrapper.deleteRequisitionListTitle',\n deleteRequisitionListMessage:\n 'RequisitionList.RequisitionListWrapper.deleteRequisitionListMessage',\n cancelAction: 'RequisitionList.RequisitionListWrapper.cancelAction',\n confirmAction: 'RequisitionList.RequisitionListWrapper.confirmAction',\n notEnabledTitle: `RequisitionList.RequisitionListsNotEnabled.title`,\n notEnabledMessage: `RequisitionList.RequisitionListsNotEnabled.message`,\n notEnabledActionLabel: `RequisitionList.RequisitionListsNotEnabled.actionLabel`,\n });\n\n const getHeader = useCallback(() => {\n if (slots?.Header) {\n return (\n <Slot\n name=\"Header\"\n aria-label={translations.containerTitle}\n title={translations.containerTitle}\n slot={slots.Header}\n />\n );\n }\n return (\n <Header\n aria-label={translations.containerTitle}\n role=\"region\"\n title={translations.containerTitle}\n />\n );\n }, [slots, translations.containerTitle]);\n\n if (isEnabled === false) {\n return (\n <NotFound\n title={translations.notEnabledTitle}\n message={translations.notEnabledMessage}\n actionLabel={translations.notEnabledActionLabel}\n onAction={() => {\n window.location.href = fallbackRoute;\n }}\n />\n );\n }\n\n return (\n <>\n <RequisitionListGridWrapper\n header={getHeader()}\n rows={rows}\n skeletonRowCount={10}\n isLoading={isLoading}\n pageInfo={pageInfo}\n totalCount={totalCount}\n handlePageChange={handlePageChange}\n handlePageSizeChange={handlePageSizeChange}\n defaultPageSize={10}\n isAdding={isAdding}\n handleAddNew={handleAddNew}\n handleCancelCreate={handleCancelCreate}\n />\n\n {/* Rename Modal */}\n {modal.type === 'rename' && modal.isOpen && modal.requisitionList && (\n <RequisitionListModal\n isOpen={modal.isOpen}\n isLoading={modal.isLoading}\n title={translations.updateTitle}\n modalContent={\n <RequisitionListForm\n mode=\"update\"\n defaultValues={{\n name: modal.requisitionList.name,\n description: modal.requisitionList.description || '',\n }}\n onSubmit={handleRenameSubmit}\n onCancel={closeModal}\n />\n }\n handleModalOnClose={closeModal}\n />\n )}\n\n {/* Delete Confirmation Modal */}\n {modal.type === 'delete' && modal.isOpen && (\n <RequisitionListModal\n isOpen={modal.isOpen}\n isLoading={modal.isLoading}\n title={translations.deleteRequisitionListTitle}\n modalContent={translations.deleteRequisitionListMessage}\n confirmBtnCaption={translations.confirmAction}\n closeBtnCaption={translations.cancelAction}\n handleModalOnClose={closeModal}\n handleModalOnConfirm={handleDeleteConfirm}\n />\n )}\n </>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect } from 'preact/compat';\nimport { FunctionComponent, VNode } from 'preact';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport {\n RequisitionListActions,\n EmptyList,\n PageSizePicker,\n PaginationItemsCounter,\n} from '@/requisitionList/components';\nimport { RequisitionListForm } from '@/requisitionList/containers';\nimport {\n Pagination,\n Card,\n Table,\n InLineAlert,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport '@/requisitionList/components/RequisitionListGridWrapper/RequisitionListGridWrapper.css';\nimport { useRequisitionListAlert } from '@/requisitionList/hooks';\n\nexport interface RequisitionListGridWrapperProps\n extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n isLoading?: boolean;\n header?: VNode;\n rows: Array<Record<string, VNode | string | number | undefined>>;\n skeletonRowCount: number;\n pageInfo?: {\n total_pages?: number;\n current_page?: number;\n page_size?: number;\n };\n totalCount?: number;\n handlePageChange: (page?: number) => Promise<void>;\n handlePageSizeChange?: (pageSize: number) => Promise<void>;\n defaultPageSize?: number;\n isAdding: boolean;\n handleAddNew: () => void;\n handleCancelCreate: () => void;\n}\n\nexport const RequisitionListGridWrapper: FunctionComponent<\n RequisitionListGridWrapperProps\n> = ({\n className,\n isLoading = false,\n header,\n rows = [],\n skeletonRowCount = 10,\n pageInfo,\n totalCount = 0,\n handlePageChange,\n handlePageSizeChange,\n defaultPageSize = 10,\n isAdding,\n handleAddNew,\n handleCancelCreate,\n ...props\n}) => {\n const translations = useText({\n name: `RequisitionList.RequisitionListWrapper.name`,\n itemsCount: `RequisitionList.RequisitionListWrapper.itemsCount`,\n lastUpdated: `RequisitionList.RequisitionListWrapper.lastUpdated`,\n actions: `RequisitionList.RequisitionListWrapper.actions`,\n emptyList: `RequisitionList.RequisitionListWrapper.emptyList`,\n show: `RequisitionList.PageSizePicker.show`,\n });\n\n const hasAnyItems = (pageInfo?.total_pages ?? 0) > 0;\n const showEmptyList = !isLoading && rows.length === 0 && !hasAnyItems;\n\n const { alert, setAlert, handleRequisitionListAlert } =\n useRequisitionListAlert();\n\n useEffect(() => {\n const alertEvent = events.on(\n 'requisitionList/alert',\n handleRequisitionListAlert\n );\n\n // Check for pending alert in localStorage (e.g., after redirect from deletion)\n try {\n const pendingAlert = localStorage.getItem('requisitionListPendingAlert');\n if (pendingAlert) {\n const alertPayload = JSON.parse(pendingAlert);\n handleRequisitionListAlert(alertPayload);\n localStorage.removeItem('requisitionListPendingAlert');\n }\n } catch (e) {\n // Ignore localStorage errors (e.g., in private browsing mode)\n }\n\n return () => {\n alertEvent?.off();\n };\n }, [handleRequisitionListAlert]);\n\n return (\n <div\n {...props}\n className={classes(['requisition-list-grid-wrapper', className])}\n data-testid=\"requisition-list-grid-wrapper\"\n >\n {/* Requisition List Header */}\n {header && (\n <div\n className={classes([\n 'requisition-list-grid-wrapper__header',\n className,\n ])}\n data-testid=\"requisition-list-grid-wrapper-header\"\n >\n <VComponent node={header} />\n </div>\n )}\n {/* Requisition List alerts go here */}\n {alert && (\n <div className=\"requisition-list__alert-wrapper\">\n <InLineAlert\n heading={alert.description}\n type={alert.type}\n variant=\"primary\"\n onDismiss={() => setAlert(null)}\n />\n </div>\n )}\n\n {showEmptyList ? (\n <EmptyList textContent={translations.emptyList} />\n ) : (\n <>\n {/* Requisition Lists Table */}\n <Table\n columns={[\n { key: 'name', label: translations.name },\n { key: 'items_count', label: translations.itemsCount },\n { key: 'last_updated', label: translations.lastUpdated },\n { key: 'actions', label: translations.actions },\n ]}\n rowData={rows}\n loading={isLoading}\n skeletonRowCount={skeletonRowCount}\n />\n {pageInfo && (\n <div\n className={classes([\n 'requisition-list-grid-wrapper__pagination',\n className,\n ])}\n >\n <PaginationItemsCounter\n pageInfo={pageInfo}\n totalCount={totalCount}\n />\n {(pageInfo.total_pages || 0) > 1 && (\n <Pagination\n totalPages={pageInfo.total_pages}\n currentPage={pageInfo.current_page || 1}\n onChange={handlePageChange}\n disabled={isLoading}\n />\n )}\n <div className=\"requisition-list-grid-wrapper__pagination-picker\">\n <span>{translations.show}</span>\n <PageSizePicker\n currentPageSize={pageInfo.page_size || defaultPageSize}\n onPageSizeChange={\n handlePageSizeChange || (() => Promise.resolve())\n }\n disabled={isLoading}\n />\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Requisition Lists Form */}\n <div\n className={classes([\n 'requisition-list-grid-wrapper__add-new',\n className,\n ])}\n >\n {isAdding ? (\n <Card variant=\"secondary\">\n <RequisitionListForm\n mode=\"create\"\n onSuccess={async () => {\n await handlePageChange();\n handleCancelCreate();\n handleRequisitionListAlert({\n type: 'success',\n action: 'create',\n context: 'requisitionList',\n });\n }}\n onError={() => {\n handleRequisitionListAlert({\n type: 'error',\n action: 'create',\n context: 'requisitionList',\n });\n }}\n onCancel={handleCancelCreate}\n />\n </Card>\n ) : (\n <RequisitionListActions onAddNew={handleAddNew} />\n )}\n </div>\n </div>\n );\n};\n"],"names":["useRequisitionListGrid","callbacks","routeRequisitionListDetails","closeModal","translations","useText","reqLists","setReqLists","useState","isAdding","setIsAdding","isFetching","setIsFetching","handleAddNew","useCallback","handleCancelCreate","wrappedCallbacks","useMemo","rl","current","fetchPage","page","pageSize","data","getRequisitionLists","currentPage","_a","totalPages","_b","_c","prev","prevData","useEffect","requisitionListsEvent","events","DEFAULT_PAGE_SIZE","handlePageChange","currentPageSize","handlePageSizeChange","jsxs","jsx","e","result","Button","RequisitionListGrid","fallbackRoute","slots","isEnabled","useRequisitionListEnabled","modal","setModal","handleOpenRenameModal","handleOpenDeleteModal","rows","isLoading","pageInfo","totalCount","handleRenameSubmit","values","updateRequisitionList","handleDeleteConfirm","deleteRequisitionList","getHeader","Slot","Header","NotFound","Fragment","RequisitionListGridWrapper","RequisitionListModal","RequisitionListForm","className","header","skeletonRowCount","defaultPageSize","props","hasAnyItems","showEmptyList","alert","setAlert","handleRequisitionListAlert","useRequisitionListAlert","alertEvent","pendingAlert","alertPayload","classes","VComponent","InLineAlert","EmptyList","Table","PaginationItemsCounter","Pagination","PageSizePicker","Card","RequisitionListActions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RequisitionListGrid.js","sources":["/@dropins/storefront-requisition-list/src/hooks/useRequisitionListGrid.tsx","/@dropins/storefront-requisition-list/src/containers/RequisitionListGrid/RequisitionListGrid.tsx","/@dropins/storefront-requisition-list/src/components/RequisitionListGridWrapper/RequisitionListGridWrapper.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useMemo, useState, useCallback, useEffect } from 'preact/compat';\nimport { VNode } from 'preact';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { RequisitionList as RequisitionListModel } from '@/requisitionList/data/models/requisitionList';\nimport { getRequisitionLists } from '@/requisitionList/api/getRequisitionLists';\nimport { RequisitionLists } from '@/requisitionList/data/models/requisitionLists';\nimport { events } from '@adobe-commerce/event-bus';\nimport { DEFAULT_PAGE_SIZE } from '@/requisitionList/lib/constants';\n\ntype Row = Record<string, VNode | string | number | undefined>;\ntype Callbacks = {\n handleOpenRenameModal: (rl: RequisitionListModel) => void;\n handleOpenDeleteModal: (rl: RequisitionListModel) => void;\n};\n\nexport function useRequisitionListGrid(\n callbacks?: Callbacks,\n routeRequisitionListDetails?: (uid: string) => string | void,\n closeModal?: () => void\n) {\n const translations = useText({\n actionRename: 'RequisitionList.RequisitionListView.actionRename',\n actionDeleteList: 'RequisitionList.RequisitionListView.actionDeleteList',\n });\n\n const [reqLists, setReqLists] = useState<RequisitionLists | null>(null);\n const [isAdding, setIsAdding] = useState(false);\n const [isFetching, setIsFetching] = useState(false);\n\n const handleAddNew = useCallback(() => {\n // Close any open modal before opening create form\n if (closeModal) {\n closeModal();\n }\n setIsAdding(true);\n }, [closeModal]);\n\n const handleCancelCreate = useCallback(() => setIsAdding(false), []);\n\n // Wrap callbacks to close create form when opening modals\n const wrappedCallbacks = useMemo(() => {\n if (!callbacks) return undefined;\n\n return {\n handleOpenRenameModal: (rl: RequisitionListModel) => {\n // Close create form if open - use functional update to avoid dependency on isAdding\n setIsAdding((current) => {\n if (current) return false;\n return current;\n });\n callbacks.handleOpenRenameModal(rl);\n },\n handleOpenDeleteModal: (rl: RequisitionListModel) => {\n // Close create form if open - use functional update to avoid dependency on isAdding\n setIsAdding((current) => {\n if (current) return false;\n return current;\n });\n callbacks.handleOpenDeleteModal(rl);\n },\n };\n }, [callbacks]);\n\n const fetchPage = useCallback(async (page: number, pageSize: number) => {\n setIsFetching(true);\n try {\n const data = await getRequisitionLists(page, pageSize);\n const currentPage = data?.page_info?.current_page ?? 1;\n const totalPages = data?.page_info?.total_pages ?? 0;\n const hasRows = (data?.items?.length ?? 0) > 0;\n\n if (!hasRows && currentPage > 1 && totalPages >= currentPage - 1) {\n const prev = currentPage - 1;\n const prevData = await getRequisitionLists(prev, pageSize);\n setReqLists(prevData);\n } else {\n setReqLists(data);\n }\n } finally {\n setIsFetching(false);\n }\n }, []);\n\n useEffect(() => {\n const requisitionListsEvent = events.on(\n 'requisitionLists/data',\n (data: RequisitionLists) => {\n if (data && data.items) {\n setReqLists(data);\n }\n },\n { eager: true }\n );\n return () => {\n requisitionListsEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n if (!reqLists) {\n void fetchPage(1, DEFAULT_PAGE_SIZE);\n }\n }, [reqLists, fetchPage]);\n\n const handlePageChange = useCallback(\n (page?: number) => {\n const currentPage = page ?? reqLists?.page_info?.current_page ?? 1;\n const currentPageSize =\n reqLists?.page_info?.page_size ?? DEFAULT_PAGE_SIZE;\n return fetchPage(currentPage, currentPageSize);\n },\n [fetchPage, reqLists]\n );\n\n const handlePageSizeChange = useCallback(\n async (pageSize: number) => {\n // Reset to page 1 when changing page size\n await fetchPage(1, pageSize);\n },\n [fetchPage]\n );\n\n const rows: Row[] = useMemo(\n () =>\n (reqLists?.items ?? []).map((rl: RequisitionListModel) => {\n return {\n name: (\n <div className=\"requisition-list-grid-wrapper__name\">\n <div className=\"requisition-list-grid-wrapper__name__title\">\n <a\n href=\"#\"\n onClick={(e: Event): void => {\n e.preventDefault();\n if (routeRequisitionListDetails) {\n const result = routeRequisitionListDetails(rl.uid);\n if (typeof result === 'string') {\n window.location.href = result;\n }\n }\n }}\n >\n {rl.name}\n </a>\n </div>\n {rl.description && (\n <div className=\"requisition-list-grid-wrapper__name__description\">\n {rl.description}\n </div>\n )}\n </div>\n ),\n items_count: rl.items_count,\n last_updated: new Date(rl.updated_at).toLocaleString(),\n actions: (\n <div className=\"requisition-list-grid-wrapper__actions\">\n <Button\n variant=\"tertiary\"\n type=\"button\"\n data-testid=\"rename-button\"\n onClick={() => wrappedCallbacks?.handleOpenRenameModal(rl)}\n >\n {translations.actionRename}\n </Button>\n <Button\n variant=\"tertiary\"\n type=\"button\"\n data-testid=\"delete-button\"\n onClick={() => wrappedCallbacks?.handleOpenDeleteModal(rl)}\n >\n {translations.actionDeleteList}\n </Button>\n </div>\n ),\n };\n }),\n [\n reqLists?.items,\n translations.actionRename,\n translations.actionDeleteList,\n wrappedCallbacks,\n routeRequisitionListDetails,\n ]\n );\n\n return {\n rows,\n isLoading: isFetching || !reqLists,\n pageInfo: reqLists?.page_info,\n totalCount: reqLists?.total_count,\n handlePageChange,\n handlePageSizeChange,\n isAdding,\n handleAddNew,\n handleCancelCreate,\n };\n}\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useCallback } from 'preact/compat';\nimport { Header } from '@adobe-commerce/elsie/components';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { RequisitionList as RequisitionListModel } from '@/requisitionList/data/models/requisitionList';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n RequisitionListGridWrapper,\n RequisitionListModal,\n RequisitionListForm,\n NotFound,\n} from '@/requisitionList/components';\nimport { useRequisitionListGrid } from '@/requisitionList/hooks/useRequisitionListGrid';\nimport { useRequisitionListEnabled } from '@/requisitionList/hooks/useRequisitionListEnabled';\nimport { deleteRequisitionList } from '@/requisitionList/api/deleteRequisitionList/deleteRequisitionList';\nimport { updateRequisitionList } from '@/requisitionList/api/updateRequisitionList';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface RequisitionListGridProps\n extends HTMLAttributes<HTMLDivElement> {\n routeRequisitionListDetails?: (uid: string) => string | void;\n /**\n * Fallback URL to redirect when requisition lists are not enabled.\n * Defaults to '/customer/account'\n */\n fallbackRoute?: string;\n slots?: {\n Header?: SlotProps;\n };\n}\n\nexport const RequisitionListGrid: Container<RequisitionListGridProps> = ({\n routeRequisitionListDetails,\n fallbackRoute = '/customer/account',\n slots,\n}: RequisitionListGridProps) => {\n const { isEnabled } = useRequisitionListEnabled();\n\n const [modal, setModal] = useState<{\n type: 'rename' | 'delete' | null;\n isOpen: boolean;\n isLoading: boolean;\n requisitionList: RequisitionListModel | null;\n }>({\n type: null,\n isOpen: false,\n isLoading: false,\n requisitionList: null,\n });\n\n const closeModal = useCallback(() => {\n setModal({\n type: null,\n isOpen: false,\n isLoading: false,\n requisitionList: null,\n });\n }, []);\n\n const handleOpenRenameModal = useCallback((rl: RequisitionListModel) => {\n setModal({\n type: 'rename',\n isOpen: true,\n isLoading: false,\n requisitionList: rl,\n });\n }, []);\n\n const handleOpenDeleteModal = useCallback((rl: RequisitionListModel) => {\n setModal({\n type: 'delete',\n isOpen: true,\n isLoading: false,\n requisitionList: rl,\n });\n }, []);\n\n const {\n rows,\n isLoading,\n pageInfo,\n totalCount,\n handlePageChange,\n handlePageSizeChange,\n isAdding,\n handleAddNew,\n handleCancelCreate,\n } = useRequisitionListGrid(\n { handleOpenRenameModal, handleOpenDeleteModal },\n routeRequisitionListDetails,\n closeModal\n );\n\n const handleRenameSubmit = useCallback(\n async (values: { name: string; description?: string }) => {\n /* istanbul ignore next: Defensive check - modal.requisitionList should always be set when this function is called */\n if (!modal.requisitionList) return;\n\n try {\n await updateRequisitionList(\n modal.requisitionList.uid,\n values.name,\n values.description\n );\n events.emit('requisitionList/alert', {\n action: 'update',\n type: 'success',\n context: 'requisitionList',\n });\n await handlePageChange();\n closeModal();\n } catch (error) {\n events.emit('requisitionList/alert', {\n action: 'update',\n type: 'error',\n context: 'requisitionList',\n });\n }\n },\n [modal.requisitionList, handlePageChange, closeModal]\n );\n\n const handleDeleteConfirm = async () => {\n /* istanbul ignore next: Defensive check - modal.requisitionList should always be set when this function is called */\n if (!modal.requisitionList) return;\n setModal({ ...modal, isLoading: true });\n await deleteRequisitionList(modal.requisitionList.uid)\n .then(async () => {\n events.emit('requisitionList/alert', {\n type: 'success',\n action: 'delete',\n context: 'requisitionList',\n });\n })\n .catch(() => {\n events.emit('requisitionList/alert', {\n type: 'error',\n action: 'delete',\n context: 'requisitionList',\n });\n })\n .finally(async () => {\n await handlePageChange();\n closeModal();\n });\n };\n\n const translations = useText({\n containerTitle: `RequisitionList.containerTitle`,\n updateTitle: `RequisitionList.RequisitionListForm.updateTitle`,\n deleteRequisitionListTitle:\n 'RequisitionList.RequisitionListWrapper.deleteRequisitionListTitle',\n deleteRequisitionListMessage:\n 'RequisitionList.RequisitionListWrapper.deleteRequisitionListMessage',\n cancelAction: 'RequisitionList.RequisitionListWrapper.cancelAction',\n confirmAction: 'RequisitionList.RequisitionListWrapper.confirmAction',\n notEnabledTitle: `RequisitionList.RequisitionListsNotEnabled.title`,\n notEnabledMessage: `RequisitionList.RequisitionListsNotEnabled.message`,\n notEnabledActionLabel: `RequisitionList.RequisitionListsNotEnabled.actionLabel`,\n });\n\n const getHeader = useCallback(() => {\n if (slots?.Header) {\n return (\n <Slot\n name=\"Header\"\n aria-label={translations.containerTitle}\n title={translations.containerTitle}\n slot={slots.Header}\n />\n );\n }\n return (\n <Header\n aria-label={translations.containerTitle}\n role=\"region\"\n title={translations.containerTitle}\n />\n );\n }, [slots, translations.containerTitle]);\n\n if (isEnabled === false) {\n return (\n <NotFound\n title={translations.notEnabledTitle}\n message={translations.notEnabledMessage}\n actionLabel={translations.notEnabledActionLabel}\n onAction={() => {\n window.location.href = fallbackRoute;\n }}\n />\n );\n }\n\n return (\n <>\n <RequisitionListGridWrapper\n header={getHeader()}\n rows={rows}\n skeletonRowCount={10}\n isLoading={isLoading}\n pageInfo={pageInfo}\n totalCount={totalCount}\n handlePageChange={handlePageChange}\n handlePageSizeChange={handlePageSizeChange}\n defaultPageSize={10}\n isAdding={isAdding}\n handleAddNew={handleAddNew}\n handleCancelCreate={handleCancelCreate}\n />\n\n {/* Rename Modal */}\n {modal.type === 'rename' && modal.isOpen && modal.requisitionList && (\n <RequisitionListModal\n isOpen={modal.isOpen}\n isLoading={modal.isLoading}\n title={translations.updateTitle}\n modalContent={\n <RequisitionListForm\n mode=\"update\"\n defaultValues={{\n name: modal.requisitionList.name,\n description: modal.requisitionList.description || '',\n }}\n onSubmit={handleRenameSubmit}\n onCancel={closeModal}\n />\n }\n handleModalOnClose={closeModal}\n />\n )}\n\n {/* Delete Confirmation Modal */}\n {modal.type === 'delete' && modal.isOpen && (\n <RequisitionListModal\n isOpen={modal.isOpen}\n isLoading={modal.isLoading}\n title={translations.deleteRequisitionListTitle}\n modalContent={translations.deleteRequisitionListMessage}\n confirmBtnCaption={translations.confirmAction}\n closeBtnCaption={translations.cancelAction}\n handleModalOnClose={closeModal}\n handleModalOnConfirm={handleDeleteConfirm}\n />\n )}\n </>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect } from 'preact/compat';\nimport { FunctionComponent, VNode } from 'preact';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport {\n RequisitionListActions,\n EmptyList,\n PageSizePicker,\n PaginationItemsCounter,\n} from '@/requisitionList/components';\nimport { RequisitionListForm } from '@/requisitionList/containers';\nimport {\n Pagination,\n Card,\n Table,\n InLineAlert,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport '@/requisitionList/components/RequisitionListGridWrapper/RequisitionListGridWrapper.css';\nimport { useRequisitionListAlert } from '@/requisitionList/hooks';\n\nexport interface RequisitionListGridWrapperProps\n extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n isLoading?: boolean;\n header?: VNode;\n rows: Array<Record<string, VNode | string | number | undefined>>;\n skeletonRowCount: number;\n pageInfo?: {\n total_pages?: number;\n current_page?: number;\n page_size?: number;\n };\n totalCount?: number;\n handlePageChange: (page?: number) => Promise<void>;\n handlePageSizeChange?: (pageSize: number) => Promise<void>;\n defaultPageSize?: number;\n isAdding: boolean;\n handleAddNew: () => void;\n handleCancelCreate: () => void;\n}\n\nexport const RequisitionListGridWrapper: FunctionComponent<\n RequisitionListGridWrapperProps\n> = ({\n className,\n isLoading = false,\n header,\n rows = [],\n skeletonRowCount = 10,\n pageInfo,\n totalCount = 0,\n handlePageChange,\n handlePageSizeChange,\n defaultPageSize = 10,\n isAdding,\n handleAddNew,\n handleCancelCreate,\n ...props\n}) => {\n const translations = useText({\n name: `RequisitionList.RequisitionListWrapper.name`,\n itemsCount: `RequisitionList.RequisitionListWrapper.itemsCount`,\n lastUpdated: `RequisitionList.RequisitionListWrapper.lastUpdated`,\n actions: `RequisitionList.RequisitionListWrapper.actions`,\n emptyList: `RequisitionList.RequisitionListWrapper.emptyList`,\n show: `RequisitionList.PageSizePicker.show`,\n });\n\n const hasAnyItems = (pageInfo?.total_pages ?? 0) > 0;\n const showEmptyList = !isLoading && rows.length === 0 && !hasAnyItems;\n\n const { alert, setAlert, handleRequisitionListAlert } =\n useRequisitionListAlert();\n\n useEffect(() => {\n const alertEvent = events.on(\n 'requisitionList/alert',\n handleRequisitionListAlert\n );\n\n // Check for pending alert in localStorage (e.g., after redirect from deletion)\n try {\n const pendingAlert = localStorage.getItem('requisitionListPendingAlert');\n if (pendingAlert) {\n const alertPayload = JSON.parse(pendingAlert);\n handleRequisitionListAlert(alertPayload);\n localStorage.removeItem('requisitionListPendingAlert');\n }\n } catch (e) {\n // Ignore localStorage errors (e.g., in private browsing mode)\n }\n\n return () => {\n alertEvent?.off();\n };\n }, [handleRequisitionListAlert]);\n\n return (\n <div\n {...props}\n className={classes(['requisition-list-grid-wrapper', className])}\n data-testid=\"requisition-list-grid-wrapper\"\n >\n {/* Requisition List Header */}\n {header && (\n <div\n className={classes([\n 'requisition-list-grid-wrapper__header',\n className,\n ])}\n data-testid=\"requisition-list-grid-wrapper-header\"\n >\n <VComponent node={header} />\n </div>\n )}\n {/* Requisition List alerts go here */}\n {alert && (\n <div className=\"requisition-list__alert-wrapper\">\n <InLineAlert\n heading={alert.description}\n type={alert.type}\n variant=\"primary\"\n onDismiss={() => setAlert(null)}\n />\n </div>\n )}\n\n {showEmptyList ? (\n <EmptyList textContent={translations.emptyList} />\n ) : (\n <>\n {/* Requisition Lists Table */}\n <Table\n columns={[\n { key: 'name', label: translations.name },\n { key: 'items_count', label: translations.itemsCount },\n { key: 'last_updated', label: translations.lastUpdated },\n { key: 'actions', label: translations.actions },\n ]}\n rowData={rows}\n loading={isLoading}\n skeletonRowCount={skeletonRowCount}\n />\n {pageInfo && (\n <div\n className={classes([\n 'requisition-list-grid-wrapper__pagination',\n className,\n ])}\n >\n <PaginationItemsCounter\n pageInfo={pageInfo}\n totalCount={totalCount}\n />\n {(pageInfo.total_pages || 0) > 1 && (\n <Pagination\n totalPages={pageInfo.total_pages}\n currentPage={pageInfo.current_page || 1}\n onChange={handlePageChange}\n disabled={isLoading}\n />\n )}\n <div className=\"requisition-list-grid-wrapper__pagination-picker\">\n <span>{translations.show}</span>\n <PageSizePicker\n currentPageSize={pageInfo.page_size || defaultPageSize}\n onPageSizeChange={\n handlePageSizeChange || (() => Promise.resolve())\n }\n disabled={isLoading}\n />\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Requisition Lists Form */}\n <div\n className={classes([\n 'requisition-list-grid-wrapper__add-new',\n className,\n ])}\n >\n {isAdding ? (\n <Card variant=\"secondary\">\n <RequisitionListForm\n mode=\"create\"\n onSuccess={async () => {\n await handlePageChange();\n handleCancelCreate();\n handleRequisitionListAlert({\n type: 'success',\n action: 'create',\n context: 'requisitionList',\n });\n }}\n onError={() => {\n handleRequisitionListAlert({\n type: 'error',\n action: 'create',\n context: 'requisitionList',\n });\n }}\n onCancel={handleCancelCreate}\n />\n </Card>\n ) : (\n <RequisitionListActions onAddNew={handleAddNew} />\n )}\n </div>\n </div>\n );\n};\n"],"names":["useRequisitionListGrid","callbacks","routeRequisitionListDetails","closeModal","translations","useText","reqLists","setReqLists","useState","isAdding","setIsAdding","isFetching","setIsFetching","handleAddNew","useCallback","handleCancelCreate","wrappedCallbacks","useMemo","rl","current","fetchPage","page","pageSize","data","getRequisitionLists","currentPage","_a","totalPages","_b","_c","prev","prevData","useEffect","requisitionListsEvent","events","DEFAULT_PAGE_SIZE","handlePageChange","currentPageSize","handlePageSizeChange","jsxs","jsx","e","result","Button","RequisitionListGrid","fallbackRoute","slots","isEnabled","useRequisitionListEnabled","modal","setModal","handleOpenRenameModal","handleOpenDeleteModal","rows","isLoading","pageInfo","totalCount","handleRenameSubmit","values","updateRequisitionList","handleDeleteConfirm","deleteRequisitionList","getHeader","Slot","Header","NotFound","Fragment","RequisitionListGridWrapper","RequisitionListModal","RequisitionListForm","className","header","skeletonRowCount","defaultPageSize","props","hasAnyItems","showEmptyList","alert","setAlert","handleRequisitionListAlert","useRequisitionListAlert","alertEvent","pendingAlert","alertPayload","classes","VComponent","InLineAlert","EmptyList","Table","PaginationItemsCounter","Pagination","PageSizePicker","Card","RequisitionListActions"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{R as
|
|
3
|
+
import{R as u}from"../chunks/RequisitionListHeader.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-hooks.js";import"../chunks/RequisitionListModal.js";import"@dropins/tools/components.js";import"../chunks/RequisitionListForm.js";import"@dropins/tools/lib.js";import"@dropins/tools/i18n.js";import"../chunks/updateRequisitionList.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";import"../chunks/deleteRequisitionList.js";export{u as RequisitionListHeader};
|
|
4
4
|
//# sourceMappingURL=RequisitionListHeader.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as s,jsxs as q,Fragment as x}from"@dropins/tools/preact-jsx-runtime.js";import*as k from"@dropins/tools/preact-compat.js";import{useState as p,useEffect as v,useCallback as m,useMemo as D}from"@dropins/tools/preact-compat.js";import{Card as y,Icon as E,Button as F,InLineAlert as V}from"@dropins/tools/components.js";import{
|
|
3
|
+
import{jsx as s,jsxs as q,Fragment as x}from"@dropins/tools/preact-jsx-runtime.js";import*as k from"@dropins/tools/preact-compat.js";import{useState as p,useEffect as v,useCallback as m,useMemo as D}from"@dropins/tools/preact-compat.js";import{Card as y,Icon as E,Button as F,InLineAlert as V}from"@dropins/tools/components.js";import{f as H,h as J}from"../chunks/fetch-graphql.js";import{a as K,R as X,t as Y}from"../chunks/updateRequisitionList.js";import{events as A}from"@dropins/tools/event-bus.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/lib.js";import"../chunks/RequisitionListForm.js";import{R as Z}from"../chunks/RequisitionListForm2.js";import{u as ii,a as ti,S as $,E as si}from"../chunks/RequisitionListView.js";import"@dropins/tools/preact.js";import{s as l,a as P,b as N,u as ei}from"../chunks/state.js";import{g as oi}from"../chunks/getRequisitionLists.js";import{R as ni}from"../chunks/RequisitionListActions.js";import{R as ri}from"../chunks/RequisitionListModal.js";import{useText as ai}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const li=`
|
|
4
4
|
mutation ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION(
|
|
5
5
|
$requisitionListUid: ID!,
|
|
6
6
|
$requisitionListItems: [RequisitionListItemsInput!]!
|
|
@@ -17,7 +17,7 @@ import{jsx as s,jsxs as q,Fragment as x}from"@dropins/tools/preact-jsx-runtime.j
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
${
|
|
21
|
-
${
|
|
22
|
-
`,di=async(L,n)=>{var e;const u=n.map(i=>{const t={sku:i.sku,quantity:i.quantity};return i.parent_sku&&(t.parent_sku=i.parent_sku),i.selected_options&&i.selected_options.length>0&&(t.selected_options=i.selected_options),i.entered_options&&i.entered_options.length>0&&(t.entered_options=i.entered_options),t}),{errors:d,data:a}=await
|
|
20
|
+
${K}
|
|
21
|
+
${X}
|
|
22
|
+
`,di=async(L,n)=>{var e;const u=n.map(i=>{const t={sku:i.sku,quantity:i.quantity};return i.parent_sku&&(t.parent_sku=i.parent_sku),i.selected_options&&i.selected_options.length>0&&(t.selected_options=i.selected_options),i.entered_options&&i.entered_options.length>0&&(t.entered_options=i.entered_options),t}),{errors:d,data:a}=await H(li,{variables:{requisitionListUid:L,requisitionListItems:u}});if(d)return J(d);if(!((e=a==null?void 0:a.addProductsToRequisitionList)!=null&&e.requisition_list))return null;const r=Y(a.addProductsToRequisitionList.requisition_list);return A.emit("requisitionList/data",r),r},ci=L=>k.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...L},k.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701",stroke:"currentColor",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round"}));let c=0;const ui=()=>{const[L,n]=p(l.requisitionLists),[u,d]=p(l.requisitionListsLoading),[a,r]=p(c);return v(()=>{l.requisitionLists.length===0&&!l.requisitionListsLoading&&(P(!0),oi(1,100).then(e=>{const i=(e==null?void 0:e.items)||[];N(i),c++}).catch(e=>{console.error("Error fetching requisition lists:",e),N([]),c++}).finally(()=>{P(!1)}))},[]),v(()=>{const e=A.on("requisitionLists/data",t=>{t&&(N(t),c++,r(c),n(l.requisitionLists),d(l.requisitionListsLoading))}),i=A.on("requisitionList/data",t=>{t&&(ei(t),c++,r(c),n([...l.requisitionLists]),d(l.requisitionListsLoading))});return()=>{e==null||e.off(),i==null||i.off()}},[]),v(()=>{a!==c&&(n(l.requisitionLists),d(l.requisitionListsLoading),r(c))},[a]),{lists:L,loading:u}},wi=({canCreate:L=!0,sku:n,selectedOptions:u,quantity:d=1,beforeAddProdToReqList:a})=>{const r=ai({createTitle:"RequisitionList.RequisitionListForm.createTitle",addToRequisitionList:"RequisitionList.RequisitionListForm.addToRequisitionList",emptyList:"RequisitionList.RequisitionListWrapper.emptyList",addToNewRequisitionList:"RequisitionList.RequisitionListSelector.addToNewRequisitionList",addToSelected:"RequisitionList.RequisitionListSelector.addToSelected"}),[e,i]=p(!1),[t,O]=p(null),{lists:R}=ui(),{isEnabled:w}=ii(),{alert:_,setAlert:U,handleRequisitionListAlert:f}=ti(),[b,M]=p({isOpen:!1,isLoading:!1}),T=m(()=>{M({isOpen:!0,isLoading:!1})},[]),I=m(()=>{M({isOpen:!1,isLoading:!1}),O(null),i(!1),U(null)},[U]),C=m(async o=>{try{const h={sku:n,quantity:d,...u&&u.length>0?{selected_options:u}:{}};await di(o,[h])}catch(h){throw console.error("Error adding product to list:",h),h}},[n,d,u]),S=m(async o=>{try{await C(o),f({action:"add",type:"success",context:"product",skus:[n]})}catch{f({action:"add",type:"error",context:"product",skus:[n]})}finally{setTimeout(()=>{I()},2e3)}},[n,C,I,f]),Q=m(o=>{o.preventDefault(),t&&S(t)},[t,S]),G=m(()=>{if(!a){T();return}Promise.resolve(a()).then(()=>{T()}).catch(()=>{})},[a,T]),g=D(()=>[...(R==null?void 0:R.map(o=>({value:o.uid,text:o.name})))??[]],[R]),j=D(()=>s("div",{className:"requisition-list-selector__available-lists",children:g.map(o=>q(y,{variant:t===o.value?"primary":"secondary",onClick:()=>{O(o.value)},children:[s(E,{source:$}),s("span",{children:o.text})]},o.value))}),[g,t]),W=g.length>0?e?q("button",{type:"button","aria-label":"Select a requisition list",role:"button",className:"requisition-list-actions","data-testid":"requisition-list-actions-button",onClick:()=>i(!1),children:[s("span",{className:"requisition-list-actions__title","data-testid":"requisition-list-actions-button-text",children:r.addToRequisitionList}),s(E,{source:ci,size:"32"})]}):s(y,{variant:"secondary",children:q("form",{onSubmit:Q,className:"requisition-list-selector__form",children:[j,s("div",{className:"requisition-list-form__actions",children:s(F,{type:"submit",disabled:!t,children:r.addToSelected})})]})}):s(si,{textContent:r.emptyList}),z=e?s(y,{variant:"secondary",children:s(Z,{mode:"create",onSuccess:async o=>{await S(o.uid)},onError:()=>{f({action:"add",type:"error",context:"product",skus:[n]})},onCancel:()=>{i(!1)}})}):s(ni,{onAddNew:()=>{i(!0)}}),B=q(x,{children:[_&&s("div",{className:"requisition-list__alert-wrapper",children:s(V,{id:`requisition-list-selector__alert__${n}`,heading:_.description,type:_.type,variant:"primary",className:"requisition-list-selector__alert"},`requisition-list-selector__alert__${n}`)}),!_&&q(x,{children:[W,L&&z]})]});return w===null||!w?null:q("div",{className:"requisition-list-selector",children:[s(F,{"aria-label":r.addToRequisitionList,"data-testid":"requisition-list-selector",size:"medium",variant:"tertiary",icon:s(E,{source:$}),onClick:G}),b.isOpen&&s(ri,{isOpen:!0,isLoading:b.isLoading,title:r.addToRequisitionList,modalContent:B,handleModalOnClose:I})]})};export{wi as RequisitionListSelector,wi as default};
|
|
23
23
|
//# sourceMappingURL=RequisitionListSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequisitionListSelector.js","sources":["/@dropins/storefront-requisition-list/src/api/addProductsToRequisitionList/graphql/addProductsToRequisitionList.ts","/@dropins/storefront-requisition-list/src/api/addProductsToRequisitionList/addProductsToRequisitionList.ts","../../node_modules/@adobe-commerce/elsie/src/icons/ChevronDown.svg","/@dropins/storefront-requisition-list/src/hooks/useRequisitionLists.ts","/@dropins/storefront-requisition-list/src/containers/RequisitionListSelector/RequisitionListSelector.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { REQUISITION_LIST_FRAGMENT } from '@/requisitionList/api/fragments/RequisitionListFragment.graphql';\nimport { REQUISITION_LIST_ITEMS_FRAGMENT } from '@/requisitionList/api/fragments/RequisitionListItemsFragment.graphql';\n\nexport const ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION = `\n mutation ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION(\n $requisitionListUid: ID!, \n $requisitionListItems: [RequisitionListItemsInput!]!\n ) {\n addProductsToRequisitionList(\n requisitionListUid: $requisitionListUid\n requisitionListItems: $requisitionListItems\n ) {\n requisition_list {\n ...REQUISITION_LIST_FRAGMENT\n items {\n ...REQUISITION_LIST_ITEMS_FRAGMENT\n }\n }\n }\n }\n${REQUISITION_LIST_ITEMS_FRAGMENT}\n${REQUISITION_LIST_FRAGMENT}\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { RequisitionList } from '@/requisitionList/data/models/requisitionList';\nimport { fetchGraphQl } from '@/requisitionList/api';\nimport { ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION } from '@/requisitionList/api/addProductsToRequisitionList/graphql/addProductsToRequisitionList';\nimport { handleFetchError } from '@/requisitionList/lib/fetch-error';\nimport { transformRequisitionList } from '@/requisitionList/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\n\n// Correct type for GraphQL RequisitionListItemsInput\nexport type RequisitionListItemsInput = {\n sku: string;\n quantity: number;\n parent_sku?: string;\n selected_options?: string[];\n entered_options?: Array<{ uid: string; value: string }>;\n};\n\nexport const addProductsToRequisitionList = async (\n requisitionListUid: string,\n requisitionListItems: Array<RequisitionListItemsInput>\n): Promise<RequisitionList | null> => {\n // Clean items before performing the mutation - remove empty fields\n const cleanedItems = requisitionListItems.map((item) => {\n const cleaned: any = {\n sku: item.sku,\n quantity: item.quantity,\n };\n\n if (item.parent_sku) cleaned.parent_sku = item.parent_sku;\n if (item.selected_options && item.selected_options.length > 0) {\n cleaned.selected_options = item.selected_options;\n }\n if (item.entered_options && item.entered_options.length > 0) {\n cleaned.entered_options = item.entered_options;\n }\n\n return cleaned;\n });\n\n const { errors, data } = await fetchGraphQl(\n ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION,\n {\n variables: {\n requisitionListUid,\n requisitionListItems: cleanedItems,\n },\n }\n );\n\n if (errors) return handleFetchError(errors);\n\n if (!data?.addProductsToRequisitionList?.requisition_list) {\n return null;\n }\n\n const payload = transformRequisitionList(\n data.addProductsToRequisitionList.requisition_list\n );\n events.emit('requisitionList/data', payload);\n return payload;\n};\n","import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useEffect, useState } from 'preact/compat';\nimport {\n state,\n setRequisitionLists,\n setRequisitionListsLoading,\n updateRequisitionList,\n} from '@/requisitionList/lib/state';\nimport { getRequisitionLists } from '@/requisitionList/api';\nimport { RequisitionList } from '@/requisitionList/data/models/requisitionList';\nimport { events } from '@adobe-commerce/event-bus';\n\nlet updateCounter = 0; // Counter to track updates across all hooks\n\nexport const useRequisitionLists = () => {\n const [lists, setLists] = useState<RequisitionList[]>(state.requisitionLists);\n const [loading, setLoading] = useState(state.requisitionListsLoading);\n const [lastUpdate, setLastUpdate] = useState(updateCounter);\n\n // Fetch lists if empty on mount\n useEffect(() => {\n if (state.requisitionLists.length === 0 && !state.requisitionListsLoading) {\n setRequisitionListsLoading(true);\n getRequisitionLists(1, 100)\n .then((res: { items: RequisitionList[] }) => {\n const newLists = res?.items || [];\n setRequisitionLists(newLists);\n updateCounter++;\n })\n .catch((error: any) => {\n console.error('Error fetching requisition lists:', error);\n setRequisitionLists([]);\n updateCounter++;\n })\n .finally(() => {\n setRequisitionListsLoading(false);\n });\n }\n }, []);\n\n // Listen to event bus updates\n useEffect(() => {\n const multiListListener = events.on(\n 'requisitionLists/data',\n (payload: RequisitionList[] | null) => {\n if (payload) {\n setRequisitionLists(payload);\n updateCounter++;\n setLastUpdate(updateCounter);\n setLists(state.requisitionLists);\n setLoading(state.requisitionListsLoading);\n }\n }\n );\n\n const singleListListener = events.on(\n 'requisitionList/data',\n (payload: RequisitionList | null) => {\n if (!payload) return;\n\n // Only the FIRST hook instance to receive this should update\n // Use the updateRequisitionList helper which handles both add and update\n updateRequisitionList(payload);\n updateCounter++;\n setLastUpdate(updateCounter);\n setLists([...state.requisitionLists]);\n setLoading(state.requisitionListsLoading);\n }\n );\n\n return () => {\n multiListListener?.off();\n singleListListener?.off();\n };\n }, []);\n\n // Sync with global state when it changes\n useEffect(() => {\n if (lastUpdate !== updateCounter) {\n setLists(state.requisitionLists);\n setLoading(state.requisitionListsLoading);\n setLastUpdate(updateCounter);\n }\n }, [lastUpdate]);\n\n return { lists, loading };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useMemo, useState } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { RequisitionList } from '../../data/models/requisitionList.js';\nimport {\n Button,\n Card,\n Icon,\n InLineAlert,\n} from '@adobe-commerce/elsie/components';\nimport { addProductsToRequisitionList } from '@/requisitionList/api/addProductsToRequisitionList/addProductsToRequisitionList';\nimport {\n EmptyList,\n RequisitionListModal,\n RequisitionListActions,\n} from '@/requisitionList/components';\nimport { RequisitionListForm } from '@/requisitionList/containers';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ChevronDown, List } from '@adobe-commerce/elsie/icons';\nimport { JSX } from 'preact';\nimport '@/requisitionList/containers/RequisitionListSelector/RequisitionListSelector.css';\nimport {\n useRequisitionLists,\n useRequisitionListAlert,\n useRequisitionListEnabled,\n} from '@/requisitionList/hooks';\n\nexport interface RequisitionListSelectorProps\n extends HTMLAttributes<HTMLDivElement> {\n canCreate?: boolean;\n sku: string;\n selectedOptions?: string[];\n quantity?: number;\n beforeAddProdToReqList?: () => Promise<void> | void;\n}\n\nexport const RequisitionListSelector: Container<\n RequisitionListSelectorProps\n> = ({\n canCreate = true,\n sku,\n selectedOptions,\n quantity = 1,\n beforeAddProdToReqList,\n}: RequisitionListSelectorProps) => {\n const translations = useText({\n createTitle: `RequisitionList.RequisitionListForm.createTitle`,\n addToRequisitionList: `RequisitionList.RequisitionListForm.addToRequisitionList`,\n emptyList: `RequisitionList.RequisitionListWrapper.emptyList`,\n addToNewRequisitionList: `RequisitionList.RequisitionListSelector.addToNewRequisitionList`,\n addToSelected: `RequisitionList.RequisitionListSelector.addToSelected`,\n });\n const [isAdding, setIsAdding] = useState(false);\n const [selectedReqListUid, setSelectedReqListUid] = useState<string | null>(\n null\n );\n const { lists } = useRequisitionLists();\n const { isEnabled } = useRequisitionListEnabled();\n\n const { alert, setAlert, handleRequisitionListAlert } =\n useRequisitionListAlert();\n\n const [modal, setModal] = useState<{\n isOpen: boolean;\n isLoading: boolean;\n }>({\n isOpen: false,\n isLoading: false,\n });\n\n const handleOpenModal = useCallback(() => {\n setModal({ isOpen: true, isLoading: false });\n }, []);\n\n const handleCloseModal = useCallback(() => {\n setModal({ isOpen: false, isLoading: false });\n setSelectedReqListUid(null);\n setIsAdding(false);\n setAlert(null);\n }, [setAlert]);\n\n const handleAddProdToReqList = useCallback(\n async (requisitionListUid: string) => {\n try {\n // Build the object dynamically, omitting selected_options if not present\n const itemToAdd = {\n sku,\n quantity,\n ...(selectedOptions && selectedOptions.length > 0\n ? { selected_options: selectedOptions }\n : {}),\n };\n\n await addProductsToRequisitionList(requisitionListUid, [itemToAdd]);\n } catch (error) {\n console.error('Error adding product to list:', error);\n throw error;\n }\n },\n [sku, quantity, selectedOptions]\n );\n\n const handleAddProductAndEmitAlert = useCallback(\n async (requisitionListUid: string) => {\n try {\n await handleAddProdToReqList(requisitionListUid);\n\n handleRequisitionListAlert({\n action: 'add',\n type: 'success',\n context: 'product',\n skus: [sku],\n });\n } catch {\n handleRequisitionListAlert({\n action: 'add',\n type: 'error',\n context: 'product',\n skus: [sku],\n });\n } finally {\n setTimeout(() => {\n handleCloseModal();\n }, 2000);\n }\n },\n [sku, handleAddProdToReqList, handleCloseModal, handleRequisitionListAlert]\n );\n\n const handleSubmit = useCallback(\n (event: JSX.TargetedEvent<HTMLFormElement, SubmitEvent>) => {\n event.preventDefault();\n if (!selectedReqListUid) return;\n handleAddProductAndEmitAlert(selectedReqListUid);\n },\n [selectedReqListUid, handleAddProductAndEmitAlert]\n );\n\n const handleOpenModalWithValidation = useCallback(() => {\n if (!beforeAddProdToReqList) {\n handleOpenModal();\n return;\n }\n\n Promise.resolve(beforeAddProdToReqList())\n .then(() => {\n handleOpenModal();\n })\n .catch(() => {\n // Validation failed - don't open modal\n });\n }, [beforeAddProdToReqList, handleOpenModal]);\n\n const reqListOptions = useMemo(\n () => [\n ...(lists?.map((reqList: RequisitionList) => ({\n value: reqList.uid,\n text: reqList.name,\n })) ?? []),\n ],\n [lists]\n );\n\n const availableReqLists = useMemo(\n () => (\n <div className=\"requisition-list-selector__available-lists\">\n {reqListOptions.map((option: { value: string; text: string }) => (\n <Card\n variant={\n selectedReqListUid === option.value ? 'primary' : 'secondary'\n }\n key={option.value}\n onClick={() => {\n setSelectedReqListUid(option.value);\n }}\n >\n <Icon source={List} />\n <span>{option.text}</span>\n </Card>\n ))}\n </div>\n ),\n [reqListOptions, selectedReqListUid]\n );\n\n const selectReqListSection =\n reqListOptions.length > 0 ? (\n isAdding ? (\n <button\n type=\"button\"\n aria-label=\"Select a requisition list\"\n role=\"button\"\n className=\"requisition-list-actions\"\n data-testid=\"requisition-list-actions-button\"\n onClick={() => setIsAdding(false)}\n >\n <span\n className=\"requisition-list-actions__title\"\n data-testid=\"requisition-list-actions-button-text\"\n >\n {translations.addToRequisitionList}\n </span>\n <Icon source={ChevronDown} size=\"32\" />\n </button>\n ) : (\n <Card variant=\"secondary\">\n <form\n onSubmit={handleSubmit}\n className=\"requisition-list-selector__form\"\n >\n {availableReqLists}\n <div className=\"requisition-list-form__actions\">\n <Button type=\"submit\" disabled={!selectedReqListUid}>\n {translations.addToSelected}\n </Button>\n </div>\n </form>\n </Card>\n )\n ) : (\n <EmptyList textContent={translations.emptyList} />\n );\n\n const createReqListSection = !isAdding ? (\n <RequisitionListActions\n onAddNew={() => {\n setIsAdding(true);\n }}\n />\n ) : (\n <Card variant=\"secondary\">\n <RequisitionListForm\n mode=\"create\"\n onSuccess={async (newList: RequisitionList) => {\n await handleAddProductAndEmitAlert(newList.uid);\n }}\n onError={() => {\n handleRequisitionListAlert({\n action: 'add',\n type: 'error',\n context: 'product',\n skus: [sku],\n });\n }}\n onCancel={() => {\n setIsAdding(false);\n }}\n />\n </Card>\n );\n\n const modalContent = (\n <>\n {alert && (\n <div className=\"requisition-list__alert-wrapper\">\n <InLineAlert\n key={`requisition-list-selector__alert__${sku}`}\n id={`requisition-list-selector__alert__${sku}`}\n heading={alert.description}\n type={alert.type}\n variant=\"primary\"\n className=\"requisition-list-selector__alert\"\n />\n </div>\n )}\n {!alert && (\n <>\n {selectReqListSection}\n {canCreate && createReqListSection}\n </>\n )}\n </>\n );\n\n // Early return after all hooks have been called\n if (isEnabled === null || !isEnabled) {\n return null;\n }\n\n return (\n <div className=\"requisition-list-selector\">\n <Button\n aria-label={translations.addToRequisitionList}\n data-testid=\"requisition-list-selector\"\n size=\"medium\"\n variant=\"tertiary\"\n icon={<Icon source={List} />}\n onClick={handleOpenModalWithValidation}\n />\n {modal.isOpen && (\n <RequisitionListModal\n isOpen\n isLoading={modal.isLoading}\n title={translations.addToRequisitionList}\n modalContent={modalContent}\n handleModalOnClose={handleCloseModal}\n />\n )}\n </div>\n );\n};\n"],"names":["ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION","REQUISITION_LIST_ITEMS_FRAGMENT","REQUISITION_LIST_FRAGMENT","addProductsToRequisitionList","requisitionListUid","requisitionListItems","cleanedItems","item","cleaned","errors","data","fetchGraphQl","handleFetchError","_a","payload","transformRequisitionList","events","SvgChevronDown","props","React","updateCounter","useRequisitionLists","lists","setLists","useState","state","loading","setLoading","lastUpdate","setLastUpdate","useEffect","setRequisitionListsLoading","getRequisitionLists","res","newLists","setRequisitionLists","error","multiListListener","singleListListener","updateRequisitionList","RequisitionListSelector","canCreate","sku","selectedOptions","quantity","beforeAddProdToReqList","translations","useText","isAdding","setIsAdding","selectedReqListUid","setSelectedReqListUid","isEnabled","useRequisitionListEnabled","alert","setAlert","handleRequisitionListAlert","useRequisitionListAlert","modal","setModal","handleOpenModal","useCallback","handleCloseModal","handleAddProdToReqList","itemToAdd","handleAddProductAndEmitAlert","handleSubmit","event","handleOpenModalWithValidation","reqListOptions","useMemo","reqList","availableReqLists","option","jsxs","Card","jsx","Icon","List","selectReqListSection","ChevronDown","Button","EmptyList","createReqListSection","RequisitionListForm","newList","RequisitionListActions","modalContent","Fragment","InLineAlert","RequisitionListModal"],"mappings":"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","x_google_ignoreList":[2]}
|
|
1
|
+
{"version":3,"file":"RequisitionListSelector.js","sources":["/@dropins/storefront-requisition-list/src/api/addProductsToRequisitionList/graphql/addProductsToRequisitionList.ts","/@dropins/storefront-requisition-list/src/api/addProductsToRequisitionList/addProductsToRequisitionList.ts","../../node_modules/@adobe-commerce/elsie/src/icons/ChevronDown.svg","/@dropins/storefront-requisition-list/src/hooks/useRequisitionLists.ts","/@dropins/storefront-requisition-list/src/containers/RequisitionListSelector/RequisitionListSelector.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { REQUISITION_LIST_FRAGMENT } from '@/requisitionList/api/fragments/RequisitionListFragment.graphql';\nimport { REQUISITION_LIST_ITEMS_FRAGMENT } from '@/requisitionList/api/fragments/RequisitionListItemsFragment.graphql';\n\nexport const ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION = `\n mutation ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION(\n $requisitionListUid: ID!, \n $requisitionListItems: [RequisitionListItemsInput!]!\n ) {\n addProductsToRequisitionList(\n requisitionListUid: $requisitionListUid\n requisitionListItems: $requisitionListItems\n ) {\n requisition_list {\n ...REQUISITION_LIST_FRAGMENT\n items {\n ...REQUISITION_LIST_ITEMS_FRAGMENT\n }\n }\n }\n }\n${REQUISITION_LIST_ITEMS_FRAGMENT}\n${REQUISITION_LIST_FRAGMENT}\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { RequisitionList } from '@/requisitionList/data/models/requisitionList';\nimport { fetchGraphQl } from '@/requisitionList/api';\nimport { ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION } from '@/requisitionList/api/addProductsToRequisitionList/graphql/addProductsToRequisitionList';\nimport { handleFetchError } from '@/requisitionList/lib/fetch-error';\nimport { transformRequisitionList } from '@/requisitionList/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\n\n// Correct type for GraphQL RequisitionListItemsInput\nexport type RequisitionListItemsInput = {\n sku: string;\n quantity: number;\n parent_sku?: string;\n selected_options?: string[];\n entered_options?: Array<{ uid: string; value: string }>;\n};\n\nexport const addProductsToRequisitionList = async (\n requisitionListUid: string,\n requisitionListItems: Array<RequisitionListItemsInput>\n): Promise<RequisitionList | null> => {\n // Clean items before performing the mutation - remove empty fields\n const cleanedItems = requisitionListItems.map((item) => {\n const cleaned: any = {\n sku: item.sku,\n quantity: item.quantity,\n };\n\n if (item.parent_sku) cleaned.parent_sku = item.parent_sku;\n if (item.selected_options && item.selected_options.length > 0) {\n cleaned.selected_options = item.selected_options;\n }\n if (item.entered_options && item.entered_options.length > 0) {\n cleaned.entered_options = item.entered_options;\n }\n\n return cleaned;\n });\n\n const { errors, data } = await fetchGraphQl(\n ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION,\n {\n variables: {\n requisitionListUid,\n requisitionListItems: cleanedItems,\n },\n }\n );\n\n if (errors) return handleFetchError(errors);\n\n if (!data?.addProductsToRequisitionList?.requisition_list) {\n return null;\n }\n\n const payload = transformRequisitionList(\n data.addProductsToRequisitionList.requisition_list\n );\n events.emit('requisitionList/data', payload);\n return payload;\n};\n","import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useEffect, useState } from 'preact/compat';\nimport {\n state,\n setRequisitionLists,\n setRequisitionListsLoading,\n updateRequisitionList,\n} from '@/requisitionList/lib/state';\nimport { getRequisitionLists } from '@/requisitionList/api';\nimport { RequisitionList } from '@/requisitionList/data/models/requisitionList';\nimport { events } from '@adobe-commerce/event-bus';\n\nlet updateCounter = 0; // Counter to track updates across all hooks\n\nexport const useRequisitionLists = () => {\n const [lists, setLists] = useState<RequisitionList[]>(state.requisitionLists);\n const [loading, setLoading] = useState(state.requisitionListsLoading);\n const [lastUpdate, setLastUpdate] = useState(updateCounter);\n\n // Fetch lists if empty on mount\n useEffect(() => {\n if (state.requisitionLists.length === 0 && !state.requisitionListsLoading) {\n setRequisitionListsLoading(true);\n getRequisitionLists(1, 100)\n .then((res: { items: RequisitionList[] }) => {\n const newLists = res?.items || [];\n setRequisitionLists(newLists);\n updateCounter++;\n })\n .catch((error: any) => {\n console.error('Error fetching requisition lists:', error);\n setRequisitionLists([]);\n updateCounter++;\n })\n .finally(() => {\n setRequisitionListsLoading(false);\n });\n }\n }, []);\n\n // Listen to event bus updates\n useEffect(() => {\n const multiListListener = events.on(\n 'requisitionLists/data',\n (payload: RequisitionList[] | null) => {\n if (payload) {\n setRequisitionLists(payload);\n updateCounter++;\n setLastUpdate(updateCounter);\n setLists(state.requisitionLists);\n setLoading(state.requisitionListsLoading);\n }\n }\n );\n\n const singleListListener = events.on(\n 'requisitionList/data',\n (payload: RequisitionList | null) => {\n if (!payload) return;\n\n // Only the FIRST hook instance to receive this should update\n // Use the updateRequisitionList helper which handles both add and update\n updateRequisitionList(payload);\n updateCounter++;\n setLastUpdate(updateCounter);\n setLists([...state.requisitionLists]);\n setLoading(state.requisitionListsLoading);\n }\n );\n\n return () => {\n multiListListener?.off();\n singleListListener?.off();\n };\n }, []);\n\n // Sync with global state when it changes\n useEffect(() => {\n if (lastUpdate !== updateCounter) {\n setLists(state.requisitionLists);\n setLoading(state.requisitionListsLoading);\n setLastUpdate(updateCounter);\n }\n }, [lastUpdate]);\n\n return { lists, loading };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useCallback, useMemo, useState } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { RequisitionList } from '../../data/models/requisitionList.js';\nimport {\n Button,\n Card,\n Icon,\n InLineAlert,\n} from '@adobe-commerce/elsie/components';\nimport { addProductsToRequisitionList } from '@/requisitionList/api/addProductsToRequisitionList/addProductsToRequisitionList';\nimport {\n EmptyList,\n RequisitionListModal,\n RequisitionListActions,\n} from '@/requisitionList/components';\nimport { RequisitionListForm } from '@/requisitionList/containers';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ChevronDown, List } from '@adobe-commerce/elsie/icons';\nimport { JSX } from 'preact';\nimport '@/requisitionList/containers/RequisitionListSelector/RequisitionListSelector.css';\nimport {\n useRequisitionLists,\n useRequisitionListAlert,\n useRequisitionListEnabled,\n} from '@/requisitionList/hooks';\n\nexport interface RequisitionListSelectorProps\n extends HTMLAttributes<HTMLDivElement> {\n canCreate?: boolean;\n sku: string;\n selectedOptions?: string[];\n quantity?: number;\n beforeAddProdToReqList?: () => Promise<void> | void;\n}\n\nexport const RequisitionListSelector: Container<\n RequisitionListSelectorProps\n> = ({\n canCreate = true,\n sku,\n selectedOptions,\n quantity = 1,\n beforeAddProdToReqList,\n}: RequisitionListSelectorProps) => {\n const translations = useText({\n createTitle: `RequisitionList.RequisitionListForm.createTitle`,\n addToRequisitionList: `RequisitionList.RequisitionListForm.addToRequisitionList`,\n emptyList: `RequisitionList.RequisitionListWrapper.emptyList`,\n addToNewRequisitionList: `RequisitionList.RequisitionListSelector.addToNewRequisitionList`,\n addToSelected: `RequisitionList.RequisitionListSelector.addToSelected`,\n });\n const [isAdding, setIsAdding] = useState(false);\n const [selectedReqListUid, setSelectedReqListUid] = useState<string | null>(\n null\n );\n const { lists } = useRequisitionLists();\n const { isEnabled } = useRequisitionListEnabled();\n\n const { alert, setAlert, handleRequisitionListAlert } =\n useRequisitionListAlert();\n\n const [modal, setModal] = useState<{\n isOpen: boolean;\n isLoading: boolean;\n }>({\n isOpen: false,\n isLoading: false,\n });\n\n const handleOpenModal = useCallback(() => {\n setModal({ isOpen: true, isLoading: false });\n }, []);\n\n const handleCloseModal = useCallback(() => {\n setModal({ isOpen: false, isLoading: false });\n setSelectedReqListUid(null);\n setIsAdding(false);\n setAlert(null);\n }, [setAlert]);\n\n const handleAddProdToReqList = useCallback(\n async (requisitionListUid: string) => {\n try {\n // Build the object dynamically, omitting selected_options if not present\n const itemToAdd = {\n sku,\n quantity,\n ...(selectedOptions && selectedOptions.length > 0\n ? { selected_options: selectedOptions }\n : {}),\n };\n\n await addProductsToRequisitionList(requisitionListUid, [itemToAdd]);\n } catch (error) {\n console.error('Error adding product to list:', error);\n throw error;\n }\n },\n [sku, quantity, selectedOptions]\n );\n\n const handleAddProductAndEmitAlert = useCallback(\n async (requisitionListUid: string) => {\n try {\n await handleAddProdToReqList(requisitionListUid);\n\n handleRequisitionListAlert({\n action: 'add',\n type: 'success',\n context: 'product',\n skus: [sku],\n });\n } catch {\n handleRequisitionListAlert({\n action: 'add',\n type: 'error',\n context: 'product',\n skus: [sku],\n });\n } finally {\n setTimeout(() => {\n handleCloseModal();\n }, 2000);\n }\n },\n [sku, handleAddProdToReqList, handleCloseModal, handleRequisitionListAlert]\n );\n\n const handleSubmit = useCallback(\n (event: JSX.TargetedEvent<HTMLFormElement, SubmitEvent>) => {\n event.preventDefault();\n if (!selectedReqListUid) return;\n handleAddProductAndEmitAlert(selectedReqListUid);\n },\n [selectedReqListUid, handleAddProductAndEmitAlert]\n );\n\n const handleOpenModalWithValidation = useCallback(() => {\n if (!beforeAddProdToReqList) {\n handleOpenModal();\n return;\n }\n\n Promise.resolve(beforeAddProdToReqList())\n .then(() => {\n handleOpenModal();\n })\n .catch(() => {\n // Validation failed - don't open modal\n });\n }, [beforeAddProdToReqList, handleOpenModal]);\n\n const reqListOptions = useMemo(\n () => [\n ...(lists?.map((reqList: RequisitionList) => ({\n value: reqList.uid,\n text: reqList.name,\n })) ?? []),\n ],\n [lists]\n );\n\n const availableReqLists = useMemo(\n () => (\n <div className=\"requisition-list-selector__available-lists\">\n {reqListOptions.map((option: { value: string; text: string }) => (\n <Card\n variant={\n selectedReqListUid === option.value ? 'primary' : 'secondary'\n }\n key={option.value}\n onClick={() => {\n setSelectedReqListUid(option.value);\n }}\n >\n <Icon source={List} />\n <span>{option.text}</span>\n </Card>\n ))}\n </div>\n ),\n [reqListOptions, selectedReqListUid]\n );\n\n const selectReqListSection =\n reqListOptions.length > 0 ? (\n isAdding ? (\n <button\n type=\"button\"\n aria-label=\"Select a requisition list\"\n role=\"button\"\n className=\"requisition-list-actions\"\n data-testid=\"requisition-list-actions-button\"\n onClick={() => setIsAdding(false)}\n >\n <span\n className=\"requisition-list-actions__title\"\n data-testid=\"requisition-list-actions-button-text\"\n >\n {translations.addToRequisitionList}\n </span>\n <Icon source={ChevronDown} size=\"32\" />\n </button>\n ) : (\n <Card variant=\"secondary\">\n <form\n onSubmit={handleSubmit}\n className=\"requisition-list-selector__form\"\n >\n {availableReqLists}\n <div className=\"requisition-list-form__actions\">\n <Button type=\"submit\" disabled={!selectedReqListUid}>\n {translations.addToSelected}\n </Button>\n </div>\n </form>\n </Card>\n )\n ) : (\n <EmptyList textContent={translations.emptyList} />\n );\n\n const createReqListSection = !isAdding ? (\n <RequisitionListActions\n onAddNew={() => {\n setIsAdding(true);\n }}\n />\n ) : (\n <Card variant=\"secondary\">\n <RequisitionListForm\n mode=\"create\"\n onSuccess={async (newList: RequisitionList) => {\n await handleAddProductAndEmitAlert(newList.uid);\n }}\n onError={() => {\n handleRequisitionListAlert({\n action: 'add',\n type: 'error',\n context: 'product',\n skus: [sku],\n });\n }}\n onCancel={() => {\n setIsAdding(false);\n }}\n />\n </Card>\n );\n\n const modalContent = (\n <>\n {alert && (\n <div className=\"requisition-list__alert-wrapper\">\n <InLineAlert\n key={`requisition-list-selector__alert__${sku}`}\n id={`requisition-list-selector__alert__${sku}`}\n heading={alert.description}\n type={alert.type}\n variant=\"primary\"\n className=\"requisition-list-selector__alert\"\n />\n </div>\n )}\n {!alert && (\n <>\n {selectReqListSection}\n {canCreate && createReqListSection}\n </>\n )}\n </>\n );\n\n // Early return after all hooks have been called\n if (isEnabled === null || !isEnabled) {\n return null;\n }\n\n return (\n <div className=\"requisition-list-selector\">\n <Button\n aria-label={translations.addToRequisitionList}\n data-testid=\"requisition-list-selector\"\n size=\"medium\"\n variant=\"tertiary\"\n icon={<Icon source={List} />}\n onClick={handleOpenModalWithValidation}\n />\n {modal.isOpen && (\n <RequisitionListModal\n isOpen\n isLoading={modal.isLoading}\n title={translations.addToRequisitionList}\n modalContent={modalContent}\n handleModalOnClose={handleCloseModal}\n />\n )}\n </div>\n );\n};\n"],"names":["ADD_PRODUCTS_TO_REQUISITION_LIST_MUTATION","REQUISITION_LIST_ITEMS_FRAGMENT","REQUISITION_LIST_FRAGMENT","addProductsToRequisitionList","requisitionListUid","requisitionListItems","cleanedItems","item","cleaned","errors","data","fetchGraphQl","handleFetchError","_a","payload","transformRequisitionList","events","SvgChevronDown","props","React","updateCounter","useRequisitionLists","lists","setLists","useState","state","loading","setLoading","lastUpdate","setLastUpdate","useEffect","setRequisitionListsLoading","getRequisitionLists","res","newLists","setRequisitionLists","error","multiListListener","singleListListener","updateRequisitionList","RequisitionListSelector","canCreate","sku","selectedOptions","quantity","beforeAddProdToReqList","translations","useText","isAdding","setIsAdding","selectedReqListUid","setSelectedReqListUid","isEnabled","useRequisitionListEnabled","alert","setAlert","handleRequisitionListAlert","useRequisitionListAlert","modal","setModal","handleOpenModal","useCallback","handleCloseModal","handleAddProdToReqList","itemToAdd","handleAddProductAndEmitAlert","handleSubmit","event","handleOpenModalWithValidation","reqListOptions","useMemo","reqList","availableReqLists","option","jsxs","Card","jsx","Icon","List","selectReqListSection","ChevronDown","Button","EmptyList","createReqListSection","RequisitionListForm","newList","RequisitionListActions","modalContent","Fragment","InLineAlert","RequisitionListModal"],"mappings":"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","x_google_ignoreList":[2]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as y,jsx as n,Fragment as qt}from"@dropins/tools/preact-jsx-runtime.js";import*as f from"@dropins/tools/preact-compat.js";import{useState as N,useEffect as rt,useCallback as x}from"@dropins/tools/preact-compat.js";import{a as Rt,d as Ct,u as It,g as ct,i as St}from"../chunks/addRequisitionListItemsToCart.js";import{Button as pt,Icon as st,Price as bt,Field as At,Input as Nt,Image as Tt,Checkbox as Et,Table as xt,ProgressSpinner as Vt,InLineAlert as Mt,Pagination as Pt}from"@dropins/tools/components.js";import{events as j}from"@dropins/tools/event-bus.js";import{useState as ot,useCallback as ut}from"@dropins/tools/preact-hooks.js";import{VComponent as Dt,classes as Ht}from"@dropins/tools/lib.js";import{D as dt}from"../chunks/RequisitionListForm.js";import{a as $t,u as Ft,E as Bt}from"../chunks/RequisitionListView.js";import{h as zt}from"@dropins/tools/preact.js";import{useText as gt}from"@dropins/tools/i18n.js";import{R as Wt}from"../chunks/RequisitionListHeader.js";import"../chunks/state.js";import{R as Ot}from"../chunks/RequisitionListModal.js";import{N as wt,P as Qt,a as jt}from"../chunks/PaginationItemsCounter.js";import"../chunks/updateRequisitionList.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/deleteRequisitionList.js";const Zt=c=>f.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c},f.createElement("g",{clipPath:"url(#clip0_102_196)"},f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3601 18.16H6.5601L4.8801 3H2.3501M19.6701 19.59C19.6701 20.3687 19.0388 21 18.2601 21C17.4814 21 16.8501 20.3687 16.8501 19.59C16.8501 18.8113 17.4814 18.18 18.2601 18.18C19.0388 18.18 19.6701 18.8113 19.6701 19.59ZM7.42986 19.59C7.42986 20.3687 6.79858 21 6.01986 21C5.24114 21 4.60986 20.3687 4.60986 19.59C4.60986 18.8113 5.24114 18.18 6.01986 18.18C6.79858 18.18 7.42986 18.8113 7.42986 19.59Z",stroke:"currentColor",strokeLinejoin:"round"}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M5.25 6.37L20.89 8.06L20.14 14.8H6.19",stroke:"currentColor",strokeLinejoin:"round"})),f.createElement("defs",null,f.createElement("clipPath",{id:"clip0_102_196"},f.createElement("rect",{vectorEffect:"non-scaling-stroke",width:19.29,height:19.5,fill:"white",transform:"translate(2.3501 2.25)"})))),Kt=c=>f.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c},f.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),kt=c=>f.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...c},f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M1 5H23",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M17.3674 22H6.63446C5.67952 22 4.88992 21.2688 4.8379 20.3338L4 5H20L19.1621 20.3338C19.1119 21.2688 18.3223 22 17.3655 22H17.3674Z",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M9.87189 2H14.1281C14.6085 2 15 2.39766 15 2.88889V5H9V2.88889C9 2.39912 9.39006 2 9.87189 2Z",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M8.87402 8.58057L9.39348 17.682",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M14.6673 8.58057L14.146 17.682",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}));function Xt(){const[c,V]=ot(null),[v,_]=ot(new Set),P=ut((R,C)=>{_(m=>{const L=new Set(m);return C?L.add(R):L.delete(R),L})},[]),T=ut(()=>{var C;const R=(C=c==null?void 0:c.items)==null?void 0:C.map(m=>m.uid);_(new Set(R))},[c]),d=ut(()=>{_(new Set)},[]);return{currentRequisitionList:c,setCurrentRequisitionList:V,selectedItems:v,setSelectedItems:_,handleItemSelection:P,handleSelectAll:T,handleSelectNone:d}}const Jt=({className:c,items:V,selectedItems:v,currentPage:_,pageSize:P,canEdit:T=!0,handleItemSelection:d,handleUpdateQuantity:R,onAddToCart:C,onDeleteItem:m,...L})=>{const[E,F]=ot({}),[at,B]=ot({}),w=gt({productNameHeader:"RequisitionList.RequisitionListView.productListTable.headers.productName",skuHeader:"RequisitionList.RequisitionListView.productListTable.headers.sku",priceHeader:"RequisitionList.RequisitionListView.productListTable.headers.price",quantityHeader:"RequisitionList.RequisitionListView.productListTable.headers.quantity",subtotalHeader:"RequisitionList.RequisitionListView.productListTable.headers.subtotal",actionsHeader:"RequisitionList.RequisitionListView.productListTable.headers.actions",actionAddToCart:"RequisitionList.RequisitionListView.actionAddToCart",actionDelete:"RequisitionList.RequisitionListView.actionDelete",actionSelect:"RequisitionList.RequisitionListView.actionSelect",itemQuantity:"RequisitionList.RequisitionListView.productListTable.itemQuantity",outOfStock:"RequisitionList.RequisitionListView.productListTable.outOfStock",onlyXLeftInStock:"RequisitionList.RequisitionListView.productListTable.onlyXLeftInStock"}),z=[{label:"#",key:"index"},{label:"item",key:"item"},{label:w.priceHeader,key:"price"},{label:w.quantityHeader,key:"quantity"},{label:w.subtotalHeader,key:"subtotal"}];T&&(z.unshift({label:w.actionSelect,key:"selector"}),z.push({label:w.actionsHeader,key:"actions"}));const J=(t,a)=>{const e=t.target.checked;d(a.uid,e)},W=t=>(_-1)*P+t+1,M=t=>{var a,e;return((a=t.configured_product)==null?void 0:a.name)||((e=t.product)==null?void 0:e.name)||t.sku},Y=t=>{var a,e,u,I,l,S;return(e=(a=t.configured_product)==null?void 0:a.images)!=null&&e.length?((u=t.configured_product.images[0])==null?void 0:u.url)||"":(l=(I=t.product)==null?void 0:I.images)!=null&&l.length&&((S=t.product.images[0])==null?void 0:S.url)||""},D=t=>{var a;return((a=t.product)==null?void 0:a.name)||t.sku},Z=t=>{var a;return(a=t.configured_product)==null?void 0:a.name},G=t=>t.bundle_options?t.bundle_options.map((e,u)=>y("span",{className:"requisition-list-view-product-list-table__product-configurable-name",children:[e.values[0].label," x ",e.values[0].quantity]},e.values[0].label||u)):void 0,K=t=>{var a;return((a=t.configured_product)==null?void 0:a.sku)||t.sku},H=t=>{var a,e,u,I,l,S,A,p;return Array.isArray(t.bundle_options)&&t.bundle_options.length>0?t.bundle_options.reduce((tt,X)=>{var et,it,nt;return tt+(((it=(et=X.values[0])==null?void 0:et.priceV2)==null?void 0:it.value)||0)*(((nt=X.values[0])==null?void 0:nt.quantity)||0)},0):((I=(u=(e=(a=t.configured_product)==null?void 0:a.price)==null?void 0:e.final)==null?void 0:u.amount)==null?void 0:I.value)||((p=(A=(S=(l=t.product)==null?void 0:l.price)==null?void 0:S.final)==null?void 0:A.amount)==null?void 0:p.value)||0},O=t=>{var a,e,u,I,l,S,A,p;return((I=(u=(e=(a=t.configured_product)==null?void 0:a.price)==null?void 0:e.final)==null?void 0:u.amount)==null?void 0:I.currency)||((p=(A=(S=(l=t.product)==null?void 0:l.price)==null?void 0:S.final)==null?void 0:A.amount)==null?void 0:p.currency)},o=t=>H(t)*t.quantity,g=(t,a)=>{const e=+t.target.value;e>0&&!Number.isNaN(t.target.value)&&B(u=>({...u,[a.uid]:e}))},Q=async(t,a)=>{let e=+t.target.value;if(!(e>0&&e!==a.quantity)){B(u=>({...u,[a.uid]:a.quantity}));return}F(u=>({...u,[a.uid]:!0}));try{await R(a.uid,e)}finally{F(u=>({...u,[a.uid]:!1}))}},U=V.map((t,a)=>({selector:n("label",{id:`item-selector-${t.sku}-label`,children:n(Et,{className:"requisition-list-view-product-list-table__checkbox",name:`item-selector-${t.sku}`,"aria-label":`${w.actionSelect} ${D(t)}`,"data-testid":`item-checkbox-${t.sku}`,onChange:e=>J(e,t),value:t.sku,checked:v.has(t.uid)})}),index:n("div",{className:"requisition-list-view-product-list-table__index-container",children:W(a)}),item:y("div",{className:"requisition-list-view-product-list-table__item-container",children:[n(Tt,{className:"requisition-list-view-product-list-table__thumbnail",alt:M(t),src:Y(t)}),y("div",{className:"requisition-list-view-product-list-table__item-details",children:[n("div",{className:"requisition-list-view-product-list-table__product-name",children:D(t)}),t.stock_status==="OUT_OF_STOCK"&&n("div",{className:"requisition-list-view-product-list-table__out-of-stock",children:w.outOfStock}),t.stock_status!=="OUT_OF_STOCK"&&t.only_x_left_in_stock!==null&&t.only_x_left_in_stock<t.quantity&&n("div",{className:"requisition-list-view-product-list-table__low-stock",children:w.onlyXLeftInStock.replace("{count}",String(t.only_x_left_in_stock))}),n("span",{className:"requisition-list-view-product-list-table__product-configurable-name",children:Z(t)}),n("div",{className:"requisition-list-view-product-list-table__sku",children:K(t)}),G(t)]})]}),price:n(bt,{className:"requisition-list-view-product-list-table__price",amount:H(t),currency:O(t)}),quantity:n("span",{className:"requisition-list-view-product-list-table__quantity",children:n(At,{disabled:!!E[t.uid],children:n(Nt,{id:`requisition-list-item-quantity-${t.sku}`,"data-testid":`requisition-list-item-quantity-${t.sku}`,name:"quantity",type:"text","aria-label":`${w.itemQuantity} - ${D(t)}`,value:at[t.uid]??t.quantity,onChange:e=>g(e,t),onBlur:e=>Q(e,t)})})}),subtotal:n(bt,{className:"requisition-list-view-product-list-table__price",amount:o(t),currency:O(t)}),actions:y("div",{className:"requisition-list-view__bulk-actions",children:[n(pt,{type:"button",onClick:()=>C([t.uid]),icon:n(st,{source:Zt}),"aria-label":`${w.actionAddToCart} - ${D(t)}`,"data-testid":"product-list-table-add-to-cart-button"}),n(pt,{type:"button",variant:"secondary",icon:n(st,{source:kt}),onClick:()=>m([t.uid]),"aria-label":`${w.actionDelete} - ${D(t)}`,"data-testid":"product-list-table-delete-button"})]})})),lt=n(xt,{columns:z,rowData:U,"data-testid":"product-list-table",mobileLayout:"stacked"});return n(Dt,{node:zt("div",{}),className:Ht(["requisition-list-view-product-list-table-container",c]),"data-testid":"product-list-table-container",...L,children:lt})},Yt=({selectedItems:c,deletingItemId:V,addingToCartItemId:v,bulkAddingToCart:_,updatingQuantityItemId:P,onSelectAll:T,onSelectNone:d,onBulkAddToCart:R,onBulkDelete:C})=>{const m=gt({statusDeleting:"RequisitionList.RequisitionListView.statusDeleting",actionSelectAll:"RequisitionList.RequisitionListView.actionSelectAll",actionSelectNone:"RequisitionList.RequisitionListView.actionSelectNone",actionAddToCart:"RequisitionList.RequisitionListView.actionAddToCart",actionDeleteSelectedItems:"RequisitionList.RequisitionListView.actionDeleteSelectedItems",statusBulkAddingToCart:"RequisitionList.RequisitionListView.statusBulkAddingToCart"}),L=V!==null||v!==null||_||P!==null,E=c.size>0;return y("div",{className:"requisition-list-view__batch-actions",children:[y("div",{className:"requisition-list-view__batch-actions-left",children:[n("button",{"data-testid":"bulk-actions-select-toggle-btn",type:"button",className:`requisition-list-view__batch-actions-select-toggle ${E?"requisition-list-view__batch-actions-select-toggle--active":""}`,onClick:E?d:T,disabled:L,"aria-label":E?m.actionSelectNone:m.actionSelectAll,children:n(st,{source:Kt})}),n("button",{type:"button",className:"requisition-list-view__batch-actions-select-label",onClick:E?d:T,disabled:L,children:m.actionSelectAll})]}),E&&y("div",{className:"requisition-list-view__batch-actions-buttons",children:[n("span",{className:"requisition-list-view__batch-actions-count-badge","aria-label":`${c.size} items selected`,children:c.size}),n(pt,{"data-testid":"bulk-actions-add-to-cart-btn",type:"button",variant:"secondary",onClick:R,disabled:L,children:_?m.statusBulkAddingToCart:m.actionAddToCart}),n("button",{"data-testid":"bulk-actions-delete-btn",type:"button",className:"requisition-list-view__batch-actions-delete-icon",onClick:C,disabled:L,"aria-label":m.actionDeleteSelectedItems,children:n(st,{source:kt})})]})]})},fe=({requisitionListUid:c,skipProductLoading:V=!1,pageSize:v=dt,routeRequisitionListGrid:_,fallbackRoute:P="/customer/account",getProductData:T,enrichConfigurableProducts:d})=>{var mt,ht,ft,_t,Lt;const[R,C]=N(!1),[m,L]=N(null),[E,F]=N(null),[at,B]=N(!1),[w,z]=N(null),[J,W]=N(!1),[M,Y]=N(v),[D,Z]=N(!0),[G,K]=N(!1),[H,O]=N([]),{currentRequisitionList:o,setCurrentRequisitionList:g,selectedItems:Q,setSelectedItems:U,handleItemSelection:lt,handleSelectAll:t,handleSelectNone:a}=Xt(),e=gt({emptyRequisitionList:"RequisitionList.RequisitionListView.emptyRequisitionList",errorLoadingProducts:"RequisitionList.RequisitionListView.errorLoadingProducts",errorLoadPage:"RequisitionList.RequisitionListView.errorLoadPage",notFoundTitle:"RequisitionList.RequisitionListView.notFoundTitle",notFoundMessage:"RequisitionList.RequisitionListView.notFoundMessage",notFoundActionLabel:"RequisitionList.RequisitionListView.notFoundActionLabel",notEnabledTitle:"RequisitionList.RequisitionListsNotEnabled.title",notEnabledMessage:"RequisitionList.RequisitionListsNotEnabled.message",partialMoveSuccess:"RequisitionList.RequisitionListAlert.partialMoveSuccess",notEnabledActionLabel:"RequisitionList.RequisitionListsNotEnabled.actionLabel",show:"RequisitionList.PageSizePicker.show",deleteItemsTitle:"RequisitionList.RequisitionListView.deleteItemsTitle",deleteItemsMessage:"RequisitionList.RequisitionListView.deleteItemsMessage",confirmAction:"RequisitionList.RequisitionListView.confirmAction",cancelAction:"RequisitionList.RequisitionListView.cancelAction"}),{alert:u,setAlert:I,handleRequisitionListAlert:l}=$t(),{isEnabled:S}=Ft();rt(()=>{const i=j.on("requisitionList/data",r=>{(r==null?void 0:r.uid)===c&&(g(r),U(new Set))}),s=j.on("requisitionList/alert",l);return()=>{i==null||i.off(),s==null||s.off()}},[l,c,g,U]),rt(()=>{Y(v)},[v]);const A=x(async i=>{var r;if(!((r=i.items)!=null&&r.length))return i;const s=await d(i.items);return{...i,items:s}},[d]),p=x(async i=>{var r,h;const s=((r=i.items)==null?void 0:r.map(k=>k.sku))||[];if(s.length===0)return i;C(!0);try{const k=await T(s);if(k){const q=new Map;return k.forEach(b=>{q.set(b.sku,b)}),{...i,items:(h=i.items)==null?void 0:h.map(b=>{const $=q.get(b.sku);return{...b,product:$||b.product,stock_status:b.stock_status||($==null?void 0:$.stock_status)||"IN_STOCK",only_x_left_in_stock:b.only_x_left_in_stock??($==null?void 0:$.only_x_left_in_stock)??null}})}}return console.warn("No products found"),i}catch(k){return console.warn(k instanceof Error?k.message:e.errorLoadingProducts),i}finally{C(!1)}},[T,e.errorLoadingProducts]);rt(()=>{if(!c){Z(!1);return}if(o&&o.uid===c)return;Z(!0),(async()=>{try{const s=await ct(c,1,v,d);if(s)if(V)g(s);else{const r=await p(s);g(r)}}catch(s){console.error("Failed to initialize requisition list from UID:",s)}finally{Z(!1)}})()},[c,v,V,d,p,g,o]);const tt=x(async i=>{i&&i.length===1?(B(!1),F(i)):(B(!0),F(null));try{const s=await Rt(o.uid,i),r=(i==null?void 0:i.length)||0,h=(s==null?void 0:s.length)||0,k=r-h;if(s&&s.length>0&&k>0){const q={action:"move",type:"error",context:"product",message:[e.partialMoveSuccess.replace("{successCount}",String(k)).replace("{failedCount}",String(h))]};l(q),j.emit("requisitionList/alert",q)}else if(s&&s.length>0){const q={action:"move",type:"error",context:"product",message:s.map(b=>b.message)};l(q),j.emit("requisitionList/alert",q)}else{const q={action:"move",type:"success",context:"product"};l(q),j.emit("requisitionList/alert",q)}}catch{const r={action:"move",type:"error",context:"product"};l(r),j.emit("requisitionList/alert",r)}finally{F(null),B(!1)}},[o,l,e]),X=x(i=>{i&&i.length>0&&(O(i),K(!0))},[]),et=x(async()=>{H.length===1?L(H[0]):L("bulk");try{const i=await Ct(o.uid,H,M,o.page_info.current_page,d);if(i){const s=await A(i),r=await p(s);g(r),l({action:"delete",type:"success",context:"product"})}else l({action:"delete",type:"error",context:"product"})}catch{l({action:"delete",type:"error",context:"product"})}finally{L(null),K(!1),O([])}},[H,o,M,p,g,l,A,d]),it=x(async(i,s)=>{var r;z(i);try{const h=(r=o.items)==null?void 0:r.find(b=>b.uid===i);if(!h){l({action:"update",type:"error",context:"product"});return}const k={item_id:h.uid,entered_options:h.entered_options,selected_options:h.selected_options,quantity:s},q=await It(o.uid,[k],M,o.page_info.current_page,d);if(q){const b=await p(q);g(b),l({action:"update",type:"success",context:"product"})}else l({action:"update",type:"error",context:"product"})}catch{l({action:"update",type:"error",context:"product"})}finally{z(null)}},[o,p,g,M,l,d]),nt=x(async i=>{W(!0);try{const s=await ct(o.uid,i,M,d);if(s){const h=await p(s);g(h)}else console.warn(e.errorLoadPage)}catch(s){console.warn(s instanceof Error?s.message:e.errorLoadPage)}finally{W(!1)}},[o==null?void 0:o.uid,p,M,e,g,d]),yt=x(async i=>{Y(i),W(!0);try{const s=await ct(o.uid,1,i,d);if(s){const h=await p(s);g(h)}else console.warn(e.errorLoadPage)}catch{console.warn(e.errorLoadPage)}finally{W(!1)}},[o==null?void 0:o.uid,p,e,g,d]),vt=x(async i=>{const s=await A(i),r=await p(s);g(r)},[g,p,A]);return y("div",{className:"requisition-list-view__container",children:[D?n("div",{className:"requisition-list-view__loading",children:n(Vt,{stroke:"4",size:"large"})}):S===!1?n(wt,{title:e.notEnabledTitle,message:e.notEnabledMessage,actionLabel:e.notEnabledActionLabel,onAction:()=>{window.location.href=P}}):!o||!St(o==null?void 0:o.uid)?n(wt,{title:e.notFoundTitle,message:e.notFoundMessage,actionLabel:_?e.notFoundActionLabel:void 0,onAction:_?()=>{const i=_();i&&typeof i=="string"&&(window.location.href=i)}:void 0}):y(qt,{children:[n(Wt,{requisitionList:o,routeRequisitionListGrid:_,onUpdate:vt,onAlert:l,enrichConfigurableProducts:d}),u&&n("div",{className:"requisition-list__alert-wrapper",children:n(Mt,{heading:u.description,type:u.type,variant:"primary",onDismiss:()=>I(null)})}),o.items_count===0?n(Bt,{textContent:`${o.name} ${e.emptyRequisitionList}`}):y(qt,{children:[n(Yt,{selectedItems:Q,deletingItemId:m,addingToCartItemId:E,bulkAddingToCart:at,updatingQuantityItemId:w,onSelectAll:t,onSelectNone:a,onBulkAddToCart:()=>tt(Array.from(Q)),onBulkDelete:()=>X(Array.from(Q))}),n(Jt,{items:o.items,selectedItems:Q,currentPage:((mt=o.page_info)==null?void 0:mt.current_page)||1,pageSize:((ht=o.page_info)==null?void 0:ht.page_size)||dt,handleItemSelection:lt,handleUpdateQuantity:it,onAddToCart:tt,onDeleteItem:X}),o.page_info&&y("div",{className:"requisition-list-view__pagination",children:[n(Qt,{pageInfo:o.page_info,totalCount:o.items_count}),(((ft=o.page_info)==null?void 0:ft.total_pages)||0)>1&&n(Pt,{totalPages:o.page_info.total_pages,currentPage:((_t=o.page_info)==null?void 0:_t.current_page)||1,onChange:nt,disabled:J||R}),y("div",{className:"requisition-list-view__pagination-picker",children:[n("span",{children:e.show}),n(jt,{currentPageSize:((Lt=o.page_info)==null?void 0:Lt.page_size)||dt,onPageSizeChange:yt,disabled:J||R})]})]})]})]}),G&&n(Ot,{isOpen:G,isLoading:m!==null,title:e.deleteItemsTitle,modalContent:e.deleteItemsMessage,confirmBtnCaption:e.confirmAction,closeBtnCaption:e.cancelAction,handleModalOnClose:()=>{K(!1),O([])},handleModalOnConfirm:et})]})};export{fe as RequisitionListView,fe as default};
|
|
3
|
+
import{jsxs as y,jsx as n,Fragment as qt}from"@dropins/tools/preact-jsx-runtime.js";import*as f from"@dropins/tools/preact-compat.js";import{useState as N,useEffect as rt,useCallback as x}from"@dropins/tools/preact-compat.js";import{a as Rt,d as Ct,u as It,g as ct,i as St}from"../chunks/addRequisitionListItemsToCart.js";import{Button as pt,Icon as st,Price as bt,Field as At,Input as Nt,Image as Tt,Checkbox as Et,Table as xt,ProgressSpinner as Vt,InLineAlert as Mt,Pagination as Pt}from"@dropins/tools/components.js";import{events as j}from"@dropins/tools/event-bus.js";import{useState as ot,useCallback as ut}from"@dropins/tools/preact-hooks.js";import{VComponent as Dt,classes as Ht}from"@dropins/tools/lib.js";import{D as dt}from"../chunks/RequisitionListForm.js";import{a as $t,u as Ft,E as Bt}from"../chunks/RequisitionListView.js";import{h as zt}from"@dropins/tools/preact.js";import{useText as gt}from"@dropins/tools/i18n.js";import{R as Wt}from"../chunks/RequisitionListHeader.js";import"../chunks/state.js";import{R as Ot}from"../chunks/RequisitionListModal.js";import{N as wt,P as Qt,a as jt}from"../chunks/PaginationItemsCounter.js";import"../chunks/updateRequisitionList.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/deleteRequisitionList.js";const Zt=c=>f.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c},f.createElement("g",{clipPath:"url(#clip0_102_196)"},f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3601 18.16H6.5601L4.8801 3H2.3501M19.6701 19.59C19.6701 20.3687 19.0388 21 18.2601 21C17.4814 21 16.8501 20.3687 16.8501 19.59C16.8501 18.8113 17.4814 18.18 18.2601 18.18C19.0388 18.18 19.6701 18.8113 19.6701 19.59ZM7.42986 19.59C7.42986 20.3687 6.79858 21 6.01986 21C5.24114 21 4.60986 20.3687 4.60986 19.59C4.60986 18.8113 5.24114 18.18 6.01986 18.18C6.79858 18.18 7.42986 18.8113 7.42986 19.59Z",stroke:"currentColor",strokeLinejoin:"round"}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M5.25 6.37L20.89 8.06L20.14 14.8H6.19",stroke:"currentColor",strokeLinejoin:"round"})),f.createElement("defs",null,f.createElement("clipPath",{id:"clip0_102_196"},f.createElement("rect",{vectorEffect:"non-scaling-stroke",width:19.29,height:19.5,fill:"white",transform:"translate(2.3501 2.25)"})))),Kt=c=>f.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c},f.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),kt=c=>f.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...c},f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M1 5H23",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M17.3674 22H6.63446C5.67952 22 4.88992 21.2688 4.8379 20.3338L4 5H20L19.1621 20.3338C19.1119 21.2688 18.3223 22 17.3655 22H17.3674Z",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M9.87189 2H14.1281C14.6085 2 15 2.39766 15 2.88889V5H9V2.88889C9 2.39912 9.39006 2 9.87189 2Z",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M8.87402 8.58057L9.39348 17.682",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}),f.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M14.6673 8.58057L14.146 17.682",stroke:"currentColor",strokeWidth:1,strokeMiterlimit:10}));function Xt(){const[c,V]=ot(null),[v,_]=ot(new Set),P=ut((R,C)=>{_(m=>{const L=new Set(m);return C?L.add(R):L.delete(R),L})},[]),T=ut(()=>{var C;const R=(C=c==null?void 0:c.items)==null?void 0:C.map(m=>m.uid);_(new Set(R))},[c]),d=ut(()=>{_(new Set)},[]);return{currentRequisitionList:c,setCurrentRequisitionList:V,selectedItems:v,setSelectedItems:_,handleItemSelection:P,handleSelectAll:T,handleSelectNone:d}}const Jt=({className:c,items:V,selectedItems:v,currentPage:_,pageSize:P,canEdit:T=!0,handleItemSelection:d,handleUpdateQuantity:R,onAddToCart:C,onDeleteItem:m,...L})=>{const[E,F]=ot({}),[at,B]=ot({}),w=gt({productNameHeader:"RequisitionList.RequisitionListView.productListTable.headers.productName",skuHeader:"RequisitionList.RequisitionListView.productListTable.headers.sku",priceHeader:"RequisitionList.RequisitionListView.productListTable.headers.price",quantityHeader:"RequisitionList.RequisitionListView.productListTable.headers.quantity",subtotalHeader:"RequisitionList.RequisitionListView.productListTable.headers.subtotal",actionsHeader:"RequisitionList.RequisitionListView.productListTable.headers.actions",actionAddToCart:"RequisitionList.RequisitionListView.actionAddToCart",actionDelete:"RequisitionList.RequisitionListView.actionDelete",actionSelect:"RequisitionList.RequisitionListView.actionSelect",itemQuantity:"RequisitionList.RequisitionListView.productListTable.itemQuantity",outOfStock:"RequisitionList.RequisitionListView.productListTable.outOfStock",onlyXLeftInStock:"RequisitionList.RequisitionListView.productListTable.onlyXLeftInStock"}),z=[{label:"#",key:"index"},{label:"item",key:"item"},{label:w.priceHeader,key:"price"},{label:w.quantityHeader,key:"quantity"},{label:w.subtotalHeader,key:"subtotal"}];T&&(z.unshift({label:w.actionSelect,key:"selector"}),z.push({label:w.actionsHeader,key:"actions"}));const J=(t,a)=>{const e=t.target.checked;d(a.uid,e)},W=t=>(_-1)*P+t+1,M=t=>{var a,e;return((a=t.configured_product)==null?void 0:a.name)||((e=t.product)==null?void 0:e.name)||t.sku},Y=t=>{var a,e,u,I,l,S;return(e=(a=t.configured_product)==null?void 0:a.images)!=null&&e.length?((u=t.configured_product.images[0])==null?void 0:u.url)||"":(l=(I=t.product)==null?void 0:I.images)!=null&&l.length&&((S=t.product.images[0])==null?void 0:S.url)||""},D=t=>{var a;return((a=t.product)==null?void 0:a.name)||t.sku},Z=t=>{var a;return(a=t.configured_product)==null?void 0:a.name},G=t=>t.bundle_options?t.bundle_options.map((e,u)=>y("span",{className:"requisition-list-view-product-list-table__product-configurable-name",children:[e.values[0].label," x ",e.values[0].quantity]},e.values[0].label||u)):void 0,K=t=>{var a;return((a=t.configured_product)==null?void 0:a.sku)||t.sku},H=t=>{var a,e,u,I,l,S,A,p;return Array.isArray(t.bundle_options)&&t.bundle_options.length>0?t.bundle_options.reduce((tt,X)=>{var et,it,nt;return tt+(((it=(et=X.values[0])==null?void 0:et.priceV2)==null?void 0:it.value)||0)*(((nt=X.values[0])==null?void 0:nt.quantity)||0)},0):((I=(u=(e=(a=t.configured_product)==null?void 0:a.price)==null?void 0:e.final)==null?void 0:u.amount)==null?void 0:I.value)||((p=(A=(S=(l=t.product)==null?void 0:l.price)==null?void 0:S.final)==null?void 0:A.amount)==null?void 0:p.value)||0},O=t=>{var a,e,u,I,l,S,A,p;return((I=(u=(e=(a=t.configured_product)==null?void 0:a.price)==null?void 0:e.final)==null?void 0:u.amount)==null?void 0:I.currency)||((p=(A=(S=(l=t.product)==null?void 0:l.price)==null?void 0:S.final)==null?void 0:A.amount)==null?void 0:p.currency)},o=t=>H(t)*t.quantity,g=(t,a)=>{const e=+t.target.value;e>0&&!Number.isNaN(t.target.value)&&B(u=>({...u,[a.uid]:e}))},Q=async(t,a)=>{let e=+t.target.value;if(!(e>0&&e!==a.quantity)){B(u=>({...u,[a.uid]:a.quantity}));return}F(u=>({...u,[a.uid]:!0}));try{await R(a.uid,e)}finally{F(u=>({...u,[a.uid]:!1}))}},U=V.map((t,a)=>({selector:n("label",{id:`item-selector-${t.sku}-label`,children:n(Et,{className:"requisition-list-view-product-list-table__checkbox",name:`item-selector-${t.sku}`,"aria-label":`${w.actionSelect} ${D(t)}`,"data-testid":`item-checkbox-${t.sku}`,onChange:e=>J(e,t),value:t.sku,checked:v.has(t.uid)})}),index:n("div",{className:"requisition-list-view-product-list-table__index-container",children:W(a)}),item:y("div",{className:"requisition-list-view-product-list-table__item-container",children:[n(Tt,{className:"requisition-list-view-product-list-table__thumbnail",alt:M(t),src:Y(t)}),y("div",{className:"requisition-list-view-product-list-table__item-details",children:[n("div",{className:"requisition-list-view-product-list-table__product-name",children:D(t)}),t.stock_status==="OUT_OF_STOCK"&&n("div",{className:"requisition-list-view-product-list-table__out-of-stock",children:w.outOfStock}),t.stock_status!=="OUT_OF_STOCK"&&t.only_x_left_in_stock!==null&&t.only_x_left_in_stock<t.quantity&&n("div",{className:"requisition-list-view-product-list-table__low-stock",children:w.onlyXLeftInStock.replace("{count}",String(t.only_x_left_in_stock))}),n("span",{className:"requisition-list-view-product-list-table__product-configurable-name",children:Z(t)}),n("div",{className:"requisition-list-view-product-list-table__sku",children:K(t)}),G(t)]})]}),price:n(bt,{className:"requisition-list-view-product-list-table__price",amount:H(t),currency:O(t)}),quantity:n("span",{className:"requisition-list-view-product-list-table__quantity",children:n(At,{disabled:!!E[t.uid],children:n(Nt,{id:`requisition-list-item-quantity-${t.sku}`,"data-testid":`requisition-list-item-quantity-${t.sku}`,name:"quantity",type:"text","aria-label":`${w.itemQuantity} - ${D(t)}`,value:at[t.uid]??t.quantity,onChange:e=>g(e,t),onBlur:e=>Q(e,t)})})}),subtotal:n(bt,{className:"requisition-list-view-product-list-table__price",amount:o(t),currency:O(t)}),actions:y("div",{className:"requisition-list-view__bulk-actions",children:[n(pt,{type:"button",onClick:()=>C([t.uid]),icon:n(st,{source:Zt}),"aria-label":`${w.actionAddToCart} - ${D(t)}`,"data-testid":"product-list-table-add-to-cart-button"}),n(pt,{type:"button",variant:"secondary",icon:n(st,{source:kt}),onClick:()=>m([t.uid]),"aria-label":`${w.actionDelete} - ${D(t)}`,"data-testid":"product-list-table-delete-button"})]})})),lt=n(xt,{columns:z,rowData:U,"data-testid":"product-list-table",mobileLayout:"stacked"});return n(Dt,{node:zt("div",{}),className:Ht(["requisition-list-view-product-list-table-container",c]),"data-testid":"product-list-table-container",...L,children:lt})},Yt=({selectedItems:c,deletingItemId:V,addingToCartItemId:v,bulkAddingToCart:_,updatingQuantityItemId:P,onSelectAll:T,onSelectNone:d,onBulkAddToCart:R,onBulkDelete:C})=>{const m=gt({statusDeleting:"RequisitionList.RequisitionListView.statusDeleting",actionSelectAll:"RequisitionList.RequisitionListView.actionSelectAll",actionSelectNone:"RequisitionList.RequisitionListView.actionSelectNone",actionAddToCart:"RequisitionList.RequisitionListView.actionAddToCart",actionDeleteSelectedItems:"RequisitionList.RequisitionListView.actionDeleteSelectedItems",statusBulkAddingToCart:"RequisitionList.RequisitionListView.statusBulkAddingToCart"}),L=V!==null||v!==null||_||P!==null,E=c.size>0;return y("div",{className:"requisition-list-view__batch-actions",children:[y("div",{className:"requisition-list-view__batch-actions-left",children:[n("button",{"data-testid":"bulk-actions-select-toggle-btn",type:"button",className:`requisition-list-view__batch-actions-select-toggle ${E?"requisition-list-view__batch-actions-select-toggle--active":""}`,onClick:E?d:T,disabled:L,"aria-label":E?m.actionSelectNone:m.actionSelectAll,children:n(st,{source:Kt})}),n("button",{type:"button",className:"requisition-list-view__batch-actions-select-label",onClick:E?d:T,disabled:L,children:m.actionSelectAll})]}),E&&y("div",{className:"requisition-list-view__batch-actions-buttons",children:[n("span",{className:"requisition-list-view__batch-actions-count-badge","aria-label":`${c.size} items selected`,children:c.size}),n(pt,{"data-testid":"bulk-actions-add-to-cart-btn",type:"button",variant:"secondary",onClick:R,disabled:L,children:_?m.statusBulkAddingToCart:m.actionAddToCart}),n("button",{"data-testid":"bulk-actions-delete-btn",type:"button",className:"requisition-list-view__batch-actions-delete-icon",onClick:C,disabled:L,"aria-label":m.actionDeleteSelectedItems,children:n(st,{source:kt})})]})]})},_e=({requisitionListUid:c,skipProductLoading:V=!1,pageSize:v=dt,routeRequisitionListGrid:_,fallbackRoute:P="/customer/account",getProductData:T,enrichConfigurableProducts:d})=>{var mt,ht,ft,_t,Lt;const[R,C]=N(!1),[m,L]=N(null),[E,F]=N(null),[at,B]=N(!1),[w,z]=N(null),[J,W]=N(!1),[M,Y]=N(v),[D,Z]=N(!0),[G,K]=N(!1),[H,O]=N([]),{currentRequisitionList:o,setCurrentRequisitionList:g,selectedItems:Q,setSelectedItems:U,handleItemSelection:lt,handleSelectAll:t,handleSelectNone:a}=Xt(),e=gt({emptyRequisitionList:"RequisitionList.RequisitionListView.emptyRequisitionList",errorLoadingProducts:"RequisitionList.RequisitionListView.errorLoadingProducts",errorLoadPage:"RequisitionList.RequisitionListView.errorLoadPage",notFoundTitle:"RequisitionList.RequisitionListView.notFoundTitle",notFoundMessage:"RequisitionList.RequisitionListView.notFoundMessage",notFoundActionLabel:"RequisitionList.RequisitionListView.notFoundActionLabel",notEnabledTitle:"RequisitionList.RequisitionListsNotEnabled.title",notEnabledMessage:"RequisitionList.RequisitionListsNotEnabled.message",partialMoveSuccess:"RequisitionList.RequisitionListAlert.partialMoveSuccess",notEnabledActionLabel:"RequisitionList.RequisitionListsNotEnabled.actionLabel",show:"RequisitionList.PageSizePicker.show",deleteItemsTitle:"RequisitionList.RequisitionListView.deleteItemsTitle",deleteItemsMessage:"RequisitionList.RequisitionListView.deleteItemsMessage",confirmAction:"RequisitionList.RequisitionListView.confirmAction",cancelAction:"RequisitionList.RequisitionListView.cancelAction"}),{alert:u,setAlert:I,handleRequisitionListAlert:l}=$t(),{isEnabled:S}=Ft();rt(()=>{const i=j.on("requisitionList/data",r=>{(r==null?void 0:r.uid)===c&&(g(r),U(new Set))}),s=j.on("requisitionList/alert",l);return()=>{i==null||i.off(),s==null||s.off()}},[l,c,g,U]),rt(()=>{Y(v)},[v]);const A=x(async i=>{var r;if(!((r=i.items)!=null&&r.length))return i;const s=await d(i.items);return{...i,items:s}},[d]),p=x(async i=>{var r,h;const s=((r=i.items)==null?void 0:r.map(k=>k.sku))||[];if(s.length===0)return i;C(!0);try{const k=await T(s);if(k){const q=new Map;return k.forEach(b=>{q.set(b.sku,b)}),{...i,items:(h=i.items)==null?void 0:h.map(b=>{const $=q.get(b.sku);return{...b,product:$||b.product,stock_status:b.stock_status||($==null?void 0:$.stock_status)||"IN_STOCK",only_x_left_in_stock:b.only_x_left_in_stock??($==null?void 0:$.only_x_left_in_stock)??null}})}}return console.warn("No products found"),i}catch(k){return console.warn(k instanceof Error?k.message:e.errorLoadingProducts),i}finally{C(!1)}},[T,e.errorLoadingProducts]);rt(()=>{if(!c){Z(!1);return}if(o&&o.uid===c)return;Z(!0),(async()=>{try{const s=await ct(c,1,v,d);if(s)if(V)g(s);else{const r=await p(s);g(r)}}catch(s){console.error("Failed to initialize requisition list from UID:",s)}finally{Z(!1)}})()},[c,v,V,d,p,g,o]);const tt=x(async i=>{i&&i.length===1?(B(!1),F(i)):(B(!0),F(null));try{const s=await Rt(o.uid,i),r=(i==null?void 0:i.length)||0,h=(s==null?void 0:s.length)||0,k=r-h;if(s&&s.length>0&&k>0){const q={action:"move",type:"error",context:"product",message:[e.partialMoveSuccess.replace("{successCount}",String(k)).replace("{failedCount}",String(h))]};l(q),j.emit("requisitionList/alert",q)}else if(s&&s.length>0){const q={action:"move",type:"error",context:"product",message:s.map(b=>b.message)};l(q),j.emit("requisitionList/alert",q)}else{const q={action:"move",type:"success",context:"product"};l(q),j.emit("requisitionList/alert",q)}}catch{const r={action:"move",type:"error",context:"product"};l(r),j.emit("requisitionList/alert",r)}finally{F(null),B(!1)}},[o,l,e]),X=x(i=>{i&&i.length>0&&(O(i),K(!0))},[]),et=x(async()=>{H.length===1?L(H[0]):L("bulk");try{const i=await Ct(o.uid,H,M,o.page_info.current_page,d);if(i){const s=await A(i),r=await p(s);g(r),l({action:"delete",type:"success",context:"product"})}else l({action:"delete",type:"error",context:"product"})}catch{l({action:"delete",type:"error",context:"product"})}finally{L(null),K(!1),O([])}},[H,o,M,p,g,l,A,d]),it=x(async(i,s)=>{var r;z(i);try{const h=(r=o.items)==null?void 0:r.find(b=>b.uid===i);if(!h){l({action:"update",type:"error",context:"product"});return}const k={item_id:h.uid,entered_options:h.entered_options,selected_options:h.selected_options,quantity:s},q=await It(o.uid,[k],M,o.page_info.current_page,d);if(q){const b=await p(q);g(b),l({action:"update",type:"success",context:"product"})}else l({action:"update",type:"error",context:"product"})}catch{l({action:"update",type:"error",context:"product"})}finally{z(null)}},[o,p,g,M,l,d]),nt=x(async i=>{W(!0);try{const s=await ct(o.uid,i,M,d);if(s){const h=await p(s);g(h)}else console.warn(e.errorLoadPage)}catch(s){console.warn(s instanceof Error?s.message:e.errorLoadPage)}finally{W(!1)}},[o==null?void 0:o.uid,p,M,e,g,d]),yt=x(async i=>{Y(i),W(!0);try{const s=await ct(o.uid,1,i,d);if(s){const h=await p(s);g(h)}else console.warn(e.errorLoadPage)}catch{console.warn(e.errorLoadPage)}finally{W(!1)}},[o==null?void 0:o.uid,p,e,g,d]),vt=x(async i=>{const s=await A(i),r=await p(s);g(r)},[g,p,A]);return y("div",{className:"requisition-list-view__container",children:[D?n("div",{className:"requisition-list-view__loading",children:n(Vt,{stroke:"4",size:"large"})}):S===!1?n(wt,{title:e.notEnabledTitle,message:e.notEnabledMessage,actionLabel:e.notEnabledActionLabel,onAction:()=>{window.location.href=P}}):!o||!St(o==null?void 0:o.uid)?n(wt,{title:e.notFoundTitle,message:e.notFoundMessage,actionLabel:_?e.notFoundActionLabel:void 0,onAction:_?()=>{const i=_();i&&typeof i=="string"&&(window.location.href=i)}:void 0}):y(qt,{children:[n(Wt,{requisitionList:o,routeRequisitionListGrid:_,onUpdate:vt,onAlert:l,enrichConfigurableProducts:d}),u&&n("div",{className:"requisition-list__alert-wrapper",children:n(Mt,{heading:u.description,type:u.type,variant:"primary",onDismiss:()=>I(null)})}),o.items_count===0?n(Bt,{textContent:`${o.name} ${e.emptyRequisitionList}`}):y(qt,{children:[n(Yt,{selectedItems:Q,deletingItemId:m,addingToCartItemId:E,bulkAddingToCart:at,updatingQuantityItemId:w,onSelectAll:t,onSelectNone:a,onBulkAddToCart:()=>tt(Array.from(Q)),onBulkDelete:()=>X(Array.from(Q))}),n(Jt,{items:o.items,selectedItems:Q,currentPage:((mt=o.page_info)==null?void 0:mt.current_page)||1,pageSize:((ht=o.page_info)==null?void 0:ht.page_size)||dt,handleItemSelection:lt,handleUpdateQuantity:it,onAddToCart:tt,onDeleteItem:X}),o.page_info&&y("div",{className:"requisition-list-view__pagination",children:[n(Qt,{pageInfo:o.page_info,totalCount:o.items_count}),(((ft=o.page_info)==null?void 0:ft.total_pages)||0)>1&&n(Pt,{totalPages:o.page_info.total_pages,currentPage:((_t=o.page_info)==null?void 0:_t.current_page)||1,onChange:nt,disabled:J||R}),y("div",{className:"requisition-list-view__pagination-picker",children:[n("span",{children:e.show}),n(jt,{currentPageSize:((Lt=o.page_info)==null?void 0:Lt.page_size)||dt,onPageSizeChange:yt,disabled:J||R})]})]})]})]}),G&&n(Ot,{isOpen:G,isLoading:m!==null,title:e.deleteItemsTitle,modalContent:e.deleteItemsMessage,confirmBtnCaption:e.confirmAction,closeBtnCaption:e.cancelAction,handleModalOnClose:()=>{K(!1),O([])},handleModalOnConfirm:et})]})};export{_e as RequisitionListView,_e as default};
|
|
4
4
|
//# sourceMappingURL=RequisitionListView.js.map
|