@dropins/storefront-company-management 1.0.0-alpha2012 → 1.0.0-alpha2020
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/CompanyLoaders.js +1 -1
- package/chunks/CompanyLoaders.js.map +1 -1
- package/chunks/CompanyUserForm.js +1 -1
- package/chunks/CompanyUserForm.js.map +1 -1
- package/containers/CompanyCredit.js +1 -1
- package/containers/CompanyCredit.js.map +1 -1
- package/containers/CompanyProfile.js +1 -1
- package/containers/CompanyStructure.js +1 -1
- package/containers/CompanyUsers.js +1 -1
- package/containers/CompanyUsers.js.map +1 -1
- package/hooks/containers/useCompanyUsers.d.ts +0 -1
- package/i18n/en_US.json.d.ts +1 -2
- package/package.json +1 -1
- package/render.js +3 -3
- package/render.js.map +1 -1
package/chunks/CompanyLoaders.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{
|
|
3
|
+
import{jsx as e,jsxs as t}from"@dropins/tools/preact-jsx-runtime.js";import{Skeleton as i,SkeletonRow as a,Card as n}from"@dropins/tools/components.js";import{classes as o}from"@dropins/tools/lib.js";const u=({testId:r,withCard:l=!0})=>{const s=t(i,{"data-testid":r||"companySkeletonLoader",children:[e(a,{variant:"heading",size:"xlarge",fullWidth:!1,lines:1}),e(a,{variant:"heading",size:"xlarge",fullWidth:!0,lines:1}),e(a,{variant:"heading",size:"xlarge",fullWidth:!0,lines:1})]});return l?s:e(n,{variant:"secondary",className:o(["company-company-loaders","company-company-loaders--card-loader"]),children:s})},h=({testId:r})=>e("div",{className:"company-users-skeleton-loader","data-testid":r||"companyUsersSkeletonLoader",children:e(i,{children:e(a,{variant:"row",size:"small",fullWidth:!0,lines:3})})}),p=({testId:r})=>t("div",{className:"company-credit-skeleton-loader","data-testid":r||"companyCreditSkeletonLoader",children:[e(i,{children:e(a,{variant:"row",size:"small",lines:2})}),e(i,{children:e(a,{variant:"row",size:"small",lines:2})}),e(i,{children:e(a,{variant:"row",size:"small",lines:2})})]}),y=({testId:r})=>e("div",{className:"company-credit-history-skeleton-loader","data-testid":r||"companyCreditHistorySkeletonLoader",children:e(i,{children:e(a,{variant:"row",size:"small",fullWidth:!0,lines:3})})}),z=({rows:r=6})=>t(i,{"data-testid":"companyStructureLoader",children:[e(a,{variant:"heading",size:"medium"}),e(a,{variant:"empty",size:"small"}),Array.from({length:r}).map((l,s)=>e(a,{size:"large",fullWidth:!0},s))]}),g=()=>t(i,{"data-testid":"companyUserFormLoader",children:[e(a,{variant:"heading",size:"medium"}),e(a,{variant:"empty",size:"small"}),e(a,{size:"large"}),e(a,{size:"large"}),e(a,{size:"large"}),e(a,{size:"large"}),e(a,{size:"large",fullWidth:!0}),e(a,{size:"large"}),e(a,{size:"large"})]}),v=()=>t(i,{"data-testid":"companyTeamFormLoader",children:[e(a,{variant:"heading",size:"medium"}),e(a,{variant:"empty",size:"small"}),e(a,{size:"large"}),e(a,{size:"large",fullWidth:!0}),e(a,{size:"large"})]});export{h as C,v as a,z as b,g as c,u as d,p as e,y as f};
|
|
4
4
|
//# sourceMappingURL=CompanyLoaders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompanyLoaders.js","sources":["/@dropins/storefront-company-management/src/components/CompanyLoaders/CompanyLoaders.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 *******************************************************************/\nimport { Skeleton, SkeletonRow, Card } from '@adobe-commerce/elsie/components';\nimport './CompanyLoaders.css';\nimport { classes } from '@adobe-commerce/elsie/lib';\n\nexport const CompanyCardLoader = ({\n testId,\n withCard = true,\n}: {\n testId?: string;\n withCard?: boolean;\n}) => {\n const defaultSkeleton = (\n <Skeleton data-testid={testId || 'companySkeletonLoader'}>\n <SkeletonRow\n variant=\"heading\"\n size=\"xlarge\"\n fullWidth={false}\n lines={1}\n />\n <SkeletonRow variant=\"heading\" size=\"xlarge\" fullWidth={true} lines={1} />\n <SkeletonRow variant=\"heading\" size=\"xlarge\" fullWidth={true} lines={1} />\n </Skeleton>\n );\n\n if (withCard) {\n return defaultSkeleton;\n }\n\n return (\n <Card\n variant=\"secondary\"\n className={classes([\n 'company-company-loaders',\n 'company-company-loaders--card-loader',\n ])}\n >\n {defaultSkeleton}\n </Card>\n );\n};\n\nexport const CompanyUsersTableLoader = ({ testId }: { testId?: string }) => {\n return (\n <div className=\"company-users-skeleton-loader\" data-testid={testId || 'companyUsersSkeletonLoader'}>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" fullWidth={true} lines={3} />\n </Skeleton>\n </div>\n );\n};\n\nexport const CompanyCreditLoader = ({ testId }: { testId?: string }) => {\n return (\n <div className=\"company-credit-skeleton-loader\" data-testid={testId || 'companyCreditSkeletonLoader'}>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" lines={2} />\n </Skeleton>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" lines={2} />\n </Skeleton>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" lines={2} />\n </Skeleton>\n </div>\n );\n};\n\nexport const CompanyCreditHistoryLoader = ({ testId }: { testId?: string }) => {\n return (\n <div className=\"company-credit-history-skeleton-loader\" data-testid={testId || 'companyCreditHistorySkeletonLoader'}>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" fullWidth={true} lines={3} />\n </Skeleton>\n </div>\n );\n};\n\nexport const CompanyStructureLoader = ({ rows = 6 }: { rows?: number }) => {\n return (\n <Skeleton data-testid=\"companyStructureLoader\">\n <SkeletonRow variant=\"heading\" size=\"medium\" />\n <SkeletonRow variant=\"empty\" size=\"small\" />\n {Array.from({ length: rows }).map((_, i) => (\n <SkeletonRow key={i} size=\"large\" fullWidth={true} />\n ))}\n </Skeleton>\n );\n};\n\nexport const CompanyUserFormLoader = () => {\n return (\n <Skeleton data-testid=\"companyUserFormLoader\">\n <SkeletonRow variant=\"heading\" size=\"medium\" />\n <SkeletonRow variant=\"empty\" size=\"small\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" fullWidth={true} />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n </Skeleton>\n );\n};\n\nexport const CompanyTeamFormLoader = () => {\n return (\n <Skeleton data-testid=\"companyTeamFormLoader\">\n <SkeletonRow variant=\"heading\" size=\"medium\" />\n <SkeletonRow variant=\"empty\" size=\"small\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" fullWidth={true} />\n <SkeletonRow size=\"large\" />\n </Skeleton>\n );\n};\n"],"names":["CompanyCardLoader","testId","withCard","defaultSkeleton","jsxs","Skeleton","jsx","SkeletonRow","Card","classes","CompanyCreditLoader","CompanyCreditHistoryLoader","CompanyStructureLoader","rows","_","i","CompanyUserFormLoader","CompanyTeamFormLoader"],"mappings":"wMAoBO,MAAMA,EAAoB,CAAC,CAChC,OAAAC,EACA,SAAAC,EAAW,EACb,IAGM,CACJ,MAAMC,EACJC,EAACC,EAAA,CAAS,cAAaJ,GAAU,wBAC/B,SAAA,CAAAK,EAACC,EAAA,CACC,QAAQ,UACR,KAAK,SACL,UAAW,GACX,MAAO,CAAA,CAAA,EAETD,EAACC,GAAY,QAAQ,UAAU,KAAK,SAAS,UAAW,GAAM,MAAO,CAAA,CAAG,EACxED,EAACC,GAAY,QAAQ,UAAU,KAAK,SAAS,UAAW,GAAM,MAAO,CAAA,CAAG,CAAA,EAC1E,EAGF,OAAIL,EACKC,EAIPG,EAACE,EAAA,CACC,QAAQ,YACR,UAAWC,EAAQ,CACjB,0BACA,sCAAA,CACD,EAEA,SAAAN,CAAA,CAAA,CAGP,
|
|
1
|
+
{"version":3,"file":"CompanyLoaders.js","sources":["/@dropins/storefront-company-management/src/components/CompanyLoaders/CompanyLoaders.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 *******************************************************************/\nimport { Skeleton, SkeletonRow, Card } from '@adobe-commerce/elsie/components';\nimport './CompanyLoaders.css';\nimport { classes } from '@adobe-commerce/elsie/lib';\n\nexport const CompanyCardLoader = ({\n testId,\n withCard = true,\n}: {\n testId?: string;\n withCard?: boolean;\n}) => {\n const defaultSkeleton = (\n <Skeleton data-testid={testId || 'companySkeletonLoader'}>\n <SkeletonRow\n variant=\"heading\"\n size=\"xlarge\"\n fullWidth={false}\n lines={1}\n />\n <SkeletonRow variant=\"heading\" size=\"xlarge\" fullWidth={true} lines={1} />\n <SkeletonRow variant=\"heading\" size=\"xlarge\" fullWidth={true} lines={1} />\n </Skeleton>\n );\n\n if (withCard) {\n return defaultSkeleton;\n }\n\n return (\n <Card\n variant=\"secondary\"\n className={classes([\n 'company-company-loaders',\n 'company-company-loaders--card-loader',\n ])}\n >\n {defaultSkeleton}\n </Card>\n );\n};\n\nexport const CompanyUsersTableLoader = ({ testId }: { testId?: string }) => {\n return (\n <div className=\"company-users-skeleton-loader\" data-testid={testId || 'companyUsersSkeletonLoader'}>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" fullWidth={true} lines={3} />\n </Skeleton>\n </div>\n );\n};\n\nexport const CompanyCreditLoader = ({ testId }: { testId?: string }) => {\n return (\n <div className=\"company-credit-skeleton-loader\" data-testid={testId || 'companyCreditSkeletonLoader'}>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" lines={2} />\n </Skeleton>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" lines={2} />\n </Skeleton>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" lines={2} />\n </Skeleton>\n </div>\n );\n};\n\nexport const CompanyCreditHistoryLoader = ({ testId }: { testId?: string }) => {\n return (\n <div className=\"company-credit-history-skeleton-loader\" data-testid={testId || 'companyCreditHistorySkeletonLoader'}>\n <Skeleton>\n <SkeletonRow variant=\"row\" size=\"small\" fullWidth={true} lines={3} />\n </Skeleton>\n </div>\n );\n};\n\nexport const CompanyStructureLoader = ({ rows = 6 }: { rows?: number }) => {\n return (\n <Skeleton data-testid=\"companyStructureLoader\">\n <SkeletonRow variant=\"heading\" size=\"medium\" />\n <SkeletonRow variant=\"empty\" size=\"small\" />\n {Array.from({ length: rows }).map((_, i) => (\n <SkeletonRow key={i} size=\"large\" fullWidth={true} />\n ))}\n </Skeleton>\n );\n};\n\nexport const CompanyUserFormLoader = () => {\n return (\n <Skeleton data-testid=\"companyUserFormLoader\">\n <SkeletonRow variant=\"heading\" size=\"medium\" />\n <SkeletonRow variant=\"empty\" size=\"small\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" fullWidth={true} />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" />\n </Skeleton>\n );\n};\n\nexport const CompanyTeamFormLoader = () => {\n return (\n <Skeleton data-testid=\"companyTeamFormLoader\">\n <SkeletonRow variant=\"heading\" size=\"medium\" />\n <SkeletonRow variant=\"empty\" size=\"small\" />\n <SkeletonRow size=\"large\" />\n <SkeletonRow size=\"large\" fullWidth={true} />\n <SkeletonRow size=\"large\" />\n </Skeleton>\n );\n};\n"],"names":["CompanyCardLoader","testId","withCard","defaultSkeleton","jsxs","Skeleton","jsx","SkeletonRow","Card","classes","CompanyUsersTableLoader","CompanyCreditLoader","CompanyCreditHistoryLoader","CompanyStructureLoader","rows","_","i","CompanyUserFormLoader","CompanyTeamFormLoader"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as P,jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{memo as D}from"@dropins/tools/preact-compat.js";import{useState as d,useEffect as H}from"@dropins/tools/preact-hooks.js";import{Card as J,InLineAlert as K,ProgressSpinner as Q,Field as S,Input as A,Picker as z,Button as O}from"@dropins/tools/components.js";import{
|
|
3
|
+
import{jsxs as P,jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{memo as D}from"@dropins/tools/preact-compat.js";import{useState as d,useEffect as H}from"@dropins/tools/preact-hooks.js";import{Card as J,InLineAlert as K,ProgressSpinner as Q,Field as S,Input as A,Picker as z,Button as O}from"@dropins/tools/components.js";import{c as W}from"./CompanyLoaders.js";import{i as X}from"./company-permissions.js";import{g as Y,c as Z,u as ee,i as ae}from"./updateCompanyUser.js";import{useText as G}from"@dropins/tools/i18n.js";import{u as te}from"./useCompanyRoles.js";function re(q){const{mode:I,entityId:h,parentStructureId:T,onSaved:w,onError:N,onSuccess:v}=q,u=G({firstNameRequired:"Company.CompanyStructure.shared.validation.firstNameRequired",lastNameRequired:"Company.CompanyStructure.shared.validation.lastNameRequired",emailRequired:"Company.CompanyStructure.shared.validation.emailRequired",emailInvalid:"Company.CompanyStructure.shared.validation.emailInvalid",jobTitleRequired:"Company.CompanyStructure.shared.validation.jobTitleRequired",workPhoneRequired:"Company.CompanyStructure.shared.validation.workPhoneRequired",selectRole:"Company.CompanyStructure.shared.validation.selectRole",createUserError:"Company.CompanyStructure.messages.createUserError",saveUserError:"Company.CompanyStructure.messages.saveUserError",createUserSuccess:"Company.CompanyStructure.messages.createUserSuccess",updateUserSuccess:"Company.CompanyStructure.messages.updateUserSuccess"}),[r,U]=d({firstName:"",lastName:"",email:"",jobTitle:"",telephone:"",roleId:"",status:"ACTIVE"}),[x,c]=d({}),[m,p]=d({}),[V,R]=d(!1),[y,j]=d(null),[_,E]=d(null),[b,k]=d(""),[l,a]=d(""),[i,B]=d(!1);H(()=>{I!=="edit"||!h||(R(!0),Y(h).then(e=>{var f;if(!e)return;const t=e.email||"";U(g=>({...g,firstName:e.firstName||"",lastName:e.lastName||"",email:t,jobTitle:e.jobTitle||"",telephone:e.telephone||"",status:e.status||"ACTIVE"})),a(t),(f=e==null?void 0:e.role)!=null&&f.id&&U(g=>({...g,roleId:e.role.id})),B((e==null?void 0:e.isCompanyAdmin)??!1)}).finally(()=>R(!1)))},[I,h]);const F=e=>/.+@.+\..+/.test(e),M=(e,t)=>e==="firstName"?t!=null&&t.trim()?null:u.firstNameRequired:e==="lastName"?t!=null&&t.trim()?null:u.lastNameRequired:e==="email"?t!=null&&t.trim()?F(t.trim())?null:u.emailInvalid:u.emailRequired:e==="roleId"?t?null:u.selectRole:null,$=(e,t)=>{U(f=>({...f,[e]:t})),e==="email"&&E(null),y&&j(null)};return{values:r,errors:x,touched:m,loading:V,setValue:$,onBlur:async(e,t)=>{t!==void 0&&$(e,t),p(C=>({...C,[e]:!0}));const f=t!==void 0?t:r[e],g=M(e,f);if(c(g?C=>({...C,[e]:g}):C=>{const s={...C};return delete s[e],s}),e==="email"){const s=(t!==void 0?t:r.email||"").trim();if(I==="edit"&&s.toLowerCase()===(l||"").trim().toLowerCase()){E(null);return}if(F(s)&&s!==b){const n=await ae(s);k(s),E(n),n===!1&&c(L=>({...L,email:"A user with this email address is already a member of your company."}))}}},submit:async()=>{const e=["firstName","lastName","email","roleId"],t={};for(const s of e){const n=M(s,r[s]);n&&(t[s]=n)}if(c(t),p({firstName:!0,lastName:!0,email:!0,roleId:!0}),Object.keys(t).length||_===!1){setTimeout(()=>{const s=document.querySelector(".company-user-form__content .dropin-field__hint--error");if(s){const n=s.closest(".dropin-field");if(n){n.scrollIntoView({behavior:"smooth",block:"center"});const L=n.querySelector("input, select");L&&L.focus()}}},100);return}const f=`${r.firstName||""} ${r.lastName||""}`.trim()||r.email||"",C=i||X({id:r.roleId})?"ACTIVE":r.status;try{if(I==="add"){const s=await Z({email:r.email||"",firstName:r.firstName||"",lastName:r.lastName||"",jobTitle:r.jobTitle||"",telephone:r.telephone||"",roleId:r.roleId,status:C,targetId:T??null});if(!s){const n=u.createUserError;N?N(n):j(n);return}w({label:f,structureId:s.structureId,entityId:s.id,type:"user"}),v&&v(u.createUserSuccess)}else h&&(await ee({id:h,email:r.email||"",firstName:r.firstName||"",lastName:r.lastName||"",jobTitle:r.jobTitle||"",telephone:r.telephone||"",status:C,roleId:r.roleId}),w({label:f,entityId:h,type:"user"}),v&&v(u.updateUserSuccess))}catch(s){const n=s instanceof Error?s.message:u.saveUserError;N?N(n):j(n)}},isCompanyAdmin:i,generalError:y}}const fe=D(({mode:q,entityId:I,parentStructureId:h,permissions:T,onSaved:w,onCancel:N,onError:v,onSuccess:u})=>{const r=(T==null?void 0:T.canEditUsers)??!1,{roles:U,isLoading:x}=te(),{values:c,errors:m,touched:p,loading:V,setValue:R,onBlur:y,submit:j,isCompanyAdmin:_,generalError:E}=re({mode:q,entityId:I,parentStructureId:h,onSaved:w,onError:v?a=>{v(a),N()}:void 0,onSuccess:u}),[b,k]=d(!1),l=G({addUser:"Company.CompanyStructure.shared.titles.addUser",editUser:"Company.CompanyStructure.shared.titles.editUser",jobTitle:"Company.CompanyStructure.shared.fields.jobTitle",userRole:"Company.CompanyStructure.shared.fields.userRole",firstName:"Company.CompanyStructure.shared.fields.firstName",lastName:"Company.CompanyStructure.shared.fields.lastName",email:"Company.CompanyStructure.shared.fields.email",workPhoneNumber:"Company.CompanyStructure.shared.fields.workPhoneNumber",status:"Company.CompanyStructure.shared.fields.status",selectRole:"Company.CompanyStructure.shared.options.selectRole",active:"Company.CompanyStructure.shared.options.active",inactive:"Company.CompanyStructure.shared.options.inactive",companyAdministrator:"Company.CompanyStructure.shared.options.companyAdministrator",save:"Company.CompanyStructure.shared.buttons.save",cancel:"Company.CompanyStructure.shared.buttons.cancel"});return P("div",{children:[o("h3",{className:"acm-structure-panel__title",children:q==="add"?l.addUser:l.editUser}),P(J,{variant:"secondary",className:`company-user-form__card ${b?"is-working":""}`,children:[!v&&E?o(K,{className:"company-user-form__notification",type:"error",variant:"secondary",heading:E}):null,b?o("div",{className:"company-user-form__overlay","aria-live":"polite",children:o(Q,{size:"small"})}):null,V||x?o(W,{}):P("div",{className:"company-user-form__content",children:[o(S,{label:l.jobTitle,className:"acm-structure-panel__field",error:p.jobTitle&&m.jobTitle?m.jobTitle:void 0,children:o(A,{name:"job_title",type:"text",value:c.jobTitle||"",onBlur:a=>{const i=a.target;y("jobTitle",i.value)},variant:"primary",size:"medium"})}),o(S,{label:l.userRole,required:!0,className:"acm-structure-panel__field",error:!_&&p.roleId&&m.roleId?m.roleId:void 0,disabled:_,children:_?o(z,{name:"role",value:"MA==",options:[{value:"MA==",text:l.companyAdministrator}]}):o(z,{name:"role",value:c.roleId||"placeholder",onChange:a=>{var i,B;return R("roleId",String(((i=a==null?void 0:a.target)==null?void 0:i.value)==="placeholder"?"":((B=a==null?void 0:a.target)==null?void 0:B.value)??""))},onBlur:a=>{const i=a.target;y("roleId",i.value==="placeholder"?"":i.value)},options:[{value:"placeholder",text:l.selectRole,disabled:!0},...U.map(a=>({value:a.id,text:a.name}))]})}),o(S,{label:l.firstName,required:!0,className:"acm-structure-panel__field",error:p.firstName&&m.firstName?m.firstName:void 0,children:o(A,{name:"first_name",type:"text",value:c.firstName,onBlur:a=>{const i=a.target;y("firstName",i.value)},variant:"primary",size:"medium"})}),o(S,{label:l.lastName,required:!0,className:"acm-structure-panel__field",error:p.lastName&&m.lastName?m.lastName:void 0,children:o(A,{name:"last_name",type:"text",value:c.lastName,onBlur:a=>{const i=a.target;y("lastName",i.value)},variant:"primary",size:"medium"})}),o(S,{label:l.email,required:!0,className:"acm-structure-panel__field",error:p.email&&m.email?m.email:void 0,children:o(A,{name:"email",type:"email",value:c.email,onBlur:a=>{const i=a.target;y("email",i.value)},placeholder:"jdoe@example.com",variant:"primary",size:"medium"})}),o(S,{label:l.workPhoneNumber,className:"acm-structure-panel__field",error:p.telephone&&m.telephone?m.telephone:void 0,children:o(A,{name:"telephone",type:"text",value:c.telephone||"",onBlur:a=>{const i=a.target;y("telephone",i.value)},variant:"primary",size:"medium"})}),o(S,{label:l.status,className:"acm-structure-panel__field",disabled:_||!r,children:o(z,{name:"status",value:c.status,onChange:a=>{var i;return R("status",String(((i=a==null?void 0:a.target)==null?void 0:i.value)??"ACTIVE"))},options:[{value:"ACTIVE",text:l.active},{value:"INACTIVE",text:l.inactive}]})})]})]}),V||x?null:P("div",{className:"acm-structure-modal__actions",children:[o(O,{type:"button",variant:"primary",disabled:b||!r,onClick:async()=>{if(!b){k(!0);try{await j()}finally{k(!1)}}},children:l.save}),o(O,{type:"button",variant:"secondary",disabled:b,onClick:N,children:l.cancel})]})]})});export{fe as C};
|
|
4
4
|
//# sourceMappingURL=CompanyUserForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompanyUserForm.js","sources":["/@dropins/storefront-company-management/src/hooks/useCompanyUserForm.ts","/@dropins/storefront-company-management/src/components/CompanyUserForm/CompanyUserForm.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 *******************************************************************/\nimport { useEffect, useState } from 'preact/hooks';\nimport { createCompanyUser, getCompanyUser, isCompanyUserEmailAvailable, updateCompanyUser } from '@/company-management/api';\nimport { isCompanyAdministrator } from '@/company-management/lib';\nimport { CompanyUserModel } from '@/company-management/data/models';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport type UserStatus = 'ACTIVE' | 'INACTIVE';\n\n\nexport function useCompanyUserForm(opts: {\n mode: 'add' | 'edit';\n entityId?: string;\n parentStructureId?: string | null;\n onSaved: (result: { label: string; structureId?: string; entityId?: string; type: 'user' }) => void;\n onError?: (error: string) => void;\n onSuccess?: (message: string) => void;\n}) {\n const { mode, entityId, parentStructureId, onSaved, onError, onSuccess } = opts;\n \n const translations = useText({\n firstNameRequired: 'Company.CompanyStructure.shared.validation.firstNameRequired',\n lastNameRequired: 'Company.CompanyStructure.shared.validation.lastNameRequired',\n emailRequired: 'Company.CompanyStructure.shared.validation.emailRequired',\n emailInvalid: 'Company.CompanyStructure.shared.validation.emailInvalid',\n jobTitleRequired: 'Company.CompanyStructure.shared.validation.jobTitleRequired',\n workPhoneRequired: 'Company.CompanyStructure.shared.validation.workPhoneRequired',\n selectRole: 'Company.CompanyStructure.shared.validation.selectRole',\n createUserError: 'Company.CompanyStructure.messages.createUserError',\n saveUserError: 'Company.CompanyStructure.messages.saveUserError',\n createUserSuccess: 'Company.CompanyStructure.messages.createUserSuccess',\n updateUserSuccess: 'Company.CompanyStructure.messages.updateUserSuccess',\n });\n const [values, setValues] = useState<Partial<CompanyUserModel> & { roleId: string; status: UserStatus }>({ \n firstName: '', \n lastName: '', \n email: '', \n jobTitle: '', \n telephone: '', \n roleId: '', \n status: 'ACTIVE' \n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [loading, setLoading] = useState(false);\n const [generalError, setGeneralError] = useState<string | null>(null);\n const [emailAvailable, setEmailAvailable] = useState<boolean | null>(null);\n const [emailChecked, setEmailChecked] = useState<string>('');\n const [originalEmail, setOriginalEmail] = useState<string>('');\n const [isCompanyAdmin, setIsCompanyAdmin] = useState<boolean>(false);\n\n useEffect(() => {\n if (mode !== 'edit' || !entityId) return;\n setLoading(true);\n void getCompanyUser(entityId).then((u) => {\n if (!u) return;\n const loadedEmail = u.email || '';\n setValues((v) => ({ ...v, firstName: u.firstName || '', lastName: u.lastName || '', email: loadedEmail, jobTitle: u.jobTitle || '', telephone: u.telephone || '', status: (u.status || 'ACTIVE') as UserStatus }));\n setOriginalEmail(loadedEmail);\n if (u?.role?.id) setValues((v) => ({ ...v, roleId: u.role!.id }));\n setIsCompanyAdmin(u?.isCompanyAdmin ?? false);\n }).finally(() => setLoading(false));\n }, [mode, entityId]);\n\n const isEmailValid = (value: string): boolean => /.+@.+\\..+/.test(value);\n const validateField = (field: keyof CompanyUserModel | 'roleId', value: any): string | null => {\n if (field === 'firstName') return value?.trim() ? null : translations.firstNameRequired;\n if (field === 'lastName') return value?.trim() ? null : translations.lastNameRequired;\n if (field === 'email') {\n if (!value?.trim()) return translations.emailRequired;\n return isEmailValid(value.trim()) ? null : translations.emailInvalid;\n }\n // jobTitle and telephone are now optional fields (USF-3012)\n if (field === 'roleId') return value ? null : translations.selectRole;\n return null;\n };\n\n const setValue = (field: keyof CompanyUserModel | 'roleId', value: any) => {\n setValues((v) => ({ ...v, [field]: value }));\n if (field === 'email') setEmailAvailable(null);\n if (generalError) setGeneralError(null);\n };\n\n const onBlur = async (field: keyof CompanyUserModel | 'roleId', value?: any) => {\n // Update form data if value is provided (this preserves spaces and other characters)\n if (value !== undefined) {\n setValue(field, value);\n }\n \n setTouched((t) => ({ ...t, [field]: true }));\n \n // Use provided value or current state value for validation\n const valueToValidate = value !== undefined ? value : values[field];\n const err = validateField(field, valueToValidate);\n if (err) {\n setErrors((p) => ({ ...p, [field]: err }));\n } else {\n // Clear error if field is now valid\n setErrors((p) => {\n const newErrors = { ...p };\n delete newErrors[field];\n return newErrors;\n });\n }\n \n if (field === 'email') {\n const emailValue = value !== undefined ? value : (values.email || '');\n const trimmed = emailValue.trim();\n if (mode === 'edit' && trimmed.toLowerCase() === (originalEmail || '').trim().toLowerCase()) {\n setEmailAvailable(null);\n return;\n }\n if (isEmailValid(trimmed) && trimmed !== emailChecked) {\n const available = await isCompanyUserEmailAvailable(trimmed);\n setEmailChecked(trimmed);\n setEmailAvailable(available);\n if (available === false) setErrors((p) => ({ ...p, email: 'A user with this email address is already a member of your company.' }));\n }\n }\n };\n\n const submit = async () => {\n // Only validate required fields (USF-3012: jobTitle and telephone are now optional)\n const fields: (keyof CompanyUserModel | 'roleId')[] = ['firstName', 'lastName', 'email', 'roleId'];\n const next: Record<string, string> = {};\n for (const f of fields) {\n const err = validateField(f, values[f]);\n if (err) next[f as string] = err;\n }\n setErrors(next);\n setTouched({ firstName: true, lastName: true, email: true, roleId: true });\n if (Object.keys(next).length || emailAvailable === false) {\n // Scroll to the first error field\n setTimeout(() => {\n const firstErrorField = document.querySelector('.company-user-form__content .dropin-field__hint--error');\n if (firstErrorField) {\n const fieldContainer = firstErrorField.closest('.dropin-field');\n if (fieldContainer) {\n fieldContainer.scrollIntoView({ behavior: 'smooth', block: 'center' });\n const input = fieldContainer.querySelector('input, select') as HTMLElement;\n if (input) {\n input.focus();\n }\n }\n }\n }, 100);\n return;\n }\n\n const label = `${values.firstName || ''} ${values.lastName || ''}`.trim() || values.email || '';\n const adminEffective = isCompanyAdmin || isCompanyAdministrator({ id: values.roleId });\n const effectiveStatus = adminEffective ? 'ACTIVE' : values.status;\n try {\n if (mode === 'add') {\n const res = await createCompanyUser({ email: values.email || '', firstName: values.firstName || '', lastName: values.lastName || '', jobTitle: values.jobTitle || '', telephone: values.telephone || '', roleId: values.roleId, status: effectiveStatus, targetId: parentStructureId ?? null });\n if (!res) {\n const errorMessage = translations.createUserError;\n if (onError) {\n onError(errorMessage);\n } else {\n setGeneralError(errorMessage);\n }\n return;\n }\n onSaved({ label, structureId: res.structureId, entityId: res.id, type: 'user' });\n if (onSuccess) {\n onSuccess(translations.createUserSuccess);\n }\n } else if (entityId) {\n await updateCompanyUser({ id: entityId, email: values.email || '', firstName: values.firstName || '', lastName: values.lastName || '', jobTitle: values.jobTitle || '', telephone: values.telephone || '', status: effectiveStatus, roleId: values.roleId });\n onSaved({ label, entityId, type: 'user' });\n if (onSuccess) {\n onSuccess(translations.updateUserSuccess);\n }\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : translations.saveUserError;\n if (onError) {\n onError(errorMessage);\n } else {\n setGeneralError(errorMessage);\n }\n }\n };\n\n return { values, errors, touched, loading, setValue, onBlur, submit, isCompanyAdmin, generalError };\n}\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\nimport { FunctionComponent } from 'preact';\nimport { memo } from 'preact/compat';\nimport { useState } from 'preact/hooks';\nimport { Field, Input, Button, Card, Picker, ProgressSpinner, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { CompanyUserFormLoader } from '@/company-management/components/CompanyLoaders';\nimport { useCompanyUserForm } from '@/company-management/hooks/useCompanyUserForm';\nimport { useCompanyRoles } from '@/company-management/hooks/useCompanyRoles';\nimport { CompanyUserFormProps } from '@/company-management/types/companyForm.types';\nimport './CompanyUserForm.css';\n\n/**\n * CompanyUserForm component for creating and editing company users\n * Provides form fields for user information including name, email, role, and status\n */\nexport const CompanyUserForm: FunctionComponent<CompanyUserFormProps> = memo(({ mode, entityId, parentStructureId, permissions, onSaved, onCancel, onError, onSuccess }) => {\n const canEditUsers = permissions?.canEditUsers ?? false;\n const { roles, isLoading: rolesLoading } = useCompanyRoles();\n const { values, errors, touched, loading, setValue, onBlur, submit, isCompanyAdmin, generalError } = useCompanyUserForm({ \n mode, \n entityId, \n parentStructureId, \n onSaved,\n onError: onError ? (error: string) => {\n onError(error);\n onCancel();\n } : undefined,\n onSuccess\n });\n const [saving, setSaving] = useState(false);\n \n const translations = useText({\n addUser: 'Company.CompanyStructure.shared.titles.addUser',\n editUser: 'Company.CompanyStructure.shared.titles.editUser',\n jobTitle: 'Company.CompanyStructure.shared.fields.jobTitle',\n userRole: 'Company.CompanyStructure.shared.fields.userRole',\n firstName: 'Company.CompanyStructure.shared.fields.firstName',\n lastName: 'Company.CompanyStructure.shared.fields.lastName',\n email: 'Company.CompanyStructure.shared.fields.email',\n workPhoneNumber: 'Company.CompanyStructure.shared.fields.workPhoneNumber',\n status: 'Company.CompanyStructure.shared.fields.status',\n selectRole: 'Company.CompanyStructure.shared.options.selectRole',\n active: 'Company.CompanyStructure.shared.options.active',\n inactive: 'Company.CompanyStructure.shared.options.inactive',\n companyAdministrator: 'Company.CompanyStructure.shared.options.companyAdministrator',\n save: 'Company.CompanyStructure.shared.buttons.save',\n cancel: 'Company.CompanyStructure.shared.buttons.cancel',\n });\n\n return (\n <div>\n <h3 className=\"acm-structure-panel__title\">{mode === 'add' ? translations.addUser : translations.editUser}</h3>\n <Card variant=\"secondary\" className={`company-user-form__card ${saving ? 'is-working' : ''}`}>\n {!onError && generalError ? (\n <InLineAlert \n className=\"company-user-form__notification\" \n type=\"error\" \n variant=\"secondary\" \n heading={generalError} \n />\n ) : null}\n {saving ? <div className=\"company-user-form__overlay\" aria-live=\"polite\"><ProgressSpinner size=\"small\" /></div> : null}\n {loading || rolesLoading ? (\n <CompanyUserFormLoader />\n ) : (\n <div className=\"company-user-form__content\">\n\n <Field label={translations.jobTitle} className=\"acm-structure-panel__field\" error={touched.jobTitle && errors.jobTitle ? errors.jobTitle : undefined}>\n <Input name=\"job_title\" type=\"text\" value={values.jobTitle || ''} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('jobTitle', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.userRole} required className=\"acm-structure-panel__field\" error={!isCompanyAdmin && touched.roleId && errors.roleId ? errors.roleId : undefined} disabled={isCompanyAdmin}>\n {isCompanyAdmin ? (\n <Picker name=\"role\" value={'MA=='} options={[{ value: 'MA==', text: translations.companyAdministrator }]} />\n ) : (\n <Picker\n name=\"role\"\n value={values.roleId || 'placeholder'}\n onChange={(e: any) => setValue('roleId', String(e?.target?.value === 'placeholder' ? '' : e?.target?.value ?? ''))}\n onBlur={(e: Event) => { const target = e.target as HTMLSelectElement; void onBlur('roleId', target.value === 'placeholder' ? '' : target.value); }}\n options={[{ value: 'placeholder', text: translations.selectRole, disabled: true }, ...roles.map((r) => ({ value: r.id, text: r.name }))]}\n />\n )}\n </Field>\n\n <Field label={translations.firstName} required className=\"acm-structure-panel__field\" error={touched.firstName && errors.firstName ? errors.firstName : undefined}>\n <Input name=\"first_name\" type=\"text\" value={values.firstName} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('firstName', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.lastName} required className=\"acm-structure-panel__field\" error={touched.lastName && errors.lastName ? errors.lastName : undefined}>\n <Input name=\"last_name\" type=\"text\" value={values.lastName} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('lastName', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.email} required className=\"acm-structure-panel__field\" error={touched.email && errors.email ? errors.email : undefined}>\n <Input name=\"email\" type=\"email\" value={values.email} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; void onBlur('email', target.value); }} placeholder=\"jdoe@example.com\" variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.workPhoneNumber} className=\"acm-structure-panel__field\" error={touched.telephone && errors.telephone ? errors.telephone : undefined}>\n <Input name=\"telephone\" type=\"text\" value={values.telephone || ''} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('telephone', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.status} className=\"acm-structure-panel__field\" disabled={isCompanyAdmin || !canEditUsers}>\n <Picker\n name=\"status\"\n value={values.status}\n onChange={(e: any) => setValue('status', String(e?.target?.value ?? 'ACTIVE'))}\n options={[{ value: 'ACTIVE', text: translations.active }, { value: 'INACTIVE', text: translations.inactive }]}\n />\n </Field>\n </div>\n )}\n </Card>\n {!(loading || rolesLoading) ? (\n <div className=\"acm-structure-modal__actions\">\n <Button type=\"button\" variant=\"primary\" disabled={saving || !canEditUsers} onClick={async () => { if (saving) return; setSaving(true); try { await submit(); } finally { setSaving(false); } }}>\n {translations.save}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={saving}\n onClick={onCancel}\n >\n {translations.cancel}\n </Button>\n </div>\n ) : null}\n </div>\n );\n});\n\nexport default CompanyUserForm;\n"],"names":["useCompanyUserForm","opts","mode","entityId","parentStructureId","onSaved","onError","onSuccess","translations","useText","values","setValues","useState","errors","setErrors","touched","setTouched","loading","setLoading","generalError","setGeneralError","emailAvailable","setEmailAvailable","emailChecked","setEmailChecked","originalEmail","setOriginalEmail","isCompanyAdmin","setIsCompanyAdmin","useEffect","getCompanyUser","u","loadedEmail","v","_a","isEmailValid","value","validateField","field","setValue","t","valueToValidate","err","p","newErrors","trimmed","available","isCompanyUserEmailAvailable","fields","next","f","firstErrorField","fieldContainer","input","label","effectiveStatus","isCompanyAdministrator","res","createCompanyUser","errorMessage","updateCompanyUser","error","CompanyUserForm","memo","permissions","onCancel","canEditUsers","roles","rolesLoading","useCompanyRoles","onBlur","submit","saving","setSaving","jsx","jsxs","Card","InLineAlert","ProgressSpinner","CompanyUserFormLoader","Field","Input","e","target","Picker","_b","r","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CompanyUserForm.js","sources":["/@dropins/storefront-company-management/src/hooks/useCompanyUserForm.ts","/@dropins/storefront-company-management/src/components/CompanyUserForm/CompanyUserForm.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 *******************************************************************/\nimport { useEffect, useState } from 'preact/hooks';\nimport { createCompanyUser, getCompanyUser, isCompanyUserEmailAvailable, updateCompanyUser } from '@/company-management/api';\nimport { isCompanyAdministrator } from '@/company-management/lib';\nimport { CompanyUserModel } from '@/company-management/data/models';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport type UserStatus = 'ACTIVE' | 'INACTIVE';\n\n\nexport function useCompanyUserForm(opts: {\n mode: 'add' | 'edit';\n entityId?: string;\n parentStructureId?: string | null;\n onSaved: (result: { label: string; structureId?: string; entityId?: string; type: 'user' }) => void;\n onError?: (error: string) => void;\n onSuccess?: (message: string) => void;\n}) {\n const { mode, entityId, parentStructureId, onSaved, onError, onSuccess } = opts;\n \n const translations = useText({\n firstNameRequired: 'Company.CompanyStructure.shared.validation.firstNameRequired',\n lastNameRequired: 'Company.CompanyStructure.shared.validation.lastNameRequired',\n emailRequired: 'Company.CompanyStructure.shared.validation.emailRequired',\n emailInvalid: 'Company.CompanyStructure.shared.validation.emailInvalid',\n jobTitleRequired: 'Company.CompanyStructure.shared.validation.jobTitleRequired',\n workPhoneRequired: 'Company.CompanyStructure.shared.validation.workPhoneRequired',\n selectRole: 'Company.CompanyStructure.shared.validation.selectRole',\n createUserError: 'Company.CompanyStructure.messages.createUserError',\n saveUserError: 'Company.CompanyStructure.messages.saveUserError',\n createUserSuccess: 'Company.CompanyStructure.messages.createUserSuccess',\n updateUserSuccess: 'Company.CompanyStructure.messages.updateUserSuccess',\n });\n const [values, setValues] = useState<Partial<CompanyUserModel> & { roleId: string; status: UserStatus }>({ \n firstName: '', \n lastName: '', \n email: '', \n jobTitle: '', \n telephone: '', \n roleId: '', \n status: 'ACTIVE' \n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [loading, setLoading] = useState(false);\n const [generalError, setGeneralError] = useState<string | null>(null);\n const [emailAvailable, setEmailAvailable] = useState<boolean | null>(null);\n const [emailChecked, setEmailChecked] = useState<string>('');\n const [originalEmail, setOriginalEmail] = useState<string>('');\n const [isCompanyAdmin, setIsCompanyAdmin] = useState<boolean>(false);\n\n useEffect(() => {\n if (mode !== 'edit' || !entityId) return;\n setLoading(true);\n void getCompanyUser(entityId).then((u) => {\n if (!u) return;\n const loadedEmail = u.email || '';\n setValues((v) => ({ ...v, firstName: u.firstName || '', lastName: u.lastName || '', email: loadedEmail, jobTitle: u.jobTitle || '', telephone: u.telephone || '', status: (u.status || 'ACTIVE') as UserStatus }));\n setOriginalEmail(loadedEmail);\n if (u?.role?.id) setValues((v) => ({ ...v, roleId: u.role!.id }));\n setIsCompanyAdmin(u?.isCompanyAdmin ?? false);\n }).finally(() => setLoading(false));\n }, [mode, entityId]);\n\n const isEmailValid = (value: string): boolean => /.+@.+\\..+/.test(value);\n const validateField = (field: keyof CompanyUserModel | 'roleId', value: any): string | null => {\n if (field === 'firstName') return value?.trim() ? null : translations.firstNameRequired;\n if (field === 'lastName') return value?.trim() ? null : translations.lastNameRequired;\n if (field === 'email') {\n if (!value?.trim()) return translations.emailRequired;\n return isEmailValid(value.trim()) ? null : translations.emailInvalid;\n }\n // jobTitle and telephone are now optional fields (USF-3012)\n if (field === 'roleId') return value ? null : translations.selectRole;\n return null;\n };\n\n const setValue = (field: keyof CompanyUserModel | 'roleId', value: any) => {\n setValues((v) => ({ ...v, [field]: value }));\n if (field === 'email') setEmailAvailable(null);\n if (generalError) setGeneralError(null);\n };\n\n const onBlur = async (field: keyof CompanyUserModel | 'roleId', value?: any) => {\n // Update form data if value is provided (this preserves spaces and other characters)\n if (value !== undefined) {\n setValue(field, value);\n }\n \n setTouched((t) => ({ ...t, [field]: true }));\n \n // Use provided value or current state value for validation\n const valueToValidate = value !== undefined ? value : values[field];\n const err = validateField(field, valueToValidate);\n if (err) {\n setErrors((p) => ({ ...p, [field]: err }));\n } else {\n // Clear error if field is now valid\n setErrors((p) => {\n const newErrors = { ...p };\n delete newErrors[field];\n return newErrors;\n });\n }\n \n if (field === 'email') {\n const emailValue = value !== undefined ? value : (values.email || '');\n const trimmed = emailValue.trim();\n if (mode === 'edit' && trimmed.toLowerCase() === (originalEmail || '').trim().toLowerCase()) {\n setEmailAvailable(null);\n return;\n }\n if (isEmailValid(trimmed) && trimmed !== emailChecked) {\n const available = await isCompanyUserEmailAvailable(trimmed);\n setEmailChecked(trimmed);\n setEmailAvailable(available);\n if (available === false) setErrors((p) => ({ ...p, email: 'A user with this email address is already a member of your company.' }));\n }\n }\n };\n\n const submit = async () => {\n // Only validate required fields (USF-3012: jobTitle and telephone are now optional)\n const fields: (keyof CompanyUserModel | 'roleId')[] = ['firstName', 'lastName', 'email', 'roleId'];\n const next: Record<string, string> = {};\n for (const f of fields) {\n const err = validateField(f, values[f]);\n if (err) next[f as string] = err;\n }\n setErrors(next);\n setTouched({ firstName: true, lastName: true, email: true, roleId: true });\n if (Object.keys(next).length || emailAvailable === false) {\n // Scroll to the first error field\n setTimeout(() => {\n const firstErrorField = document.querySelector('.company-user-form__content .dropin-field__hint--error');\n if (firstErrorField) {\n const fieldContainer = firstErrorField.closest('.dropin-field');\n if (fieldContainer) {\n fieldContainer.scrollIntoView({ behavior: 'smooth', block: 'center' });\n const input = fieldContainer.querySelector('input, select') as HTMLElement;\n if (input) {\n input.focus();\n }\n }\n }\n }, 100);\n return;\n }\n\n const label = `${values.firstName || ''} ${values.lastName || ''}`.trim() || values.email || '';\n const adminEffective = isCompanyAdmin || isCompanyAdministrator({ id: values.roleId });\n const effectiveStatus = adminEffective ? 'ACTIVE' : values.status;\n try {\n if (mode === 'add') {\n const res = await createCompanyUser({ email: values.email || '', firstName: values.firstName || '', lastName: values.lastName || '', jobTitle: values.jobTitle || '', telephone: values.telephone || '', roleId: values.roleId, status: effectiveStatus, targetId: parentStructureId ?? null });\n if (!res) {\n const errorMessage = translations.createUserError;\n if (onError) {\n onError(errorMessage);\n } else {\n setGeneralError(errorMessage);\n }\n return;\n }\n onSaved({ label, structureId: res.structureId, entityId: res.id, type: 'user' });\n if (onSuccess) {\n onSuccess(translations.createUserSuccess);\n }\n } else if (entityId) {\n await updateCompanyUser({ id: entityId, email: values.email || '', firstName: values.firstName || '', lastName: values.lastName || '', jobTitle: values.jobTitle || '', telephone: values.telephone || '', status: effectiveStatus, roleId: values.roleId });\n onSaved({ label, entityId, type: 'user' });\n if (onSuccess) {\n onSuccess(translations.updateUserSuccess);\n }\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : translations.saveUserError;\n if (onError) {\n onError(errorMessage);\n } else {\n setGeneralError(errorMessage);\n }\n }\n };\n\n return { values, errors, touched, loading, setValue, onBlur, submit, isCompanyAdmin, generalError };\n}\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\nimport { FunctionComponent } from 'preact';\nimport { memo } from 'preact/compat';\nimport { useState } from 'preact/hooks';\nimport { Field, Input, Button, Card, Picker, ProgressSpinner, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { CompanyUserFormLoader } from '@/company-management/components/CompanyLoaders';\nimport { useCompanyUserForm } from '@/company-management/hooks/useCompanyUserForm';\nimport { useCompanyRoles } from '@/company-management/hooks/useCompanyRoles';\nimport { CompanyUserFormProps } from '@/company-management/types/companyForm.types';\nimport './CompanyUserForm.css';\n\n/**\n * CompanyUserForm component for creating and editing company users\n * Provides form fields for user information including name, email, role, and status\n */\nexport const CompanyUserForm: FunctionComponent<CompanyUserFormProps> = memo(({ mode, entityId, parentStructureId, permissions, onSaved, onCancel, onError, onSuccess }) => {\n const canEditUsers = permissions?.canEditUsers ?? false;\n const { roles, isLoading: rolesLoading } = useCompanyRoles();\n const { values, errors, touched, loading, setValue, onBlur, submit, isCompanyAdmin, generalError } = useCompanyUserForm({ \n mode, \n entityId, \n parentStructureId, \n onSaved,\n onError: onError ? (error: string) => {\n onError(error);\n onCancel();\n } : undefined,\n onSuccess\n });\n const [saving, setSaving] = useState(false);\n \n const translations = useText({\n addUser: 'Company.CompanyStructure.shared.titles.addUser',\n editUser: 'Company.CompanyStructure.shared.titles.editUser',\n jobTitle: 'Company.CompanyStructure.shared.fields.jobTitle',\n userRole: 'Company.CompanyStructure.shared.fields.userRole',\n firstName: 'Company.CompanyStructure.shared.fields.firstName',\n lastName: 'Company.CompanyStructure.shared.fields.lastName',\n email: 'Company.CompanyStructure.shared.fields.email',\n workPhoneNumber: 'Company.CompanyStructure.shared.fields.workPhoneNumber',\n status: 'Company.CompanyStructure.shared.fields.status',\n selectRole: 'Company.CompanyStructure.shared.options.selectRole',\n active: 'Company.CompanyStructure.shared.options.active',\n inactive: 'Company.CompanyStructure.shared.options.inactive',\n companyAdministrator: 'Company.CompanyStructure.shared.options.companyAdministrator',\n save: 'Company.CompanyStructure.shared.buttons.save',\n cancel: 'Company.CompanyStructure.shared.buttons.cancel',\n });\n\n return (\n <div>\n <h3 className=\"acm-structure-panel__title\">{mode === 'add' ? translations.addUser : translations.editUser}</h3>\n <Card variant=\"secondary\" className={`company-user-form__card ${saving ? 'is-working' : ''}`}>\n {!onError && generalError ? (\n <InLineAlert \n className=\"company-user-form__notification\" \n type=\"error\" \n variant=\"secondary\" \n heading={generalError} \n />\n ) : null}\n {saving ? <div className=\"company-user-form__overlay\" aria-live=\"polite\"><ProgressSpinner size=\"small\" /></div> : null}\n {loading || rolesLoading ? (\n <CompanyUserFormLoader />\n ) : (\n <div className=\"company-user-form__content\">\n\n <Field label={translations.jobTitle} className=\"acm-structure-panel__field\" error={touched.jobTitle && errors.jobTitle ? errors.jobTitle : undefined}>\n <Input name=\"job_title\" type=\"text\" value={values.jobTitle || ''} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('jobTitle', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.userRole} required className=\"acm-structure-panel__field\" error={!isCompanyAdmin && touched.roleId && errors.roleId ? errors.roleId : undefined} disabled={isCompanyAdmin}>\n {isCompanyAdmin ? (\n <Picker name=\"role\" value={'MA=='} options={[{ value: 'MA==', text: translations.companyAdministrator }]} />\n ) : (\n <Picker\n name=\"role\"\n value={values.roleId || 'placeholder'}\n onChange={(e: any) => setValue('roleId', String(e?.target?.value === 'placeholder' ? '' : e?.target?.value ?? ''))}\n onBlur={(e: Event) => { const target = e.target as HTMLSelectElement; void onBlur('roleId', target.value === 'placeholder' ? '' : target.value); }}\n options={[{ value: 'placeholder', text: translations.selectRole, disabled: true }, ...roles.map((r) => ({ value: r.id, text: r.name }))]}\n />\n )}\n </Field>\n\n <Field label={translations.firstName} required className=\"acm-structure-panel__field\" error={touched.firstName && errors.firstName ? errors.firstName : undefined}>\n <Input name=\"first_name\" type=\"text\" value={values.firstName} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('firstName', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.lastName} required className=\"acm-structure-panel__field\" error={touched.lastName && errors.lastName ? errors.lastName : undefined}>\n <Input name=\"last_name\" type=\"text\" value={values.lastName} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('lastName', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.email} required className=\"acm-structure-panel__field\" error={touched.email && errors.email ? errors.email : undefined}>\n <Input name=\"email\" type=\"email\" value={values.email} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; void onBlur('email', target.value); }} placeholder=\"jdoe@example.com\" variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.workPhoneNumber} className=\"acm-structure-panel__field\" error={touched.telephone && errors.telephone ? errors.telephone : undefined}>\n <Input name=\"telephone\" type=\"text\" value={values.telephone || ''} onBlur={(e: Event) => { const target = e.target as HTMLInputElement; onBlur('telephone', target.value); }} variant=\"primary\" size=\"medium\" />\n </Field>\n\n <Field label={translations.status} className=\"acm-structure-panel__field\" disabled={isCompanyAdmin || !canEditUsers}>\n <Picker\n name=\"status\"\n value={values.status}\n onChange={(e: any) => setValue('status', String(e?.target?.value ?? 'ACTIVE'))}\n options={[{ value: 'ACTIVE', text: translations.active }, { value: 'INACTIVE', text: translations.inactive }]}\n />\n </Field>\n </div>\n )}\n </Card>\n {!(loading || rolesLoading) ? (\n <div className=\"acm-structure-modal__actions\">\n <Button type=\"button\" variant=\"primary\" disabled={saving || !canEditUsers} onClick={async () => { if (saving) return; setSaving(true); try { await submit(); } finally { setSaving(false); } }}>\n {translations.save}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={saving}\n onClick={onCancel}\n >\n {translations.cancel}\n </Button>\n </div>\n ) : null}\n </div>\n );\n});\n\nexport default CompanyUserForm;\n"],"names":["useCompanyUserForm","opts","mode","entityId","parentStructureId","onSaved","onError","onSuccess","translations","useText","values","setValues","useState","errors","setErrors","touched","setTouched","loading","setLoading","generalError","setGeneralError","emailAvailable","setEmailAvailable","emailChecked","setEmailChecked","originalEmail","setOriginalEmail","isCompanyAdmin","setIsCompanyAdmin","useEffect","getCompanyUser","u","loadedEmail","v","_a","isEmailValid","value","validateField","field","setValue","t","valueToValidate","err","p","newErrors","trimmed","available","isCompanyUserEmailAvailable","fields","next","f","firstErrorField","fieldContainer","input","label","effectiveStatus","isCompanyAdministrator","res","createCompanyUser","errorMessage","updateCompanyUser","error","CompanyUserForm","memo","permissions","onCancel","canEditUsers","roles","rolesLoading","useCompanyRoles","onBlur","submit","saving","setSaving","jsx","jsxs","Card","InLineAlert","ProgressSpinner","CompanyUserFormLoader","Field","Input","e","target","Picker","_b","r","Button"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as e,jsxs as 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{e as $,f as q}from"../chunks/CompanyLoaders.js";import{g as J,a as K}from"../chunks/getCompanyCreditHistory.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 J(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 K();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($,{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(q,{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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"}
|