@dropins/storefront-purchase-order 0.0.4-alpha2 → 0.0.4-alpha3
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/api/graphql/PurchaseOrdersFragment.graphql.d.ts +1 -1
- package/chunks/getPurchaseOrders.js +4 -14
- package/chunks/getPurchaseOrders.js.map +1 -1
- package/containers/ApprovalRuleDetails.js +1 -1
- package/containers/ApprovalRuleDetails.js.map +1 -1
- package/containers/ApprovalRuleForm.js +1 -1
- package/containers/ApprovalRuleForm.js.map +1 -1
- package/i18n/en_US.json.d.ts +1 -1
- package/package.json +1 -1
- package/render.js +2 -2
- package/render.js.map +1 -1
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
* is strictly forbidden unless prior written permission is obtained
|
|
15
15
|
* from Adobe.
|
|
16
16
|
*******************************************************************/
|
|
17
|
-
export declare const PURCHASE_ORDERS_FRAGMENT = "\n fragment PURCHASE_ORDERS_FRAGMENT on PurchaseOrder {\n __typename\n uid\n number\n status\n available_actions\n
|
|
17
|
+
export declare const PURCHASE_ORDERS_FRAGMENT = "\n fragment PURCHASE_ORDERS_FRAGMENT on PurchaseOrder {\n __typename\n uid\n number\n status\n available_actions\n comments {\n created_at\n author {\n firstname\n lastname\n email\n }\n text\n }\n created_at\n updated_at\n created_by {\n firstname\n lastname\n email\n }\n history_log {\n activity\n created_at\n message\n uid\n }\n order {\n number\n }\n quote {\n id\n prices {\n grand_total {\n value\n currency\n }\n }\n itemsV2 {\n items {\n uid\n quantity\n }\n }\n }\n }\n";
|
|
18
18
|
//# sourceMappingURL=PurchaseOrdersFragment.graphql.d.ts.map
|
|
@@ -7,16 +7,6 @@ import{f as S,h as b}from"./fetch-graphql.js";import{h as w}from"./fetch-error.j
|
|
|
7
7
|
number
|
|
8
8
|
status
|
|
9
9
|
available_actions
|
|
10
|
-
approval_flow {
|
|
11
|
-
rule_name
|
|
12
|
-
events {
|
|
13
|
-
message
|
|
14
|
-
name
|
|
15
|
-
role
|
|
16
|
-
status
|
|
17
|
-
updated_at
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
10
|
comments {
|
|
21
11
|
created_at
|
|
22
12
|
author {
|
|
@@ -58,7 +48,7 @@ import{f as S,h as b}from"./fetch-graphql.js";import{h as w}from"./fetch-error.j
|
|
|
58
48
|
}
|
|
59
49
|
}
|
|
60
50
|
}
|
|
61
|
-
`,
|
|
51
|
+
`,M=`
|
|
62
52
|
mutation APPROVE_PURCHASE_ORDERS($input: PurchaseOrdersActionInput!) {
|
|
63
53
|
approvePurchaseOrders(input: $input) {
|
|
64
54
|
purchase_orders {
|
|
@@ -71,7 +61,7 @@ import{f as S,h as b}from"./fetch-graphql.js";import{h as w}from"./fetch-error.j
|
|
|
71
61
|
}
|
|
72
62
|
}
|
|
73
63
|
${C}
|
|
74
|
-
`,U=t=>{var n,
|
|
64
|
+
`,U=t=>{var n,s,_,a,E,R,o,l,P,y,f,A,g,m,$,q,H,I,F,T;return{typename:(t==null?void 0:t.__typename)??"",uid:(t==null?void 0:t.uid)??"",number:(t==null?void 0:t.number)??"",status:(t==null?void 0:t.status)??"",availableActions:(t==null?void 0:t.available_actions)??[],approvalFlow:t!=null&&t.approval_flow?{ruleName:((n=t==null?void 0:t.approval_flow)==null?void 0:n.rule_name)??"",events:((_=(s=t==null?void 0:t.approval_flow)==null?void 0:s.events)==null?void 0:_.map(i=>({message:(i==null?void 0:i.message)??"",name:(i==null?void 0:i.name)??"",role:(i==null?void 0:i.role)??"",status:(i==null?void 0:i.status)??"",updatedAt:(i==null?void 0:i.updated_at)??""})))??[]}:null,comments:((a=t==null?void 0:t.comments)==null?void 0:a.map(i=>{var G,N,z;return{createdAt:(i==null?void 0:i.created_at)??"",author:{firstname:((G=i==null?void 0:i.author)==null?void 0:G.firstname)??"",lastname:((N=i==null?void 0:i.author)==null?void 0:N.lastname)??"",email:((z=i==null?void 0:i.author)==null?void 0:z.email)??""},text:(i==null?void 0:i.text)??""}}))??[],createdAt:(t==null?void 0:t.created_at)??"",updatedAt:(t==null?void 0:t.updated_at)??"",createdBy:{firstname:((E=t==null?void 0:t.created_by)==null?void 0:E.firstname)??"",lastname:((R=t==null?void 0:t.created_by)==null?void 0:R.lastname)??"",email:((o=t==null?void 0:t.created_by)==null?void 0:o.email)??""},historyLog:((l=t==null?void 0:t.history_log)==null?void 0:l.map(i=>({activity:(i==null?void 0:i.activity)??"",createdAt:(i==null?void 0:i.created_at)??"",message:(i==null?void 0:i.message)??"",uid:(i==null?void 0:i.uid)??""})))??[],order:{orderNumber:((P=t==null?void 0:t.order)==null?void 0:P.number)??"",id:((y=t==null?void 0:t.order)==null?void 0:y.id)??""},quote:{id:((f=t==null?void 0:t.quote)==null?void 0:f.id)??"",prices:{grandTotal:{value:((m=(g=(A=t==null?void 0:t.quote)==null?void 0:A.prices)==null?void 0:g.grand_total)==null?void 0:m.value)??0,currency:((H=(q=($=t==null?void 0:t.quote)==null?void 0:$.prices)==null?void 0:q.grand_total)==null?void 0:H.currency)??""}},itemsV2:{items:((T=(F=(I=t==null?void 0:t.quote)==null?void 0:I.itemsV2)==null?void 0:F.items)==null?void 0:T.map(i=>({uid:(i==null?void 0:i.uid)??"",quantity:(i==null?void 0:i.quantity)??0})))??[]}}}},J=async t=>{const n=Array.isArray(t)?t:[t];if(!n||n.length===0)throw new Error("Purchase Order UID(s) are required");if(n.some(_=>!_||_.trim()===""))throw new Error("All Purchase Order UIDs must be valid");return S(M,{variables:{input:{purchase_order_uids:n}}}).then(_=>{var E,R,o;(E=_.errors)!=null&&E.length&&w(_.errors);const a=(R=_.data)==null?void 0:R.approvePurchaseOrders;if(!a)throw new Error("Failed to approve purchase orders");return{errors:((a==null?void 0:a.errors)??[]).map(l=>({message:(l==null?void 0:l.message)??"",type:(l==null?void 0:l.type)??""})),purchaseOrders:((o=a==null?void 0:a.purchase_orders)==null?void 0:o.map(l=>U(l)))??[]}}).catch(b)},V=`
|
|
75
65
|
mutation REJECT_PURCHASE_ORDERS($input: PurchaseOrdersActionInput!) {
|
|
76
66
|
rejectPurchaseOrders(input: $input) {
|
|
77
67
|
purchase_orders {
|
|
@@ -84,7 +74,7 @@ import{f as S,h as b}from"./fetch-graphql.js";import{h as w}from"./fetch-error.j
|
|
|
84
74
|
}
|
|
85
75
|
}
|
|
86
76
|
${C}
|
|
87
|
-
`,
|
|
77
|
+
`,B=async t=>{const n=Array.isArray(t)?t:[t];if(!n||n.length===0)throw new Error("Purchase Order UID(s) are required");if(n.some(_=>!_||_.trim()===""))throw new Error("All Purchase Order UIDs must be valid");return S(V,{variables:{input:{purchase_order_uids:n}}}).then(_=>{var E,R;(E=_.errors)!=null&&E.length&&w(_.errors);const a=(R=_.data)==null?void 0:R.rejectPurchaseOrders;return{errors:((a==null?void 0:a.errors)??[]).map(o=>({message:(o==null?void 0:o.message)??"",type:(o==null?void 0:o.type)??""})),purchaseOrders:((a==null?void 0:a.purchase_orders)??[]).map(U)}}).catch(b)},x=`
|
|
88
78
|
query GET_PURCHASE_ORDERS(
|
|
89
79
|
$filter: PurchaseOrdersFilterInput
|
|
90
80
|
$pageSize: Int
|
|
@@ -109,5 +99,5 @@ import{f as S,h as b}from"./fetch-graphql.js";import{h as w}from"./fetch-error.j
|
|
|
109
99
|
}
|
|
110
100
|
}
|
|
111
101
|
${C}
|
|
112
|
-
`,
|
|
102
|
+
`,L=async(t,n=20,s=1)=>S(x,{variables:{filter:D(t),pageSize:n,currentPage:s}}).then(_=>{var o,l,P,y,f,A,g,m;if((o=_.errors)!=null&&o.length&&w(_.errors),!((P=(l=_.data)==null?void 0:l.customer)!=null&&P.purchase_orders))throw new Error("Failed to get purchase orders");const a=(f=(y=_==null?void 0:_.data)==null?void 0:y.customer)==null?void 0:f.purchase_orders,E=(a==null?void 0:a.total_count)??0,R={currentPage:((A=a==null?void 0:a.page_info)==null?void 0:A.current_page)??1,pageSize:((g=a==null?void 0:a.page_info)==null?void 0:g.page_size)??20,totalPages:((m=a==null?void 0:a.page_info)==null?void 0:m.total_pages)??1};return{totalCount:E,pageInfo:R,purchaseOrderItems:((a==null?void 0:a.items)||[]).map(U)}}).catch(b);export{C as P,J as a,L as g,B as r,U as t};
|
|
113
103
|
//# sourceMappingURL=getPurchaseOrders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPurchaseOrders.js","sources":["/@dropins/storefront-purchase-order/src/api/graphql/PurchaseOrdersFragment.graphql.ts","/@dropins/storefront-purchase-order/src/api/approvePurchaseOrders/graphql/approvePurchaseOrders.graphql.ts","/@dropins/storefront-purchase-order/src/data/transforms/transform-purchase-order.ts","/@dropins/storefront-purchase-order/src/api/approvePurchaseOrders/approvePurchaseOrders.ts","/@dropins/storefront-purchase-order/src/api/rejectPurchaseOrders/graphql/rejectPurchaseOrders.graphql.ts","/@dropins/storefront-purchase-order/src/api/rejectPurchaseOrders/rejectPurchaseOrders.ts","/@dropins/storefront-purchase-order/src/api/getPurchaseOrders/graphql/getPurchaseOrders.graphql.ts","/@dropins/storefront-purchase-order/src/api/getPurchaseOrders/getPurchaseOrders.ts"],"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\nexport const PURCHASE_ORDERS_FRAGMENT = /* GraphQL */ `\n fragment PURCHASE_ORDERS_FRAGMENT on PurchaseOrder {\n __typename\n uid\n number\n status\n available_actions\n approval_flow {\n rule_name\n events {\n message\n name\n role\n status\n updated_at\n }\n }\n comments {\n created_at\n author {\n firstname\n lastname\n email\n }\n text\n }\n created_at\n updated_at\n created_by {\n firstname\n lastname\n email\n }\n history_log {\n activity\n created_at\n message\n uid\n }\n order {\n number\n }\n quote {\n id\n prices {\n grand_total {\n value\n currency\n }\n }\n itemsV2 {\n items {\n uid\n quantity\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 { PURCHASE_ORDERS_FRAGMENT } from '@/b2b-purchase-order/api/graphql/PurchaseOrdersFragment.graphql';\n\nexport const APPROVE_PURCHASE_ORDERS = /* GraphQL */ `\n mutation APPROVE_PURCHASE_ORDERS($input: PurchaseOrdersActionInput!) {\n approvePurchaseOrders(input: $input) {\n purchase_orders {\n ...PURCHASE_ORDERS_FRAGMENT\n }\n errors {\n message\n type\n }\n }\n }\n ${PURCHASE_ORDERS_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 { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\n\nexport const transformPurchaseOrder = (\n purchaseOrder: any\n): PurchaseOrderModel => {\n return {\n typename: purchaseOrder?.__typename ?? '',\n uid: purchaseOrder?.uid ?? '',\n number: purchaseOrder?.number ?? '',\n status: purchaseOrder?.status ?? '',\n availableActions: purchaseOrder?.available_actions ?? [],\n approvalFlow: purchaseOrder?.approval_flow\n ? {\n ruleName: purchaseOrder?.approval_flow?.rule_name ?? '',\n events:\n purchaseOrder?.approval_flow?.events?.map((event: any) => ({\n message: event?.message ?? '',\n name: event?.name ?? '',\n role: event?.role ?? '',\n status: event?.status ?? '',\n updatedAt: event?.updated_at ?? '',\n })) ?? [],\n }\n : null,\n comments:\n purchaseOrder?.comments?.map((comment: any) => ({\n createdAt: comment?.created_at ?? '',\n author: {\n firstname: comment?.author?.firstname ?? '',\n lastname: comment?.author?.lastname ?? '',\n email: comment?.author?.email ?? '',\n },\n text: comment?.text ?? '',\n })) ?? [],\n createdAt: purchaseOrder?.created_at ?? '',\n updatedAt: purchaseOrder?.updated_at ?? '',\n createdBy: {\n firstname: purchaseOrder?.created_by?.firstname ?? '',\n lastname: purchaseOrder?.created_by?.lastname ?? '',\n email: purchaseOrder?.created_by?.email ?? '',\n },\n historyLog:\n purchaseOrder?.history_log?.map((log: any) => ({\n activity: log?.activity ?? '',\n createdAt: log?.created_at ?? '',\n message: log?.message ?? '',\n uid: log?.uid ?? '',\n })) ?? [],\n order: {\n orderNumber: purchaseOrder?.order?.number ?? '',\n id: purchaseOrder?.order?.id ?? '',\n },\n quote: {\n id: purchaseOrder?.quote?.id ?? '',\n prices: {\n grandTotal: {\n value: purchaseOrder?.quote?.prices?.grand_total?.value ?? 0,\n currency: purchaseOrder?.quote?.prices?.grand_total?.currency ?? '',\n },\n },\n itemsV2: {\n items:\n purchaseOrder?.quote?.itemsV2?.items?.map((item: any) => ({\n uid: item?.uid ?? '',\n quantity: item?.quantity ?? 0,\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 *******************************************************************/\nimport { fetchGraphQl } from '@/b2b-purchase-order/api/fetch-graphql';\nimport { handleNetworkError } from '@/b2b-purchase-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-purchase-order/lib/fetch-error';\nimport { APPROVE_PURCHASE_ORDERS } from '@/b2b-purchase-order/api/approvePurchaseOrders/graphql/approvePurchaseOrders.graphql';\nimport { transformPurchaseOrder } from '@/b2b-purchase-order/data/transforms/transform-purchase-order';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\n\nexport const approvePurchaseOrders = async (\n uids: string | string[]\n): Promise<{\n errors: { message: string; type: string }[];\n purchaseOrders: PurchaseOrderModel[];\n}> => {\n const uidArray = Array.isArray(uids) ? uids : [uids];\n\n if (!uidArray || uidArray.length === 0) {\n throw new Error('Purchase Order UID(s) are required');\n }\n\n if (uidArray.some((uid) => !uid || uid.trim() === '')) {\n throw new Error('All Purchase Order UIDs must be valid');\n }\n\n const input = {\n purchase_order_uids: uidArray,\n };\n\n return fetchGraphQl(APPROVE_PURCHASE_ORDERS, {\n variables: { input },\n })\n .then((response: any) => {\n if (response.errors?.length) {\n handleFetchError(response.errors);\n }\n\n const data = response.data?.approvePurchaseOrders;\n if (!data) {\n throw new Error('Failed to approve purchase orders');\n }\n\n return {\n errors: (data?.errors ?? []).map((error: any) => ({\n message: error?.message ?? '',\n type: error?.type ?? '',\n })),\n purchaseOrders:\n data?.purchase_orders?.map((order: any) =>\n transformPurchaseOrder(order)\n ) ?? [],\n };\n })\n .catch(handleNetworkError);\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 { PURCHASE_ORDERS_FRAGMENT } from '@/b2b-purchase-order/api/graphql/PurchaseOrdersFragment.graphql';\n\nexport const REJECT_PURCHASE_ORDERS = /* GraphQL */ `\n mutation REJECT_PURCHASE_ORDERS($input: PurchaseOrdersActionInput!) {\n rejectPurchaseOrders(input: $input) {\n purchase_orders {\n ...PURCHASE_ORDERS_FRAGMENT\n }\n errors {\n message\n type\n }\n }\n }\n ${PURCHASE_ORDERS_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 *******************************************************************/\nimport { fetchGraphQl } from '@/b2b-purchase-order/api/fetch-graphql';\nimport { handleNetworkError } from '@/b2b-purchase-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-purchase-order/lib/fetch-error';\nimport { REJECT_PURCHASE_ORDERS } from '@/b2b-purchase-order/api/rejectPurchaseOrders/graphql/rejectPurchaseOrders.graphql';\nimport { transformPurchaseOrder } from '@/b2b-purchase-order/data/transforms/transform-purchase-order';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\n\nexport const rejectPurchaseOrders = async (\n uids: string | string[]\n): Promise<{\n errors: { message: string; type: string }[];\n purchaseOrders: PurchaseOrderModel[];\n}> => {\n const uidArray = Array.isArray(uids) ? uids : [uids];\n\n if (!uidArray || uidArray.length === 0) {\n throw new Error('Purchase Order UID(s) are required');\n }\n\n if (uidArray.some((uid) => !uid || uid.trim() === '')) {\n throw new Error('All Purchase Order UIDs must be valid');\n }\n\n const input = {\n purchase_order_uids: uidArray,\n };\n\n return fetchGraphQl(REJECT_PURCHASE_ORDERS, {\n variables: { input },\n })\n .then((response: any) => {\n if (response.errors?.length) {\n handleFetchError(response.errors);\n }\n\n const data = response.data?.rejectPurchaseOrders;\n\n return {\n errors: (data?.errors ?? []).map((error: any) => ({\n message: error?.message ?? '',\n type: error?.type ?? '',\n })),\n purchaseOrders: (data?.purchase_orders ?? []).map(\n transformPurchaseOrder\n ),\n };\n })\n .catch(handleNetworkError);\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 { PURCHASE_ORDERS_FRAGMENT } from '@/b2b-purchase-order/api/fragments';\n\nexport const GET_PURCHASE_ORDERS = /* GraphQL */ `\n query GET_PURCHASE_ORDERS(\n $filter: PurchaseOrdersFilterInput\n $pageSize: Int\n $currentPage: Int\n ) {\n customer {\n purchase_orders(\n filter: $filter\n pageSize: $pageSize\n currentPage: $currentPage\n ) {\n total_count\n page_info {\n current_page\n page_size\n total_pages\n }\n items {\n ...PURCHASE_ORDERS_FRAGMENT\n }\n }\n }\n }\n ${PURCHASE_ORDERS_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 { fetchGraphQl } from '@/b2b-purchase-order/api/fetch-graphql';\nimport { handleNetworkError } from '@/b2b-purchase-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-purchase-order/lib/fetch-error';\nimport { GET_PURCHASE_ORDERS } from '@/b2b-purchase-order/api/getPurchaseOrders/graphql/getPurchaseOrders.graphql';\nimport { transformPurchaseOrder } from '@/b2b-purchase-order/data/transforms/transform-purchase-order';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\nimport { toSnakeCase } from '@/b2b-purchase-order/lib';\n\nexport const getPurchaseOrders = async (\n filter?: any,\n pageSize: number = 20,\n currentPage: number = 1\n): Promise<{\n totalCount: number;\n pageInfo: {\n currentPage: number;\n pageSize: number;\n totalPages: number;\n };\n purchaseOrderItems: PurchaseOrderModel[];\n}> => {\n return fetchGraphQl(GET_PURCHASE_ORDERS, {\n variables: {\n filter: toSnakeCase(filter),\n pageSize,\n currentPage,\n },\n })\n .then((response: any) => {\n if (response.errors?.length) {\n handleFetchError(response.errors);\n }\n\n if (!response.data?.customer?.purchase_orders) {\n throw new Error('Failed to get purchase orders');\n }\n\n const purchaseOrdersData = response?.data?.customer?.purchase_orders;\n const totalCount = purchaseOrdersData?.total_count ?? 0;\n const pageInfo = {\n currentPage: purchaseOrdersData?.page_info?.current_page ?? 1,\n pageSize: purchaseOrdersData?.page_info?.page_size ?? 20,\n totalPages: purchaseOrdersData?.page_info?.total_pages ?? 1,\n };\n\n return {\n totalCount,\n pageInfo,\n purchaseOrderItems: (purchaseOrdersData?.items || []).map(\n transformPurchaseOrder\n ),\n };\n })\n .catch(handleNetworkError);\n};\n"],"names":["PURCHASE_ORDERS_FRAGMENT","APPROVE_PURCHASE_ORDERS","transformPurchaseOrder","purchaseOrder","_a","_c","_b","event","_d","comment","_e","_f","_g","_h","log","_i","_j","_k","_n","_m","_l","_q","_p","_o","_t","_s","_r","item","approvePurchaseOrders","uids","uidArray","uid","fetchGraphQl","response","handleFetchError","data","error","order","handleNetworkError","REJECT_PURCHASE_ORDERS","rejectPurchaseOrders","GET_PURCHASE_ORDERS","getPurchaseOrders","filter","pageSize","currentPage","toSnakeCase","purchaseOrdersData","totalCount","pageInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"getPurchaseOrders.js","sources":["/@dropins/storefront-purchase-order/src/api/graphql/PurchaseOrdersFragment.graphql.ts","/@dropins/storefront-purchase-order/src/api/approvePurchaseOrders/graphql/approvePurchaseOrders.graphql.ts","/@dropins/storefront-purchase-order/src/data/transforms/transform-purchase-order.ts","/@dropins/storefront-purchase-order/src/api/approvePurchaseOrders/approvePurchaseOrders.ts","/@dropins/storefront-purchase-order/src/api/rejectPurchaseOrders/graphql/rejectPurchaseOrders.graphql.ts","/@dropins/storefront-purchase-order/src/api/rejectPurchaseOrders/rejectPurchaseOrders.ts","/@dropins/storefront-purchase-order/src/api/getPurchaseOrders/graphql/getPurchaseOrders.graphql.ts","/@dropins/storefront-purchase-order/src/api/getPurchaseOrders/getPurchaseOrders.ts"],"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\n// TODO - Add approval_flow after backend functionality will be adjusted\nexport const PURCHASE_ORDERS_FRAGMENT = /* GraphQL */ `\n fragment PURCHASE_ORDERS_FRAGMENT on PurchaseOrder {\n __typename\n uid\n number\n status\n available_actions\n comments {\n created_at\n author {\n firstname\n lastname\n email\n }\n text\n }\n created_at\n updated_at\n created_by {\n firstname\n lastname\n email\n }\n history_log {\n activity\n created_at\n message\n uid\n }\n order {\n number\n }\n quote {\n id\n prices {\n grand_total {\n value\n currency\n }\n }\n itemsV2 {\n items {\n uid\n quantity\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 { PURCHASE_ORDERS_FRAGMENT } from '@/b2b-purchase-order/api/graphql/PurchaseOrdersFragment.graphql';\n\nexport const APPROVE_PURCHASE_ORDERS = /* GraphQL */ `\n mutation APPROVE_PURCHASE_ORDERS($input: PurchaseOrdersActionInput!) {\n approvePurchaseOrders(input: $input) {\n purchase_orders {\n ...PURCHASE_ORDERS_FRAGMENT\n }\n errors {\n message\n type\n }\n }\n }\n ${PURCHASE_ORDERS_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 { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\n\nexport const transformPurchaseOrder = (\n purchaseOrder: any\n): PurchaseOrderModel => {\n return {\n typename: purchaseOrder?.__typename ?? '',\n uid: purchaseOrder?.uid ?? '',\n number: purchaseOrder?.number ?? '',\n status: purchaseOrder?.status ?? '',\n availableActions: purchaseOrder?.available_actions ?? [],\n approvalFlow: purchaseOrder?.approval_flow\n ? {\n ruleName: purchaseOrder?.approval_flow?.rule_name ?? '',\n events:\n purchaseOrder?.approval_flow?.events?.map((event: any) => ({\n message: event?.message ?? '',\n name: event?.name ?? '',\n role: event?.role ?? '',\n status: event?.status ?? '',\n updatedAt: event?.updated_at ?? '',\n })) ?? [],\n }\n : null,\n comments:\n purchaseOrder?.comments?.map((comment: any) => ({\n createdAt: comment?.created_at ?? '',\n author: {\n firstname: comment?.author?.firstname ?? '',\n lastname: comment?.author?.lastname ?? '',\n email: comment?.author?.email ?? '',\n },\n text: comment?.text ?? '',\n })) ?? [],\n createdAt: purchaseOrder?.created_at ?? '',\n updatedAt: purchaseOrder?.updated_at ?? '',\n createdBy: {\n firstname: purchaseOrder?.created_by?.firstname ?? '',\n lastname: purchaseOrder?.created_by?.lastname ?? '',\n email: purchaseOrder?.created_by?.email ?? '',\n },\n historyLog:\n purchaseOrder?.history_log?.map((log: any) => ({\n activity: log?.activity ?? '',\n createdAt: log?.created_at ?? '',\n message: log?.message ?? '',\n uid: log?.uid ?? '',\n })) ?? [],\n order: {\n orderNumber: purchaseOrder?.order?.number ?? '',\n id: purchaseOrder?.order?.id ?? '',\n },\n quote: {\n id: purchaseOrder?.quote?.id ?? '',\n prices: {\n grandTotal: {\n value: purchaseOrder?.quote?.prices?.grand_total?.value ?? 0,\n currency: purchaseOrder?.quote?.prices?.grand_total?.currency ?? '',\n },\n },\n itemsV2: {\n items:\n purchaseOrder?.quote?.itemsV2?.items?.map((item: any) => ({\n uid: item?.uid ?? '',\n quantity: item?.quantity ?? 0,\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 *******************************************************************/\nimport { fetchGraphQl } from '@/b2b-purchase-order/api/fetch-graphql';\nimport { handleNetworkError } from '@/b2b-purchase-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-purchase-order/lib/fetch-error';\nimport { APPROVE_PURCHASE_ORDERS } from '@/b2b-purchase-order/api/approvePurchaseOrders/graphql/approvePurchaseOrders.graphql';\nimport { transformPurchaseOrder } from '@/b2b-purchase-order/data/transforms/transform-purchase-order';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\n\nexport const approvePurchaseOrders = async (\n uids: string | string[]\n): Promise<{\n errors: { message: string; type: string }[];\n purchaseOrders: PurchaseOrderModel[];\n}> => {\n const uidArray = Array.isArray(uids) ? uids : [uids];\n\n if (!uidArray || uidArray.length === 0) {\n throw new Error('Purchase Order UID(s) are required');\n }\n\n if (uidArray.some((uid) => !uid || uid.trim() === '')) {\n throw new Error('All Purchase Order UIDs must be valid');\n }\n\n const input = {\n purchase_order_uids: uidArray,\n };\n\n return fetchGraphQl(APPROVE_PURCHASE_ORDERS, {\n variables: { input },\n })\n .then((response: any) => {\n if (response.errors?.length) {\n handleFetchError(response.errors);\n }\n\n const data = response.data?.approvePurchaseOrders;\n if (!data) {\n throw new Error('Failed to approve purchase orders');\n }\n\n return {\n errors: (data?.errors ?? []).map((error: any) => ({\n message: error?.message ?? '',\n type: error?.type ?? '',\n })),\n purchaseOrders:\n data?.purchase_orders?.map((order: any) =>\n transformPurchaseOrder(order)\n ) ?? [],\n };\n })\n .catch(handleNetworkError);\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 { PURCHASE_ORDERS_FRAGMENT } from '@/b2b-purchase-order/api/graphql/PurchaseOrdersFragment.graphql';\n\nexport const REJECT_PURCHASE_ORDERS = /* GraphQL */ `\n mutation REJECT_PURCHASE_ORDERS($input: PurchaseOrdersActionInput!) {\n rejectPurchaseOrders(input: $input) {\n purchase_orders {\n ...PURCHASE_ORDERS_FRAGMENT\n }\n errors {\n message\n type\n }\n }\n }\n ${PURCHASE_ORDERS_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 *******************************************************************/\nimport { fetchGraphQl } from '@/b2b-purchase-order/api/fetch-graphql';\nimport { handleNetworkError } from '@/b2b-purchase-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-purchase-order/lib/fetch-error';\nimport { REJECT_PURCHASE_ORDERS } from '@/b2b-purchase-order/api/rejectPurchaseOrders/graphql/rejectPurchaseOrders.graphql';\nimport { transformPurchaseOrder } from '@/b2b-purchase-order/data/transforms/transform-purchase-order';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\n\nexport const rejectPurchaseOrders = async (\n uids: string | string[]\n): Promise<{\n errors: { message: string; type: string }[];\n purchaseOrders: PurchaseOrderModel[];\n}> => {\n const uidArray = Array.isArray(uids) ? uids : [uids];\n\n if (!uidArray || uidArray.length === 0) {\n throw new Error('Purchase Order UID(s) are required');\n }\n\n if (uidArray.some((uid) => !uid || uid.trim() === '')) {\n throw new Error('All Purchase Order UIDs must be valid');\n }\n\n const input = {\n purchase_order_uids: uidArray,\n };\n\n return fetchGraphQl(REJECT_PURCHASE_ORDERS, {\n variables: { input },\n })\n .then((response: any) => {\n if (response.errors?.length) {\n handleFetchError(response.errors);\n }\n\n const data = response.data?.rejectPurchaseOrders;\n\n return {\n errors: (data?.errors ?? []).map((error: any) => ({\n message: error?.message ?? '',\n type: error?.type ?? '',\n })),\n purchaseOrders: (data?.purchase_orders ?? []).map(\n transformPurchaseOrder\n ),\n };\n })\n .catch(handleNetworkError);\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 { PURCHASE_ORDERS_FRAGMENT } from '@/b2b-purchase-order/api/fragments';\n\nexport const GET_PURCHASE_ORDERS = /* GraphQL */ `\n query GET_PURCHASE_ORDERS(\n $filter: PurchaseOrdersFilterInput\n $pageSize: Int\n $currentPage: Int\n ) {\n customer {\n purchase_orders(\n filter: $filter\n pageSize: $pageSize\n currentPage: $currentPage\n ) {\n total_count\n page_info {\n current_page\n page_size\n total_pages\n }\n items {\n ...PURCHASE_ORDERS_FRAGMENT\n }\n }\n }\n }\n ${PURCHASE_ORDERS_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 { fetchGraphQl } from '@/b2b-purchase-order/api/fetch-graphql';\nimport { handleNetworkError } from '@/b2b-purchase-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-purchase-order/lib/fetch-error';\nimport { GET_PURCHASE_ORDERS } from '@/b2b-purchase-order/api/getPurchaseOrders/graphql/getPurchaseOrders.graphql';\nimport { transformPurchaseOrder } from '@/b2b-purchase-order/data/transforms/transform-purchase-order';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\nimport { toSnakeCase } from '@/b2b-purchase-order/lib';\n\nexport const getPurchaseOrders = async (\n filter?: any,\n pageSize: number = 20,\n currentPage: number = 1\n): Promise<{\n totalCount: number;\n pageInfo: {\n currentPage: number;\n pageSize: number;\n totalPages: number;\n };\n purchaseOrderItems: PurchaseOrderModel[];\n}> => {\n return fetchGraphQl(GET_PURCHASE_ORDERS, {\n variables: {\n filter: toSnakeCase(filter),\n pageSize,\n currentPage,\n },\n })\n .then((response: any) => {\n if (response.errors?.length) {\n handleFetchError(response.errors);\n }\n\n if (!response.data?.customer?.purchase_orders) {\n throw new Error('Failed to get purchase orders');\n }\n\n const purchaseOrdersData = response?.data?.customer?.purchase_orders;\n const totalCount = purchaseOrdersData?.total_count ?? 0;\n const pageInfo = {\n currentPage: purchaseOrdersData?.page_info?.current_page ?? 1,\n pageSize: purchaseOrdersData?.page_info?.page_size ?? 20,\n totalPages: purchaseOrdersData?.page_info?.total_pages ?? 1,\n };\n\n return {\n totalCount,\n pageInfo,\n purchaseOrderItems: (purchaseOrdersData?.items || []).map(\n transformPurchaseOrder\n ),\n };\n })\n .catch(handleNetworkError);\n};\n"],"names":["PURCHASE_ORDERS_FRAGMENT","APPROVE_PURCHASE_ORDERS","transformPurchaseOrder","purchaseOrder","_a","_c","_b","event","_d","comment","_e","_f","_g","_h","log","_i","_j","_k","_n","_m","_l","_q","_p","_o","_t","_s","_r","item","approvePurchaseOrders","uids","uidArray","uid","fetchGraphQl","response","handleFetchError","data","error","order","handleNetworkError","REJECT_PURCHASE_ORDERS","rejectPurchaseOrders","GET_PURCHASE_ORDERS","getPurchaseOrders","filter","pageSize","currentPage","toSnakeCase","purchaseOrdersData","totalCount","pageInfo"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as e,jsxs as p,Fragment as
|
|
3
|
+
import{jsx as e,jsxs as p,Fragment as D}from"@dropins/tools/preact-jsx-runtime.js";import{PriceRange as O,Card as T,Button as C}from"@dropins/tools/components.js";import{classes as h}from"@dropins/tools/lib.js";import"@dropins/tools/event-bus.js";import"../chunks/FormLoader.js";import{P as L}from"../chunks/PurchaseOrdersHeader.js";import{useState as f,useEffect as x,useMemo as g}from"@dropins/tools/preact-hooks.js";import{g as w}from"../chunks/getPurchaseOrderApprovalRule.js";import{Text as a,useText as N}from"@dropins/tools/i18n.js";import{F as _}from"../chunks/FormLoader2.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/transform-purchase-order-approval-rule.js";const y=({approvalRuleID:l,routeApprovalRulesList:r})=>{const[t,i]=f(!0),[o,u]=f(null);x(()=>{l&&(i(!0),w(l).then(s=>{s.uid&&u(s)}).catch(()=>{u(null)}).finally(()=>{i(!1)}))},[l]);const m=g(()=>{if(!o||t)return[];const{name:s,status:c,description:b,appliesToRoles:R,approverRoles:P,condition:d}=o;return[{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.ruleName"}),value:s},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.status"}),value:e(a,{id:`PurchaseOrders.approvalRuleDetails.fields.statusView.${c.toLocaleLowerCase()}`})},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.description"}),value:b},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.appliesTo"}),value:e("ul",{children:R.map(n=>e("li",{children:n.name},n.id))})},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.ruleType"}),value:e(a,{id:`PurchaseOrders.approvalRuleDetails.fields.condition.attribute.${d.attribute.toLocaleLowerCase()}`})},{label:e(a,{id:`PurchaseOrders.approvalRuleDetails.fields.condition.attribute.${d.attribute.toLocaleLowerCase()}`}),value:p("div",{children:[e(a,{id:`PurchaseOrders.approvalRuleDetails.fields.condition.operator.${d.operator.toLocaleLowerCase()}`}),e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.amount.label"}),e(O,{amount:d.amount.value,currency:d.amount.currency})]})},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.requiresApprovalFrom"}),value:e("ul",{children:P.map(n=>e("li",{children:n.name},n.id))})}]},[o,t]);return{handleRedirectToList:()=>{window.location.href=(r==null?void 0:r())??""},loading:t,formValues:m}},F=({formValues:l})=>e("div",{className:h(["b2b-purchase-order-approval-rule-details-content"]),children:l.map((r,t)=>p("div",{className:h(["b2b-purchase-order-approval-rule-details-content__item"]),children:[e("span",{className:"b2b-purchase-order-approval-rule-details-content__label",children:r.label}),e("div",{className:"b2b-purchase-order-approval-rule-details-content__value",children:r.value})]},t))}),J=({withHeader:l=!0,withWrapper:r=!0,className:t,approvalRuleID:i,routeApprovalRulesList:o})=>{const u=N({headerText:"PurchaseOrders.approvalRuleDetails.containerTitle"}),{handleRedirectToList:m,loading:v,formValues:s}=y({routeApprovalRulesList:o,approvalRuleID:i});if(!i)return null;const c=v?e(_,{className:"approval-rule-details--loader","data-testid":"approval-rule-details-container--loader"}):p(D,{children:[e(F,{formValues:s}),e(C,{onClick:m,children:e(a,{id:"PurchaseOrders.approvalRuleDetails.buttons.back"})})]});return p("div",{className:h(["approval-rule-details",t]),"data-testid":"approval-rule-details-container",children:[l?e(L,{headerText:u.headerText}):null,r?e(T,{variant:"secondary","data-testid":"approvalRuleDetailsCard",children:c}):c]})};export{J as ApprovalRuleDetails,J as default};
|
|
4
4
|
//# sourceMappingURL=ApprovalRuleDetails.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalRuleDetails.js","sources":["/@dropins/storefront-purchase-order/src/hooks/useApprovalRuleDetails.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleDetailsContent/ApprovalRuleDetailsContent.tsx","/@dropins/storefront-purchase-order/src/containers/ApprovalRuleDetails/ApprovalRuleDetails.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 { useEffect, useState, useMemo } from 'preact/hooks';\nimport { getPurchaseOrderApprovalRule } from '@/b2b-purchase-order/api';\nimport { UseApprovalRuleDetailsProps } from '@/b2b-purchase-order/types/hooks';\nimport { PurchaseOrderApprovalRuleModel } from '@/b2b-purchase-order/data/models';\nimport { Text } from '@adobe-commerce/elsie/i18n';\n\nexport const useApprovalRuleDetails = ({\n approvalRuleID,\n routeApprovalRulesList,\n}: UseApprovalRuleDetailsProps) => {\n const [loading, setLoading] = useState(true);\n const [approvalRule, setApprovalRule] =\n useState<PurchaseOrderApprovalRuleModel | null>(null);\n\n useEffect(() => {\n if (!approvalRuleID) return;\n\n setLoading(true);\n\n getPurchaseOrderApprovalRule(approvalRuleID)\n .then((data) => {\n if (!data.uid) return;\n\n setApprovalRule(data);\n })\n .catch(() => {\n setApprovalRule(null);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [approvalRuleID]);\n\n const formValues = useMemo(() => {\n if (!approvalRule || loading) return [];\n\n const {\n name,\n status,\n description,\n appliesToRoles,\n approverRoles,\n condition,\n } = approvalRule;\n\n return [\n {\n label: <Text id=\"PurchaseOrders.approvalRuleDetails.fields.ruleName\" />,\n value: name,\n },\n {\n label: <Text id=\"PurchaseOrders.approvalRuleDetails.fields.status\" />,\n value: (\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.statusView.${status.toLocaleLowerCase()}`}\n />\n ),\n },\n {\n label: (\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.description\" />\n ),\n value: description,\n },\n {\n label: (\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.appliesTo\" />\n ),\n value: (\n <ul>\n {appliesToRoles.map((item) => (\n <li key={item.id}>{item.name}</li>\n ))}\n </ul>\n ),\n },\n {\n label: <Text id=\"PurchaseOrders.approvalRuleDetails.fields.ruleType\" />,\n value: (\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.condition.attribute.${condition.attribute.toLocaleLowerCase()}`}\n />\n ),\n },\n {\n label: (\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.condition.attribute.${condition.attribute.toLocaleLowerCase()}`}\n />\n ),\n value: (\n <>\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.condition.operator.${condition.operator.toLocaleLowerCase()}`}\n />\n <Text\n id=\"PurchaseOrders.approvalRuleDetails.fields.amount.label\"\n fields={{\n currency: condition.amount.currency,\n value: condition.amount.value,\n }}\n />\n </>\n ),\n },\n {\n label: (\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.requiresApprovalFrom\" />\n ),\n value: (\n <ul>\n {approverRoles.map((item) => (\n <li key={item.id}>{item.name}</li>\n ))}\n </ul>\n ),\n },\n ];\n }, [approvalRule, loading]);\n\n const handleRedirectToList = () => {\n window.location.href = routeApprovalRulesList?.() ?? '';\n };\n\n return { handleRedirectToList, loading, formValues };\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 { FunctionComponent } from 'preact';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/b2b-purchase-order/components/ApprovalRuleDetailsContent/ApprovalRuleDetailsContent.css';\nimport { ApprovalRuleDetailsContentProps } from '@/b2b-purchase-order/types/components';\n\nexport const ApprovalRuleDetailsContent: FunctionComponent<\n ApprovalRuleDetailsContentProps\n> = ({ formValues }) => {\n return (\n <div\n className={classes(['b2b-purchase-order-approval-rule-details-content'])}\n >\n {formValues.map((item, i) => {\n return (\n <div\n key={i}\n className={classes([\n 'b2b-purchase-order-approval-rule-details-content__item',\n ])}\n >\n <span className=\"b2b-purchase-order-approval-rule-details-content__label\">\n {item.label}\n </span>\n <div className=\"b2b-purchase-order-approval-rule-details-content__value\">\n {item.value}\n </div>\n </div>\n );\n })}\n </div>\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 {\n ApprovalRuleDetailsContent,\n FormLoader,\n PurchaseOrdersHeader,\n} from '@/b2b-purchase-order/components';\nimport { useApprovalRuleDetails } from '@/b2b-purchase-order/hooks';\nimport { ApprovalRuleDetailsProps } from '@/b2b-purchase-order/types/containers';\nimport { Button, Card } from '@adobe-commerce/elsie/components';\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\n\nexport const ApprovalRuleDetails: Container<ApprovalRuleDetailsProps> = ({\n withHeader = true,\n withWrapper = true,\n className,\n approvalRuleID,\n routeApprovalRulesList,\n}) => {\n const t = useText({\n headerText: 'PurchaseOrders.approvalRuleDetails.containerTitle',\n });\n const { handleRedirectToList, loading, formValues } = useApprovalRuleDetails({\n routeApprovalRulesList,\n approvalRuleID,\n });\n\n if (!approvalRuleID) return null;\n\n const renderDetailsContent = !loading ? (\n <>\n <ApprovalRuleDetailsContent formValues={formValues} />\n <Button onClick={handleRedirectToList}>\n <Text id=\"PurchaseOrders.approvalRuleDetails.buttons.back\" />\n </Button>\n </>\n ) : (\n <FormLoader\n className={'approval-rule-details--loader'}\n data-testid=\"approval-rule-details-container--loader\"\n />\n );\n\n return (\n <div\n className={classes(['approval-rule-details', className])}\n data-testid=\"approval-rule-details-container\"\n >\n {withHeader ? <PurchaseOrdersHeader headerText={t.headerText} /> : null}\n {withWrapper ? (\n <Card variant={'secondary'} data-testid=\"approvalRuleDetailsCard\">\n {renderDetailsContent}\n </Card>\n ) : (\n renderDetailsContent\n )}\n </div>\n );\n};\n"],"names":["useApprovalRuleDetails","approvalRuleID","routeApprovalRulesList","loading","setLoading","useState","approvalRule","setApprovalRule","useEffect","getPurchaseOrderApprovalRule","data","formValues","useMemo","name","status","description","appliesToRoles","approverRoles","condition","jsx","Text","item","jsxs","Fragment","ApprovalRuleDetailsContent","classes","i","ApprovalRuleDetails","withHeader","withWrapper","className","t","useText","handleRedirectToList","renderDetailsContent","FormLoader","Button","PurchaseOrdersHeader","Card"],"mappings":"gsBAuBO,MAAMA,EAAyB,CAAC,CACrC,eAAAC,EACA,uBAAAC,CACF,IAAmC,CACjC,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAS,EAAI,EACrC,CAACC,EAAcC,CAAe,EAClCF,EAAgD,IAAI,EAEtDG,EAAU,IAAM,CACTP,IAELG,EAAW,EAAI,EAEfK,EAA6BR,CAAc,EACxC,KAAMS,GAAS,CACTA,EAAK,KAEVH,EAAgBG,CAAI,CACtB,CAAC,EACA,MAAM,IAAM,CACXH,EAAgB,IAAI,CACtB,CAAC,EACA,QAAQ,IAAM,CACbH,EAAW,EAAK,CAClB,CAAC,EACL,EAAG,CAACH,CAAc,CAAC,EAEnB,MAAMU,EAAaC,EAAQ,IAAM,CAC/B,GAAI,CAACN,GAAgBH,EAAS,MAAO,CAAA,EAErC,KAAM,CACJ,KAAAU,EACA,OAAAC,EACA,YAAAC,EACA,eAAAC,EACA,cAAAC,EACA,UAAAC,CAAA,EACEZ,EAEJ,MAAO,CACL,CACE,MAAOa,EAACC,EAAA,CAAK,GAAG,oDAAA,CAAqD,EACrE,MAAOP,CAAA,EAET,CACE,MAAOM,EAACC,EAAA,CAAK,GAAG,kDAAA,CAAmD,EACnE,MACED,EAACC,EAAA,CACC,GAAI,wDAAwDN,EAAO,kBAAA,CAAmB,EAAA,CAAA,CACxF,EAGJ,CACE,MACEK,EAACC,EAAA,CAAK,GAAG,uDAAA,CAAwD,EAEnE,MAAOL,CAAA,EAET,CACE,MACEI,EAACC,EAAA,CAAK,GAAG,qDAAA,CAAsD,EAEjE,MACED,EAAC,KAAA,CACE,SAAAH,EAAe,IAAKK,GACnBF,EAAC,KAAA,CAAkB,SAAAE,EAAK,IAAA,EAAfA,EAAK,EAAe,CAC9B,CAAA,CACH,CAAA,EAGJ,CACE,MAAOF,EAACC,EAAA,CAAK,GAAG,oDAAA,CAAqD,EACrE,MACED,EAACC,EAAA,CACC,GAAI,iEAAiEF,EAAU,UAAU,mBAAmB,EAAA,CAAA,CAC9G,EAGJ,CACE,MACEC,EAACC,EAAA,CACC,GAAI,iEAAiEF,EAAU,UAAU,mBAAmB,EAAA,CAAA,EAGhH,MACEI,EAAAC,EAAA,CACE,SAAA,CAAAJ,EAACC,EAAA,CACC,GAAI,gEAAgEF,EAAU,SAAS,mBAAmB,EAAA,CAAA,EAE5GC,EAACC,EAAA,CACC,GAAG,yDACH,OAAQ,CACN,SAAUF,EAAU,OAAO,SAC3B,MAAOA,EAAU,OAAO,KAAA,CAC1B,CAAA,CACF,CAAA,CACF,CAAA,EAGJ,CACE,MACEC,EAACC,EAAA,CAAK,GAAG,gEAAA,CAAiE,EAE5E,MACED,EAAC,KAAA,CACE,SAAAF,EAAc,IAAKI,GAClBF,EAAC,KAAA,CAAkB,SAAAE,EAAK,IAAA,EAAfA,EAAK,EAAe,CAC9B,CAAA,CACH,CAAA,CAEJ,CAEJ,EAAG,CAACf,EAAcH,CAAO,CAAC,EAM1B,MAAO,CAAE,qBAJoB,IAAM,CACjC,OAAO,SAAS,MAAOD,GAAA,YAAAA,MAA8B,EACvD,EAE+B,QAAAC,EAAS,WAAAQ,CAAA,CAC1C,ECxHaa,EAET,CAAC,CAAE,WAAAb,KAEHQ,EAAC,MAAA,CACC,UAAWM,EAAQ,CAAC,kDAAkD,CAAC,EAEtE,SAAAd,EAAW,IAAI,CAACU,EAAMK,IAEnBJ,EAAC,MAAA,CAEC,UAAWG,EAAQ,CACjB,wDAAA,CACD,EAED,SAAA,CAAAN,EAAC,OAAA,CAAK,UAAU,0DACb,SAAAE,EAAK,MACR,EACAF,EAAC,MAAA,CAAI,UAAU,0DACZ,WAAK,KAAA,CACR,CAAA,CAAA,EAVKO,CAAA,CAaV,CAAA,CAAA,ECjBMC,EAA2D,CAAC,CACvE,WAAAC,EAAa,GACb,YAAAC,EAAc,GACd,UAAAC,EACA,eAAA7B,EACA,uBAAAC,CACF,IAAM,CACJ,MAAM6B,EAAIC,EAAQ,CAChB,WAAY,mDAAA,CACb,EACK,CAAE,qBAAAC,EAAsB,QAAA9B,EAAS,WAAAQ,CAAA,EAAeX,EAAuB,CAC3E,uBAAAE,EACA,eAAAD,CAAA,CACD,EAED,GAAI,CAACA,EAAgB,OAAO,KAE5B,MAAMiC,EAAwB/B,EAQ5BgB,EAACgB,EAAA,CACC,UAAW,gCACX,cAAY,yCAAA,CAAA,EATdb,EAAAC,EAAA,CACE,SAAA,CAAAJ,EAACK,GAA2B,WAAAb,EAAwB,EACpDQ,EAACiB,GAAO,QAASH,EACf,WAACb,EAAA,CAAK,GAAG,kDAAkD,CAAA,CAC7D,CAAA,CAAA,CACF,EAQF,OACEE,EAAC,MAAA,CACC,UAAWG,EAAQ,CAAC,wBAAyBK,CAAS,CAAC,EACvD,cAAY,kCAEX,SAAA,CAAAF,EAAaT,EAACkB,EAAA,CAAqB,WAAYN,EAAE,WAAY,EAAK,KAClEF,IACES,EAAA,CAAK,QAAS,YAAa,cAAY,0BACrC,WACH,EAEAJ,CAAA,CAAA,CAAA,CAIR"}
|
|
1
|
+
{"version":3,"file":"ApprovalRuleDetails.js","sources":["/@dropins/storefront-purchase-order/src/hooks/useApprovalRuleDetails.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleDetailsContent/ApprovalRuleDetailsContent.tsx","/@dropins/storefront-purchase-order/src/containers/ApprovalRuleDetails/ApprovalRuleDetails.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 { useEffect, useState, useMemo } from 'preact/hooks';\nimport { getPurchaseOrderApprovalRule } from '@/b2b-purchase-order/api';\nimport { UseApprovalRuleDetailsProps } from '@/b2b-purchase-order/types/hooks';\nimport { PriceRange } from '@adobe-commerce/elsie/components';\nimport { PurchaseOrderApprovalRuleModel } from '@/b2b-purchase-order/data/models';\nimport { Text } from '@adobe-commerce/elsie/i18n';\n\nexport const useApprovalRuleDetails = ({\n approvalRuleID,\n routeApprovalRulesList,\n}: UseApprovalRuleDetailsProps) => {\n const [loading, setLoading] = useState(true);\n const [approvalRule, setApprovalRule] =\n useState<PurchaseOrderApprovalRuleModel | null>(null);\n\n useEffect(() => {\n if (!approvalRuleID) return;\n\n setLoading(true);\n\n getPurchaseOrderApprovalRule(approvalRuleID)\n .then((data) => {\n if (!data.uid) return;\n\n setApprovalRule(data);\n })\n .catch(() => {\n setApprovalRule(null);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [approvalRuleID]);\n\n const formValues = useMemo(() => {\n if (!approvalRule || loading) return [];\n\n const {\n name,\n status,\n description,\n appliesToRoles,\n approverRoles,\n condition,\n } = approvalRule;\n\n return [\n {\n label: <Text id=\"PurchaseOrders.approvalRuleDetails.fields.ruleName\" />,\n value: name,\n },\n {\n label: <Text id=\"PurchaseOrders.approvalRuleDetails.fields.status\" />,\n value: (\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.statusView.${status.toLocaleLowerCase()}`}\n />\n ),\n },\n {\n label: (\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.description\" />\n ),\n value: description,\n },\n {\n label: (\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.appliesTo\" />\n ),\n value: (\n <ul>\n {appliesToRoles.map((item) => (\n <li key={item.id}>{item.name}</li>\n ))}\n </ul>\n ),\n },\n {\n label: <Text id=\"PurchaseOrders.approvalRuleDetails.fields.ruleType\" />,\n value: (\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.condition.attribute.${condition.attribute.toLocaleLowerCase()}`}\n />\n ),\n },\n {\n label: (\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.condition.attribute.${condition.attribute.toLocaleLowerCase()}`}\n />\n ),\n value: (\n <div>\n <Text\n id={`PurchaseOrders.approvalRuleDetails.fields.condition.operator.${condition.operator.toLocaleLowerCase()}`}\n />\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.amount.label\" />\n <PriceRange\n amount={condition.amount.value}\n currency={condition.amount.currency}\n />\n </div>\n ),\n },\n {\n label: (\n <Text id=\"PurchaseOrders.approvalRuleDetails.fields.requiresApprovalFrom\" />\n ),\n value: (\n <ul>\n {approverRoles.map((item) => (\n <li key={item.id}>{item.name}</li>\n ))}\n </ul>\n ),\n },\n ];\n }, [approvalRule, loading]);\n\n const handleRedirectToList = () => {\n window.location.href = routeApprovalRulesList?.() ?? '';\n };\n\n return { handleRedirectToList, loading, formValues };\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 { FunctionComponent } from 'preact';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/b2b-purchase-order/components/ApprovalRuleDetailsContent/ApprovalRuleDetailsContent.css';\nimport { ApprovalRuleDetailsContentProps } from '@/b2b-purchase-order/types/components';\n\nexport const ApprovalRuleDetailsContent: FunctionComponent<\n ApprovalRuleDetailsContentProps\n> = ({ formValues }) => {\n return (\n <div\n className={classes(['b2b-purchase-order-approval-rule-details-content'])}\n >\n {formValues.map((item, i) => {\n return (\n <div\n key={i}\n className={classes([\n 'b2b-purchase-order-approval-rule-details-content__item',\n ])}\n >\n <span className=\"b2b-purchase-order-approval-rule-details-content__label\">\n {item.label}\n </span>\n <div className=\"b2b-purchase-order-approval-rule-details-content__value\">\n {item.value}\n </div>\n </div>\n );\n })}\n </div>\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 {\n ApprovalRuleDetailsContent,\n FormLoader,\n PurchaseOrdersHeader,\n} from '@/b2b-purchase-order/components';\nimport { useApprovalRuleDetails } from '@/b2b-purchase-order/hooks';\nimport { ApprovalRuleDetailsProps } from '@/b2b-purchase-order/types/containers';\nimport { Button, Card } from '@adobe-commerce/elsie/components';\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\n\nexport const ApprovalRuleDetails: Container<ApprovalRuleDetailsProps> = ({\n withHeader = true,\n withWrapper = true,\n className,\n approvalRuleID,\n routeApprovalRulesList,\n}) => {\n const t = useText({\n headerText: 'PurchaseOrders.approvalRuleDetails.containerTitle',\n });\n const { handleRedirectToList, loading, formValues } = useApprovalRuleDetails({\n routeApprovalRulesList,\n approvalRuleID,\n });\n\n if (!approvalRuleID) return null;\n\n const renderDetailsContent = !loading ? (\n <>\n <ApprovalRuleDetailsContent formValues={formValues} />\n <Button onClick={handleRedirectToList}>\n <Text id=\"PurchaseOrders.approvalRuleDetails.buttons.back\" />\n </Button>\n </>\n ) : (\n <FormLoader\n className={'approval-rule-details--loader'}\n data-testid=\"approval-rule-details-container--loader\"\n />\n );\n\n return (\n <div\n className={classes(['approval-rule-details', className])}\n data-testid=\"approval-rule-details-container\"\n >\n {withHeader ? <PurchaseOrdersHeader headerText={t.headerText} /> : null}\n {withWrapper ? (\n <Card variant={'secondary'} data-testid=\"approvalRuleDetailsCard\">\n {renderDetailsContent}\n </Card>\n ) : (\n renderDetailsContent\n )}\n </div>\n );\n};\n"],"names":["useApprovalRuleDetails","approvalRuleID","routeApprovalRulesList","loading","setLoading","useState","approvalRule","setApprovalRule","useEffect","getPurchaseOrderApprovalRule","data","formValues","useMemo","name","status","description","appliesToRoles","approverRoles","condition","jsx","Text","item","PriceRange","ApprovalRuleDetailsContent","classes","i","jsxs","ApprovalRuleDetails","withHeader","withWrapper","className","t","useText","handleRedirectToList","renderDetailsContent","FormLoader","Fragment","Button","PurchaseOrdersHeader","Card"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as u,jsxs as E,Fragment as w}from"@dropins/tools/preact-jsx-runtime.js";import{classes as C}from"@dropins/tools/lib.js";import{Checkbox as Q,Input as k,TextArea as K,RadioButton as j,MultiSelect as B,Picker as I,Button as x,Card as Y,InLineAlert as X}from"@dropins/tools/components.js";import"@dropins/tools/event-bus.js";import"../chunks/FormLoader.js";import{useReducer as $,useMemo as y,useEffect as z,useCallback as U}from"@dropins/tools/preact-hooks.js";import{u as J}from"../chunks/useCustomerRolePermissions.js";import{c as W,g as Z,u as ee,a as re}from"../chunks/currencyInfo.js";import{t as ae}from"../chunks/case-converter.js";import{g as oe}from"../chunks/getPurchaseOrderApprovalRule.js";import{Text as le,useText as te}from"@dropins/tools/i18n.js";import{P as ie}from"../chunks/PurchaseOrdersHeader.js";import{F as se}from"../chunks/FormLoader2.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/fetch-error.js";import"../chunks/transform-purchase-order-approval-rule.js";const ne=(e,a,o)=>{const r={...e};switch(a){case"status":r.status=o?"ENABLED":"DISABLED";break;case"name":r.name=o;break;case"description":r.description=o;break;case"ruleType":r.condition.attribute=o;break;case"ruleCondition":r.condition.operator=o;break;case"ruleValue":{let t=typeof o=="string"?o.replace(/[^\d]/g,""):String(o);t===""?r.condition.attribute==="NUMBER_OF_SKUS"?r.condition.quantity="":r.condition.amount.value="":r.condition.attribute==="NUMBER_OF_SKUS"?r.condition.quantity=+t:r.condition.amount.value=+t;break}case"ruleConditionCurrency":r.condition.amount.currency=o;break;case"approvers":r.approvers=o;break;case"roleType":r.roleType=o;break;case"appliesTo":r.appliesTo=o;break}return r},L=e=>{const a={};return(!e.name||e.name.trim()==="")&&(a.name="PurchaseOrders.approvalRuleForm.errorsMessages.required"),e.roleType==="specific_roles"&&(!e.appliesTo||e.appliesTo.length===0)&&(a.appliesTo="PurchaseOrders.approvalRuleForm.errorsMessages.approvers"),e.condition.attribute==="NUMBER_OF_SKUS"?e.condition.quantity===""&&(a.ruleValue="PurchaseOrders.approvalRuleForm.errorsMessages.required"):e.condition.amount.value===""&&(a.ruleValue="PurchaseOrders.approvalRuleForm.errorsMessages.required"),(!e.approvers||e.approvers.length===0)&&(a.approvers="PurchaseOrders.approvalRuleForm.errorsMessages.approvers"),a},g=(e,a,o)=>{const r={...a};return Object.keys(e).forEach(t=>{o[t]&&(r[t]=e[t])}),Object.keys(r).forEach(t=>{o[t]&&!e[t]&&delete r[t]}),r},N={GRAND_TOTAL:"ruleTypeGrandTotal",SHIPPING_INCL_TAX:"ruleTypeShippingInclTax",NUMBER_OF_SKUS:"ruleTypeNumberOfSkus"},A={MORE_THAN:"conditionOperatorMoreThan",LESS_THAN:"conditionOperatorLessThan",MORE_THAN_OR_EQUAL_TO:"conditionOperatorMoreThanOrEqualTo",LESS_THAN_OR_EQUAL_TO:"conditionOperatorLessThanOrEqualTo"},q={ALL_USERS:"appliesToAllUsers",SPECIFIC_ROLES:"appliesToSpecificRoles"},pe={status:"DISABLED",name:"",description:"",roleType:"all_users",appliesTo:[],condition:{quantity:"",amount:{currency:"USD",value:""},attribute:"GRAND_TOTAL",operator:"MORE_THAN"},approvers:[]},ue={formValues:pe,isLoading:!1,submitError:null,availableAppliesTo:[],availableRequiresApprovalFrom:[],errors:{},touched:{},currencyCodesList:[{text:"USD",value:"USD"}]},ce={name:!0,appliesTo:!0,ruleValue:!0,approvers:!0},D={REQUIRED:"PurchaseOrders.approvalRuleForm.errorsMessages.required",APPROVERS:"PurchaseOrders.approvalRuleForm.errorsMessages.approvers",FAILED_TO_LOAD:"Failed to load metadata. Please try again.",FAILED_TO_CREATE:"Failed to create approval rule. Please try again."},de=e=>[{text:e[N.GRAND_TOTAL],value:"GRAND_TOTAL"},{text:e[N.SHIPPING_INCL_TAX],value:"SHIPPING_INCL_TAX"},{text:e[N.NUMBER_OF_SKUS],value:"NUMBER_OF_SKUS"}],Te=e=>[{text:e[A.MORE_THAN],value:"MORE_THAN"},{text:e[A.LESS_THAN],value:"LESS_THAN"},{text:e[A.MORE_THAN_OR_EQUAL_TO],value:"MORE_THAN_OR_EQUAL_TO"},{text:e[A.LESS_THAN_OR_EQUAL_TO],value:"LESS_THAN_OR_EQUAL_TO"}],me=e=>[{text:e[q.ALL_USERS],value:"all_users"},{text:e[q.SPECIFIC_ROLES],value:"specific_roles"}],_e="ENABLED",Ee="GRAND_TOTAL",Oe="MORE_THAN",be="USD",ve=0,Re=0,he=e=>Object.keys(N).includes(e),fe=e=>Object.keys(A).includes(e),Ae=e=>{var a,o,r,t,c,s,i,l,O,b;return{status:e.status||_e,name:e.name||"",description:e.description||"",roleType:((a=e.appliesToRoles)==null?void 0:a.length)>0?"specific_roles":"all_users",appliesTo:((o=e.appliesToRoles)==null?void 0:o.map(_=>_.id))||[],condition:{quantity:((r=e.condition)==null?void 0:r.quantity)??ve,amount:{currency:((c=(t=e.condition)==null?void 0:t.amount)==null?void 0:c.currency)||be,value:((i=(s=e.condition)==null?void 0:s.amount)==null?void 0:i.value)??Re},attribute:he((l=e.condition)==null?void 0:l.attribute)?e.condition.attribute:Ee,operator:fe((O=e.condition)==null?void 0:O.operator)?e.condition.operator:Oe},approvers:((b=e.approverRoles)==null?void 0:b.map(_=>_.id))||[]}},V=e=>e!=null&&e!==""&&e!==0;function ye(e){const{roleType:a,appliesTo:o,condition:r,...t}=e,c=a==="all_users"?{appliesTo:[]}:{appliesTo:o};let s={};if(r){const{amount:l,quantity:O,...b}=r,_={...b};V(l==null?void 0:l.value)&&(_.amount=l),V(O)&&(_.quantity=O),s=_}return ae({...t,...c,condition:s})}function Se(e,a){switch(a.type){case"SET_LOADING":return{...e,isLoading:a.payload};case"SET_SUBMIT_ERROR":return{...e,submitError:a.payload};case"SET_FORM_VALUES":return{...e,formValues:a.payload};case"SET_AVAILABLE_APPLIES_TO":return{...e,availableAppliesTo:a.payload};case"SET_AVAILABLE_APPROVERS":return{...e,availableRequiresApprovalFrom:a.payload};case"SET_ERRORS":return{...e,errors:a.payload};case"SET_TOUCHED":return{...e,touched:a.payload};case"SET_CURRENCIES":return{...e,currencyCodesList:a.payload};case"UPDATE_FIELD":{const{key:o,value:r}=a.payload,t=ne(e.formValues,o,r),c={...e.touched,[o]:!0};o==="roleType"&&r==="specific_roles"&&(c.appliesTo=!0);const s=L(t),i=g(s,e.errors,c);return{...e,formValues:t,touched:c,errors:i}}case"TOUCH_FIELD":{const o=a.payload,r={...e.touched,[o]:!0},t=L(e.formValues),c=g(t,e.errors,r);return{...e,touched:r,errors:c}}case"MARK_FIELDS_TOUCHED":{const o={...e.touched,...a.payload},r=L(e.formValues),t=g(r,e.errors,o);return{...e,touched:o,errors:t}}default:return e}}const Le=({t:e,approvalRuleID:a,routeApprovalRulesList:o,onSubmit:r,onChange:t,permissions:c,loadingPermissions:s})=>{const[i,l]=$(Se,ue),O=y(()=>de(e),[e]),b=y(()=>Te(e),[e]),_=y(()=>me(e),[e]);z(()=>{l({type:"SET_LOADING",payload:!0}),W().then(n=>{l({type:"SET_CURRENCIES",payload:n.availableCurrencyCodes})}).catch(n=>{console.error("Failed to fetch currencies:",n)}),Z().then(n=>{const{availableAppliesTo:v,availableRequiresApprovalFrom:R}=n;return l({type:"SET_AVAILABLE_APPLIES_TO",payload:v}),l({type:"SET_AVAILABLE_APPROVERS",payload:R}),a?oe(a):null}).then(n=>{n&&l({type:"SET_FORM_VALUES",payload:Ae(n)}),l({type:"SET_SUBMIT_ERROR",payload:null})}).catch(n=>{console.error("Failed to fetch data:",n),l({type:"SET_SUBMIT_ERROR",payload:D.FAILED_TO_LOAD})}).finally(()=>{l({type:"SET_LOADING",payload:!1})})},[a]);const h=U((n,v)=>{l({type:"UPDATE_FIELD",payload:{key:n,value:v}}),t&&t({...i.formValues,[n]:v})},[t,i.formValues]),m=U(n=>{l({type:"TOUCH_FIELD",payload:n}),t&&t(i.formValues)},[t,i.formValues]),f=U(async()=>{l({type:"SET_LOADING",payload:!0}),l({type:"SET_SUBMIT_ERROR",payload:null}),l({type:"MARK_FIELDS_TOUCHED",payload:ce});const n=L(i.formValues);if(Object.keys(n).length>0){l({type:"SET_ERRORS",payload:n}),l({type:"SET_LOADING",payload:!1});return}const v=ye(i.formValues);try{let R;if(a?R=await ee({uid:a,...v}):R=await re(v),!R.uid){l({type:"SET_SUBMIT_ERROR",payload:D.FAILED_TO_CREATE}),l({type:"SET_LOADING",payload:!1});return}r&&r(i.formValues),l({type:"SET_LOADING",payload:!1}),window.location.href=(o==null?void 0:o())??""}catch(R){console.error("Failed to save approval rule:",R),l({type:"SET_SUBMIT_ERROR",payload:D.FAILED_TO_CREATE}),l({type:"SET_LOADING",payload:!1})}},[i.formValues,o,a,r]),d=y(()=>!!(i.isLoading||s||!(c!=null&&c.permissions.viewApprovalRules)&&!(c!=null&&c.permissions.manageApprovalRules)),[i.isLoading,s,c]);return{availableAppliesTo:i.availableAppliesTo,availableRequiresApprovalFrom:i.availableRequiresApprovalFrom,formValues:i.formValues,ruleTypeOptions:O,conditionOperators:b,currencies:i.currencyCodesList,appliesToOptions:_,handleSetFormValues:h,handleSubmit:f,handleFieldTouch:m,errors:i.errors,touched:i.touched,isLoading:i.isLoading,formLoading:d,submitError:i.submitError}},S=({touched:e=!1,error:a,className:o="error-message"})=>!e||!a?null:u("span",{className:o,children:u(le,{id:a})}),Ne=({availableRequiresApprovalFrom:e,conditionOperators:a,availableAppliesTo:o,appliesToOptions:r,ruleTypeOptions:t,currencies:c,formValues:s,errors:i,touched:l,isLoading:O,permissions:b,handleSubmit:_,handleFieldTouch:h,handleSetFormValues:m,routeApprovalRulesList:f,t:d})=>{var v,R;const n=O||!((v=b==null?void 0:b.permissions)!=null&&v.viewApprovalRules);return E("form",{"data-testid":"approval-rule-form",children:[u(Q,{"data-testid":"status-toggle",className:"b2b-purchase-order-approval-rule-form__toggle",disabled:n,name:"status",label:s.status==="ENABLED"?d.formEnabled:d.formDisabled,checked:s.status==="ENABLED",onChange:p=>{const T=p.target.checked;m("status",T)}}),E("div",{"data-testid":"name-input-container",children:[u(k,{"data-testid":"name-input",className:"b2b-purchase-order-approval-rule-form__name-input",disabled:n,name:"name",floatingLabel:d.inputRuleNameFloatingLabel,placeholder:d.inputRuleNamePlaceholder,value:s.name,error:!!(l.name&&i.name),onValue:p=>m("name",p),onBlur:()=>h("name")}),u(S,{touched:l.name,error:i.name})]}),u(K,{"data-testid":"description-textarea",className:"b2b-purchase-order-approval-rule-form__description",disabled:n,name:"description",label:d.textAreaDescriptionLabel,value:s.description,onChange:p=>{const T=p.target.value;m("description",T)}}),E("div",{"data-testid":"applies-to-section",className:"b2b-purchase-order-approval-rule-form__applies-to",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__applies-to-title",children:d.titleAppliesTo}),r.map((p,T)=>u(j,{"data-testid":`applies-to-radio-${T}`,disabled:n,name:"radio-group",value:p.value,label:p.text,checked:s.roleType===p.value,onChange:F=>{const P=F.target.value;m("roleType",P)}},p.value)),s.roleType==="specific_roles"?E("div",{"data-testid":"applies-to-multiselect-container",className:"b2b-purchase-order-approval-rule-form__applies-to-multiselect",children:[u(B,{"data-testid":"applies-to-multiselect",disabled:n,name:"appliesTo",value:[...s.appliesTo],options:o.map(p=>({value:p.id,label:p.name})),error:!!(l.appliesTo&&i.appliesTo),onChange:p=>{m("appliesTo",p),l.appliesTo||h("appliesTo")}}),u(S,{touched:l.appliesTo,error:i.appliesTo})]}):null]}),E("div",{"data-testid":"rule-type-section",className:"b2b-purchase-order-approval-rule-form__rule-type",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__rule-type-title",children:d.titleRuleType}),u(I,{"data-testid":"rule-type-picker",className:"b2b-purchase-order-approval-rule-form__rule-type-picker",disabled:n,name:"ruleType",value:s.condition.attribute,options:t,handleSelect:p=>{const T=p.target.value;m("ruleType",T)}})]}),E("div",{"data-testid":"rule-condition-section",className:"b2b-purchase-order-approval-rule-form__rule-condition",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__rule-condition-title",children:(R=t.find(p=>p.value===s.condition.attribute))==null?void 0:R.text}),E("div",{className:"b2b-purchase-order-approval-rule-form__rule-condition-container",children:[u(I,{"data-testid":"rule-condition-picker",className:"b2b-purchase-order-approval-rule-form__rule-condition-picker",disabled:n,name:"ruleCondition",value:s.condition.operator,options:a,handleSelect:p=>{const T=p.target.value;m("ruleCondition",T)}}),E("div",{"data-testid":"rule-value-container",children:[u(k,{"data-testid":"rule-value-input",className:"b2b-purchase-order-approval-rule-form__rule-value-input",disabled:n,name:"ruleValue",floatingLabel:s.condition.attribute==="NUMBER_OF_SKUS"?d.inputQuantityFloatingLabel:d.inputAmountFloatingLabel,placeholder:s.condition.attribute==="NUMBER_OF_SKUS"?d.inputQuantityPlaceholder:d.inputAmountPlaceholder,value:s.condition.attribute==="NUMBER_OF_SKUS"?s.condition.quantity:s.condition.amount.value,error:!!(l.ruleValue&&i.ruleValue),onChange:p=>{const T=p.target.value;m("ruleValue",T)},onBlur:()=>h("ruleValue")}),u(S,{touched:l.ruleValue,error:i.ruleValue})]}),s.condition.attribute!=="NUMBER_OF_SKUS"?u(I,{"data-testid":"rule-condition-currency-picker",className:"b2b-purchase-order-approval-rule-form__rule-condition-currency-picker",disabled:n,name:"ruleConditionCurrency",value:s.condition.amount.currency,options:c,handleSelect:p=>{const T=p.target.value;m("ruleConditionCurrency",T)}}):null]})]}),E("div",{"data-testid":"approval-role-section",className:"b2b-purchase-order-approval-rule-form__approval-role",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__approval-role-title",children:d.titleRequiresApprovalRole}),E("div",{className:"b2b-purchase-order-approval-rule-form__approval-role-multiselect",children:[u(B,{"data-testid":"approvers-multiselect",disabled:n,name:"approvers",value:[...s.approvers],options:e.map(p=>({value:p.id,label:p.name})),error:!!(l.approvers&&i.approvers),onChange:p=>{m("approvers",p),l.approvers||h("approvers")}}),u(S,{touched:l.approvers,error:i.approvers})]})]}),E("div",{"data-testid":"form-buttons",className:"b2b-purchase-order-approval-rule-form__buttons",children:[u(x,{"data-testid":"save-button",type:"button",disabled:n,onClick:_,children:d.buttonSave}),u(x,{"data-testid":"cancel-button",disabled:O,variant:"secondary",onClick:()=>{window.location.href=(f==null?void 0:f())??""},children:d.buttonCancel})]})]})},Fe=({className:e,approvalRuleID:a,withHeader:o,withWrapper:r,routeApprovalRulesList:t,onSubmit:c,onChange:s})=>{const i=te({headerText:"PurchaseOrders.approvalRuleForm.headerText",titleAppliesTo:"PurchaseOrders.approvalRuleForm.titleAppliesTo",titleRuleType:"PurchaseOrders.approvalRuleForm.titleRuleType",titleRequiresApprovalRole:"PurchaseOrders.approvalRuleForm.titleRequiresApprovalRole",formEnabled:"PurchaseOrders.approvalRuleForm.fields.enabled",formDisabled:"PurchaseOrders.approvalRuleForm.fields.disabled",inputRuleNameFloatingLabel:"PurchaseOrders.approvalRuleForm.fields.inputRuleName.floatingLabel",inputRuleNamePlaceholder:"PurchaseOrders.approvalRuleForm.fields.inputRuleName.placeholder",textAreaDescriptionLabel:"PurchaseOrders.approvalRuleForm.fields.textAreaDescription.label",appliesToAllUsers:"PurchaseOrders.approvalRuleForm.fields.appliesTo.allUsers",appliesToSpecificRoles:"PurchaseOrders.approvalRuleForm.fields.appliesTo.specificRoles",ruleTypeGrandTotal:"PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.grandTotal",ruleTypeShippingInclTax:"PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.shippingInclTax",ruleTypeNumberOfSkus:"PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.numberOfSkus",conditionOperatorMoreThan:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThan",conditionOperatorLessThan:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThan",conditionOperatorMoreThanOrEqualTo:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThanOrEqualTo",conditionOperatorLessThanOrEqualTo:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThanOrEqualTo",inputQuantityFloatingLabel:"PurchaseOrders.approvalRuleForm.fields.inputQuantity.floatingLabel",inputQuantityPlaceholder:"PurchaseOrders.approvalRuleForm.fields.inputQuantity.placeholder",inputAmountFloatingLabel:"PurchaseOrders.approvalRuleForm.fields.inputAmount.floatingLabel",inputAmountPlaceholder:"PurchaseOrders.approvalRuleForm.fields.inputAmount.placeholder",buttonCancel:"PurchaseOrders.approvalRuleForm.fields.buttons.cancel",buttonSave:"PurchaseOrders.approvalRuleForm.fields.buttons.save"}),{permissions:l,loadingPermissions:O}=J(),{availableRequiresApprovalFrom:b,conditionOperators:_,availableAppliesTo:h,appliesToOptions:m,ruleTypeOptions:f,currencies:d,formValues:n,errors:v,touched:R,isLoading:p,submitError:T,formLoading:F,handleSubmit:P,handleFieldTouch:H,handleSetFormValues:G}=Le({t:i,approvalRuleID:a,loadingPermissions:O,permissions:l,routeApprovalRulesList:t,onSubmit:c,onChange:s});if(F)return u(se,{testId:"b2b-purchase-order-approval-rule-form",className:C(["b2b-purchase-order-approval-rule-form",e])});const M=E(w,{children:[!!T&&u(X,{heading:"",description:T}),u(Ne,{availableRequiresApprovalFrom:b,conditionOperators:_,availableAppliesTo:h,appliesToOptions:m,ruleTypeOptions:f,currencies:d,formValues:n,errors:v,touched:R,isLoading:p,handleSubmit:P,handleFieldTouch:H,handleSetFormValues:G,permissions:l,routeApprovalRulesList:t,t:i})]});return E("div",{"data-testid":"b2b-purchase-order-approval-rule-form",className:C(["b2b-purchase-order-approval-rule-form",e]),children:[o?u(ie,{headerText:i.headerText}):null,r?u(Y,{variant:"secondary",children:M}):M]})},je=({withHeader:e=!0,withWrapper:a=!0,className:o,approvalRuleID:r,routeApprovalRulesList:t,onSubmit:c,onChange:s})=>u("div",{"data-testid":"b2b-purchase-order-approval-rule-form-container",className:C(["b2b-purchase-order-approval-rule-form-container",o]),children:u(Fe,{withWrapper:a,withHeader:e,approvalRuleID:r,routeApprovalRulesList:t,onSubmit:c,onChange:s})});export{je as ApprovalRuleForm,je as default};
|
|
3
|
+
import{jsx as u,jsxs as E,Fragment as w}from"@dropins/tools/preact-jsx-runtime.js";import{classes as C}from"@dropins/tools/lib.js";import{Checkbox as Q,Input as k,TextArea as K,RadioButton as j,MultiSelect as B,Picker as I,Button as x,Card as Y,InLineAlert as X}from"@dropins/tools/components.js";import"@dropins/tools/event-bus.js";import"../chunks/FormLoader.js";import{useReducer as $,useMemo as y,useEffect as z,useCallback as U}from"@dropins/tools/preact-hooks.js";import{u as J}from"../chunks/useCustomerRolePermissions.js";import{c as W,g as Z,u as ee,a as re}from"../chunks/currencyInfo.js";import{t as ae}from"../chunks/case-converter.js";import{g as oe}from"../chunks/getPurchaseOrderApprovalRule.js";import{Text as le,useText as te}from"@dropins/tools/i18n.js";import{P as ie}from"../chunks/PurchaseOrdersHeader.js";import{F as se}from"../chunks/FormLoader2.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/fetch-error.js";import"../chunks/transform-purchase-order-approval-rule.js";const ne=(e,a,o)=>{const r={...e};switch(a){case"status":r.status=o?"ENABLED":"DISABLED";break;case"name":r.name=o;break;case"description":r.description=o;break;case"ruleType":r.condition.attribute=o;break;case"ruleCondition":r.condition.operator=o;break;case"ruleValue":{let t=typeof o=="string"?o.replace(/[^\d]/g,""):String(o);t===""?r.condition.attribute==="NUMBER_OF_SKUS"?r.condition.quantity="":r.condition.amount.value="":r.condition.attribute==="NUMBER_OF_SKUS"?r.condition.quantity=+t:r.condition.amount.value=+t;break}case"ruleConditionCurrency":r.condition.amount.currency=o;break;case"approvers":r.approvers=o;break;case"roleType":r.roleType=o;break;case"appliesTo":r.appliesTo=o;break}return r},L=e=>{const a={};return(!e.name||e.name.trim()==="")&&(a.name="PurchaseOrders.approvalRuleForm.errorsMessages.required"),e.roleType==="specific_roles"&&(!e.appliesTo||e.appliesTo.length===0)&&(a.appliesTo="PurchaseOrders.approvalRuleForm.errorsMessages.approvers"),e.condition.attribute==="NUMBER_OF_SKUS"?e.condition.quantity===""&&(a.ruleValue="PurchaseOrders.approvalRuleForm.errorsMessages.required"):e.condition.amount.value===""&&(a.ruleValue="PurchaseOrders.approvalRuleForm.errorsMessages.required"),(!e.approvers||e.approvers.length===0)&&(a.approvers="PurchaseOrders.approvalRuleForm.errorsMessages.approvers"),a},g=(e,a,o)=>{const r={...a};return Object.keys(e).forEach(t=>{o[t]&&(r[t]=e[t])}),Object.keys(r).forEach(t=>{o[t]&&!e[t]&&delete r[t]}),r},N={GRAND_TOTAL:"ruleTypeGrandTotal",SHIPPING_INCL_TAX:"ruleTypeShippingInclTax",NUMBER_OF_SKUS:"ruleTypeNumberOfSkus"},A={MORE_THAN:"conditionOperatorMoreThan",LESS_THAN:"conditionOperatorLessThan",MORE_THAN_OR_EQUAL_TO:"conditionOperatorMoreThanOrEqualTo",LESS_THAN_OR_EQUAL_TO:"conditionOperatorLessThanOrEqualTo"},q={ALL_USERS:"appliesToAllUsers",SPECIFIC_ROLES:"appliesToSpecificRoles"},pe={status:"DISABLED",name:"",description:"",roleType:"all_users",appliesTo:[],condition:{quantity:"",amount:{currency:"USD",value:""},attribute:"GRAND_TOTAL",operator:"MORE_THAN"},approvers:[]},ue={formValues:pe,isLoading:!1,submitError:null,availableAppliesTo:[],availableRequiresApprovalFrom:[],errors:{},touched:{},currencyCodesList:[{text:"USD",value:"USD"}]},ce={name:!0,appliesTo:!0,ruleValue:!0,approvers:!0},D={REQUIRED:"PurchaseOrders.approvalRuleForm.errorsMessages.required",APPROVERS:"PurchaseOrders.approvalRuleForm.errorsMessages.approvers",FAILED_TO_LOAD:"Failed to load metadata. Please try again.",FAILED_TO_CREATE:"Failed to create approval rule. Please try again."},de=e=>[{text:e[N.GRAND_TOTAL],value:"GRAND_TOTAL"},{text:e[N.SHIPPING_INCL_TAX],value:"SHIPPING_INCL_TAX"},{text:e[N.NUMBER_OF_SKUS],value:"NUMBER_OF_SKUS"}],Te=e=>[{text:e[A.MORE_THAN],value:"MORE_THAN"},{text:e[A.LESS_THAN],value:"LESS_THAN"},{text:e[A.MORE_THAN_OR_EQUAL_TO],value:"MORE_THAN_OR_EQUAL_TO"},{text:e[A.LESS_THAN_OR_EQUAL_TO],value:"LESS_THAN_OR_EQUAL_TO"}],me=e=>[{text:e[q.ALL_USERS],value:"all_users"},{text:e[q.SPECIFIC_ROLES],value:"specific_roles"}],_e="ENABLED",Ee="GRAND_TOTAL",Oe="MORE_THAN",be="USD",ve=0,Re=0,he=e=>Object.keys(N).includes(e),fe=e=>Object.keys(A).includes(e),Ae=e=>{var a,o,r,t,c,s,i,l,O,b;return{status:e.status||_e,name:e.name||"",description:e.description||"",roleType:((a=e.appliesToRoles)==null?void 0:a.length)>0?"specific_roles":"all_users",appliesTo:((o=e.appliesToRoles)==null?void 0:o.map(_=>_.id))||[],condition:{quantity:((r=e.condition)==null?void 0:r.quantity)??ve,amount:{currency:((c=(t=e.condition)==null?void 0:t.amount)==null?void 0:c.currency)||be,value:((i=(s=e.condition)==null?void 0:s.amount)==null?void 0:i.value)??Re},attribute:he((l=e.condition)==null?void 0:l.attribute)?e.condition.attribute:Ee,operator:fe((O=e.condition)==null?void 0:O.operator)?e.condition.operator:Oe},approvers:((b=e.approverRoles)==null?void 0:b.map(_=>_.id))||[]}},V=e=>e!=null&&e!==""&&e!==0;function ye(e){const{roleType:a,appliesTo:o,condition:r,...t}=e,c=a==="all_users"?{appliesTo:[]}:{appliesTo:o};let s={};if(r){const{amount:l,quantity:O,...b}=r,_={...b};V(l==null?void 0:l.value)&&(_.amount=l),V(O)&&(_.quantity=O),s=_}return ae({...t,...c,condition:s})}function Se(e,a){switch(a.type){case"SET_LOADING":return{...e,isLoading:a.payload};case"SET_SUBMIT_ERROR":return{...e,submitError:a.payload};case"SET_FORM_VALUES":return{...e,formValues:a.payload};case"SET_AVAILABLE_APPLIES_TO":return{...e,availableAppliesTo:a.payload};case"SET_AVAILABLE_APPROVERS":return{...e,availableRequiresApprovalFrom:a.payload};case"SET_ERRORS":return{...e,errors:a.payload};case"SET_TOUCHED":return{...e,touched:a.payload};case"SET_CURRENCIES":return{...e,currencyCodesList:a.payload};case"UPDATE_FIELD":{const{key:o,value:r}=a.payload,t=ne(e.formValues,o,r),c={...e.touched,[o]:!0};o==="roleType"&&r==="specific_roles"&&(c.appliesTo=!0);const s=L(t),i=g(s,e.errors,c);return{...e,formValues:t,touched:c,errors:i}}case"TOUCH_FIELD":{const o=a.payload,r={...e.touched,[o]:!0},t=L(e.formValues),c=g(t,e.errors,r);return{...e,touched:r,errors:c}}case"MARK_FIELDS_TOUCHED":{const o={...e.touched,...a.payload},r=L(e.formValues),t=g(r,e.errors,o);return{...e,touched:o,errors:t}}default:return e}}const Le=({t:e,approvalRuleID:a,routeApprovalRulesList:o,onSubmit:r,onChange:t,permissions:c,loadingPermissions:s})=>{const[i,l]=$(Se,ue),O=y(()=>de(e),[e]),b=y(()=>Te(e),[e]),_=y(()=>me(e),[e]);z(()=>{l({type:"SET_LOADING",payload:!0}),W().then(n=>{l({type:"SET_CURRENCIES",payload:n.availableCurrencyCodes})}).catch(n=>{console.error("Failed to fetch currencies:",n)}),Z().then(n=>{const{availableAppliesTo:v,availableRequiresApprovalFrom:R}=n;return l({type:"SET_AVAILABLE_APPLIES_TO",payload:v}),l({type:"SET_AVAILABLE_APPROVERS",payload:R}),a?oe(a):null}).then(n=>{n&&l({type:"SET_FORM_VALUES",payload:Ae(n)}),l({type:"SET_SUBMIT_ERROR",payload:null})}).catch(n=>{console.error("Failed to fetch data:",n),l({type:"SET_SUBMIT_ERROR",payload:D.FAILED_TO_LOAD})}).finally(()=>{l({type:"SET_LOADING",payload:!1})})},[a]);const h=U((n,v)=>{l({type:"UPDATE_FIELD",payload:{key:n,value:v}}),t&&t({...i.formValues,[n]:v})},[t,i.formValues]),m=U(n=>{l({type:"TOUCH_FIELD",payload:n}),t&&t(i.formValues)},[t,i.formValues]),f=U(async()=>{l({type:"SET_LOADING",payload:!0}),l({type:"SET_SUBMIT_ERROR",payload:null}),l({type:"MARK_FIELDS_TOUCHED",payload:ce});const n=L(i.formValues);if(Object.keys(n).length>0){l({type:"SET_ERRORS",payload:n}),l({type:"SET_LOADING",payload:!1});return}const v=ye(i.formValues);try{let R;if(a?R=await ee({uid:a,...v}):R=await re(v),!R.uid){l({type:"SET_SUBMIT_ERROR",payload:D.FAILED_TO_CREATE}),l({type:"SET_LOADING",payload:!1});return}r&&r(i.formValues),l({type:"SET_LOADING",payload:!1}),window.location.href=(o==null?void 0:o())??""}catch(R){console.error("Failed to save approval rule:",R),l({type:"SET_SUBMIT_ERROR",payload:D.FAILED_TO_CREATE}),l({type:"SET_LOADING",payload:!1})}},[i.formValues,o,a,r]),d=y(()=>!!(i.isLoading||s||!(c!=null&&c.permissions.viewApprovalRules)&&!(c!=null&&c.permissions.manageApprovalRules)),[i.isLoading,s,c]);return{availableAppliesTo:i.availableAppliesTo,availableRequiresApprovalFrom:i.availableRequiresApprovalFrom,formValues:i.formValues,ruleTypeOptions:O,conditionOperators:b,currencies:i.currencyCodesList,appliesToOptions:_,handleSetFormValues:h,handleSubmit:f,handleFieldTouch:m,errors:i.errors,touched:i.touched,isLoading:i.isLoading,formLoading:d,submitError:i.submitError}},S=({touched:e=!1,error:a,className:o="error-message"})=>!e||!a?null:u("span",{className:o,children:u(le,{id:a})}),Ne=({availableRequiresApprovalFrom:e,conditionOperators:a,availableAppliesTo:o,appliesToOptions:r,ruleTypeOptions:t,currencies:c,formValues:s,errors:i,touched:l,isLoading:O,permissions:b,handleSubmit:_,handleFieldTouch:h,handleSetFormValues:m,routeApprovalRulesList:f,t:d})=>{var v,R;const n=O||!((v=b==null?void 0:b.permissions)!=null&&v.viewApprovalRules);return E("form",{"data-testid":"approval-rule-form",children:[u(Q,{"data-testid":"status-toggle",className:"b2b-purchase-order-approval-rule-form__toggle",disabled:n,name:"status",label:s.status==="ENABLED"?d.formEnabled:d.formDisabled,checked:s.status==="ENABLED",onChange:p=>{const T=p.target.checked;m("status",T)}}),E("div",{"data-testid":"name-input-container",children:[u(k,{"data-testid":"name-input",className:"b2b-purchase-order-approval-rule-form__name-input",disabled:n,name:"name",floatingLabel:d.inputRuleNameFloatingLabel,placeholder:d.inputRuleNamePlaceholder,value:s.name,error:!!(l.name&&i.name),onValue:p=>m("name",p),onBlur:()=>h("name")}),u(S,{touched:l.name,error:i.name})]}),u(K,{"data-testid":"description-textarea",className:"b2b-purchase-order-approval-rule-form__description",disabled:n,name:"description",label:d.textAreaDescriptionLabel,value:s.description,onChange:p=>{const T=p.target.value;m("description",T)}}),E("div",{"data-testid":"applies-to-section",className:"b2b-purchase-order-approval-rule-form__applies-to",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__applies-to-title",children:d.titleAppliesTo}),r.map((p,T)=>u(j,{"data-testid":`applies-to-radio-${T}`,disabled:n,name:"radio-group",value:p.value,label:p.text,checked:s.roleType===p.value,onChange:F=>{const P=F.target.value;m("roleType",P)}},p.value)),s.roleType==="specific_roles"?E("div",{"data-testid":"applies-to-multiselect-container",className:"b2b-purchase-order-approval-rule-form__applies-to-multiselect",children:[u(B,{"data-testid":"applies-to-multiselect",disabled:n,name:"appliesTo",value:[...s.appliesTo],options:o.map(p=>({value:p.id,label:p.name})),error:!!(l.appliesTo&&i.appliesTo),onChange:p=>{m("appliesTo",p),l.appliesTo||h("appliesTo")}}),u(S,{touched:l.appliesTo,error:i.appliesTo})]}):null]}),E("div",{"data-testid":"rule-type-section",className:"b2b-purchase-order-approval-rule-form__rule-type",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__rule-type-title",children:d.titleRuleType}),u(I,{"data-testid":"rule-type-picker",className:"b2b-purchase-order-approval-rule-form__rule-type-picker",disabled:n,name:"ruleType",value:s.condition.attribute,options:t,handleSelect:p=>{const T=p.target.value;m("ruleType",T)}})]}),E("div",{"data-testid":"rule-condition-section",className:"b2b-purchase-order-approval-rule-form__rule-condition",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__rule-condition-title",children:(R=t.find(p=>p.value===s.condition.attribute))==null?void 0:R.text}),E("div",{className:"b2b-purchase-order-approval-rule-form__rule-condition-container",children:[u(I,{"data-testid":"rule-condition-picker",className:"b2b-purchase-order-approval-rule-form__rule-condition-picker",disabled:n,name:"ruleCondition",value:s.condition.operator,options:a,handleSelect:p=>{const T=p.target.value;m("ruleCondition",T)}}),E("div",{"data-testid":"rule-value-container",children:[u(k,{"data-testid":"rule-value-input",className:"b2b-purchase-order-approval-rule-form__rule-value-input",disabled:n,name:"ruleValue",floatingLabel:s.condition.attribute==="NUMBER_OF_SKUS"?d.inputQuantityFloatingLabel:d.inputAmountFloatingLabel,placeholder:s.condition.attribute==="NUMBER_OF_SKUS"?d.inputQuantityPlaceholder:d.inputAmountPlaceholder,value:s.condition.attribute==="NUMBER_OF_SKUS"?s.condition.quantity:s.condition.amount.value,error:!!(l.ruleValue&&i.ruleValue),onChange:p=>{const T=p.target.value;m("ruleValue",T)},onBlur:()=>h("ruleValue")}),u(S,{touched:l.ruleValue,error:i.ruleValue})]}),s.condition.attribute!=="NUMBER_OF_SKUS"?u(I,{"data-testid":"rule-condition-currency-picker",className:"b2b-purchase-order-approval-rule-form__rule-condition-currency-picker",disabled:n,name:"ruleConditionCurrency",value:s.condition.amount.currency,options:c,handleSelect:p=>{const T=p.target.value;m("ruleConditionCurrency",T)}}):null]})]}),E("div",{"data-testid":"approval-role-section",className:"b2b-purchase-order-approval-rule-form__approval-role",children:[u("span",{className:"b2b-purchase-order-approval-rule-form__approval-role-title",children:d.titleRequiresApprovalRole}),E("div",{className:"b2b-purchase-order-approval-rule-form__approval-role-multiselect",children:[u(B,{"data-testid":"approvers-multiselect",disabled:n,name:"approvers",value:[...s.approvers],options:e.map(p=>({value:p.id,label:p.name})),error:!!(l.approvers&&i.approvers),onChange:p=>{m("approvers",p),l.approvers||h("approvers")}}),u(S,{touched:l.approvers,error:i.approvers})]})]}),E("div",{"data-testid":"form-buttons",className:"b2b-purchase-order-approval-rule-form__buttons",children:[u(x,{"data-testid":"save-button",type:"button",disabled:n,onClick:_,children:d.buttonSave}),u(x,{"data-testid":"cancel-button",disabled:O,variant:"secondary",type:"button",onClick:()=>{window.location.href=(f==null?void 0:f())??""},children:d.buttonCancel})]})]})},Fe=({className:e,approvalRuleID:a,withHeader:o,withWrapper:r,routeApprovalRulesList:t,onSubmit:c,onChange:s})=>{const i=te({headerText:"PurchaseOrders.approvalRuleForm.headerText",titleAppliesTo:"PurchaseOrders.approvalRuleForm.titleAppliesTo",titleRuleType:"PurchaseOrders.approvalRuleForm.titleRuleType",titleRequiresApprovalRole:"PurchaseOrders.approvalRuleForm.titleRequiresApprovalRole",formEnabled:"PurchaseOrders.approvalRuleForm.fields.enabled",formDisabled:"PurchaseOrders.approvalRuleForm.fields.disabled",inputRuleNameFloatingLabel:"PurchaseOrders.approvalRuleForm.fields.inputRuleName.floatingLabel",inputRuleNamePlaceholder:"PurchaseOrders.approvalRuleForm.fields.inputRuleName.placeholder",textAreaDescriptionLabel:"PurchaseOrders.approvalRuleForm.fields.textAreaDescription.label",appliesToAllUsers:"PurchaseOrders.approvalRuleForm.fields.appliesTo.allUsers",appliesToSpecificRoles:"PurchaseOrders.approvalRuleForm.fields.appliesTo.specificRoles",ruleTypeGrandTotal:"PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.grandTotal",ruleTypeShippingInclTax:"PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.shippingInclTax",ruleTypeNumberOfSkus:"PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.numberOfSkus",conditionOperatorMoreThan:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThan",conditionOperatorLessThan:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThan",conditionOperatorMoreThanOrEqualTo:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThanOrEqualTo",conditionOperatorLessThanOrEqualTo:"PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThanOrEqualTo",inputQuantityFloatingLabel:"PurchaseOrders.approvalRuleForm.fields.inputQuantity.floatingLabel",inputQuantityPlaceholder:"PurchaseOrders.approvalRuleForm.fields.inputQuantity.placeholder",inputAmountFloatingLabel:"PurchaseOrders.approvalRuleForm.fields.inputAmount.floatingLabel",inputAmountPlaceholder:"PurchaseOrders.approvalRuleForm.fields.inputAmount.placeholder",buttonCancel:"PurchaseOrders.approvalRuleForm.fields.buttons.cancel",buttonSave:"PurchaseOrders.approvalRuleForm.fields.buttons.save"}),{permissions:l,loadingPermissions:O}=J(),{availableRequiresApprovalFrom:b,conditionOperators:_,availableAppliesTo:h,appliesToOptions:m,ruleTypeOptions:f,currencies:d,formValues:n,errors:v,touched:R,isLoading:p,submitError:T,formLoading:F,handleSubmit:P,handleFieldTouch:H,handleSetFormValues:G}=Le({t:i,approvalRuleID:a,loadingPermissions:O,permissions:l,routeApprovalRulesList:t,onSubmit:c,onChange:s});if(F)return u(se,{testId:"b2b-purchase-order-approval-rule-form",className:C(["b2b-purchase-order-approval-rule-form",e])});const M=E(w,{children:[!!T&&u(X,{heading:"",description:T}),u(Ne,{availableRequiresApprovalFrom:b,conditionOperators:_,availableAppliesTo:h,appliesToOptions:m,ruleTypeOptions:f,currencies:d,formValues:n,errors:v,touched:R,isLoading:p,handleSubmit:P,handleFieldTouch:H,handleSetFormValues:G,permissions:l,routeApprovalRulesList:t,t:i})]});return E("div",{"data-testid":"b2b-purchase-order-approval-rule-form",className:C(["b2b-purchase-order-approval-rule-form",e]),children:[o?u(ie,{headerText:i.headerText}):null,r?u(Y,{variant:"secondary",children:M}):M]})},je=({withHeader:e=!0,withWrapper:a=!0,className:o,approvalRuleID:r,routeApprovalRulesList:t,onSubmit:c,onChange:s})=>u("div",{"data-testid":"b2b-purchase-order-approval-rule-form-container",className:C(["b2b-purchase-order-approval-rule-form-container",o]),children:u(Fe,{withWrapper:a,withHeader:e,approvalRuleID:r,routeApprovalRulesList:t,onSubmit:c,onChange:s})});export{je as ApprovalRuleForm,je as default};
|
|
4
4
|
//# sourceMappingURL=ApprovalRuleForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalRuleForm.js","sources":["/@dropins/storefront-purchase-order/src/lib/updateFormFieldValue.ts","/@dropins/storefront-purchase-order/src/lib/formValidation.ts","/@dropins/storefront-purchase-order/src/configs/approvalRuleForm.config.ts","/@dropins/storefront-purchase-order/src/lib/transformToFormValues.ts","/@dropins/storefront-purchase-order/src/lib/cleanAndDeep.ts","/@dropins/storefront-purchase-order/src/hooks/useApprovalRuleForm.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleForm/blocks/ErrorMessage.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleForm/blocks/Form.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleForm/ApprovalRuleForm.tsx","/@dropins/storefront-purchase-order/src/containers/ApprovalRuleForm/ApprovalRuleForm.tsx"],"sourcesContent":["import {\n ConditionAttributeType,\n ConditionOperatorType,\n FormValuesParams,\n} from '../types/hooks';\n\nexport const updateFormFieldValue = (\n formValues: FormValuesParams,\n key: string,\n value: string | number | boolean | string[]\n): FormValuesParams => {\n const newFormValues = { ...formValues };\n\n switch (key) {\n case 'status':\n newFormValues.status = value ? 'ENABLED' : 'DISABLED';\n break;\n case 'name':\n newFormValues.name = value as string;\n break;\n case 'description':\n newFormValues.description = value as string;\n break;\n case 'ruleType':\n newFormValues.condition.attribute = value as ConditionAttributeType;\n break;\n case 'ruleCondition':\n newFormValues.condition.operator = value as ConditionOperatorType;\n break;\n case 'ruleValue': {\n let numericValue =\n typeof value === 'string' ? value.replace(/[^\\d]/g, '') : String(value);\n\n if (numericValue === '') {\n if (newFormValues.condition.attribute === 'NUMBER_OF_SKUS') {\n newFormValues.condition.quantity = '';\n } else {\n newFormValues.condition.amount.value = '';\n }\n } else if (newFormValues.condition.attribute === 'NUMBER_OF_SKUS') {\n newFormValues.condition.quantity = +numericValue;\n } else {\n newFormValues.condition.amount.value = +numericValue;\n }\n break;\n }\n case 'ruleConditionCurrency':\n newFormValues.condition.amount.currency = value as string;\n break;\n case 'approvers':\n newFormValues.approvers = value as string[];\n break;\n case 'roleType':\n newFormValues.roleType = value as string;\n break;\n case 'appliesTo':\n newFormValues.appliesTo = value as string[];\n break;\n default:\n break;\n }\n\n return newFormValues;\n};\n","import {\n FormValuesParams,\n ValidationApprovalFormError,\n} from '@/b2b-purchase-order/types/hooks';\n\n/**\n * Validates all form fields and returns validation errors\n * This function contains the core validation logic for the approval rule form\n */\nexport const validateFormFields = (\n values: FormValuesParams\n): ValidationApprovalFormError => {\n const errors: ValidationApprovalFormError = {};\n\n // Validate rule name (required)\n if (!values.name || values.name.trim() === '') {\n errors.name = 'PurchaseOrders.approvalRuleForm.errorsMessages.required';\n }\n\n // Validate appliesTo when specific roles are selected\n if (\n values.roleType === 'specific_roles' &&\n (!values.appliesTo || values.appliesTo.length === 0)\n ) {\n errors.appliesTo =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.approvers';\n }\n\n // Validate rule value based on condition type\n if (values.condition.attribute === 'NUMBER_OF_SKUS') {\n if (values.condition.quantity === '') {\n errors.ruleValue =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.required';\n }\n } else if (values.condition.amount.value === '') {\n errors.ruleValue =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.required';\n }\n\n // Validate approvers (required)\n if (!values.approvers || values.approvers.length === 0) {\n errors.approvers =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.approvers';\n }\n\n return errors;\n};\n\n/**\n * Returns only the errors for fields that have been touched by the user\n * This prevents showing validation errors for fields the user hasn't interacted with yet\n */\nexport const getVisibleErrors = (\n allErrors: ValidationApprovalFormError,\n touchedFields: { [key: string]: boolean }\n): ValidationApprovalFormError => {\n const visibleErrors: ValidationApprovalFormError = {};\n\n // Only include errors for touched fields\n Object.keys(allErrors).forEach((errorKey) => {\n if (touchedFields[errorKey]) {\n visibleErrors[errorKey] = allErrors[errorKey];\n }\n });\n\n return visibleErrors;\n};\n\n/**\n * Updates errors based on new validation results and touched fields\n * This is used for incremental validation as the user fills out the form\n */\nexport const updateValidationErrors = (\n newErrors: ValidationApprovalFormError,\n currentErrors: ValidationApprovalFormError,\n touchedFields: { [key: string]: boolean }\n): ValidationApprovalFormError => {\n const updatedErrors: ValidationApprovalFormError = { ...currentErrors };\n\n // Add new errors for touched fields\n Object.keys(newErrors).forEach((errorKey) => {\n if (touchedFields[errorKey]) {\n updatedErrors[errorKey] = newErrors[errorKey];\n }\n });\n\n // Remove errors for fields that became valid\n Object.keys(updatedErrors).forEach((errorKey) => {\n if (touchedFields[errorKey] && !newErrors[errorKey]) {\n delete updatedErrors[errorKey];\n }\n });\n\n return updatedErrors;\n};\n","import { FormValuesParams, FormState } from '@/b2b-purchase-order/types/hooks';\n\nexport const RULE_TYPE_OPTIONS_KEYS = {\n GRAND_TOTAL: 'ruleTypeGrandTotal',\n SHIPPING_INCL_TAX: 'ruleTypeShippingInclTax',\n NUMBER_OF_SKUS: 'ruleTypeNumberOfSkus',\n} as const;\n\nexport const CONDITION_OPERATORS_KEYS = {\n MORE_THAN: 'conditionOperatorMoreThan',\n LESS_THAN: 'conditionOperatorLessThan',\n MORE_THAN_OR_EQUAL_TO: 'conditionOperatorMoreThanOrEqualTo',\n LESS_THAN_OR_EQUAL_TO: 'conditionOperatorLessThanOrEqualTo',\n} as const;\n\nexport const APPLIES_TO_OPTIONS_KEYS = {\n ALL_USERS: 'appliesToAllUsers',\n SPECIFIC_ROLES: 'appliesToSpecificRoles',\n} as const;\n\n/**\n * Initial values for the approval rule form\n * Used when creating a new rule\n */\nexport const INITIAL_FORM_VALUES: FormValuesParams = {\n status: 'DISABLED',\n name: '',\n description: '',\n roleType: 'all_users',\n appliesTo: [],\n condition: {\n quantity: '',\n amount: {\n currency: 'USD',\n value: '',\n },\n attribute: 'GRAND_TOTAL',\n operator: 'MORE_THAN',\n },\n approvers: [],\n};\n\n/**\n * Initial state for the form reducer\n * Includes form values, loading states, and validation\n */\nexport const INITIAL_FORM_STATE: FormState = {\n formValues: INITIAL_FORM_VALUES,\n isLoading: false,\n submitError: null,\n availableAppliesTo: [],\n availableRequiresApprovalFrom: [],\n errors: {},\n touched: {},\n currencyCodesList: [{ text: 'USD', value: 'USD' }],\n};\n\n/**\n * Fields that must be touched (validated) on form submission\n */\nexport const REQUIRED_FIELDS_ON_SUBMIT = {\n name: true,\n appliesTo: true,\n ruleValue: true,\n approvers: true,\n} as const;\n\n/**\n * Translation keys for validation error messages\n */\nexport const VALIDATION_ERROR_KEYS = {\n REQUIRED: 'PurchaseOrders.approvalRuleForm.errorsMessages.required',\n APPROVERS: 'PurchaseOrders.approvalRuleForm.errorsMessages.approvers',\n FAILED_TO_LOAD: 'Failed to load metadata. Please try again.',\n FAILED_TO_CREATE: 'Failed to create approval rule. Please try again.',\n} as const;\n\n/**\n * Creates rule type options for the dropdown\n * @param t - Translation function\n */\n/**\n * Creates rule type options for the dropdown\n * @param t - Translation function\n */\nexport const createRuleTypeOptions = (t: Record<string, string>) => [\n {\n text: t[RULE_TYPE_OPTIONS_KEYS.GRAND_TOTAL],\n value: 'GRAND_TOTAL',\n },\n {\n text: t[RULE_TYPE_OPTIONS_KEYS.SHIPPING_INCL_TAX],\n value: 'SHIPPING_INCL_TAX',\n },\n {\n text: t[RULE_TYPE_OPTIONS_KEYS.NUMBER_OF_SKUS],\n value: 'NUMBER_OF_SKUS',\n },\n];\n\n/**\n * Creates condition operator options for the dropdown\n * @param t - Translation function\n */\nexport const createConditionOperators = (t: Record<string, string>) => [\n { text: t[CONDITION_OPERATORS_KEYS.MORE_THAN], value: 'MORE_THAN' },\n {\n text: t[CONDITION_OPERATORS_KEYS.LESS_THAN],\n value: 'LESS_THAN',\n },\n {\n text: t[CONDITION_OPERATORS_KEYS.MORE_THAN_OR_EQUAL_TO],\n value: 'MORE_THAN_OR_EQUAL_TO',\n },\n {\n text: t[CONDITION_OPERATORS_KEYS.LESS_THAN_OR_EQUAL_TO],\n value: 'LESS_THAN_OR_EQUAL_TO',\n },\n];\n\n/**\n * Creates \"applies to\" options for the dropdown\n * @param t - Translation function\n */\nexport const createAppliesToOptions = (t: Record<string, string>) => [\n { text: t[APPLIES_TO_OPTIONS_KEYS.ALL_USERS], value: 'all_users' },\n {\n text: t[APPLIES_TO_OPTIONS_KEYS.SPECIFIC_ROLES],\n value: 'specific_roles',\n },\n];\n","import { PurchaseOrderApprovalRuleModel } from '@/b2b-purchase-order/data/models';\nimport {\n ConditionAttributeType,\n ConditionOperatorType,\n FormValuesParams,\n} from '@/b2b-purchase-order/types/hooks';\nimport {\n RULE_TYPE_OPTIONS_KEYS,\n CONDITION_OPERATORS_KEYS,\n} from '@/b2b-purchase-order/configs/approvalRuleForm.config';\n\n// Default values for form fields\nconst DEFAULT_STATUS = 'ENABLED';\nconst DEFAULT_ATTRIBUTE: ConditionAttributeType = 'GRAND_TOTAL';\nconst DEFAULT_OPERATOR: ConditionOperatorType = 'MORE_THAN';\nconst DEFAULT_CURRENCY = 'USD';\nconst DEFAULT_QUANTITY = 0;\nconst DEFAULT_AMOUNT_VALUE = 0;\n\n/**\n * Checks if the given attribute is a valid condition attribute type\n */\nconst isValidAttribute = (\n attribute: any\n): attribute is ConditionAttributeType => {\n return Object.keys(RULE_TYPE_OPTIONS_KEYS).includes(attribute);\n};\n\n/**\n * Checks if the given operator is a valid condition operator type\n */\nconst isValidOperator = (operator: any): operator is ConditionOperatorType => {\n return Object.keys(CONDITION_OPERATORS_KEYS).includes(operator);\n};\n\n/**\n * Transforms API response data to form values format\n * Handles all the necessary data conversions and provides safe defaults\n */\nexport const transformToFormValues = (\n data: PurchaseOrderApprovalRuleModel\n): FormValuesParams => {\n return {\n status: (data.status as 'ENABLED' | 'DISABLED') || DEFAULT_STATUS,\n name: data.name || '',\n description: data.description || '',\n roleType: data.appliesToRoles?.length > 0 ? 'specific_roles' : 'all_users',\n appliesTo: data.appliesToRoles?.map((role) => role.id) || [],\n condition: {\n quantity: data.condition?.quantity ?? DEFAULT_QUANTITY,\n amount: {\n currency: data.condition?.amount?.currency || DEFAULT_CURRENCY,\n value: data.condition?.amount?.value ?? DEFAULT_AMOUNT_VALUE,\n },\n attribute: isValidAttribute(data.condition?.attribute)\n ? data.condition.attribute\n : DEFAULT_ATTRIBUTE,\n operator: isValidOperator(data.condition?.operator)\n ? data.condition.operator\n : DEFAULT_OPERATOR,\n },\n approvers: data.approverRoles?.map((role) => role.id) || [],\n };\n};\n","import { toSnakeCase } from './case-converter';\n\n/**\n * Checks if a value should be considered as \"has value\" for form submission\n * Empty strings and null/undefined are considered as no value\n * Zero (0) is considered as no value to match existing behavior\n */\nconst hasValue = (value: any): boolean => {\n return value !== null && value !== undefined && value !== '' && value !== 0;\n};\n\n/**\n * Cleans form values and converts to snake_case for API submission\n * - Handles role type logic (all_users vs specific_roles)\n * - Removes empty condition values (amount or quantity)\n * - Converts camelCase keys to snake_case\n */\nexport function cleanAndDeep(formValues: Record<string, any>): any {\n const { roleType, appliesTo, condition, ...restAll } = formValues;\n\n // Handle role type logic: all_users means empty appliesTo array\n const roleConfig =\n roleType === 'all_users' ? { appliesTo: [] } : { appliesTo };\n\n // Build condition config with only non-empty values\n let conditionConfig = {};\n\n if (condition) {\n const { amount, quantity, ...restCondition } = condition;\n\n const newCondition = { ...restCondition };\n\n // Only include amount if it has a valid value\n if (hasValue(amount?.value)) {\n newCondition.amount = amount;\n }\n\n // Only include quantity if it has a valid value\n if (hasValue(quantity)) {\n newCondition.quantity = quantity;\n }\n\n conditionConfig = newCondition;\n }\n\n // Convert to snake_case for API\n const result = toSnakeCase({\n ...restAll,\n ...roleConfig,\n condition: conditionConfig,\n });\n\n return result;\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 { useCallback, useEffect, useMemo, useReducer } from 'preact/hooks';\nimport {\n FormAction,\n FormState,\n UseApprovalRuleFormProps,\n UseApprovalRuleFormReturn,\n} from '@/b2b-purchase-order/types/hooks';\n\nimport {\n currencyInfo,\n getPurchaseOrderApprovalRule,\n createPurchaseOrderApprovalRule,\n updatePurchaseOrderApprovalRule,\n getPurchaseOrderApprovalRuleMetadata,\n} from '@/b2b-purchase-order/api';\nimport {\n updateFormFieldValue,\n validateFormFields,\n updateValidationErrors,\n transformToFormValues,\n cleanAndDeep,\n} from '@/b2b-purchase-order/lib';\nimport {\n INITIAL_FORM_STATE,\n REQUIRED_FIELDS_ON_SUBMIT,\n VALIDATION_ERROR_KEYS,\n createRuleTypeOptions,\n createConditionOperators,\n createAppliesToOptions,\n} from '@/b2b-purchase-order/configs';\n\n// Reducer function - handles all state updates in one place\nfunction formReducer(state: FormState, action: FormAction): FormState {\n switch (action.type) {\n case 'SET_LOADING':\n return { ...state, isLoading: action.payload };\n\n case 'SET_SUBMIT_ERROR':\n return { ...state, submitError: action.payload };\n\n case 'SET_FORM_VALUES':\n return { ...state, formValues: action.payload };\n\n case 'SET_AVAILABLE_APPLIES_TO':\n return { ...state, availableAppliesTo: action.payload };\n\n case 'SET_AVAILABLE_APPROVERS':\n return { ...state, availableRequiresApprovalFrom: action.payload };\n\n case 'SET_ERRORS':\n return { ...state, errors: action.payload };\n\n case 'SET_TOUCHED':\n return { ...state, touched: action.payload };\n\n case 'SET_CURRENCIES':\n return { ...state, currencyCodesList: action.payload };\n\n case 'UPDATE_FIELD': {\n const { key, value } = action.payload;\n const newFormValues = updateFormFieldValue(state.formValues, key, value);\n\n // Build new touched state\n const newTouched = { ...state.touched, [key]: true };\n\n // Special case: when roleType changes to specific_roles, mark appliesTo as touched\n if (key === 'roleType' && value === 'specific_roles') {\n newTouched.appliesTo = true;\n }\n\n // Validate and get updated errors\n const allErrors = validateFormFields(newFormValues);\n const newErrors = updateValidationErrors(\n allErrors,\n state.errors,\n newTouched\n );\n\n return {\n ...state,\n formValues: newFormValues,\n touched: newTouched,\n errors: newErrors,\n };\n }\n\n case 'TOUCH_FIELD': {\n const fieldName = action.payload;\n const newTouched = { ...state.touched, [fieldName]: true };\n\n // Validate and update errors for touched field\n const allErrors = validateFormFields(state.formValues);\n const newErrors = updateValidationErrors(\n allErrors,\n state.errors,\n newTouched\n );\n\n return {\n ...state,\n touched: newTouched,\n errors: newErrors,\n };\n }\n\n case 'MARK_FIELDS_TOUCHED': {\n const newTouched = { ...state.touched, ...action.payload };\n const allErrors = validateFormFields(state.formValues);\n const newErrors = updateValidationErrors(\n allErrors,\n state.errors,\n newTouched\n );\n\n return {\n ...state,\n touched: newTouched,\n errors: newErrors,\n };\n }\n\n default:\n return state;\n }\n}\n\nexport const useApprovalRuleForm = ({\n t,\n approvalRuleID,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n permissions,\n loadingPermissions,\n}: UseApprovalRuleFormProps): UseApprovalRuleFormReturn => {\n const [state, dispatch] = useReducer(formReducer, INITIAL_FORM_STATE);\n\n // Memoize options to prevent re-creation on each render\n const ruleTypeOptions = useMemo(() => createRuleTypeOptions(t), [t]);\n const conditionOperators = useMemo(() => createConditionOperators(t), [t]);\n const appliesToOptions = useMemo(() => createAppliesToOptions(t), [t]);\n\n // Load initial data (currencies and approval rule metadata)\n useEffect(() => {\n dispatch({ type: 'SET_LOADING', payload: true });\n\n // Load currency codes\n currencyInfo()\n .then((data) => {\n dispatch({\n type: 'SET_CURRENCIES',\n payload: data.availableCurrencyCodes,\n });\n })\n .catch((error) => {\n console.error('Failed to fetch currencies:', error);\n });\n\n // Load metadata (available roles) first - always needed\n getPurchaseOrderApprovalRuleMetadata()\n .then((data) => {\n const { availableAppliesTo, availableRequiresApprovalFrom } = data;\n dispatch({\n type: 'SET_AVAILABLE_APPLIES_TO',\n payload: availableAppliesTo,\n });\n dispatch({\n type: 'SET_AVAILABLE_APPROVERS',\n payload: availableRequiresApprovalFrom,\n });\n\n // Then load approval rule data if in edit mode\n if (approvalRuleID) {\n return getPurchaseOrderApprovalRule(approvalRuleID);\n }\n return null;\n })\n .then((ruleData) => {\n if (ruleData) {\n // Edit mode: set form values from existing rule\n dispatch({\n type: 'SET_FORM_VALUES',\n payload: transformToFormValues(ruleData),\n });\n }\n dispatch({ type: 'SET_SUBMIT_ERROR', payload: null });\n })\n .catch((error) => {\n console.error('Failed to fetch data:', error);\n dispatch({\n type: 'SET_SUBMIT_ERROR',\n payload: VALIDATION_ERROR_KEYS.FAILED_TO_LOAD,\n });\n })\n .finally(() => {\n dispatch({ type: 'SET_LOADING', payload: false });\n });\n }, [approvalRuleID]);\n\n // Handler for field value changes\n const handleSetFormValues = useCallback(\n (key: string, value: string | number | boolean | string[]) => {\n dispatch({ type: 'UPDATE_FIELD', payload: { key, value } });\n if (onChange) {\n onChange({ ...state.formValues, [key]: value });\n }\n },\n [onChange, state.formValues]\n );\n\n // Handler for field touch (blur)\n const handleFieldTouch = useCallback(\n (fieldName: string) => {\n dispatch({ type: 'TOUCH_FIELD', payload: fieldName });\n if (onChange) {\n onChange(state.formValues);\n }\n },\n [onChange, state.formValues]\n );\n\n // Handler for form submission\n const handleSubmit = useCallback(async () => {\n dispatch({ type: 'SET_LOADING', payload: true });\n dispatch({ type: 'SET_SUBMIT_ERROR', payload: null });\n\n // Mark all required fields as touched to show all errors\n dispatch({\n type: 'MARK_FIELDS_TOUCHED',\n payload: REQUIRED_FIELDS_ON_SUBMIT,\n });\n\n // Validate form\n const validationErrors = validateFormFields(state.formValues);\n\n if (Object.keys(validationErrors).length > 0) {\n dispatch({ type: 'SET_ERRORS', payload: validationErrors });\n dispatch({ type: 'SET_LOADING', payload: false });\n return;\n }\n\n // Clean and prepare data for API\n const cleanedData = cleanAndDeep(state.formValues);\n\n // Submit to API (create or update based on approvalRuleID)\n try {\n let data;\n\n if (approvalRuleID) {\n // Update existing approval rule\n data = await updatePurchaseOrderApprovalRule({\n uid: approvalRuleID,\n ...cleanedData,\n });\n } else {\n // Create new approval rule\n data = await createPurchaseOrderApprovalRule(cleanedData);\n }\n\n if (!data.uid) {\n dispatch({\n type: 'SET_SUBMIT_ERROR',\n payload: VALIDATION_ERROR_KEYS.FAILED_TO_CREATE,\n });\n dispatch({ type: 'SET_LOADING', payload: false });\n return;\n }\n\n // Success - call onSubmit callback if provided\n if (onSubmit) {\n // If onSubmit expects form values, pass state.formValues, else pass data\n onSubmit(state.formValues as any);\n }\n dispatch({ type: 'SET_LOADING', payload: false });\n window.location.href = routeApprovalRulesList?.() ?? '';\n } catch (error) {\n console.error('Failed to save approval rule:', error);\n dispatch({\n type: 'SET_SUBMIT_ERROR',\n payload: VALIDATION_ERROR_KEYS.FAILED_TO_CREATE,\n });\n dispatch({ type: 'SET_LOADING', payload: false });\n }\n }, [state.formValues, routeApprovalRulesList, approvalRuleID, onSubmit]);\n\n // Memoized: true if form is loading or permissions not loaded or missing required permission\n const formLoading = useMemo(() => {\n if (state.isLoading || loadingPermissions) return true;\n\n if (\n !permissions?.permissions.viewApprovalRules &&\n !permissions?.permissions.manageApprovalRules\n ) {\n return true;\n }\n\n return false;\n }, [state.isLoading, loadingPermissions, permissions]);\n\n return {\n availableAppliesTo: state.availableAppliesTo,\n availableRequiresApprovalFrom: state.availableRequiresApprovalFrom,\n formValues: state.formValues,\n ruleTypeOptions,\n conditionOperators,\n currencies: state.currencyCodesList,\n appliesToOptions,\n handleSetFormValues,\n handleSubmit,\n handleFieldTouch,\n errors: state.errors,\n touched: state.touched,\n isLoading: state.isLoading,\n formLoading,\n submitError: state.submitError,\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 { Text } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\n\nconst ErrorMessage: FunctionComponent<{\n touched?: boolean;\n error?: string;\n className?: string;\n}> = ({ touched = false, error, className = 'error-message' }) => {\n if (!touched || !error) {\n return null;\n }\n\n return (\n <span className={className}>\n <Text id={error} />\n </span>\n );\n};\n\nexport default ErrorMessage;\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 {\n Input,\n Picker,\n TextArea,\n RadioButton,\n Checkbox,\n MultiSelect,\n Button,\n} from '@adobe-commerce/elsie/components';\nimport { ErrorMessage } from '@/b2b-purchase-order/components/ApprovalRuleForm/blocks';\nimport { CustomerRolePermissionsModel } from '@/b2b-purchase-order/data/models';\n\nconst Form = ({\n availableRequiresApprovalFrom,\n conditionOperators,\n availableAppliesTo,\n appliesToOptions,\n ruleTypeOptions,\n currencies,\n formValues,\n errors,\n touched,\n isLoading,\n permissions,\n handleSubmit,\n handleFieldTouch,\n handleSetFormValues,\n routeApprovalRulesList,\n t,\n}: {\n availableRequiresApprovalFrom: { id: string; name: string }[];\n conditionOperators: { value: string; text: string }[];\n availableAppliesTo: { id: string; name: string }[];\n appliesToOptions: { value: string; text: string }[];\n ruleTypeOptions: { value: string; text: string }[];\n currencies: { value: string; text: string }[];\n formValues: any;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n isLoading: boolean;\n permissions?: CustomerRolePermissionsModel;\n handleSubmit: () => void;\n handleFieldTouch: (field: string) => void;\n handleSetFormValues: (field: string, value: any) => void;\n routeApprovalRulesList?: () => string;\n t: Record<string, string>;\n}) => {\n const disabledInputField =\n isLoading || !permissions?.permissions?.viewApprovalRules;\n\n return (\n <form data-testid=\"approval-rule-form\">\n <Checkbox\n data-testid=\"status-toggle\"\n className=\"b2b-purchase-order-approval-rule-form__toggle\"\n disabled={disabledInputField}\n name=\"status\"\n label={formValues.status === 'ENABLED' ? t.formEnabled : t.formDisabled}\n checked={formValues.status === 'ENABLED'}\n onChange={(event) => {\n const value = (event.target as HTMLInputElement).checked;\n\n handleSetFormValues('status', value);\n }}\n />\n <div data-testid=\"name-input-container\">\n <Input\n data-testid=\"name-input\"\n className=\"b2b-purchase-order-approval-rule-form__name-input\"\n disabled={disabledInputField}\n name={'name'}\n floatingLabel={t.inputRuleNameFloatingLabel}\n placeholder={t.inputRuleNamePlaceholder}\n value={formValues.name}\n error={!!(touched.name && errors.name)}\n onValue={(value) => handleSetFormValues('name', value)}\n onBlur={() => handleFieldTouch('name')}\n />\n <ErrorMessage touched={touched.name} error={errors.name} />\n </div>\n <TextArea\n data-testid=\"description-textarea\"\n className=\"b2b-purchase-order-approval-rule-form__description\"\n disabled={disabledInputField}\n name=\"description\"\n label={t.textAreaDescriptionLabel}\n value={formValues.description}\n onChange={(event) => {\n const value = (event.target as HTMLTextAreaElement).value;\n handleSetFormValues('description', value);\n }}\n />\n <div\n data-testid=\"applies-to-section\"\n className=\"b2b-purchase-order-approval-rule-form__applies-to\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__applies-to-title\">\n {t.titleAppliesTo}\n </span>\n {appliesToOptions.map((option, index) => {\n return (\n <RadioButton\n key={option.value}\n data-testid={`applies-to-radio-${index}`}\n disabled={disabledInputField}\n name=\"radio-group\"\n value={option.value}\n label={option.text}\n checked={formValues.roleType === option.value}\n onChange={(event) => {\n const value = (event.target as HTMLInputElement).value;\n handleSetFormValues('roleType', value);\n }}\n />\n );\n })}\n {formValues.roleType === 'specific_roles' ? (\n <div\n data-testid=\"applies-to-multiselect-container\"\n className=\"b2b-purchase-order-approval-rule-form__applies-to-multiselect\"\n >\n <MultiSelect\n data-testid=\"applies-to-multiselect\"\n disabled={disabledInputField}\n name=\"appliesTo\"\n value={[...formValues.appliesTo]}\n options={availableAppliesTo.map((option) => ({\n value: option.id,\n label: option.name,\n }))}\n error={!!(touched.appliesTo && errors.appliesTo)}\n onChange={(value) => {\n handleSetFormValues('appliesTo', value as string[]);\n if (!touched.appliesTo) handleFieldTouch('appliesTo');\n }}\n />\n <ErrorMessage\n touched={touched.appliesTo}\n error={errors.appliesTo}\n />\n </div>\n ) : null}\n </div>\n <div\n data-testid=\"rule-type-section\"\n className=\"b2b-purchase-order-approval-rule-form__rule-type\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__rule-type-title\">\n {t.titleRuleType}\n </span>\n <Picker\n data-testid=\"rule-type-picker\"\n className=\"b2b-purchase-order-approval-rule-form__rule-type-picker\"\n disabled={disabledInputField}\n name=\"ruleType\"\n value={formValues.condition.attribute}\n options={ruleTypeOptions}\n handleSelect={(event) => {\n const value = (event.target as HTMLSelectElement).value;\n handleSetFormValues('ruleType', value);\n }}\n />\n </div>\n <div\n data-testid=\"rule-condition-section\"\n className=\"b2b-purchase-order-approval-rule-form__rule-condition\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__rule-condition-title\">\n {\n ruleTypeOptions.find(\n (item) => item.value === formValues.condition.attribute\n )?.text\n }\n </span>\n <div className=\"b2b-purchase-order-approval-rule-form__rule-condition-container\">\n <Picker\n data-testid=\"rule-condition-picker\"\n className=\"b2b-purchase-order-approval-rule-form__rule-condition-picker\"\n disabled={disabledInputField}\n name=\"ruleCondition\"\n value={formValues.condition.operator}\n options={conditionOperators}\n handleSelect={(event) => {\n const value = (event.target as HTMLSelectElement).value;\n handleSetFormValues('ruleCondition', value);\n }}\n />\n <div data-testid=\"rule-value-container\">\n <Input\n data-testid=\"rule-value-input\"\n className=\"b2b-purchase-order-approval-rule-form__rule-value-input\"\n disabled={disabledInputField}\n name=\"ruleValue\"\n floatingLabel={\n formValues.condition.attribute === 'NUMBER_OF_SKUS'\n ? t.inputQuantityFloatingLabel\n : t.inputAmountFloatingLabel\n }\n placeholder={\n formValues.condition.attribute === 'NUMBER_OF_SKUS'\n ? t.inputQuantityPlaceholder\n : t.inputAmountPlaceholder\n }\n value={\n formValues.condition.attribute === 'NUMBER_OF_SKUS'\n ? formValues.condition.quantity\n : formValues.condition.amount.value\n }\n error={!!(touched.ruleValue && errors.ruleValue)}\n onChange={(event) => {\n const value = (event.target as HTMLInputElement).value;\n handleSetFormValues('ruleValue', value);\n }}\n onBlur={() => handleFieldTouch('ruleValue')}\n />\n <ErrorMessage\n touched={touched.ruleValue}\n error={errors.ruleValue}\n />\n </div>\n {formValues.condition.attribute !== 'NUMBER_OF_SKUS' ? (\n <Picker\n data-testid=\"rule-condition-currency-picker\"\n className=\"b2b-purchase-order-approval-rule-form__rule-condition-currency-picker\"\n disabled={disabledInputField}\n name=\"ruleConditionCurrency\"\n value={formValues.condition.amount.currency}\n options={currencies}\n handleSelect={(event) => {\n const value = (event.target as HTMLSelectElement).value;\n handleSetFormValues('ruleConditionCurrency', value);\n }}\n />\n ) : null}\n </div>\n </div>\n <div\n data-testid=\"approval-role-section\"\n className=\"b2b-purchase-order-approval-rule-form__approval-role\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__approval-role-title\">\n {t.titleRequiresApprovalRole}\n </span>\n <div className=\"b2b-purchase-order-approval-rule-form__approval-role-multiselect\">\n <MultiSelect\n data-testid=\"approvers-multiselect\"\n disabled={disabledInputField}\n name=\"approvers\"\n value={[...formValues.approvers]}\n options={availableRequiresApprovalFrom.map((option) => ({\n value: option.id,\n label: option.name,\n }))}\n error={!!(touched.approvers && errors.approvers)}\n onChange={(value) => {\n handleSetFormValues('approvers', value as string[]);\n if (!touched.approvers) handleFieldTouch('approvers');\n }}\n />\n <ErrorMessage touched={touched.approvers} error={errors.approvers} />\n </div>\n </div>\n <div\n data-testid=\"form-buttons\"\n className=\"b2b-purchase-order-approval-rule-form__buttons\"\n >\n <Button\n data-testid=\"save-button\"\n type=\"button\"\n disabled={disabledInputField}\n onClick={handleSubmit}\n >\n {t.buttonSave}\n </Button>\n\n <Button\n data-testid=\"cancel-button\"\n disabled={isLoading}\n variant=\"secondary\"\n onClick={() => {\n window.location.href = routeApprovalRulesList?.() ?? '';\n }}\n >\n {t.buttonCancel}\n </Button>\n </div>\n </form>\n );\n};\n\nexport default Form;\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 { FunctionComponent } from 'preact';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { Card, InLineAlert } from '@adobe-commerce/elsie/components';\nimport {\n useApprovalRuleForm,\n useCustomerRolePermissions,\n} from '@/b2b-purchase-order/hooks';\nimport { ApprovalRuleFormProps } from '@/b2b-purchase-order/types/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Form } from '@/b2b-purchase-order/components/ApprovalRuleForm/blocks';\nimport '@/b2b-purchase-order/components/ApprovalRuleForm/ApprovalRuleForm.css';\nimport {\n PurchaseOrdersHeader,\n FormLoader,\n} from '@/b2b-purchase-order/components';\n\nexport const ApprovalRuleForm: FunctionComponent<ApprovalRuleFormProps> = ({\n className,\n approvalRuleID,\n withHeader,\n withWrapper,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n}) => {\n const t = useText({\n headerText: 'PurchaseOrders.approvalRuleForm.headerText',\n titleAppliesTo: 'PurchaseOrders.approvalRuleForm.titleAppliesTo',\n titleRuleType: 'PurchaseOrders.approvalRuleForm.titleRuleType',\n titleRequiresApprovalRole:\n 'PurchaseOrders.approvalRuleForm.titleRequiresApprovalRole',\n formEnabled: 'PurchaseOrders.approvalRuleForm.fields.enabled',\n formDisabled: 'PurchaseOrders.approvalRuleForm.fields.disabled',\n inputRuleNameFloatingLabel:\n 'PurchaseOrders.approvalRuleForm.fields.inputRuleName.floatingLabel',\n inputRuleNamePlaceholder:\n 'PurchaseOrders.approvalRuleForm.fields.inputRuleName.placeholder',\n textAreaDescriptionLabel:\n 'PurchaseOrders.approvalRuleForm.fields.textAreaDescription.label',\n appliesToAllUsers:\n 'PurchaseOrders.approvalRuleForm.fields.appliesTo.allUsers',\n appliesToSpecificRoles:\n 'PurchaseOrders.approvalRuleForm.fields.appliesTo.specificRoles',\n ruleTypeGrandTotal:\n 'PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.grandTotal',\n ruleTypeShippingInclTax:\n 'PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.shippingInclTax',\n ruleTypeNumberOfSkus:\n 'PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.numberOfSkus',\n conditionOperatorMoreThan:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThan',\n conditionOperatorLessThan:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThan',\n conditionOperatorMoreThanOrEqualTo:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThanOrEqualTo',\n conditionOperatorLessThanOrEqualTo:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThanOrEqualTo',\n inputQuantityFloatingLabel:\n 'PurchaseOrders.approvalRuleForm.fields.inputQuantity.floatingLabel',\n inputQuantityPlaceholder:\n 'PurchaseOrders.approvalRuleForm.fields.inputQuantity.placeholder',\n inputAmountFloatingLabel:\n 'PurchaseOrders.approvalRuleForm.fields.inputAmount.floatingLabel',\n inputAmountPlaceholder:\n 'PurchaseOrders.approvalRuleForm.fields.inputAmount.placeholder',\n buttonCancel: 'PurchaseOrders.approvalRuleForm.fields.buttons.cancel',\n buttonSave: 'PurchaseOrders.approvalRuleForm.fields.buttons.save',\n });\n const { permissions, loadingPermissions } = useCustomerRolePermissions();\n const {\n availableRequiresApprovalFrom,\n conditionOperators,\n availableAppliesTo,\n appliesToOptions,\n ruleTypeOptions,\n currencies,\n formValues,\n errors,\n touched,\n isLoading,\n submitError,\n formLoading,\n handleSubmit,\n handleFieldTouch,\n handleSetFormValues,\n } = useApprovalRuleForm({\n t,\n approvalRuleID,\n loadingPermissions,\n permissions,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n });\n\n if (formLoading) {\n return (\n <FormLoader\n testId=\"b2b-purchase-order-approval-rule-form\"\n className={classes([\n 'b2b-purchase-order-approval-rule-form',\n className,\n ])}\n />\n );\n }\n\n const renderContentForm = (\n <>\n {!!submitError && <InLineAlert heading=\"\" description={submitError} />}\n <Form\n availableRequiresApprovalFrom={availableRequiresApprovalFrom}\n conditionOperators={conditionOperators}\n availableAppliesTo={availableAppliesTo}\n appliesToOptions={appliesToOptions}\n ruleTypeOptions={ruleTypeOptions}\n currencies={currencies}\n formValues={formValues}\n errors={errors}\n touched={touched}\n isLoading={isLoading}\n handleSubmit={handleSubmit}\n handleFieldTouch={handleFieldTouch}\n handleSetFormValues={handleSetFormValues}\n permissions={permissions}\n routeApprovalRulesList={routeApprovalRulesList}\n t={t}\n />\n </>\n );\n\n return (\n <div\n data-testid=\"b2b-purchase-order-approval-rule-form\"\n className={classes(['b2b-purchase-order-approval-rule-form', className])}\n >\n {withHeader ? <PurchaseOrdersHeader headerText={t.headerText} /> : null}\n {withWrapper ? (\n <Card variant=\"secondary\">{renderContentForm}</Card>\n ) : (\n renderContentForm\n )}\n </div>\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 { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { ApprovalRuleFormProps } from '@/b2b-purchase-order/types/containers';\nimport { ApprovalRuleForm as ApprovalRuleFormComponent } from '@/b2b-purchase-order/components';\n\nexport const ApprovalRuleForm: Container<ApprovalRuleFormProps> = ({\n withHeader = true,\n withWrapper = true,\n className,\n approvalRuleID,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n}) => {\n return (\n <div\n data-testid=\"b2b-purchase-order-approval-rule-form-container\"\n className={classes([\n 'b2b-purchase-order-approval-rule-form-container',\n className,\n ])}\n >\n <ApprovalRuleFormComponent\n withWrapper={withWrapper}\n withHeader={withHeader}\n approvalRuleID={approvalRuleID}\n routeApprovalRulesList={routeApprovalRulesList}\n onSubmit={onSubmit}\n onChange={onChange}\n />\n </div>\n );\n};\n"],"names":["updateFormFieldValue","formValues","key","value","newFormValues","numericValue","validateFormFields","values","errors","updateValidationErrors","newErrors","currentErrors","touchedFields","updatedErrors","errorKey","RULE_TYPE_OPTIONS_KEYS","CONDITION_OPERATORS_KEYS","APPLIES_TO_OPTIONS_KEYS","INITIAL_FORM_VALUES","INITIAL_FORM_STATE","REQUIRED_FIELDS_ON_SUBMIT","VALIDATION_ERROR_KEYS","createRuleTypeOptions","t","createConditionOperators","createAppliesToOptions","DEFAULT_STATUS","DEFAULT_ATTRIBUTE","DEFAULT_OPERATOR","DEFAULT_CURRENCY","DEFAULT_QUANTITY","DEFAULT_AMOUNT_VALUE","isValidAttribute","attribute","isValidOperator","operator","transformToFormValues","data","_a","_b","role","_c","_e","_d","_g","_f","_h","_i","_j","hasValue","cleanAndDeep","roleType","appliesTo","condition","restAll","roleConfig","conditionConfig","amount","quantity","restCondition","newCondition","toSnakeCase","formReducer","state","action","newTouched","allErrors","fieldName","useApprovalRuleForm","approvalRuleID","routeApprovalRulesList","onSubmit","onChange","permissions","loadingPermissions","dispatch","useReducer","ruleTypeOptions","useMemo","conditionOperators","appliesToOptions","useEffect","currencyInfo","error","getPurchaseOrderApprovalRuleMetadata","availableAppliesTo","availableRequiresApprovalFrom","getPurchaseOrderApprovalRule","ruleData","handleSetFormValues","useCallback","handleFieldTouch","handleSubmit","validationErrors","cleanedData","updatePurchaseOrderApprovalRule","createPurchaseOrderApprovalRule","formLoading","ErrorMessage","touched","className","Text","Form","currencies","isLoading","disabledInputField","jsxs","jsx","Checkbox","event","Input","TextArea","option","index","RadioButton","MultiSelect","Picker","item","Button","ApprovalRuleForm","withHeader","withWrapper","useText","useCustomerRolePermissions","submitError","FormLoader","classes","renderContentForm","Fragment","InLineAlert","PurchaseOrdersHeader","Card","ApprovalRuleFormComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApprovalRuleForm.js","sources":["/@dropins/storefront-purchase-order/src/lib/updateFormFieldValue.ts","/@dropins/storefront-purchase-order/src/lib/formValidation.ts","/@dropins/storefront-purchase-order/src/configs/approvalRuleForm.config.ts","/@dropins/storefront-purchase-order/src/lib/transformToFormValues.ts","/@dropins/storefront-purchase-order/src/lib/cleanAndDeep.ts","/@dropins/storefront-purchase-order/src/hooks/useApprovalRuleForm.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleForm/blocks/ErrorMessage.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleForm/blocks/Form.tsx","/@dropins/storefront-purchase-order/src/components/ApprovalRuleForm/ApprovalRuleForm.tsx","/@dropins/storefront-purchase-order/src/containers/ApprovalRuleForm/ApprovalRuleForm.tsx"],"sourcesContent":["import {\n ConditionAttributeType,\n ConditionOperatorType,\n FormValuesParams,\n} from '../types/hooks';\n\nexport const updateFormFieldValue = (\n formValues: FormValuesParams,\n key: string,\n value: string | number | boolean | string[]\n): FormValuesParams => {\n const newFormValues = { ...formValues };\n\n switch (key) {\n case 'status':\n newFormValues.status = value ? 'ENABLED' : 'DISABLED';\n break;\n case 'name':\n newFormValues.name = value as string;\n break;\n case 'description':\n newFormValues.description = value as string;\n break;\n case 'ruleType':\n newFormValues.condition.attribute = value as ConditionAttributeType;\n break;\n case 'ruleCondition':\n newFormValues.condition.operator = value as ConditionOperatorType;\n break;\n case 'ruleValue': {\n let numericValue =\n typeof value === 'string' ? value.replace(/[^\\d]/g, '') : String(value);\n\n if (numericValue === '') {\n if (newFormValues.condition.attribute === 'NUMBER_OF_SKUS') {\n newFormValues.condition.quantity = '';\n } else {\n newFormValues.condition.amount.value = '';\n }\n } else if (newFormValues.condition.attribute === 'NUMBER_OF_SKUS') {\n newFormValues.condition.quantity = +numericValue;\n } else {\n newFormValues.condition.amount.value = +numericValue;\n }\n break;\n }\n case 'ruleConditionCurrency':\n newFormValues.condition.amount.currency = value as string;\n break;\n case 'approvers':\n newFormValues.approvers = value as string[];\n break;\n case 'roleType':\n newFormValues.roleType = value as string;\n break;\n case 'appliesTo':\n newFormValues.appliesTo = value as string[];\n break;\n default:\n break;\n }\n\n return newFormValues;\n};\n","import {\n FormValuesParams,\n ValidationApprovalFormError,\n} from '@/b2b-purchase-order/types/hooks';\n\n/**\n * Validates all form fields and returns validation errors\n * This function contains the core validation logic for the approval rule form\n */\nexport const validateFormFields = (\n values: FormValuesParams\n): ValidationApprovalFormError => {\n const errors: ValidationApprovalFormError = {};\n\n // Validate rule name (required)\n if (!values.name || values.name.trim() === '') {\n errors.name = 'PurchaseOrders.approvalRuleForm.errorsMessages.required';\n }\n\n // Validate appliesTo when specific roles are selected\n if (\n values.roleType === 'specific_roles' &&\n (!values.appliesTo || values.appliesTo.length === 0)\n ) {\n errors.appliesTo =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.approvers';\n }\n\n // Validate rule value based on condition type\n if (values.condition.attribute === 'NUMBER_OF_SKUS') {\n if (values.condition.quantity === '') {\n errors.ruleValue =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.required';\n }\n } else if (values.condition.amount.value === '') {\n errors.ruleValue =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.required';\n }\n\n // Validate approvers (required)\n if (!values.approvers || values.approvers.length === 0) {\n errors.approvers =\n 'PurchaseOrders.approvalRuleForm.errorsMessages.approvers';\n }\n\n return errors;\n};\n\n/**\n * Returns only the errors for fields that have been touched by the user\n * This prevents showing validation errors for fields the user hasn't interacted with yet\n */\nexport const getVisibleErrors = (\n allErrors: ValidationApprovalFormError,\n touchedFields: { [key: string]: boolean }\n): ValidationApprovalFormError => {\n const visibleErrors: ValidationApprovalFormError = {};\n\n // Only include errors for touched fields\n Object.keys(allErrors).forEach((errorKey) => {\n if (touchedFields[errorKey]) {\n visibleErrors[errorKey] = allErrors[errorKey];\n }\n });\n\n return visibleErrors;\n};\n\n/**\n * Updates errors based on new validation results and touched fields\n * This is used for incremental validation as the user fills out the form\n */\nexport const updateValidationErrors = (\n newErrors: ValidationApprovalFormError,\n currentErrors: ValidationApprovalFormError,\n touchedFields: { [key: string]: boolean }\n): ValidationApprovalFormError => {\n const updatedErrors: ValidationApprovalFormError = { ...currentErrors };\n\n // Add new errors for touched fields\n Object.keys(newErrors).forEach((errorKey) => {\n if (touchedFields[errorKey]) {\n updatedErrors[errorKey] = newErrors[errorKey];\n }\n });\n\n // Remove errors for fields that became valid\n Object.keys(updatedErrors).forEach((errorKey) => {\n if (touchedFields[errorKey] && !newErrors[errorKey]) {\n delete updatedErrors[errorKey];\n }\n });\n\n return updatedErrors;\n};\n","import { FormValuesParams, FormState } from '@/b2b-purchase-order/types/hooks';\n\nexport const RULE_TYPE_OPTIONS_KEYS = {\n GRAND_TOTAL: 'ruleTypeGrandTotal',\n SHIPPING_INCL_TAX: 'ruleTypeShippingInclTax',\n NUMBER_OF_SKUS: 'ruleTypeNumberOfSkus',\n} as const;\n\nexport const CONDITION_OPERATORS_KEYS = {\n MORE_THAN: 'conditionOperatorMoreThan',\n LESS_THAN: 'conditionOperatorLessThan',\n MORE_THAN_OR_EQUAL_TO: 'conditionOperatorMoreThanOrEqualTo',\n LESS_THAN_OR_EQUAL_TO: 'conditionOperatorLessThanOrEqualTo',\n} as const;\n\nexport const APPLIES_TO_OPTIONS_KEYS = {\n ALL_USERS: 'appliesToAllUsers',\n SPECIFIC_ROLES: 'appliesToSpecificRoles',\n} as const;\n\n/**\n * Initial values for the approval rule form\n * Used when creating a new rule\n */\nexport const INITIAL_FORM_VALUES: FormValuesParams = {\n status: 'DISABLED',\n name: '',\n description: '',\n roleType: 'all_users',\n appliesTo: [],\n condition: {\n quantity: '',\n amount: {\n currency: 'USD',\n value: '',\n },\n attribute: 'GRAND_TOTAL',\n operator: 'MORE_THAN',\n },\n approvers: [],\n};\n\n/**\n * Initial state for the form reducer\n * Includes form values, loading states, and validation\n */\nexport const INITIAL_FORM_STATE: FormState = {\n formValues: INITIAL_FORM_VALUES,\n isLoading: false,\n submitError: null,\n availableAppliesTo: [],\n availableRequiresApprovalFrom: [],\n errors: {},\n touched: {},\n currencyCodesList: [{ text: 'USD', value: 'USD' }],\n};\n\n/**\n * Fields that must be touched (validated) on form submission\n */\nexport const REQUIRED_FIELDS_ON_SUBMIT = {\n name: true,\n appliesTo: true,\n ruleValue: true,\n approvers: true,\n} as const;\n\n/**\n * Translation keys for validation error messages\n */\nexport const VALIDATION_ERROR_KEYS = {\n REQUIRED: 'PurchaseOrders.approvalRuleForm.errorsMessages.required',\n APPROVERS: 'PurchaseOrders.approvalRuleForm.errorsMessages.approvers',\n FAILED_TO_LOAD: 'Failed to load metadata. Please try again.',\n FAILED_TO_CREATE: 'Failed to create approval rule. Please try again.',\n} as const;\n\n/**\n * Creates rule type options for the dropdown\n * @param t - Translation function\n */\n/**\n * Creates rule type options for the dropdown\n * @param t - Translation function\n */\nexport const createRuleTypeOptions = (t: Record<string, string>) => [\n {\n text: t[RULE_TYPE_OPTIONS_KEYS.GRAND_TOTAL],\n value: 'GRAND_TOTAL',\n },\n {\n text: t[RULE_TYPE_OPTIONS_KEYS.SHIPPING_INCL_TAX],\n value: 'SHIPPING_INCL_TAX',\n },\n {\n text: t[RULE_TYPE_OPTIONS_KEYS.NUMBER_OF_SKUS],\n value: 'NUMBER_OF_SKUS',\n },\n];\n\n/**\n * Creates condition operator options for the dropdown\n * @param t - Translation function\n */\nexport const createConditionOperators = (t: Record<string, string>) => [\n { text: t[CONDITION_OPERATORS_KEYS.MORE_THAN], value: 'MORE_THAN' },\n {\n text: t[CONDITION_OPERATORS_KEYS.LESS_THAN],\n value: 'LESS_THAN',\n },\n {\n text: t[CONDITION_OPERATORS_KEYS.MORE_THAN_OR_EQUAL_TO],\n value: 'MORE_THAN_OR_EQUAL_TO',\n },\n {\n text: t[CONDITION_OPERATORS_KEYS.LESS_THAN_OR_EQUAL_TO],\n value: 'LESS_THAN_OR_EQUAL_TO',\n },\n];\n\n/**\n * Creates \"applies to\" options for the dropdown\n * @param t - Translation function\n */\nexport const createAppliesToOptions = (t: Record<string, string>) => [\n { text: t[APPLIES_TO_OPTIONS_KEYS.ALL_USERS], value: 'all_users' },\n {\n text: t[APPLIES_TO_OPTIONS_KEYS.SPECIFIC_ROLES],\n value: 'specific_roles',\n },\n];\n","import { PurchaseOrderApprovalRuleModel } from '@/b2b-purchase-order/data/models';\nimport {\n ConditionAttributeType,\n ConditionOperatorType,\n FormValuesParams,\n} from '@/b2b-purchase-order/types/hooks';\nimport {\n RULE_TYPE_OPTIONS_KEYS,\n CONDITION_OPERATORS_KEYS,\n} from '@/b2b-purchase-order/configs/approvalRuleForm.config';\n\n// Default values for form fields\nconst DEFAULT_STATUS = 'ENABLED';\nconst DEFAULT_ATTRIBUTE: ConditionAttributeType = 'GRAND_TOTAL';\nconst DEFAULT_OPERATOR: ConditionOperatorType = 'MORE_THAN';\nconst DEFAULT_CURRENCY = 'USD';\nconst DEFAULT_QUANTITY = 0;\nconst DEFAULT_AMOUNT_VALUE = 0;\n\n/**\n * Checks if the given attribute is a valid condition attribute type\n */\nconst isValidAttribute = (\n attribute: any\n): attribute is ConditionAttributeType => {\n return Object.keys(RULE_TYPE_OPTIONS_KEYS).includes(attribute);\n};\n\n/**\n * Checks if the given operator is a valid condition operator type\n */\nconst isValidOperator = (operator: any): operator is ConditionOperatorType => {\n return Object.keys(CONDITION_OPERATORS_KEYS).includes(operator);\n};\n\n/**\n * Transforms API response data to form values format\n * Handles all the necessary data conversions and provides safe defaults\n */\nexport const transformToFormValues = (\n data: PurchaseOrderApprovalRuleModel\n): FormValuesParams => {\n return {\n status: (data.status as 'ENABLED' | 'DISABLED') || DEFAULT_STATUS,\n name: data.name || '',\n description: data.description || '',\n roleType: data.appliesToRoles?.length > 0 ? 'specific_roles' : 'all_users',\n appliesTo: data.appliesToRoles?.map((role) => role.id) || [],\n condition: {\n quantity: data.condition?.quantity ?? DEFAULT_QUANTITY,\n amount: {\n currency: data.condition?.amount?.currency || DEFAULT_CURRENCY,\n value: data.condition?.amount?.value ?? DEFAULT_AMOUNT_VALUE,\n },\n attribute: isValidAttribute(data.condition?.attribute)\n ? data.condition.attribute\n : DEFAULT_ATTRIBUTE,\n operator: isValidOperator(data.condition?.operator)\n ? data.condition.operator\n : DEFAULT_OPERATOR,\n },\n approvers: data.approverRoles?.map((role) => role.id) || [],\n };\n};\n","import { toSnakeCase } from './case-converter';\n\n/**\n * Checks if a value should be considered as \"has value\" for form submission\n * Empty strings and null/undefined are considered as no value\n * Zero (0) is considered as no value to match existing behavior\n */\nconst hasValue = (value: any): boolean => {\n return value !== null && value !== undefined && value !== '' && value !== 0;\n};\n\n/**\n * Cleans form values and converts to snake_case for API submission\n * - Handles role type logic (all_users vs specific_roles)\n * - Removes empty condition values (amount or quantity)\n * - Converts camelCase keys to snake_case\n */\nexport function cleanAndDeep(formValues: Record<string, any>): any {\n const { roleType, appliesTo, condition, ...restAll } = formValues;\n\n // Handle role type logic: all_users means empty appliesTo array\n const roleConfig =\n roleType === 'all_users' ? { appliesTo: [] } : { appliesTo };\n\n // Build condition config with only non-empty values\n let conditionConfig = {};\n\n if (condition) {\n const { amount, quantity, ...restCondition } = condition;\n\n const newCondition = { ...restCondition };\n\n // Only include amount if it has a valid value\n if (hasValue(amount?.value)) {\n newCondition.amount = amount;\n }\n\n // Only include quantity if it has a valid value\n if (hasValue(quantity)) {\n newCondition.quantity = quantity;\n }\n\n conditionConfig = newCondition;\n }\n\n // Convert to snake_case for API\n const result = toSnakeCase({\n ...restAll,\n ...roleConfig,\n condition: conditionConfig,\n });\n\n return result;\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 { useCallback, useEffect, useMemo, useReducer } from 'preact/hooks';\nimport {\n FormAction,\n FormState,\n UseApprovalRuleFormProps,\n UseApprovalRuleFormReturn,\n} from '@/b2b-purchase-order/types/hooks';\n\nimport {\n currencyInfo,\n getPurchaseOrderApprovalRule,\n createPurchaseOrderApprovalRule,\n updatePurchaseOrderApprovalRule,\n getPurchaseOrderApprovalRuleMetadata,\n} from '@/b2b-purchase-order/api';\nimport {\n updateFormFieldValue,\n validateFormFields,\n updateValidationErrors,\n transformToFormValues,\n cleanAndDeep,\n} from '@/b2b-purchase-order/lib';\nimport {\n INITIAL_FORM_STATE,\n REQUIRED_FIELDS_ON_SUBMIT,\n VALIDATION_ERROR_KEYS,\n createRuleTypeOptions,\n createConditionOperators,\n createAppliesToOptions,\n} from '@/b2b-purchase-order/configs';\n\n// Reducer function - handles all state updates in one place\nfunction formReducer(state: FormState, action: FormAction): FormState {\n switch (action.type) {\n case 'SET_LOADING':\n return { ...state, isLoading: action.payload };\n\n case 'SET_SUBMIT_ERROR':\n return { ...state, submitError: action.payload };\n\n case 'SET_FORM_VALUES':\n return { ...state, formValues: action.payload };\n\n case 'SET_AVAILABLE_APPLIES_TO':\n return { ...state, availableAppliesTo: action.payload };\n\n case 'SET_AVAILABLE_APPROVERS':\n return { ...state, availableRequiresApprovalFrom: action.payload };\n\n case 'SET_ERRORS':\n return { ...state, errors: action.payload };\n\n case 'SET_TOUCHED':\n return { ...state, touched: action.payload };\n\n case 'SET_CURRENCIES':\n return { ...state, currencyCodesList: action.payload };\n\n case 'UPDATE_FIELD': {\n const { key, value } = action.payload;\n const newFormValues = updateFormFieldValue(state.formValues, key, value);\n\n // Build new touched state\n const newTouched = { ...state.touched, [key]: true };\n\n // Special case: when roleType changes to specific_roles, mark appliesTo as touched\n if (key === 'roleType' && value === 'specific_roles') {\n newTouched.appliesTo = true;\n }\n\n // Validate and get updated errors\n const allErrors = validateFormFields(newFormValues);\n const newErrors = updateValidationErrors(\n allErrors,\n state.errors,\n newTouched\n );\n\n return {\n ...state,\n formValues: newFormValues,\n touched: newTouched,\n errors: newErrors,\n };\n }\n\n case 'TOUCH_FIELD': {\n const fieldName = action.payload;\n const newTouched = { ...state.touched, [fieldName]: true };\n\n // Validate and update errors for touched field\n const allErrors = validateFormFields(state.formValues);\n const newErrors = updateValidationErrors(\n allErrors,\n state.errors,\n newTouched\n );\n\n return {\n ...state,\n touched: newTouched,\n errors: newErrors,\n };\n }\n\n case 'MARK_FIELDS_TOUCHED': {\n const newTouched = { ...state.touched, ...action.payload };\n const allErrors = validateFormFields(state.formValues);\n const newErrors = updateValidationErrors(\n allErrors,\n state.errors,\n newTouched\n );\n\n return {\n ...state,\n touched: newTouched,\n errors: newErrors,\n };\n }\n\n default:\n return state;\n }\n}\n\nexport const useApprovalRuleForm = ({\n t,\n approvalRuleID,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n permissions,\n loadingPermissions,\n}: UseApprovalRuleFormProps): UseApprovalRuleFormReturn => {\n const [state, dispatch] = useReducer(formReducer, INITIAL_FORM_STATE);\n\n // Memoize options to prevent re-creation on each render\n const ruleTypeOptions = useMemo(() => createRuleTypeOptions(t), [t]);\n const conditionOperators = useMemo(() => createConditionOperators(t), [t]);\n const appliesToOptions = useMemo(() => createAppliesToOptions(t), [t]);\n\n // Load initial data (currencies and approval rule metadata)\n useEffect(() => {\n dispatch({ type: 'SET_LOADING', payload: true });\n\n // Load currency codes\n currencyInfo()\n .then((data) => {\n dispatch({\n type: 'SET_CURRENCIES',\n payload: data.availableCurrencyCodes,\n });\n })\n .catch((error) => {\n console.error('Failed to fetch currencies:', error);\n });\n\n // Load metadata (available roles) first - always needed\n getPurchaseOrderApprovalRuleMetadata()\n .then((data) => {\n const { availableAppliesTo, availableRequiresApprovalFrom } = data;\n dispatch({\n type: 'SET_AVAILABLE_APPLIES_TO',\n payload: availableAppliesTo,\n });\n dispatch({\n type: 'SET_AVAILABLE_APPROVERS',\n payload: availableRequiresApprovalFrom,\n });\n\n // Then load approval rule data if in edit mode\n if (approvalRuleID) {\n return getPurchaseOrderApprovalRule(approvalRuleID);\n }\n return null;\n })\n .then((ruleData) => {\n if (ruleData) {\n // Edit mode: set form values from existing rule\n dispatch({\n type: 'SET_FORM_VALUES',\n payload: transformToFormValues(ruleData),\n });\n }\n dispatch({ type: 'SET_SUBMIT_ERROR', payload: null });\n })\n .catch((error) => {\n console.error('Failed to fetch data:', error);\n dispatch({\n type: 'SET_SUBMIT_ERROR',\n payload: VALIDATION_ERROR_KEYS.FAILED_TO_LOAD,\n });\n })\n .finally(() => {\n dispatch({ type: 'SET_LOADING', payload: false });\n });\n }, [approvalRuleID]);\n\n // Handler for field value changes\n const handleSetFormValues = useCallback(\n (key: string, value: string | number | boolean | string[]) => {\n dispatch({ type: 'UPDATE_FIELD', payload: { key, value } });\n if (onChange) {\n onChange({ ...state.formValues, [key]: value });\n }\n },\n [onChange, state.formValues]\n );\n\n // Handler for field touch (blur)\n const handleFieldTouch = useCallback(\n (fieldName: string) => {\n dispatch({ type: 'TOUCH_FIELD', payload: fieldName });\n if (onChange) {\n onChange(state.formValues);\n }\n },\n [onChange, state.formValues]\n );\n\n // Handler for form submission\n const handleSubmit = useCallback(async () => {\n dispatch({ type: 'SET_LOADING', payload: true });\n dispatch({ type: 'SET_SUBMIT_ERROR', payload: null });\n\n // Mark all required fields as touched to show all errors\n dispatch({\n type: 'MARK_FIELDS_TOUCHED',\n payload: REQUIRED_FIELDS_ON_SUBMIT,\n });\n\n // Validate form\n const validationErrors = validateFormFields(state.formValues);\n\n if (Object.keys(validationErrors).length > 0) {\n dispatch({ type: 'SET_ERRORS', payload: validationErrors });\n dispatch({ type: 'SET_LOADING', payload: false });\n return;\n }\n\n // Clean and prepare data for API\n const cleanedData = cleanAndDeep(state.formValues);\n\n // Submit to API (create or update based on approvalRuleID)\n try {\n let data;\n\n if (approvalRuleID) {\n // Update existing approval rule\n data = await updatePurchaseOrderApprovalRule({\n uid: approvalRuleID,\n ...cleanedData,\n });\n } else {\n // Create new approval rule\n data = await createPurchaseOrderApprovalRule(cleanedData);\n }\n\n if (!data.uid) {\n dispatch({\n type: 'SET_SUBMIT_ERROR',\n payload: VALIDATION_ERROR_KEYS.FAILED_TO_CREATE,\n });\n dispatch({ type: 'SET_LOADING', payload: false });\n return;\n }\n\n // Success - call onSubmit callback if provided\n if (onSubmit) {\n // If onSubmit expects form values, pass state.formValues, else pass data\n onSubmit(state.formValues as any);\n }\n dispatch({ type: 'SET_LOADING', payload: false });\n window.location.href = routeApprovalRulesList?.() ?? '';\n } catch (error) {\n console.error('Failed to save approval rule:', error);\n dispatch({\n type: 'SET_SUBMIT_ERROR',\n payload: VALIDATION_ERROR_KEYS.FAILED_TO_CREATE,\n });\n dispatch({ type: 'SET_LOADING', payload: false });\n }\n }, [state.formValues, routeApprovalRulesList, approvalRuleID, onSubmit]);\n\n // Memoized: true if form is loading or permissions not loaded or missing required permission\n const formLoading = useMemo(() => {\n if (state.isLoading || loadingPermissions) return true;\n\n if (\n !permissions?.permissions.viewApprovalRules &&\n !permissions?.permissions.manageApprovalRules\n ) {\n return true;\n }\n\n return false;\n }, [state.isLoading, loadingPermissions, permissions]);\n\n return {\n availableAppliesTo: state.availableAppliesTo,\n availableRequiresApprovalFrom: state.availableRequiresApprovalFrom,\n formValues: state.formValues,\n ruleTypeOptions,\n conditionOperators,\n currencies: state.currencyCodesList,\n appliesToOptions,\n handleSetFormValues,\n handleSubmit,\n handleFieldTouch,\n errors: state.errors,\n touched: state.touched,\n isLoading: state.isLoading,\n formLoading,\n submitError: state.submitError,\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 { Text } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\n\nconst ErrorMessage: FunctionComponent<{\n touched?: boolean;\n error?: string;\n className?: string;\n}> = ({ touched = false, error, className = 'error-message' }) => {\n if (!touched || !error) {\n return null;\n }\n\n return (\n <span className={className}>\n <Text id={error} />\n </span>\n );\n};\n\nexport default ErrorMessage;\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 {\n Input,\n Picker,\n TextArea,\n RadioButton,\n Checkbox,\n MultiSelect,\n Button,\n} from '@adobe-commerce/elsie/components';\nimport { ErrorMessage } from '@/b2b-purchase-order/components/ApprovalRuleForm/blocks';\nimport { CustomerRolePermissionsModel } from '@/b2b-purchase-order/data/models';\n\nconst Form = ({\n availableRequiresApprovalFrom,\n conditionOperators,\n availableAppliesTo,\n appliesToOptions,\n ruleTypeOptions,\n currencies,\n formValues,\n errors,\n touched,\n isLoading,\n permissions,\n handleSubmit,\n handleFieldTouch,\n handleSetFormValues,\n routeApprovalRulesList,\n t,\n}: {\n availableRequiresApprovalFrom: { id: string; name: string }[];\n conditionOperators: { value: string; text: string }[];\n availableAppliesTo: { id: string; name: string }[];\n appliesToOptions: { value: string; text: string }[];\n ruleTypeOptions: { value: string; text: string }[];\n currencies: { value: string; text: string }[];\n formValues: any;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n isLoading: boolean;\n permissions?: CustomerRolePermissionsModel;\n handleSubmit: () => void;\n handleFieldTouch: (field: string) => void;\n handleSetFormValues: (field: string, value: any) => void;\n routeApprovalRulesList?: () => string;\n t: Record<string, string>;\n}) => {\n const disabledInputField =\n isLoading || !permissions?.permissions?.viewApprovalRules;\n\n return (\n <form data-testid=\"approval-rule-form\">\n <Checkbox\n data-testid=\"status-toggle\"\n className=\"b2b-purchase-order-approval-rule-form__toggle\"\n disabled={disabledInputField}\n name=\"status\"\n label={formValues.status === 'ENABLED' ? t.formEnabled : t.formDisabled}\n checked={formValues.status === 'ENABLED'}\n onChange={(event) => {\n const value = (event.target as HTMLInputElement).checked;\n\n handleSetFormValues('status', value);\n }}\n />\n <div data-testid=\"name-input-container\">\n <Input\n data-testid=\"name-input\"\n className=\"b2b-purchase-order-approval-rule-form__name-input\"\n disabled={disabledInputField}\n name={'name'}\n floatingLabel={t.inputRuleNameFloatingLabel}\n placeholder={t.inputRuleNamePlaceholder}\n value={formValues.name}\n error={!!(touched.name && errors.name)}\n onValue={(value) => handleSetFormValues('name', value)}\n onBlur={() => handleFieldTouch('name')}\n />\n <ErrorMessage touched={touched.name} error={errors.name} />\n </div>\n <TextArea\n data-testid=\"description-textarea\"\n className=\"b2b-purchase-order-approval-rule-form__description\"\n disabled={disabledInputField}\n name=\"description\"\n label={t.textAreaDescriptionLabel}\n value={formValues.description}\n onChange={(event) => {\n const value = (event.target as HTMLTextAreaElement).value;\n handleSetFormValues('description', value);\n }}\n />\n <div\n data-testid=\"applies-to-section\"\n className=\"b2b-purchase-order-approval-rule-form__applies-to\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__applies-to-title\">\n {t.titleAppliesTo}\n </span>\n {appliesToOptions.map((option, index) => {\n return (\n <RadioButton\n key={option.value}\n data-testid={`applies-to-radio-${index}`}\n disabled={disabledInputField}\n name=\"radio-group\"\n value={option.value}\n label={option.text}\n checked={formValues.roleType === option.value}\n onChange={(event) => {\n const value = (event.target as HTMLInputElement).value;\n handleSetFormValues('roleType', value);\n }}\n />\n );\n })}\n {formValues.roleType === 'specific_roles' ? (\n <div\n data-testid=\"applies-to-multiselect-container\"\n className=\"b2b-purchase-order-approval-rule-form__applies-to-multiselect\"\n >\n <MultiSelect\n data-testid=\"applies-to-multiselect\"\n disabled={disabledInputField}\n name=\"appliesTo\"\n value={[...formValues.appliesTo]}\n options={availableAppliesTo.map((option) => ({\n value: option.id,\n label: option.name,\n }))}\n error={!!(touched.appliesTo && errors.appliesTo)}\n onChange={(value) => {\n handleSetFormValues('appliesTo', value as string[]);\n if (!touched.appliesTo) handleFieldTouch('appliesTo');\n }}\n />\n <ErrorMessage\n touched={touched.appliesTo}\n error={errors.appliesTo}\n />\n </div>\n ) : null}\n </div>\n <div\n data-testid=\"rule-type-section\"\n className=\"b2b-purchase-order-approval-rule-form__rule-type\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__rule-type-title\">\n {t.titleRuleType}\n </span>\n <Picker\n data-testid=\"rule-type-picker\"\n className=\"b2b-purchase-order-approval-rule-form__rule-type-picker\"\n disabled={disabledInputField}\n name=\"ruleType\"\n value={formValues.condition.attribute}\n options={ruleTypeOptions}\n handleSelect={(event) => {\n const value = (event.target as HTMLSelectElement).value;\n handleSetFormValues('ruleType', value);\n }}\n />\n </div>\n <div\n data-testid=\"rule-condition-section\"\n className=\"b2b-purchase-order-approval-rule-form__rule-condition\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__rule-condition-title\">\n {\n ruleTypeOptions.find(\n (item) => item.value === formValues.condition.attribute\n )?.text\n }\n </span>\n <div className=\"b2b-purchase-order-approval-rule-form__rule-condition-container\">\n <Picker\n data-testid=\"rule-condition-picker\"\n className=\"b2b-purchase-order-approval-rule-form__rule-condition-picker\"\n disabled={disabledInputField}\n name=\"ruleCondition\"\n value={formValues.condition.operator}\n options={conditionOperators}\n handleSelect={(event) => {\n const value = (event.target as HTMLSelectElement).value;\n handleSetFormValues('ruleCondition', value);\n }}\n />\n <div data-testid=\"rule-value-container\">\n <Input\n data-testid=\"rule-value-input\"\n className=\"b2b-purchase-order-approval-rule-form__rule-value-input\"\n disabled={disabledInputField}\n name=\"ruleValue\"\n floatingLabel={\n formValues.condition.attribute === 'NUMBER_OF_SKUS'\n ? t.inputQuantityFloatingLabel\n : t.inputAmountFloatingLabel\n }\n placeholder={\n formValues.condition.attribute === 'NUMBER_OF_SKUS'\n ? t.inputQuantityPlaceholder\n : t.inputAmountPlaceholder\n }\n value={\n formValues.condition.attribute === 'NUMBER_OF_SKUS'\n ? formValues.condition.quantity\n : formValues.condition.amount.value\n }\n error={!!(touched.ruleValue && errors.ruleValue)}\n onChange={(event) => {\n const value = (event.target as HTMLInputElement).value;\n handleSetFormValues('ruleValue', value);\n }}\n onBlur={() => handleFieldTouch('ruleValue')}\n />\n <ErrorMessage\n touched={touched.ruleValue}\n error={errors.ruleValue}\n />\n </div>\n {formValues.condition.attribute !== 'NUMBER_OF_SKUS' ? (\n <Picker\n data-testid=\"rule-condition-currency-picker\"\n className=\"b2b-purchase-order-approval-rule-form__rule-condition-currency-picker\"\n disabled={disabledInputField}\n name=\"ruleConditionCurrency\"\n value={formValues.condition.amount.currency}\n options={currencies}\n handleSelect={(event) => {\n const value = (event.target as HTMLSelectElement).value;\n handleSetFormValues('ruleConditionCurrency', value);\n }}\n />\n ) : null}\n </div>\n </div>\n <div\n data-testid=\"approval-role-section\"\n className=\"b2b-purchase-order-approval-rule-form__approval-role\"\n >\n <span className=\"b2b-purchase-order-approval-rule-form__approval-role-title\">\n {t.titleRequiresApprovalRole}\n </span>\n <div className=\"b2b-purchase-order-approval-rule-form__approval-role-multiselect\">\n <MultiSelect\n data-testid=\"approvers-multiselect\"\n disabled={disabledInputField}\n name=\"approvers\"\n value={[...formValues.approvers]}\n options={availableRequiresApprovalFrom.map((option) => ({\n value: option.id,\n label: option.name,\n }))}\n error={!!(touched.approvers && errors.approvers)}\n onChange={(value) => {\n handleSetFormValues('approvers', value as string[]);\n if (!touched.approvers) handleFieldTouch('approvers');\n }}\n />\n <ErrorMessage touched={touched.approvers} error={errors.approvers} />\n </div>\n </div>\n <div\n data-testid=\"form-buttons\"\n className=\"b2b-purchase-order-approval-rule-form__buttons\"\n >\n <Button\n data-testid=\"save-button\"\n type=\"button\"\n disabled={disabledInputField}\n onClick={handleSubmit}\n >\n {t.buttonSave}\n </Button>\n\n <Button\n data-testid=\"cancel-button\"\n disabled={isLoading}\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n window.location.href = routeApprovalRulesList?.() ?? '';\n }}\n >\n {t.buttonCancel}\n </Button>\n </div>\n </form>\n );\n};\n\nexport default Form;\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 { FunctionComponent } from 'preact';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { Card, InLineAlert } from '@adobe-commerce/elsie/components';\nimport {\n useApprovalRuleForm,\n useCustomerRolePermissions,\n} from '@/b2b-purchase-order/hooks';\nimport { ApprovalRuleFormProps } from '@/b2b-purchase-order/types/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Form } from '@/b2b-purchase-order/components/ApprovalRuleForm/blocks';\nimport '@/b2b-purchase-order/components/ApprovalRuleForm/ApprovalRuleForm.css';\nimport {\n PurchaseOrdersHeader,\n FormLoader,\n} from '@/b2b-purchase-order/components';\n\nexport const ApprovalRuleForm: FunctionComponent<ApprovalRuleFormProps> = ({\n className,\n approvalRuleID,\n withHeader,\n withWrapper,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n}) => {\n const t = useText({\n headerText: 'PurchaseOrders.approvalRuleForm.headerText',\n titleAppliesTo: 'PurchaseOrders.approvalRuleForm.titleAppliesTo',\n titleRuleType: 'PurchaseOrders.approvalRuleForm.titleRuleType',\n titleRequiresApprovalRole:\n 'PurchaseOrders.approvalRuleForm.titleRequiresApprovalRole',\n formEnabled: 'PurchaseOrders.approvalRuleForm.fields.enabled',\n formDisabled: 'PurchaseOrders.approvalRuleForm.fields.disabled',\n inputRuleNameFloatingLabel:\n 'PurchaseOrders.approvalRuleForm.fields.inputRuleName.floatingLabel',\n inputRuleNamePlaceholder:\n 'PurchaseOrders.approvalRuleForm.fields.inputRuleName.placeholder',\n textAreaDescriptionLabel:\n 'PurchaseOrders.approvalRuleForm.fields.textAreaDescription.label',\n appliesToAllUsers:\n 'PurchaseOrders.approvalRuleForm.fields.appliesTo.allUsers',\n appliesToSpecificRoles:\n 'PurchaseOrders.approvalRuleForm.fields.appliesTo.specificRoles',\n ruleTypeGrandTotal:\n 'PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.grandTotal',\n ruleTypeShippingInclTax:\n 'PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.shippingInclTax',\n ruleTypeNumberOfSkus:\n 'PurchaseOrders.approvalRuleForm.fields.ruleTypeOptions.numberOfSkus',\n conditionOperatorMoreThan:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThan',\n conditionOperatorLessThan:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThan',\n conditionOperatorMoreThanOrEqualTo:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.moreThanOrEqualTo',\n conditionOperatorLessThanOrEqualTo:\n 'PurchaseOrders.approvalRuleForm.fields.conditionOperators.lessThanOrEqualTo',\n inputQuantityFloatingLabel:\n 'PurchaseOrders.approvalRuleForm.fields.inputQuantity.floatingLabel',\n inputQuantityPlaceholder:\n 'PurchaseOrders.approvalRuleForm.fields.inputQuantity.placeholder',\n inputAmountFloatingLabel:\n 'PurchaseOrders.approvalRuleForm.fields.inputAmount.floatingLabel',\n inputAmountPlaceholder:\n 'PurchaseOrders.approvalRuleForm.fields.inputAmount.placeholder',\n buttonCancel: 'PurchaseOrders.approvalRuleForm.fields.buttons.cancel',\n buttonSave: 'PurchaseOrders.approvalRuleForm.fields.buttons.save',\n });\n const { permissions, loadingPermissions } = useCustomerRolePermissions();\n const {\n availableRequiresApprovalFrom,\n conditionOperators,\n availableAppliesTo,\n appliesToOptions,\n ruleTypeOptions,\n currencies,\n formValues,\n errors,\n touched,\n isLoading,\n submitError,\n formLoading,\n handleSubmit,\n handleFieldTouch,\n handleSetFormValues,\n } = useApprovalRuleForm({\n t,\n approvalRuleID,\n loadingPermissions,\n permissions,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n });\n\n if (formLoading) {\n return (\n <FormLoader\n testId=\"b2b-purchase-order-approval-rule-form\"\n className={classes([\n 'b2b-purchase-order-approval-rule-form',\n className,\n ])}\n />\n );\n }\n\n const renderContentForm = (\n <>\n {!!submitError && <InLineAlert heading=\"\" description={submitError} />}\n <Form\n availableRequiresApprovalFrom={availableRequiresApprovalFrom}\n conditionOperators={conditionOperators}\n availableAppliesTo={availableAppliesTo}\n appliesToOptions={appliesToOptions}\n ruleTypeOptions={ruleTypeOptions}\n currencies={currencies}\n formValues={formValues}\n errors={errors}\n touched={touched}\n isLoading={isLoading}\n handleSubmit={handleSubmit}\n handleFieldTouch={handleFieldTouch}\n handleSetFormValues={handleSetFormValues}\n permissions={permissions}\n routeApprovalRulesList={routeApprovalRulesList}\n t={t}\n />\n </>\n );\n\n return (\n <div\n data-testid=\"b2b-purchase-order-approval-rule-form\"\n className={classes(['b2b-purchase-order-approval-rule-form', className])}\n >\n {withHeader ? <PurchaseOrdersHeader headerText={t.headerText} /> : null}\n {withWrapper ? (\n <Card variant=\"secondary\">{renderContentForm}</Card>\n ) : (\n renderContentForm\n )}\n </div>\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 { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { ApprovalRuleFormProps } from '@/b2b-purchase-order/types/containers';\nimport { ApprovalRuleForm as ApprovalRuleFormComponent } from '@/b2b-purchase-order/components';\n\nexport const ApprovalRuleForm: Container<ApprovalRuleFormProps> = ({\n withHeader = true,\n withWrapper = true,\n className,\n approvalRuleID,\n routeApprovalRulesList,\n onSubmit,\n onChange,\n}) => {\n return (\n <div\n data-testid=\"b2b-purchase-order-approval-rule-form-container\"\n className={classes([\n 'b2b-purchase-order-approval-rule-form-container',\n className,\n ])}\n >\n <ApprovalRuleFormComponent\n withWrapper={withWrapper}\n withHeader={withHeader}\n approvalRuleID={approvalRuleID}\n routeApprovalRulesList={routeApprovalRulesList}\n onSubmit={onSubmit}\n onChange={onChange}\n />\n </div>\n );\n};\n"],"names":["updateFormFieldValue","formValues","key","value","newFormValues","numericValue","validateFormFields","values","errors","updateValidationErrors","newErrors","currentErrors","touchedFields","updatedErrors","errorKey","RULE_TYPE_OPTIONS_KEYS","CONDITION_OPERATORS_KEYS","APPLIES_TO_OPTIONS_KEYS","INITIAL_FORM_VALUES","INITIAL_FORM_STATE","REQUIRED_FIELDS_ON_SUBMIT","VALIDATION_ERROR_KEYS","createRuleTypeOptions","t","createConditionOperators","createAppliesToOptions","DEFAULT_STATUS","DEFAULT_ATTRIBUTE","DEFAULT_OPERATOR","DEFAULT_CURRENCY","DEFAULT_QUANTITY","DEFAULT_AMOUNT_VALUE","isValidAttribute","attribute","isValidOperator","operator","transformToFormValues","data","_a","_b","role","_c","_e","_d","_g","_f","_h","_i","_j","hasValue","cleanAndDeep","roleType","appliesTo","condition","restAll","roleConfig","conditionConfig","amount","quantity","restCondition","newCondition","toSnakeCase","formReducer","state","action","newTouched","allErrors","fieldName","useApprovalRuleForm","approvalRuleID","routeApprovalRulesList","onSubmit","onChange","permissions","loadingPermissions","dispatch","useReducer","ruleTypeOptions","useMemo","conditionOperators","appliesToOptions","useEffect","currencyInfo","error","getPurchaseOrderApprovalRuleMetadata","availableAppliesTo","availableRequiresApprovalFrom","getPurchaseOrderApprovalRule","ruleData","handleSetFormValues","useCallback","handleFieldTouch","handleSubmit","validationErrors","cleanedData","updatePurchaseOrderApprovalRule","createPurchaseOrderApprovalRule","formLoading","ErrorMessage","touched","className","Text","Form","currencies","isLoading","disabledInputField","jsxs","jsx","Checkbox","event","Input","TextArea","option","index","RadioButton","MultiSelect","Picker","item","Button","ApprovalRuleForm","withHeader","withWrapper","useText","useCustomerRolePermissions","submitError","FormLoader","classes","renderContentForm","Fragment","InLineAlert","PurchaseOrdersHeader","Card","ApprovalRuleFormComponent"],"mappings":"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"}
|
package/i18n/en_US.json.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-purchase-order", "version": "0.0.4-
|
|
1
|
+
{"name": "@dropins/storefront-purchase-order", "version": "0.0.4-alpha3", "@dropins/tools": "^1.6.0-alpha2", "license": "SEE LICENSE IN LICENSE.md"}
|
package/render.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
(function(t,a){try{if(typeof document<"u"){const e=document.createElement("style"),i=a.styleId;for(const r in a.attributes)e.setAttribute(r,a.attributes[r]);e.setAttribute("data-dropin",i),e.appendChild(document.createTextNode(t));const o=document.querySelector('style[data-dropin="sdk"]');if(o)o.after(e);else{const r=document.querySelector('link[rel="stylesheet"], style');r?r.before(e):document.head.append(e)}}}catch(e){console.error("dropin-styles (injectCodeFunction)",e)}})(`.dropin-skeleton{--row-gap-spacing: var(--spacing-medium);display:grid;grid-template-columns:1fr 1fr;gap:var(--row-gap-spacing)}.dropin-skeleton .dropin-skeleton--row__content{background:var(--color-neutral-300) linear-gradient(to right,var(--color-neutral-300) 0%,var(--color-neutral-100) 20%,var(--color-neutral-300) 40%,var(--color-neutral-300) 100%) no-repeat;animation:skeletonShimmer infinite 1.2s linear;border-radius:var(--shape-border-radius-2)}.dropin-skeleton__empty{background:none}.dropin-skeleton-row--multiline{--multiline-gap-spacing: var(--spacing-medium);display:grid;grid-auto-rows:max-content;gap:var(--multiline-gap-spacing)}.dropin-skeleton-row--full{grid-column:1 / -1}.dropin-skeleton-row svg{fill:var(--color-neutral-400);fill-opacity:.5;animation-duration:1s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:placeholderShimmer;animation-timing-function:linear}.dropin-skeleton-row__row-xsmall{height:32px}.dropin-skeleton-row__row-small{height:40px}.dropin-skeleton-row__row-medium{height:48px}.dropin-skeleton-row__row-large{height:56px}.dropin-skeleton-row__row-xlarge{height:72px}.dropin-skeleton-row__heading-xsmall{height:20px}.dropin-skeleton-row__heading-small{height:24px}.dropin-skeleton-row__heading-medium{height:32px}.dropin-skeleton-row__heading-large{height:40px}.dropin-skeleton-row__heading-xlarge{height:48px}@keyframes skeletonShimmer{0%{background-position:-600px 0}to{background-position:600px 0}}@keyframes placeholderShimmer{0%{fill-opacity:.5}50%{fill-opacity:1}to{fill-opacity:.5}}@media only screen and (max-width: 600px){.dropin-skeleton{grid-template-columns:1fr}}
|
|
4
|
-
.b2b-purchase-order-purchase-orders-table{display:flex;flex-direction:column;gap:var(--spacing-medium)}.b2b-purchase-order-purchase-orders-table a{cursor:pointer}.b2b-purchase-order-purchase-orders-table .purchase-orders-table__item--skeleton{max-width:200px}.purchase-orders-table__empty-state{text-align:center;color:var(--color-neutral-600);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.purchase-orders-table__pagination-wrapper{display:flex;justify-content:space-between;align-items:center}.purchase-orders-table__pagination-page-size{display:flex;align-items:center;gap:var(--spacing-small)}.purchase-orders-table__pagination-counter,.purchase-orders-table__pagination-page-size{color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}@media (max-width: 783px){.purchase-orders-table__pagination-wrapper{display:grid;grid-template-areas:"counter page-size" "pagination pagination";grid-template-columns:auto auto;gap:var(--spacing-small)}.purchase-orders-table__pagination-counter{grid-area:counter}.purchase-orders-table__pagination-page-size{grid-area:page-size}.purchase-orders-table__pagination{grid-area:pagination;justify-self:center}}@media (max-width: 600px){.purchase-orders-table__pagination-wrapper{grid-template-areas:"counter" "page-size" "pagination";grid-template-columns:1fr;justify-items:center}.purchase-orders-table__pagination-counter{grid-area:counter}.purchase-orders-table__pagination-page-size{grid-area:page-size}.purchase-orders-table__pagination{grid-area:pagination}}.purchase-orders-header{margin-bottom:var(--spacing-medium)}.b2b-purchase-order-purchase-orders-table-actions{display:flex;justify-content:space-between;align-items:center}.b2b-purchase-order-purchase-orders-table-actions__buttons{display:flex;gap:10px;justify-content:space-between}.b2b-purchase-order-approval-rule-form form{display:flex;flex-direction:column;gap:var(--spacing-small)}.b2b-purchase-order-approval-rule-form__rule-condition,.b2b-purchase-order-approval-rule-form__approval-role,.b2b-purchase-order-approval-rule-form__rule-type,.b2b-purchase-order-approval-rule-form__applies-to,.b2b-purchase-order-approval-rule-form__rule-condition-container,.b2b-purchase-order-approval-rule-form__buttons{display:flex;flex-direction:column;gap:var(--spacing-xsmall)}.b2b-purchase-order-approval-rule-form form>label.dropin-checkbox{align-items:center}.b2b-purchase-order-approval-rule-form__rule-type select,.b2b-purchase-order-approval-rule-form__rule-condition-container select{min-height:56px}.b2b-purchase-order-approval-rule-form__rule-condition-container{flex-direction:row;position:relative;margin-bottom:var( --spacing-medium )}.b2b-purchase-order-approval-rule-form__rule-condition-container>div{position:relative}.b2b-purchase-order-approval-rule-form__rule-condition-container .error-message{position:absolute;top:100%;left:0;right:0;z-index:10}.b2b-purchase-order-approval-rule-form__buttons{justify-content:flex-start;flex-direction:row}@media (max-width: 600px){.b2b-purchase-order-approval-rule-form__rule-condition-container{flex-direction:column;margin-bottom:var(--spacing-xsmall)}.b2b-purchase-order-approval-rule-form__rule-condition-container .error-message{position:static}.b2b-purchase-order-approval-rule-form form .dropin-multi-select{min-width:100%}}.error-message{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);padding-top:var(--spacing-xsmall);text-align:left;color:var(--color-alert-800)}.b2b-purchase-order-approval-rule-form .dropin-skeleton{width:100%;display:flex;flex-direction:column;gap:8px}.approval-rule-form-loader__section{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.approval-rule-form-loader__buttons{display:flex;gap:16px}.purchase-orders-confirmation-content__title{color:var(--color-neutral-800);font:var(--type-headline-1-font);letter-spacing:var(--type-headline-1-letter-spacing)}.purchase-orders-confirmation-content__message{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.purchase-orders-confirmation-content__link{color:var(--color-brand-500);font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing)}.b2b-purchase-order-approval-rule-details-content__item{margin-bottom:var(--spacing-medium);display:grid;grid-template-columns:1fr;gap:var(--spacing-xsmall)}.b2b-purchase-order-approval-rule-details-content__label{font:var(--type-body-1-emphasized-font);letter-spacing:var(--type-body-1-emphasized-letter-spacing)}.b2b-purchase-order-approval-rule-details-content__value{display:block}.b2b-purchase-order-approval-rule-details-content__value ul{margin:0;padding-left:var(--spacing-medium)}.b2b-purchase-order-form-loader .dropin-skeleton{width:100%;display:flex;flex-direction:column;gap:8px}.b2b-purchase-order-form-loader .approval-rule-form-loader__section{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.b2b-purchase-order-form-loader .approval-rule-form-loader__buttons{display:flex;gap:16px}`,{styleId:"b2b-purchase-order"});
|
|
5
|
-
import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{Render as l}from"@dropins/tools/lib.js";import{useState as n,useEffect as p}from"@dropins/tools/preact-hooks.js";import{UIProvider as u}from"@dropins/tools/components.js";import{events as i}from"@dropins/tools/event-bus.js";const d={customerPurchaseOrders:{containerTitle:"My purchase orders",noPurchaseOrders:"No purchase orders found."},companyPurchaseOrders:{containerTitle:"Company purchase orders",noPurchaseOrders:"No company purchase orders found."},requireApprovalPurchaseOrders:{containerTitle:"Requires my approval",noPurchaseOrders:"No purchase orders requiring my approval found."},approvalRulesList:{containerTitle:"Approval rules",emptyTitle:"No approval rules found",ariaLabel:{editRule:"Edit approval rule {{ruleName}}",deleteRule:"Delete approval rule {{ruleName}}",viewRule:"View approval rule {{ruleName}}"},buttons:{newRule:"Add New Rule"}},alertMessages:{header:{approve:"Approve Purchase Orders",reject:"Reject Purchase Orders",error:"Error"},description:{approve:"The selected purchase orders were approved successfully.",reject:"The selected purchase orders were rejected successfully.",error:"An error occurred while processing your request."}},purchaseOrdersTable:{noPurchaseOrders:{default:"No purchase orders found."},pagination:{status:"Items {{from}} to {{to}} of {{total}} total",pageSizeLabel:{start:"Show",end:"per page"}},loading:"Loading purchase orders...",actionView:"View",actionEdit:"Edit",actionDelete:"Delete",rulesStatus:{enabled:"Enabled",disabled:"Disabled"},ruleTypes:{grand_total:"Grand Total",number_of_skus:"Number of SKUs",any_item:"Any Item",all_items:"All Items"},appliesToAll:"All",statusOrder:{order_placed:"Order placed",order_failed:"Order failed",pending:"Pending",approved:"Approved",rejected:"Rejected",canceled:"Canceled",order_in_progress:"Order in progress",approval_required:"Approval required",approved_pending_payment:"Approved pending Payment"},tableColumns:{poNumber:"PO #",orderNumber:"Order #",createdDate:"Created",updatedDate:"Updated",createdBy:"Created By",status:"Status",total:"Total",action:"Action",ruleName:"Rule Name",ruleType:"Rule Type",appliesTo:"Applies To",approver:"Approver",selectAllAriaLabel:"Select all not approved purchase orders"}},purchaseOrderConfirmation:{title:"Your Purchase Order has been submitted for approval.",messagePrefix:"Your Purchase Order request number is",messageSuffix:"A copy of this Purchase Order will be emailed to you shortly."},approvalRuleForm:{headerText:"Purchase Order Approval Rule",titleAppliesTo:"Applies to",titleRuleType:"Rule Type",titleRequiresApprovalRole:"Requires Approval From",fields:{enabled:"Enabled",disabled:"Disabled",inputRuleName:{floatingLabel:"Rule Name",placeholder:"Rule Name"},textAreaDescription:{label:"Description"},appliesTo:{allUsers:"All Users",specificRoles:"Specific Roles"},ruleTypeOptions:{grandTotal:"Grand Total",shippingInclTax:"Shipping Cost",numberOfSkus:"Number of SKUs"},conditionOperators:{moreThan:"is more than",lessThan:"is less than",moreThanOrEqualTo:"is more than or equal to",lessThanOrEqualTo:"is less than or equal to"},inputQuantity:{floatingLabel:"Enter Amount",placeholder:"Enter Amount"},inputAmount:{floatingLabel:"Enter Amount",placeholder:"Enter Amount"},buttons:{cancel:"Cancel",save:"Save"}},errorsMessages:{required:"This field is required.",quantity:"Quantity must be greater than 0.",amount:"Amount must be greater than 0.",approvers:"Please select at least one approver."}},approvalRuleDetails:{containerTitle:"View Approval Rule",buttons:{back:"Back to Rules List"},fields:{ruleName:"Rule Name:",status:"Status:",description:"Description:",appliesTo:"Applies To:",requiresApprovalFrom:"Requires Approval From:",ruleType:"Rule Type:",amount:{label:" amount
|
|
4
|
+
.b2b-purchase-order-purchase-orders-table{display:flex;flex-direction:column;gap:var(--spacing-medium)}.b2b-purchase-order-purchase-orders-table a{cursor:pointer}.b2b-purchase-order-purchase-orders-table .purchase-orders-table__item--skeleton{max-width:200px}.purchase-orders-table__empty-state{text-align:center;color:var(--color-neutral-600);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.purchase-orders-table__pagination-wrapper{display:flex;justify-content:space-between;align-items:center}.purchase-orders-table__pagination-page-size{display:flex;align-items:center;gap:var(--spacing-small)}.purchase-orders-table__pagination-counter,.purchase-orders-table__pagination-page-size{color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}@media (max-width: 783px){.purchase-orders-table__pagination-wrapper{display:grid;grid-template-areas:"counter page-size" "pagination pagination";grid-template-columns:auto auto;gap:var(--spacing-small)}.purchase-orders-table__pagination-counter{grid-area:counter}.purchase-orders-table__pagination-page-size{grid-area:page-size}.purchase-orders-table__pagination{grid-area:pagination;justify-self:center}}@media (max-width: 600px){.purchase-orders-table__pagination-wrapper{grid-template-areas:"counter" "page-size" "pagination";grid-template-columns:1fr;justify-items:center}.purchase-orders-table__pagination-counter{grid-area:counter}.purchase-orders-table__pagination-page-size{grid-area:page-size}.purchase-orders-table__pagination{grid-area:pagination}}.purchase-orders-header{margin-bottom:var(--spacing-medium)}.b2b-purchase-order-purchase-orders-table-actions{display:flex;justify-content:space-between;align-items:center}.b2b-purchase-order-purchase-orders-table-actions__buttons{display:flex;gap:10px;justify-content:space-between}.b2b-purchase-order-approval-rule-form form{display:flex;flex-direction:column;gap:var(--spacing-small)}.b2b-purchase-order-approval-rule-form__rule-condition,.b2b-purchase-order-approval-rule-form__approval-role,.b2b-purchase-order-approval-rule-form__rule-type,.b2b-purchase-order-approval-rule-form__applies-to,.b2b-purchase-order-approval-rule-form__rule-condition-container,.b2b-purchase-order-approval-rule-form__buttons{display:flex;flex-direction:column;gap:var(--spacing-xsmall)}.b2b-purchase-order-approval-rule-form form>label.dropin-checkbox{align-items:center}.b2b-purchase-order-approval-rule-form__rule-type select,.b2b-purchase-order-approval-rule-form__rule-condition-container select{min-height:56px}.b2b-purchase-order-approval-rule-form__rule-condition-container{flex-direction:row;position:relative;margin-bottom:var( --spacing-medium )}.b2b-purchase-order-approval-rule-form__rule-condition-container>div{position:relative}.b2b-purchase-order-approval-rule-form__rule-condition-container .error-message{position:absolute;top:100%;left:0;right:0;z-index:10}.b2b-purchase-order-approval-rule-form__buttons{justify-content:flex-start;flex-direction:row}@media (max-width: 600px){.b2b-purchase-order-approval-rule-form__rule-condition-container{flex-direction:column;margin-bottom:var(--spacing-xsmall)}.b2b-purchase-order-approval-rule-form__rule-condition-container .error-message{position:static}.b2b-purchase-order-approval-rule-form form .dropin-multi-select{min-width:100%}}.error-message{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);padding-top:var(--spacing-xsmall);text-align:left;color:var(--color-alert-800)}.b2b-purchase-order-approval-rule-form .dropin-skeleton{width:100%;display:flex;flex-direction:column;gap:8px}.approval-rule-form-loader__section{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.approval-rule-form-loader__buttons{display:flex;gap:16px}.purchase-orders-confirmation-content__title{color:var(--color-neutral-800);font:var(--type-headline-1-font);letter-spacing:var(--type-headline-1-letter-spacing)}.purchase-orders-confirmation-content__message{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.purchase-orders-confirmation-content__link{color:var(--color-brand-500);font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing)}.b2b-purchase-order-approval-rule-details-content__item{margin-bottom:var(--spacing-medium);display:grid;grid-template-columns:1fr;gap:var(--spacing-xsmall)}.b2b-purchase-order-approval-rule-details-content__label{font:var(--type-body-1-emphasized-font);letter-spacing:var(--type-body-1-emphasized-letter-spacing)}.b2b-purchase-order-approval-rule-details-content__value{display:block}.b2b-purchase-order-approval-rule-details-content__value ul{margin:0;padding-left:var(--spacing-medium)}.b2b-purchase-order-approval-rule-details-content__value>div{display:inline-flex;flex-wrap:wrap;align-items:center;margin-right:var(--spacing-small);gap:var(--spacing-xsmall)}.b2b-purchase-order-form-loader .dropin-skeleton{width:100%;display:flex;flex-direction:column;gap:8px}.b2b-purchase-order-form-loader .approval-rule-form-loader__section{display:flex;flex-direction:column;gap:8px;margin-bottom:24px}.b2b-purchase-order-form-loader .approval-rule-form-loader__buttons{display:flex;gap:16px}`,{styleId:"b2b-purchase-order"});
|
|
5
|
+
import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{Render as l}from"@dropins/tools/lib.js";import{useState as n,useEffect as p}from"@dropins/tools/preact-hooks.js";import{UIProvider as u}from"@dropins/tools/components.js";import{events as i}from"@dropins/tools/event-bus.js";const d={customerPurchaseOrders:{containerTitle:"My purchase orders",noPurchaseOrders:"No purchase orders found."},companyPurchaseOrders:{containerTitle:"Company purchase orders",noPurchaseOrders:"No company purchase orders found."},requireApprovalPurchaseOrders:{containerTitle:"Requires my approval",noPurchaseOrders:"No purchase orders requiring my approval found."},approvalRulesList:{containerTitle:"Approval rules",emptyTitle:"No approval rules found",ariaLabel:{editRule:"Edit approval rule {{ruleName}}",deleteRule:"Delete approval rule {{ruleName}}",viewRule:"View approval rule {{ruleName}}"},buttons:{newRule:"Add New Rule"}},alertMessages:{header:{approve:"Approve Purchase Orders",reject:"Reject Purchase Orders",error:"Error"},description:{approve:"The selected purchase orders were approved successfully.",reject:"The selected purchase orders were rejected successfully.",error:"An error occurred while processing your request."}},purchaseOrdersTable:{noPurchaseOrders:{default:"No purchase orders found."},pagination:{status:"Items {{from}} to {{to}} of {{total}} total",pageSizeLabel:{start:"Show",end:"per page"}},loading:"Loading purchase orders...",actionView:"View",actionEdit:"Edit",actionDelete:"Delete",rulesStatus:{enabled:"Enabled",disabled:"Disabled"},ruleTypes:{grand_total:"Grand Total",number_of_skus:"Number of SKUs",any_item:"Any Item",all_items:"All Items"},appliesToAll:"All",statusOrder:{order_placed:"Order placed",order_failed:"Order failed",pending:"Pending",approved:"Approved",rejected:"Rejected",canceled:"Canceled",order_in_progress:"Order in progress",approval_required:"Approval required",approved_pending_payment:"Approved pending Payment"},tableColumns:{poNumber:"PO #",orderNumber:"Order #",createdDate:"Created",updatedDate:"Updated",createdBy:"Created By",status:"Status",total:"Total",action:"Action",ruleName:"Rule Name",ruleType:"Rule Type",appliesTo:"Applies To",approver:"Approver",selectAllAriaLabel:"Select all not approved purchase orders"}},purchaseOrderConfirmation:{title:"Your Purchase Order has been submitted for approval.",messagePrefix:"Your Purchase Order request number is",messageSuffix:"A copy of this Purchase Order will be emailed to you shortly."},approvalRuleForm:{headerText:"Purchase Order Approval Rule",titleAppliesTo:"Applies to",titleRuleType:"Rule Type",titleRequiresApprovalRole:"Requires Approval From",fields:{enabled:"Enabled",disabled:"Disabled",inputRuleName:{floatingLabel:"Rule Name",placeholder:"Rule Name"},textAreaDescription:{label:"Description"},appliesTo:{allUsers:"All Users",specificRoles:"Specific Roles"},ruleTypeOptions:{grandTotal:"Grand Total",shippingInclTax:"Shipping Cost",numberOfSkus:"Number of SKUs"},conditionOperators:{moreThan:"is more than",lessThan:"is less than",moreThanOrEqualTo:"is more than or equal to",lessThanOrEqualTo:"is less than or equal to"},inputQuantity:{floatingLabel:"Enter Amount",placeholder:"Enter Amount"},inputAmount:{floatingLabel:"Enter Amount",placeholder:"Enter Amount"},buttons:{cancel:"Cancel",save:"Save"}},errorsMessages:{required:"This field is required.",quantity:"Quantity must be greater than 0.",amount:"Amount must be greater than 0.",approvers:"Please select at least one approver."}},approvalRuleDetails:{containerTitle:"View Approval Rule",buttons:{back:"Back to Rules List"},fields:{ruleName:"Rule Name:",status:"Status:",description:"Description:",appliesTo:"Applies To:",requiresApprovalFrom:"Requires Approval From:",ruleType:"Rule Type:",amount:{label:" amount "},statusView:{enabled:"Enabled",disabled:"Disabled"},condition:{attribute:{grand_total:"Grand Total",shipping_incl_tax:"Shipping Cost",number_of_skus:"Number of SKUs"},operator:{more_than:"Is more than",less_than:"Is less than",more_than_or_equal_to:"Is more than or equal to",less_than_or_equal_to:"Is less than or equal to"}}}}},c={PurchaseOrders:d},m={default:c},h=({children:a})=>{const[o,t]=n("en_US");return p(()=>{const e=i.on("locale",s=>{t(s)},{eager:!0});return()=>{e==null||e.off()}},[]),r(u,{lang:o,langDefinitions:m,children:a})},g=new l(r(h,{}));export{g as render};
|
|
6
6
|
//# sourceMappingURL=render.js.map
|
package/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sources":["/@dropins/storefront-purchase-order/src/render/Provider.tsx","/@dropins/storefront-purchase-order/src/render/render.tsx"],"sourcesContent":["import { FunctionComponent } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { UIProvider } from '@adobe-commerce/elsie/components';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface CartProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<CartProviderProps> = ({\n children,\n}) => {\n const [lang, setLang] = useState<Lang>('en_US');\n\n // Events\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (locale: string) => {\n setLang(locale as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, []);\n\n return (\n <UIProvider lang={lang} langDefinitions={langDefinitions}>\n {children}\n </UIProvider>\n );\n};\n","import { Render } from '@adobe-commerce/elsie/lib';\nimport { Provider } from './Provider';\n\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","en_US","Provider","children","lang","setLang","useState","useEffect","localeEvent","events","locale","jsx","UIProvider","render","Render"],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sources":["/@dropins/storefront-purchase-order/src/render/Provider.tsx","/@dropins/storefront-purchase-order/src/render/render.tsx"],"sourcesContent":["import { FunctionComponent } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { UIProvider } from '@adobe-commerce/elsie/components';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface CartProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<CartProviderProps> = ({\n children,\n}) => {\n const [lang, setLang] = useState<Lang>('en_US');\n\n // Events\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (locale: string) => {\n setLang(locale as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, []);\n\n return (\n <UIProvider lang={lang} langDefinitions={langDefinitions}>\n {children}\n </UIProvider>\n );\n};\n","import { Render } from '@adobe-commerce/elsie/lib';\nimport { Provider } from './Provider';\n\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","en_US","Provider","children","lang","setLang","useState","useEffect","localeEvent","events","locale","jsx","UIProvider","render","Render"],"mappings":"gkIASMA,EAAkB,CACtB,QAASC,CACX,EAMaC,EAAiD,CAAC,CAC7D,SAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAe,OAAO,EAG9C,OAAAC,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GACzB,SACCC,GAAmB,CAClBL,EAAQK,CAAc,CACxB,EACA,CAAE,MAAO,EAAA,CAAK,EAEhB,MAAO,IAAM,CACXF,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAGHG,EAACC,EAAA,CAAW,KAAAR,EAAY,gBAAAJ,EACrB,SAAAG,CAAA,CACH,CAEJ,ECtCaU,EAAS,IAAIC,EAAOH,EAACT,IAAS,CAAE"}
|