1"use strict";(self.webpackChunk_ff_app=self.webpackChunk_ff_app||[]).push([[418],{78037:function(e,r,i){i.r(r),i.d(r,{default:function(){return T}});var a=i(64041),t=i(14041),n=i(51293),s=i(44488),l=i(10941),o=i(80824),c=i(73657),d=i(64301),u=i(25683),f=i(39573),m=i(39147),g=i(94447),h=i(7451),x=i(18690),p=i(37730);const y="Builder/LifecycleRolePageView";function v(){const{lifecycle_id:e,role_id:r}=(0,x.g)();return(0,p.A)(e,"missing lifecycle id"),(0,p.A)(r,"missing role id"),{lifecycleId:e,roleId:r}}var j=i(31085);var I=({actors:e,integrators:r,isDelegated:i,lifecycleId:n})=>{const{mutateAsync:l,isLoading:d}=function(){const{lifecycleId:e,roleId:r}=v(),i=(0,g.jE)(),{create:a}=(0,s.dj)();return(0,h.n)({mutationFn:e=>(0,f.Z_)(Number(r),e,a),onSuccess:async()=>{await i.invalidateQueries({queryKey:[y,e,r]})}})}(),{mutateAsync:m,isLoading:x}=function(){const{lifecycleId:e,roleId:r}=v(),i=(0,g.jE)(),{create:a}=(0,s.dj)();return(0,h.n)({mutationFn:e=>(0,f.KY)(e,a),onSuccess:async()=>{await i.invalidateQueries({queryKey:[y,e,r]})}})}(),{create:p}=(0,s.dj)(),{handleSubmit:I,formState:{errors:E},control:w,register:A,reset:R,setError:T,clearErrors:S,watch:_,setValue:D}=(0,o.mN)({defaultValues:{userType:"Backoffice::IndividualUser",identifier:"",integratorResourceId:"",approvingLimit:""},shouldFocusError:!1}),P=_("userType"),C=_("integratorResourceId");(0,t.useEffect)(()=>{D("identifier",""),D("integratorResourceId",""),D("approvingLimit",""),S()},[P,D,S]);const L=(0,t.useMemo)(()=>r.map(({name:e,resourceId:r})=>({label:e,value:r,description:r})),[r]);(0,t.useEffect)(()=>{"Backoffice::PseudoUser"===P&&1===L.length&&D("integratorResourceId",L[0].value)},[P,L,D]);const U=I(async({approvingLimit:e,identifier:i,integratorResourceId:a,userType:t})=>{let n;
1const s={approvingLimit:e};n="Backoffice::PseudoUser"===t?{user:{type:t,identifier:i,integratorResourceId:a},metadata:s}:{user:{type:t,identifier:i},metadata:s};try{await l(n),p("Actor added successfully",{variant:"success"}),R({userType:P,identifier:"",integratorResourceId:"Backoffice::PseudoUser"===P&&1===L.length?L[0].value:"",approvingLimit:""})}catch(o){if((0,f.vO)(o))return;if((0,f.Ih)(o)&&o.errorDetails){const{identifier:e=[],userId:i=[],approvingLimit:a=[],integratorResourceId:n=[]}=o.errorDetails,s=[...e,...i];if(n.length>0&&T("integratorResourceId",{type:"server",message:n[0].message}),s.length>0){const e=s[0];let i=e.message;if("taken"===e.code)if("Backoffice::IndividualUser"===t)i="This email is already in the Actor list for this Role.";else if("Backoffice::PseudoUser"===t){i=`This user identifier is already in Actor list for this Role under ${r.find(e=>e.resourceId===C)?.name??C}.`}else"Integrator"===t&&(i="This Client ID is already in the Actor list for this Role.");T("identifier",{type:"server",message:i})}a.length>0&&T("approvingLimit",{type:"server",message:a[0].message}),s.length>0||a.length>0||n.length>0?p("Errors found",{variant:"alert"}):p((0,f.SU)(o)||u._.unexpectedError,{variant:"alert"})}else p((0,f.SU)(o)||u._.unexpectedError,{variant:"alert"})}}),k=[{type:"fixed",id:"name1",name:"NAME",width:"15%",render:({user:{name:e}})=>(0,j.jsx)(a.EY,{variant:"label-01-regular",children:e??"-"})},{type:"fixed",id:"type2",name:"TYPE",width:"15%",render:({user:e})=>{switch(e.type){case"Integrator":return(0,j.jsx)(a.EY,{variant:"label-01-regular",children:"Integrator (API)"});case"Backoffice::PseudoUser":return(0,j.jsx)(a.EY,{variant:"label-01-regular",children:"Delegated Submission user"});default:return(0,j.jsx)(a.EY,{variant:"label-01-regular",children:"Portal user"})}}},{type:"fixed",id:"identifier3",name:"IDENTIFIER",width:"20%",render:({user:e})=>"Integrator"===e.type?(0,j.jsxs)(a.az,{flex:!0,flexColumn:!0,rowGap:.25,children:[(0,j.jsx)(a.EY,{variant:"heading-07-semibold",children:e.deprecatedIdentifier}),(0,j.jsxs)(a.EY,{variant:"label-01-regular",color:"grey80",children:[e.identifier,(0,j.jsx)(s.$r,{text:e.identifier,successMessage:"Integrator resource ID copied to clipboard","aria-label":"copy resource ID"})]})]}):(0,j.jsx)(a.EY,{variant:"heading-07-semibold",children:e.identifier})},{type:"fixed",id:"integratorInfo4",name:"INTEGRATOR NAME & RESOURCE ID",width:"20%",render:({user:e})=>"Backoffice::PseudoUser"===e.type?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(a.EY,{variant:"heading-07-semibold",children:e.integratorName}),e.integratorResourceId&&(0,j.jsx)(a.az,{flex:!0,flexColumn:!0,rowGap:.25,children:(0,j.jsxs)(a.EY,{variant:"label-01-regular",color:"grey80",children:[e.integratorResourceId,(0,j.jsx)(s.$r,{text:e.integratorResourceId,successMessage:"Integrator resource ID copied to clipboard","aria-label":"copy resource ID"})]})})]}):(0,j.jsx)(a.EY,{variant:"label-01-regular",children:"-"})},{type:"fixed",id:"approvingLimit5",name:"APPROVING LIMIT (S$)",width:"15%",render:({metadata:e})=>(0,j.jsx)(a.EY,{variant:"label-01-regular",children:e?.approvingLimit||"-"})},{type:"fixed",id:"action6",name:"ACTION",width:"15%",render:({id:e})=>(0,j.jsx)(a.N_,{variant:"danger",onClick:()=>(async e=>{try{await m(e),p("Actor removed",{variant:"neutral"})}catch(r){if((0,f.vO)(r))return;if((0,f.Ih)(r)&&r.errorDetails){const{base:e=[]}=r.errorDetails;e.length>0?p(e[0].message,{variant:"alert"}):p((0,f.SU)(r)||u._.unexpectedError,{variant:"alert"})}else p((0,f.SU)(r)||u._.unexpectedError,{variant:"alert"})}})(e),isDisabled:x,children:"Remove"})}];return(0,j.jsxs)(a.az,{flex:!0,flexColumn:!0,rowGap:2.5,children:[(0,j.jsxs)(a.az,{flex:!0,flexColumn:!0,rowGap:2,children:[(0,j.jsx)(a.EY,{variant:"body-01-semibold",children:"Actors"}),(0,j.jsx)(a.bQ,{variant:"fixed",dataTestId:"actor-datatable",columns:k,data:e,emptyMessage:"No Actors"})]}),(0,j.jsxs)(b,{onSubmit:U,children:[(0,j.jsx)(a.EY,{variant:"body-01-semibold",children:"Add Actors"}),(0,j.jsxs)(s.xA,{children:[(0,j.jsx)(s.Ei,{sm:12,children:(0,j.jsx)(o.xI,{name:"userType",control:w,render:({field:e})=>(0,j.jsxs)(a.z6,{label:"Select type",isReadOnly:d,variant:"vertical",value:e.value,onChange:e.onChange,onBlur:e.onBlur,name:e.name,children:[(0,j.jsx)(a.sx,{label:"Portal user",helperText:"Ap
1plySG, ApplySG (Public Officers), BGP and RGP",value:"Backoffice::IndividualUser"}),i&&(0,j.jsx)(a.sx,{label:"Delegated Submission user",value:"Backoffice::PseudoUser"}),(0,j.jsx)(a.sx,{label:"Integrator (API)",value:"Integrator"})]})})}),(0,j.jsxs)(j.Fragment,{children:["Backoffice::PseudoUser"===P&&(0,j.jsx)(s.Ei,{sm:12,children:(0,j.jsx)(o.xI,{name:"integratorResourceId",control:w,rules:{required:"This field cannot be empty."},render:({field:e})=>(0,j.jsx)(a.P6,{label:"Integrator name",options:L,description:(0,j.jsxs)(j.Fragment,{children:["Options are based on integrations added in"," ",(0,j.jsx)(a.N_,{component:c.N_,size:"small",to:`/build/lifecycles/${n}/integrations`,children:"Manage integrations"}),"."]}),value:L.find(r=>r.value===e.value)??null,onChange:r=>e.onChange(r?.value??""),errorText:E.integratorResourceId?.message,isDisabled:d})})}),(0,j.jsxs)(s.Ei,{sm:6,children:["Backoffice::IndividualUser"===P&&(0,j.jsx)(a.A_,{label:"Email",errorText:E.identifier?.message,maxLength:320,style:{textTransform:"lowercase"},isDisabled:d,...A("identifier",{required:"This field cannot be empty.",pattern:{value:/^[\w.%+-]+@[\w.-]+\.[A-Za-z]{2,}$/i,message:"Provide a valid email."}})}),"Backoffice::PseudoUser"===P&&(0,j.jsx)(a.A_,{label:"User identifier",helperText:"Up to 320 characters. Use only letters, numbers and common punctuation. No spaces, or special characters.",errorText:E.identifier?.message,maxLength:320,style:{textTransform:"uppercase"},isDisabled:d,...A("identifier",{required:"This field cannot be empty.",pattern:{value:/^[\x21-\x7E]+$/,message:"Use only letters, numbers and common punctuation. No spaces, or special characters."}})}),"Integrator"===P&&(0,j.jsx)(a.A_,{label:"Client ID",errorText:E.identifier?.message,maxLength:128,isDisabled:d,...A("identifier",{required:"This field cannot be empty.",pattern:{value:/^[\w+]{1,128}$/,message:"Provide a valid Client ID."}})})]}),(0,j.jsx)(s.Ei,{sm:6,children:(0,j.jsx)(o.xI,{control:w,name:"approvingLimit",render:({field:{onChange:e,value:r}})=>(0,j.jsx)(a.uS,{decimalPlaces:2,label:"Approving limit (S$) (Optional)",maxLength:20,errorText:E.approvingLimit?.message,onChange:e,value:r?.toString(),isDisabled:d})})})]})]}),(0,j.jsx)(a.az,{flex:!0,justifyContent:"flex-end",children:(0,j.jsx)(a.$n,{type:"submit",variant:"primary",isLoading:d,"data-testid":"actor-save-button",children:"Save"})})]})]})};const b=d.Ay.form.withConfig({displayName:"ActorManagement__StyledForm",componentId:"sc-1t2gggy-0"})(["display:flex;flex-direction:column;row-gap:1.5rem;"]);var E=i(94105);var w=({role:e})=>{const{mutateAsync:r,isLoading:i}=function(){const{lifecycleId:e,roleId:r}=v(),i=(0,g.jE)(),{create:a}=(0,s.dj)();return(0,h.n)({mutationFn:i=>(0,f.rz)(Number(e),Number(r),i,a),onSuccess:async()=>{await i.invalidateQueries({queryKey:[y,e,r]})}})}(),{create:t}=(0,s.dj)(),n=e.type===f.Tz.PORTAL,{handleSubmit:l,formState:{errors:c},register:d,setError:m,watch:x}=(0,o.mN)({defaultValues:{name:e.name},shouldFocusError:!1}),p=x("name"),I=l(async e=>{try{await r(e),t("Scheme Role name saved",{variant:"success"})}catch(i){if((0,f.vO)(i))return;if((0,f.Ih)(i)&&i.errorDetails){const{name:e=[]}=i.errorDetails;if(e.length>0){const e=(0,E.mh)(i);m("name",{message:e}),t("Unable to save",{variant:"alert"})}else t((0,f.SU)(i)||u._.unexpectedError,{variant:"alert"})}else t((0,f.SU)(i)||u._.unexpectedError,{variant:"alert"})}});return(0,j.jsx)(a.az,{flex:!0,flexColumn:!0,rowGap:1.5,children:(0,j.jsx)(A,{onSubmit:I,children:(0,j.jsxs)(s.xA,{children:[(0,j.jsx)(s.Ei,{sm:8,children:(0,j.jsx)(a.H9,{action:n?null:(0,j.jsx)(a.$n,{type:"submit",variant:"primary",isLoading:i,isDisabled:p===e.name||!p||Object.keys(c).length>0,"data-testid":"role-save-button",children:"Save"}),children:(0,j.jsx)(a.A_,{label:"Role name",errorText:c.name?.message,maxLength:48,isReadOnly:n,...d("name",{required:"This field cannot be empty"})})})}),(0,j.jsx)(s.Ei,{sm:8,children:(0,j.jsx)(a.A_,{label:"Role code",value:e.code,isReadOnly:!0})})]})})})};const A=d.Ay.form.withConfig({displayName:"RoleEdit__StyledForm",componentId:"sc-8dx6oy-0"})(["display:flex;flex-direction:column;row-gap:3.5rem;"]);var R=i(76600);var T=()=>{const e=(0,l.LL)(),{data:r,error:i}=function(){const{lifecycleId:e,roleId:r}=v(),{create:i}=(0,s.dj)();return(0,m.I)({queryKey:[y,e,r],queryFn:()=>(0,f.iq)({url:`/build/lifecycles/${e}/roles/${r}/edit`,method:"GET",createToast:i})})}();return(0,t.useEffect)(()=>{i&&e("..")},[e,i]),r?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(s.DV,{children:(0,j.jsx)(a.az,{flex:!0,justifyContent:"center",width:"100%",py:.75,children:(0,j.jsx)(a.EY,{variant:"heading-07-semibold",children:r.lifecycle.name||n.J6})})}),(0,j.jsx)(s.PE,{children:(0,j.jsxs)(a.az,{py:2.5,children:[(0,j.jsx)(a.az,{mb:2.5,children:(0,j.jsx)(a.$n,{variant:"tertiary-light",leftIcon:"arrow-left-outline",onClick:()=>e(".."),children:"Back"})}),(0,j.jsxs)(a.az,{mb:2.5,children:[(0,j.jsx)(a.EY,{variant:"heading-03-bold",children:"Edit Scheme Role"}),(0,j.jsx)(a.az,{mt:.5,children:(0,j.jsx)(a.N_,{href:"https://go.gov.sg/applysg-guide-bo-schemerole",target:"_blank",rightIcon:"external-link-outline",children:"View guide"})})]}),(0,j.jsxs)(a.az,{flex:!0,flexColumn:!0,pb:2.5,children:[(0,j.jsx)(w,{role:r.role}),(0,j.jsx)(a.az,{my:2.5,children:(0,j.jsx)(R.c,{})}),(0,j.jsx)(I,{actors:r.role.actors,integrators:r.lifecycle.integrators,isDelegated:r.lifecycle.isDelegated,lifecycleId:r.lifecycle.id})]})]})})]}):(0,j.jsx)(s.Ip,{fullPage:!0,overlay:!1})}},94105:function(e,r,i){i.d(r,{BV:function(){return g},U7:function(){return h},mh:function(){return f},rO:function(){return x}});var a=i(39147),t=i(94447),n=i(7451),s=i(18690),l=i(37730),o=i(25683),c=i(39573),d=i(44488);const u="Builder/LifecycleRolesPageView";function f(e){const r=e.errorDetails?.name?.[0];if(!r)return e.message||o._.unexpectedError;switch(r.code){case"taken":return"A Role with this name already exists";
1case"invalid":return"Input can only contain a-z, A-Z, 0-9, () & _ -/ with no leading or trailing spaces";case"reserved":return"This Role name is reserved for a Portal Role in this portal";default:return o._.unexpectedError}}function m(){const{lifecycle_id:e}=(0,s.g)();return(0,l.A)(e,"missing lifecycle id"),{lifecycleId:e}}function g(){const{lifecycleId:e}=m(),{create:r}=(0,d.dj)();return(0,a.I)({queryKey:[u,e],queryFn:()=>(0,c.iq)({url:`/build/lifecycles/${e}/roles`,method:"GET",createToast:r})})}function h(){const e=(0,t.jE)(),{lifecycleId:r}=m(),{create:i}=(0,d.dj)();return(0,n.n)({mutationFn:e=>(0,c.WE)(Number(r),{name:e.name,roleCode:e.roleCode},i),onSuccess:async()=>{await e.invalidateQueries({queryKey:[u,r]})}})}function x(){const{lifecycleId:e}=m(),r=(0,t.jE)(),{create:i}=(0,d.dj)();return(0,n.n)({mutationFn:r=>(0,c.hj)(Number(e),r,i),onSuccess:async()=>{await r.invalidateQueries({queryKey:[u,e]})}})}}}]); 2//# sourceMappingURL=418.817ea028.chunk.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.