@dropins/storefront-company-management 1.0.0-beta18 → 1.0.0-beta19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/chunks/useCompanyRoles.js +1 -1
- package/chunks/useCompanyRoles.js.map +1 -1
- package/components/RoleAndPermissionTable/RoleAndPermissionTable.d.ts +3 -0
- package/containers/CompanyCredit.js +1 -1
- package/containers/CompanyCredit.js.map +1 -1
- package/containers/CompanyUsers.js +1 -1
- package/containers/RolesAndPermissions.js +1 -1
- package/containers/RolesAndPermissions.js.map +1 -1
- package/hooks/useCompanyRoles.d.ts +1 -1
- package/i18n/en_US.json.d.ts +1 -0
- package/package.json +1 -1
- package/render.js +4 -4
- package/render.js.map +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{useState as a,useCallback as r,useEffect as w}from"@dropins/tools/preact-hooks.js";import{u as q}from"./useCompanyContextListener.js";import{g as A,a as B,c as J,u as K,d as M,i as Q}from"./isCompanyRoleNameAvailable.js";const V=
|
|
3
|
+
import{useState as a,useCallback as r,useEffect as w}from"@dropins/tools/preact-hooks.js";import{u as q}from"./useCompanyContextListener.js";import{g as A,a as B,c as J,u as K,d as M,i as Q}from"./isCompanyRoleNameAvailable.js";const V=10,$=(I=V,u=!0,C=!1)=>{const[S,n]=a([]),[z,R]=a([]),[L,f]=a(0),[m,l]=a(1),[y,D]=a(I),[F,p]=a(1),[N,d]=a(!1),[T,P]=a(!1),[b,E]=a(!1),[k,h]=a(!1),[U,s]=a(null),o=r(async(t={})=>{d(!0),s(null);try{if(C){const e=await A({pageSize:1e3,currentPage:1,...t});n(e.items),f(e.totalCount),p(1),l(1)}else{const e=await A({pageSize:y,currentPage:m,...t});n(e.items),f(e.totalCount),p(e.pageInfo.totalPages),l(e.pageInfo.currentPage)}}catch(e){s(e instanceof Error?e.message:"Failed to fetch roles")}finally{d(!1)}},[C,y,m]),c=r(async()=>{try{const t=await B();R(t)}catch(t){s(t instanceof Error?t.message:"Failed to fetch ACL resources")}},[]),v=r(async t=>{P(!0),s(null);try{const e=await J(t);return await o(),e}catch(e){return s(e instanceof Error?e.message:"Failed to create role"),null}finally{P(!1)}},[o]),x=r(async t=>{E(!0),s(null);try{const e=await K(t);return n(i=>i.map(g=>g.id===e.id?e:g)),e}catch(e){return s(e instanceof Error?e.message:"Failed to update role"),null}finally{E(!1)}},[]),_=r(async t=>{h(!0),s(null);try{const e=await M({id:t});return e&&(n(i=>i.filter(g=>g.id!==t)),f(i=>i-1)),e}catch(e){return s(e instanceof Error?e.message:"Failed to delete role"),!1}finally{h(!1)}},[]),G=r(async t=>{try{return await Q({name:t})}catch(e){return s(e instanceof Error?e.message:"Failed to check role name availability"),!1}},[]),H=r(t=>{l(t)},[]),O=r(t=>{D(t),l(1)},[]),Z=r(async()=>{await Promise.all([o(),c()])},[o,c]),j=r(()=>{s(null)},[]);return w(()=>{u&&o()},[o,u]),w(()=>{u&&c()},[c,u]),q(r(()=>{l(1),n([]),R([]),f(0),p(0),d(!0)},[]),{eager:!0}),{roles:S,aclResources:z,totalCount:L,currentPage:m,pageSize:y,totalPages:F,isLoading:N,isCreating:T,isUpdating:b,isDeleting:k,error:U,fetchRoles:o,fetchAclResources:c,createRole:v,updateRole:x,deleteRole:_,checkRoleNameAvailability:G,setPage:H,setPageSize:O,refresh:Z,clearError:j}};export{V as D,$ as u};
|
|
4
4
|
//# sourceMappingURL=useCompanyRoles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCompanyRoles.js","sources":["/@dropins/storefront-company-management/src/hooks/useCompanyRoles.ts"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useState, useEffect, useCallback } from 'preact/hooks';\nimport {\n getCompanyRoles,\n getCompanyAclResources,\n createCompanyRole,\n updateCompanyRole,\n deleteCompanyRole,\n isCompanyRoleNameAvailable,\n CompanyRoleModel,\n CompanyAclResourceModel,\n CompanyRoleCreateInputModel,\n CompanyRoleUpdateInputModel,\n GetCompanyRolesVariables,\n} from '../api/companyRoles';\nimport { useCompanyContextListener } from './useCompanyContextListener';\n\nexport const DEFAULT_PAGINATION_SIZE = 20;\n\nexport interface UseCompanyRolesReturn {\n roles: CompanyRoleModel[];\n aclResources: CompanyAclResourceModel[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n \n isLoading: boolean;\n isCreating: boolean;\n isUpdating: boolean;\n isDeleting: boolean;\n \n error: string | null;\n \n fetchRoles: (variables?: GetCompanyRolesVariables) => Promise<void>;\n fetchAclResources: () => Promise<void>;\n createRole: (input: CompanyRoleCreateInputModel) => Promise<CompanyRoleModel | null>;\n updateRole: (input: CompanyRoleUpdateInputModel) => Promise<CompanyRoleModel | null>;\n deleteRole: (id: string) => Promise<boolean>;\n checkRoleNameAvailability: (name: string) => Promise<boolean>;\n \n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n \n refresh: () => Promise<void>;\n clearError: () => void;\n}\n\nexport const useCompanyRoles = (\n initialPageSize: number = DEFAULT_PAGINATION_SIZE,\n autoFetch: boolean = true,\n clientSidePagination: boolean = false\n): UseCompanyRolesReturn => {\n const [roles, setRoles] = useState<CompanyRoleModel[]>([]);\n const [aclResources, setAclResources] = useState<CompanyAclResourceModel[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize, setPageSize] = useState(initialPageSize);\n const [totalPages, setTotalPages] = useState(1);\n \n const [isLoading, setIsLoading] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n \n const [error, setError] = useState<string | null>(null);\n\n const fetchRoles = useCallback(async (variables: GetCompanyRolesVariables = {}) => {\n setIsLoading(true);\n setError(null);\n \n try {\n if (clientSidePagination) {\n // For client-side pagination, fetch all roles at once\n const response = await getCompanyRoles({\n pageSize: 1000,\n currentPage: 1,\n ...variables,\n });\n \n setRoles(response.items);\n setTotalCount(response.totalCount);\n setTotalPages(1);\n setCurrentPage(1);\n } else {\n // Server-side pagination\n const response = await getCompanyRoles({\n pageSize,\n currentPage,\n ...variables,\n });\n \n setRoles(response.items);\n setTotalCount(response.totalCount);\n setTotalPages(response.pageInfo.totalPages);\n setCurrentPage(response.pageInfo.currentPage);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch roles');\n } finally {\n setIsLoading(false);\n }\n }, [clientSidePagination, pageSize, currentPage]);\n\n const fetchAclResources = useCallback(async () => {\n try {\n const resources = await getCompanyAclResources();\n setAclResources(resources);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch ACL resources');\n }\n }, []);\n\n const createRole = useCallback(async (input: CompanyRoleCreateInputModel): Promise<CompanyRoleModel | null> => {\n setIsCreating(true);\n setError(null);\n \n try {\n const newRole = await createCompanyRole(input);\n await fetchRoles();\n return newRole;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create role');\n return null;\n } finally {\n setIsCreating(false);\n }\n }, [fetchRoles]);\n\n const updateRole = useCallback(async (input: CompanyRoleUpdateInputModel): Promise<CompanyRoleModel | null> => {\n setIsUpdating(true);\n setError(null);\n \n try {\n const updatedRole = await updateCompanyRole(input);\n \n // Update the role in the local state\n setRoles(prevRoles => \n prevRoles.map(role => \n role.id === updatedRole.id ? updatedRole : role\n )\n );\n \n return updatedRole;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update role');\n return null;\n } finally {\n setIsUpdating(false);\n }\n }, []);\n\n const deleteRole = useCallback(async (id: string): Promise<boolean> => {\n setIsDeleting(true);\n setError(null);\n \n try {\n const success = await deleteCompanyRole({ id });\n \n if (success) {\n // Remove the role from local state\n setRoles(prevRoles => prevRoles.filter(role => role.id !== id));\n setTotalCount(prev => prev - 1);\n }\n \n return success;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete role');\n return false;\n } finally {\n setIsDeleting(false);\n }\n }, []);\n\n const checkRoleNameAvailability = useCallback(async (name: string): Promise<boolean> => {\n try {\n return await isCompanyRoleNameAvailable({ name });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to check role name availability');\n return false;\n }\n }, []);\n\n const setPage = useCallback((page: number) => {\n setCurrentPage(page);\n }, []);\n\n const setPageSizeHandler = useCallback((size: number) => {\n setPageSize(size);\n setCurrentPage(1); // Reset to first page when changing page size\n }, []);\n\n const refresh = useCallback(async () => {\n await Promise.all([\n fetchRoles(),\n fetchAclResources(),\n ]);\n }, [fetchRoles, fetchAclResources]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n // Auto-fetch on mount and when pagination changes\n useEffect(() => {\n if (autoFetch) {\n fetchRoles();\n }\n }, [fetchRoles, autoFetch]);\n\n // Fetch ACL resources on mount\n useEffect(() => {\n if (autoFetch) {\n fetchAclResources();\n }\n }, [fetchAclResources, autoFetch]);\n\n // Listen for company context changes to clear stale data\n // Note: We don't call refresh() here to avoid race conditions with permission updates.\n // The parent component (RolesAndPermissions) will call refresh() after permissions update.\n useCompanyContextListener(\n useCallback(() => {\n setCurrentPage(1);\n setRoles([]);\n setAclResources([]);\n setTotalCount(0);\n setTotalPages(0);\n setIsLoading(true);\n }, []),\n { eager: true }\n );\n\n return {\n roles,\n aclResources,\n totalCount,\n currentPage,\n pageSize,\n totalPages,\n isLoading,\n isCreating,\n isUpdating,\n isDeleting,\n error,\n fetchRoles,\n fetchAclResources,\n createRole,\n updateRole,\n deleteRole,\n checkRoleNameAvailability,\n setPage,\n setPageSize: setPageSizeHandler,\n refresh,\n clearError,\n };\n};\n"],"names":["DEFAULT_PAGINATION_SIZE","useCompanyRoles","initialPageSize","autoFetch","clientSidePagination","roles","setRoles","useState","aclResources","setAclResources","totalCount","setTotalCount","currentPage","setCurrentPage","pageSize","setPageSize","totalPages","setTotalPages","isLoading","setIsLoading","isCreating","setIsCreating","isUpdating","setIsUpdating","isDeleting","setIsDeleting","error","setError","fetchRoles","useCallback","variables","response","getCompanyRoles","err","fetchAclResources","resources","getCompanyAclResources","createRole","input","newRole","createCompanyRole","updateRole","updatedRole","updateCompanyRole","prevRoles","role","deleteRole","id","success","deleteCompanyRole","prev","checkRoleNameAvailability","name","isCompanyRoleNameAvailable","setPage","page","setPageSizeHandler","size","refresh","clearError","useEffect","useCompanyContextListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useCompanyRoles.js","sources":["/@dropins/storefront-company-management/src/hooks/useCompanyRoles.ts"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useState, useEffect, useCallback } from 'preact/hooks';\nimport {\n getCompanyRoles,\n getCompanyAclResources,\n createCompanyRole,\n updateCompanyRole,\n deleteCompanyRole,\n isCompanyRoleNameAvailable,\n CompanyRoleModel,\n CompanyAclResourceModel,\n CompanyRoleCreateInputModel,\n CompanyRoleUpdateInputModel,\n GetCompanyRolesVariables,\n} from '../api/companyRoles';\nimport { useCompanyContextListener } from './useCompanyContextListener';\n\nexport const DEFAULT_PAGINATION_SIZE = 10;\n\nexport interface UseCompanyRolesReturn {\n roles: CompanyRoleModel[];\n aclResources: CompanyAclResourceModel[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n \n isLoading: boolean;\n isCreating: boolean;\n isUpdating: boolean;\n isDeleting: boolean;\n \n error: string | null;\n \n fetchRoles: (variables?: GetCompanyRolesVariables) => Promise<void>;\n fetchAclResources: () => Promise<void>;\n createRole: (input: CompanyRoleCreateInputModel) => Promise<CompanyRoleModel | null>;\n updateRole: (input: CompanyRoleUpdateInputModel) => Promise<CompanyRoleModel | null>;\n deleteRole: (id: string) => Promise<boolean>;\n checkRoleNameAvailability: (name: string) => Promise<boolean>;\n \n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n \n refresh: () => Promise<void>;\n clearError: () => void;\n}\n\nexport const useCompanyRoles = (\n initialPageSize: number = DEFAULT_PAGINATION_SIZE,\n autoFetch: boolean = true,\n clientSidePagination: boolean = false\n): UseCompanyRolesReturn => {\n const [roles, setRoles] = useState<CompanyRoleModel[]>([]);\n const [aclResources, setAclResources] = useState<CompanyAclResourceModel[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [pageSize, setPageSize] = useState(initialPageSize);\n const [totalPages, setTotalPages] = useState(1);\n \n const [isLoading, setIsLoading] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n \n const [error, setError] = useState<string | null>(null);\n\n const fetchRoles = useCallback(async (variables: GetCompanyRolesVariables = {}) => {\n setIsLoading(true);\n setError(null);\n \n try {\n if (clientSidePagination) {\n // For client-side pagination, fetch all roles at once\n const response = await getCompanyRoles({\n pageSize: 1000,\n currentPage: 1,\n ...variables,\n });\n \n setRoles(response.items);\n setTotalCount(response.totalCount);\n setTotalPages(1);\n setCurrentPage(1);\n } else {\n // Server-side pagination\n const response = await getCompanyRoles({\n pageSize,\n currentPage,\n ...variables,\n });\n \n setRoles(response.items);\n setTotalCount(response.totalCount);\n setTotalPages(response.pageInfo.totalPages);\n setCurrentPage(response.pageInfo.currentPage);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch roles');\n } finally {\n setIsLoading(false);\n }\n }, [clientSidePagination, pageSize, currentPage]);\n\n const fetchAclResources = useCallback(async () => {\n try {\n const resources = await getCompanyAclResources();\n setAclResources(resources);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch ACL resources');\n }\n }, []);\n\n const createRole = useCallback(async (input: CompanyRoleCreateInputModel): Promise<CompanyRoleModel | null> => {\n setIsCreating(true);\n setError(null);\n \n try {\n const newRole = await createCompanyRole(input);\n await fetchRoles();\n return newRole;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create role');\n return null;\n } finally {\n setIsCreating(false);\n }\n }, [fetchRoles]);\n\n const updateRole = useCallback(async (input: CompanyRoleUpdateInputModel): Promise<CompanyRoleModel | null> => {\n setIsUpdating(true);\n setError(null);\n \n try {\n const updatedRole = await updateCompanyRole(input);\n \n // Update the role in the local state\n setRoles(prevRoles => \n prevRoles.map(role => \n role.id === updatedRole.id ? updatedRole : role\n )\n );\n \n return updatedRole;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update role');\n return null;\n } finally {\n setIsUpdating(false);\n }\n }, []);\n\n const deleteRole = useCallback(async (id: string): Promise<boolean> => {\n setIsDeleting(true);\n setError(null);\n \n try {\n const success = await deleteCompanyRole({ id });\n \n if (success) {\n // Remove the role from local state\n setRoles(prevRoles => prevRoles.filter(role => role.id !== id));\n setTotalCount(prev => prev - 1);\n }\n \n return success;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete role');\n return false;\n } finally {\n setIsDeleting(false);\n }\n }, []);\n\n const checkRoleNameAvailability = useCallback(async (name: string): Promise<boolean> => {\n try {\n return await isCompanyRoleNameAvailable({ name });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to check role name availability');\n return false;\n }\n }, []);\n\n const setPage = useCallback((page: number) => {\n setCurrentPage(page);\n }, []);\n\n const setPageSizeHandler = useCallback((size: number) => {\n setPageSize(size);\n setCurrentPage(1); // Reset to first page when changing page size\n }, []);\n\n const refresh = useCallback(async () => {\n await Promise.all([\n fetchRoles(),\n fetchAclResources(),\n ]);\n }, [fetchRoles, fetchAclResources]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n // Auto-fetch on mount and when pagination changes\n useEffect(() => {\n if (autoFetch) {\n fetchRoles();\n }\n }, [fetchRoles, autoFetch]);\n\n // Fetch ACL resources on mount\n useEffect(() => {\n if (autoFetch) {\n fetchAclResources();\n }\n }, [fetchAclResources, autoFetch]);\n\n // Listen for company context changes to clear stale data\n // Note: We don't call refresh() here to avoid race conditions with permission updates.\n // The parent component (RolesAndPermissions) will call refresh() after permissions update.\n useCompanyContextListener(\n useCallback(() => {\n setCurrentPage(1);\n setRoles([]);\n setAclResources([]);\n setTotalCount(0);\n setTotalPages(0);\n setIsLoading(true);\n }, []),\n { eager: true }\n );\n\n return {\n roles,\n aclResources,\n totalCount,\n currentPage,\n pageSize,\n totalPages,\n isLoading,\n isCreating,\n isUpdating,\n isDeleting,\n error,\n fetchRoles,\n fetchAclResources,\n createRole,\n updateRole,\n deleteRole,\n checkRoleNameAvailability,\n setPage,\n setPageSize: setPageSizeHandler,\n refresh,\n clearError,\n };\n};\n"],"names":["DEFAULT_PAGINATION_SIZE","useCompanyRoles","initialPageSize","autoFetch","clientSidePagination","roles","setRoles","useState","aclResources","setAclResources","totalCount","setTotalCount","currentPage","setCurrentPage","pageSize","setPageSize","totalPages","setTotalPages","isLoading","setIsLoading","isCreating","setIsCreating","isUpdating","setIsUpdating","isDeleting","setIsDeleting","error","setError","fetchRoles","useCallback","variables","response","getCompanyRoles","err","fetchAclResources","resources","getCompanyAclResources","createRole","input","newRole","createCompanyRole","updateRole","updatedRole","updateCompanyRole","prevRoles","role","deleteRole","id","success","deleteCompanyRole","prev","checkRoleNameAvailability","name","isCompanyRoleNameAvailable","setPage","page","setPageSizeHandler","size","refresh","clearError","useEffect","useCompanyContextListener"],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ export interface RoleAndPermissionTableProps extends HTMLAttributes<HTMLDivEleme
|
|
|
15
15
|
pageSize?: number;
|
|
16
16
|
onPageChange?: (page: number) => void;
|
|
17
17
|
onPageSizeChange?: (pageSize: number) => void;
|
|
18
|
+
onSortChange?: (columnKey: string, direction: 'asc' | 'desc') => void;
|
|
19
|
+
sortColumn?: string;
|
|
20
|
+
sortDirection?: 'asc' | 'desc';
|
|
18
21
|
}
|
|
19
22
|
export declare const RoleAndPermissionTable: FunctionComponent<RoleAndPermissionTableProps>;
|
|
20
23
|
//# sourceMappingURL=RoleAndPermissionTable.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as e,jsxs as L,Fragment as M}from"@dropins/tools/preact-jsx-runtime.js";import{useState as h,useRef as T,useMemo as k,useCallback as D,useEffect as R}from"@dropins/tools/preact-hooks.js";/* empty css */import{Card as I,InLineAlert as A,Price as B,Table as U,Button as _,Picker as Z}from"@dropins/tools/components.js";import{events as G}from"@dropins/tools/event-bus.js";import{g as $,a as q}from"../chunks/getCompanyCreditHistory.js";import{d as J,e as K}from"../chunks/CompanyLoaders.js";import{useText as j}from"@dropins/tools/i18n.js";import{classes as Q}from"@dropins/tools/lib.js";import"../chunks/network-error.js";import"@dropins/tools/fetch-graphql.js";const V=20,F=1,W=({initialParams:l={},translations:s})=>{const[c,a]=h([]),[m,p]=h(!1),[t,d]=h(l.currentPage||F),[u,r]=h(l.pageSize||V),[S,C]=h(0),[g,H]=h(1),[N,v]=h(""),b=T(s);b.current=s;const x=T(l),z=k(()=>({...x.current,currentPage:t,pageSize:u}),[t,u]),f=D(async()=>{var o;p(!0);try{const y=await $(z);y?(a(y.items),C(y.totalCount||y.items.length),H(((o=y.pageInfo)==null?void 0:o.totalPages)||1),v(b.current.ariaDataLoaded.replace("{count}",y.items.length.toString()))):(a([]),C(0),H(1),v(b.current.ariaDataError))}catch(y){console.error("Failed to load company credit history:",y),a([]),C(0),H(1),v(b.current.ariaDataError)}finally{p(!1)}},[z]);R(()=>{f()},[f]);const E=D(o=>{let y;if(typeof o=="string")y=o;else if("target"in o&&o.target&&"value"in o.target)y=o.target.value;else return;const w=parseInt(y,10);isNaN(w)||(r(w),d(F))},[]),n=D(()=>{t>1&&d(t-1)},[t]),i=D(()=>{t<g&&d(t+1)},[t,g]),P=D(o=>{o>=1&&o<=g&&o!==t&&d(o)},[t,g]),O=D(async()=>{await f()},[f]);return{items:c,currentPage:t,pageSize:u,totalItems:S,totalPages:g,loading:m,announcement:N,handlePageSizeChange:E,handlePreviousPage:n,handleNextPage:i,handlePageChange:P,refreshCreditHistory:O}},X=({className:l,...s})=>{var g,H,N,v,b,x,z,f,E;const c=j({creditAvailable:"Company.CompanyCredit.creditAvailable",creditLimit:"Company.CompanyCredit.creditLimit",outstandingBalance:"Company.CompanyCredit.outstandingBalance",noData:"Company.shared.messages.noData",loading:"Company.shared.messages.loading",loadError:"Company.CompanyCredit.messages.loadError"}),[a,m]=h(null),[p,t]=h(!1),[d,u]=h(null),r=T(!1),S=T(!1),C=D(async()=>{if(!r.current){r.current=!0,t(!0),u(null);try{const n=await q();m(n)}catch(n){console.error("Failed to load company credit:",n),u(c.loadError),m(null)}finally{t(!1),r.current=!1}}},[c.loadError]);return R(()=>{S.current||(S.current=!0,C())},[C]),R(()=>{const n=()=>{m(null),S.current=!1,C()},i=G.on("companyContext/changed",n,{eager:!0});return()=>{var P;(P=i==null?void 0:i.off)==null||P.call(i)}},[C]),p?e("div",{...s,className:l,children:e(I,{variant:"primary",className:"company-management-company-credit-loading",children:e(J,{testId:"companyCreditLoader"})})}):d?e("div",{...s,className:l,children:e(A,{heading:d,type:"error",icon:void 0,variant:"primary",className:"company-management-company-credit-error",children:e("p",{children:d})})}):e("div",{...s,className:l,children:a===null||!a.credit?e(A,{heading:c.noData,type:"error",icon:void 0,variant:"primary",className:"company-management-company-credit-error",children:e("p",{children:c.noData})}):L("div",{className:"company-management-company-credit-grid",children:[e(I,{variant:"secondary",className:"company-management-company-credit-outstanding-balance",children:L("p",{children:[c.outstandingBalance,e("br",{}),e(B,{size:"large",amount:((g=a.credit.outstanding_balance)==null?void 0:g.value)??0,currency:((H=a.credit.outstanding_balance)==null?void 0:H.currency)??"",className:(((N=a.credit.outstanding_balance)==null?void 0:N.value)??0)<0?"company-management-company-credit-negative":void 0})]})}),e(I,{variant:"secondary",className:"company-management-company-credit-available-credit",children:L("p",{children:[c.creditAvailable,e("br",{}),e(B,{size:"large",amount:((v=a.credit.available_credit)==null?void 0:v.value)??0,currency:((b=a.credit.available_credit)==null?void 0:b.currency)??"",className:(((x=a.credit.available_credit)==null?void 0:x.value)??0)<0?"company-management-company-credit-negative":void 0})]})}),e(I,{variant:"secondary",className:"company-management-company-credit-credit-limit",children:L("p",{children:[c.creditLimit,e("br",{}),e(B,{size:"large",amount:((z=a.credit.credit_limit)==null?void 0:z.value)??0,currency:((f=a.credit.credit_limit)==null?void 0:f.currency)??"",className:(((E=a.credit.credit_limit)==null?void 0:E.value)??0)<0?".company-management-company-credit-grid .company-management-company-credit-negative":void 0})]})})]})})},Y=[{text:"20",value:"20"},{text:"30",value:"30"},{text:"50",value:"50"},{text:"100",value:"100"},{text:"200",value:"200"}],aa=l=>l.split("_").map(s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join(" "),ea=({className:l,initialParams:s={},...c})=>{const a=j({loading:"Company.shared.messages.loading",noData:"Company.shared.messages.noData",error:"Company.shared.messages.error",dateColumn:"Company.CompanyCreditHistory.columns.date",operationColumn:"Company.CompanyCreditHistory.columns.operation",amountColumn:"Company.CompanyCreditHistory.columns.amount",outstandingBalanceColumn:"Company.CompanyCreditHistory.columns.outstandingBalance",availableCreditColumn:"Company.CompanyCreditHistory.columns.availableCredit",creditLimitColumn:"Company.CompanyCreditHistory.columns.creditLimit",customReferenceColumn:"Company.CompanyCreditHistory.columns.customReference",updatedByColumn:"Company.CompanyCreditHistory.columns.updatedBy",itemsRangeText:"Company.CompanyCreditHistory.pagination.itemsRange",itemsPerPageLabel:"Company.CompanyCreditHistory.pagination.itemsPerPage",showLabel:"Company.CompanyCreditHistory.pagination.show",perPageLabel:"Company.CompanyCreditHistory.pagination.perPage",ariaDataLoaded:"Company.CompanyCreditHistory.ariaLabels.dataLoaded",ariaDataError:"Company.CompanyCreditHistory.ariaLabels.dataError",ariaLoadingHistory:"Company.CompanyCreditHistory.ariaLabels.loadingHistory",ariaHistoryTable:"Company.CompanyCreditHistory.ariaLabels.historyTable",ariaPaginationNav:"Company.CompanyCreditHistory.ariaLabels.paginationNav",ariaPageSizeSelector:"Company.CompanyCreditHistory.ariaLabels.pageSizeSelector",ariaPreviousPage:"Company.CompanyCreditHistory.ariaLabels.previousPage",ariaNextPage:"Company.CompanyCreditHistory.ariaLabels.nextPage",ariaGoToPage:"Company.CompanyCreditHistory.ariaLabels.goToPage",ariaCurrentPage:"Company.CompanyCreditHistory.ariaLabels.currentPage",ariaShowingHistory:"Company.CompanyCreditHistory.ariaLabels.showingHistory",ariaPageNavigation:"Company.CompanyCreditHistory.ariaLabels.pageNavigation"}),{items:m,loading:p,currentPage:t,pageSize:d,totalItems:u,totalPages:r,announcement:S,handlePageSizeChange:C,handlePreviousPage:g,handleNextPage:H,handlePageChange:N,refreshCreditHistory:v}=W({initialParams:s,translations:{ariaDataLoaded:a.ariaDataLoaded,ariaDataError:a.ariaDataError}}),b=u===0?0:(t-1)*d+1,x=Math.min(t*d,u),z=()=>{if(r<=5)return Array.from({length:r},(i,P)=>P+1);const n=[];return t<=3?n.push(1,2,3,4,"...",r):t>=r-2?n.push(1,"...",r-3,r-2,r-1,r):n.push(1,"...",t-1,t,t+1,"...",r),n};R(()=>{const n=()=>{v()},i=G.on("companyContext/changed",n,{eager:!0});return()=>{var P;(P=i==null?void 0:i.off)==null||P.call(i)}},[v]);const f=k(()=>[{key:"date",label:a.dateColumn},{key:"operation",label:a.operationColumn},{key:"amount",label:a.amountColumn},{key:"outstandingBalance",label:a.outstandingBalanceColumn},{key:"availableCredit",label:a.availableCreditColumn},{key:"creditLimit",label:a.creditLimitColumn},{key:"customReference",label:a.customReferenceColumn},{key:"updatedBy",label:a.updatedByColumn}],[a.dateColumn,a.operationColumn,a.amountColumn,a.outstandingBalanceColumn,a.availableCreditColumn,a.creditLimitColumn,a.customReferenceColumn,a.updatedByColumn]),E=k(()=>m.map(n=>({date:new Date(n.date).toLocaleDateString(),operation:aa(n.type),amount:n.amount.value===0?"":e("span",{children:e(B,{amount:n.amount.value,currency:n.amount.currency,size:"small",className:"company-management-price-normal"})}),outstandingBalance:e(B,{amount:n.balance.outstandingBalance.value,currency:n.balance.outstandingBalance.currency,size:"small",className:"company-management-price-normal"}),availableCredit:e(B,{amount:n.balance.availableCredit.value,currency:n.balance.availableCredit.currency,size:"small",className:"company-management-price-normal"}),creditLimit:e(B,{amount:n.balance.creditLimit.value,currency:n.balance.creditLimit.currency,size:"small",className:"company-management-price-normal"}),customReference:n.customReferenceNumber||"",updatedBy:n.updatedBy.name})),[m]);return L("section",{...c,className:Q(["company-management-company-credit-history-display",l]),children:[e("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:S}),e("div",{"aria-busy":p,children:p?e("div",{className:"loadingContainer",role:"status","aria-live":"polite",children:e(K,{testId:"companyCreditHistoryLoader"})}):e(M,{children:m.length?e(U,{className:"company-management-company-credit-history-table",columns:f,rowData:E,mobileLayout:"stacked","aria-label":a.ariaHistoryTable,summary:a.ariaShowingHistory.replace("{count}",m.length.toString())}):e("div",{className:"company-management-company-credit-history-empty",children:e("p",{children:a.noData})})})}),!p&&m.length>0&&L("nav",{"aria-label":a.ariaPaginationNav,className:"paginationContainer",children:[e("div",{"aria-live":"polite","aria-atomic":"true",children:a.itemsRangeText.replace("{start}",b.toString()).replace("{end}",x.toString()).replace("{total}",u.toString())}),r>1&&L("div",{className:"paginationButtons",role:"group","aria-label":a.ariaPageNavigation,children:[e(_,{variant:"secondary",onClick:g,disabled:t===1||p,"aria-label":a.ariaPreviousPage,className:"paginationButton",children:"<"}),z().map((n,i)=>n==="..."?e("span",{className:"paginationEllipsis",children:"..."},`ellipsis-${i}`):e(_,{variant:t===n?"primary":"secondary",onClick:()=>N==null?void 0:N(n),disabled:p,"aria-label":t===n?a.ariaCurrentPage.replace("{page}",String(n)):a.ariaGoToPage.replace("{page}",String(n)),"aria-current":t===n?"page":void 0,className:"paginationButton",children:n},n)),e(_,{variant:"secondary",onClick:H,disabled:t===r||p,"aria-label":a.ariaNextPage,className:"paginationButton",children:">"})]}),L("div",{className:"pageSizeSelector",children:[e("label",{htmlFor:"page-size-select",id:"page-size-label",children:e("span",{children:a.showLabel})}),e(Z,{id:"page-size-select",name:"pageSize",value:d.toString(),options:Y,handleSelect:C,"aria-labelledby":"page-size-label","aria-describedby":"page-size-description"}),e("span",{id:"page-size-description",children:a.perPageLabel})]})]})]})},pa=({creditHistoryParams:l={},showCreditHistory:s=!0,className:c,children:a,...m})=>L("section",{...m,className:c,children:[e(X,{}),s&&e(ea,{initialParams:l,style:{marginTop:"24px"}}),a]});export{pa as CompanyCredit,pa as default};
|
|
3
|
+
import{jsx as e,jsxs as v,Fragment as M}from"@dropins/tools/preact-jsx-runtime.js";import{useState as h,useRef as T,useMemo as k,useCallback as D,useEffect as R}from"@dropins/tools/preact-hooks.js";/* empty css */import{Card as I,InLineAlert as w,Price as B,Table as U,Button as _,Picker as Z}from"@dropins/tools/components.js";import{events as G}from"@dropins/tools/event-bus.js";import{g as $,a as q}from"../chunks/getCompanyCreditHistory.js";import{d as J,e as K}from"../chunks/CompanyLoaders.js";import{useText as j}from"@dropins/tools/i18n.js";import{classes as Q}from"@dropins/tools/lib.js";import"../chunks/network-error.js";import"@dropins/tools/fetch-graphql.js";const V=20,F=1,W=({initialParams:l={},translations:c})=>{const[s,a]=h([]),[m,p]=h(!1),[t,d]=h(l.currentPage||F),[u,r]=h(l.pageSize||V),[S,C]=h(0),[g,H]=h(1),[N,b]=h(""),f=T(c);f.current=c;const x=T(l),z=k(()=>({...x.current,currentPage:t,pageSize:u}),[t,u]),P=D(async()=>{var o;p(!0);try{const y=await $(z);y?(a(y.items),C(y.totalCount||y.items.length),H(((o=y.pageInfo)==null?void 0:o.totalPages)||1),b(f.current.ariaDataLoaded.replace("{count}",y.items.length.toString()))):(a([]),C(0),H(1),b(f.current.ariaDataLoaded.replace("{count}","0")))}catch(y){console.error("Failed to load company credit history:",y),a([]),C(0),H(1),b(f.current.ariaDataError)}finally{p(!1)}},[z]);R(()=>{P()},[P]);const E=D(o=>{let y;if(typeof o=="string")y=o;else if("target"in o&&o.target&&"value"in o.target)y=o.target.value;else return;const A=parseInt(y,10);isNaN(A)||(r(A),d(F))},[]),n=D(()=>{t>1&&d(t-1)},[t]),i=D(()=>{t<g&&d(t+1)},[t,g]),L=D(o=>{o>=1&&o<=g&&o!==t&&d(o)},[t,g]),O=D(async()=>{await P()},[P]);return{items:s,currentPage:t,pageSize:u,totalItems:S,totalPages:g,loading:m,announcement:N,handlePageSizeChange:E,handlePreviousPage:n,handleNextPage:i,handlePageChange:L,refreshCreditHistory:O}},X=({className:l,...c})=>{var g,H,N,b,f,x,z,P,E;const s=j({creditAvailable:"Company.CompanyCredit.creditAvailable",creditLimit:"Company.CompanyCredit.creditLimit",outstandingBalance:"Company.CompanyCredit.outstandingBalance",noData:"Company.shared.messages.noData",loading:"Company.shared.messages.loading",loadError:"Company.CompanyCredit.messages.loadError"}),[a,m]=h(null),[p,t]=h(!1),[d,u]=h(null),r=T(!1),S=T(!1),C=D(async()=>{if(!r.current){r.current=!0,t(!0),u(null);try{const n=await q();m(n)}catch(n){console.error("Failed to load company credit:",n),u(s.loadError),m(null)}finally{t(!1),r.current=!1}}},[s.loadError]);return R(()=>{S.current||(S.current=!0,C())},[C]),R(()=>{const n=()=>{m(null),S.current=!1,C()},i=G.on("companyContext/changed",n,{eager:!0});return()=>{var L;(L=i==null?void 0:i.off)==null||L.call(i)}},[C]),p?e("div",{...c,className:l,children:e(I,{variant:"primary",className:"company-management-company-credit-loading",children:e(J,{testId:"companyCreditLoader"})})}):d?e("div",{...c,className:l,children:e(w,{heading:d,type:"error",icon:void 0,variant:"primary",className:"company-management-company-credit-error",children:e("p",{children:d})})}):e("div",{...c,className:l,children:a===null||!a.credit?e(w,{heading:s.noData,type:"error",icon:void 0,variant:"primary",className:"company-management-company-credit-error",children:e("p",{children:s.noData})}):v("div",{className:"company-management-company-credit-grid",children:[e(I,{variant:"secondary",className:"company-management-company-credit-outstanding-balance",children:v("p",{children:[s.outstandingBalance,e("br",{}),e(B,{size:"large",amount:((g=a.credit.outstanding_balance)==null?void 0:g.value)??0,currency:((H=a.credit.outstanding_balance)==null?void 0:H.currency)??"",className:(((N=a.credit.outstanding_balance)==null?void 0:N.value)??0)<0?"company-management-company-credit-negative":void 0})]})}),e(I,{variant:"secondary",className:"company-management-company-credit-available-credit",children:v("p",{children:[s.creditAvailable,e("br",{}),e(B,{size:"large",amount:((b=a.credit.available_credit)==null?void 0:b.value)??0,currency:((f=a.credit.available_credit)==null?void 0:f.currency)??"",className:(((x=a.credit.available_credit)==null?void 0:x.value)??0)<0?"company-management-company-credit-negative":void 0})]})}),e(I,{variant:"secondary",className:"company-management-company-credit-credit-limit",children:v("p",{children:[s.creditLimit,e("br",{}),e(B,{size:"large",amount:((z=a.credit.credit_limit)==null?void 0:z.value)??0,currency:((P=a.credit.credit_limit)==null?void 0:P.currency)??"",className:(((E=a.credit.credit_limit)==null?void 0:E.value)??0)<0?".company-management-company-credit-grid .company-management-company-credit-negative":void 0})]})})]})})},Y=[{text:"20",value:"20"},{text:"30",value:"30"},{text:"50",value:"50"},{text:"100",value:"100"},{text:"200",value:"200"}],aa=l=>l.split("_").map(c=>c.charAt(0).toUpperCase()+c.slice(1).toLowerCase()).join(" "),ea=({className:l,initialParams:c={},...s})=>{const a=j({noData:"Company.shared.messages.noData",dateColumn:"Company.CompanyCreditHistory.columns.date",operationColumn:"Company.CompanyCreditHistory.columns.operation",amountColumn:"Company.CompanyCreditHistory.columns.amount",outstandingBalanceColumn:"Company.CompanyCreditHistory.columns.outstandingBalance",availableCreditColumn:"Company.CompanyCreditHistory.columns.availableCredit",creditLimitColumn:"Company.CompanyCreditHistory.columns.creditLimit",customReferenceColumn:"Company.CompanyCreditHistory.columns.customReference",updatedByColumn:"Company.CompanyCreditHistory.columns.updatedBy",itemsRangeText:"Company.CompanyCreditHistory.pagination.itemsRange",itemsPerPageLabel:"Company.CompanyCreditHistory.pagination.itemsPerPage",showLabel:"Company.CompanyCreditHistory.pagination.show",perPageLabel:"Company.CompanyCreditHistory.pagination.perPage",ariaDataLoaded:"Company.CompanyCreditHistory.ariaLabels.dataLoaded",ariaDataError:"Company.CompanyCreditHistory.ariaLabels.dataError",ariaLoadingHistory:"Company.CompanyCreditHistory.ariaLabels.loadingHistory",ariaHistoryTable:"Company.CompanyCreditHistory.ariaLabels.historyTable",ariaPaginationNav:"Company.CompanyCreditHistory.ariaLabels.paginationNav",ariaPageSizeSelector:"Company.CompanyCreditHistory.ariaLabels.pageSizeSelector",ariaPreviousPage:"Company.CompanyCreditHistory.ariaLabels.previousPage",ariaNextPage:"Company.CompanyCreditHistory.ariaLabels.nextPage",ariaGoToPage:"Company.CompanyCreditHistory.ariaLabels.goToPage",ariaCurrentPage:"Company.CompanyCreditHistory.ariaLabels.currentPage",ariaShowingHistory:"Company.CompanyCreditHistory.ariaLabels.showingHistory",ariaPageNavigation:"Company.CompanyCreditHistory.ariaLabels.pageNavigation"}),{items:m,loading:p,currentPage:t,pageSize:d,totalItems:u,totalPages:r,announcement:S,handlePageSizeChange:C,handlePreviousPage:g,handleNextPage:H,handlePageChange:N,refreshCreditHistory:b}=W({initialParams:c,translations:{ariaDataLoaded:a.ariaDataLoaded,ariaDataError:a.ariaDataError}}),f=u===0?0:(t-1)*d+1,x=Math.min(t*d,u),z=()=>{if(r<=5)return Array.from({length:r},(i,L)=>L+1);const n=[];return t<=3?n.push(1,2,3,4,"...",r):t>=r-2?n.push(1,"...",r-3,r-2,r-1,r):n.push(1,"...",t-1,t,t+1,"...",r),n};R(()=>{const n=()=>{b()},i=G.on("companyContext/changed",n,{eager:!0});return()=>{var L;(L=i==null?void 0:i.off)==null||L.call(i)}},[b]);const P=k(()=>[{key:"date",label:a.dateColumn},{key:"operation",label:a.operationColumn},{key:"amount",label:a.amountColumn},{key:"outstandingBalance",label:a.outstandingBalanceColumn},{key:"availableCredit",label:a.availableCreditColumn},{key:"creditLimit",label:a.creditLimitColumn},{key:"customReference",label:a.customReferenceColumn},{key:"updatedBy",label:a.updatedByColumn}],[a.dateColumn,a.operationColumn,a.amountColumn,a.outstandingBalanceColumn,a.availableCreditColumn,a.creditLimitColumn,a.customReferenceColumn,a.updatedByColumn]),E=k(()=>m.map(n=>({date:new Date(n.date).toLocaleDateString(),operation:aa(n.type),amount:n.amount.value===0?"":e("span",{children:e(B,{amount:n.amount.value,currency:n.amount.currency,size:"small",className:"company-management-price-normal"})}),outstandingBalance:e(B,{amount:n.balance.outstandingBalance.value,currency:n.balance.outstandingBalance.currency,size:"small",className:"company-management-price-normal"}),availableCredit:e(B,{amount:n.balance.availableCredit.value,currency:n.balance.availableCredit.currency,size:"small",className:"company-management-price-normal"}),creditLimit:e(B,{amount:n.balance.creditLimit.value,currency:n.balance.creditLimit.currency,size:"small",className:"company-management-price-normal"}),customReference:n.customReferenceNumber||"",updatedBy:n.updatedBy.name})),[m]);return v("section",{...s,className:Q(["company-management-company-credit-history-display",l]),children:[e("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:S}),e("div",{"aria-busy":p,children:p?e("div",{className:"loadingContainer",role:"status","aria-live":"polite",children:e(K,{testId:"companyCreditHistoryLoader"})}):v(M,{children:[e(U,{className:"company-management-company-credit-history-table",columns:P,rowData:E,mobileLayout:"stacked","aria-label":a.ariaHistoryTable,summary:a.ariaShowingHistory.replace("{count}",m.length.toString())}),!m.length&&e(w,{type:"warning",heading:a.noData,className:"company-management-company-credit-history-no-data-alert"})]})}),!p&&m.length>0&&v("nav",{"aria-label":a.ariaPaginationNav,className:"paginationContainer",children:[e("div",{"aria-live":"polite","aria-atomic":"true",children:a.itemsRangeText.replace("{start}",f.toString()).replace("{end}",x.toString()).replace("{total}",u.toString())}),r>1&&v("div",{className:"paginationButtons",role:"group","aria-label":a.ariaPageNavigation,children:[e(_,{variant:"secondary",onClick:g,disabled:t===1||p,"aria-label":a.ariaPreviousPage,className:"paginationButton",children:"<"}),z().map((n,i)=>n==="..."?e("span",{className:"paginationEllipsis",children:"..."},`ellipsis-${i}`):e(_,{variant:t===n?"primary":"secondary",onClick:()=>N==null?void 0:N(n),disabled:p,"aria-label":t===n?a.ariaCurrentPage.replace("{page}",String(n)):a.ariaGoToPage.replace("{page}",String(n)),"aria-current":t===n?"page":void 0,className:"paginationButton",children:n},n)),e(_,{variant:"secondary",onClick:H,disabled:t===r||p,"aria-label":a.ariaNextPage,className:"paginationButton",children:">"})]}),v("div",{className:"pageSizeSelector",children:[e("label",{htmlFor:"page-size-select",id:"page-size-label",children:e("span",{children:a.showLabel})}),e(Z,{id:"page-size-select",name:"pageSize",value:d.toString(),options:Y,handleSelect:C,"aria-labelledby":"page-size-label","aria-describedby":"page-size-description"}),e("span",{id:"page-size-description",children:a.perPageLabel})]})]})]})},pa=({creditHistoryParams:l={},showCreditHistory:c=!0,className:s,children:a,...m})=>v("section",{...m,className:s,children:[e(X,{}),c&&e(ea,{initialParams:l,style:{marginTop:"24px"}}),a]});export{pa as CompanyCredit,pa as default};
|
|
4
4
|
//# sourceMappingURL=CompanyCredit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompanyCredit.js","sources":["/@dropins/storefront-company-management/src/hooks/containers/useCompanyCreditHistory.tsx","/@dropins/storefront-company-management/src/components/CompanyCreditDisplay/CompanyCreditDisplay.tsx","/@dropins/storefront-company-management/src/components/CompanyCreditHistoryDisplay/CompanyCreditHistoryDisplay.tsx","/@dropins/storefront-company-management/src/containers/CompanyCredit/CompanyCredit.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, useCallback, useRef, useMemo } from 'preact/hooks';\nimport { getCompanyCreditHistory } from '@/company-management/api';\nimport { CompanyCreditHistoryItem } from '@/company-management/data/models';\nimport { GetCompanyCreditHistoryParams } from '@/company-management/types/api/getCompanyCreditHistoryParams.types';\n\n// Constants\nconst DEFAULT_PAGE_SIZE = 20;\nconst FIRST_PAGE = 1;\n\nexport interface UseCompanyCreditHistoryProps {\n /** Initial parameters for the credit history query */\n initialParams?: GetCompanyCreditHistoryParams;\n /** Translations for accessibility announcements */\n translations: {\n ariaDataLoaded: string;\n ariaDataError: string;\n };\n}\n\nexport interface UseCompanyCreditHistoryReturn {\n // Core data\n items: CompanyCreditHistoryItem[];\n \n // Pagination state\n currentPage: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n \n // Loading states\n loading: boolean;\n \n // UI state\n announcement: string;\n \n // Actions\n handlePageSizeChange: (event: Event | { target?: { value: string } } | string) => void;\n handlePreviousPage: () => void;\n handleNextPage: () => void;\n handlePageChange: (page: number) => void;\n refreshCreditHistory: () => Promise<void>;\n}\n\nexport const useCompanyCreditHistory = ({ \n initialParams = {}, \n translations \n}: UseCompanyCreditHistoryProps): UseCompanyCreditHistoryReturn => {\n const [items, setItems] = useState<CompanyCreditHistoryItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [currentPage, setCurrentPage] = useState(initialParams.currentPage || FIRST_PAGE);\n const [pageSize, setPageSize] = useState(initialParams.pageSize || DEFAULT_PAGE_SIZE);\n const [totalItems, setTotalItems] = useState(0);\n const [totalPages, setTotalPages] = useState(1);\n const [announcement, setAnnouncement] = useState('');\n\n // Stable reference to translations to prevent unnecessary re-renders\n const translationsRef = useRef(translations);\n translationsRef.current = translations;\n\n // Keep track of initial params\n const initialParamsRef = useRef(initialParams);\n\n // Memoized params for API call\n const apiParams = useMemo((): GetCompanyCreditHistoryParams => ({\n ...initialParamsRef.current,\n currentPage,\n pageSize,\n }), [currentPage, pageSize]);\n\n // Fetch credit history data\n const fetchCreditHistory = useCallback(async () => {\n setLoading(true);\n try {\n const response = await getCompanyCreditHistory(apiParams);\n \n if (response) {\n // Batch state updates for better performance\n setItems(response.items);\n setTotalItems(response.totalCount || response.items.length);\n setTotalPages(response.pageInfo?.totalPages || 1);\n setAnnouncement(\n translationsRef.current.ariaDataLoaded.replace(\n '{count}', \n response.items.length.toString()\n )\n );\n } else {\n // Handle null response\n setItems([]);\n setTotalItems(0);\n setTotalPages(1);\n setAnnouncement(translationsRef.current.ariaDataError);\n }\n } catch (error) {\n console.error('Failed to load company credit history:', error);\n // Batch error state updates\n setItems([]);\n setTotalItems(0);\n setTotalPages(1);\n setAnnouncement(translationsRef.current.ariaDataError);\n } finally {\n setLoading(false);\n }\n }, [apiParams]);\n\n // Fetch credit history when dependencies change\n useEffect(() => {\n fetchCreditHistory();\n }, [fetchCreditHistory]);\n\n // Handle page size change\n const handlePageSizeChange = useCallback((event: Event | { target?: { value: string } } | string) => {\n let value: string;\n if (typeof event === 'string') {\n value = event;\n } else if ('target' in event && event.target && 'value' in event.target) {\n value = event.target.value;\n } else {\n return;\n }\n const newSize = parseInt(value, 10);\n if (!isNaN(newSize)) {\n setPageSize(newSize);\n setCurrentPage(FIRST_PAGE); // Reset to first page when page size changes\n }\n }, []);\n\n // Handle page navigation\n const handlePreviousPage = useCallback(() => {\n if (currentPage > 1) {\n setCurrentPage(currentPage - 1);\n }\n }, [currentPage]);\n\n const handleNextPage = useCallback(() => {\n if (currentPage < totalPages) {\n setCurrentPage(currentPage + 1);\n }\n }, [currentPage, totalPages]);\n\n // Handle direct page change (for pagination buttons like First, Last)\n const handlePageChange = useCallback((page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n setCurrentPage(page);\n }\n }, [currentPage, totalPages]);\n\n // Expose refresh function for external use (e.g., after company context changes)\n const refreshCreditHistory = useCallback(async () => {\n await fetchCreditHistory();\n }, [fetchCreditHistory]);\n\n return {\n // Core data\n items,\n \n // Pagination state\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n \n // Loading states\n loading,\n \n // UI state\n announcement,\n \n // Actions\n handlePageSizeChange,\n handlePreviousPage,\n handleNextPage,\n handlePageChange,\n refreshCreditHistory,\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 { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\nimport '@/company-management/components/CompanyCreditDisplay/CompanyCreditDisplay.css';\nimport { Card, InLineAlert, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CompanyCreditInfo } from '@/company-management/data/models';\nimport { getCompanyCredit } from '@/company-management/api/getCompanyCredit';\nimport { CompanyCreditLoader } from '@/company-management/components/CompanyLoaders';\n\nexport interface CompanyCreditDisplayProps extends HTMLAttributes<HTMLDivElement> {\n // No props needed - component manages its own data\n}\n\nexport const CompanyCreditDisplay: FunctionComponent<CompanyCreditDisplayProps> = ({\n className,\n ...props\n}) => {\n const translations = useText({\n creditAvailable: 'Company.CompanyCredit.creditAvailable',\n creditLimit: 'Company.CompanyCredit.creditLimit',\n outstandingBalance: 'Company.CompanyCredit.outstandingBalance',\n noData: 'Company.shared.messages.noData',\n loading: 'Company.shared.messages.loading',\n loadError: 'Company.CompanyCredit.messages.loadError',\n });\n\n const [companyCreditData, setCompanyCreditData] = useState<CompanyCreditInfo | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n \n // Keep stable references to avoid re-creating callbacks/effects\n const inFlightRef = useRef<boolean>(false);\n const didInitialFetchRef = useRef<boolean>(false);\n\n const fetchCompanyCredit = useCallback(async () => {\n if (inFlightRef.current) {\n return;\n }\n inFlightRef.current = true;\n setLoading(true);\n setError(null);\n \n try {\n const companyCreditInfo: CompanyCreditInfo | null = await getCompanyCredit();\n setCompanyCreditData(companyCreditInfo);\n } catch (error) {\n console.error('Failed to load company credit:', error);\n setError(translations.loadError);\n setCompanyCreditData(null);\n } finally {\n setLoading(false);\n inFlightRef.current = false;\n }\n }, [translations.loadError]);\n\n // Initial data fetch\n useEffect(() => {\n if (!didInitialFetchRef.current) {\n didInitialFetchRef.current = true;\n fetchCompanyCredit();\n }\n }, [fetchCompanyCredit]);\n\n // Listen to company context changes\n useEffect(() => {\n const handleCompanyContextChange = () => {\n setCompanyCreditData(null);\n didInitialFetchRef.current = false; // Allow re-fetch on context change\n fetchCompanyCredit();\n };\n\n // Use the same event pattern as other company components\n const subscription = events.on(\n 'companyContext/changed',\n handleCompanyContextChange,\n { eager: true }\n );\n \n return () => {\n subscription?.off?.();\n };\n }, [fetchCompanyCredit]);\n\n if (loading) {\n return (\n <div {...props} className={className}>\n <Card\n variant=\"primary\"\n className=\"company-management-company-credit-loading\"\n >\n <CompanyCreditLoader testId=\"companyCreditLoader\"/>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div {...props} className={className}>\n <InLineAlert\n heading={error}\n type=\"error\"\n icon={undefined}\n variant=\"primary\"\n className=\"company-management-company-credit-error\"\n >\n <p>{error}</p>\n </InLineAlert>\n </div>\n );\n }\n return (\n <div {...props} className={className}>\n {companyCreditData === null || !companyCreditData.credit ? (\n <InLineAlert\n heading={translations.noData}\n type=\"error\"\n icon={undefined}\n variant=\"primary\"\n className=\"company-management-company-credit-error\"\n >\n <p>{translations.noData}</p>\n </InLineAlert>\n ) : (\n <div className=\"company-management-company-credit-grid\">\n <Card\n variant=\"secondary\"\n className=\"company-management-company-credit-outstanding-balance\"\n >\n <p>{translations.outstandingBalance}<br/>\n <Price \n size='large'\n amount={companyCreditData.credit.outstanding_balance?.value ?? 0} \n currency={companyCreditData.credit.outstanding_balance?.currency ?? ''} \n className={(companyCreditData.credit.outstanding_balance?.value ?? 0) < 0 ? 'company-management-company-credit-negative' : undefined}\n /></p>\n </Card>\n <Card\n variant=\"secondary\"\n className=\"company-management-company-credit-available-credit\"\n >\n <p>{translations.creditAvailable}<br/>\n <Price\n size='large'\n amount={companyCreditData.credit.available_credit?.value ?? 0} \n currency={companyCreditData.credit.available_credit?.currency ?? ''} \n className={(companyCreditData.credit.available_credit?.value ?? 0) < 0 ? 'company-management-company-credit-negative' : undefined}\n /></p>\n </Card>\n <Card\n variant=\"secondary\"\n className=\"company-management-company-credit-credit-limit\"\n >\n <p>{translations.creditLimit}<br/>\n <Price \n size='large'\n amount={companyCreditData.credit.credit_limit?.value ?? 0} \n currency={companyCreditData.credit.credit_limit?.currency ?? ''} \n className={(companyCreditData.credit.credit_limit?.value ?? 0) < 0 ? '.company-management-company-credit-grid .company-management-company-credit-negative' : undefined}\n /></p>\n </Card>\n </div>\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 { FunctionComponent } from 'preact';\nimport { useMemo, useEffect } from 'preact/hooks';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { Button, Picker, Price, Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CompanyCreditHistoryLoader } from '@/company-management/components/CompanyLoaders';\nimport { useCompanyCreditHistory } from '@/company-management/hooks/containers';\nimport './CompanyCreditHistoryDisplay.css';\n\nexport interface CompanyCreditHistoryDisplayProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n /**\n * Optional initial parameters for credit history filtering and pagination\n */\n initialParams?: {\n pageSize?: number;\n currentPage?: number;\n filter?: any;\n };\n}\n\n// Constants\nconst PAGE_SIZE_OPTIONS = [\n { text: '20', value: '20' },\n { text: '30', value: '30' },\n { text: '50', value: '50' },\n { text: '100', value: '100' },\n { text: '200', value: '200' }\n];\n\n/**\n * Converts operation type from SCREAMING_SNAKE_CASE to Title Case\n * @param operationType - The operation type string (e.g., \"CREDIT_ADJUSTMENT\", \"PURCHASE\")\n * @returns Formatted string in title case (e.g., \"Credit Adjustment\", \"Purchase\")\n */\nconst formatOperationType = (operationType: string): string => {\n return operationType\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n};\n\nexport const CompanyCreditHistoryDisplay: FunctionComponent<CompanyCreditHistoryDisplayProps> = ({\n className,\n initialParams = {},\n ...props\n}) => {\n const translations = useText({\n loading: 'Company.shared.messages.loading',\n noData: 'Company.shared.messages.noData',\n error: 'Company.shared.messages.error',\n // Table columns\n dateColumn: 'Company.CompanyCreditHistory.columns.date',\n operationColumn: 'Company.CompanyCreditHistory.columns.operation',\n amountColumn: 'Company.CompanyCreditHistory.columns.amount', \n outstandingBalanceColumn: 'Company.CompanyCreditHistory.columns.outstandingBalance',\n availableCreditColumn: 'Company.CompanyCreditHistory.columns.availableCredit',\n creditLimitColumn: 'Company.CompanyCreditHistory.columns.creditLimit',\n customReferenceColumn: 'Company.CompanyCreditHistory.columns.customReference',\n updatedByColumn: 'Company.CompanyCreditHistory.columns.updatedBy',\n // Pagination\n itemsRangeText: 'Company.CompanyCreditHistory.pagination.itemsRange',\n itemsPerPageLabel: 'Company.CompanyCreditHistory.pagination.itemsPerPage',\n showLabel: 'Company.CompanyCreditHistory.pagination.show',\n perPageLabel: 'Company.CompanyCreditHistory.pagination.perPage',\n // Accessibility labels\n ariaDataLoaded: 'Company.CompanyCreditHistory.ariaLabels.dataLoaded',\n ariaDataError: 'Company.CompanyCreditHistory.ariaLabels.dataError',\n ariaLoadingHistory: 'Company.CompanyCreditHistory.ariaLabels.loadingHistory',\n ariaHistoryTable: 'Company.CompanyCreditHistory.ariaLabels.historyTable',\n ariaPaginationNav: 'Company.CompanyCreditHistory.ariaLabels.paginationNav',\n ariaPageSizeSelector: 'Company.CompanyCreditHistory.ariaLabels.pageSizeSelector',\n ariaPreviousPage: 'Company.CompanyCreditHistory.ariaLabels.previousPage',\n ariaNextPage: 'Company.CompanyCreditHistory.ariaLabels.nextPage',\n ariaGoToPage: 'Company.CompanyCreditHistory.ariaLabels.goToPage',\n ariaCurrentPage: 'Company.CompanyCreditHistory.ariaLabels.currentPage',\n ariaShowingHistory: 'Company.CompanyCreditHistory.ariaLabels.showingHistory',\n ariaPageNavigation: 'Company.CompanyCreditHistory.ariaLabels.pageNavigation',\n });\n\n // Use the credit history hook - component now manages its own data\n const {\n items,\n loading,\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n announcement,\n handlePageSizeChange,\n handlePreviousPage,\n handleNextPage,\n handlePageChange,\n refreshCreditHistory,\n } = useCompanyCreditHistory({\n initialParams,\n translations: {\n ariaDataLoaded: translations.ariaDataLoaded,\n ariaDataError: translations.ariaDataError\n }\n });\n\n // Calculate item range for display\n const startItem = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1;\n const endItem = Math.min(currentPage * pageSize, totalItems);\n\n // Generate page numbers to display\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n \n if (currentPage <= 3) {\n pages.push(1, 2, 3, 4, '...', totalPages);\n } else if (currentPage >= totalPages - 2) {\n pages.push(1, '...', totalPages - 3, totalPages - 2, totalPages - 1, totalPages);\n } else {\n pages.push(1, '...', currentPage - 1, currentPage, currentPage + 1, '...', totalPages);\n }\n\n return pages;\n };\n\n // Listen to company context changes\n useEffect(() => {\n const handleCompanyContextChange = () => {\n refreshCreditHistory();\n };\n\n const subscription = events.on(\n 'companyContext/changed',\n handleCompanyContextChange,\n { eager: true }\n );\n \n return () => {\n subscription?.off?.();\n };\n }, [refreshCreditHistory]);\n\n // Prepare table columns - memoized to prevent unnecessary re-renders\n const columns = useMemo(() => [\n { key: 'date', label: translations.dateColumn },\n { key: 'operation', label: translations.operationColumn },\n { key: 'amount', label: translations.amountColumn },\n { key: 'outstandingBalance', label: translations.outstandingBalanceColumn },\n { key: 'availableCredit', label: translations.availableCreditColumn },\n { key: 'creditLimit', label: translations.creditLimitColumn },\n { key: 'customReference', label: translations.customReferenceColumn },\n { key: 'updatedBy', label: translations.updatedByColumn }\n ], [\n translations.dateColumn,\n translations.operationColumn, \n translations.amountColumn,\n translations.outstandingBalanceColumn,\n translations.availableCreditColumn,\n translations.creditLimitColumn,\n translations.customReferenceColumn,\n translations.updatedByColumn\n ]);\n\n // Prepare table row data - memoized for performance\n const rowData = useMemo(() => items.map((item) => ({\n date: new Date(item.date).toLocaleDateString(),\n operation: formatOperationType(item.type),\n amount: item.amount.value === 0 ? '' : (\n <span>\n <Price \n amount={item.amount.value} \n currency={item.amount.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n </span>\n ),\n outstandingBalance: (\n <Price \n amount={item.balance.outstandingBalance.value} \n currency={item.balance.outstandingBalance.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n ),\n availableCredit: (\n <Price \n amount={item.balance.availableCredit.value} \n currency={item.balance.availableCredit.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n ),\n creditLimit: (\n <Price \n amount={item.balance.creditLimit.value} \n currency={item.balance.creditLimit.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n ),\n customReference: item.customReferenceNumber || '',\n updatedBy: item.updatedBy.name\n })), [items]);\n\n return (\n <section {...props} className={classes(['company-management-company-credit-history-display', className])}>\n {/* Screen reader announcements */}\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </div>\n\n {/* Table with loading state */}\n <div aria-busy={loading}>\n {loading ? (\n <div className=\"loadingContainer\" role=\"status\" aria-live=\"polite\">\n <CompanyCreditHistoryLoader testId=\"companyCreditHistoryLoader\" />\n </div>\n ) : (\n <>\n {!items.length ? (\n <div className=\"company-management-company-credit-history-empty\">\n <p>{translations.noData}</p>\n </div>\n ) : (\n <Table\n className=\"company-management-company-credit-history-table\"\n columns={columns}\n rowData={rowData}\n mobileLayout=\"stacked\"\n aria-label={translations.ariaHistoryTable}\n summary={translations.ariaShowingHistory.replace('{count}', items.length.toString())}\n />\n )}\n </>\n )}\n </div>\n\n {/* Pagination controls */}\n {!loading && items.length > 0 && (\n <nav aria-label={translations.ariaPaginationNav} className=\"paginationContainer\">\n {/* Items range on the left */}\n <div aria-live=\"polite\" aria-atomic=\"true\">\n {translations.itemsRangeText\n .replace('{start}', startItem.toString())\n .replace('{end}', endItem.toString())\n .replace('{total}', totalItems.toString())}\n </div>\n\n {/* Pagination buttons in the center (only show when multiple pages) */}\n {totalPages > 1 && (\n <div className=\"paginationButtons\" role=\"group\" aria-label={translations.ariaPageNavigation}>\n <Button\n variant=\"secondary\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1 || loading}\n aria-label={translations.ariaPreviousPage}\n className=\"paginationButton\"\n >\n <\n </Button>\n \n {getPageNumbers().map((pageNum, index) => (\n pageNum === '...' ? (\n <span key={`ellipsis-${index}`} className=\"paginationEllipsis\">\n ...\n </span>\n ) : (\n <Button\n key={pageNum}\n variant={currentPage === pageNum ? 'primary' : 'secondary'}\n onClick={() => handlePageChange?.(pageNum as number)}\n disabled={loading}\n aria-label={currentPage === pageNum \n ? translations.ariaCurrentPage.replace('{page}', String(pageNum))\n : translations.ariaGoToPage.replace('{page}', String(pageNum))\n }\n aria-current={currentPage === pageNum ? 'page' : undefined}\n className=\"paginationButton\"\n >\n {pageNum}\n </Button>\n )\n ))}\n\n <Button\n variant=\"secondary\"\n onClick={handleNextPage}\n disabled={currentPage === totalPages || loading}\n aria-label={translations.ariaNextPage}\n className=\"paginationButton\"\n >\n >\n </Button>\n </div>\n )}\n\n {/* Page size picker on the right */}\n <div className=\"pageSizeSelector\">\n <label htmlFor=\"page-size-select\" id=\"page-size-label\">\n <span>{translations.showLabel}</span>\n </label>\n <Picker\n id=\"page-size-select\"\n name=\"pageSize\"\n value={pageSize.toString()}\n options={PAGE_SIZE_OPTIONS}\n handleSelect={handlePageSizeChange}\n aria-labelledby=\"page-size-label\"\n aria-describedby=\"page-size-description\"\n />\n <span id=\"page-size-description\">{translations.perPageLabel}</span>\n </div>\n </nav>\n )}\n </section>\n );\n};","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n \nimport { HTMLAttributes } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { CompanyCreditDisplay } from '@/company-management/components/CompanyCreditDisplay';\nimport { CompanyCreditHistoryDisplay } from '@/company-management/components/CompanyCreditHistoryDisplay';\nimport { GetCompanyCreditHistoryParams } from '@/company-management/types/api/getCompanyCreditHistoryParams.types';\n\nexport interface CompanyCreditProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Optional parameters for credit history filtering and pagination\n */\n creditHistoryParams?: GetCompanyCreditHistoryParams;\n \n /**\n * Whether to show the credit history section\n */\n showCreditHistory?: boolean;\n}\n \nexport const CompanyCredit: Container<CompanyCreditProps> = ({ \n creditHistoryParams = {}, \n showCreditHistory = true,\n className,\n children,\n ...props \n}) => {\n return (\n <section {...props} className={className}>\n <CompanyCreditDisplay />\n \n {showCreditHistory && (\n <CompanyCreditHistoryDisplay\n initialParams={creditHistoryParams}\n style={{ marginTop: '24px' }}\n />\n )}\n\n {children}\n </section>\n );\n};\n"],"names":["DEFAULT_PAGE_SIZE","FIRST_PAGE","useCompanyCreditHistory","initialParams","translations","items","setItems","useState","loading","setLoading","currentPage","setCurrentPage","pageSize","setPageSize","totalItems","setTotalItems","totalPages","setTotalPages","announcement","setAnnouncement","translationsRef","useRef","initialParamsRef","apiParams","useMemo","fetchCreditHistory","useCallback","response","getCompanyCreditHistory","_a","error","useEffect","handlePageSizeChange","event","value","newSize","handlePreviousPage","handleNextPage","handlePageChange","page","refreshCreditHistory","CompanyCreditDisplay","className","props","useText","companyCreditData","setCompanyCreditData","setError","inFlightRef","didInitialFetchRef","fetchCompanyCredit","companyCreditInfo","getCompanyCredit","handleCompanyContextChange","subscription","events","jsx","Card","CompanyCreditLoader","InLineAlert","jsxs","Price","_b","_c","_d","_e","_f","_g","_h","_i","PAGE_SIZE_OPTIONS","formatOperationType","operationType","word","CompanyCreditHistoryDisplay","startItem","endItem","getPageNumbers","_","i","pages","columns","rowData","item","classes","CompanyCreditHistoryLoader","Fragment","Table","Button","pageNum","index","Picker","CompanyCredit","creditHistoryParams","showCreditHistory","children"],"mappings":"ksBAuBA,MAAMA,EAAoB,GACpBC,EAAa,EAoCNC,EAA0B,CAAC,CACtC,cAAAC,EAAgB,CAAA,EAChB,aAAAC,CACF,IAAmE,CACjE,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAqC,CAAA,CAAE,EAC3D,CAACC,EAASC,CAAU,EAAIF,EAAS,EAAK,EACtC,CAACG,EAAaC,CAAc,EAAIJ,EAASJ,EAAc,aAAeF,CAAU,EAChF,CAACW,EAAUC,CAAW,EAAIN,EAASJ,EAAc,UAAYH,CAAiB,EAC9E,CAACc,EAAYC,CAAa,EAAIR,EAAS,CAAC,EACxC,CAACS,EAAYC,CAAa,EAAIV,EAAS,CAAC,EACxC,CAACW,EAAcC,CAAe,EAAIZ,EAAS,EAAE,EAG7Ca,EAAkBC,EAAOjB,CAAY,EAC3CgB,EAAgB,QAAUhB,EAG1B,MAAMkB,EAAmBD,EAAOlB,CAAa,EAGvCoB,EAAYC,EAAQ,KAAsC,CAC9D,GAAGF,EAAiB,QACpB,YAAAZ,EACA,SAAAE,CAAA,GACE,CAACF,EAAaE,CAAQ,CAAC,EAGrBa,EAAqBC,EAAY,SAAY,OACjDjB,EAAW,EAAI,EACf,GAAI,CACF,MAAMkB,EAAW,MAAMC,EAAwBL,CAAS,EAEpDI,GAEFrB,EAASqB,EAAS,KAAK,EACvBZ,EAAcY,EAAS,YAAcA,EAAS,MAAM,MAAM,EAC1DV,IAAcY,EAAAF,EAAS,WAAT,YAAAE,EAAmB,aAAc,CAAC,EAChDV,EACEC,EAAgB,QAAQ,eAAe,QACrC,UACAO,EAAS,MAAM,OAAO,SAAA,CAAS,CACjC,IAIFrB,EAAS,CAAA,CAAE,EACXS,EAAc,CAAC,EACfE,EAAc,CAAC,EACfE,EAAgBC,EAAgB,QAAQ,aAAa,EAEzD,OAASU,EAAO,CACd,QAAQ,MAAM,yCAA0CA,CAAK,EAE7DxB,EAAS,CAAA,CAAE,EACXS,EAAc,CAAC,EACfE,EAAc,CAAC,EACfE,EAAgBC,EAAgB,QAAQ,aAAa,CACvD,QAAA,CACEX,EAAW,EAAK,CAClB,CACF,EAAG,CAACc,CAAS,CAAC,EAGdQ,EAAU,IAAM,CACdN,EAAA,CACF,EAAG,CAACA,CAAkB,CAAC,EAGvB,MAAMO,EAAuBN,EAAaO,GAA2D,CACnG,IAAIC,EACJ,GAAI,OAAOD,GAAU,SACnBC,EAAQD,UACC,WAAYA,GAASA,EAAM,QAAU,UAAWA,EAAM,OAC/DC,EAAQD,EAAM,OAAO,UAErB,QAEF,MAAME,EAAU,SAASD,EAAO,EAAE,EAC7B,MAAMC,CAAO,IAChBtB,EAAYsB,CAAO,EACnBxB,EAAeV,CAAU,EAE7B,EAAG,CAAA,CAAE,EAGCmC,EAAqBV,EAAY,IAAM,CACvChB,EAAc,GAChBC,EAAeD,EAAc,CAAC,CAElC,EAAG,CAACA,CAAW,CAAC,EAEV2B,EAAiBX,EAAY,IAAM,CACnChB,EAAcM,GAChBL,EAAeD,EAAc,CAAC,CAElC,EAAG,CAACA,EAAaM,CAAU,CAAC,EAGtBsB,EAAmBZ,EAAaa,GAAiB,CACjDA,GAAQ,GAAKA,GAAQvB,GAAcuB,IAAS7B,GAC9CC,EAAe4B,CAAI,CAEvB,EAAG,CAAC7B,EAAaM,CAAU,CAAC,EAGtBwB,EAAuBd,EAAY,SAAY,CACnD,MAAMD,EAAA,CACR,EAAG,CAACA,CAAkB,CAAC,EAEvB,MAAO,CAEL,MAAApB,EAGA,YAAAK,EACA,SAAAE,EACA,WAAAE,EACA,WAAAE,EAGA,QAAAR,EAGA,aAAAU,EAGA,qBAAAc,EACA,mBAAAI,EACA,eAAAC,EACA,iBAAAC,EACA,qBAAAE,CAAA,CAEJ,EChKaC,EAAqE,CAAC,CACjF,UAAAC,EACA,GAAGC,CACL,IAAM,uBACJ,MAAMvC,EAAewC,EAAQ,CAC3B,gBAAiB,wCACjB,YAAa,oCACb,mBAAoB,2CACpB,OAAQ,iCACR,QAAS,kCACT,UAAW,0CAAA,CACZ,EAEK,CAACC,EAAmBC,CAAoB,EAAIvC,EAAmC,IAAI,EACnF,CAACC,EAASC,CAAU,EAAIF,EAAS,EAAK,EACtC,CAACuB,EAAOiB,CAAQ,EAAIxC,EAAwB,IAAI,EAGhDyC,EAAc3B,EAAgB,EAAK,EACnC4B,EAAqB5B,EAAgB,EAAK,EAE1C6B,EAAqBxB,EAAY,SAAY,CACjD,GAAI,CAAAsB,EAAY,QAGhB,CAAAA,EAAY,QAAU,GACtBvC,EAAW,EAAI,EACfsC,EAAS,IAAI,EAEb,GAAI,CACF,MAAMI,EAA8C,MAAMC,EAAA,EAC1DN,EAAqBK,CAAiB,CACxC,OAASrB,EAAO,CACd,QAAQ,MAAM,iCAAkCA,CAAK,EACrDiB,EAAS3C,EAAa,SAAS,EAC/B0C,EAAqB,IAAI,CAC3B,QAAA,CACErC,EAAW,EAAK,EAChBuC,EAAY,QAAU,EACxB,EACF,EAAG,CAAC5C,EAAa,SAAS,CAAC,EA8B3B,OA3BA2B,EAAU,IAAM,CACTkB,EAAmB,UACtBA,EAAmB,QAAU,GAC7BC,EAAA,EAEJ,EAAG,CAACA,CAAkB,CAAC,EAGvBnB,EAAU,IAAM,CACd,MAAMsB,EAA6B,IAAM,CACvCP,EAAqB,IAAI,EACzBG,EAAmB,QAAU,GAC7BC,EAAA,CACF,EAGMI,EAAeC,EAAO,GAC1B,yBACAF,EACA,CAAE,MAAO,EAAA,CAAK,EAGhB,MAAO,IAAM,QACXxB,EAAAyB,GAAA,YAAAA,EAAc,MAAd,MAAAzB,EAAA,KAAAyB,EACF,CACF,EAAG,CAACJ,CAAkB,CAAC,EAEnB1C,EAEAgD,EAAC,MAAA,CAAK,GAAGb,EAAO,UAAAD,EACd,SAAAc,EAACC,EAAA,CACC,QAAQ,UACR,UAAU,4CAEV,SAAAD,EAACE,EAAA,CAAoB,OAAO,qBAAA,CAAqB,CAAA,CAAA,EAErD,EAIA5B,EAEA0B,EAAC,MAAA,CAAK,GAAGb,EAAO,UAAAD,EACd,SAAAc,EAACG,EAAA,CACC,QAAS7B,EACT,KAAK,QACL,KAAM,OACN,QAAQ,UACR,UAAU,0CAEV,SAAA0B,EAAC,KAAG,SAAA1B,CAAA,CAAM,CAAA,CAAA,EAEd,EAIF0B,EAAC,OAAK,GAAGb,EAAO,UAAAD,EACb,SAAAG,IAAsB,MAAQ,CAACA,EAAkB,OAChDW,EAACG,EAAA,CACC,QAASvD,EAAa,OACtB,KAAK,QACL,KAAM,OACN,QAAQ,UACR,UAAU,0CAEV,SAAAoD,EAAC,IAAA,CAAG,SAAApD,EAAa,MAAA,CAAO,CAAA,CAAA,EAG1BwD,EAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAJ,EAACC,EAAA,CACC,QAAQ,YACR,UAAU,wDAEV,WAAC,IAAA,CAAG,SAAA,CAAArD,EAAa,qBAAoB,KAAA,EAAE,EACvCoD,EAACK,EAAA,CACC,KAAK,QACL,SAAQhC,EAAAgB,EAAkB,OAAO,sBAAzB,YAAAhB,EAA8C,QAAS,EAC/D,WAAUiC,EAAAjB,EAAkB,OAAO,sBAAzB,YAAAiB,EAA8C,WAAY,GACpE,aAAYC,EAAAlB,EAAkB,OAAO,sBAAzB,YAAAkB,EAA8C,QAAS,GAAK,EAAI,6CAA+C,MAAA,CAAA,CAC7H,CAAA,CAAE,CAAA,CAAA,EAEJP,EAACC,EAAA,CACC,QAAQ,YACR,UAAU,qDAEV,WAAC,IAAA,CAAG,SAAA,CAAArD,EAAa,kBAAiB,KAAA,EAAE,EACpCoD,EAACK,EAAA,CACC,KAAK,QACL,SAAQG,EAAAnB,EAAkB,OAAO,mBAAzB,YAAAmB,EAA2C,QAAS,EAC5D,WAAUC,EAAApB,EAAkB,OAAO,mBAAzB,YAAAoB,EAA2C,WAAY,GACjE,aAAYC,EAAArB,EAAkB,OAAO,mBAAzB,YAAAqB,EAA2C,QAAS,GAAK,EAAI,6CAA+C,MAAA,CAAA,CAC1H,CAAA,CAAE,CAAA,CAAA,EAEJV,EAACC,EAAA,CACC,QAAQ,YACR,UAAU,iDAER,WAAC,IAAA,CAAG,SAAA,CAAArD,EAAa,cAAa,KAAA,EAAE,EAChCoD,EAACK,EAAA,CACC,KAAK,QACL,SAAQM,EAAAtB,EAAkB,OAAO,eAAzB,YAAAsB,EAAuC,QAAS,EACxD,WAAUC,EAAAvB,EAAkB,OAAO,eAAzB,YAAAuB,EAAuC,WAAY,GAC7D,aAAYC,EAAAxB,EAAkB,OAAO,eAAzB,YAAAwB,EAAuC,QAAS,GAAK,EAAI,sFAAwF,MAAA,CAAA,CAC/J,CAAA,CAAE,CAAA,CAAA,CACN,CAAA,CACF,CAAA,CAEJ,CAEJ,EChJMC,EAAoB,CACxB,CAAE,KAAM,KAAM,MAAO,IAAA,EACrB,CAAE,KAAM,KAAM,MAAO,IAAA,EACrB,CAAE,KAAM,KAAM,MAAO,IAAA,EACrB,CAAE,KAAM,MAAO,MAAO,KAAA,EACtB,CAAE,KAAM,MAAO,MAAO,KAAA,CACxB,EAOMC,GAAuBC,GACpBA,EACJ,MAAM,GAAG,EACT,IAAIC,GAAQA,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,MAAM,CAAC,EAAE,aAAa,EACtE,KAAK,GAAG,EAGAC,GAAmF,CAAC,CAC/F,UAAAhC,EACA,cAAAvC,EAAgB,CAAA,EAChB,GAAGwC,CACL,IAAM,CACJ,MAAMvC,EAAewC,EAAQ,CAC3B,QAAS,kCACT,OAAQ,iCACR,MAAO,gCAEP,WAAY,4CACZ,gBAAiB,iDACjB,aAAc,8CACd,yBAA0B,0DAC1B,sBAAuB,uDACvB,kBAAmB,mDACnB,sBAAuB,uDACvB,gBAAiB,iDAEjB,eAAgB,qDAChB,kBAAmB,uDACnB,UAAW,+CACX,aAAc,kDAEd,eAAgB,qDAChB,cAAe,oDACf,mBAAoB,yDACpB,iBAAkB,uDAClB,kBAAmB,wDACnB,qBAAsB,2DACtB,iBAAkB,uDAClB,aAAc,mDACd,aAAc,mDACd,gBAAiB,sDACjB,mBAAoB,yDACpB,mBAAoB,wDAAA,CACrB,EAGK,CACJ,MAAAvC,EACA,QAAAG,EACA,YAAAE,EACA,SAAAE,EACA,WAAAE,EACA,WAAAE,EACA,aAAAE,EACA,qBAAAc,EACA,mBAAAI,EACA,eAAAC,EACA,iBAAAC,EACA,qBAAAE,CAAA,EACEtC,EAAwB,CAC1B,cAAAC,EACA,aAAc,CACZ,eAAgBC,EAAa,eAC7B,cAAeA,EAAa,aAAA,CAC9B,CACD,EAGKuE,EAAY7D,IAAe,EAAI,GAAKJ,EAAc,GAAKE,EAAW,EAClEgE,EAAU,KAAK,IAAIlE,EAAcE,EAAUE,CAAU,EAGrD+D,EAAiB,IAA2B,CAChD,GAAI7D,GAAc,EAChB,OAAO,MAAM,KAAK,CAAE,OAAQA,GAAc,CAAC8D,EAAGC,IAAMA,EAAI,CAAC,EAG3D,MAAMC,EAA6B,CAAA,EAEnC,OAAItE,GAAe,EACjBsE,EAAM,KAAK,EAAG,EAAG,EAAG,EAAG,MAAOhE,CAAU,EAC/BN,GAAeM,EAAa,EACrCgE,EAAM,KAAK,EAAG,MAAOhE,EAAa,EAAGA,EAAa,EAAGA,EAAa,EAAGA,CAAU,EAE/EgE,EAAM,KAAK,EAAG,MAAOtE,EAAc,EAAGA,EAAaA,EAAc,EAAG,MAAOM,CAAU,EAGhFgE,CACT,EAGAjD,EAAU,IAAM,CACd,MAAMsB,EAA6B,IAAM,CACvCb,EAAA,CACF,EAEMc,EAAeC,EAAO,GAC1B,yBACAF,EACA,CAAE,MAAO,EAAA,CAAK,EAGhB,MAAO,IAAM,QACXxB,EAAAyB,GAAA,YAAAA,EAAc,MAAd,MAAAzB,EAAA,KAAAyB,EACF,CACF,EAAG,CAACd,CAAoB,CAAC,EAGzB,MAAMyC,EAAUzD,EAAQ,IAAM,CAC5B,CAAE,IAAK,OAAQ,MAAOpB,EAAa,UAAA,EACnC,CAAE,IAAK,YAAa,MAAOA,EAAa,eAAA,EACxC,CAAE,IAAK,SAAU,MAAOA,EAAa,YAAA,EACrC,CAAE,IAAK,qBAAsB,MAAOA,EAAa,wBAAA,EACjD,CAAE,IAAK,kBAAmB,MAAOA,EAAa,qBAAA,EAC9C,CAAE,IAAK,cAAe,MAAOA,EAAa,iBAAA,EAC1C,CAAE,IAAK,kBAAmB,MAAOA,EAAa,qBAAA,EAC9C,CAAE,IAAK,YAAa,MAAOA,EAAa,eAAA,CAAgB,EACvD,CACDA,EAAa,WACbA,EAAa,gBACbA,EAAa,aACbA,EAAa,yBACbA,EAAa,sBACbA,EAAa,kBACbA,EAAa,sBACbA,EAAa,eAAA,CACd,EAGK8E,EAAU1D,EAAQ,IAAMnB,EAAM,IAAK8E,IAAU,CACjD,KAAM,IAAI,KAAKA,EAAK,IAAI,EAAE,mBAAA,EAC1B,UAAWZ,GAAoBY,EAAK,IAAI,EACxC,OAAQA,EAAK,OAAO,QAAU,EAAI,KAC/B,OAAA,CACC,SAAA3B,EAACK,EAAA,CACC,OAAQsB,EAAK,OAAO,MACpB,SAAUA,EAAK,OAAO,SACtB,KAAK,QACL,UAAU,iCAAA,CAAA,EAEd,EAEF,mBACE3B,EAACK,EAAA,CACC,OAAQsB,EAAK,QAAQ,mBAAmB,MACxC,SAAUA,EAAK,QAAQ,mBAAmB,SAC1C,KAAK,QACL,UAAU,iCAAA,CAAA,EAGd,gBACE3B,EAACK,EAAA,CACC,OAAQsB,EAAK,QAAQ,gBAAgB,MACrC,SAAUA,EAAK,QAAQ,gBAAgB,SACvC,KAAK,QACL,UAAU,iCAAA,CAAA,EAGd,YACE3B,EAACK,EAAA,CACC,OAAQsB,EAAK,QAAQ,YAAY,MACjC,SAAUA,EAAK,QAAQ,YAAY,SACnC,KAAK,QACL,UAAU,iCAAA,CAAA,EAGd,gBAAiBA,EAAK,uBAAyB,GAC/C,UAAWA,EAAK,UAAU,IAAA,EAC1B,EAAG,CAAC9E,CAAK,CAAC,EAEZ,OACEuD,EAAC,UAAA,CAAS,GAAGjB,EAAO,UAAWyC,EAAQ,CAAC,oDAAqD1C,CAAS,CAAC,EAErG,SAAA,CAAAc,EAAC,MAAA,CAAI,UAAU,UAAU,KAAK,SAAS,YAAU,SAAS,cAAY,OACnE,SAAAtC,CAAA,CACH,EAGAsC,EAAC,MAAA,CAAI,YAAWhD,EACb,WACCgD,EAAC,MAAA,CAAI,UAAU,mBAAmB,KAAK,SAAS,YAAU,SACxD,WAAC6B,EAAA,CAA2B,OAAO,4BAAA,CAA6B,CAAA,CAClE,EAEA7B,EAAA8B,EAAA,CACG,SAACjF,EAAM,OAKNmD,EAAC+B,EAAA,CACC,UAAU,kDACV,QAAAN,EACA,QAAAC,EACA,aAAa,UACb,aAAY9E,EAAa,iBACzB,QAASA,EAAa,mBAAmB,QAAQ,UAAWC,EAAM,OAAO,UAAU,CAAA,CAAA,EAVrFmD,EAAC,MAAA,CAAI,UAAU,kDACb,SAAAA,EAAC,IAAA,CAAG,SAAApD,EAAa,MAAA,CAAO,EAC1B,EAWJ,CAAA,CAEJ,EAGC,CAACI,GAAWH,EAAM,OAAS,GAC1BuD,EAAC,MAAA,CAAI,aAAYxD,EAAa,kBAAmB,UAAU,sBAEzD,SAAA,CAAAoD,EAAC,MAAA,CAAI,YAAU,SAAS,cAAY,OACjC,WAAa,eACX,QAAQ,UAAWmB,EAAU,SAAA,CAAU,EACvC,QAAQ,QAASC,EAAQ,SAAA,CAAU,EACnC,QAAQ,UAAW9D,EAAW,SAAA,CAAU,CAAA,CAC7C,EAGCE,EAAa,GACZ4C,EAAC,MAAA,CAAI,UAAU,oBAAoB,KAAK,QAAQ,aAAYxD,EAAa,mBACvE,SAAA,CAAAoD,EAACgC,EAAA,CACC,QAAQ,YACR,QAASpD,EACT,SAAU1B,IAAgB,GAAKF,EAC/B,aAAYJ,EAAa,iBACzB,UAAU,mBACX,SAAA,GAAA,CAAA,EAIAyE,IAAiB,IAAI,CAACY,EAASC,IAC9BD,IAAY,MACVjC,EAAC,OAAA,CAA+B,UAAU,qBAAqB,SAAA,KAAA,EAApD,YAAYkC,CAAK,EAE5B,EAEAlC,EAACgC,EAAA,CAEC,QAAS9E,IAAgB+E,EAAU,UAAY,YAC/C,QAAS,IAAMnD,GAAA,YAAAA,EAAmBmD,GAClC,SAAUjF,EACV,aAAYE,IAAgB+E,EACxBrF,EAAa,gBAAgB,QAAQ,SAAU,OAAOqF,CAAO,CAAC,EAC9DrF,EAAa,aAAa,QAAQ,SAAU,OAAOqF,CAAO,CAAC,EAE/D,eAAc/E,IAAgB+E,EAAU,OAAS,OACjD,UAAU,mBAET,SAAAA,CAAA,EAXIA,CAAA,CAcV,EAEDjC,EAACgC,EAAA,CACC,QAAQ,YACR,QAASnD,EACT,SAAU3B,IAAgBM,GAAcR,EACxC,aAAYJ,EAAa,aACzB,UAAU,mBACX,SAAA,GAAA,CAAA,CAED,EACF,EAIFwD,EAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAJ,EAAC,QAAA,CAAM,QAAQ,mBAAmB,GAAG,kBACnC,SAAAA,EAAC,OAAA,CAAM,SAAApD,EAAa,SAAA,CAAU,CAAA,CAChC,EACAoD,EAACmC,EAAA,CACC,GAAG,mBACH,KAAK,WACL,MAAO/E,EAAS,SAAA,EAChB,QAAS0D,EACT,aAActC,EACd,kBAAgB,kBAChB,mBAAiB,uBAAA,CAAA,EAEnBwB,EAAC,OAAA,CAAK,GAAG,wBAAyB,WAAa,YAAA,CAAa,CAAA,CAAA,CAC9D,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,EC5SaoC,GAA+C,CAAC,CAC3D,oBAAAC,EAAsB,CAAA,EACtB,kBAAAC,EAAoB,GACpB,UAAApD,EACA,SAAAqD,EACA,GAAGpD,CACL,IAEIiB,EAAC,UAAA,CAAS,GAAGjB,EAAO,UAAAD,EAClB,SAAA,CAAAc,EAACf,EAAA,EAAqB,EAErBqD,GACCtC,EAACkB,GAAA,CACC,cAAemB,EACf,MAAO,CAAE,UAAW,MAAA,CAAO,CAAA,EAI9BE,CAAA,EACH"}
|
|
1
|
+
{"version":3,"file":"CompanyCredit.js","sources":["/@dropins/storefront-company-management/src/hooks/containers/useCompanyCreditHistory.tsx","/@dropins/storefront-company-management/src/components/CompanyCreditDisplay/CompanyCreditDisplay.tsx","/@dropins/storefront-company-management/src/components/CompanyCreditHistoryDisplay/CompanyCreditHistoryDisplay.tsx","/@dropins/storefront-company-management/src/containers/CompanyCredit/CompanyCredit.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, useCallback, useRef, useMemo } from 'preact/hooks';\nimport { getCompanyCreditHistory } from '@/company-management/api';\nimport { CompanyCreditHistoryItem } from '@/company-management/data/models';\nimport { GetCompanyCreditHistoryParams } from '@/company-management/types/api/getCompanyCreditHistoryParams.types';\n\n// Constants\nconst DEFAULT_PAGE_SIZE = 20;\nconst FIRST_PAGE = 1;\n\nexport interface UseCompanyCreditHistoryProps {\n /** Initial parameters for the credit history query */\n initialParams?: GetCompanyCreditHistoryParams;\n /** Translations for accessibility announcements */\n translations: {\n ariaDataLoaded: string;\n ariaDataError: string;\n };\n}\n\nexport interface UseCompanyCreditHistoryReturn {\n // Core data\n items: CompanyCreditHistoryItem[];\n \n // Pagination state\n currentPage: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n \n // Loading states\n loading: boolean;\n \n // UI state\n announcement: string;\n \n // Actions\n handlePageSizeChange: (event: Event | { target?: { value: string } } | string) => void;\n handlePreviousPage: () => void;\n handleNextPage: () => void;\n handlePageChange: (page: number) => void;\n refreshCreditHistory: () => Promise<void>;\n}\n\nexport const useCompanyCreditHistory = ({ \n initialParams = {}, \n translations \n}: UseCompanyCreditHistoryProps): UseCompanyCreditHistoryReturn => {\n const [items, setItems] = useState<CompanyCreditHistoryItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [currentPage, setCurrentPage] = useState(initialParams.currentPage || FIRST_PAGE);\n const [pageSize, setPageSize] = useState(initialParams.pageSize || DEFAULT_PAGE_SIZE);\n const [totalItems, setTotalItems] = useState(0);\n const [totalPages, setTotalPages] = useState(1);\n const [announcement, setAnnouncement] = useState('');\n\n // Stable reference to translations to prevent unnecessary re-renders\n const translationsRef = useRef(translations);\n translationsRef.current = translations;\n\n // Keep track of initial params\n const initialParamsRef = useRef(initialParams);\n\n // Memoized params for API call\n const apiParams = useMemo((): GetCompanyCreditHistoryParams => ({\n ...initialParamsRef.current,\n currentPage,\n pageSize,\n }), [currentPage, pageSize]);\n\n // Fetch credit history data\n const fetchCreditHistory = useCallback(async () => {\n setLoading(true);\n try {\n const response = await getCompanyCreditHistory(apiParams);\n \n if (response) {\n // Batch state updates for better performance\n setItems(response.items);\n setTotalItems(response.totalCount || response.items.length);\n setTotalPages(response.pageInfo?.totalPages || 1);\n setAnnouncement(\n translationsRef.current.ariaDataLoaded.replace(\n '{count}', \n response.items.length.toString()\n )\n );\n } else {\n // Handle null response (treat as no data, not error)\n setItems([]);\n setTotalItems(0);\n setTotalPages(1);\n setAnnouncement(\n translationsRef.current.ariaDataLoaded.replace('{count}', '0')\n );\n }\n } catch (error) {\n console.error('Failed to load company credit history:', error);\n // Batch error state updates\n setItems([]);\n setTotalItems(0);\n setTotalPages(1);\n setAnnouncement(translationsRef.current.ariaDataError);\n } finally {\n setLoading(false);\n }\n }, [apiParams]);\n\n // Fetch credit history when dependencies change\n useEffect(() => {\n fetchCreditHistory();\n }, [fetchCreditHistory]);\n\n // Handle page size change\n const handlePageSizeChange = useCallback((event: Event | { target?: { value: string } } | string) => {\n let value: string;\n if (typeof event === 'string') {\n value = event;\n } else if ('target' in event && event.target && 'value' in event.target) {\n value = event.target.value;\n } else {\n return;\n }\n const newSize = parseInt(value, 10);\n if (!isNaN(newSize)) {\n setPageSize(newSize);\n setCurrentPage(FIRST_PAGE); // Reset to first page when page size changes\n }\n }, []);\n\n // Handle page navigation\n const handlePreviousPage = useCallback(() => {\n if (currentPage > 1) {\n setCurrentPage(currentPage - 1);\n }\n }, [currentPage]);\n\n const handleNextPage = useCallback(() => {\n if (currentPage < totalPages) {\n setCurrentPage(currentPage + 1);\n }\n }, [currentPage, totalPages]);\n\n // Handle direct page change (for pagination buttons like First, Last)\n const handlePageChange = useCallback((page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n setCurrentPage(page);\n }\n }, [currentPage, totalPages]);\n\n // Expose refresh function for external use (e.g., after company context changes)\n const refreshCreditHistory = useCallback(async () => {\n await fetchCreditHistory();\n }, [fetchCreditHistory]);\n\n return {\n // Core data\n items,\n \n // Pagination state\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n \n // Loading states\n loading,\n \n // UI state\n announcement,\n \n // Actions\n handlePageSizeChange,\n handlePreviousPage,\n handleNextPage,\n handlePageChange,\n refreshCreditHistory,\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 { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\nimport '@/company-management/components/CompanyCreditDisplay/CompanyCreditDisplay.css';\nimport { Card, InLineAlert, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CompanyCreditInfo } from '@/company-management/data/models';\nimport { getCompanyCredit } from '@/company-management/api/getCompanyCredit';\nimport { CompanyCreditLoader } from '@/company-management/components/CompanyLoaders';\n\nexport interface CompanyCreditDisplayProps extends HTMLAttributes<HTMLDivElement> {\n // No props needed - component manages its own data\n}\n\nexport const CompanyCreditDisplay: FunctionComponent<CompanyCreditDisplayProps> = ({\n className,\n ...props\n}) => {\n const translations = useText({\n creditAvailable: 'Company.CompanyCredit.creditAvailable',\n creditLimit: 'Company.CompanyCredit.creditLimit',\n outstandingBalance: 'Company.CompanyCredit.outstandingBalance',\n noData: 'Company.shared.messages.noData',\n loading: 'Company.shared.messages.loading',\n loadError: 'Company.CompanyCredit.messages.loadError',\n });\n\n const [companyCreditData, setCompanyCreditData] = useState<CompanyCreditInfo | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n \n // Keep stable references to avoid re-creating callbacks/effects\n const inFlightRef = useRef<boolean>(false);\n const didInitialFetchRef = useRef<boolean>(false);\n\n const fetchCompanyCredit = useCallback(async () => {\n if (inFlightRef.current) {\n return;\n }\n inFlightRef.current = true;\n setLoading(true);\n setError(null);\n \n try {\n const companyCreditInfo: CompanyCreditInfo | null = await getCompanyCredit();\n setCompanyCreditData(companyCreditInfo);\n } catch (error) {\n console.error('Failed to load company credit:', error);\n setError(translations.loadError);\n setCompanyCreditData(null);\n } finally {\n setLoading(false);\n inFlightRef.current = false;\n }\n }, [translations.loadError]);\n\n // Initial data fetch\n useEffect(() => {\n if (!didInitialFetchRef.current) {\n didInitialFetchRef.current = true;\n fetchCompanyCredit();\n }\n }, [fetchCompanyCredit]);\n\n // Listen to company context changes\n useEffect(() => {\n const handleCompanyContextChange = () => {\n setCompanyCreditData(null);\n didInitialFetchRef.current = false; // Allow re-fetch on context change\n fetchCompanyCredit();\n };\n\n // Use the same event pattern as other company components\n const subscription = events.on(\n 'companyContext/changed',\n handleCompanyContextChange,\n { eager: true }\n );\n \n return () => {\n subscription?.off?.();\n };\n }, [fetchCompanyCredit]);\n\n if (loading) {\n return (\n <div {...props} className={className}>\n <Card\n variant=\"primary\"\n className=\"company-management-company-credit-loading\"\n >\n <CompanyCreditLoader testId=\"companyCreditLoader\"/>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div {...props} className={className}>\n <InLineAlert\n heading={error}\n type=\"error\"\n icon={undefined}\n variant=\"primary\"\n className=\"company-management-company-credit-error\"\n >\n <p>{error}</p>\n </InLineAlert>\n </div>\n );\n }\n return (\n <div {...props} className={className}>\n {companyCreditData === null || !companyCreditData.credit ? (\n <InLineAlert\n heading={translations.noData}\n type=\"error\"\n icon={undefined}\n variant=\"primary\"\n className=\"company-management-company-credit-error\"\n >\n <p>{translations.noData}</p>\n </InLineAlert>\n ) : (\n <div className=\"company-management-company-credit-grid\">\n <Card\n variant=\"secondary\"\n className=\"company-management-company-credit-outstanding-balance\"\n >\n <p>{translations.outstandingBalance}<br/>\n <Price \n size='large'\n amount={companyCreditData.credit.outstanding_balance?.value ?? 0} \n currency={companyCreditData.credit.outstanding_balance?.currency ?? ''} \n className={(companyCreditData.credit.outstanding_balance?.value ?? 0) < 0 ? 'company-management-company-credit-negative' : undefined}\n /></p>\n </Card>\n <Card\n variant=\"secondary\"\n className=\"company-management-company-credit-available-credit\"\n >\n <p>{translations.creditAvailable}<br/>\n <Price\n size='large'\n amount={companyCreditData.credit.available_credit?.value ?? 0} \n currency={companyCreditData.credit.available_credit?.currency ?? ''} \n className={(companyCreditData.credit.available_credit?.value ?? 0) < 0 ? 'company-management-company-credit-negative' : undefined}\n /></p>\n </Card>\n <Card\n variant=\"secondary\"\n className=\"company-management-company-credit-credit-limit\"\n >\n <p>{translations.creditLimit}<br/>\n <Price \n size='large'\n amount={companyCreditData.credit.credit_limit?.value ?? 0} \n currency={companyCreditData.credit.credit_limit?.currency ?? ''} \n className={(companyCreditData.credit.credit_limit?.value ?? 0) < 0 ? '.company-management-company-credit-grid .company-management-company-credit-negative' : undefined}\n /></p>\n </Card>\n </div>\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 { FunctionComponent } from 'preact';\nimport { useMemo, useEffect } from 'preact/hooks';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { Button, InLineAlert, Picker, Price, Table } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CompanyCreditHistoryLoader } from '@/company-management/components/CompanyLoaders';\nimport { useCompanyCreditHistory } from '@/company-management/hooks/containers';\nimport './CompanyCreditHistoryDisplay.css';\n\nexport interface CompanyCreditHistoryDisplayProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n /**\n * Optional initial parameters for credit history filtering and pagination\n */\n initialParams?: {\n pageSize?: number;\n currentPage?: number;\n filter?: any;\n };\n}\n\n// Constants\nconst PAGE_SIZE_OPTIONS = [\n { text: '20', value: '20' },\n { text: '30', value: '30' },\n { text: '50', value: '50' },\n { text: '100', value: '100' },\n { text: '200', value: '200' }\n];\n\n/**\n * Converts operation type from SCREAMING_SNAKE_CASE to Title Case\n * @param operationType - The operation type string (e.g., \"CREDIT_ADJUSTMENT\", \"PURCHASE\")\n * @returns Formatted string in title case (e.g., \"Credit Adjustment\", \"Purchase\")\n */\nconst formatOperationType = (operationType: string): string => {\n return operationType\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n};\n\nexport const CompanyCreditHistoryDisplay: FunctionComponent<CompanyCreditHistoryDisplayProps> = ({\n className,\n initialParams = {},\n ...props\n}) => {\n const translations = useText({\n noData: 'Company.shared.messages.noData',\n // Table columns\n dateColumn: 'Company.CompanyCreditHistory.columns.date',\n operationColumn: 'Company.CompanyCreditHistory.columns.operation',\n amountColumn: 'Company.CompanyCreditHistory.columns.amount', \n outstandingBalanceColumn: 'Company.CompanyCreditHistory.columns.outstandingBalance',\n availableCreditColumn: 'Company.CompanyCreditHistory.columns.availableCredit',\n creditLimitColumn: 'Company.CompanyCreditHistory.columns.creditLimit',\n customReferenceColumn: 'Company.CompanyCreditHistory.columns.customReference',\n updatedByColumn: 'Company.CompanyCreditHistory.columns.updatedBy',\n // Pagination\n itemsRangeText: 'Company.CompanyCreditHistory.pagination.itemsRange',\n itemsPerPageLabel: 'Company.CompanyCreditHistory.pagination.itemsPerPage',\n showLabel: 'Company.CompanyCreditHistory.pagination.show',\n perPageLabel: 'Company.CompanyCreditHistory.pagination.perPage',\n // Accessibility labels\n ariaDataLoaded: 'Company.CompanyCreditHistory.ariaLabels.dataLoaded',\n ariaDataError: 'Company.CompanyCreditHistory.ariaLabels.dataError',\n ariaLoadingHistory: 'Company.CompanyCreditHistory.ariaLabels.loadingHistory',\n ariaHistoryTable: 'Company.CompanyCreditHistory.ariaLabels.historyTable',\n ariaPaginationNav: 'Company.CompanyCreditHistory.ariaLabels.paginationNav',\n ariaPageSizeSelector: 'Company.CompanyCreditHistory.ariaLabels.pageSizeSelector',\n ariaPreviousPage: 'Company.CompanyCreditHistory.ariaLabels.previousPage',\n ariaNextPage: 'Company.CompanyCreditHistory.ariaLabels.nextPage',\n ariaGoToPage: 'Company.CompanyCreditHistory.ariaLabels.goToPage',\n ariaCurrentPage: 'Company.CompanyCreditHistory.ariaLabels.currentPage',\n ariaShowingHistory: 'Company.CompanyCreditHistory.ariaLabels.showingHistory',\n ariaPageNavigation: 'Company.CompanyCreditHistory.ariaLabels.pageNavigation',\n });\n\n // Use the credit history hook - component now manages its own data\n const {\n items,\n loading,\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n announcement,\n handlePageSizeChange,\n handlePreviousPage,\n handleNextPage,\n handlePageChange,\n refreshCreditHistory,\n } = useCompanyCreditHistory({\n initialParams,\n translations: {\n ariaDataLoaded: translations.ariaDataLoaded,\n ariaDataError: translations.ariaDataError\n }\n });\n\n // Calculate item range for display\n const startItem = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1;\n const endItem = Math.min(currentPage * pageSize, totalItems);\n\n // Generate page numbers to display\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n \n if (currentPage <= 3) {\n pages.push(1, 2, 3, 4, '...', totalPages);\n } else if (currentPage >= totalPages - 2) {\n pages.push(1, '...', totalPages - 3, totalPages - 2, totalPages - 1, totalPages);\n } else {\n pages.push(1, '...', currentPage - 1, currentPage, currentPage + 1, '...', totalPages);\n }\n\n return pages;\n };\n\n // Listen to company context changes\n useEffect(() => {\n const handleCompanyContextChange = () => {\n refreshCreditHistory();\n };\n\n const subscription = events.on(\n 'companyContext/changed',\n handleCompanyContextChange,\n { eager: true }\n );\n \n return () => {\n subscription?.off?.();\n };\n }, [refreshCreditHistory]);\n\n // Prepare table columns - memoized to prevent unnecessary re-renders\n const columns = useMemo(() => [\n { key: 'date', label: translations.dateColumn },\n { key: 'operation', label: translations.operationColumn },\n { key: 'amount', label: translations.amountColumn },\n { key: 'outstandingBalance', label: translations.outstandingBalanceColumn },\n { key: 'availableCredit', label: translations.availableCreditColumn },\n { key: 'creditLimit', label: translations.creditLimitColumn },\n { key: 'customReference', label: translations.customReferenceColumn },\n { key: 'updatedBy', label: translations.updatedByColumn }\n ], [\n translations.dateColumn,\n translations.operationColumn, \n translations.amountColumn,\n translations.outstandingBalanceColumn,\n translations.availableCreditColumn,\n translations.creditLimitColumn,\n translations.customReferenceColumn,\n translations.updatedByColumn\n ]);\n\n // Prepare table row data - memoized for performance\n const rowData = useMemo(() => items.map((item) => ({\n date: new Date(item.date).toLocaleDateString(),\n operation: formatOperationType(item.type),\n amount: item.amount.value === 0 ? '' : (\n <span>\n <Price \n amount={item.amount.value} \n currency={item.amount.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n </span>\n ),\n outstandingBalance: (\n <Price \n amount={item.balance.outstandingBalance.value} \n currency={item.balance.outstandingBalance.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n ),\n availableCredit: (\n <Price \n amount={item.balance.availableCredit.value} \n currency={item.balance.availableCredit.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n ),\n creditLimit: (\n <Price \n amount={item.balance.creditLimit.value} \n currency={item.balance.creditLimit.currency}\n size=\"small\"\n className=\"company-management-price-normal\"\n />\n ),\n customReference: item.customReferenceNumber || '',\n updatedBy: item.updatedBy.name\n })), [items]);\n\n return (\n <section {...props} className={classes(['company-management-company-credit-history-display', className])}>\n {/* Screen reader announcements */}\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </div>\n\n {/* Table with loading state */}\n <div aria-busy={loading}>\n {loading ? (\n <div className=\"loadingContainer\" role=\"status\" aria-live=\"polite\">\n <CompanyCreditHistoryLoader testId=\"companyCreditHistoryLoader\" />\n </div>\n ) : (\n <>\n <Table\n className=\"company-management-company-credit-history-table\"\n columns={columns}\n rowData={rowData}\n mobileLayout=\"stacked\"\n aria-label={translations.ariaHistoryTable}\n summary={translations.ariaShowingHistory.replace('{count}', items.length.toString())}\n />\n {!items.length && (\n <InLineAlert\n type=\"warning\"\n heading={translations.noData}\n className=\"company-management-company-credit-history-no-data-alert\"\n />\n )}\n </>\n )}\n </div>\n\n {/* Pagination controls */}\n {!loading && items.length > 0 && (\n <nav aria-label={translations.ariaPaginationNav} className=\"paginationContainer\">\n {/* Items range on the left */}\n <div aria-live=\"polite\" aria-atomic=\"true\">\n {translations.itemsRangeText\n .replace('{start}', startItem.toString())\n .replace('{end}', endItem.toString())\n .replace('{total}', totalItems.toString())}\n </div>\n\n {/* Pagination buttons in the center (only show when multiple pages) */}\n {totalPages > 1 && (\n <div className=\"paginationButtons\" role=\"group\" aria-label={translations.ariaPageNavigation}>\n <Button\n variant=\"secondary\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1 || loading}\n aria-label={translations.ariaPreviousPage}\n className=\"paginationButton\"\n >\n <\n </Button>\n \n {getPageNumbers().map((pageNum, index) => (\n pageNum === '...' ? (\n <span key={`ellipsis-${index}`} className=\"paginationEllipsis\">\n ...\n </span>\n ) : (\n <Button\n key={pageNum}\n variant={currentPage === pageNum ? 'primary' : 'secondary'}\n onClick={() => handlePageChange?.(pageNum as number)}\n disabled={loading}\n aria-label={currentPage === pageNum \n ? translations.ariaCurrentPage.replace('{page}', String(pageNum))\n : translations.ariaGoToPage.replace('{page}', String(pageNum))\n }\n aria-current={currentPage === pageNum ? 'page' : undefined}\n className=\"paginationButton\"\n >\n {pageNum}\n </Button>\n )\n ))}\n\n <Button\n variant=\"secondary\"\n onClick={handleNextPage}\n disabled={currentPage === totalPages || loading}\n aria-label={translations.ariaNextPage}\n className=\"paginationButton\"\n >\n >\n </Button>\n </div>\n )}\n\n {/* Page size picker on the right */}\n <div className=\"pageSizeSelector\">\n <label htmlFor=\"page-size-select\" id=\"page-size-label\">\n <span>{translations.showLabel}</span>\n </label>\n <Picker\n id=\"page-size-select\"\n name=\"pageSize\"\n value={pageSize.toString()}\n options={PAGE_SIZE_OPTIONS}\n handleSelect={handlePageSizeChange}\n aria-labelledby=\"page-size-label\"\n aria-describedby=\"page-size-description\"\n />\n <span id=\"page-size-description\">{translations.perPageLabel}</span>\n </div>\n </nav>\n )}\n </section>\n );\n};","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n \nimport { HTMLAttributes } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { CompanyCreditDisplay } from '@/company-management/components/CompanyCreditDisplay';\nimport { CompanyCreditHistoryDisplay } from '@/company-management/components/CompanyCreditHistoryDisplay';\nimport { GetCompanyCreditHistoryParams } from '@/company-management/types/api/getCompanyCreditHistoryParams.types';\n\nexport interface CompanyCreditProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Optional parameters for credit history filtering and pagination\n */\n creditHistoryParams?: GetCompanyCreditHistoryParams;\n \n /**\n * Whether to show the credit history section\n */\n showCreditHistory?: boolean;\n}\n \nexport const CompanyCredit: Container<CompanyCreditProps> = ({ \n creditHistoryParams = {}, \n showCreditHistory = true,\n className,\n children,\n ...props \n}) => {\n return (\n <section {...props} className={className}>\n <CompanyCreditDisplay />\n \n {showCreditHistory && (\n <CompanyCreditHistoryDisplay\n initialParams={creditHistoryParams}\n style={{ marginTop: '24px' }}\n />\n )}\n\n {children}\n </section>\n );\n};\n"],"names":["DEFAULT_PAGE_SIZE","FIRST_PAGE","useCompanyCreditHistory","initialParams","translations","items","setItems","useState","loading","setLoading","currentPage","setCurrentPage","pageSize","setPageSize","totalItems","setTotalItems","totalPages","setTotalPages","announcement","setAnnouncement","translationsRef","useRef","initialParamsRef","apiParams","useMemo","fetchCreditHistory","useCallback","response","getCompanyCreditHistory","_a","error","useEffect","handlePageSizeChange","event","value","newSize","handlePreviousPage","handleNextPage","handlePageChange","page","refreshCreditHistory","CompanyCreditDisplay","className","props","useText","companyCreditData","setCompanyCreditData","setError","inFlightRef","didInitialFetchRef","fetchCompanyCredit","companyCreditInfo","getCompanyCredit","handleCompanyContextChange","subscription","events","jsx","Card","CompanyCreditLoader","InLineAlert","jsxs","Price","_b","_c","_d","_e","_f","_g","_h","_i","PAGE_SIZE_OPTIONS","formatOperationType","operationType","word","CompanyCreditHistoryDisplay","startItem","endItem","getPageNumbers","_","i","pages","columns","rowData","item","classes","CompanyCreditHistoryLoader","Fragment","Table","Button","pageNum","index","Picker","CompanyCredit","creditHistoryParams","showCreditHistory","children"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as r,jsxs as w}from"@dropins/tools/preact-jsx-runtime.js";import{useState as f,useRef as z,useMemo as D,useCallback as u,useEffect as V}from"@dropins/tools/preact-hooks.js";import{Button as F,InLineAlert as K,ActionButton as $,Pagination as J,Picker as Q,Modal as j}from"@dropins/tools/components.js";import{u as W,T as X}from"../chunks/useUserPermissions.js";import{C as q}from"../chunks/CompanyUserForm.js";import{classes as Y}from"@dropins/tools/lib.js";import{u as ee}from"../chunks/useCustomerCompanyInfo.js";import{u as Z}from"../chunks/useInLineAlert.js";import{g as ae,u as te}from"../chunks/updateCompanyUserStatus.js";import{useText as H}from"@dropins/tools/i18n.js";import{d as ne}from"../chunks/updateCompanyUser.js";import{f as se}from"../chunks/fetchUserPermissions.js";import{u as re}from"../chunks/useCompanyContextListener.js";import"@dropins/tools/preact.js";import"../chunks/company-permissions.js";import"@dropins/tools/preact-compat.js";import"../chunks/useCompanyRoles.js";import"../chunks/isCompanyRoleNameAvailable.js";import"../chunks/network-error.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";import"../chunks/fetch-error.js";import"../chunks/CompanyLoaders.js";import"../chunks/getCustomerCompany.js";const oe=s=>{try{return atob(s)}catch{return s}},ie=s=>!s||typeof s!="string"?s:oe(s),ce=(s,l)=>!s||typeof s!="string"?"":s==="ACTIVE"&&l.statusActive?l.statusActive:s==="INACTIVE"&&l.statusInactive?l.statusInactive:s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),le=(s,l)=>{const m=(s==null?void 0:s.trim())||"",p=(l==null?void 0:l.trim())||"";return`${m} ${p}`.trim()},me=({filterType:s,onFilterChange:l,translations:m})=>{const p=[{type:"all",label:m.showAllUsers,ariaLabel:m.showAllUsers},{type:"active",label:m.showActiveUsers,ariaLabel:m.showActiveUsers},{type:"inactive",label:m.showInactiveUsers,ariaLabel:m.showInactiveUsers}];return r("div",{className:"filterButtons",role:"group","aria-label":m.ariaFilterOptions,children:p.filter(n=>n.type!==s).map(n=>r(F,{variant:"tertiary",onClick:()=>l(n.type),"aria-label":n.ariaLabel,children:n.label},n.type))})},pe=10,G=1,de=({translations:s})=>{const[l,m]=f([]),[p,n]=f(!1),[o,U]=f(G),[g,N]=f(pe),[A,P]=f("all"),[S,b]=f(0),[c,I]=f(1),[L,x]=f(""),[v,T]=f(null),t=z(s);t.current=s;const d=D(()=>{switch(A){case"active":return{status:"ACTIVE"};case"inactive":return{status:"INACTIVE"};default:return}},[A]),y=u(async()=>{n(!0);try{const a=await ae({pageSize:g,currentPage:o,filter:d});m(a.users),b(a.totalCount||a.users.length),I(a.pageInfo.totalPages),x(t.current.ariaDataLoaded.replace("{count}",a.users.length.toString()))}catch{m([]),b(0),I(1),x(t.current.ariaDataError)}finally{n(!1)}},[g,o,d]),h=u(async()=>{try{const{allowedIds:a}=await se();T(a)}catch{T(new Set)}},[]);V(()=>{y()},[y]),V(()=>{h()},[h]);const M=u(a=>{P(a),U(G)},[]),E=u(a=>{let _;if(typeof a=="string")_=a;else if("target"in a&&a.target&&"value"in a.target)_=a.target.value;else return;const R=parseInt(_,10);isNaN(R)||(N(R),U(G))},[]),B=u(()=>{o>1&&U(o-1)},[o]),k=u(()=>{o<c&&U(o+1)},[o,c]),i=u(a=>{a>=1&&a<=c&&U(a)},[c]),e=(v==null?void 0:v.has("Magento_Company::users_edit"))||!1,C=u(async()=>{await h(),await y()},[h,y]);return{users:l,userPermissions:v,currentPage:o,pageSize:g,totalItems:S,totalPages:c,filterType:A,filter:d,loading:p,announcement:L,canEditUsers:e,handleFilterChange:M,handlePageSizeChange:E,handlePreviousPage:B,handleNextPage:k,handlePageChange:i,refreshUsers:C}},O=s=>{const[l,m]=f(!1),[p,n]=f(null),o=u(g=>{g&&n(g),m(!0)},[]),U=u(()=>{m(!1),n(null),s==null||s()},[s]);return{isOpen:l,selectedId:p,open:o,close:U}},ue=({className:s,userId:l,userStatus:m,onClose:p,isOpen:n=!1,onSuccess:o,...U})=>{const[g,N]=f(!1),[A,P]=f(!1),{inLineAlertProps:S,showError:b,clearAlert:c}=Z(),{companyInfo:I}=ee(),L=z(null),x=z(null),v=`modal-title-${l}`,T=`modal-desc-${l}`,t=H({title:"Company.CompanyUsers.managementModal.title",setActiveText:"Company.CompanyUsers.managementModal.setActiveText",setInactiveText:"Company.CompanyUsers.managementModal.setInactiveText",deleteText:"Company.CompanyUsers.managementModal.deleteText",setActiveButton:"Company.CompanyUsers.managementModal.setActiveButton",setInactiveButton:"Company.CompanyUsers.managementModal.setInactiveButton",settingActiveButton:"Company.CompanyUsers.managementModal.settingActiveButton",settingInactiveButton:"Company.CompanyUsers.managementModal.settingInactiveButton",deleteButton:"Company.CompanyUsers.managementModal.deleteButton",deletingButton:"Company.CompanyUsers.managementModal.deletingButton",cancelButton:"Company.CompanyUsers.managementModal.cancelButton",setActiveErrorGeneric:"Company.CompanyUsers.managementModal.setActiveErrorGeneric",setActiveErrorSpecific:"Company.CompanyUsers.managementModal.setActiveErrorSpecific",setInactiveErrorGeneric:"Company.CompanyUsers.managementModal.setInactiveErrorGeneric",setInactiveErrorSpecific:"Company.CompanyUsers.managementModal.setInactiveErrorSpecific",deleteErrorGeneric:"Company.CompanyUsers.managementModal.deleteErrorGeneric",deleteErrorSpecific:"Company.CompanyUsers.managementModal.deleteErrorSpecific",setActiveSuccess:"Company.CompanyUsers.managementModal.setActiveSuccess",setInactiveSuccess:"Company.CompanyUsers.managementModal.setInactiveSuccess",deleteSuccess:"Company.CompanyUsers.managementModal.deleteSuccess",ariaCloseModal:"Company.CompanyUsers.managementModal.ariaLabels.closeModal",ariaModalDescription:"Company.CompanyUsers.managementModal.ariaLabels.modalDescription"}),d=u(i=>{const e=(I==null?void 0:I.companyName)||"";return i.replace(/%1/g,e)},[I==null?void 0:I.companyName]),y=u(async()=>{if(A)return;const i=m==="ACTIVE"?"INACTIVE":"ACTIVE",e=i==="ACTIVE";P(!0),c();try{if((await te({id:l,status:i})).success){const a=e?t.setActiveSuccess:t.setInactiveSuccess;o&&o(a),p()}else{const a=e?t.setActiveErrorSpecific:t.setInactiveErrorSpecific;b(d(a))}}catch(C){const a=C instanceof Error?C.message:e?t.setActiveErrorGeneric:t.setInactiveErrorGeneric;b(d(a))}finally{P(!1)}},[l,m,p,A,c,b,d,t.setActiveErrorSpecific,t.setInactiveErrorSpecific,t.setActiveErrorGeneric,t.setInactiveErrorGeneric,t.setActiveSuccess,t.setInactiveSuccess,o]),h=u(async()=>{if(!g){N(!0),c();try{(await ne({id:l})).success?(o&&o(t.deleteSuccess),p()):b(d(t.deleteErrorSpecific))}catch(i){const e=i instanceof Error?i.message:t.deleteErrorGeneric;b(d(e))}finally{N(!1)}}},[l,p,g,c,b,d,t.deleteErrorSpecific,t.deleteErrorGeneric,t.deleteSuccess,o]),M=u(()=>{c(),p()},[p,c]),E=u(i=>{if(i.key==="Escape"&&(c(),p()),i.key==="Tab"){const e=L.current;if(!e)return;const C=e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),a=C[0],_=C[C.length-1];i.shiftKey?document.activeElement===a&&(_.focus(),i.preventDefault()):document.activeElement===_&&(a.focus(),i.preventDefault())}},[p,c]),B=u(i=>{i.target===i.currentTarget&&(c(),p())},[p,c]),k=u(()=>{c(),p()},[p,c]);return V(()=>{if(n)return x.current=document.activeElement,document.addEventListener("keydown",E),setTimeout(()=>{const i=L.current;if(i){const e=i.querySelector("button");e?e.focus():i.focus()}},100),()=>{document.removeEventListener("keydown",E)};x.current&&x.current.focus()},[n,E]),n?r("div",{className:Y(["company-management-company-users-management-modal-overlay",s]),onClick:B,...U,children:w("div",{ref:L,className:"company-management-company-users-management-modal",role:"dialog","aria-modal":"true","aria-labelledby":v,"aria-describedby":T,tabIndex:-1,children:[w("div",{className:"company-management-company-users-management-modal__header",children:[r("h2",{id:v,className:"company-management-company-users-management-modal__title",children:t.title}),r("button",{className:"company-management-company-users-management-modal__close",onClick:k,"aria-label":t.ariaCloseModal,children:"×"})]}),w("div",{id:T,className:"company-management-company-users-management-modal__content",children:[r("p",{className:"company-management-company-users-management-modal__text",children:m==="ACTIVE"?t.setInactiveText:t.setActiveText}),r("p",{className:"company-management-company-users-management-modal__text",children:t.deleteText})]}),(S==null?void 0:S.text)&&r("div",{className:"company-management-company-users-management-modal__alert",role:"alert","aria-live":"assertive",children:r(K,{type:"error",heading:S.text,icon:S.icon,"data-testid":"companyUsersManagementModalAlert"})}),w("div",{className:"company-management-company-users-management-modal__actions",children:[r(F,{variant:"primary",onClick:y,disabled:A,className:"company-management-company-users-management-modal__button-primary",children:A?m==="ACTIVE"?t.settingInactiveButton:t.settingActiveButton:m==="ACTIVE"?t.setInactiveButton:t.setActiveButton}),r(F,{variant:"tertiary",onClick:h,disabled:g,className:"company-management-company-users-management-modal__button-delete",children:g?t.deletingButton:t.deleteButton}),r(F,{variant:"secondary",onClick:M,className:"company-management-company-users-management-modal__button-cancel",children:t.cancelButton})]})]})}):null},ye=[{text:"10",value:"10"},{text:"20",value:"20"},{text:"50",value:"50"},{text:"100",value:"100"}],Ge=({children:s,className:l,...m})=>{const{permissions:p}=W(),n=H({showAllUsers:"Company.CompanyUsers.filters.showAll",showActiveUsers:"Company.CompanyUsers.filters.showActive",showInactiveUsers:"Company.CompanyUsers.filters.showInactive",idColumn:"Company.CompanyUsers.columns.id",nameColumn:"Company.CompanyUsers.columns.name",emailColumn:"Company.CompanyUsers.columns.email",roleColumn:"Company.CompanyUsers.columns.role",teamColumn:"Company.CompanyUsers.columns.team",statusColumn:"Company.CompanyUsers.columns.status",actionsColumn:"Company.CompanyUsers.columns.actions",statusActive:"Company.CompanyUsers.status.active",statusInactive:"Company.CompanyUsers.status.inactive",emptyTeam:"Company.CompanyUsers.emptyTeam",emptyActions:"Company.CompanyUsers.emptyActions",itemsRange:"Company.CompanyUsers.pagination.itemsRange",itemsPerPageLabel:"Company.CompanyUsers.pagination.itemsPerPage",showLabel:"Company.CompanyUsers.pagination.show",previousPage:"Company.CompanyUsers.pagination.previous",nextPage:"Company.CompanyUsers.pagination.next",pageInfo:"Company.CompanyUsers.pagination.pageInfo",ariaUsersTable:"Company.CompanyUsers.ariaLabels.usersTable",ariaFilterOptions:"Company.CompanyUsers.ariaLabels.filterOptions",ariaPaginationNav:"Company.CompanyUsers.ariaLabels.paginationNav",ariaPageSizeSelector:"Company.CompanyUsers.ariaLabels.pageSizeSelector",ariaPreviousPageFull:"Company.CompanyUsers.ariaLabels.previousPageFull",ariaNextPageFull:"Company.CompanyUsers.ariaLabels.nextPageFull",ariaCurrentPage:"Company.CompanyUsers.ariaLabels.currentPage",ariaShowingUsers:"Company.CompanyUsers.ariaLabels.showingUsers",ariaDataLoaded:"Company.CompanyUsers.ariaLabels.dataLoaded",ariaDataError:"Company.CompanyUsers.ariaLabels.dataError",ariaPageNavigation:"Company.CompanyUsers.ariaLabels.pageNavigation",manageUser:"Company.CompanyUsers.actions.manage",editUser:"Company.CompanyUsers.actions.edit",ariaManageUser:"Company.CompanyUsers.ariaLabels.manageUser",ariaEditUser:"Company.CompanyUsers.ariaLabels.editUser",addNewUser:"Company.CompanyUsers.actions.addNewUser",noUsersFound:"Company.CompanyUsers.noUsersFound"}),{users:o,loading:U,currentPage:g,pageSize:N,filterType:A,totalItems:P,totalPages:S,announcement:b,canEditUsers:c,handleFilterChange:I,handlePageSizeChange:L,handlePageChange:x,refreshUsers:v}=de({translations:{ariaDataLoaded:n.ariaDataLoaded,ariaDataError:n.ariaDataError}}),T=z(n);T.current=n;const t=u(()=>{v()},[v]);re(t);const d=O(v),y=O(v),h=O(v),{inLineAlertProps:M,handleSetInLineAlert:E}=Z(),B=D(()=>{const e=T.current;return[{key:"id",label:e.idColumn},{key:"name",label:e.nameColumn},{key:"email",label:e.emailColumn},{key:"role",label:e.roleColumn},{key:"team",label:e.teamColumn},{key:"status",label:e.statusColumn},{key:"actions",label:e.actionsColumn}]},[]),k=D(()=>o.map(e=>{const C=le(e.firstName,e.lastName),a=T.current;return{id:ie(e.id),name:C,email:e.email,role:e.role,team:e.team||a.emptyTeam,status:ce(e.status,a),actions:c?w("div",{className:"user-actions",children:[r($,{onClick:()=>y.open(e.id),"aria-label":a.ariaEditUser.replace("{name}",C),className:"edit-user-button",children:a.editUser}),r($,{onClick:()=>d.open(e.id),"aria-label":a.ariaManageUser.replace("{name}",C),className:"manage-user-button",children:a.manageUser})]}):r("span",{className:"no-actions",children:a.emptyActions})}}),[o,c,y,d]),i=D(()=>o.find(e=>e.id===d.selectedId),[o,d.selectedId]);return w("section",{className:l,...m,children:[r("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:b}),r(me,{filterType:A,onFilterChange:I,translations:{showAllUsers:n.showAllUsers,showActiveUsers:n.showActiveUsers,showInactiveUsers:n.showInactiveUsers,ariaFilterOptions:n.ariaFilterOptions}}),M&&M.text?r(K,{className:"company-users__alert",type:M.type||"success",variant:"secondary",heading:M.text,icon:M.icon}):null,w("div",{"aria-busy":U,children:[r(X,{className:"companyUsersTable",columns:B,rowData:k,mobileLayout:"stacked",loading:U,"aria-label":n.ariaUsersTable,summary:n.ariaShowingUsers.replace("{count}",o.length.toString())}),!U&&o.length===0&&r("div",{className:"companyUsersTable__empty",children:n.noUsersFound})]}),o.length>0&&w("nav",{"aria-label":n.ariaPaginationNav,className:"paginationContainer",children:[r("div",{"aria-live":"polite","aria-atomic":"true",children:(()=>{const e=P===0?0:(g-1)*N+1,C=Math.min(g*N,P);return n.itemsRange.replace("{start}",e.toString()).replace("{end}",C.toString()).replace("{total}",P.toString())})()}),S>1&&r(J,{currentPage:g,totalPages:S,onChange:x,className:"paginationButtons"}),w("div",{className:"pageSizeSelector",children:[r("label",{htmlFor:"page-size-select",id:"page-size-label",children:r("span",{children:n.showLabel})}),r(Q,{id:"page-size-select",name:"pageSize",value:N.toString(),options:ye,onChange:L,"aria-labelledby":"page-size-label"})]})]}),c&&r("div",{className:"addUserButtonContainer",children:r(F,{variant:"primary",onClick:()=>h.open(),"aria-label":n.addNewUser,children:n.addNewUser})}),s,h.isOpen&&c&&r(j,{open:h.isOpen,onClose:h.close,size:"medium",children:r(q,{mode:"add",entityId:void 0,parentStructureId:void 0,permissions:p,onSaved:h.close,onCancel:h.close,onError:e=>{E({text:e,type:"error"})},onSuccess:e=>{E({text:e,type:"success"})}})}),y.selectedId&&y.isOpen&&c&&r(j,{open:y.isOpen,onClose:y.close,size:"medium",children:r(q,{mode:"edit",entityId:y.selectedId,parentStructureId:void 0,permissions:p,onSaved:y.close,onCancel:y.close,onError:e=>{E({text:e,type:"error"})},onSuccess:e=>{E({text:e,type:"success"})}})}),d.selectedId&&c&&i&&r(ue,{isOpen:d.isOpen,userId:d.selectedId,userStatus:i.status||"ACTIVE",onClose:d.close,onSuccess:e=>{E({text:e,type:"success"})}})]})};export{Ge as CompanyUsers,Ge as default};
|
|
3
|
+
import{jsx as r,jsxs as w}from"@dropins/tools/preact-jsx-runtime.js";import{useState as f,useRef as z,useMemo as D,useCallback as u,useEffect as V}from"@dropins/tools/preact-hooks.js";import{Button as F,InLineAlert as K,ActionButton as $,Pagination as J,Picker as Q,Modal as j}from"@dropins/tools/components.js";import{u as W,T as X}from"../chunks/useUserPermissions.js";import{C as q}from"../chunks/CompanyUserForm.js";import{classes as Y}from"@dropins/tools/lib.js";import{u as ee}from"../chunks/useCustomerCompanyInfo.js";import"@dropins/tools/event-bus.js";import{u as Z}from"../chunks/useInLineAlert.js";import{g as ae,u as te}from"../chunks/updateCompanyUserStatus.js";import{useText as H}from"@dropins/tools/i18n.js";import{d as ne}from"../chunks/updateCompanyUser.js";import{f as se}from"../chunks/fetchUserPermissions.js";import{u as re}from"../chunks/useCompanyContextListener.js";import"@dropins/tools/preact.js";import"../chunks/company-permissions.js";import"@dropins/tools/preact-compat.js";import"../chunks/useCompanyRoles.js";import"../chunks/isCompanyRoleNameAvailable.js";import"../chunks/network-error.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/fetch-error.js";import"../chunks/CompanyLoaders.js";import"../chunks/getCustomerCompany.js";const oe=s=>{try{return atob(s)}catch{return s}},ie=s=>!s||typeof s!="string"?s:oe(s),ce=(s,l)=>!s||typeof s!="string"?"":s==="ACTIVE"&&l.statusActive?l.statusActive:s==="INACTIVE"&&l.statusInactive?l.statusInactive:s.charAt(0).toUpperCase()+s.slice(1).toLowerCase(),le=(s,l)=>{const m=(s==null?void 0:s.trim())||"",p=(l==null?void 0:l.trim())||"";return`${m} ${p}`.trim()},me=({filterType:s,onFilterChange:l,translations:m})=>{const p=[{type:"all",label:m.showAllUsers,ariaLabel:m.showAllUsers},{type:"active",label:m.showActiveUsers,ariaLabel:m.showActiveUsers},{type:"inactive",label:m.showInactiveUsers,ariaLabel:m.showInactiveUsers}];return r("div",{className:"filterButtons",role:"group","aria-label":m.ariaFilterOptions,children:p.filter(n=>n.type!==s).map(n=>r(F,{variant:"tertiary",onClick:()=>l(n.type),"aria-label":n.ariaLabel,children:n.label},n.type))})},pe=10,G=1,de=({translations:s})=>{const[l,m]=f([]),[p,n]=f(!1),[o,U]=f(G),[g,N]=f(pe),[A,P]=f("all"),[S,b]=f(0),[c,I]=f(1),[L,x]=f(""),[v,T]=f(null),t=z(s);t.current=s;const d=D(()=>{switch(A){case"active":return{status:"ACTIVE"};case"inactive":return{status:"INACTIVE"};default:return}},[A]),y=u(async()=>{n(!0);try{const a=await ae({pageSize:g,currentPage:o,filter:d});m(a.users),b(a.totalCount||a.users.length),I(a.pageInfo.totalPages),x(t.current.ariaDataLoaded.replace("{count}",a.users.length.toString()))}catch{m([]),b(0),I(1),x(t.current.ariaDataError)}finally{n(!1)}},[g,o,d]),h=u(async()=>{try{const{allowedIds:a}=await se();T(a)}catch{T(new Set)}},[]);V(()=>{y()},[y]),V(()=>{h()},[h]);const M=u(a=>{P(a),U(G)},[]),E=u(a=>{let _;if(typeof a=="string")_=a;else if("target"in a&&a.target&&"value"in a.target)_=a.target.value;else return;const R=parseInt(_,10);isNaN(R)||(N(R),U(G))},[]),B=u(()=>{o>1&&U(o-1)},[o]),k=u(()=>{o<c&&U(o+1)},[o,c]),i=u(a=>{a>=1&&a<=c&&U(a)},[c]),e=(v==null?void 0:v.has("Magento_Company::users_edit"))||!1,C=u(async()=>{await h(),await y()},[h,y]);return{users:l,userPermissions:v,currentPage:o,pageSize:g,totalItems:S,totalPages:c,filterType:A,filter:d,loading:p,announcement:L,canEditUsers:e,handleFilterChange:M,handlePageSizeChange:E,handlePreviousPage:B,handleNextPage:k,handlePageChange:i,refreshUsers:C}},O=s=>{const[l,m]=f(!1),[p,n]=f(null),o=u(g=>{g&&n(g),m(!0)},[]),U=u(()=>{m(!1),n(null),s==null||s()},[s]);return{isOpen:l,selectedId:p,open:o,close:U}},ue=({className:s,userId:l,userStatus:m,onClose:p,isOpen:n=!1,onSuccess:o,...U})=>{const[g,N]=f(!1),[A,P]=f(!1),{inLineAlertProps:S,showError:b,clearAlert:c}=Z(),{companyInfo:I}=ee(),L=z(null),x=z(null),v=`modal-title-${l}`,T=`modal-desc-${l}`,t=H({title:"Company.CompanyUsers.managementModal.title",setActiveText:"Company.CompanyUsers.managementModal.setActiveText",setInactiveText:"Company.CompanyUsers.managementModal.setInactiveText",deleteText:"Company.CompanyUsers.managementModal.deleteText",setActiveButton:"Company.CompanyUsers.managementModal.setActiveButton",setInactiveButton:"Company.CompanyUsers.managementModal.setInactiveButton",settingActiveButton:"Company.CompanyUsers.managementModal.settingActiveButton",settingInactiveButton:"Company.CompanyUsers.managementModal.settingInactiveButton",deleteButton:"Company.CompanyUsers.managementModal.deleteButton",deletingButton:"Company.CompanyUsers.managementModal.deletingButton",cancelButton:"Company.CompanyUsers.managementModal.cancelButton",setActiveErrorGeneric:"Company.CompanyUsers.managementModal.setActiveErrorGeneric",setActiveErrorSpecific:"Company.CompanyUsers.managementModal.setActiveErrorSpecific",setInactiveErrorGeneric:"Company.CompanyUsers.managementModal.setInactiveErrorGeneric",setInactiveErrorSpecific:"Company.CompanyUsers.managementModal.setInactiveErrorSpecific",deleteErrorGeneric:"Company.CompanyUsers.managementModal.deleteErrorGeneric",deleteErrorSpecific:"Company.CompanyUsers.managementModal.deleteErrorSpecific",setActiveSuccess:"Company.CompanyUsers.managementModal.setActiveSuccess",setInactiveSuccess:"Company.CompanyUsers.managementModal.setInactiveSuccess",deleteSuccess:"Company.CompanyUsers.managementModal.deleteSuccess",ariaCloseModal:"Company.CompanyUsers.managementModal.ariaLabels.closeModal",ariaModalDescription:"Company.CompanyUsers.managementModal.ariaLabels.modalDescription"}),d=u(i=>{const e=(I==null?void 0:I.companyName)||"";return i.replace(/%1/g,e)},[I==null?void 0:I.companyName]),y=u(async()=>{if(A)return;const i=m==="ACTIVE"?"INACTIVE":"ACTIVE",e=i==="ACTIVE";P(!0),c();try{if((await te({id:l,status:i})).success){const a=e?t.setActiveSuccess:t.setInactiveSuccess;o&&o(a),p()}else{const a=e?t.setActiveErrorSpecific:t.setInactiveErrorSpecific;b(d(a))}}catch(C){const a=C instanceof Error?C.message:e?t.setActiveErrorGeneric:t.setInactiveErrorGeneric;b(d(a))}finally{P(!1)}},[l,m,p,A,c,b,d,t.setActiveErrorSpecific,t.setInactiveErrorSpecific,t.setActiveErrorGeneric,t.setInactiveErrorGeneric,t.setActiveSuccess,t.setInactiveSuccess,o]),h=u(async()=>{if(!g){N(!0),c();try{(await ne({id:l})).success?(o&&o(t.deleteSuccess),p()):b(d(t.deleteErrorSpecific))}catch(i){const e=i instanceof Error?i.message:t.deleteErrorGeneric;b(d(e))}finally{N(!1)}}},[l,p,g,c,b,d,t.deleteErrorSpecific,t.deleteErrorGeneric,t.deleteSuccess,o]),M=u(()=>{c(),p()},[p,c]),E=u(i=>{if(i.key==="Escape"&&(c(),p()),i.key==="Tab"){const e=L.current;if(!e)return;const C=e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),a=C[0],_=C[C.length-1];i.shiftKey?document.activeElement===a&&(_.focus(),i.preventDefault()):document.activeElement===_&&(a.focus(),i.preventDefault())}},[p,c]),B=u(i=>{i.target===i.currentTarget&&(c(),p())},[p,c]),k=u(()=>{c(),p()},[p,c]);return V(()=>{if(n)return x.current=document.activeElement,document.addEventListener("keydown",E),setTimeout(()=>{const i=L.current;if(i){const e=i.querySelector("button");e?e.focus():i.focus()}},100),()=>{document.removeEventListener("keydown",E)};x.current&&x.current.focus()},[n,E]),n?r("div",{className:Y(["company-management-company-users-management-modal-overlay",s]),onClick:B,...U,children:w("div",{ref:L,className:"company-management-company-users-management-modal",role:"dialog","aria-modal":"true","aria-labelledby":v,"aria-describedby":T,tabIndex:-1,children:[w("div",{className:"company-management-company-users-management-modal__header",children:[r("h2",{id:v,className:"company-management-company-users-management-modal__title",children:t.title}),r("button",{className:"company-management-company-users-management-modal__close",onClick:k,"aria-label":t.ariaCloseModal,children:"×"})]}),w("div",{id:T,className:"company-management-company-users-management-modal__content",children:[r("p",{className:"company-management-company-users-management-modal__text",children:m==="ACTIVE"?t.setInactiveText:t.setActiveText}),r("p",{className:"company-management-company-users-management-modal__text",children:t.deleteText})]}),(S==null?void 0:S.text)&&r("div",{className:"company-management-company-users-management-modal__alert",role:"alert","aria-live":"assertive",children:r(K,{type:"error",heading:S.text,icon:S.icon,"data-testid":"companyUsersManagementModalAlert"})}),w("div",{className:"company-management-company-users-management-modal__actions",children:[r(F,{variant:"primary",onClick:y,disabled:A,className:"company-management-company-users-management-modal__button-primary",children:A?m==="ACTIVE"?t.settingInactiveButton:t.settingActiveButton:m==="ACTIVE"?t.setInactiveButton:t.setActiveButton}),r(F,{variant:"tertiary",onClick:h,disabled:g,className:"company-management-company-users-management-modal__button-delete",children:g?t.deletingButton:t.deleteButton}),r(F,{variant:"secondary",onClick:M,className:"company-management-company-users-management-modal__button-cancel",children:t.cancelButton})]})]})}):null},ye=[{text:"10",value:"10"},{text:"20",value:"20"},{text:"50",value:"50"},{text:"100",value:"100"}],Ge=({children:s,className:l,...m})=>{const{permissions:p}=W(),n=H({showAllUsers:"Company.CompanyUsers.filters.showAll",showActiveUsers:"Company.CompanyUsers.filters.showActive",showInactiveUsers:"Company.CompanyUsers.filters.showInactive",idColumn:"Company.CompanyUsers.columns.id",nameColumn:"Company.CompanyUsers.columns.name",emailColumn:"Company.CompanyUsers.columns.email",roleColumn:"Company.CompanyUsers.columns.role",teamColumn:"Company.CompanyUsers.columns.team",statusColumn:"Company.CompanyUsers.columns.status",actionsColumn:"Company.CompanyUsers.columns.actions",statusActive:"Company.CompanyUsers.status.active",statusInactive:"Company.CompanyUsers.status.inactive",emptyTeam:"Company.CompanyUsers.emptyTeam",emptyActions:"Company.CompanyUsers.emptyActions",itemsRange:"Company.CompanyUsers.pagination.itemsRange",itemsPerPageLabel:"Company.CompanyUsers.pagination.itemsPerPage",showLabel:"Company.CompanyUsers.pagination.show",previousPage:"Company.CompanyUsers.pagination.previous",nextPage:"Company.CompanyUsers.pagination.next",pageInfo:"Company.CompanyUsers.pagination.pageInfo",ariaUsersTable:"Company.CompanyUsers.ariaLabels.usersTable",ariaFilterOptions:"Company.CompanyUsers.ariaLabels.filterOptions",ariaPaginationNav:"Company.CompanyUsers.ariaLabels.paginationNav",ariaPageSizeSelector:"Company.CompanyUsers.ariaLabels.pageSizeSelector",ariaPreviousPageFull:"Company.CompanyUsers.ariaLabels.previousPageFull",ariaNextPageFull:"Company.CompanyUsers.ariaLabels.nextPageFull",ariaCurrentPage:"Company.CompanyUsers.ariaLabels.currentPage",ariaShowingUsers:"Company.CompanyUsers.ariaLabels.showingUsers",ariaDataLoaded:"Company.CompanyUsers.ariaLabels.dataLoaded",ariaDataError:"Company.CompanyUsers.ariaLabels.dataError",ariaPageNavigation:"Company.CompanyUsers.ariaLabels.pageNavigation",manageUser:"Company.CompanyUsers.actions.manage",editUser:"Company.CompanyUsers.actions.edit",ariaManageUser:"Company.CompanyUsers.ariaLabels.manageUser",ariaEditUser:"Company.CompanyUsers.ariaLabels.editUser",addNewUser:"Company.CompanyUsers.actions.addNewUser",noUsersFound:"Company.CompanyUsers.noUsersFound"}),{users:o,loading:U,currentPage:g,pageSize:N,filterType:A,totalItems:P,totalPages:S,announcement:b,canEditUsers:c,handleFilterChange:I,handlePageSizeChange:L,handlePageChange:x,refreshUsers:v}=de({translations:{ariaDataLoaded:n.ariaDataLoaded,ariaDataError:n.ariaDataError}}),T=z(n);T.current=n;const t=u(()=>{v()},[v]);re(t);const d=O(v),y=O(v),h=O(v),{inLineAlertProps:M,handleSetInLineAlert:E}=Z(),B=D(()=>{const e=T.current;return[{key:"id",label:e.idColumn},{key:"name",label:e.nameColumn},{key:"email",label:e.emailColumn},{key:"role",label:e.roleColumn},{key:"team",label:e.teamColumn},{key:"status",label:e.statusColumn},{key:"actions",label:e.actionsColumn}]},[]),k=D(()=>o.map(e=>{const C=le(e.firstName,e.lastName),a=T.current;return{id:ie(e.id),name:C,email:e.email,role:e.role,team:e.team||a.emptyTeam,status:ce(e.status,a),actions:c?w("div",{className:"user-actions",children:[r($,{onClick:()=>y.open(e.id),"aria-label":a.ariaEditUser.replace("{name}",C),className:"edit-user-button",children:a.editUser}),r($,{onClick:()=>d.open(e.id),"aria-label":a.ariaManageUser.replace("{name}",C),className:"manage-user-button",children:a.manageUser})]}):r("span",{className:"no-actions",children:a.emptyActions})}}),[o,c,y,d]),i=D(()=>o.find(e=>e.id===d.selectedId),[o,d.selectedId]);return w("section",{className:l,...m,children:[r("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:b}),r(me,{filterType:A,onFilterChange:I,translations:{showAllUsers:n.showAllUsers,showActiveUsers:n.showActiveUsers,showInactiveUsers:n.showInactiveUsers,ariaFilterOptions:n.ariaFilterOptions}}),M&&M.text?r(K,{className:"company-users__alert",type:M.type||"success",variant:"secondary",heading:M.text,icon:M.icon}):null,w("div",{"aria-busy":U,children:[r(X,{className:"companyUsersTable",columns:B,rowData:k,mobileLayout:"stacked",loading:U,"aria-label":n.ariaUsersTable,summary:n.ariaShowingUsers.replace("{count}",o.length.toString())}),!U&&o.length===0&&r("div",{className:"companyUsersTable__empty",children:n.noUsersFound})]}),o.length>0&&w("nav",{"aria-label":n.ariaPaginationNav,className:"paginationContainer",children:[r("div",{"aria-live":"polite","aria-atomic":"true",children:(()=>{const e=P===0?0:(g-1)*N+1,C=Math.min(g*N,P);return n.itemsRange.replace("{start}",e.toString()).replace("{end}",C.toString()).replace("{total}",P.toString())})()}),S>1&&r(J,{currentPage:g,totalPages:S,onChange:x,className:"paginationButtons"}),w("div",{className:"pageSizeSelector",children:[r("label",{htmlFor:"page-size-select",id:"page-size-label",children:r("span",{children:n.showLabel})}),r(Q,{id:"page-size-select",name:"pageSize",value:N.toString(),options:ye,onChange:L,"aria-labelledby":"page-size-label"})]})]}),c&&r("div",{className:"addUserButtonContainer",children:r(F,{variant:"primary",onClick:()=>h.open(),"aria-label":n.addNewUser,children:n.addNewUser})}),s,h.isOpen&&c&&r(j,{open:h.isOpen,onClose:h.close,size:"medium",children:r(q,{mode:"add",entityId:void 0,parentStructureId:void 0,permissions:p,onSaved:h.close,onCancel:h.close,onError:e=>{E({text:e,type:"error"})},onSuccess:e=>{E({text:e,type:"success"})}})}),y.selectedId&&y.isOpen&&c&&r(j,{open:y.isOpen,onClose:y.close,size:"medium",children:r(q,{mode:"edit",entityId:y.selectedId,parentStructureId:void 0,permissions:p,onSaved:y.close,onCancel:y.close,onError:e=>{E({text:e,type:"error"})},onSuccess:e=>{E({text:e,type:"success"})}})}),d.selectedId&&c&&i&&r(ue,{isOpen:d.isOpen,userId:d.selectedId,userStatus:i.status||"ACTIVE",onClose:d.close,onSuccess:e=>{E({text:e,type:"success"})}})]})};export{Ge as CompanyUsers,Ge as default};
|
|
4
4
|
//# sourceMappingURL=CompanyUsers.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as e,jsxs as R,Fragment as de}from"@dropins/tools/preact-jsx-runtime.js";import{useCallback as $,useMemo as ge,useState as b,useRef as ie,useEffect as Y}from"@dropins/tools/preact-hooks.js";import{classes as he}from"@dropins/tools/lib.js";import{Button as T,Picker as Te,Card as ae,Header as W,InLineAlert as ee,Field as _e,Input as Ee,ProgressSpinner as ce,Modal as Pe,IllustratedMessage as me}from"@dropins/tools/components.js";import{D as se,u as we}from"../chunks/useCompanyRoles.js";import{T as xe,u as Se}from"../chunks/useUserPermissions.js";import{u as Ie}from"../chunks/useInLineAlert.js";import{u as ke}from"../chunks/useCompanyContextListener.js";import{T as Me}from"../chunks/Tree.js";import{f as ue}from"../chunks/company-permissions.js";import{i as De}from"../chunks/isCompanyRoleNameAvailable.js";import{useText as ne}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";import"../chunks/fetchUserPermissions.js";import"../chunks/fetch-error.js";import"../chunks/network-error.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";import"@dropins/tools/preact-compat.js";const Fe=d=>{try{if(/^\d+$/.test(d))return d;const t=atob(d).match(/(\d+)$/);return t?t[1]:d}catch(r){return console.warn("Failed to decode role ID:",d,r),d}},Le=({className:d,roles:r,isLoading:t,canManageRoles:c=!1,onShowCreateForm:n,onShowEditForm:y,onDuplicateRole:w,onDeleteRole:C,totalCount:x=r.length,currentPage:m=1,pageSize:o=se,onPageChange:h,onPageSizeChange:k,children:F,...L})=>{const N=ne({addNewRole:"Company.RoleAndPermissionTable.addNewRole",columnId:"Company.RoleAndPermissionTable.columnId",columnRole:"Company.RoleAndPermissionTable.columnRole",columnUsers:"Company.RoleAndPermissionTable.columnUsers",columnActions:"Company.RoleAndPermissionTable.columnActions",editButton:"Company.RoleAndPermissionTable.editButton",duplicateButton:"Company.RoleAndPermissionTable.duplicateButton",deleteButton:"Company.RoleAndPermissionTable.deleteButton",viewOnlyLabel:"Company.RoleAndPermissionTable.viewOnlyLabel",systemRoleLabel:"Company.RoleAndPermissionTable.systemRoleLabel",itemCount:"Company.RoleAndPermissionTable.itemCount",show:"Company.RoleAndPermissionTable.show",perPage:"Company.RoleAndPermissionTable.perPage"}),S=[{key:"id",label:N.columnId||"ID"},{key:"name",label:N.columnRole||"Role"},{key:"usersCount",label:N.columnUsers||"Users"},{key:"actions",label:N.columnActions||"Actions"}],X=$(s=>c&&s.id!=="0",[c]),q=$(s=>c&&s.id!=="0",[c]),_=$(s=>c&&s.id!=="0"&&x>1,[c,x]),M=$(s=>{const v=[];return X(s)&&v.push(e(T,{variant:"tertiary",size:"medium",onClick:()=>y(s.id),className:"role-action-button",children:N.editButton||"Edit"},"edit")),q(s)&&w&&v.push(e(T,{variant:"tertiary",size:"medium",onClick:()=>w(s.id),className:"role-action-button",children:N.duplicateButton||"Duplicate"},"duplicate")),_(s)&&C&&v.push(e(T,{variant:"tertiary",size:"medium",onClick:()=>C(s.id),className:"role-action-button",children:N.deleteButton||"Delete"},"delete")),v.length===0?c?e("span",{className:"no-actions",children:N.systemRoleLabel||"System Role"}):null:e("div",{className:"role-actions-container",children:v.map((u,g)=>R("span",{className:"role-action-wrapper",children:[g>0&&e("span",{className:"separator",children:"|"}),u]},g))})},[X,q,_,y,w,C,N,c]),O=ge(()=>r.map(s=>({id:Fe(s.id),name:s.name,usersCount:s.usersCount,actions:e("div",{className:"roles-actions",children:M(s)})})),[r,M]),D=[se,30,50,100,200].map(s=>({value:s.toString(),label:s.toString(),text:s.toString()})),f=Math.ceil(x/o),I=m<f,U=m>1,E=(m-1)*o,A=E+o,H=$(()=>{const s=[];if(f<=7)for(let u=1;u<=f;u++)s.push(u);else if(s.push(1),m<=3){for(let u=2;u<=5;u++)s.push(u);s.push("ellipsis-end"),s.push(f)}else if(m>=f-2){s.push("ellipsis-start");for(let u=f-4;u<=f;u++)s.push(u)}else{s.push("ellipsis-start");for(let u=m-1;u<=m+1;u++)s.push(u);s.push("ellipsis-end"),s.push(f)}return s},[m,f]);return R("div",{...L,className:he(["company-management-role-and-permission-table",d]),"data-testid":"role-and-permission-table",children:[e("div",{className:"roles-table-container",children:e(xe,{columns:S,rowData:O,mobileLayout:"stacked",loading:t,skeletonRowCount:10})}),R("div",{className:"table-footer",children:[e("div",{className:"table-footer-left",children:R("span",{className:"item-count",children:["Items ",E+1," to ",Math.min(A,x)," of ",x," total"]})}),f>1&&e("div",{className:"table-footer-center",children:R("div",{className:"page-navigation",children:[e(T,{variant:"tertiary",size:"medium",onClick:()=>h==null?void 0:h(m-1),disabled:!U,className:"page-nav-button",children:"<"}),H().map(s=>typeof s=="string"?e("span",{className:"page-ellipsis",children:"..."},s):e(T,{variant:"tertiary",size:"medium",onClick:()=>h==null?void 0:h(s),disabled:s===m,className:s===m?"page-num-button active":"page-num-button",children:s},s)),e(T,{variant:"tertiary",size:"medium",onClick:()=>h==null?void 0:h(m+1),disabled:!I,className:"page-nav-button",children:">"})]})}),e("div",{className:"table-footer-right",children:R("div",{className:"pagination-controls",children:[e("span",{className:"pagination-label",children:N.show||"Show"}),e(Te,{value:o.toString(),onChange:s=>{const v=s.target;k==null||k(parseInt(v.value,10))},options:D,className:"page-size-picker"}),e("span",{className:"pagination-label",children:N.perPage||"per page"})]})})]}),c&&e("div",{className:"add-role-section",children:e(T,{variant:"primary",onClick:n,children:N.addNewRole||"Add New Role"})}),F]})},Oe={MAX_LENGTH:40},oe=d=>(typeof d=="string"?d:String(d||"")).trim().slice(0,Oe.MAX_LENGTH),pe=({mode:d,role:r,aclResources:t,existingRoleNames:c=[],loading:n=!1,onSubmit:y,onCancel:w,inLineAlertProps:C,prefillName:x,prefillPermissions:m})=>{const o=ne({createTitle:"Company.EditRoleAndPermission.createTitle",editTitle:"Company.EditRoleAndPermission.editTitle",roleInformation:"Company.EditRoleAndPermission.roleInformation",roleName:"Company.EditRoleAndPermission.roleName",rolePermissions:"Company.EditRoleAndPermission.rolePermissions",permissionsDescription:"Company.EditRoleAndPermission.permissionsDescription",expandAll:"Company.EditRoleAndPermission.expandAll",collapseAll:"Company.EditRoleAndPermission.collapseAll",cancel:"Company.shared.buttons.cancel",saveRole:"Company.EditRoleAndPermission.saveRole",saving:"Company.shared.buttons.saving",roleNameRequired:"Company.shared.validation.roleNameRequired",roleNameExists:"Company.shared.validation.roleNameExists"}),[h,k]=b({name:(r==null?void 0:r.name)||""}),[F,L]=b({}),[N,S]=b({}),[X,q]=b(!1),[_,M]=b(!1),[O,D]=b([]),[f,I]=b(new Set),[U,E]=b(new Set),A=ie(null),H=ie(""),s=ie(!1);Y(()=>{if(!s.current){if(s.current=!0,d==="edit"&&r){if(k({name:r.name}),r.permissions&&r.permissions.length>0){const i=ue(r.permissions);E(new Set(i))}}else if(d==="create")if(k({name:x??""}),m&&m.length>0){const a=ue(m);E(new Set(a))}else E(new Set)}},[d,r,x,m]),Y(()=>{if(t.length>0){const i=Ue(t);D(i);const a=i.filter(p=>!p.parentId).map(p=>p.id);I(new Set(a))}},[t]),Y(()=>()=>{A.current&&clearTimeout(A.current)},[]);const v=$(i=>{const a=oe(i);return a?(d==="edit"&&r?c.filter(z=>z!==r.name):c).includes(a)?o.roleNameExists:null:o.roleNameRequired||"This is a required field."},[d,r,c,o.roleNameRequired,o.roleNameExists]),u=$(async i=>{const a=oe(i),p=v(a);if(p)return p;if(d==="edit"&&r&&a===r.name)return null;try{return q(!0),await De({name:a})?null:o.roleNameExists}catch(z){return console.error("Role name validation failed:",z),null}finally{q(!1)}},[d,r,o.roleNameExists,v]),g=$(i=>{A.current!==null&&clearTimeout(A.current),i!==H.current&&(A.current=window.setTimeout(async()=>{const a=await u(i);L(a?p=>({...p,name:a}):p=>({...p,name:""})),H.current=i},500))},[u]),G=()=>{const i={};let a=!0;const p=v(h.name);return p&&(i.name=p,a=!1),L(i),a},B=i=>{const a=typeof i=="string"?i:i.target.value;k(p=>({...p,name:a})),F.name&&L(p=>({...p,name:""})),g(a)},V=()=>{S(i=>({...i,name:!0})),A.current&&(clearTimeout(A.current),A.current=null)},Z=()=>{const i=new Set(O.map(a=>a.id));I(i)},te=()=>{I(new Set)},re=async i=>{if(i.preventDefault(),!_&&(S({name:!0}),!!G()&&!F.name)){M(!0);try{const a={name:oe(h.name),permissions:Array.from(U)};y&&await y(a)}catch(a){console.error("Form submission failed:",a)}finally{M(!1)}}},J=d==="create"?o.createTitle:o.editTitle;return R(ae,{variant:"secondary",className:"edit-role-and-permission",children:[e(W,{level:2,size:"large",title:J,divider:!1,className:"edit-role-and-permission__title"}),(C==null?void 0:C.text)&&e(ee,{className:"edit-role-and-permission__notification",type:C.type,variant:"secondary",heading:C.text,"data-testid":"editRoleInLineAlert"}),R("form",{className:"edit-role-and-permission-form",onSubmit:re,children:[R("div",{className:"edit-role-and-permission__section",children:[e(W,{level:3,size:"medium",title:o.roleInformation||"Role Information",divider:!1,className:"edit-role-and-permission__section-title"}),e(_e,{label:o.roleName||"Role Name",required:!0,error:N.name&&F.name?F.name:void 0,children:e(Ee,{type:"text",name:"roleName",value:h.name,onChange:B,onBlur:V,disabled:n||_,"data-testid":"roleNameInput",placeholder:o.roleName||"Role Name",variant:"primary",size:"medium",maxLength:40})}),X&&e("div",{className:"edit-role-and-permission__validation-spinner",children:e(ce,{size:"medium"})})]}),R("div",{className:"edit-role-and-permission__section",children:[e(W,{level:3,size:"medium",title:o.rolePermissions,divider:!1,className:"edit-role-and-permission__section-title"}),e(ee,{type:"info",variant:"secondary",heading:o.permissionsDescription,className:"edit-role-and-permission__permissions-description"}),R("div",{className:"edit-role-and-permission__tree-controls",children:[e(T,{type:"button",variant:"tertiary",onClick:Z,disabled:n||_,children:o.expandAll}),e(T,{type:"button",variant:"tertiary",onClick:te,disabled:n||_,children:o.collapseAll})]}),e("div",{className:"edit-role-and-permission__tree-container",role:"group","aria-label":o.rolePermissions,children:O.length>0?e(Me,{items:O,expandedIds:f,onExpandedChange:I,checkedIds:U,onCheckedChange:E,preserveOrder:!0,isCheckable:()=>!0,biDirectionalChecking:!0,renderNode:({item:i,expanded:a,hasChildren:p,toggle:z,checkbox:Q})=>R("div",{className:"edit-role-and-permission__tree-node",children:[p?e("button",{type:"button",className:"edit-role-and-permission__tree-expander",onClick:K=>{K.preventDefault(),K.stopPropagation(),z()},"aria-label":a?`Collapse ${i.label}`:`Expand ${i.label}`,children:a?"−":"+"}):e("span",{className:"edit-role-and-permission__tree-spacer"}),Q&&Q(),e("span",{className:"edit-role-and-permission__tree-label",children:i.label})]})}):e("div",{className:"edit-role-and-permission__tree-loading",children:"Loading permissions..."})})]}),R("div",{className:"edit-role-and-permission__actions",children:[e(T,{type:"button",variant:"secondary",onClick:w,disabled:n||_,children:o.cancel}),e(T,{type:"submit",variant:"primary",disabled:n||_,children:n||_?o.saving:o.saveRole})]})]}),(n||_)&&R("div",{className:"edit-role-and-permission__loading-overlay",children:[e(ce,{size:"large"}),e("div",{className:"edit-role-and-permission__loading-text",children:o.saving})]})]})},Ue=d=>{const r=[],t=(n,y)=>{r.push({id:n.id,parentId:y||null,label:n.text}),n.children&&[...n.children].sort((C,x)=>C.sortOrder-x.sortOrder).forEach(C=>{t(C,n.id)})};return[...d].sort((n,y)=>n.sortOrder-y.sortOrder).forEach(n=>t(n)),r},Be=({isOpen:d,hasUsers:r=!1,onConfirm:t,onCancel:c})=>{const n=ne({deleteModalTitle:"Company.RolesAndPermissions.deleteModal.title",deleteModalMessage:"Company.RolesAndPermissions.deleteModal.message",deleteModalConfirm:"Company.RolesAndPermissions.deleteModal.confirm",deleteModalCancel:"Company.RolesAndPermissions.deleteModal.cancel",cannotDeleteModalTitle:"Company.RolesAndPermissions.cannotDeleteModal.title",cannotDeleteModalMessage:"Company.RolesAndPermissions.cannotDeleteModal.message",cannotDeleteModalOk:"Company.RolesAndPermissions.cannotDeleteModal.ok"});if(!d)return null;const y=r?n.cannotDeleteModalMessage||"This role cannot be deleted because users are assigned to it. Reassign the users to another role to continue.":n.deleteModalMessage||"This action cannot be undone. Are you sure you want to delete this role?";return R(Pe,{open:!0,onClose:c,title:e(de,{children:r?n.cannotDeleteModalTitle||"Cannot Delete Role":n.deleteModalTitle||"Delete This Role?"}),size:"small",className:"delete-role-modal",children:[e("div",{className:"delete-role-modal__content",children:e("p",{children:y})}),e("div",{className:"delete-role-modal__actions",children:r?e(T,{variant:"primary",onClick:t,className:"delete-role-modal__ok-btn",children:n.cannotDeleteModalOk||"OK"}):R(de,{children:[e(T,{variant:"secondary",onClick:c,className:"delete-role-modal__cancel-btn",children:n.deleteModalCancel||"Cancel"}),e(T,{variant:"primary",onClick:t,className:"delete-role-modal__confirm-btn",children:n.deleteModalConfirm||"Delete"})]})})]})},is=({className:d,withHeader:r=!1})=>{const t=ne({containerTitle:"Company.RolesAndPermissions.containerTitle",noAccessTitle:"Company.RolesAndPermissions.noAccess.title",noAccessMessage:"Company.RolesAndPermissions.noAccess.message",errorTitle:"Company.RolesAndPermissions.error.title",errorMessage:"Company.RolesAndPermissions.error.message",deleteRoleSuccess:"Company.RoleAndPermissionTable.deleteRole.success",createSuccess:"Company.RolesAndPermissions.alerts.createSuccess",createError:"Company.RolesAndPermissions.alerts.createError",createErrorPermissions:"Company.RolesAndPermissions.alerts.createErrorPermissions",updateSuccess:"Company.RolesAndPermissions.alerts.updateSuccess",updateError:"Company.RolesAndPermissions.alerts.updateError",updateErrorPermissions:"Company.RolesAndPermissions.alerts.updateErrorPermissions",deleteError:"Company.RolesAndPermissions.alerts.deleteError"}),{inLineAlertProps:c,handleSetInLineAlert:n}=Ie(),{permissions:y,loading:w,error:C}=Se(),x=(y==null?void 0:y.canViewRoles)??!1,m=(y==null?void 0:y.canManageRoles)??!1,o=x||m,{roles:h,aclResources:k,isLoading:F,isCreating:L,isUpdating:N,error:S,createRole:X,updateRole:q,deleteRole:_,clearError:M,refresh:O}=we(se,o,!0),[D,f]=b(!1),[I,U]=b(!1),[E,A]=b(null),[H,s]=b(1),[v,u]=b(se),[g,G]=b(null),[B,V]=b(null);Y(()=>()=>{S&&M(),V(null)},[S,M]);const[Z,te]=b(0);ke(()=>{s(1),I&&(U(!1),A(null)),G(null),M(),te(l=>l+1)},{eager:!0}),Y(()=>{D&&!w&&!m&&(f(!1),V(null))},[D,w,m]),Y(()=>{Z!==0&&(w||o&&O())},[Z,o,O,w]);const re=h.length,J=(H-1)*v,i=J+v,a=h.slice(J,i);if(w&&!D&&!I)return e("div",{className:"roles-and-permissions-container","data-testid":"rolesAndPermissionsLoader",children:e("div",{children:"Loading..."})});if(C&&!D&&!I)return e("div",{className:"roles-and-permissions-container",children:e(ae,{variant:"secondary",className:"roles-and-permissions-error",children:e("div",{className:"roles-and-permissions-error__wrapper",children:e("div",{className:"roles-and-permissions-error__content",children:e(me,{heading:t.errorTitle||"Error Loading Permissions",message:e("p",{children:t.errorMessage||"An error occurred while loading your permissions. Please try again."})})})})})});if(!o&&!D&&!I)return e("div",{className:"roles-and-permissions-container",children:e(ae,{variant:"secondary",className:"roles-and-permissions-no-access",children:e("div",{className:"roles-and-permissions-no-access__wrapper",children:e("div",{className:"roles-and-permissions-no-access__content",children:e(me,{heading:t.noAccessTitle||"Access Restricted",message:e("p",{children:t.noAccessMessage||"You don't have permission to view roles and permissions. Please contact your company administrator."})})})})})});const p=l=>{s(l)},z=l=>{u(l),s(1)},Q=()=>{V(null),f(!0)},K=()=>{V(null),f(!1)},ye=l=>{A(l),U(!0)},le=()=>{U(!1),A(null)},fe=l=>{const P=h.find(j=>j.id===l);P&&(V({name:`${P.name} - Duplicated`,permissions:P.permissions||[]}),f(!0))},Re=async l=>{try{if(await X({name:l.name,permissions:l.permissions})){const j=t.createSuccess?t.createSuccess.replace("{roleName}",l.name):`Role "${l.name}" created successfully!`;n({type:"success",text:j}),K()}else n({type:"error",text:t.createError||"Failed to create role. Please try again."})}catch{n({type:"error",text:t.createErrorPermissions||"Failed to create role. Please check your permissions and try again."})}},Ne=async l=>{if(E)try{if(await q({id:E,name:l.name,permissions:l.permissions})){const j=t.updateSuccess?t.updateSuccess.replace("{roleName}",l.name):`Role "${l.name}" updated successfully!`;n({type:"success",text:j}),le()}else n({type:"error",text:t.updateError||"Failed to update role. Please try again."})}catch{n({type:"error",text:t.updateErrorPermissions||"Failed to update role. Please check your permissions and try again."})}},ve=l=>{const P=h.find(Ae=>Ae.id===l);if(!P)return;const j=P.usersCount>0;G({id:l,name:P.name,hasUsers:j})},be=async()=>{if(g){if(g.hasUsers){G(null);return}try{if(await _(g.id)){const P=t.deleteRoleSuccess?t.deleteRoleSuccess.replace("{roleName}",g.name||"Unknown Role"):`You have deleted role "${g.name||"Unknown Role"}".`;n({type:"success",text:P})}else n({type:"error",text:t.deleteError||"Failed to delete role. Please try again."})}catch{n({type:"error",text:t.deleteError||"Failed to delete role. Please try again."})}finally{G(null)}}},Ce=()=>G(null);return e("div",{className:"roles-and-permissions-container",children:R("div",{className:he(["roles-and-permissions",d]),children:[r?e(W,{title:t.containerTitle,divider:!1,className:"roles-and-permissions__title"}):null,S&&e(ee,{type:"error",heading:t.errorTitle||"Error",description:t.errorMessage||"An error occurred while loading roles and permissions.",onDismiss:M}),c&&c.text&&e(ee,{type:c.type||"success",heading:c.text,icon:c.icon}),D?e(pe,{mode:"create",aclResources:k,existingRoleNames:h.map(l=>l.name),loading:L,onSubmit:Re,onCancel:()=>{V(null),K()},inLineAlertProps:S?{type:"error",text:S}:void 0,prefillName:B==null?void 0:B.name,prefillPermissions:B==null?void 0:B.permissions},"create-role-form"):I&&E?e(pe,{mode:"edit",role:h.find(l=>l.id===E),aclResources:k,existingRoleNames:h.map(l=>l.name),loading:N,onSubmit:Ne,onCancel:le,inLineAlertProps:S?{type:"error",text:S}:void 0},`edit-role-form-${E}`):e(Le,{roles:a,isLoading:F,canManageRoles:m,onShowCreateForm:Q,onShowEditForm:ye,onDuplicateRole:fe,onDeleteRole:ve,totalCount:re,currentPage:H,pageSize:v,onPageChange:p,onPageSizeChange:z}),e(Be,{isOpen:!!g,hasUsers:g==null?void 0:g.hasUsers,onConfirm:be,onCancel:Ce})]})})};export{is as RolesAndPermissions,is as default};
|
|
3
|
+
import{jsx as e,jsxs as g,Fragment as Ce}from"@dropins/tools/preact-jsx-runtime.js";import{useMemo as ce,useCallback as K,useState as f,useRef as ie,useEffect as W}from"@dropins/tools/preact-hooks.js";import{classes as be}from"@dropins/tools/lib.js";import{ActionButton as le,Pagination as Be,ProgressSpinner as me,Picker as Oe,Button as X,Card as ue,Header as ne,InLineAlert as te,Field as Ue,Input as Ve,Modal as $e,IllustratedMessage as ge}from"@dropins/tools/components.js";import{D as re,u as qe}from"../chunks/useCompanyRoles.js";import{T as ze,u as He}from"../chunks/useUserPermissions.js";import{u as Ge}from"../chunks/useInLineAlert.js";import{u as je}from"../chunks/useCompanyContextListener.js";import{T as Xe}from"../chunks/Tree.js";import{f as ve}from"../chunks/company-permissions.js";import{i as Ye}from"../chunks/isCompanyRoleNameAvailable.js";import{useText as oe}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";import"../chunks/fetchUserPermissions.js";import"../chunks/fetch-error.js";import"../chunks/network-error.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/event-bus.js";import"@dropins/tools/preact-compat.js";var Je={};const Ke=d=>{try{if(/^\d+$/.test(d))return d;const n=atob(d).match(/(\d+)$/);return n?n[1]:d}catch(a){return console.warn("Failed to decode role ID:",d,a),d}},We=({className:d,roles:a,isLoading:n,canManageRoles:c=!1,onShowCreateForm:s,onShowEditForm:p,onDuplicateRole:b,onDeleteRole:R,totalCount:P=a.length,currentPage:T=1,pageSize:i=re,onPageChange:N,onPageSizeChange:F,onSortChange:I,sortColumn:v,sortDirection:x,children:_,...Z})=>{const h=oe({addNewRole:"Company.RoleAndPermissionTable.addNewRole",columnId:"Company.RoleAndPermissionTable.columnId",columnRole:"Company.RoleAndPermissionTable.columnRole",columnUsers:"Company.RoleAndPermissionTable.columnUsers",columnActions:"Company.RoleAndPermissionTable.columnActions",editButton:"Company.RoleAndPermissionTable.editButton",duplicateButton:"Company.RoleAndPermissionTable.duplicateButton",deleteButton:"Company.RoleAndPermissionTable.deleteButton",viewOnlyLabel:"Company.RoleAndPermissionTable.viewOnlyLabel",systemRoleLabel:"Company.RoleAndPermissionTable.systemRoleLabel",itemCount:"Company.RoleAndPermissionTable.itemCount",itemsRange:"Company.RoleAndPermissionTable.itemsRange",show:"Company.RoleAndPermissionTable.show",perPage:"Company.RoleAndPermissionTable.perPage"}),E=typeof process<"u"&&Je.JEST_WORKER_ID!==void 0,S=!!(I&&x&&v)&&!E,$=ce(()=>[{key:"id",label:h.columnId||"ID",...S&&{sortBy:v==="id"?x:!0}},{key:"name",label:h.columnRole||"Role",...S&&{sortBy:v==="name"?x:!0}},{key:"usersCount",label:h.columnUsers||"Users",...S&&{sortBy:v==="usersCount"?x:!0}},{key:"actions",label:h.columnActions||"Actions"}],[h,v,x,S]),M=K(r=>c&&r.id!=="0",[c]),O=K(r=>c&&r.id!=="0",[c]),A=K(r=>c&&r.id!=="0"&&P>1,[c,P]),U=K(r=>{const y=[];return M(r)&&y.push(e(le,{onClick:()=>p(r.id),className:"role-action-button",children:h.editButton||"Edit"},"edit")),O(r)&&b&&y.push(e(le,{onClick:()=>b(r.id),className:"role-action-button",children:h.duplicateButton||"Duplicate"},"duplicate")),A(r)&&R&&y.push(e(le,{onClick:()=>R(r.id),className:"role-action-button",children:h.deleteButton||"Delete"},"delete")),y.length===0?c?e("span",{className:"no-actions",children:h.systemRoleLabel||"System Role"}):null:e("div",{className:"role-actions-container",children:y.map((B,z)=>e("span",{className:"role-action-wrapper",children:B},z))})},[M,O,A,p,b,R,h,c]),w=ce(()=>a.map(r=>({id:Ke(r.id),name:r.name,usersCount:r.usersCount,actions:e("div",{className:"roles-actions",children:U(r)})})),[a,U]),C=[re,20,50,100].map(r=>({value:r.toString(),label:r.toString(),text:r.toString()})),q=Math.ceil(P/i),L=(T-1)*i,V=L+i;return g("div",{...Z,className:be(["company-management-role-and-permission-table",d]),"data-testid":"role-and-permission-table",children:[e("div",{className:"roles-table-container",children:e(ze,{columns:$,rowData:w,mobileLayout:"stacked",loading:n,skeletonRowCount:10,onSortChange:(r,y)=>{let B;y===!0?v===r&&x?B=x==="asc"?"desc":"asc":B="asc":B=y,I==null||I(r,B)}})}),g("div",{className:"table-footer",children:[e("div",{className:"table-footer-left",children:e("span",{className:"item-count",children:(h.itemsRange||"Items {start}-{end} of {total}").replace("{start}",String(L+1)).replace("{end}",String(Math.min(V,P))).replace("{total}",String(P))})}),q>1&&e("div",{className:"table-footer-center",children:e(Be,{currentPage:T,totalPages:q,onChange:r=>N==null?void 0:N(r)})}),e("div",{className:"table-footer-right",children:g("div",{className:"pagination-controls",children:[e("span",{className:"pagination-label",children:h.show||"Show"}),n?e("div",{className:"page-size-loading",children:e(me,{size:"small"})}):e(Oe,{value:i.toString(),onChange:r=>{const y=r.target;F==null||F(parseInt(y.value,10))},options:C,className:"page-size-picker"})]})})]}),c&&e("div",{className:"add-role-section",children:e(X,{variant:"primary",onClick:s,children:h.addNewRole||"Add New Role"})}),_]})},Ze={MAX_LENGTH:40},de=d=>(typeof d=="string"?d:String(d||"")).trim().slice(0,Ze.MAX_LENGTH),Ae=({mode:d,role:a,aclResources:n,existingRoleNames:c=[],loading:s=!1,onSubmit:p,onCancel:b,inLineAlertProps:R,prefillName:P,prefillPermissions:T})=>{const i=oe({createTitle:"Company.EditRoleAndPermission.createTitle",editTitle:"Company.EditRoleAndPermission.editTitle",roleInformation:"Company.EditRoleAndPermission.roleInformation",roleName:"Company.EditRoleAndPermission.roleName",rolePermissions:"Company.EditRoleAndPermission.rolePermissions",permissionsDescription:"Company.EditRoleAndPermission.permissionsDescription",expandAll:"Company.EditRoleAndPermission.expandAll",collapseAll:"Company.EditRoleAndPermission.collapseAll",cancel:"Company.shared.buttons.cancel",saveRole:"Company.EditRoleAndPermission.saveRole",saving:"Company.shared.buttons.saving",roleNameRequired:"Company.shared.validation.roleNameRequired",roleNameExists:"Company.shared.validation.roleNameExists"}),[N,F]=f({name:(a==null?void 0:a.name)||""}),[I,v]=f({}),[x,_]=f({}),[Z,h]=f(!1),[E,S]=f(!1),[$,M]=f([]),[O,A]=f(new Set),[U,w]=f(new Set),C=ie(null),q=ie(""),L=ie(!1);W(()=>{if(!L.current){if(L.current=!0,d==="edit"&&a){if(F({name:a.name}),a.permissions&&a.permissions.length>0){const o=ve(a.permissions);w(new Set(o))}}else if(d==="create")if(F({name:P??""}),T&&T.length>0){const l=ve(T);w(new Set(l))}else w(new Set)}},[d,a,P,T]),W(()=>{if(n.length>0){const o=Qe(n);M(o);const l=o.filter(m=>!m.parentId).map(m=>m.id);A(new Set(l))}},[n]),W(()=>()=>{C.current&&clearTimeout(C.current)},[]);const V=K(o=>{const l=de(o);return l?(d==="edit"&&a?c.filter(j=>j!==a.name):c).includes(l)?i.roleNameExists:null:i.roleNameRequired||"This is a required field."},[d,a,c,i.roleNameRequired,i.roleNameExists]),r=K(async o=>{const l=de(o),m=V(l);if(m)return m;if(d==="edit"&&a&&l===a.name)return null;try{return h(!0),await Ye({name:l})?null:i.roleNameExists}catch(j){return console.error("Role name validation failed:",j),null}finally{h(!1)}},[d,a,i.roleNameExists,V]),y=K(o=>{C.current!==null&&clearTimeout(C.current),o!==q.current&&(C.current=window.setTimeout(async()=>{const l=await r(o);v(l?m=>({...m,name:l}):m=>({...m,name:""})),q.current=o},500))},[r]),B=()=>{const o={};let l=!0;const m=V(N.name);return m&&(o.name=m,l=!1),v(o),l},z=o=>{const l=typeof o=="string"?o:o.target.value;F(m=>({...m,name:l})),I.name&&v(m=>({...m,name:""})),y(l)},ae=()=>{_(o=>({...o,name:!0})),C.current&&(clearTimeout(C.current),C.current=null)},k=()=>{const o=new Set($.map(l=>l.id));A(o)},Y=()=>{A(new Set)},H=async o=>{if(o.preventDefault(),!E&&(_({name:!0}),!!B()&&!I.name)){S(!0);try{const l={name:de(N.name),permissions:Array.from(U)};p&&await p(l)}catch(l){console.error("Form submission failed:",l)}finally{S(!1)}}},G=d==="create"?i.createTitle:i.editTitle;return g(ue,{variant:"secondary",className:"edit-role-and-permission",children:[e(ne,{level:2,size:"large",title:G,divider:!1,className:"edit-role-and-permission__title"}),(R==null?void 0:R.text)&&e(te,{className:"edit-role-and-permission__notification",type:R.type,variant:"secondary",heading:R.text,"data-testid":"editRoleInLineAlert"}),g("form",{className:"edit-role-and-permission-form",onSubmit:H,children:[g("div",{className:"edit-role-and-permission__section",children:[e(ne,{level:3,size:"medium",title:i.roleInformation||"Role Information",divider:!1,className:"edit-role-and-permission__section-title"}),e(Ue,{label:i.roleName||"Role Name",required:!0,error:x.name&&I.name?I.name:void 0,children:e(Ve,{type:"text",name:"roleName",value:N.name,onChange:z,onBlur:ae,disabled:s||E,"data-testid":"roleNameInput",placeholder:i.roleName||"Role Name",variant:"primary",size:"medium",maxLength:40})}),Z&&e("div",{className:"edit-role-and-permission__validation-spinner",children:e(me,{size:"medium"})})]}),g("div",{className:"edit-role-and-permission__section",children:[e(ne,{level:3,size:"medium",title:i.rolePermissions,divider:!1,className:"edit-role-and-permission__section-title"}),e(te,{type:"info",variant:"secondary",heading:i.permissionsDescription,className:"edit-role-and-permission__permissions-description"}),g("div",{className:"edit-role-and-permission__tree-controls",children:[e(X,{type:"button",variant:"tertiary",onClick:k,disabled:s||E,children:i.expandAll}),e(X,{type:"button",variant:"tertiary",onClick:Y,disabled:s||E,children:i.collapseAll})]}),e("div",{className:"edit-role-and-permission__tree-container",role:"group","aria-label":i.rolePermissions,children:$.length>0?e(Xe,{items:$,expandedIds:O,onExpandedChange:A,checkedIds:U,onCheckedChange:w,preserveOrder:!0,isCheckable:()=>!0,biDirectionalChecking:!0,renderNode:({item:o,expanded:l,hasChildren:m,toggle:j,checkbox:Q})=>g("div",{className:"edit-role-and-permission__tree-node",children:[m?e("button",{type:"button",className:"edit-role-and-permission__tree-expander",onClick:se=>{se.preventDefault(),se.stopPropagation(),j()},"aria-label":l?`Collapse ${o.label}`:`Expand ${o.label}`,children:l?"−":"+"}):e("span",{className:"edit-role-and-permission__tree-spacer"}),Q&&Q(),e("span",{className:"edit-role-and-permission__tree-label",children:o.label})]})}):e("div",{className:"edit-role-and-permission__tree-loading",children:"Loading permissions..."})})]}),g("div",{className:"edit-role-and-permission__actions",children:[e(X,{type:"button",variant:"secondary",onClick:b,disabled:s||E,children:i.cancel}),e(X,{type:"submit",variant:"primary",disabled:s||E,children:s||E?i.saving:i.saveRole})]})]}),(s||E)&&g("div",{className:"edit-role-and-permission__loading-overlay",children:[e(me,{size:"large"}),e("div",{className:"edit-role-and-permission__loading-text",children:i.saving})]})]})},Qe=d=>{const a=[],n=(s,p)=>{a.push({id:s.id,parentId:p||null,label:s.text}),s.children&&[...s.children].sort((R,P)=>R.sortOrder-P.sortOrder).forEach(R=>{n(R,s.id)})};return[...d].sort((s,p)=>s.sortOrder-p.sortOrder).forEach(s=>n(s)),a},es=({isOpen:d,hasUsers:a=!1,onConfirm:n,onCancel:c})=>{const s=oe({deleteModalTitle:"Company.RolesAndPermissions.deleteModal.title",deleteModalMessage:"Company.RolesAndPermissions.deleteModal.message",deleteModalConfirm:"Company.RolesAndPermissions.deleteModal.confirm",deleteModalCancel:"Company.RolesAndPermissions.deleteModal.cancel",cannotDeleteModalTitle:"Company.RolesAndPermissions.cannotDeleteModal.title",cannotDeleteModalMessage:"Company.RolesAndPermissions.cannotDeleteModal.message",cannotDeleteModalOk:"Company.RolesAndPermissions.cannotDeleteModal.ok"});if(!d)return null;const p=a?s.cannotDeleteModalMessage||"This role cannot be deleted because users are assigned to it. Reassign the users to another role to continue.":s.deleteModalMessage||"This action cannot be undone. Are you sure you want to delete this role?";return g($e,{open:!0,onClose:c,title:e(Ce,{children:a?s.cannotDeleteModalTitle||"Cannot Delete Role":s.deleteModalTitle||"Delete This Role?"}),size:"small",className:"delete-role-modal",children:[e("div",{className:"delete-role-modal__content",children:e("p",{children:p})}),e("div",{className:"delete-role-modal__actions",children:a?e(X,{variant:"primary",onClick:n,className:"delete-role-modal__ok-btn",children:s.cannotDeleteModalOk||"OK"}):g(Ce,{children:[e(X,{variant:"secondary",onClick:c,className:"delete-role-modal__cancel-btn",children:s.deleteModalCancel||"Cancel"}),e(X,{variant:"primary",onClick:n,className:"delete-role-modal__confirm-btn",children:s.deleteModalConfirm||"Delete"})]})})]})},gs=({className:d,withHeader:a=!1})=>{const n=oe({containerTitle:"Company.RolesAndPermissions.containerTitle",noAccessTitle:"Company.RolesAndPermissions.noAccess.title",noAccessMessage:"Company.RolesAndPermissions.noAccess.message",errorTitle:"Company.RolesAndPermissions.error.title",errorMessage:"Company.RolesAndPermissions.error.message",deleteRoleSuccess:"Company.RoleAndPermissionTable.deleteRole.success",createSuccess:"Company.RolesAndPermissions.alerts.createSuccess",createError:"Company.RolesAndPermissions.alerts.createError",createErrorPermissions:"Company.RolesAndPermissions.alerts.createErrorPermissions",updateSuccess:"Company.RolesAndPermissions.alerts.updateSuccess",updateError:"Company.RolesAndPermissions.alerts.updateError",updateErrorPermissions:"Company.RolesAndPermissions.alerts.updateErrorPermissions",deleteError:"Company.RolesAndPermissions.alerts.deleteError"}),{inLineAlertProps:c,handleSetInLineAlert:s}=Ge(),{permissions:p,loading:b,error:R}=He(),P=(p==null?void 0:p.canViewRoles)??!1,T=(p==null?void 0:p.canManageRoles)??!1,i=P||T,{roles:N,aclResources:F,isLoading:I,isCreating:v,isUpdating:x,error:_,createRole:Z,updateRole:h,deleteRole:E,clearError:S,refresh:$}=qe(re,i,!0),[M,O]=f(!1),[A,U]=f(!1),[w,C]=f(null),[q,L]=f(1),[V,r]=f(re),[y,B]=f("id"),[z,ae]=f("asc"),[k,Y]=f(null),[H,G]=f(null);W(()=>()=>{_&&S(),G(null)},[_,S]);const[o,l]=f(0);je(()=>{L(1),A&&(U(!1),C(null)),Y(null),S(),l(t=>t+1)},{eager:!0}),W(()=>{M&&!b&&!T&&(O(!1),G(null))},[M,b,T]),W(()=>{o!==0&&(b||i&&$())},[o,i,$,b]);const m=ce(()=>{const t=[...N];return t.sort((u,D)=>{let J,ee;if(y==="id"){const ye=Le=>{try{const fe=atob(Le),Re=fe.match(/role\/(\d+)/);if(Re)return parseInt(Re[1],10);const Ne=parseInt(fe,10);return isNaN(Ne)?0:Ne}catch{return 0}};J=ye(u.id),ee=ye(D.id)}else if(y==="name")J=u.name.toLowerCase(),ee=D.name.toLowerCase();else if(y==="usersCount")J=u.usersCount||0,ee=D.usersCount||0;else return 0;return J<ee?z==="asc"?-1:1:J>ee?z==="asc"?1:-1:0}),t},[N,y,z]),j=m.length,Q=(q-1)*V,se=Q+V,Pe=m.slice(Q,se);if(b&&!M&&!A)return e("div",{className:"roles-and-permissions-container","data-testid":"rolesAndPermissionsLoader",children:e("div",{children:"Loading..."})});if(R&&!M&&!A)return e("div",{className:"roles-and-permissions-container",children:e(ue,{variant:"secondary",className:"roles-and-permissions-error",children:e("div",{className:"roles-and-permissions-error__wrapper",children:e("div",{className:"roles-and-permissions-error__content",children:e(ge,{heading:n.errorTitle||"Error Loading Permissions",message:e("p",{children:n.errorMessage||"An error occurred while loading your permissions. Please try again."})})})})})});if(!i&&!M&&!A)return e("div",{className:"roles-and-permissions-container",children:e(ue,{variant:"secondary",className:"roles-and-permissions-no-access",children:e("div",{className:"roles-and-permissions-no-access__wrapper",children:e("div",{className:"roles-and-permissions-no-access__content",children:e(ge,{heading:n.noAccessTitle||"Access Restricted",message:e("p",{children:n.noAccessMessage||"You don't have permission to view roles and permissions. Please contact your company administrator."})})})})})});const Te=t=>{L(t)},_e=t=>{r(t),L(1)},Ee=(t,u)=>{B(t),ae(u),L(1)},Se=()=>{G(null),O(!0)},pe=()=>{G(null),O(!1)},we=t=>{C(t),U(!0)},he=()=>{U(!1),C(null)},Ie=t=>{const u=N.find(D=>D.id===t);u&&(G({name:`${u.name} - Duplicated`,permissions:u.permissions||[]}),O(!0))},xe=async t=>{try{if(await Z({name:t.name,permissions:t.permissions})){const D=n.createSuccess?n.createSuccess.replace("{roleName}",t.name):`Role "${t.name}" created successfully!`;s({type:"success",text:D}),pe()}else s({type:"error",text:n.createError||"Failed to create role. Please try again."})}catch{s({type:"error",text:n.createErrorPermissions||"Failed to create role. Please check your permissions and try again."})}},Me=async t=>{if(w)try{if(await h({id:w,name:t.name,permissions:t.permissions})){const D=n.updateSuccess?n.updateSuccess.replace("{roleName}",t.name):`Role "${t.name}" updated successfully!`;s({type:"success",text:D}),he()}else s({type:"error",text:n.updateError||"Failed to update role. Please try again."})}catch{s({type:"error",text:n.updateErrorPermissions||"Failed to update role. Please check your permissions and try again."})}},ke=t=>{const u=N.find(J=>J.id===t);if(!u)return;const D=u.usersCount>0;Y({id:t,name:u.name,hasUsers:D})},De=async()=>{if(k){if(k.hasUsers){Y(null);return}try{if(await E(k.id)){const u=n.deleteRoleSuccess?n.deleteRoleSuccess.replace("{roleName}",k.name||"Unknown Role"):`You have deleted role "${k.name||"Unknown Role"}".`;s({type:"success",text:u})}else s({type:"error",text:n.deleteError||"Failed to delete role. Please try again."})}catch{s({type:"error",text:n.deleteError||"Failed to delete role. Please try again."})}finally{Y(null)}}},Fe=()=>Y(null);return e("div",{className:"roles-and-permissions-container",children:g("div",{className:be(["roles-and-permissions",d]),children:[a?e(ne,{title:n.containerTitle,divider:!1,className:"roles-and-permissions__title"}):null,_&&e(te,{type:"error",heading:n.errorTitle||"Error",description:n.errorMessage||"An error occurred while loading roles and permissions.",onDismiss:S}),c&&c.text&&e(te,{type:c.type||"success",heading:c.text,icon:c.icon}),M?e(Ae,{mode:"create",aclResources:F,existingRoleNames:N.map(t=>t.name),loading:v,onSubmit:xe,onCancel:()=>{G(null),pe()},inLineAlertProps:_?{type:"error",text:_}:void 0,prefillName:H==null?void 0:H.name,prefillPermissions:H==null?void 0:H.permissions},"create-role-form"):A&&w?e(Ae,{mode:"edit",role:N.find(t=>t.id===w),aclResources:F,existingRoleNames:N.map(t=>t.name),loading:x,onSubmit:Me,onCancel:he,inLineAlertProps:_?{type:"error",text:_}:void 0},`edit-role-form-${w}`):e(We,{roles:Pe,isLoading:I,canManageRoles:T,onShowCreateForm:Se,onShowEditForm:we,onDuplicateRole:Ie,onDeleteRole:ke,totalCount:j,currentPage:q,pageSize:V,onPageChange:Te,onPageSizeChange:_e,onSortChange:Ee,sortColumn:y,sortDirection:z}),e(es,{isOpen:!!k,hasUsers:k==null?void 0:k.hasUsers,onConfirm:De,onCancel:Fe})]})})};export{gs as RolesAndPermissions,gs as default};
|
|
4
4
|
//# sourceMappingURL=RolesAndPermissions.js.map
|