@dropins/storefront-purchase-order 0.0.3-alpha2 → 0.0.4-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/api/currencyInfo/currencyInfo.d.ts +24 -0
  2. package/api/currencyInfo/graphql/currencyInfo.graphql.d.ts +18 -0
  3. package/api/currencyInfo/index.d.ts +18 -0
  4. package/api/getPurchaseOrderApprovalRule/getPurchaseOrderApprovalRule.d.ts +4 -0
  5. package/api/getPurchaseOrderApprovalRule/graphql/getPurchaseOrderApprovalRule.graphql.d.ts +18 -0
  6. package/api/getPurchaseOrderApprovalRule/index.d.ts +18 -0
  7. package/api/getPurchaseOrderApprovalRules/getPurchaseOrderApprovalRules.d.ts +12 -0
  8. package/api/getPurchaseOrderApprovalRules/graphql/getPurchaseOrderApprovalRules.graphql.d.ts +18 -0
  9. package/api/getPurchaseOrderApprovalRules/index.d.ts +18 -0
  10. package/api/index.d.ts +3 -0
  11. package/api.js +11 -135
  12. package/api.js.map +1 -1
  13. package/chunks/FormLoader.js +4 -0
  14. package/chunks/FormLoader.js.map +1 -0
  15. package/chunks/FormLoader2.js +4 -0
  16. package/chunks/FormLoader2.js.map +1 -0
  17. package/chunks/PurchaseOrdersHeader.js +4 -0
  18. package/chunks/PurchaseOrdersHeader.js.map +1 -0
  19. package/chunks/PurchaseOrdersTableActions.js +1 -1
  20. package/chunks/PurchaseOrdersTableActions.js.map +1 -1
  21. package/chunks/case-converter.js +4 -0
  22. package/chunks/case-converter.js.map +1 -0
  23. package/chunks/currencyInfo.js +124 -0
  24. package/chunks/currencyInfo.js.map +1 -0
  25. package/chunks/fetch-error.js +4 -0
  26. package/chunks/fetch-error.js.map +1 -0
  27. package/chunks/fetch-graphql.js +4 -0
  28. package/chunks/fetch-graphql.js.map +1 -0
  29. package/chunks/getPurchaseOrderApprovalRule.js +45 -0
  30. package/chunks/getPurchaseOrderApprovalRule.js.map +1 -0
  31. package/chunks/getPurchaseOrderApprovalRules.js +75 -0
  32. package/chunks/getPurchaseOrderApprovalRules.js.map +1 -0
  33. package/chunks/getPurchaseOrders.js +5 -5
  34. package/chunks/getPurchaseOrders.js.map +1 -1
  35. package/chunks/pageSize.config.js +4 -0
  36. package/chunks/pageSize.config.js.map +1 -0
  37. package/chunks/transform-purchase-order-approval-rule.js +4 -0
  38. package/chunks/transform-purchase-order-approval-rule.js.map +1 -0
  39. package/chunks/useCustomerRolePermissions.js +1 -1
  40. package/chunks/useCustomerRolePermissions.js.map +1 -1
  41. package/chunks/usePurchaseOrders.js +4 -0
  42. package/chunks/usePurchaseOrders.js.map +1 -0
  43. package/components/ApprovalRuleDetailsContent/ApprovalRuleDetailsContent.d.ts +5 -0
  44. package/components/ApprovalRuleDetailsContent/index.d.ts +11 -0
  45. package/components/ApprovalRuleForm/ApprovalRuleForm.d.ts +5 -0
  46. package/components/ApprovalRuleForm/blocks/ErrorMessage.d.ts +9 -0
  47. package/components/ApprovalRuleForm/blocks/Form.d.ts +40 -0
  48. package/components/ApprovalRuleForm/blocks/index.d.ts +19 -0
  49. package/components/ApprovalRuleForm/index.d.ts +11 -0
  50. package/components/FormLoader/FormLoader.d.ts +8 -0
  51. package/components/FormLoader/index.d.ts +19 -0
  52. package/components/index.d.ts +3 -0
  53. package/configs/approvalRuleForm.config.d.ts +74 -0
  54. package/configs/index.d.ts +2 -0
  55. package/containers/ApprovalRuleDetails/ApprovalRuleDetails.d.ts +5 -0
  56. package/containers/ApprovalRuleDetails/index.d.ts +11 -0
  57. package/containers/ApprovalRuleDetails.d.ts +3 -0
  58. package/containers/ApprovalRuleDetails.js +4 -0
  59. package/containers/ApprovalRuleDetails.js.map +1 -0
  60. package/containers/ApprovalRuleForm/ApprovalRuleForm.d.ts +5 -0
  61. package/containers/ApprovalRuleForm/index.d.ts +11 -0
  62. package/containers/ApprovalRuleForm.d.ts +3 -0
  63. package/containers/ApprovalRuleForm.js +4 -0
  64. package/containers/ApprovalRuleForm.js.map +1 -0
  65. package/containers/ApprovalRulesList/ApprovalRulesList.d.ts +5 -0
  66. package/containers/ApprovalRulesList/index.d.ts +19 -0
  67. package/containers/ApprovalRulesList.d.ts +3 -0
  68. package/containers/ApprovalRulesList.js +4 -0
  69. package/containers/ApprovalRulesList.js.map +1 -0
  70. package/containers/CompanyPurchaseOrders.js +1 -1
  71. package/containers/CompanyPurchaseOrders.js.map +1 -1
  72. package/containers/CustomerPurchaseOrders.js +1 -1
  73. package/containers/CustomerPurchaseOrders.js.map +1 -1
  74. package/containers/PurchaseOrderConfirmation.js +1 -1
  75. package/containers/PurchaseOrderConfirmation.js.map +1 -1
  76. package/containers/RequireApprovalPurchaseOrders.js +1 -1
  77. package/containers/RequireApprovalPurchaseOrders.js.map +1 -1
  78. package/containers/index.d.ts +3 -0
  79. package/data/models/purchase-order-approval-rule-model.d.ts +5 -0
  80. package/hooks/index.d.ts +3 -0
  81. package/hooks/useApprovalRuleDetails.d.ts +14 -0
  82. package/hooks/useApprovalRuleForm.d.ts +4 -0
  83. package/hooks/useApprovalRulesList.d.ts +4 -0
  84. package/i18n/en_US.json.d.ts +91 -1
  85. package/lib/cleanAndDeep.d.ts +8 -0
  86. package/lib/formValidation.d.ts +22 -0
  87. package/lib/index.d.ts +4 -0
  88. package/lib/transformToFormValues.d.ts +9 -0
  89. package/lib/updateFormFieldValue.d.ts +4 -0
  90. package/mocks/index.d.ts +191 -0
  91. package/mocks/storybook/events-data.d.ts +12 -0
  92. package/mocks/storybook/index.d.ts +3 -0
  93. package/package.json +1 -1
  94. package/render.js +3 -2
  95. package/render.js.map +1 -1
  96. package/types/components/approvalRuleDetailsContentProps.types.d.ts +9 -0
  97. package/types/components/approvalRuleForm.types.d.ts +12 -0
  98. package/types/components/index.d.ts +2 -0
  99. package/types/components/purchaseOrdersTable.types.d.ts +6 -1
  100. package/types/containers/approvalRuleDetailsProps.types.d.ts +8 -0
  101. package/types/containers/approvalRuleForm.types.d.ts +12 -0
  102. package/types/containers/approvalRulesList.types.d.ts +15 -0
  103. package/types/containers/index.d.ts +3 -0
  104. package/types/hooks/index.d.ts +3 -0
  105. package/types/hooks/useApprovalRuleDetails.types.d.ts +5 -0
  106. package/types/hooks/useApprovalRuleForm.types.d.ts +121 -0
  107. package/types/hooks/useApprovalRulesList.types.d.ts +29 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useCustomerRolePermissions.js","sources":["/@dropins/storefront-purchase-order/src/lib/isValidUrl.ts","/@dropins/storefront-purchase-order/src/lib/formatDate.ts","/@dropins/storefront-purchase-order/src/lib/getRange.ts","/@dropins/storefront-purchase-order/src/components/PurchaseOrdersTable/PurchaseOrdersTable.tsx","/@dropins/storefront-purchase-order/src/components/PurchaseOrdersHeader/PurchaseOrdersHeader.tsx","/@dropins/storefront-purchase-order/src/types/api/api.enums.types.ts","/@dropins/storefront-purchase-order/src/configs/pageSize.config.ts","/@dropins/storefront-purchase-order/src/configs/customerPurchaseOrders.config.ts","/@dropins/storefront-purchase-order/src/configs/companyPurchaseOrders.config.ts","/@dropins/storefront-purchase-order/src/hooks/usePurchaseOrders.tsx","/@dropins/storefront-purchase-order/src/data/transforms/transform-customer-role-permissions.ts","/@dropins/storefront-purchase-order/src/hooks/useCustomerRolePermissions.tsx"],"sourcesContent":["export const isValidUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n // Only allow relative paths or same-origin URLs\n return parsed.origin === window.location.origin;\n } catch {\n // If it's not a valid URL, check if it's a relative path\n return url.startsWith('/') || url.startsWith('./') || url.startsWith('../');\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\n/**\n * Format a date string to a localized format like \"Sep 8, 2025 6:32:13 AM\"\n * @param dateString - ISO date string or date string\n * @param locale - Locale for formatting (defaults to 'en-US')\n * @returns Formatted date string\n */\nexport const formatDate = (\n dateString: string,\n locale: string = 'en-US'\n): string => {\n try {\n const date = new Date(dateString);\n\n if (isNaN(date.getTime())) {\n return dateString; // Return original if invalid\n }\n\n return date.toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n hour12: true,\n });\n } catch (error) {\n return dateString; // Return original on error\n }\n};\n","export const getRange = (\n currentPage: number,\n pageSize: number,\n total: number\n) => {\n if (total <= 0) return { from: 0, to: 0, total: 0 };\n const maxPage = Math.max(1, Math.ceil(total / pageSize));\n const p = Math.min(Math.max(currentPage, 1), maxPage);\n const from = (p - 1) * pageSize + 1;\n const to = Math.min(p * pageSize, total);\n\n return { from, to, total };\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 {\n Table,\n Pagination,\n Card,\n Picker,\n InLineAlert,\n} from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { PurchaseOrdersTableProps } from '@/b2b-purchase-order/types/components';\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { getRange } from '@/b2b-purchase-order/lib';\nimport '@/b2b-purchase-order/components/PurchaseOrdersTable/PurchaseOrdersTable.css';\n\nexport const PurchaseOrdersTable: FunctionComponent<\n PurchaseOrdersTableProps\n> = ({\n pageSizeConfig,\n totalCount = 0,\n columns = [],\n rows = [],\n paginationConfig,\n alertMessageConfig = {\n heading: '',\n description: '',\n type: 'success',\n },\n loading = false,\n className = '',\n variant = 'secondary',\n skeletonRowCount = 10,\n emptyTitle,\n header,\n footer,\n withWrapper,\n}) => {\n const t = useText({\n title: 'PurchaseOrders.purchaseOrdersTable.noPurchaseOrders.default',\n });\n\n const {\n heading: alertMessageHeading,\n description: alertMessageDescription,\n type: alertMessageType,\n } = alertMessageConfig;\n\n const { currentPage, totalPages, handlePageChange } = paginationConfig;\n const { pageSizeOptionsList, onChange } = pageSizeConfig;\n const { from, to, total } = getRange(\n currentPage,\n +pageSizeOptionsList.find((option) => option.selected)?.value! || 0,\n totalCount\n );\n\n const content = (\n <>\n {alertMessageHeading || alertMessageDescription ? (\n <InLineAlert\n heading={alertMessageHeading}\n description={alertMessageDescription}\n type={alertMessageType}\n />\n ) : null}\n\n {header ? (\n <div className=\"purchase-orders-table__header\">{header}</div>\n ) : null}\n\n <Table\n className=\"purchase-orders-table__table-wrapper\"\n mobileLayout=\"stacked\"\n columns={columns}\n rowData={rows}\n loading={loading}\n skeletonRowCount={+skeletonRowCount}\n />\n {!loading && rows.length === 0 && (\n <div\n className=\"purchase-orders-table__empty-state\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <p>{emptyTitle || t.title}</p>\n </div>\n )}\n\n {totalCount > 0 ? (\n <div className=\"purchase-orders-table__pagination-wrapper\">\n {totalCount ? (\n <div className=\"purchase-orders-table__pagination-counter\">\n <Text\n id=\"PurchaseOrders.purchaseOrdersTable.pagination.status\"\n fields={{\n from,\n to,\n total,\n }}\n />\n </div>\n ) : null}\n {totalPages > 1 && (\n <Pagination\n className=\"purchase-orders-table__pagination\"\n currentPage={currentPage}\n totalPages={totalPages}\n onChange={handlePageChange}\n />\n )}\n {totalCount > 0 && pageSizeOptionsList.length ? (\n <div className=\"purchase-orders-table__pagination-page-size\">\n <Text id=\"PurchaseOrders.purchaseOrdersTable.pagination.pageSizeLabel.start\" />\n <Picker\n disabled={loading}\n handleSelect={onChange}\n options={pageSizeOptionsList}\n value={\n pageSizeOptionsList.find((option) => option.selected)\n ?.value || ''\n }\n />\n <Text id=\"PurchaseOrders.purchaseOrdersTable.pagination.pageSizeLabel.end\" />\n </div>\n ) : null}\n </div>\n ) : null}\n\n {footer ? (\n <div className=\"purchase-orders-table__footer\">{footer}</div>\n ) : null}\n </>\n );\n\n if (!withWrapper) {\n return (\n <div\n data-testid=\"addressCard\"\n className={classes([\n 'b2b-purchase-order-purchase-orders-table',\n className,\n ])}\n >\n {content}\n </div>\n );\n }\n\n return (\n <Card\n variant={variant}\n data-testid=\"addressCard\"\n className={classes([\n 'b2b-purchase-order-purchase-orders-table',\n className,\n ])}\n >\n {content}\n </Card>\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 { Header } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\nimport '@/b2b-purchase-order/components/PurchaseOrdersHeader/PurchaseOrdersHeader.css';\n\nexport const PurchaseOrdersHeader: FunctionComponent<{\n headerText: string;\n}> = ({ headerText }) => {\n return (\n <Header\n title={headerText}\n divider={false}\n className={'purchase-orders-header'}\n data-testid=\"purchase-orders-header\"\n />\n );\n};\n","export enum PurchaseOrderApprovalRuleStatus {\n ENABLED = 'ENABLED',\n DISABLED = 'DISABLED',\n}\n\nexport enum PurchaseOrderApprovalRuleType {\n GRAND_TOTAL = 'GRAND_TOTAL',\n SHIPPING_INCL_TAX = 'SHIPPING_INCL_TAX',\n NUMBER_OF_SKUS = 'NUMBER_OF_SKUS',\n}\n\nexport enum PurchaseOrderApprovalRuleConditionOperator {\n MORE_THAN = 'MORE_THAN',\n LESS_THAN = 'LESS_THAN',\n MORE_THAN_OR_EQUAL_TO = 'MORE_THAN_OR_EQUAL_TO',\n LESS_THAN_OR_EQUAL_TO = 'LESS_THAN_OR_EQUAL_TO',\n}\n\nexport enum EnumPurchaseOrdersView {\n CUSTOMER_PURCHASE_ORDERS = 'customerPurchaseOrders',\n COMPANY_PURCHASE_ORDERS = 'companyPurchaseOrders',\n CUSTOMER_APPROVAL_PURCHASE_ORDERS = 'customerApprovalPurchaseOrders',\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\nexport const defaultPageSizeConfig = [\n {\n text: '10',\n value: '10',\n selected: false,\n },\n {\n text: '20',\n value: '20',\n selected: true,\n },\n {\n text: '30',\n value: '30',\n selected: false,\n },\n {\n text: '50',\n value: '50',\n selected: false,\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 { Column } from '@/b2b-purchase-order/types/components';\n\nexport const defaultColumns: Column[] = [\n { key: 'action', label: 'Action' },\n { key: 'poNumber', label: 'PO #' },\n { key: 'orderNumber', label: 'Order #' },\n { key: 'status', label: 'Status' },\n {\n key: 'createdBy',\n label: 'Created By',\n },\n { key: 'total', label: 'Total' },\n { key: 'createdDate', label: 'Created' },\n { key: 'updatedDate', label: 'Updated' },\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 { Column } from '@/b2b-purchase-order/types/components';\nimport { defaultColumns } from '@/b2b-purchase-order/configs/customerPurchaseOrders.config';\n\nexport const defaultCompanyColumns: Column[] = [\n {\n key: 'checkboxView',\n label: '',\n },\n ...defaultColumns,\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 React from 'preact/compat';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\nimport { formatDate, isValidUrl } from '@/b2b-purchase-order/lib';\nimport {\n AlertMessageConfigType,\n UsePurchaseOrdersParams,\n UsePurchaseOrdersReturn,\n} from '@/b2b-purchase-order/types/hooks';\nimport { EnumPurchaseOrdersView } from '@/b2b-purchase-order/types/api';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\nimport { Column } from '@/b2b-purchase-order/types/components';\nimport {\n approvePurchaseOrders,\n getPurchaseOrders,\n rejectPurchaseOrders,\n} from '@/b2b-purchase-order/api';\nimport {\n defaultColumns,\n defaultCompanyColumns,\n} from '@/b2b-purchase-order/configs';\nimport { Text } from '@adobe-commerce/elsie/i18n';\n\nconst DEFAULT_PAGE_SIZE = 20;\n\nexport const usePurchaseOrders = ({\n view,\n initialPageSize,\n routePurchaseOrderDetails,\n setColumns,\n setRowsData,\n t,\n permissions,\n loadingPermissions,\n}: UsePurchaseOrdersParams): UsePurchaseOrdersReturn => {\n const isCompanyPOsView =\n view === EnumPurchaseOrdersView.COMPANY_PURCHASE_ORDERS;\n const isRequireApprovalPOsView =\n view === EnumPurchaseOrdersView.CUSTOMER_APPROVAL_PURCHASE_ORDERS;\n const [selectedOrderIds, setSelectedOrderIds] = useState<string[]>([]);\n const [purchaseOrders, setPurchaseOrders] = useState<PurchaseOrderModel[]>(\n []\n );\n const [pageSizeOptionsList, setPageSizeOptionsList] =\n useState(initialPageSize);\n const [loading, setLoading] = useState<boolean>(true);\n const [pagination, setPagination] = useState({\n currentPage: 1,\n totalPages: 1,\n totalCount: 0,\n });\n const [alertMessageConfig, setAlertMessageConfig] =\n useState<AlertMessageConfigType>({\n heading: '',\n description: '',\n type: 'success',\n });\n\n // Auto-clear alert message after 7 seconds\n useEffect(() => {\n if (alertMessageConfig.heading || alertMessageConfig.description) {\n const timer = setTimeout(() => {\n setAlertMessageConfig({\n heading: '',\n description: '',\n type: 'success',\n });\n }, 7000);\n\n return () => clearTimeout(timer);\n }\n }, [alertMessageConfig.heading, alertMessageConfig.description]);\n\n // Derive pagination values\n const { currentPage, totalPages, totalCount } = pagination;\n\n const handleChangePageSize = useCallback((event: Event) => {\n const size = (event.target as HTMLSelectElement).value;\n\n setPageSizeOptionsList((prev) => {\n return prev.map((option) => ({\n ...option,\n selected: option.value === size,\n }));\n });\n }, []);\n\n const isAdmin = permissions?.isAdmin ?? false;\n\n const filterConfig = useMemo(() => {\n let config = {};\n\n if (isCompanyPOsView) {\n config = { companyPurchaseOrders: true };\n }\n\n if (isRequireApprovalPOsView) {\n config = { requireMyApproval: true };\n }\n\n return config;\n }, [isCompanyPOsView, isRequireApprovalPOsView]);\n\n useEffect(() => {\n // Don't fetch purchase orders until permissions are loaded\n if (loadingPermissions) {\n return;\n }\n\n setLoading(true);\n const pageSize = pageSizeOptionsList?.find(\n (option) => option.selected\n )?.value;\n const selectedPageSize = parseInt(\n pageSize ?? DEFAULT_PAGE_SIZE.toString(),\n 10\n );\n\n getPurchaseOrders(filterConfig, selectedPageSize, currentPage)\n .then((data) => {\n const purchaseOrders = data?.purchaseOrderItems ?? [];\n const responsePage = data?.pageInfo?.currentPage;\n const responseTotalPages = data?.pageInfo?.totalPages;\n const responseTotalCount = data?.totalCount;\n\n setPagination({\n currentPage: responsePage,\n totalPages: responseTotalPages,\n totalCount: responseTotalCount,\n });\n setPurchaseOrders(purchaseOrders);\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.error('Failed to fetch purchase orders:', error);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [currentPage, pageSizeOptionsList, filterConfig, loadingPermissions]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handlePurchaseOrderDetailsRedirect = useCallback(\n (poNumber: string): string => {\n const url = routePurchaseOrderDetails?.(poNumber) as string;\n\n if (!isValidUrl(url ?? '')) return '#';\n\n return url;\n },\n [routePurchaseOrderDetails]\n );\n\n const handlePageChange = useCallback((page: number) => {\n setPagination((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n const handleSelectedOrderId = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const uid = (event.target as HTMLInputElement).value;\n const isChecked = (event.target as HTMLInputElement).checked;\n\n setSelectedOrderIds((prevSelected) => {\n if (isChecked) {\n return [...prevSelected, uid];\n }\n return prevSelected.filter((po) => po !== uid);\n });\n },\n []\n );\n\n const handleSelectedOrderIds = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const isChecked = (event.target as HTMLInputElement).checked;\n setSelectedOrderIds(() =>\n isChecked\n ? purchaseOrders\n .filter((po) =>\n ['PENDING', 'APPROVAL_REQUIRED'].includes(po.status)\n )\n .map((po) => po.uid ?? '')\n : []\n );\n },\n [purchaseOrders]\n );\n\n const handleRejectSelected = useCallback(() => {\n rejectPurchaseOrders(selectedOrderIds)\n .then((data) => {\n const purchaseOrders = data?.purchaseOrders ?? [];\n setPurchaseOrders((prev) => {\n return prev.map((po) => {\n const updatedPo = purchaseOrders.find(\n (updated) => updated.uid === po.uid\n );\n return updatedPo ?? po;\n });\n });\n setAlertMessageConfig({\n heading: t.alertHeaderReject,\n description: t.alertDescriptionReject,\n type: 'success',\n });\n setSelectedOrderIds([]);\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n setAlertMessageConfig({\n heading: t.alertHeaderError,\n description: t.alertDescriptionError,\n type: 'error',\n });\n console.error(err);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [selectedOrderIds, t]);\n\n const handleApproveSelected = useCallback(() => {\n setLoading(true);\n approvePurchaseOrders(selectedOrderIds)\n .then((data) => {\n const purchaseOrders = data?.purchaseOrders ?? [];\n setPurchaseOrders((prev) => {\n return prev.map((po) => {\n const updatedPo = purchaseOrders.find(\n (updated) => updated.uid === po.uid\n );\n return updatedPo ?? po;\n });\n });\n setAlertMessageConfig({\n heading: t.alertHeaderApprove,\n description: t.alertDescriptionApprove,\n type: 'success',\n });\n setSelectedOrderIds([]);\n })\n .catch((err) => {\n setAlertMessageConfig({\n heading: t.alertHeaderError,\n description: t.alertDescriptionError,\n type: 'error',\n });\n console.error(err);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [selectedOrderIds, t]);\n\n const columns = useMemo(() => {\n const currentColumns =\n isCompanyPOsView || isRequireApprovalPOsView\n ? defaultCompanyColumns\n : defaultColumns;\n\n return (\n setColumns?.(currentColumns) ??\n currentColumns.map((col) => {\n if (\n col.key === 'checkboxView' &&\n (isAdmin || isRequireApprovalPOsView)\n ) {\n return {\n key: col.key,\n label: (\n <input\n type=\"checkbox\"\n name={'selectAll'}\n disabled={purchaseOrders.every(\n (po) => !['PENDING', 'APPROVAL_REQUIRED'].includes(po.status)\n )}\n onChange={handleSelectedOrderIds}\n />\n ),\n ariaLabel: t.selectAllAriaLabel,\n } as Column;\n }\n\n return {\n ...col,\n label: t[col.key as keyof typeof t] || col.label,\n } as Column;\n })\n );\n }, [\n t,\n isAdmin,\n isCompanyPOsView,\n isRequireApprovalPOsView,\n setColumns,\n purchaseOrders,\n handleSelectedOrderIds,\n ]);\n\n const rows = useMemo(() => {\n const formattedPurchaseOrders = purchaseOrders.map((po) => {\n const poNumber = po.number ?? '';\n\n return {\n ...(isAdmin || isRequireApprovalPOsView\n ? {\n checkboxView: (\n <input\n type=\"checkbox\"\n name={poNumber}\n value={po.uid}\n checked={selectedOrderIds.includes(po.uid)}\n onChange={handleSelectedOrderId}\n disabled={\n !['PENDING', 'APPROVAL_REQUIRED'].includes(po.status)\n }\n />\n ),\n }\n : {}),\n poNumber,\n orderNumber: po.order.orderNumber,\n createdDate: formatDate(po.createdAt),\n updatedDate: formatDate(po.updatedAt),\n createdBy: `${po.createdBy?.firstname ?? ''} ${\n po.createdBy?.lastname ?? ''\n }`.trim(),\n status: (\n <Text\n id={`PurchaseOrders.purchaseOrdersTable.statusOrder.${po.status.toLowerCase()}`}\n />\n ),\n total: `${po?.quote?.prices?.grandTotal?.value} ${po?.quote?.prices?.grandTotal?.currency}`,\n action: (\n <a\n href={handlePurchaseOrderDetailsRedirect(poNumber)}\n aria-label={`View purchase order ${poNumber}`}\n >\n {t.actionView}\n </a>\n ),\n };\n });\n\n let finalRows = formattedPurchaseOrders;\n\n if (setRowsData) {\n const customRows = setRowsData(formattedPurchaseOrders);\n // If setRowsData returns something, use it, otherwise keep original data\n if (customRows !== undefined && Array.isArray(customRows)) {\n finalRows = customRows as typeof formattedPurchaseOrders;\n }\n }\n\n return finalRows;\n }, [\n purchaseOrders,\n setRowsData,\n isAdmin,\n isRequireApprovalPOsView,\n selectedOrderIds,\n handleSelectedOrderId,\n handlePurchaseOrderDetailsRedirect,\n t.actionView,\n ]);\n\n return {\n totalCount,\n loading,\n tableConfig: {\n columns,\n rows,\n },\n paginationConfig: {\n currentPage,\n totalPages,\n handlePageChange,\n },\n pageSizeConfig: {\n pageSizeOptionsList,\n onChange: handleChangePageSize,\n },\n selectedOrderIds,\n handleRejectSelected,\n handleApproveSelected,\n isAdmin,\n isRequireApprovalPOsView,\n alertMessageConfig,\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 { CustomerRolePermissionsModel } from '@/b2b-purchase-order/data/models/customer-role-permissions-model';\n\ntype PermissionsPayload = {\n admin?: boolean;\n [key: string]: boolean | undefined;\n};\n\n/**\n * Transforms flat permissions object from auth/permissions event into CustomerRolePermissionsModel\n *\n * Permission Logic:\n * - true: Permission granted\n * - false: Permission disabled (overrides admin privileges - indicates PO feature is disabled)\n * - Default: Admins get access, regular users don't\n *\n * @param permissionsData - Flat object with permission keys and admin flag\n * @returns CustomerRolePermissionsModel\n */\nexport const transformPermissions = (\n permissionsData: PermissionsPayload | null | undefined\n): CustomerRolePermissionsModel => {\n // Fallback for edge cases\n if (!permissionsData) {\n return {\n isAdmin: false,\n purchaseOrderEnabled: false,\n role: { id: '', name: '' },\n permissions: {\n purchaseOrderAll: false,\n viewPurchaseOrders: false,\n viewPurchaseOrdersForSubordinates: false,\n viewPurchaseOrdersForCompany: false,\n autoApprovePurchaseOrder: false,\n superApprovePurchaseOrder: false,\n viewApprovalRules: false,\n manageApprovalRules: false,\n },\n };\n }\n\n const isAdmin = permissionsData.admin === true;\n\n /**\n * Check if permission is granted\n * - false: Overrides admin (PO disabled)\n * - true: Permission granted\n * - Default: Use admin status\n */\n const hasPermission = (key: string): boolean => {\n const permissionValue = permissionsData[key];\n\n if (permissionValue === false) {\n return false;\n }\n\n if (permissionValue === true) {\n return true;\n }\n\n return isAdmin;\n };\n\n const permissions = {\n purchaseOrderAll: hasPermission('Magento_PurchaseOrder::all'),\n viewPurchaseOrders: hasPermission(\n 'Magento_PurchaseOrder::view_purchase_orders'\n ),\n viewPurchaseOrdersForSubordinates: hasPermission(\n 'Magento_PurchaseOrder::view_purchase_orders_for_subordinates'\n ),\n viewPurchaseOrdersForCompany: hasPermission(\n 'Magento_PurchaseOrder::view_purchase_orders_for_company'\n ),\n autoApprovePurchaseOrder: hasPermission(\n 'Magento_PurchaseOrder::autoapprove_purchase_order'\n ),\n superApprovePurchaseOrder: hasPermission(\n 'Magento_PurchaseOrderRule::super_approve_purchase_order'\n ),\n viewApprovalRules: hasPermission(\n 'Magento_PurchaseOrderRule::view_approval_rules'\n ),\n manageApprovalRules: hasPermission(\n 'Magento_PurchaseOrderRule::manage_approval_rules'\n ),\n };\n\n // Purchase orders are disabled if ANY permission in the payload is explicitly set to false\n // Otherwise enabled if user has at least one permission\n const hasExplicitlyDisabledPermission = Object.values(permissionsData).some(\n (value) => value === false\n );\n const purchaseOrderEnabled = hasExplicitlyDisabledPermission\n ? false\n : Object.values(permissions).some((permission) => permission === true);\n\n return {\n isAdmin,\n purchaseOrderEnabled,\n role: {\n id: '',\n name: isAdmin ? 'Company Administrator' : '',\n },\n permissions,\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 { useMemo, useState, useEffect } from 'preact/hooks';\nimport { events } from '@adobe-commerce/event-bus';\nimport { transformPermissions } from '@/b2b-purchase-order/data/transforms/transform-customer-role-permissions';\nimport { CustomerRolePermissionsModel } from '@/b2b-purchase-order/data/models';\n\n/**\n * Hook to consume customer role permissions from the auth/permissions event\n *\n * Initializes with last payload and subscribes to real-time updates.\n * Transforms permissions data where:\n * - true: Permission granted\n * - false: Permission disabled (overrides admin - PO feature disabled)\n * - Default: Admins get access, regular users don't\n *\n * @returns {permissions: CustomerRolePermissionsModel, loadingPermissions: boolean}\n */\nexport const useCustomerRolePermissions = (): {\n permissions: CustomerRolePermissionsModel;\n loadingPermissions: boolean;\n} => {\n // Initialize with the last payload from the auth/permissions event\n const initialPermissionsData = events.lastPayload('auth/permissions');\n\n // State to hold permissions data, updated when event is triggered\n const [permissionsData, setPermissionsData] = useState(\n initialPermissionsData\n );\n\n // Subscribe to auth/permissions event for real-time updates\n useEffect(() => {\n const subscription = events.on(\n 'auth/permissions',\n (payload) => {\n setPermissionsData(payload);\n },\n { eager: true }\n );\n\n // Cleanup subscription on unmount\n return () => {\n subscription?.off();\n };\n }, []);\n\n // We're loading if we don't have permissions data from the event yet\n const loadingPermissions = !permissionsData;\n\n // Transform and memoize the permissions data\n const permissions = useMemo(() => {\n return transformPermissions(permissionsData);\n }, [permissionsData]);\n\n return {\n permissions,\n loadingPermissions,\n };\n};\n"],"names":["isValidUrl","url","formatDate","dateString","locale","date","getRange","currentPage","pageSize","total","maxPage","p","from","to","PurchaseOrdersTable","pageSizeConfig","totalCount","columns","rows","paginationConfig","alertMessageConfig","loading","className","variant","skeletonRowCount","emptyTitle","header","footer","withWrapper","t","useText","alertMessageHeading","alertMessageDescription","alertMessageType","totalPages","handlePageChange","pageSizeOptionsList","onChange","_a","option","content","jsxs","Fragment","jsx","InLineAlert","Table","Text","Pagination","Picker","_b","Card","classes","PurchaseOrdersHeader","headerText","Header","EnumPurchaseOrdersView","defaultPageSizeConfig","defaultColumns","defaultCompanyColumns","DEFAULT_PAGE_SIZE","usePurchaseOrders","view","initialPageSize","routePurchaseOrderDetails","setColumns","setRowsData","permissions","loadingPermissions","isCompanyPOsView","isRequireApprovalPOsView","selectedOrderIds","setSelectedOrderIds","useState","purchaseOrders","setPurchaseOrders","setPageSizeOptionsList","setLoading","pagination","setPagination","setAlertMessageConfig","useEffect","timer","handleChangePageSize","useCallback","event","size","prev","isAdmin","filterConfig","useMemo","config","selectedPageSize","getPurchaseOrders","data","responsePage","responseTotalPages","responseTotalCount","error","handlePurchaseOrderDetailsRedirect","poNumber","page","handleSelectedOrderId","uid","isChecked","prevSelected","po","handleSelectedOrderIds","handleRejectSelected","rejectPurchaseOrders","updated","err","handleApproveSelected","approvePurchaseOrders","currentColumns","col","formattedPurchaseOrders","_e","_d","_c","_h","_g","_f","finalRows","customRows","transformPermissions","permissionsData","hasPermission","key","permissionValue","purchaseOrderEnabled","value","permission","useCustomerRolePermissions","initialPermissionsData","events","setPermissionsData","subscription","payload"],"mappings":"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"}
1
+ {"version":3,"file":"useCustomerRolePermissions.js","sources":["/@dropins/storefront-purchase-order/src/data/transforms/transform-customer-role-permissions.ts","/@dropins/storefront-purchase-order/src/hooks/useCustomerRolePermissions.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 { CustomerRolePermissionsModel } from '@/b2b-purchase-order/data/models/customer-role-permissions-model';\n\ntype PermissionsPayload = {\n admin?: boolean;\n [key: string]: boolean | undefined;\n};\n\n/**\n * Transforms flat permissions object from auth/permissions event into CustomerRolePermissionsModel\n *\n * Permission Logic:\n * - true: Permission granted\n * - false: Permission disabled (overrides admin privileges - indicates PO feature is disabled)\n * - Default: Admins get access, regular users don't\n *\n * @param permissionsData - Flat object with permission keys and admin flag\n * @returns CustomerRolePermissionsModel\n */\nexport const transformPermissions = (\n permissionsData: PermissionsPayload | null | undefined\n): CustomerRolePermissionsModel => {\n // Fallback for edge cases\n if (!permissionsData) {\n return {\n isAdmin: false,\n purchaseOrderEnabled: false,\n role: { id: '', name: '' },\n permissions: {\n purchaseOrderAll: false,\n viewPurchaseOrders: false,\n viewPurchaseOrdersForSubordinates: false,\n viewPurchaseOrdersForCompany: false,\n autoApprovePurchaseOrder: false,\n superApprovePurchaseOrder: false,\n viewApprovalRules: false,\n manageApprovalRules: false,\n },\n };\n }\n\n const isAdmin = permissionsData.admin === true;\n\n /**\n * Check if permission is granted\n * - false: Overrides admin (PO disabled)\n * - true: Permission granted\n * - Default: Use admin status\n */\n const hasPermission = (key: string): boolean => {\n const permissionValue = permissionsData[key];\n\n if (permissionValue === false) {\n return false;\n }\n\n if (permissionValue === true) {\n return true;\n }\n\n return isAdmin;\n };\n\n const permissions = {\n purchaseOrderAll: hasPermission('Magento_PurchaseOrder::all'),\n viewPurchaseOrders: hasPermission(\n 'Magento_PurchaseOrder::view_purchase_orders'\n ),\n viewPurchaseOrdersForSubordinates: hasPermission(\n 'Magento_PurchaseOrder::view_purchase_orders_for_subordinates'\n ),\n viewPurchaseOrdersForCompany: hasPermission(\n 'Magento_PurchaseOrder::view_purchase_orders_for_company'\n ),\n autoApprovePurchaseOrder: hasPermission(\n 'Magento_PurchaseOrder::autoapprove_purchase_order'\n ),\n superApprovePurchaseOrder: hasPermission(\n 'Magento_PurchaseOrderRule::super_approve_purchase_order'\n ),\n viewApprovalRules: hasPermission(\n 'Magento_PurchaseOrderRule::view_approval_rules'\n ),\n manageApprovalRules: hasPermission(\n 'Magento_PurchaseOrderRule::manage_approval_rules'\n ),\n };\n\n // Purchase orders are disabled if ANY permission in the payload is explicitly set to false\n // Otherwise enabled if user has at least one permission\n const hasExplicitlyDisabledPermission = Object.values(permissionsData).some(\n (value) => value === false\n );\n const purchaseOrderEnabled = hasExplicitlyDisabledPermission\n ? false\n : Object.values(permissions).some((permission) => permission === true);\n\n return {\n isAdmin,\n purchaseOrderEnabled,\n role: {\n id: '',\n name: isAdmin ? 'Company Administrator' : '',\n },\n permissions,\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 { useMemo, useState, useEffect } from 'preact/hooks';\nimport { events } from '@adobe-commerce/event-bus';\nimport { transformPermissions } from '@/b2b-purchase-order/data/transforms/transform-customer-role-permissions';\nimport { CustomerRolePermissionsModel } from '@/b2b-purchase-order/data/models';\n\n/**\n * Hook to consume customer role permissions from the auth/permissions event\n *\n * Initializes with last payload and subscribes to real-time updates.\n * Transforms permissions data where:\n * - true: Permission granted\n * - false: Permission disabled (overrides admin - PO feature disabled)\n * - Default: Admins get access, regular users don't\n *\n * @returns {permissions: CustomerRolePermissionsModel, loadingPermissions: boolean}\n */\nexport const useCustomerRolePermissions = (): {\n permissions: CustomerRolePermissionsModel;\n loadingPermissions: boolean;\n} => {\n // Initialize with the last payload from the auth/permissions event\n const initialPermissionsData = events.lastPayload('auth/permissions');\n\n // State to hold permissions data, updated when event is triggered\n const [permissionsData, setPermissionsData] = useState(\n initialPermissionsData\n );\n\n // Subscribe to auth/permissions event for real-time updates\n useEffect(() => {\n const subscription = events.on(\n 'auth/permissions',\n (payload) => {\n setPermissionsData(payload);\n },\n { eager: true }\n );\n\n // Cleanup subscription on unmount\n return () => {\n subscription?.off();\n };\n }, []);\n\n // We're loading if we don't have permissions data from the event yet\n const loadingPermissions = !permissionsData;\n\n // Transform and memoize the permissions data\n const permissions = useMemo(() => {\n return transformPermissions(permissionsData);\n }, [permissionsData]);\n\n return {\n permissions,\n loadingPermissions,\n };\n};\n"],"names":["transformPermissions","permissionsData","isAdmin","hasPermission","key","permissionValue","permissions","purchaseOrderEnabled","value","permission","useCustomerRolePermissions","initialPermissionsData","events","setPermissionsData","useState","useEffect","subscription","payload","loadingPermissions","useMemo"],"mappings":"2IAmCO,MAAMA,EACXC,GACiC,CAEjC,GAAI,CAACA,EACH,MAAO,CACL,QAAS,GACT,qBAAsB,GACtB,KAAM,CAAE,GAAI,GAAI,KAAM,EAAA,EACtB,YAAa,CACX,iBAAkB,GAClB,mBAAoB,GACpB,kCAAmC,GACnC,6BAA8B,GAC9B,yBAA0B,GAC1B,0BAA2B,GAC3B,kBAAmB,GACnB,oBAAqB,EAAA,CACvB,EAIJ,MAAMC,EAAUD,EAAgB,QAAU,GAQpCE,EAAiBC,GAAyB,CAC9C,MAAMC,EAAkBJ,EAAgBG,CAAG,EAE3C,OAAIC,IAAoB,GACf,GAGLA,IAAoB,GACf,GAGFH,CACT,EAEMI,EAAc,CAClB,iBAAkBH,EAAc,4BAA4B,EAC5D,mBAAoBA,EAClB,6CAAA,EAEF,kCAAmCA,EACjC,8DAAA,EAEF,6BAA8BA,EAC5B,yDAAA,EAEF,yBAA0BA,EACxB,mDAAA,EAEF,0BAA2BA,EACzB,yDAAA,EAEF,kBAAmBA,EACjB,gDAAA,EAEF,oBAAqBA,EACnB,kDAAA,CACF,EAQII,EAHkC,OAAO,OAAON,CAAe,EAAE,KACpEO,GAAUA,IAAU,EAAA,EAGnB,GACA,OAAO,OAAOF,CAAW,EAAE,KAAMG,GAAeA,IAAe,EAAI,EAEvE,MAAO,CACL,QAAAP,EACA,qBAAAK,EACA,KAAM,CACJ,GAAI,GACJ,KAAML,EAAU,wBAA0B,EAAA,EAE5C,YAAAI,CAAA,CAEJ,ECzFaI,EAA6B,IAGrC,CAEH,MAAMC,EAAyBC,EAAO,YAAY,kBAAkB,EAG9D,CAACX,EAAiBY,CAAkB,EAAIC,EAC5CH,CAAA,EAIFI,EAAU,IAAM,CACd,MAAMC,EAAeJ,EAAO,GAC1B,mBACCK,GAAY,CACXJ,EAAmBI,CAAO,CAC5B,EACA,CAAE,MAAO,EAAA,CAAK,EAIhB,MAAO,IAAM,CACXD,GAAA,MAAAA,EAAc,KAChB,CACF,EAAG,CAAA,CAAE,EAGL,MAAME,EAAqB,CAACjB,EAO5B,MAAO,CACL,YALkBkB,EAAQ,IACnBnB,EAAqBC,CAAe,EAC1C,CAACA,CAAe,CAAC,EAIlB,mBAAAiB,CAAA,CAEJ"}
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as _}from"@dropins/tools/preact-jsx-runtime.js";import{useState as g,useEffect as z,useCallback as l,useMemo as N}from"@dropins/tools/preact-hooks.js";import"@dropins/tools/event-bus.js";import{i as re}from"./pageSize.config.js";import{g as te,r as se,a as ne}from"./getPurchaseOrders.js";import{d as ce,a as ae}from"./FormLoader.js";import{Text as oe}from"@dropins/tools/i18n.js";const q=(c,I="en-US")=>{try{const a=new Date(c);return isNaN(a.getTime())?c:a.toLocaleString(I,{year:"numeric",month:"short",day:"numeric",hour:"numeric",minute:"2-digit",second:"2-digit",hour12:!0})}catch{return c}};var T=(c=>(c.CUSTOMER_PURCHASE_ORDERS="customerPurchaseOrders",c.COMPANY_PURCHASE_ORDERS="companyPurchaseOrders",c.CUSTOMER_APPROVAL_PURCHASE_ORDERS="customerApprovalPurchaseOrders",c))(T||{});const ie=20,Pe=({view:c,initialPageSize:I,routePurchaseOrderDetails:a,setColumns:y,setRowsData:k,t:n,permissions:D,loadingPermissions:L})=>{const C=c===T.COMPANY_PURCHASE_ORDERS,o=c===T.CUSTOMER_APPROVAL_PURCHASE_ORDERS,[d,E]=g([]),[h,U]=g([]),[p,G]=g(I),[B,f]=g(!0),[Q,V]=g({currentPage:1,totalPages:1,totalCount:0}),[P,m]=g({heading:"",description:"",type:"success"});z(()=>{if(P.heading||P.description){const r=setTimeout(()=>{m({heading:"",description:"",type:"success"})},7e3);return()=>clearTimeout(r)}},[P.heading,P.description]);const{currentPage:v,totalPages:F,totalCount:Y}=Q,Z=l(r=>{const s=r.target.value;G(e=>e.map(t=>({...t,selected:t.value===s})))},[]),A=(D==null?void 0:D.isAdmin)??!1,H=N(()=>{let r={};return C&&(r={companyPurchaseOrders:!0}),o&&(r={requireMyApproval:!0}),r},[C,o]);z(()=>{var e;if(L)return;f(!0);const r=(e=p==null?void 0:p.find(t=>t.selected))==null?void 0:e.value,s=parseInt(r??ie.toString(),10);te(H,s,v).then(t=>{var O,R;const i=(t==null?void 0:t.purchaseOrderItems)??[],u=(O=t==null?void 0:t.pageInfo)==null?void 0:O.currentPage,S=(R=t==null?void 0:t.pageInfo)==null?void 0:R.totalPages,b=t==null?void 0:t.totalCount;V({currentPage:u,totalPages:S,totalCount:b}),U(i)}).catch(t=>{console.error("Failed to fetch purchase orders:",t)}).finally(()=>{f(!1)})},[v,p,H,L]);const M=l(r=>{const s=a==null?void 0:a(r);return re(s??"")?s:"#"},[a]),J=l(r=>{V(s=>({...s,currentPage:r}))},[]),w=l(r=>{const s=r.target.value,e=r.target.checked;E(t=>e?[...t,s]:t.filter(i=>i!==s))},[]),x=l(r=>{const s=r.target.checked;E(()=>s?h.filter(e=>["PENDING","APPROVAL_REQUIRED"].includes(e.status)).map(e=>e.uid??""):[])},[h]),K=l(()=>{se(d).then(r=>{const s=(r==null?void 0:r.purchaseOrders)??[];U(e=>e.map(t=>s.find(u=>u.uid===t.uid)??t)),m({heading:n.alertHeaderReject,description:n.alertDescriptionReject,type:"success"}),E([])}).catch(r=>{m({heading:n.alertHeaderError,description:n.alertDescriptionError,type:"error"}),console.error(r)}).finally(()=>{f(!1)})},[d,n]),W=l(()=>{f(!0),ne(d).then(r=>{const s=(r==null?void 0:r.purchaseOrders)??[];U(e=>e.map(t=>s.find(u=>u.uid===t.uid)??t)),m({heading:n.alertHeaderApprove,description:n.alertDescriptionApprove,type:"success"}),E([])}).catch(r=>{m({heading:n.alertHeaderError,description:n.alertDescriptionError,type:"error"}),console.error(r)}).finally(()=>{f(!1)})},[d,n]),X=N(()=>{const r=C||o?ce:ae;return(y==null?void 0:y(r))??r.map(s=>s.key==="checkboxView"&&(A||o)?{key:s.key,label:_("input",{type:"checkbox",name:"selectAll",disabled:h.every(e=>!["PENDING","APPROVAL_REQUIRED"].includes(e.status)),onChange:x}),ariaLabel:n.selectAllAriaLabel}:{...s,label:n[s.key]||s.label})},[n,A,C,o,y,h,x]),ee=N(()=>{const r=h.map(e=>{var i,u,S,b,O,R,$,j;const t=e.number??"";return{...A||o?{checkboxView:_("input",{type:"checkbox",name:t,value:e.uid,checked:d.includes(e.uid),onChange:w,disabled:!["PENDING","APPROVAL_REQUIRED"].includes(e.status)})}:{},poNumber:t,orderNumber:e.order.orderNumber,createdDate:q(e.createdAt),updatedDate:q(e.updatedAt),createdBy:`${((i=e.createdBy)==null?void 0:i.firstname)??""} ${((u=e.createdBy)==null?void 0:u.lastname)??""}`.trim(),status:_(oe,{id:`PurchaseOrders.purchaseOrdersTable.statusOrder.${e.status.toLowerCase()}`}),total:`${(O=(b=(S=e==null?void 0:e.quote)==null?void 0:S.prices)==null?void 0:b.grandTotal)==null?void 0:O.value} ${(j=($=(R=e==null?void 0:e.quote)==null?void 0:R.prices)==null?void 0:$.grandTotal)==null?void 0:j.currency}`,action:_("a",{href:M(t),"aria-label":`View purchase order ${t}`,children:n.actionView})}});let s=r;if(k){const e=k(r);e!==void 0&&Array.isArray(e)&&(s=e)}return s},[h,k,A,o,d,w,M,n.actionView]);return{tableConfig:{columns:X,rows:ee},paginationConfig:{currentPage:v,totalPages:F,handlePageChange:J},pageSizeConfig:{pageSizeOptionsList:p,onChange:Z},totalCount:Y,loading:B,selectedOrderIds:d,handleRejectSelected:K,handleApproveSelected:W,isAdmin:A,isRequireApprovalPOsView:o,alertMessageConfig:P}};export{T as E,Pe as u};
4
+ //# sourceMappingURL=usePurchaseOrders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePurchaseOrders.js","sources":["/@dropins/storefront-purchase-order/src/lib/formatDate.ts","/@dropins/storefront-purchase-order/src/types/api/api.enums.types.ts","/@dropins/storefront-purchase-order/src/hooks/usePurchaseOrders.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\n/**\n * Format a date string to a localized format like \"Sep 8, 2025 6:32:13 AM\"\n * @param dateString - ISO date string or date string\n * @param locale - Locale for formatting (defaults to 'en-US')\n * @returns Formatted date string\n */\nexport const formatDate = (\n dateString: string,\n locale: string = 'en-US'\n): string => {\n try {\n const date = new Date(dateString);\n\n if (isNaN(date.getTime())) {\n return dateString; // Return original if invalid\n }\n\n return date.toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n hour12: true,\n });\n } catch (error) {\n return dateString; // Return original on error\n }\n};\n","export enum PurchaseOrderApprovalRuleStatus {\n ENABLED = 'ENABLED',\n DISABLED = 'DISABLED',\n}\n\nexport enum PurchaseOrderApprovalRuleType {\n GRAND_TOTAL = 'GRAND_TOTAL',\n SHIPPING_INCL_TAX = 'SHIPPING_INCL_TAX',\n NUMBER_OF_SKUS = 'NUMBER_OF_SKUS',\n}\n\nexport enum PurchaseOrderApprovalRuleConditionOperator {\n MORE_THAN = 'MORE_THAN',\n LESS_THAN = 'LESS_THAN',\n MORE_THAN_OR_EQUAL_TO = 'MORE_THAN_OR_EQUAL_TO',\n LESS_THAN_OR_EQUAL_TO = 'LESS_THAN_OR_EQUAL_TO',\n}\n\nexport enum EnumPurchaseOrdersView {\n CUSTOMER_PURCHASE_ORDERS = 'customerPurchaseOrders',\n COMPANY_PURCHASE_ORDERS = 'companyPurchaseOrders',\n CUSTOMER_APPROVAL_PURCHASE_ORDERS = 'customerApprovalPurchaseOrders',\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 React from 'preact/compat';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\nimport { formatDate, isValidUrl } from '@/b2b-purchase-order/lib';\nimport {\n AlertMessageConfigType,\n UsePurchaseOrdersParams,\n UsePurchaseOrdersReturn,\n} from '@/b2b-purchase-order/types/hooks';\nimport { EnumPurchaseOrdersView } from '@/b2b-purchase-order/types/api';\nimport { PurchaseOrderModel } from '@/b2b-purchase-order/data/models';\nimport { Column } from '@/b2b-purchase-order/types/components';\nimport {\n approvePurchaseOrders,\n getPurchaseOrders,\n rejectPurchaseOrders,\n} from '@/b2b-purchase-order/api';\nimport {\n defaultColumns,\n defaultCompanyColumns,\n} from '@/b2b-purchase-order/configs';\nimport { Text } from '@adobe-commerce/elsie/i18n';\n\nconst DEFAULT_PAGE_SIZE = 20;\n\nexport const usePurchaseOrders = ({\n view,\n initialPageSize,\n routePurchaseOrderDetails,\n setColumns,\n setRowsData,\n t,\n permissions,\n loadingPermissions,\n}: UsePurchaseOrdersParams): UsePurchaseOrdersReturn => {\n const isCompanyPOsView =\n view === EnumPurchaseOrdersView.COMPANY_PURCHASE_ORDERS;\n const isRequireApprovalPOsView =\n view === EnumPurchaseOrdersView.CUSTOMER_APPROVAL_PURCHASE_ORDERS;\n const [selectedOrderIds, setSelectedOrderIds] = useState<string[]>([]);\n const [purchaseOrders, setPurchaseOrders] = useState<PurchaseOrderModel[]>(\n []\n );\n const [pageSizeOptionsList, setPageSizeOptionsList] =\n useState(initialPageSize);\n const [loading, setLoading] = useState<boolean>(true);\n const [pagination, setPagination] = useState({\n currentPage: 1,\n totalPages: 1,\n totalCount: 0,\n });\n const [alertMessageConfig, setAlertMessageConfig] =\n useState<AlertMessageConfigType>({\n heading: '',\n description: '',\n type: 'success',\n });\n\n // Auto-clear alert message after 7 seconds\n useEffect(() => {\n if (alertMessageConfig.heading || alertMessageConfig.description) {\n const timer = setTimeout(() => {\n setAlertMessageConfig({\n heading: '',\n description: '',\n type: 'success',\n });\n }, 7000);\n\n return () => clearTimeout(timer);\n }\n }, [alertMessageConfig.heading, alertMessageConfig.description]);\n\n // Derive pagination values\n const { currentPage, totalPages, totalCount } = pagination;\n\n const handleChangePageSize = useCallback((event: Event) => {\n const size = (event.target as HTMLSelectElement).value;\n\n setPageSizeOptionsList((prev) => {\n return prev.map((option) => ({\n ...option,\n selected: option.value === size,\n }));\n });\n }, []);\n\n const isAdmin = permissions?.isAdmin ?? false;\n\n const filterConfig = useMemo(() => {\n let config = {};\n\n if (isCompanyPOsView) {\n config = { companyPurchaseOrders: true };\n }\n\n if (isRequireApprovalPOsView) {\n config = { requireMyApproval: true };\n }\n\n return config;\n }, [isCompanyPOsView, isRequireApprovalPOsView]);\n\n useEffect(() => {\n // Don't fetch purchase orders until permissions are loaded\n if (loadingPermissions) {\n return;\n }\n\n setLoading(true);\n const pageSize = pageSizeOptionsList?.find(\n (option) => option.selected\n )?.value;\n const selectedPageSize = parseInt(\n pageSize ?? DEFAULT_PAGE_SIZE.toString(),\n 10\n );\n\n getPurchaseOrders(filterConfig, selectedPageSize, currentPage)\n .then((data) => {\n const purchaseOrders = data?.purchaseOrderItems ?? [];\n const responsePage = data?.pageInfo?.currentPage;\n const responseTotalPages = data?.pageInfo?.totalPages;\n const responseTotalCount = data?.totalCount;\n\n setPagination({\n currentPage: responsePage,\n totalPages: responseTotalPages,\n totalCount: responseTotalCount,\n });\n setPurchaseOrders(purchaseOrders);\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.error('Failed to fetch purchase orders:', error);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [currentPage, pageSizeOptionsList, filterConfig, loadingPermissions]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handlePurchaseOrderDetailsRedirect = useCallback(\n (poNumber: string): string => {\n const url = routePurchaseOrderDetails?.(poNumber) as string;\n\n if (!isValidUrl(url ?? '')) return '#';\n\n return url;\n },\n [routePurchaseOrderDetails]\n );\n\n const handlePageChange = useCallback((page: number) => {\n setPagination((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n const handleSelectedOrderId = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const uid = (event.target as HTMLInputElement).value;\n const isChecked = (event.target as HTMLInputElement).checked;\n\n setSelectedOrderIds((prevSelected) => {\n if (isChecked) {\n return [...prevSelected, uid];\n }\n return prevSelected.filter((po) => po !== uid);\n });\n },\n []\n );\n\n const handleSelectedOrderIds = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const isChecked = (event.target as HTMLInputElement).checked;\n setSelectedOrderIds(() =>\n isChecked\n ? purchaseOrders\n .filter((po) =>\n ['PENDING', 'APPROVAL_REQUIRED'].includes(po.status)\n )\n .map((po) => po.uid ?? '')\n : []\n );\n },\n [purchaseOrders]\n );\n\n const handleRejectSelected = useCallback(() => {\n rejectPurchaseOrders(selectedOrderIds)\n .then((data) => {\n const purchaseOrders = data?.purchaseOrders ?? [];\n setPurchaseOrders((prev) => {\n return prev.map((po) => {\n const updatedPo = purchaseOrders.find(\n (updated) => updated.uid === po.uid\n );\n return updatedPo ?? po;\n });\n });\n setAlertMessageConfig({\n heading: t.alertHeaderReject,\n description: t.alertDescriptionReject,\n type: 'success',\n });\n setSelectedOrderIds([]);\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n setAlertMessageConfig({\n heading: t.alertHeaderError,\n description: t.alertDescriptionError,\n type: 'error',\n });\n console.error(err);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [selectedOrderIds, t]);\n\n const handleApproveSelected = useCallback(() => {\n setLoading(true);\n approvePurchaseOrders(selectedOrderIds)\n .then((data) => {\n const purchaseOrders = data?.purchaseOrders ?? [];\n setPurchaseOrders((prev) => {\n return prev.map((po) => {\n const updatedPo = purchaseOrders.find(\n (updated) => updated.uid === po.uid\n );\n return updatedPo ?? po;\n });\n });\n setAlertMessageConfig({\n heading: t.alertHeaderApprove,\n description: t.alertDescriptionApprove,\n type: 'success',\n });\n setSelectedOrderIds([]);\n })\n .catch((err) => {\n setAlertMessageConfig({\n heading: t.alertHeaderError,\n description: t.alertDescriptionError,\n type: 'error',\n });\n console.error(err);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [selectedOrderIds, t]);\n\n const columns = useMemo(() => {\n const currentColumns =\n isCompanyPOsView || isRequireApprovalPOsView\n ? defaultCompanyColumns\n : defaultColumns;\n\n return (\n setColumns?.(currentColumns) ??\n currentColumns.map((col) => {\n if (\n col.key === 'checkboxView' &&\n (isAdmin || isRequireApprovalPOsView)\n ) {\n return {\n key: col.key,\n label: (\n <input\n type=\"checkbox\"\n name={'selectAll'}\n disabled={purchaseOrders.every(\n (po) => !['PENDING', 'APPROVAL_REQUIRED'].includes(po.status)\n )}\n onChange={handleSelectedOrderIds}\n />\n ),\n ariaLabel: t.selectAllAriaLabel,\n } as Column;\n }\n\n return {\n ...col,\n label: t[col.key as keyof typeof t] || col.label,\n } as Column;\n })\n );\n }, [\n t,\n isAdmin,\n isCompanyPOsView,\n isRequireApprovalPOsView,\n setColumns,\n purchaseOrders,\n handleSelectedOrderIds,\n ]);\n\n const rows = useMemo(() => {\n const formattedPurchaseOrders = purchaseOrders.map((po) => {\n const poNumber = po.number ?? '';\n\n return {\n ...(isAdmin || isRequireApprovalPOsView\n ? {\n checkboxView: (\n <input\n type=\"checkbox\"\n name={poNumber}\n value={po.uid}\n checked={selectedOrderIds.includes(po.uid)}\n onChange={handleSelectedOrderId}\n disabled={\n !['PENDING', 'APPROVAL_REQUIRED'].includes(po.status)\n }\n />\n ),\n }\n : {}),\n poNumber,\n orderNumber: po.order.orderNumber,\n createdDate: formatDate(po.createdAt),\n updatedDate: formatDate(po.updatedAt),\n createdBy: `${po.createdBy?.firstname ?? ''} ${\n po.createdBy?.lastname ?? ''\n }`.trim(),\n status: (\n <Text\n id={`PurchaseOrders.purchaseOrdersTable.statusOrder.${po.status.toLowerCase()}`}\n />\n ),\n total: `${po?.quote?.prices?.grandTotal?.value} ${po?.quote?.prices?.grandTotal?.currency}`,\n action: (\n <a\n href={handlePurchaseOrderDetailsRedirect(poNumber)}\n aria-label={`View purchase order ${poNumber}`}\n >\n {t.actionView}\n </a>\n ),\n };\n });\n\n let finalRows = formattedPurchaseOrders;\n\n if (setRowsData) {\n const customRows = setRowsData(formattedPurchaseOrders);\n // If setRowsData returns something, use it, otherwise keep original data\n if (customRows !== undefined && Array.isArray(customRows)) {\n finalRows = customRows as typeof formattedPurchaseOrders;\n }\n }\n\n return finalRows;\n }, [\n purchaseOrders,\n setRowsData,\n isAdmin,\n isRequireApprovalPOsView,\n selectedOrderIds,\n handleSelectedOrderId,\n handlePurchaseOrderDetailsRedirect,\n t.actionView,\n ]);\n\n return {\n tableConfig: {\n columns,\n rows,\n },\n paginationConfig: {\n currentPage,\n totalPages,\n handlePageChange,\n },\n pageSizeConfig: {\n pageSizeOptionsList,\n onChange: handleChangePageSize,\n },\n totalCount,\n loading,\n selectedOrderIds,\n handleRejectSelected,\n handleApproveSelected,\n isAdmin,\n isRequireApprovalPOsView,\n alertMessageConfig,\n };\n};\n"],"names":["formatDate","dateString","locale","date","EnumPurchaseOrdersView","DEFAULT_PAGE_SIZE","usePurchaseOrders","view","initialPageSize","routePurchaseOrderDetails","setColumns","setRowsData","t","permissions","loadingPermissions","isCompanyPOsView","isRequireApprovalPOsView","selectedOrderIds","setSelectedOrderIds","useState","purchaseOrders","setPurchaseOrders","pageSizeOptionsList","setPageSizeOptionsList","loading","setLoading","pagination","setPagination","alertMessageConfig","setAlertMessageConfig","useEffect","timer","currentPage","totalPages","totalCount","handleChangePageSize","useCallback","event","size","prev","option","isAdmin","filterConfig","useMemo","config","pageSize","_a","selectedPageSize","getPurchaseOrders","data","responsePage","responseTotalPages","_b","responseTotalCount","error","handlePurchaseOrderDetailsRedirect","poNumber","url","isValidUrl","handlePageChange","page","handleSelectedOrderId","uid","isChecked","prevSelected","po","handleSelectedOrderIds","handleRejectSelected","rejectPurchaseOrders","updated","err","handleApproveSelected","approvePurchaseOrders","columns","currentColumns","defaultCompanyColumns","defaultColumns","col","jsx","rows","formattedPurchaseOrders","Text","_e","_d","_c","_h","_g","_f","finalRows","customRows"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FunctionComponent } from 'preact';
2
+ import { ApprovalRuleDetailsContentProps } from '../../types/components';
3
+
4
+ export declare const ApprovalRuleDetailsContent: FunctionComponent<ApprovalRuleDetailsContentProps>;
5
+ //# sourceMappingURL=ApprovalRuleDetailsContent.d.ts.map
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './ApprovalRuleDetailsContent';
10
+ export { ApprovalRuleDetailsContent as default } from './ApprovalRuleDetailsContent';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { FunctionComponent } from 'preact';
2
+ import { ApprovalRuleFormProps } from '../../types/components';
3
+
4
+ export declare const ApprovalRuleForm: FunctionComponent<ApprovalRuleFormProps>;
5
+ //# sourceMappingURL=ApprovalRuleForm.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { FunctionComponent } from 'preact';
2
+
3
+ declare const ErrorMessage: FunctionComponent<{
4
+ touched?: boolean;
5
+ error?: string;
6
+ className?: string;
7
+ }>;
8
+ export default ErrorMessage;
9
+ //# sourceMappingURL=ErrorMessage.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { CustomerRolePermissionsModel } from '../../../data/models';
2
+
3
+ declare const Form: ({ availableRequiresApprovalFrom, conditionOperators, availableAppliesTo, appliesToOptions, ruleTypeOptions, currencies, formValues, errors, touched, isLoading, permissions, handleSubmit, handleFieldTouch, handleSetFormValues, routeApprovalRulesList, t, }: {
4
+ availableRequiresApprovalFrom: {
5
+ id: string;
6
+ name: string;
7
+ }[];
8
+ conditionOperators: {
9
+ value: string;
10
+ text: string;
11
+ }[];
12
+ availableAppliesTo: {
13
+ id: string;
14
+ name: string;
15
+ }[];
16
+ appliesToOptions: {
17
+ value: string;
18
+ text: string;
19
+ }[];
20
+ ruleTypeOptions: {
21
+ value: string;
22
+ text: string;
23
+ }[];
24
+ currencies: {
25
+ value: string;
26
+ text: string;
27
+ }[];
28
+ formValues: any;
29
+ errors: Record<string, string>;
30
+ touched: Record<string, boolean>;
31
+ isLoading: boolean;
32
+ permissions?: CustomerRolePermissionsModel | undefined;
33
+ handleSubmit: () => void;
34
+ handleFieldTouch: (field: string) => void;
35
+ handleSetFormValues: (field: string, value: any) => void;
36
+ routeApprovalRulesList?: (() => string) | undefined;
37
+ t: Record<string, string>;
38
+ }) => import("preact").JSX.Element;
39
+ export default Form;
40
+ //# sourceMappingURL=Form.d.ts.map
@@ -0,0 +1,19 @@
1
+ /********************************************************************
2
+ * ADOBE CONFIDENTIAL
3
+ * __________________
4
+ *
5
+ * Copyright 2025 Adobe
6
+ * All Rights Reserved.
7
+ *
8
+ * NOTICE: All information contained herein is, and remains
9
+ * the property of Adobe and its suppliers, if any. The intellectual
10
+ * and technical concepts contained herein are proprietary to Adobe
11
+ * and its suppliers and are protected by all applicable intellectual
12
+ * property laws, including trade secret and copyright laws.
13
+ * Dissemination of this information or reproduction of this material
14
+ * is strictly forbidden unless prior written permission is obtained
15
+ * from Adobe.
16
+ *******************************************************************/
17
+ export { default as ErrorMessage } from './ErrorMessage';
18
+ export { default as Form } from './Form';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './ApprovalRuleForm';
10
+ export { ApprovalRuleForm as default } from './ApprovalRuleForm';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { FunctionComponent } from 'preact';
2
+
3
+ export interface FormLoaderProps {
4
+ className?: string;
5
+ testId?: string;
6
+ }
7
+ export declare const FormLoader: FunctionComponent<FormLoaderProps>;
8
+ //# sourceMappingURL=FormLoader.d.ts.map
@@ -0,0 +1,19 @@
1
+ /*******************************************************************
2
+ * ADOBE CONFIDENTIAL
3
+ * __________________
4
+ *
5
+ * Copyright 2025 Adobe
6
+ * All Rights Reserved.
7
+ *
8
+ * NOTICE: All information contained herein is, and remains
9
+ * the property of Adobe and its suppliers, if any. The intellectual
10
+ * and technical concepts contained herein are proprietary to Adobe
11
+ * and its suppliers and are protected by all applicable intellectual
12
+ * property laws, including trade secret and copyright laws.
13
+ * Dissemination of this information or reproduction of this material
14
+ * is strictly forbidden unless prior written permission is obtained
15
+ * from Adobe.
16
+ *******************************************************************/
17
+ export * from './FormLoader';
18
+ export { FormLoader as default } from './FormLoader';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -17,5 +17,8 @@
17
17
  export * from './PurchaseOrdersTable';
18
18
  export * from './PurchaseOrdersHeader';
19
19
  export * from './PurchaseOrdersTableActions';
20
+ export * from './ApprovalRuleForm';
20
21
  export * from './PurchaseOrderConfirmationContent';
22
+ export * from './ApprovalRuleDetailsContent';
23
+ export * from './FormLoader';
21
24
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,74 @@
1
+ import { FormValuesParams, FormState } from '../types/hooks';
2
+
3
+ export declare const RULE_TYPE_OPTIONS_KEYS: {
4
+ readonly GRAND_TOTAL: "ruleTypeGrandTotal";
5
+ readonly SHIPPING_INCL_TAX: "ruleTypeShippingInclTax";
6
+ readonly NUMBER_OF_SKUS: "ruleTypeNumberOfSkus";
7
+ };
8
+ export declare const CONDITION_OPERATORS_KEYS: {
9
+ readonly MORE_THAN: "conditionOperatorMoreThan";
10
+ readonly LESS_THAN: "conditionOperatorLessThan";
11
+ readonly MORE_THAN_OR_EQUAL_TO: "conditionOperatorMoreThanOrEqualTo";
12
+ readonly LESS_THAN_OR_EQUAL_TO: "conditionOperatorLessThanOrEqualTo";
13
+ };
14
+ export declare const APPLIES_TO_OPTIONS_KEYS: {
15
+ readonly ALL_USERS: "appliesToAllUsers";
16
+ readonly SPECIFIC_ROLES: "appliesToSpecificRoles";
17
+ };
18
+ /**
19
+ * Initial values for the approval rule form
20
+ * Used when creating a new rule
21
+ */
22
+ export declare const INITIAL_FORM_VALUES: FormValuesParams;
23
+ /**
24
+ * Initial state for the form reducer
25
+ * Includes form values, loading states, and validation
26
+ */
27
+ export declare const INITIAL_FORM_STATE: FormState;
28
+ /**
29
+ * Fields that must be touched (validated) on form submission
30
+ */
31
+ export declare const REQUIRED_FIELDS_ON_SUBMIT: {
32
+ readonly name: true;
33
+ readonly appliesTo: true;
34
+ readonly ruleValue: true;
35
+ readonly approvers: true;
36
+ };
37
+ /**
38
+ * Translation keys for validation error messages
39
+ */
40
+ export declare const VALIDATION_ERROR_KEYS: {
41
+ readonly REQUIRED: "PurchaseOrders.approvalRuleForm.errorsMessages.required";
42
+ readonly APPROVERS: "PurchaseOrders.approvalRuleForm.errorsMessages.approvers";
43
+ readonly FAILED_TO_LOAD: "Failed to load metadata. Please try again.";
44
+ readonly FAILED_TO_CREATE: "Failed to create approval rule. Please try again.";
45
+ };
46
+ /**
47
+ * Creates rule type options for the dropdown
48
+ * @param t - Translation function
49
+ */
50
+ /**
51
+ * Creates rule type options for the dropdown
52
+ * @param t - Translation function
53
+ */
54
+ export declare const createRuleTypeOptions: (t: Record<string, string>) => {
55
+ text: string;
56
+ value: string;
57
+ }[];
58
+ /**
59
+ * Creates condition operator options for the dropdown
60
+ * @param t - Translation function
61
+ */
62
+ export declare const createConditionOperators: (t: Record<string, string>) => {
63
+ text: string;
64
+ value: string;
65
+ }[];
66
+ /**
67
+ * Creates "applies to" options for the dropdown
68
+ * @param t - Translation function
69
+ */
70
+ export declare const createAppliesToOptions: (t: Record<string, string>) => {
71
+ text: string;
72
+ value: string;
73
+ }[];
74
+ //# sourceMappingURL=approvalRuleForm.config.d.ts.map
@@ -18,4 +18,6 @@ export * from './pageSize.config';
18
18
  export * from './customerPurchaseOrders.config';
19
19
  export * from './purchaseOrderApprovalRules.config';
20
20
  export * from './companyPurchaseOrders.config';
21
+ export * from './purchaseOrderApprovalRules.config';
22
+ export * from './approvalRuleForm.config';
21
23
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { ApprovalRuleDetailsProps } from '../../types/containers';
2
+ import { Container } from '@dropins/tools/types/elsie/src/lib';
3
+
4
+ export declare const ApprovalRuleDetails: Container<ApprovalRuleDetailsProps>;
5
+ //# sourceMappingURL=ApprovalRuleDetails.d.ts.map
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './ApprovalRuleDetails';
10
+ export { ApprovalRuleDetails as default } from './ApprovalRuleDetails';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './ApprovalRuleDetails/index'
2
+ import _default from './ApprovalRuleDetails/index'
3
+ export default _default
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as e,jsxs as p,Fragment as b}from"@dropins/tools/preact-jsx-runtime.js";import{Card as O,Button as T}from"@dropins/tools/components.js";import{classes as m}from"@dropins/tools/lib.js";import"@dropins/tools/event-bus.js";import"../chunks/FormLoader.js";import{P as C}from"../chunks/PurchaseOrdersHeader.js";import{useState as f,useEffect as L,useMemo as x}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 g}from"../chunks/FormLoader2.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/transform-purchase-order-approval-rule.js";const _=({approvalRuleID:l,routeApprovalRulesList:r})=>{const[t,i]=f(!0),[o,n]=f(null);L(()=>{l&&(i(!0),w(l).then(s=>{s.uid&&n(s)}).catch(()=>{n(null)}).finally(()=>{i(!1)}))},[l]);const h=x(()=>{if(!o||t)return[];const{name:s,status:c,description:R,appliesToRoles:P,approverRoles:D,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:R},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.appliesTo"}),value:e("ul",{children:P.map(u=>e("li",{children:u.name},u.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(b,{children:[e(a,{id:`PurchaseOrders.approvalRuleDetails.fields.condition.operator.${d.operator.toLocaleLowerCase()}`}),e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.amount.label",fields:{currency:d.amount.currency,value:d.amount.value}})]})},{label:e(a,{id:"PurchaseOrders.approvalRuleDetails.fields.requiresApprovalFrom"}),value:e("ul",{children:D.map(u=>e("li",{children:u.name},u.id))})}]},[o,t]);return{handleRedirectToList:()=>{window.location.href=(r==null?void 0:r())??""},loading:t,formValues:h}},y=({formValues:l})=>e("div",{className:m(["b2b-purchase-order-approval-rule-details-content"]),children:l.map((r,t)=>p("div",{className:m(["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))}),G=({withHeader:l=!0,withWrapper:r=!0,className:t,approvalRuleID:i,routeApprovalRulesList:o})=>{const n=N({headerText:"PurchaseOrders.approvalRuleDetails.containerTitle"}),{handleRedirectToList:h,loading:v,formValues:s}=_({routeApprovalRulesList:o,approvalRuleID:i});if(!i)return null;const c=v?e(g,{className:"approval-rule-details--loader","data-testid":"approval-rule-details-container--loader"}):p(b,{children:[e(y,{formValues:s}),e(T,{onClick:h,children:e(a,{id:"PurchaseOrders.approvalRuleDetails.buttons.back"})})]});return p("div",{className:m(["approval-rule-details",t]),"data-testid":"approval-rule-details-container",children:[l?e(C,{headerText:n.headerText}):null,r?e(O,{variant:"secondary","data-testid":"approvalRuleDetailsCard",children:c}):c]})};export{G as ApprovalRuleDetails,G as default};
4
+ //# sourceMappingURL=ApprovalRuleDetails.js.map
@@ -0,0 +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":"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"}
@@ -0,0 +1,5 @@
1
+ import { Container } from '@dropins/tools/types/elsie/src/lib';
2
+ import { ApprovalRuleFormProps } from '../../types/containers';
3
+
4
+ export declare const ApprovalRuleForm: Container<ApprovalRuleFormProps>;
5
+ //# sourceMappingURL=ApprovalRuleForm.d.ts.map
@@ -0,0 +1,11 @@
1
+ /********************************************************************
2
+ * Copyright 2025 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './ApprovalRuleForm';
10
+ export { ApprovalRuleForm as default } from './ApprovalRuleForm';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './ApprovalRuleForm/index'
2
+ import _default from './ApprovalRuleForm/index'
3
+ export default _default
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
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};
4
+ //# sourceMappingURL=ApprovalRuleForm.js.map