@xras/ui 0.13.0 → 0.14.0

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/dist/xras-ui.cjs CHANGED
@@ -288,7 +288,7 @@ object-assign
288
288
  */var GE,$I;function OH(){if($I)return GE;$I=1;var t=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function l(d){if(d==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(d)}function u(){try{if(!Object.assign)return!1;var d=new String("abc");if(d[5]="de",Object.getOwnPropertyNames(d)[0]==="5")return!1;for(var m={},h=0;h<10;h++)m["_"+String.fromCharCode(h)]=h;var y=Object.getOwnPropertyNames(m).map(function(C){return m[C]});if(y.join("")!=="0123456789")return!1;var x={};return"abcdefghijklmnopqrst".split("").forEach(function(C){x[C]=C}),Object.keys(Object.assign({},x)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}return GE=u()?Object.assign:function(d,m){for(var h,y=l(d),x,C=1;C<arguments.length;C++){h=Object(arguments[C]);for(var w in h)r.call(h,w)&&(y[w]=h[w]);if(t){x=t(h);for(var R=0;R<x.length;R++)i.call(h,x[R])&&(y[x[R]]=h[x[R]])}}return y},GE}var WE,zI;function SR(){if(zI)return WE;zI=1;var t="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";return WE=t,WE}var XE,UI;function fO(){return UI||(UI=1,XE=Function.call.bind(Object.prototype.hasOwnProperty)),XE}var YE,HI;function DH(){if(HI)return YE;HI=1;var t={},r=function(){};if(t.NODE_ENV!=="production"){var i=SR(),l={},u=fO();r=function(m){var h="Warning: "+m;typeof console<"u"&&console.error(h);try{throw new Error(h)}catch{}}}function d(m,h,y,x,C){if(t.NODE_ENV!=="production"){for(var w in m)if(u(m,w)){var R;try{if(typeof m[w]!="function"){var A=Error((x||"React class")+": "+y+" type `"+w+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof m[w]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw A.name="Invariant Violation",A}R=m[w](h,w,x,y,null,i)}catch(_){R=_}if(R&&!(R instanceof Error)&&r((x||"React class")+": type specification of "+y+" `"+w+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+typeof R+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),R instanceof Error&&!(R.message in l)){l[R.message]=!0;var N=C?C():"";r("Failed "+y+" type: "+R.message+(N??""))}}}}return d.resetWarningCache=function(){t.NODE_ENV!=="production"&&(l={})},YE=d,YE}var ZE,GI;function kH(){if(GI)return ZE;GI=1;var t={},r=CR(),i=OH(),l=SR(),u=fO(),d=DH(),m=function(){};t.NODE_ENV!=="production"&&(m=function(y){var x="Warning: "+y;typeof console<"u"&&console.error(x);try{throw new Error(x)}catch{}});function h(){return null}return ZE=function(y,x){var C=typeof Symbol=="function"&&Symbol.iterator,w="@@iterator";function R(Z){var ne=Z&&(C&&Z[C]||Z[w]);if(typeof ne=="function")return ne}var A="<<anonymous>>",N={array:P("array"),bigint:P("bigint"),bool:P("boolean"),func:P("function"),number:P("number"),object:P("object"),string:P("string"),symbol:P("symbol"),any:V(),arrayOf:U,element:F(),elementType:z(),instanceOf:X,node:me(),objectOf:ce,oneOf:Y,oneOfType:ie,shape:we,exact:ge};function _(Z,ne){return Z===ne?Z!==0||1/Z===1/ne:Z!==Z&&ne!==ne}function I(Z,ne){this.message=Z,this.data=ne&&typeof ne=="object"?ne:{},this.stack=""}I.prototype=Error.prototype;function M(Z){if(t.NODE_ENV!=="production")var ne={},be=0;function Ee(Ne,ke,Oe,ve,Ie,Xe,qe){if(ve=ve||A,Xe=Xe||Oe,qe!==l){if(x){var Ae=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types");throw Ae.name="Invariant Violation",Ae}else if(t.NODE_ENV!=="production"&&typeof console<"u"){var xt=ve+":"+Oe;!ne[xt]&&be<3&&(m("You are manually calling a React.PropTypes validation function for the `"+Xe+"` prop on `"+ve+"`. This is deprecated and will throw in the standalone `prop-types` package. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details."),ne[xt]=!0,be++)}}return ke[Oe]==null?Ne?ke[Oe]===null?new I("The "+Ie+" `"+Xe+"` is marked as required "+("in `"+ve+"`, but its value is `null`.")):new I("The "+Ie+" `"+Xe+"` is marked as required in "+("`"+ve+"`, but its value is `undefined`.")):null:Z(ke,Oe,ve,Ie,Xe)}var _e=Ee.bind(null,!1);return _e.isRequired=Ee.bind(null,!0),_e}function P(Z){function ne(be,Ee,_e,Ne,ke,Oe){var ve=be[Ee],Ie=Le(ve);if(Ie!==Z){var Xe=re(ve);return new I("Invalid "+Ne+" `"+ke+"` of type "+("`"+Xe+"` supplied to `"+_e+"`, expected ")+("`"+Z+"`."),{expectedType:Z})}return null}return M(ne)}function V(){return M(h)}function U(Z){function ne(be,Ee,_e,Ne,ke){if(typeof Z!="function")return new I("Property `"+ke+"` of component `"+_e+"` has invalid PropType notation inside arrayOf.");var Oe=be[Ee];if(!Array.isArray(Oe)){var ve=Le(Oe);return new I("Invalid "+Ne+" `"+ke+"` of type "+("`"+ve+"` supplied to `"+_e+"`, expected an array."))}for(var Ie=0;Ie<Oe.length;Ie++){var Xe=Z(Oe,Ie,_e,Ne,ke+"["+Ie+"]",l);if(Xe instanceof Error)return Xe}return null}return M(ne)}function F(){function Z(ne,be,Ee,_e,Ne){var ke=ne[be];if(!y(ke)){var Oe=Le(ke);return new I("Invalid "+_e+" `"+Ne+"` of type "+("`"+Oe+"` supplied to `"+Ee+"`, expected a single ReactElement."))}return null}return M(Z)}function z(){function Z(ne,be,Ee,_e,Ne){var ke=ne[be];if(!r.isValidElementType(ke)){var Oe=Le(ke);return new I("Invalid "+_e+" `"+Ne+"` of type "+("`"+Oe+"` supplied to `"+Ee+"`, expected a single ReactElement type."))}return null}return M(Z)}function X(Z){function ne(be,Ee,_e,Ne,ke){if(!(be[Ee]instanceof Z)){var Oe=Z.name||A,ve=G(be[Ee]);return new I("Invalid "+Ne+" `"+ke+"` of type "+("`"+ve+"` supplied to `"+_e+"`, expected ")+("instance of `"+Oe+"`."))}return null}return M(ne)}function Y(Z){if(!Array.isArray(Z))return t.NODE_ENV!=="production"&&(arguments.length>1?m("Invalid arguments supplied to oneOf, expected an array, got "+arguments.length+" arguments. A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z])."):m("Invalid argument supplied to oneOf, expected an array.")),h;function ne(be,Ee,_e,Ne,ke){for(var Oe=be[Ee],ve=0;ve<Z.length;ve++)if(_(Oe,Z[ve]))return null;var Ie=JSON.stringify(Z,function(qe,Ae){var xt=re(Ae);return xt==="symbol"?String(Ae):Ae});return new I("Invalid "+Ne+" `"+ke+"` of value `"+String(Oe)+"` "+("supplied to `"+_e+"`, expected one of "+Ie+"."))}return M(ne)}function ce(Z){function ne(be,Ee,_e,Ne,ke){if(typeof Z!="function")return new I("Property `"+ke+"` of component `"+_e+"` has invalid PropType notation inside objectOf.");var Oe=be[Ee],ve=Le(Oe);if(ve!=="object")return new I("Invalid "+Ne+" `"+ke+"` of type "+("`"+ve+"` supplied to `"+_e+"`, expected an object."));for(var Ie in Oe)if(u(Oe,Ie)){var Xe=Z(Oe,Ie,_e,Ne,ke+"."+Ie,l);if(Xe instanceof Error)return Xe}return null}return M(ne)}function ie(Z){if(!Array.isArray(Z))return t.NODE_ENV!=="production"&&m("Invalid argument supplied to oneOfType, expected an instance of array."),h;for(var ne=0;ne<Z.length;ne++){var be=Z[ne];if(typeof be!="function")return m("Invalid argument supplied to oneOfType. Expected an array of check functions, but received "+De(be)+" at index "+ne+"."),h}function Ee(_e,Ne,ke,Oe,ve){for(var Ie=[],Xe=0;Xe<Z.length;Xe++){var qe=Z[Xe],Ae=qe(_e,Ne,ke,Oe,ve,l);if(Ae==null)return null;Ae.data&&u(Ae.data,"expectedType")&&Ie.push(Ae.data.expectedType)}var xt=Ie.length>0?", expected one of type ["+Ie.join(", ")+"]":"";return new I("Invalid "+Oe+" `"+ve+"` supplied to "+("`"+ke+"`"+xt+"."))}return M(Ee)}function me(){function Z(ne,be,Ee,_e,Ne){return xe(ne[be])?null:new I("Invalid "+_e+" `"+Ne+"` supplied to "+("`"+Ee+"`, expected a ReactNode."))}return M(Z)}function ae(Z,ne,be,Ee,_e){return new I((Z||"React class")+": "+ne+" type `"+be+"."+Ee+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+_e+"`.")}function we(Z){function ne(be,Ee,_e,Ne,ke){var Oe=be[Ee],ve=Le(Oe);if(ve!=="object")return new I("Invalid "+Ne+" `"+ke+"` of type `"+ve+"` "+("supplied to `"+_e+"`, expected `object`."));for(var Ie in Z){var Xe=Z[Ie];if(typeof Xe!="function")return ae(_e,Ne,ke,Ie,re(Xe));var qe=Xe(Oe,Ie,_e,Ne,ke+"."+Ie,l);if(qe)return qe}return null}return M(ne)}function ge(Z){function ne(be,Ee,_e,Ne,ke){var Oe=be[Ee],ve=Le(Oe);if(ve!=="object")return new I("Invalid "+Ne+" `"+ke+"` of type `"+ve+"` "+("supplied to `"+_e+"`, expected `object`."));var Ie=i({},be[Ee],Z);for(var Xe in Ie){var qe=Z[Xe];if(u(Z,Xe)&&typeof qe!="function")return ae(_e,Ne,ke,Xe,re(qe));if(!qe)return new I("Invalid "+Ne+" `"+ke+"` key `"+Xe+"` supplied to `"+_e+"`.\nBad object: "+JSON.stringify(be[Ee],null," ")+`
289
289
  Valid keys: `+JSON.stringify(Object.keys(Z),null," "));var Ae=qe(Oe,Xe,_e,Ne,ke+"."+Xe,l);if(Ae)return Ae}return null}return M(ne)}function xe(Z){switch(typeof Z){case"number":case"string":case"undefined":return!0;case"boolean":return!Z;case"object":if(Array.isArray(Z))return Z.every(xe);if(Z===null||y(Z))return!0;var ne=R(Z);if(ne){var be=ne.call(Z),Ee;if(ne!==Z.entries){for(;!(Ee=be.next()).done;)if(!xe(Ee.value))return!1}else for(;!(Ee=be.next()).done;){var _e=Ee.value;if(_e&&!xe(_e[1]))return!1}}else return!1;return!0;default:return!1}}function je(Z,ne){return Z==="symbol"?!0:ne?ne["@@toStringTag"]==="Symbol"||typeof Symbol=="function"&&ne instanceof Symbol:!1}function Le(Z){var ne=typeof Z;return Array.isArray(Z)?"array":Z instanceof RegExp?"object":je(ne,Z)?"symbol":ne}function re(Z){if(typeof Z>"u"||Z===null)return""+Z;var ne=Le(Z);if(ne==="object"){if(Z instanceof Date)return"date";if(Z instanceof RegExp)return"regexp"}return ne}function De(Z){var ne=re(Z);switch(ne){case"array":case"object":return"an "+ne;case"boolean":case"date":case"regexp":return"a "+ne;default:return ne}}function G(Z){return!Z.constructor||!Z.constructor.name?A:Z.constructor.name}return N.checkPropTypes=d,N.resetWarningCache=d.resetWarningCache,N.PropTypes=N,N},ZE}var qE,WI;function MH(){if(WI)return qE;WI=1;var t=SR();function r(){}function i(){}return i.resetWarningCache=r,qE=function(){function l(m,h,y,x,C,w){if(w!==t){var R=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw R.name="Invariant Violation",R}}l.isRequired=l;function u(){return l}var d={array:l,bigint:l,bool:l,func:l,number:l,object:l,string:l,symbol:l,any:l,arrayOf:u,element:l,elementType:l,instanceOf:u,node:l,objectOf:u,oneOf:u,oneOfType:u,shape:u,exact:u,checkPropTypes:i,resetWarningCache:r};return d.PropTypes=d,d},qE}var LH={};if(LH.NODE_ENV!=="production"){var PH=CR(),FH=!0;Iw.exports=kH()(PH.isElement,FH)}else Iw.exports=MH()();var VH=Iw.exports;const Ve=nh(VH),BH=(t,r)=>{switch(r.type){case"SET_RESOURCE_DATA":return{...t,resourceData:r.payload,loading:!1};case"SET_LOADING":return{...t,loading:r.payload};case"SET_SUCCESS_MESSAGE":return{...t,successMessage:r.payload};case"SET_ERRORS":return{...t,errors:Array.isArray(r.payload)?r.payload:[r.payload],loading:!1};case"UPDATE_RESOURCE_FIELD":return{...t,resourceData:{...t.resourceData,resource_details:{...t.resourceData.resource_details,[r.field]:r.value}}};case"UPDATE_ALLOCATION":return{...t,resourceData:{...t.resourceData,resource_details:{...t.resourceData.resource_details,allocation_types:t.resourceData.resource_details.allocation_types.map(i=>i.allocation_type_id===r.payload.allocationTypeId?{...i,...r.payload.updates}:i)}}};case"UPDATE_BASE_RATE":return console.log("Reducer: Updating base rate to:",r.payload),{...t,resourceData:{...t.resourceData,resource_details:{...t.resourceData.resource_details,exchange_rates:{...t.resourceData.resource_details.exchange_rates,base_rate:r.payload}}}};case"UPDATE_EXCHANGE_RATE":return{...t,resourceData:{...t.resourceData,resource_details:{...t.resourceData.resource_details,exchange_rates:{...t.resourceData.resource_details.exchange_rates,discount_rates:t.resourceData.resource_details.exchange_rates.discount_rates.map(i=>i.id===r.payload.rateId?{...i,...r.payload.changes}:i)}}}};case"ADD_EXCHANGE_RATE":return console.log("Reducer: Adding new discount rate:",r.payload),{...t,resourceData:{...t.resourceData,resource_details:{...t.resourceData.resource_details,exchange_rates:{...t.resourceData.resource_details.exchange_rates,discount_rates:[...t.resourceData.resource_details.exchange_rates.discount_rates||[],r.payload]}}}};case"DELETE_EXCHANGE_RATE":return{...t,resourceData:{...t.resourceData,resource_details:{...t.resourceData.resource_details,exchange_rates:{...t.resourceData.resource_details.exchange_rates,discount_rates:t.resourceData.resource_details.exchange_rates.discount_rates.filter(i=>i.id!==r.payload)}}}};default:return t}},jw=t=>({type:"SET_RESOURCE_DATA",payload:t}),$H=t=>({type:"SET_LOADING",payload:t}),XI=(t,r)=>({type:"SET_SUCCESS_MESSAGE",payload:{message:t,color:r}}),cm=(t,r)=>({type:"UPDATE_RESOURCE_FIELD",field:t,value:r}),JE=(t,r)=>({type:"UPDATE_ALLOCATION",payload:{allocationTypeId:t,updates:r}}),zH=async(t,r)=>await(await fetch(`${r}/resources/${t}.json`)).json(),UH=async(t,r,i,l)=>(console.log("update resource",i),await fetch(`${r}/resources/${t}`,{method:"PATCH",headers:{"Content-Type":"application/json","X-CSRF-Token":document.querySelector('meta[name="csrf-token"]').content},body:JSON.stringify({resource:i,required_resources:l})})),HH=(t,r)=>{const[i,l]=k.useReducer(BH,{resourceData:null,loading:!0,errors:[],successMessage:{message:"",color:""}}),u=k.useCallback(async(m,h)=>{let y=[h];try{const x=await m.json();x.errors?y=x.errors:x.message&&(y=[x.message])}catch(x){console.error("Error parsing error response:",x)}l({type:"SET_ERRORS",payload:y})},[]),d=k.useCallback(async()=>{l($H(!0));try{const m=await zH(t,r);l(jw(m))}catch(m){console.error("Failed to fetch resource data:",m),l({type:"SET_ERRORS",payload:"Failed to fetch resource data. Please try again later."})}},[t,r]);return k.useEffect(()=>{d()},[d]),{state:i,dispatch:l,handleError:u,fetchData:d}},ER=t=>{var r,i,l;return{allowedActionsOptions:((r=t==null?void 0:t.resource_state_types_available)==null?void 0:r.map(u=>({value:u.resource_state_type_id,label:u.display_resource_state_type,additionalInfo:u.action_types.map(d=>d.display_action_type).join(", ")})))||[],resourceTypesOptions:((i=t==null?void 0:t.resource_types_available)==null?void 0:i.map(u=>({value:u.resource_type_id,label:u.display_resource_type})))||[],unitTypesOptions:((l=t==null?void 0:t.unit_types_available)==null?void 0:l.map(u=>({value:u.unit_type_id,label:u.display_unit_type})))||[],availableResources:(t==null?void 0:t.required_resources_available)||[],availableAllocationTypes:(t==null?void 0:t.unassigned_allocation_types)||[]}},GH=(t,r,i,l,u,d,m)=>{const y=(()=>{var R;if(!t)return[];const w=new Set;return(R=t.allocation_types)==null||R.forEach(A=>{var N;(N=A.required_resources)==null||N.forEach(_=>{w.add(_.resource_name)})}),Array.from(w).sort((A,N)=>A.localeCompare(N)).map(A=>({key:A,name:`Require ${A}`,width:150,type:"checkbox"}))})();return{allocationColumns:[{key:"display_name",name:"Allocation Type",width:200},{key:"allowed_actions",name:"Allowed Actions",width:200,type:"select"},{key:"comment",name:"Descriptive Text",width:200,type:"input",tooltip:"Appears below the resource name and allocations description in the form when making a new request"},...y],allocationRows:t!=null&&t.allocation_types?t.allocation_types.map(w=>{var R;return{display_name:w.display_name,allocation_type_id:w.allocation_type_id,allowed_actions:{options:l,value:((R=w.allowed_action)==null?void 0:R.resource_state_type_id)||"",onChange:A=>u(w.allocation_type_id,A)},comment:{value:w.comment||"",onChange:A=>d(w.allocation_type_id,A)},...Object.fromEntries(y.map(A=>{var N;return[A.key,{checked:((N=w.required_resources)==null?void 0:N.some(_=>_.resource_name===A.key))||!1,onChange:_=>m(w.allocation_type_id,A.key,_,w)}]}))}}):[],requiredResourcesColumns:y}},WH=(t,r,i)=>{const{availableResources:l,availableAllocationTypes:u,allowedActionsOptions:d}=ER(t),[m,h]=k.useState(!1),[y,x]=k.useState(!1),[C,w]=k.useState([]),[R,A]=k.useState(""),N=k.useCallback((F,z)=>{i(JE(F,{allowed_action:{resource_state_type_id:z}}))},[i]),_=k.useCallback((F,z)=>{i(JE(F,{comment:z}))},[i]),I=k.useCallback((F,z,X,Y)=>{const ce=X?[...Y.required_resources||[],{resource_name:z,required_resource_id:t.required_resources_available.find(ie=>ie.resource_name===z).resource_id}]:(Y.required_resources||[]).filter(ie=>ie.resource_name!==z);i(JE(F,{required_resources:ce}))},[t,i]);k.useEffect(()=>{if(m&&r){const F=r.allocation_types.flatMap(z=>z.required_resources||[]).map(z=>z.required_resource_id);w(F)}},[m,r]);const M=k.useCallback((F,z)=>{w(X=>z?[...X,F]:X.filter(Y=>Y!==F))},[]),P=k.useCallback(()=>{const F=r.allocation_types.flatMap(ce=>ce.required_resources||[]).map(ce=>ce.required_resource_id),z=C.filter(ce=>!F.includes(ce)),X=F.filter(ce=>!C.includes(ce)),Y=r.allocation_types.map(ce=>{const ie=ce.required_resources||[],me=z.map(we=>{const ge=l.find(xe=>xe.resource_id===we);return{resource_name:ge.resource_name,required_resource_id:ge.resource_id}}),ae=ie.filter(we=>!X.includes(we.required_resource_id)).concat(me.filter(we=>!ie.some(ge=>ge.required_resource_id===we.required_resource_id)));return{...ce,required_resources:ae}});i(jw({...t,resource_details:{...r,allocation_types:Y}})),w([]),h(!1)},[C,l,r,t,i]),V=k.useCallback(F=>{const z=F.target.value;A(z)},[]),U=k.useCallback(()=>{var X,Y;if(!R)return;const F=u.find(ce=>ce.allocation_type_id.toString()===R),z=(X=r.allocation_types)==null?void 0:X.some(ce=>ce.allocation_type_id===F.allocation_type_id);if(F&&!z){const ce=(Y=d[0])==null?void 0:Y.value,ie=[...r.allocation_types||[],{allocation_type_id:F.allocation_type_id,display_name:F.display_name,allowed_action:{resource_state_type_id:ce},comment:"",required_resources:[]}];i(jw({...t,resource_details:{...r,allocation_types:ie}})),x(!1)}},[R,u,r,t,i,d]);return{showAddResourceModal:m,setShowAddResourceModal:h,showAddAllocationTypeModal:y,setShowAddAllocationTypeModal:x,selectedNewResource:C,handleSelectNewResource:M,handleSaveResources:P,selectedNewAllocationType:R,handleSelectNewAllocationType:V,handleSaveAllocationType:U,handleAllowedActionChange:N,handleCommentChange:_,handleRequiredResourceChange:I}},XH=(t,r,i,l,u,d)=>k.useCallback(async()=>{var y,x,C;if(!t)return;const m={resource_name:t.resource_name,description:t.description,resource_type_id:t.resource_type_id,unit_type_id:t.unit_type_id,dollar_value:t.dollar_value,allocation_types:t.allocation_types.map(w=>{var R;return{allocation_type_id:w.allocation_type_id,allowed_action:{resource_state_type_id:(R=w.allowed_action)==null?void 0:R.resource_state_type_id},comment:w.comment||""}}),exchange_rates:{base_rate:(y=t.exchange_rates)==null?void 0:y.base_rate,discount_rates:(C=(x=t.exchange_rates)==null?void 0:x.discount_rates)==null?void 0:C.map(w=>({id:w.id,exchange_rate:w.exchange_rate,begin_date:w.begin_date,end_date:w.end_date}))}},h={};t.allocation_types.forEach(w=>{w.required_resources.forEach(R=>{h[R.required_resource_id]||(h[R.required_resource_id]=[]),h[R.required_resource_id].push(w.allocation_type_id)})});try{const w=await UH(r,i,m,h);if(w.ok){const R=await w.json();return d(XI(R.message||"Resource updated successfully!","success")),await l(),!0}else return await u(w,"Failed to update resource"),!1}catch{return d(XI("Error updating resource. Please try again later.","danger")),!1}},[t,r,i,l,u]),YH=(t=!1)=>{const[r,i]=k.useState(t);return{isEditing:r,handleEditingChange:u=>{i(u)}}},ZH={"form-wrapper":"_form-wrapper_mu0yh_1"},Cx=({show:t,onClose:r,title:i,children:l,onSave:u,buttonText:d,cancelText:m="Cancel",canSave:h=!0})=>t?v.jsx("div",{style:{position:"fixed",top:0,left:0,width:"100%",height:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",display:"flex",alignItems:"center",zIndex:1050},children:v.jsx("div",{className:"modal fade in",tabIndex:"-1",role:"dialog","aria-hidden":"true",style:{width:"90%",maxWidth:"600px",maxHeight:"90%",overflow:"auto",backgroundColor:"white",position:"relative"},children:v.jsx("div",{className:"modal-dialog",role:"document",children:v.jsxs("div",{className:"modal-content",children:[v.jsxs("div",{className:"modal-header",children:[v.jsx("button",{type:"button",className:"close","data-dismiss":"modal",onClick:r,"aria-label":"Close",children:v.jsx("h3",{"aria-hidden":"true",className:"text-danger",children:"×"})}),v.jsx("h3",{className:"modal-title",children:i})]}),v.jsx("div",{className:"modal-body",children:l}),v.jsxs("div",{className:"modal-footer",style:{padding:"15px",textAlign:"right",borderTop:"1px solid #e5e5e5",backgroundColor:"#f8f9fa"},children:[v.jsx("button",{className:"btn btn-danger",onClick:r,children:m}),v.jsx("button",{className:"btn btn-success",onClick:u,disabled:!h,children:d})]})]})})})}):null;Cx.propTypes={show:Ve.bool.isRequired,onClose:Ve.func.isRequired,title:Ve.string.isRequired,children:Ve.node.isRequired,onSave:Ve.func.isRequired,buttonText:Ve.string,cancelText:Ve.string,canSave:Ve.bool};const hr=({children:t,color:r,dismissable:i=!1})=>v.jsxs("div",{className:`alert alert-${r} mt-3 alert-dismissible show`,role:"alert",children:[t,i&&v.jsx("button",{type:"button",className:"close","data-dismiss":"alert","aria-label":"Close",children:v.jsx("span",{"aria-hidden":"true",children:"×"})})]}),Yp=({label:t,options:r,value:i,onChange:l,...u})=>v.jsxs("div",{className:"form-group",children:[t&&v.jsx("label",{children:t}),v.jsx("select",{className:"form-control",value:i,onChange:l,...u,children:r.map(d=>v.jsxs("option",{value:d.value,children:[d.label,d.additionalInfo&&` - ${d.additionalInfo}`]},d.value))})]});Yp.propTypes={label:Ve.string,options:Ve.arrayOf(Ve.shape({value:Ve.oneOfType([Ve.string,Ve.number]).isRequired,label:Ve.string.isRequired,additionalInfo:Ve.string})).isRequired,value:Ve.oneOfType([Ve.string,Ve.number]),onChange:Ve.func.isRequired};function xm({label:t,type:r="text",value:i,onChange:l,disabled:u=!1,infoText:d="",style:m,inputClassName:h,inputAddon:y}){return v.jsxs(v.Fragment,{children:[t&&v.jsx("label",{children:t}),d&&v.jsx("small",{className:"form-text help-block",children:d}),r==="textarea"?v.jsx("textarea",{className:`form-control ${h||""}`,value:i,onChange:l,disabled:u,rows:"6"}):y?v.jsxs("div",{className:"input-prepend",children:[v.jsx("span",{className:"add-on",children:y}),v.jsx("input",{type:r,className:`form-control ${h||""}`,style:m,value:i,onChange:l,disabled:u})]}):v.jsx("input",{type:r,className:`form-control ${h||""}`,style:m,value:i,onChange:l,disabled:u})]})}const qH="_blurred_16xcy_16",ql={"advanced-settings":"_advanced-settings_16xcy_1","header-wrapper":"_header-wrapper_16xcy_5","content-container":"_content-container_16xcy_11",blurred:qH,"warning-banner":"_warning-banner_16xcy_21","alt-warning-banner":"_alt-warning-banner_16xcy_40 _warning-banner_16xcy_21"},wR=({headerText:t,header:r,children:i,isEditing:l=!1,onEditingChange:u,warningMessage:d=""})=>{const m=t&&t.type==="label";return v.jsxs("div",{className:ql["advanced-settings"],children:[(t||r)&&v.jsxs("div",{className:ql["header-wrapper"],children:[t,r&&v.jsx("div",{className:`${ql["header-buttons-container"]} ${l?"":ql.blurred}`,children:r})]}),v.jsxs("div",{style:{width:"100%"},children:[!l&&v.jsxs("div",{className:m?`${ql["alt-warning-banner"]}`:ql["warning-banner"],children:[v.jsxs("span",{className:ql["warning-text"],children:[v.jsx("strong",{children:"CAUTION! "})," ",d]}),v.jsx("button",{className:"btn btn-danger",onClick:()=>u(!0),children:"I understand the risks"})]}),v.jsx("div",{className:`${ql["content-container"]} ${l?"":ql.blurred}`,children:i})]})]})};wR.propTypes={headerText:Ve.node,header:Ve.node,children:Ve.node.isRequired,isEditing:Ve.bool,onEditingChange:Ve.func.isRequired,warningMessage:Ve.string};const RR=ir.memo(function({resourceDetails:r,resourceTypesOptions:i,unitTypesOptions:l,dispatch:u,isDollarValueEditing:d,onDollarValueEditingChange:m,showDollarValue:h=!0,showResourceId:y=!0,useAdvancedSettings:x=!0}){const C="Dollar Value per SUs",w=h?v.jsx(xm,{label:x?null:C,value:r.dollar_value,onChange:R=>u(cm("dollar_value",R.target.value)),type:"number",inputAddon:"$",inputClassName:"span4"}):null;return v.jsxs(v.Fragment,{children:[v.jsx(xm,{label:"Resource Name",value:r.resource_name,onChange:R=>u(cm("resource_name",R.target.value)),inputClassName:"span8"}),y&&v.jsx(xm,{label:"Resource Repository Key",value:r.resource_repository_key,disabled:!0,inputClassName:"span8"}),x&&h?v.jsx(wR,{headerText:v.jsx("label",{children:C}),isEditing:d,onEditingChange:m,warningMessage:"Dollar value is for reporting and should only be modified if the SU rate changes.",children:w}):w,v.jsx(xm,{label:"Allocations Description",type:"textarea",value:r.description,infoText:"Appears below the resource name in the form when making a new request, as well as under the header Allocations Description in resource catalogs",onChange:R=>u(cm("description",R.target.value)),inputClassName:"span8"}),v.jsx(Yp,{label:"Resource Type",options:i,value:r.resource_type_id,onChange:R=>u(cm("resource_type_id",R.target.value)),className:"span8"}),v.jsx(Yp,{label:"Unit Type",options:l,value:r.unit_type_id,onChange:R=>u(cm("unit_type_id",R.target.value)),className:"span8"})]})});RR.propTypes={resourceDetails:Ve.object.isRequired,resourceTypesOptions:Ve.array.isRequired,unitTypesOptions:Ve.array.isRequired,dispatch:Ve.func.isRequired,isDollarValueEditing:Ve.bool,onDollarValueEditingChange:Ve.func,showDollarValue:Ve.bool,showResourceId:Ve.bool,useAdvancedSettings:Ve.bool};function pO({onClose:t}){const[r,i]=k.useState(!0),[l,u]=k.useState([]),[d,m]=k.useState(null),[h,y]=k.useState(-1),[x,C]=k.useState(null),w=ER(x);w.resourceTypesOptions.unshift({value:0,label:"Select a resource type..."}),w.unitTypesOptions.unshift({value:0,label:"Select a unit type..."}),k.useEffect(()=>{(async()=>{const P=await fetch("/resources/addable.json");i(!1),P.status==200?u(await P.json()):m("Error retrieving resource list.")})()},[]),k.useEffect(()=>{if(h===-1)return C(null);(async()=>{const P=await fetch(`/resources/addable/${h}.json`);P.status==200?C(await P.json()):m("Error retrieving resource details.")})()},[h]);let R=null;r?R=v.jsx("p",{children:"Loading…"}):d!==null?R=v.jsx(hr,{color:"danger",children:d}):l.length==0&&(R=v.jsx(hr,{children:"There are currently no resources available to add."}));const A=[{value:-1,label:"Select a resource..."}].concat(l.map(P=>({value:P.xras_cider_resource_id,label:P.resource_descriptive_name}))),N=x?x.resource_details:null,_=!d&&N&&N.resource_name.length>0&&N.resource_type_id>0&&N.unit_type_id>0,I=P=>{P.type=="UPDATE_RESOURCE_FIELD"&&C({...x,resource_details:{...x.resource_details,[P.field]:P.value}})},M=()=>{(async()=>{const P=await fetch("/resources",{method:"POST",headers:{"Content-Type":"application/json","X-CSRF-Token":document.querySelector('meta[name="csrf-token"]').content},body:JSON.stringify({...N,resource_repository_key:h})});if(P.status==200){const V=await P.json();window.location=`/resources/${V.resource_id}`}else m("Error saving resource.")})()};return R===null&&(R=v.jsxs(v.Fragment,{children:[v.jsx("h2",{children:"Select a Resource to Add"}),v.jsx(Yp,{options:A,onChange:P=>y(parseInt(P.target.value))}),!x&&h!==-1?v.jsx("p",{children:"Loading…"}):null,x&&v.jsxs(v.Fragment,{children:[v.jsx("h2",{children:"Resource Properties"}),v.jsx("p",{style:{fontStyle:"italic",fontWeight:"bold"},children:"Any modifications to these resource properties will be applied globally and impact resources on other all allocations process"}),v.jsx("div",{className:ZH["form-wrapper"],children:v.jsx(RR,{resourceDetails:N,resourceTypesOptions:w.resourceTypesOptions,unitTypesOptions:w.unitTypesOptions,showResourceId:!1,showDollarValue:!1,dispatch:I})})]})]})),v.jsx(Cx,{show:!0,onClose:t,title:"Add a Resource from CIDeR",onSave:M,buttonText:"Save",canSave:_,children:R})}pO.propTypes={onClose:Ve.func.isRequired};function JH({availableResources:t,canAdd:r=!1,relativeUrlRoot:i}){const l=k.useMemo(()=>NH(t),[t]),[u,d]=k.useState(l),[m,h]=k.useState(!1),y=k.useRef(null),x=k.useRef(null);k.useEffect(()=>{d(l)},[l]);const C=(A,N)=>{y.current=N},w=(A,N)=>{if(A.preventDefault(),y.current===N)return;const _=[...u],I=_[y.current];_.splice(y.current,1),_.splice(N,0,I),y.current=N,d(_);const{clientY:M}=A,P=130;M<P?PI(-1,x):window.innerHeight-M<P?PI(1,x):HE(x)},R=()=>{y.current=null,HE(x),TH(i,u)};return k.useEffect(()=>()=>HE(x),[]),v.jsxs(v.Fragment,{children:[v.jsxs("div",{className:ls["resources-container"],children:[r&&v.jsx("button",{className:"btn btn-primary pull-right",onClick:()=>h(!0),children:"Add a Resource from CIDeR"}),v.jsx("h2",{children:"Select a resource from the list to modify"}),v.jsx("p",{className:ls["drag-instruction"],children:"Drag items to reorder the list."}),v.jsxs("div",{className:ls["resources-list"],children:[v.jsxs("div",{className:ls["resources-header"],children:[v.jsx("span",{className:ls["header-name"],children:"Resource Name"}),v.jsx("span",{className:ls["header-repo"],children:"Repository Key"})]}),u.map((A,N)=>v.jsxs("div",{className:`${ls["resources-item"]}`,draggable:!0,onDragStart:_=>C(_,N),onDragOver:_=>w(_,N),onDrop:R,children:[v.jsx("span",{className:ls["drag-handle"]}),v.jsx("span",{className:ls["resource-name"],children:v.jsx("a",{href:`${i}/resources/${A.resource_id}`,className:ls["resource-link"],children:A.display_resource_name})}),v.jsx("span",{className:ls["resource-repo"],children:A.resource_repository_key||"N/A"})]},A.resource_id))]})]}),m&&v.jsx(pO,{onClose:()=>h(!1)})]})}function ah(){return v.jsx("div",{className:"spinner-border",role:"status",children:v.jsx("span",{className:"visually-hidden",children:"Loading..."})})}const QH="_grid_afccc_1",KH="_important_afccc_30",e3="_input_afccc_34",t3="_edited_afccc_38",n3="_disabled_afccc_46",r3="_scroll_afccc_59",Gd={grid:QH,important:KH,input:e3,edited:t3,disabled:n3,scroll:r3};function a3({column:t,row:r,style:i={}}){const l=t.format?t.format(r[t.key],r):r[t.key],u=["cell"];return t.class&&u.push(t.class),t.rowClass&&u.push(t.rowClass(r)),v.jsx("td",{className:u.join(" "),style:i,children:l})}const _R=({title:t,placement:r,children:i})=>(k.useEffect(()=>($('[data-toggle="tooltip"]').tooltip(),()=>{$('[data-toggle="tooltip"]').tooltip("destroy")}),[]),v.jsx("span",{"data-toggle":"tooltip","data-placement":r,title:t,style:{margin:"10px"},children:i}));_R.propTypes={title:Ve.string.isRequired,placement:Ve.oneOf(["top","bottom","left","right"]),children:Ve.node.isRequired};_R.defaultProps={placement:"top"};const i3="_datepicker_19wnv_1",o3="_error_19wnv_1",YI={datepicker:i3,error:o3},s3=({value:t,onChange:r,disabled:i=!1,style:l,className:u="",minDate:d="",maxDate:m="",error:h=""})=>{const y=h;return v.jsx("div",{className:`w-full ${u}`,children:v.jsx("input",{type:"date",style:l,className:`${YI.datepicker} ${y?YI.error:""}`,value:t||"",onChange:x=>r(x.target.value),disabled:i,min:d||"1900-01-01",max:m||"2100-12-31"})})},dm=(t,r,i)=>{if(r.onChange){r.onChange(i,t);return}const l=t[r.key];l!=null&&l.onChange&&l.onChange(i)},l3={text:a3,select:({column:t,row:r,style:i})=>v.jsx("td",{style:i,children:v.jsx(Yp,{label:"",options:r[t.key].options,value:r[t.key].value,onChange:l=>dm(r,t,l.target.value),style:{width:"100%",margin:0}})}),input:({column:t,row:r,style:i})=>v.jsx("td",{style:i,children:v.jsx(xm,{label:"",type:"text",disabled:r[t.key].disabled,value:r[t.key].value,onChange:l=>dm(r,t,l.target.value),style:{width:"92%",margin:0}})}),checkbox:({column:t,row:r,style:i})=>v.jsx("td",{style:i,children:v.jsx("input",{type:"checkbox",checked:r[t.key].checked,onChange:l=>dm(r,t,l.target.checked)})}),date:({column:t,row:r,style:i})=>{const l=r[t.key];return!(l!=null&&l.value)&&typeof l!="object"?v.jsx("td",{style:i,children:l||""}):v.jsx("td",{style:i,children:v.jsx(s3,{value:l.value,onChange:u=>dm(r,t,u),disabled:l.disabled,style:{width:"92%",margin:0},minDate:t.minDate,maxDate:t.maxDate,error:l.error})})},action:({column:t,row:r,style:i})=>v.jsx("td",{style:i,children:r.rate_type==="Discount"&&v.jsx("button",{className:"btn btn-link text-danger",onClick:()=>{var l;return dm(r,t,(l=r[t.key])==null?void 0:l.id)},children:v.jsx("i",{className:"fa fa-trash"})})})};function su({columns:t,rows:r,classes:i,frozenColumns:l=0,minWidth:u,rowClasses:d=[],scroll:m=!0,scrollBehavior:h="smooth",scrollRowIndex:y=0}){const x=k.useRef();k.useLayoutEffect(()=>{if(!m||!x.current)return;const _=x.current.querySelector(`tbody tr:nth-child(${y+1})`);_&&_.scrollIntoView({behavior:h,block:"nearest",inline:"nearest"})},[m,y,h]);const C=[0];for(let _=0;_<l;_++)C[_+1]=C[_]+(t[_].width||100);const w=(_,I)=>_<l?{position:"sticky",left:`${C[_]}px`,minWidth:`${t[_].width||100}px`,width:`${t[_].width||100}px`,zIndex:I||1}:{},R=t.map((_,I)=>v.jsxs("th",{className:_.headerClass||_.class||"",style:w(I,100),children:[_.formatHeader?_.formatHeader(_.name,_):_.name,_.tooltip&&v.jsx(_R,{title:_.tooltip,placement:"bottom",children:v.jsx("i",{className:"icon-info-sign"})})]},_.key)),A=r.map((_,I)=>{const M=t.map((P,V)=>{const U=l3[P.type||"text"];return v.jsx(U,{column:P,row:_,style:w(V)},P.key)});return v.jsx("tr",{className:d[I]||"",children:M},I)}),N={};return u&&(N.minWidth=u),v.jsx("div",{className:`${Gd.grid} ${m?Gd.scroll:""} ${i||""}`,ref:x,children:v.jsxs("table",{className:"table table-bordered",style:N,children:[v.jsx("thead",{children:v.jsx("tr",{children:R})}),v.jsx("tbody",{children:A})]})})}const Aw={"header-buttons":"_header-buttons_15oxx_1","allocation-types-grid":"_allocation-types-grid_15oxx_6","vertical-align-center":"_vertical-align-center_15oxx_10"},hO=({onAddAllocationType:t,onAddRequiredResource:r})=>v.jsxs("div",{className:Aw["header-buttons"],children:[v.jsxs("button",{className:"btn btn-primary",onClick:t,children:[v.jsx("i",{className:"fa fa-plus"})," Add Allocation Type"]}),v.jsxs("button",{className:"btn btn-primary",onClick:r,children:[v.jsx("i",{className:"fa fa-plus"})," Add Required Resource"]})]});hO.propTypes={headerText:Ve.node,onAddAllocationType:Ve.func.isRequired,onAddRequiredResource:Ve.func.isRequired};const vO=ir.memo(function({columns:r,rows:i}){return v.jsxs("div",{className:Aw["allocation-types-grid"],children:[v.jsx(su,{columns:r,rows:i,rowClasses:Array(i.length).fill(Aw["vertical-align-center"]),scroll:!1}),v.jsx("p",{style:{margin:"0",fontStyle:"italic",fontWeight:"bold"},children:"Note: You may need to contact your Allocations Coordinator if you have added this resource to an allocation type."})]})});vO.propTypes={columns:Ve.array.isRequired,rows:Ve.array.isRequired};const Vp={"exchange-rates-grid":"_exchange-rates-grid_5qkd5_1","header-container":"_header-container_5qkd5_5","header-buttons":"_header-buttons_5qkd5_11","vertical-align-center":"_vertical-align-center_5qkd5_18","error-summary":"_error-summary_5qkd5_35"},mO=ir.memo(function({columns:r,rows:i,onAddDiscountRate:l,dateErrors:u=[]}){return v.jsxs("div",{className:Vp["exchange-rates-grid"],children:[v.jsxs("div",{className:Vp["header-container"],children:[v.jsx("h2",{className:Vp["header-title"],children:"Exchange Rates"}),v.jsx("div",{className:Vp["header-buttons"],children:v.jsxs("button",{className:"btn btn-primary",onClick:l,children:[v.jsx("i",{className:"fa fa-plus"})," Add Discount Rate"]})})]}),v.jsx(su,{columns:r,rows:i,rowClasses:Array(i.length).fill(Vp["vertical-align-center"]),scroll:!1}),u.length>0&&v.jsx("div",{className:Vp["error-summary"],children:v.jsx("ul",{children:u.map((d,m)=>v.jsx("li",{children:d},m))})})]})});mO.propTypes={columns:Ve.array.isRequired,rows:Ve.array.isRequired,onAddDiscountRate:Ve.func.isRequired,dateErrors:Ve.array};const u3=(t,r)=>{const i=k.useCallback(A=>{var _,I;r({type:"DELETE_EXCHANGE_RATE",payload:A}),(((I=(_=t==null?void 0:t.resource_details)==null?void 0:_.exchange_rates)==null?void 0:I.discount_rates.filter(M=>M.id!==A))||[]).forEach(M=>{M.begin_date&&M.end_date&&r({type:"UPDATE_EXCHANGE_RATE",payload:{rateId:M.id,changes:{start_date_error:"",end_date_error:""}}})})},[r,t]),l=[{key:"rate_type",name:"Rate Type",width:150},{key:"rate",name:"Exchange Rate",width:100,type:"input",tooltip:"Exchange rate is the cost in ACCESS Credits of one resource unit. ACCESS Credits / exchange rate = resource units"},{key:"conversion",name:"Resource Units per ACCESS Credit",width:150},{key:"start_date",name:"Start Date",width:150,type:"date",minDate:new Date().toISOString().split("T")[0]},{key:"end_date",name:"End Date",width:150,type:"date",minDate:new Date().toISOString().split("T")[0]},{key:"actions",name:"",width:80,type:"action",onChange:i}],u=A=>{r({type:"UPDATE_BASE_RATE",payload:A})},d=(A,N)=>{const _={exchange_rate:N},I={};N?I.rate_error="":I.rate_error="Exchange Rate cannot be empty",r({type:"UPDATE_EXCHANGE_RATE",payload:{rateId:A,changes:{..._,...I}}})},m=()=>{var _,I;const A=[];return(((I=(_=t==null?void 0:t.resource_details)==null?void 0:_.exchange_rates)==null?void 0:I.discount_rates)||[]).forEach(M=>{M.start_date_error&&A.push(M.start_date_error),M.end_date_error&&A.push(M.end_date_error),M.rate_error&&A.push(M.rate_error)}),A.filter((M,P)=>M&&M!==""&&(!M.includes("overlaps")||A.indexOf(M)===P))},h=A=>{const N=new Date(A);return new Intl.DateTimeFormat("en-US",{timeZone:"UTC",month:"numeric",day:"numeric",year:"numeric"}).format(N)},y=(A,N,_,I)=>{const M=new Date(A).getTime(),P=new Date(N).getTime(),V=new Date(_).getTime(),U=new Date(I).getTime();return M<=U&&V<=P},x=(A,N)=>{let _="";if(A.begin_date&&A.end_date){const I=N.filter(M=>M.id!==A.id);for(const M of I)if(M.begin_date&&M.end_date&&y(A.begin_date,A.end_date,M.begin_date,M.end_date)){_=`The selected date range (${h(A.begin_date)} to ${h(A.end_date)}) overlaps with an existing discount rate (${h(M.begin_date)} to ${h(M.end_date)})`;break}}return _},C=(A,N,_)=>{var ie,me;const I={start_date:"begin_date",end_date:"end_date"},M=ae=>{const we=new Date(ae);return new Intl.DateTimeFormat("en-US",{timeZone:"UTC",month:"numeric",day:"numeric",year:"numeric"}).format(we)},P=((me=(ie=t==null?void 0:t.resource_details)==null?void 0:ie.exchange_rates)==null?void 0:me.discount_rates)||[],V=P.find(ae=>ae.id===A);if(!V)return;const U={[I[N]]:_},F={},z=N==="end_date",X=()=>{if(!_)return F[`${N}_error`]="Date cannot be empty or invalid",!1;const ae=l.find(je=>je.key===N),we=(ae==null?void 0:ae.minDate)||"1900-01-01",ge=(ae==null?void 0:ae.maxDate)||"2100-12-31",xe=z&&V.begin_date?V.begin_date:we;return _<xe?(F[`${N}_error`]=`${N.replace("_"," ")} ${M(_)} cannot be before ${M(xe)}`,!1):_>ge?(F[`${N}_error`]=`${N.replace("_"," ")} cannot be after ${M(ge)}`,!1):(F[`${N}_error`]="",!0)},Y=()=>{const ae=N==="end_date"?_:V.end_date;if(N==="start_date"&&ae){if(_>ae)return F.end_date_error=`end date ${M(ae)} cannot be before ${M(_)}`,!1;F.end_date_error=F.end_date_error||""}return!0},ce=()=>{console.log("validating overlaps");const ae=N==="start_date"?_:V.begin_date,we=N==="end_date"?_:V.end_date;if(ae&&we){const ge=x({...V,begin_date:ae,end_date:we},P);return F.start_date_error=ge,F.end_date_error=ge,!ge}return!0};if(!X()){r({type:"UPDATE_EXCHANGE_RATE",payload:{rateId:A,changes:{...U,...F}}});return}Y(),ce(),z&&!V.begin_date?F.start_date_error="Date cannot be empty or invalid":!z&&!V.end_date&&(F.end_date_error="Date cannot be empty or invalid"),r({type:"UPDATE_EXCHANGE_RATE",payload:{rateId:A,changes:{...U,...F}}})},w=()=>{var F,z;const A=((z=(F=t==null?void 0:t.resource_details)==null?void 0:F.exchange_rates)==null?void 0:z.discount_rates)||[];let _=new Date;A.forEach(X=>{if(X.end_date){const Y=new Date(X.end_date);Y>_&&(_=Y)}});const I=new Date(_);I.setDate(I.getDate()+1);const M=I.toISOString().split("T")[0],P=new Date(I);P.setDate(P.getDate()+15);const V=P.toISOString().split("T")[0],U={id:Date.now(),exchange_rate:"1.0",begin_date:M,end_date:V,is_new:!0};r({type:"ADD_EXCHANGE_RATE",payload:U})};return{exchangeRateColumns:l,exchangeRateRows:(()=>{var V,U;const A=(V=t==null?void 0:t.resource_details)==null?void 0:V.exchange_rates,N=(A==null?void 0:A.base_rate)??"",_=(A==null?void 0:A.discount_rates)||[],I=new Date().toISOString().split("T")[0],M=((U=t==null?void 0:t.resource_details)==null?void 0:U.unit_type)||"Resource Units",P=F=>!F||Number(F)===0?"-":`${(1/Number(F)).toFixed(2)} ${M}`;return[{rate_type:"Base Rate",rate:{value:N.toString(),onChange:F=>u(F)},conversion:P(N)},..._.map(F=>{var ce;const z=F.is_new||F.begin_date>I,X=z||F.begin_date==="",Y=F.is_new||F.end_date>=I||F.end_date==="";return{rate_type:"Discount",rate:{value:((ce=F.exchange_rate)==null?void 0:ce.toString())||"",onChange:z?ie=>d(F.id,ie):null,disabled:!z},conversion:P(F.exchange_rate),start_date:{value:F.begin_date||"",onChange:ie=>C(F.id,"start_date",ie),error:F.start_date_error,disabled:!X},end_date:{value:F.end_date||"",onChange:ie=>C(F.id,"end_date",ie),error:F.end_date_error,disabled:!Y},actions:{id:F.id}}})]})(),handleAddDiscountRate:w,handleDeleteRate:i,dateErrors:m()}};function gO({resourceId:t,relativeUrlRoot:r,setExternalSubmit:i}){const{state:l,dispatch:u,handleError:d,fetchData:m}=HH(t,r),{isEditing:h,handleEditingChange:y}=YH(),{resourceData:x,loading:C,errors:w,successMessage:R}=l,A=x==null?void 0:x.resource_details,N=x==null?void 0:x.uses_exchange_rates,{allowedActionsOptions:_,resourceTypesOptions:I,unitTypesOptions:M,availableResources:P,availableAllocationTypes:V}=ER(x),{showAddResourceModal:U,setShowAddResourceModal:F,showAddAllocationTypeModal:z,setShowAddAllocationTypeModal:X,selectedNewResource:Y,handleSelectNewResource:ce,handleSaveResources:ie,selectedNewAllocationType:me,handleSelectNewAllocationType:ae,handleSaveAllocationType:we,handleAllowedActionChange:ge,handleCommentChange:xe,handleRequiredResourceChange:je}=WH(x,A,u),{exchangeRateColumns:Le,exchangeRateRows:re,handleAddDiscountRate:De,dateErrors:G}=u3(x,u),Z=XH(A,t,r,m,d,u);k.useEffect(()=>{i&&G.length==0?i(Z):i(null)},[Z,i,G]);const{allocationColumns:ne,allocationRows:be}=GH(A,P,Y,_,ge,xe,je),[Ee,_e]=k.useState(!1);return C?v.jsx(ah,{}):w.length>0?v.jsx("div",{children:w.map((Ne,ke)=>v.jsx(hr,{color:"danger",dismissable:!0,children:Ne},ke))}):x?v.jsxs("div",{className:"edit-resource",children:[R.message&&v.jsx(hr,{color:R.color,dismissable:!0,children:R.message}),v.jsxs("div",{children:[v.jsx("h2",{children:"Resource Propeties"}),v.jsx("div",{style:{marginBottom:"0.75rem"},children:v.jsx("p",{style:{margin:"0",fontStyle:"italic",fontWeight:"bold"},children:"Any modifications to these resource properties will be applied globally and impact resources on other all allocations process"})}),v.jsx(RR,{resourceDetails:A,resourceTypesOptions:I,unitTypesOptions:M,dispatch:u,isDollarValueEditing:Ee,onDollarValueEditingChange:_e})]}),N&&v.jsx(mO,{columns:Le,rows:re,onAddDiscountRate:De,dateErrors:G}),v.jsx(wR,{headerText:v.jsx("h2",{children:"Allocation Types"}),header:v.jsx(hO,{onAddAllocationType:()=>h&&X(!0),onAddRequiredResource:()=>h&&F(!0)}),isEditing:h,onEditingChange:y,warningMessage:`Incorrect allocations
290
290
  process settings can make a resource unavailable for allocation.
291
- Please proceed with caution.`,children:v.jsx(vO,{columns:ne,rows:be})}),v.jsx(Cx,{show:U,onClose:()=>F(!1),title:"Add Required Resource",onSave:ie,buttonText:"Save",children:v.jsx("div",{children:P.map(Ne=>v.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[v.jsx("input",{type:"checkbox",style:{margin:0},checked:Y.includes(Ne.resource_id),onChange:ke=>ce(Ne.resource_id,ke.target.checked)}),Ne.resource_name]},Ne.resource_id))})}),v.jsx(Cx,{show:z,onClose:()=>X(!1),title:"Add Allocation Type",onSave:we,buttonText:"Save",children:v.jsx(Yp,{label:"Select Allocation Type",options:[{value:"",label:"Select an allocation type to add",disabled:!0},...V.map(Ne=>({value:Ne.allocation_type_id,label:Ne.display_name}))],value:me,onChange:ae})})]}):v.jsx("div",{children:"No resource data available."})}gO.propTypes={resourceId:Ve.number.isRequired,relativeUrlRoot:Ve.string.isRequired,setExternalSubmit:Ve.func};const ta={error:"error",pending:"pending",success:"success"},Sx=t=>t.endDate||t.startDate||(t.actions[0]||{}).entryDate,ZI=t=>`${{pi:"01",co_pi:"02",allocation_manager:"03"}[t.role]||"04"} ${t.lastName}, ${t.firstName}`,c3=(t,{grantNumber:r,projectManager:i,requestMasterId:l,requests:u,title:d,users:m},h)=>{r=r||l,u.sort((C,w)=>Sx(C)>Sx(w)?-1:1);const y=u.find(C=>C.timeStatus=="current"),x=y?y.requestId:null;t.projects[r]={currentRequestId:x,grantNumber:r,isManager:i,requestsList:u.map(C=>{const{actions:w,allocationType:R,endDate:A,requestId:N,startDate:_,status:I}=C,M=w.map(({entryDate:P})=>P).sort()[0].split("T")[0];return d3(t,C,{entryDate:M,grantNumber:r}),{allocationType:R,endDate:A,entryDate:M,requestId:N,startDate:_,status:I}}),selectedRequestId:x||u[0].requestId,status:h,tab:"overview",title:d,users:m.map(({email:C,firstName:w,lastName:R,organization:A,resources:N,role:_,username:I})=>{const M=N.filter(z=>z.userAccountState=="active"&&z.unitType!="ACCESS Credits"),P=M.map(z=>z.xrasResourceId),V=M.filter(z=>z.resourceProviderState=="pending-active").map(z=>z.xrasResourceId),U=N.filter(z=>z.userAccountState!="active").map(z=>z.xrasResourceId),F={};for(let z of M)F[z.xrasResourceId]=z.resourceUsername;return{email:C,firstName:w,initialResourceIds:[...P],initialRole:_,lastName:R,organization:A,resourceAccountPendingIds:V,resourceAccountInactiveIds:U,resourceIds:P,resourceUsernames:F,role:_,username:I}}).sort((C,w)=>ZI(C)<ZI(w)?-1:1),usersNewRowIndex:0,usersStatus:null},t.projects[r].currentUser=t.projects[r].users.find(({username:C})=>C==t.username)},d3=(t,{actions:r,allocationType:i,allowedActions:l,endDate:u,requestId:d,requestType:m,resources:h,startDate:y,status:x,timeStatus:C},{entryDate:w,grantNumber:R})=>{h=h||[];const A={actions:r.map(({actionId:I,actionStatusType:M,actionType:P,allowedOperations:V,approvedStartDate:U,detailAvailable:F,entryDate:z,isRequest:X,requestedStartDate:Y,resources:ce})=>({actionId:I,allowedOperations:V,detailAvailable:F,date:(z||U||Y).split("T")[0],deleteStatus:null,isRequest:X,resources:ce.map(Ow).sort(bx),showDeleteModal:!1,status:M,type:P})),allocationType:i,allowedActions:f3(l),endDate:u,entryDate:w,exchangeActionId:null,exchangeActionEditable:!0,exchangeErrors:[],exchangeStatus:null,grantNumber:R,isMaximize:i=="Maximize",requestId:d,resources:h.map(Ow).filter(I=>I.isCredit||I.allocated>0).sort(bx),resourcesReason:"",returnedForCorrections:!!r.find(I=>I.returnedForCorrections),returnedForCorrectionsNotes:r.map(I=>I.adminComments).join(","),showActionsModal:!1,showConfirmModal:!1,showResourcesModal:!1,startDate:y,status:x,timeStatus:C,type:m,usageDetail:null,usageDetailStatus:null,usesCredits:["Explore","Discover","Accelerate"].includes(i)};let N={};for(let I of A.actions)if(["Exchange","Transfer"].includes(I.type)&&["Submitted","Under Review","Incomplete"].includes(I.status)){A.exchangeActionId=I.actionId,A.exchangeActionEditable=I.status==="Incomplete";for(let M of I.resources)N[M.resourceId]=M;for(let M of A.resources)M.resourceId in N&&(M.requested+=N[M.resourceId].requested,delete N[M.resourceId]);A.resources.push(...Object.values(N).map(M=>({...M,isNew:!0})));break}const _=A.allowedActions.Exchange||A.allowedActions.Transfer;if(_){N={};for(let I of _.resources)N[I.resourceId]=I;for(let I of A.resources)I.resourceId in N&&(I.questions=N[I.resourceId].questions||[])}!A.usesCredits&&h.length&&A.resources.push({allocated:0,decimalPlaces:0,exchangeRates:{base:{type:"base",unitCost:1},current:{type:"base",unitCost:1}},icon:"credit",isActive:!0,isBoolean:!1,isCredit:!0,isFake:!0,name:"Credit Equivalents",requested:0,requires:[],resourceId:0,unit:"Credit Equivalents",used:0}),t.requests[d]=A},f3=t=>{const r={};for(let{actionType:i,allowedResources:l,opportunityId:u,opportunityName:d}of t){let m={name:i,resources:l.map(Ow).sort(bx),opportunityId:u,opportunityName:d};i in r?(Array.isArray(r[i])||(r[i]=[r[i]]),r[i].push(m)):r[i]=m}return"Transfer"in r&&!("Exchange"in r)&&(r.Exchange=r.Transfer),r},qI=(t,r)=>t.relativeOrder<r.relativeOrder?-1:1,Ow=({allocationState:t,amountAllocated:r,amountApproved:i,amountRequested:l,amountUsed:u,attributeSets:d,baseExchangeRate:m,currentExchangeRate:h,currentExchangeRateEndDate:y,currentExchangeRateType:x,dependentResourceXrasIds:C,displayResourceName:w,endDate:R,exchangeRate:A,organizationId:N,organizationFaviconUrl:_,organizationName:I,resourceRepositoryKey:M,resourceType:P,startDate:V,unitType:U,userGuideUrl:F,xrasResourceId:z})=>{const X=U=="[Yes = 1, No = 0]",Y=U=="ACCESS Credits";return{allocated:Hp(OI(r,i)||0,0,"floor"),decimalPlaces:0,endDate:R,exchangeRates:{base:{type:"base",unitCost:X?0:m||A},current:{endDate:y,type:(x||"base").toLowerCase(),unitCost:X?0:h||A}},icon:Y?"credit":P.toLowerCase(),isActive:t=="active",isBoolean:X,isCredit:Y,isFake:!1,isUnderReview:!1,isNew:!1,name:w.trim(),questions:(d||[]).filter(({isActive:ce})=>ce).sort(qI).map(ce=>({attributeSetId:ce.attributeSetId,attributes:ce.attributes.sort(qI).map(ie=>({required:ie.isRequired,resourceAttributeId:ie.resourceAttributeId,label:ie.attributeName})),fieldType:ce.attributeSetRelationType,label:ce.attributeSetName,resourceId:z,values:[]})),resourceProvider:{organizationId:N,name:I,favicon:_},requested:Hp(OI(l,r)||0,0,"floor"),requires:C||[],resourceId:z,resourceRepositoryKey:M,startDate:V,type:P,unit:U,used:Hp(u||0,0,"ceil"),userGuideUrl:F}},yO=(t,r)=>(t=[...t].sort(),r=[...r].sort(),t.length===r.length&&t.every((i,l)=>i===r[l])),$b=(t,r)=>{const i=ea(t,r);for(let l of i.actions)if(l.actionId==r.payload.actionId)return l},el=(t,r)=>t.projects[r.payload.grantNumber],ea=(t,r)=>t.requests[r.payload.requestId],p3=(t,r)=>el(t,r).users.find(({username:i})=>i==r.payload.username),Dw=({allocated:t,isActive:r,isCredit:i})=>t>0&&r&&!i,JI=t=>t.hasChanges=t.isNew||t.role!=t.initialRole||!yO(t.resourceIds,t.initialResourceIds),bO=()=>document.querySelector("meta[name=csrf-token]").content,h3=async t=>{const r=new URLSearchParams({q:t});return(await(await fetch(`${qt.routes.search_people_path()}?${r}`)).json()).map(({email:l,first_name:u,last_name:d,username:m,organization:h})=>({email:l,firstName:u,lastName:d,username:m,organization:h}))},tx=ya("api/fetchProjectsList",async(t,{rejectWithValue:r})=>{const i=await fetch(`${qt.routes.projects_path()}.json`);return i.status==200?{username:t,projectsList:(await i.json()).result}:r({})}),xO=ya("api/fetchProjectDetail",async({grantNumber:t},{rejectWithValue:r})=>r({grantNumber:t})),CO=ya("api/fetchRequestDetail",async({grantNumber:t,requestId:r},{rejectWithValue:i})=>i({grantNumber:t,requestId:r})),nx=ya("api/fetchUsageDetail",async({grantNumber:t,requestId:r,resourceRepositoryKey:i},{rejectWithValue:l})=>{const u=await fetch(`${qt.routes.usage_detail_path(t,i)}.json`);return u.status==200?{grantNumber:t,requestId:r,resourceRepositoryKey:i,usageDetail:(await u.json()).usage}:l({grantNumber:t,requestId:r,resourceRepositoryKey:i})}),rx=ya("api/deleteAction",async({actionId:t,requestId:r},{getState:i,rejectWithValue:l})=>{const u=i().api.requests[r],d=u.actions.find(x=>x.actionId==t);if(!d||!d.allowedOperations||!d.allowedOperations.includes("Delete"))return l({actionId:t,requestId:r});const m=qt.routes.request_action_path(u.requestId,d.actionId),h={_method:"delete",authenticity_token:bO()};return(await fetch(m,{body:Object.keys(h).map(x=>`${encodeURIComponent(x)}=${encodeURIComponent(h[x])}`).join("&"),headers:{"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"},method:"POST"})).status==200?{actionId:t,requestId:r}:l({actionId:t,requestId:r})}),ax=ya("api/saveResources",async({requestId:t},{getState:r,rejectWithValue:i})=>{const l=r().api.requests[t],u={},d={};for(let{allocated:w,isFake:R,questions:A,requested:N,resourceId:_}of l.resources)if(N!=w&&!R){u[_]={resource_id:_,requested:1,amount:N-w};for(let{attributes:I,values:M,fieldType:P}of A)if(M.length){let V=I[0].resourceAttributeId,U=["drop_down","single_sel","multi_sel"].includes(P),z={resource_attribute_id:P=="multi_sel"?M:U?M[0]:V};U||(z.attribute_value=M[0]),d[V]=z}}const m={authenticity_token:bO(),request_action:{action_type:l.allowedActions.Exchange.name,user_comments:l.resourcesReason,resource_attributes:d},requested_resources:u},h=l.exchangeActionId?qt.routes.request_action_path(l.requestId,l.exchangeActionId):qt.routes.request_actions_path(l.requestId),y=await fetch(`${h}.json`,{body:JSON.stringify(m),headers:{"Content-Type":"application/json"},method:l.exchangeActionId?"PUT":"POST"});let x,C;try{const w=await y.json();x=w.errors,C=w.actionId}catch{x=["Unable to save exchange"],C=null}return y.status==200?{requestId:t,exchangeActionId:C}:i({requestId:t,exchangeActionId:C,errors:x})}),ix=ya("api/saveUsers",async({grantNumber:t},{getState:r,rejectWithValue:i})=>{const u=r().api.projects[t].users,d=u.filter(x=>!yO(x.resourceIds,x.initialResourceIds)||x.isNew).length==0?[]:u.map(x=>({username:x.username,resources:x.resourceIds})),m=u.filter(x=>x.role!=x.initialRole).map(x=>({username:x.username,role:Rw[x.role],initialRole:Rw[x.initialRole]})),h={grantNumber:t,resourceChanges:d,roleChanges:m,authenticity_token:document.querySelector("meta[name=csrf-token]").content};return(await fetch(qt.routes.projects_save_users_path(),{method:"POST",body:JSON.stringify(h),headers:{"Content-Type":"application/json"}})).status==200?{grantNumber:t}:i({grantNumber:t})}),SO=Vm({name:"api",initialState:{error:null,projectsList:[],projectListLoading:!1,projects:{},requests:{},username:null},reducers:{addResource:(t,r)=>{const{resourceId:i}=r.payload,l=ea(t,r),u=l.allowedActions.Exchange;if(!u)return;const d={};for(let y of u.resources)d[y.resourceId]=y;const m=l.resources.map(y=>y.resourceId),h=[i,...d[i].requires||[]].filter(y=>y in d&&!m.includes(y));l.resources.push(...h.map(y=>({...d[y],allocated:0,isNew:!0,used:0,requested:0})))},addUser:(t,r)=>{const i=el(t,r),l=t.requests[i.currentRequestId],{user:u}=r.payload;i.users.map(({username:d})=>d).includes(u.username)||(i.users.push({...u,resourceIds:l.resources.filter(Dw).map(d=>d.resourceId),role:"user",initialResourceIds:[],initialRole:"user",hasChanges:!0,isNew:!0}),i.usersNewRowIndex=i.users.length-1)},closeUsageDetailModal:(t,r)=>{const i=ea(t,r);i.usageDetail=null,i.usageDetailStatus=null},resetResources:(t,r)=>{const i=ea(t,r);i.resourcesReason="",i.resources=i.resources.filter(l=>l.isCredit||l.allocated).map(l=>({...l,requested:l.allocated}))},resetUsers:(t,r)=>{const i=el(t,r);i.users=i.users.filter(({isNew:l})=>!l).map(l=>({...l,resourceIds:[...l.initialResourceIds],role:l.initialRole,hasChanges:!1}))},setRequest:(t,r)=>{const i=el(t,r);i&&(i.selectedRequestId=r.payload.requestId,i.tab=="users"&&i.currentRequestId!=i.selectedRequestId&&(i.tab="overview"))},setResourceQuestionValues:(t,r)=>{const{attributeSetId:i,resourceId:l,values:u}=r.payload,d=ea(t,r);for(let m of d.resources)if(m.resourceId==l){for(let h of m.questions)if(h.attributeSetId==i){h.values=u;break}break}},setResourceRequest:(t,r)=>{const{resourceId:i,requested:l}=r.payload,u=ea(t,r);let d,m=0;for(let h of u.resources)h.resourceId==i&&(h.requested=l),h.isCredit?(d=h,m+=h.allocated*h.exchangeRates.base.unitCost):m-=Tw(h,"difference");d&&(d.requested=Hp(m,d.decimalPlaces,"floor"))},setResourcesReason:(t,r)=>{const i=ea(t,r);i.resourcesReason=r.payload.reason},setTab:(t,r)=>{const i=el(t,r);i&&(i.tab=r.payload.tab)},setUserRole:(t,r)=>{const i=p3(t,r);i.role=r.payload.role,JI(i)},toggleActionsModal:(t,r)=>{const i=ea(t,r);i.showActionsModal=!i.showActionsModal},toggleConfirmModal:(t,r)=>{const i=ea(t,r);i.showConfirmModal=!i.showConfirmModal},toggleDeleteModal:(t,r)=>{const i=$b(t,r);i.showDeleteModal=!i.showDeleteModal},toggleResourcesModal:(t,r)=>{const i=ea(t,r);i.showResourcesModal=!i.showResourcesModal},toggleUsersResources:(t,r)=>{const i=el(t,r),l=t.requests[i.currentRequestId],{username:u,resourceId:d,checked:m}=r.payload,h=u?[i.users.find(y=>y.username==u)]:i.users;for(let y of h){if(d){let x=y.resourceIds.indexOf(d);m&&x==-1?y.resourceIds.push(d):!m&&x>=0&&y.resourceIds.splice(x,1)}else y.resourceIds=m?l.resources.filter(Dw).map(({resourceId:x})=>x):[];JI(y)}}},extraReducers:t=>{t.addCase(tx.pending,r=>{r.projectListLoading=!0}).addCase(tx.fulfilled,(r,i)=>{i.payload.projectsList.sort((l,u)=>Sx(l.requests[0])>Sx(u.requests[0])?-1:1),r.username=i.payload.username,r.projectsList=i.payload.projectsList.map(l=>{const{grantNumber:u,requestMasterId:d,requests:m,status:h,title:y}=l,C=l.requests.filter(w=>w.actions.filter(R=>R.returnedForCorrections).length>0).length>0?"Returned for Corrections":h||m&&(m.find(({timeStatus:w})=>w=="current")?"Active":m[0].timeStatus=="past"?"Inactive":m[0].status);return m&&c3(r,l,C),{grantNumber:u||d,status:C,title:y}}),r.projectListLoading=!1}).addCase(tx.rejected,r=>{r.error="Failed to load project list.",r.projectListLoading=!1}).addCase(xO.rejected,(r,i)=>{const{grantNumber:l}=i.payload;r.projects[l]={error:"Failed to load project data."}}).addCase(CO.rejected,(r,i)=>{const{requestId:l}=i.payload;r.requests[l]={error:"Failed to load request data."}}).addCase(nx.pending,(r,i)=>{const l=ea(r,{payload:i.meta.arg});l.usageDetailStatus=ta.pending}).addCase(nx.fulfilled,(r,i)=>{const l=ea(r,i);l.usageDetail=i.payload.usageDetail,l.usageDetailStatus=ta.success}).addCase(nx.rejected,(r,i)=>{const l=ea(r,i);l.usageDetailStatus=ta.error}).addCase(rx.pending,(r,i)=>{const l=$b(r,{payload:i.meta.arg});l.deleteStatus=ta.pending}).addCase(rx.fulfilled,(r,i)=>{const l=ea(r,i),u=$b(r,i);u.isRequest?(l.error="This request has been deleted.",u.allowedOperations=[]):l.actions=l.actions.filter(d=>d.actionId!=u.actionId),u.deleteStatus=ta.success,u.showDeleteModal=!1}).addCase(rx.rejected,(r,i)=>{const l=$b(r,i);l.deleteStatus=ta.error}).addCase(ax.pending,(r,i)=>{const l=ea(r,{payload:i.meta.arg});l.exchangeStatus=ta.pending,l.showResourcesModal=!1}).addCase(ax.fulfilled,(r,i)=>{const l=ea(r,i);l.exchangeActionId=i.payload.exchangeActionId,l.exchangeActionEditable=!1,l.exchangeErrors=[],l.exchangeStatus=ta.success}).addCase(ax.rejected,(r,i)=>{const l=ea(r,i);l.exchangeActionId=i.payload.exchangeActionId,l.exchangeActionEditable=!0,l.exchangeErrors=i.payload.errors,l.exchangeStatus=ta.error}).addCase(ix.pending,(r,i)=>{const l=el(r,{payload:i.meta.arg});l.usersStatus=ta.pending}).addCase(ix.fulfilled,(r,i)=>{const l=el(r,i);l.users=l.users.map(u=>({...u,initialResourceIds:[...u.resourceIds],initialRole:u.role,hasChanges:!1,isNew:!1})),l.usersStatus=ta.success}).addCase(ix.rejected,(r,i)=>{const l=el(r,i);l.usersStatus=ta.error})}}),v3=t=>t.api.error,m3=t=>t.api.projectsList,g3=t=>t.api.projectListLoading,y3=(t,r)=>el(t.api,{payload:{grantNumber:r}}),b3=(t,r)=>ea(t.api,{payload:{requestId:r}}),x3=t=>t.api.username,{addResource:C3,addUser:S3,closeUsageDetailModal:E3,hideAlert:hJ,resetResources:w3,resetUsers:R3,setRequest:_3,setResourceQuestionValues:T3,setResourceRequest:N3,setResourcesReason:I3,setTab:j3,setUserRole:A3,toggleActionsModal:O3,toggleConfirmModal:D3,toggleDeleteModal:k3,toggleResourcesModal:M3,toggleUsersResources:L3}=SO.actions,P3=SO.reducer,F3=t=>{const r=Tn(v3),i=Tn(g3),l=Tn(m3),u=ai();return k.useEffect(()=>{u(tx(t))},[]),{error:r,loading:i,projects:l}},Qi=(t,r)=>{const i=Tn(d=>y3(d,t)),l=Tn(x3),u=ai();return k.useEffect(()=>{!i&&!r&&u(xO({grantNumber:t}))},[r]),{project:i,addUser:d=>u(S3({grantNumber:t,user:d})),resetUsers:()=>u(R3({grantNumber:t})),saveUsers:()=>u(ix({grantNumber:t})),setRequest:d=>u(_3({grantNumber:t,requestId:d})),setTab:d=>u(j3({grantNumber:t,tab:d})),setUserRole:(d,m)=>u(A3({grantNumber:t,username:d,role:m})),statuses:ta,toggleUsersResources:(d,m,h)=>u(L3({grantNumber:t,username:m,resourceId:h,checked:d})),username:l}},ii=(t,r)=>{const i=Tn(u=>b3(u,t)),l=ai();return k.useEffect(()=>{i||l(CO({grantNumber:r,requestId:t}))},[r,t]),{request:i,addResource:u=>l(C3({requestId:t,resourceId:u})),closeUsageDetailModal:()=>l(E3({requestId:t})),deleteAction:u=>l(rx({actionId:u,requestId:t})),openUsageDetailModal:u=>l(nx({grantNumber:i.grantNumber,requestId:t,resourceRepositoryKey:u})),resetResources:()=>l(w3({requestId:t})),saveResources:()=>l(ax({requestId:t})),setResourceQuestionValues:(u,d,m)=>l(T3({requestId:t,resourceId:u,attributeSetId:d,values:m})),setResourceRequest:(u,d)=>l(N3({requestId:t,resourceId:u,requested:d})),setResourcesReason:u=>l(I3({requestId:t,reason:u})),statuses:ta,toggleActionsModal:()=>l(O3({requestId:t})),toggleConfirmModal:()=>l(D3({requestId:t})),toggleDeleteModal:u=>l(k3({requestId:t,actionId:u})),toggleResourcesModal:()=>l(M3({requestId:t}))}},V3="_project_qqnbz_1",B3="_expand_qqnbz_5",QI={project:V3,expand:B3},$3="_returnedForCorrectionsNotes_jujbd_1",z3={returnedForCorrectionsNotes:$3};function EO(t,r,i){const l=k.useRef(t!==void 0),[u,d]=k.useState(r),m=t!==void 0,h=l.current;return l.current=m,!m&&h&&u!==r&&d(r),[m?t:u,k.useCallback((...y)=>{const[x,...C]=y;let w=i==null?void 0:i(x,...C);return d(x),w},[i])]}var wO={};const Ex={prefix:String(Math.round(Math.random()*1e10)),current:0},RO=ir.createContext(Ex),U3=ir.createContext(!1);let H3=!!(typeof window<"u"&&window.document&&window.document.createElement),QE=new WeakMap;function G3(t=!1){let r=k.useContext(RO),i=k.useRef(null);if(i.current===null&&!t){var l,u;let d=(u=ir.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED)===null||u===void 0||(l=u.ReactCurrentOwner)===null||l===void 0?void 0:l.current;if(d){let m=QE.get(d);m==null?QE.set(d,{id:r.current,state:d.memoizedState}):d.memoizedState!==m.state&&(r.current=m.id,QE.delete(d))}i.current=++r.current}return i.current}function W3(t){let r=k.useContext(RO);r===Ex&&!H3&&console.warn("When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.");let i=G3(!!t),l=r===Ex&&wO.NODE_ENV==="test"?"react-aria":`react-aria${r.prefix}`;return t||`${l}-${i}`}function X3(t){let r=ir.useId(),[i]=k.useState(J3()),l=i||wO.NODE_ENV==="test"?"react-aria":`react-aria${Ex.prefix}`;return t||`${l}-${r}`}const _O=typeof ir.useId=="function"?X3:W3;function Y3(){return!1}function Z3(){return!0}function q3(t){return()=>{}}function J3(){return typeof ir.useSyncExternalStore=="function"?ir.useSyncExternalStore(q3,Y3,Z3):k.useContext(U3)}const Q3=k.createContext(null),ih=Q3,K3=k.createContext(null),Jd=(t,r=null)=>t!=null?String(t):r||null,iu=K3;function eG(t){const r=k.useRef(t);return k.useEffect(()=>{r.current=t},[t]),r}function br(t){const r=eG(t);return k.useCallback(function(...i){return r.current&&r.current(...i)},[r])}const KI=t=>!t||typeof t=="function"?t:r=>{t.current=r};function tG(t,r){const i=KI(t),l=KI(r);return u=>{i&&i(u),l&&l(u)}}function hs(t,r){return k.useMemo(()=>tG(t,r),[t,r])}function TR({children:t,in:r,onExited:i,mountOnEnter:l,unmountOnExit:u}){const d=k.useRef(null),m=k.useRef(r),h=br(i);k.useEffect(()=>{r?m.current=!0:h(d.current)},[r,h]);const y=hs(d,t.ref),x=k.cloneElement(t,{ref:y});return r?x:u||!m.current&&l?null:x}const nG=["active","eventKey","mountOnEnter","transition","unmountOnExit","role","onEnter","onEntering","onEntered","onExit","onExiting","onExited"],rG=["activeKey","getControlledId","getControllerId"],aG=["as"];function kw(t,r){if(t==null)return{};var i={},l=Object.keys(t),u,d;for(d=0;d<l.length;d++)u=l[d],!(r.indexOf(u)>=0)&&(i[u]=t[u]);return i}function TO(t){let{active:r,eventKey:i,mountOnEnter:l,transition:u,unmountOnExit:d,role:m="tabpanel",onEnter:h,onEntering:y,onEntered:x,onExit:C,onExiting:w,onExited:R}=t,A=kw(t,nG);const N=k.useContext(ih);if(!N)return[Object.assign({},A,{role:m}),{eventKey:i,isActive:r,mountOnEnter:l,transition:u,unmountOnExit:d,onEnter:h,onEntering:y,onEntered:x,onExit:C,onExiting:w,onExited:R}];const{activeKey:_,getControlledId:I,getControllerId:M}=N,P=kw(N,rG),V=Jd(i);return[Object.assign({},A,{role:m,id:I(i),"aria-labelledby":M(i)}),{eventKey:i,isActive:r==null&&V!=null?Jd(_)===V:r,transition:u||P.transition,mountOnEnter:l??P.mountOnEnter,unmountOnExit:d??P.unmountOnExit,onEnter:h,onEntering:y,onEntered:x,onExit:C,onExiting:w,onExited:R}]}const NO=k.forwardRef((t,r)=>{let{as:i="div"}=t,l=kw(t,aG);const[u,{isActive:d,onEnter:m,onEntering:h,onEntered:y,onExit:x,onExiting:C,onExited:w,mountOnEnter:R,unmountOnExit:A,transition:N=TR}]=TO(l);return v.jsx(ih.Provider,{value:null,children:v.jsx(iu.Provider,{value:null,children:v.jsx(N,{in:d,onEnter:m,onEntering:h,onEntered:y,onExit:x,onExiting:C,onExited:w,mountOnEnter:R,unmountOnExit:A,children:v.jsx(i,Object.assign({},u,{ref:r,hidden:!d,"aria-hidden":!d}))})})})});NO.displayName="TabPanel";const IO=t=>{const{id:r,generateChildId:i,onSelect:l,activeKey:u,defaultActiveKey:d,transition:m,mountOnEnter:h,unmountOnExit:y,children:x}=t,[C,w]=EO(u,d,l),R=_O(r),A=k.useMemo(()=>i||((_,I)=>R?`${R}-${I}-${_}`:null),[R,i]),N=k.useMemo(()=>({onSelect:w,activeKey:C,transition:m,mountOnEnter:h||!1,unmountOnExit:y||!1,getControlledId:_=>A(_,"tabpane"),getControllerId:_=>A(_,"tab")}),[w,C,m,h,y,A]);return v.jsx(ih.Provider,{value:N,children:v.jsx(iu.Provider,{value:w||null,children:x})})};IO.Panel=NO;const jO=IO;var AO={exports:{}};/*!
291
+ Please proceed with caution.`,children:v.jsx(vO,{columns:ne,rows:be})}),v.jsx(Cx,{show:U,onClose:()=>F(!1),title:"Add Required Resource",onSave:ie,buttonText:"Save",children:v.jsx("div",{children:P.map(Ne=>v.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[v.jsx("input",{type:"checkbox",style:{margin:0},checked:Y.includes(Ne.resource_id),onChange:ke=>ce(Ne.resource_id,ke.target.checked)}),Ne.resource_name]},Ne.resource_id))})}),v.jsx(Cx,{show:z,onClose:()=>X(!1),title:"Add Allocation Type",onSave:we,buttonText:"Save",children:v.jsx(Yp,{label:"Select Allocation Type",options:[{value:"",label:"Select an allocation type to add",disabled:!0},...V.map(Ne=>({value:Ne.allocation_type_id,label:Ne.display_name}))],value:me,onChange:ae})})]}):v.jsx("div",{children:"No resource data available."})}gO.propTypes={resourceId:Ve.number.isRequired,relativeUrlRoot:Ve.string.isRequired,setExternalSubmit:Ve.func};const ta={error:"error",pending:"pending",success:"success"},Sx=t=>t.endDate||t.startDate||(t.actions[0]||{}).entryDate,ZI=t=>`${{pi:"01",co_pi:"02",allocation_manager:"03"}[t.role]||"04"} ${t.lastName}, ${t.firstName}`,c3=(t,{grantNumber:r,projectManager:i,requestMasterId:l,requests:u,title:d,users:m},h)=>{r=r||l,u.sort((C,w)=>Sx(C)>Sx(w)?-1:1);const y=u.find(C=>C.timeStatus=="current"),x=y?y.requestId:null;t.projects[r]={currentRequestId:x,grantNumber:r,isManager:i,requestsList:u.map(C=>{const{actions:w,allocationType:R,endDate:A,requestId:N,startDate:_,status:I}=C,M=w.map(({entryDate:P})=>P).sort()[0].split("T")[0];return d3(t,C,{entryDate:M,grantNumber:r}),{allocationType:R,endDate:A,entryDate:M,requestId:N,startDate:_,status:I}}),selectedRequestId:x||u[0].requestId,status:h,tab:"overview",title:d,users:m.map(({email:C,firstName:w,lastName:R,organization:A,resources:N,role:_,username:I})=>{const M=N.filter(z=>z.userAccountState=="active"&&z.unitType!="ACCESS Credits"),P=M.map(z=>z.xrasResourceId),V=M.filter(z=>z.resourceProviderState=="pending-active").map(z=>z.xrasResourceId),U=N.filter(z=>z.userAccountState!="active").map(z=>z.xrasResourceId),F={};for(let z of M)F[z.xrasResourceId]=z.resourceUsername;return{email:C,firstName:w,initialResourceIds:[...P],initialRole:_,lastName:R,organization:A,resourceAccountPendingIds:V,resourceAccountInactiveIds:U,resourceIds:P,resourceUsernames:F,role:_,username:I}}).sort((C,w)=>ZI(C)<ZI(w)?-1:1),usersNewRowIndex:0,usersStatus:null},t.projects[r].currentUser=t.projects[r].users.find(({username:C})=>C==t.username)},d3=(t,{actions:r,allocationType:i,allowedActions:l,endDate:u,requestId:d,requestType:m,resources:h,startDate:y,status:x,timeStatus:C},{entryDate:w,grantNumber:R})=>{h=h||[];const A={actions:r.map(({actionId:I,actionStatusType:M,actionType:P,allowedOperations:V,approvedStartDate:U,detailAvailable:F,entryDate:z,isRequest:X,requestedStartDate:Y,resources:ce})=>({actionId:I,allowedOperations:V,detailAvailable:F,date:(z||U||Y).split("T")[0],deleteStatus:null,isRequest:X,resources:ce.map(Ow).sort(bx),showDeleteModal:!1,status:M,type:P})),allocationType:i,allowedActions:f3(l),endDate:u,entryDate:w,exchangeActionId:null,exchangeActionEditable:!0,exchangeErrors:[],exchangeStatus:null,grantNumber:R,isMaximize:i=="Maximize",requestId:d,resources:h.map(Ow).filter(I=>I.isCredit||I.allocated>0).sort(bx),resourcesReason:"",returnedForCorrections:!!r.find(I=>I.returnedForCorrections),returnedForCorrectionsNotes:r.map(I=>I.adminComments).join(","),showActionsModal:!1,showConfirmModal:!1,showResourcesModal:!1,startDate:y,status:x,timeStatus:C,type:m,usageDetail:null,usageDetailStatus:null,usesCredits:["Explore","Discover","Accelerate"].includes(i)};let N={};for(let I of A.actions)if(["Exchange","Transfer"].includes(I.type)&&["Submitted","Under Review","Incomplete"].includes(I.status)){A.exchangeActionId=I.actionId,A.exchangeActionEditable=I.status==="Incomplete";for(let M of I.resources)N[M.resourceId]=M;for(let M of A.resources)M.resourceId in N&&(M.requested+=N[M.resourceId].requested,delete N[M.resourceId]);A.resources.push(...Object.values(N).map(M=>({...M,isNew:!0})));break}const _=A.allowedActions.Exchange||A.allowedActions.Transfer;if(_){N={};for(let I of _.resources)N[I.resourceId]=I;for(let I of A.resources)I.resourceId in N&&(I.questions=N[I.resourceId].questions||[])}_&&A.resources.length&&!A.resources.find(I=>I.isCredit)&&A.resources.push(_.resources.find(I=>I.isCredit)||{allocated:0,decimalPlaces:0,exchangeRates:{base:{type:"base",unitCost:1},current:{type:"base",unitCost:1}},icon:"credit",isActive:!0,isBoolean:!1,isCredit:!0,isFake:!0,name:"Credit Equivalents",requested:0,requires:[],resourceId:0,unit:"Credit Equivalents",used:0}),t.requests[d]=A},f3=t=>{const r={};for(let{actionType:i,allowedResources:l,opportunityId:u,opportunityName:d}of t){let m={name:i,resources:l.map(Ow).sort(bx),opportunityId:u,opportunityName:d};i in r?(Array.isArray(r[i])||(r[i]=[r[i]]),r[i].push(m)):r[i]=m}return"Transfer"in r&&!("Exchange"in r)&&(r.Exchange=r.Transfer),r},qI=(t,r)=>t.relativeOrder<r.relativeOrder?-1:1,Ow=({allocationState:t,amountAllocated:r,amountApproved:i,amountRequested:l,amountUsed:u,attributeSets:d,baseExchangeRate:m,currentExchangeRate:h,currentExchangeRateEndDate:y,currentExchangeRateType:x,dependentResourceXrasIds:C,displayResourceName:w,endDate:R,exchangeRate:A,organizationId:N,organizationFaviconUrl:_,organizationName:I,resourceRepositoryKey:M,resourceType:P,startDate:V,unitType:U,userGuideUrl:F,xrasResourceId:z})=>{const X=U=="[Yes = 1, No = 0]",Y=U=="ACCESS Credits";return{allocated:Hp(OI(r,i)||0,0,"floor"),decimalPlaces:0,endDate:R,exchangeRates:{base:{type:"base",unitCost:X?0:m||A},current:{endDate:y,type:(x||"base").toLowerCase(),unitCost:X?0:h||A}},icon:Y?"credit":P.toLowerCase(),isActive:t=="active",isBoolean:X,isCredit:Y,isFake:!1,isUnderReview:!1,isNew:!1,name:w.trim(),questions:(d||[]).filter(({isActive:ce})=>ce).sort(qI).map(ce=>({attributeSetId:ce.attributeSetId,attributes:ce.attributes.sort(qI).map(ie=>({required:ie.isRequired,resourceAttributeId:ie.resourceAttributeId,label:ie.attributeName})),fieldType:ce.attributeSetRelationType,label:ce.attributeSetName,resourceId:z,values:[]})),resourceProvider:{organizationId:N,name:I,favicon:_},requested:Hp(OI(l,r)||0,0,"floor"),requires:C||[],resourceId:z,resourceRepositoryKey:M,startDate:V,type:P,unit:U,used:Hp(u||0,0,"ceil"),userGuideUrl:F}},yO=(t,r)=>(t=[...t].sort(),r=[...r].sort(),t.length===r.length&&t.every((i,l)=>i===r[l])),$b=(t,r)=>{const i=ea(t,r);for(let l of i.actions)if(l.actionId==r.payload.actionId)return l},el=(t,r)=>t.projects[r.payload.grantNumber],ea=(t,r)=>t.requests[r.payload.requestId],p3=(t,r)=>el(t,r).users.find(({username:i})=>i==r.payload.username),Dw=({allocated:t,isActive:r,isCredit:i})=>t>0&&r&&!i,JI=t=>t.hasChanges=t.isNew||t.role!=t.initialRole||!yO(t.resourceIds,t.initialResourceIds),bO=()=>document.querySelector("meta[name=csrf-token]").content,h3=async t=>{const r=new URLSearchParams({q:t});return(await(await fetch(`${qt.routes.search_people_path()}?${r}`)).json()).map(({email:l,first_name:u,last_name:d,username:m,organization:h})=>({email:l,firstName:u,lastName:d,username:m,organization:h}))},tx=ya("api/fetchProjectsList",async(t,{rejectWithValue:r})=>{const i=await fetch(`${qt.routes.projects_path()}.json`);return i.status==200?{username:t,projectsList:(await i.json()).result}:r({})}),xO=ya("api/fetchProjectDetail",async({grantNumber:t},{rejectWithValue:r})=>r({grantNumber:t})),CO=ya("api/fetchRequestDetail",async({grantNumber:t,requestId:r},{rejectWithValue:i})=>i({grantNumber:t,requestId:r})),nx=ya("api/fetchUsageDetail",async({grantNumber:t,requestId:r,resourceRepositoryKey:i},{rejectWithValue:l})=>{const u=await fetch(`${qt.routes.usage_detail_path(t,i)}.json`);return u.status==200?{grantNumber:t,requestId:r,resourceRepositoryKey:i,usageDetail:(await u.json()).usage}:l({grantNumber:t,requestId:r,resourceRepositoryKey:i})}),rx=ya("api/deleteAction",async({actionId:t,requestId:r},{getState:i,rejectWithValue:l})=>{const u=i().api.requests[r],d=u.actions.find(x=>x.actionId==t);if(!d||!d.allowedOperations||!d.allowedOperations.includes("Delete"))return l({actionId:t,requestId:r});const m=qt.routes.request_action_path(u.requestId,d.actionId),h={_method:"delete",authenticity_token:bO()};return(await fetch(m,{body:Object.keys(h).map(x=>`${encodeURIComponent(x)}=${encodeURIComponent(h[x])}`).join("&"),headers:{"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"},method:"POST"})).status==200?{actionId:t,requestId:r}:l({actionId:t,requestId:r})}),ax=ya("api/saveResources",async({requestId:t},{getState:r,rejectWithValue:i})=>{const l=r().api.requests[t],u={},d={};for(let{allocated:w,isFake:R,questions:A,requested:N,resourceId:_}of l.resources)if(N!=w&&!R){u[_]={resource_id:_,requested:1,amount:N-w};for(let{attributes:I,values:M,fieldType:P}of A)if(M.length){let V=I[0].resourceAttributeId,U=["drop_down","single_sel","multi_sel"].includes(P),z={resource_attribute_id:P=="multi_sel"?M:U?M[0]:V};U||(z.attribute_value=M[0]),d[V]=z}}const m={authenticity_token:bO(),request_action:{action_type:l.allowedActions.Exchange.name,user_comments:l.resourcesReason,resource_attributes:d},requested_resources:u},h=l.exchangeActionId?qt.routes.request_action_path(l.requestId,l.exchangeActionId):qt.routes.request_actions_path(l.requestId),y=await fetch(`${h}.json`,{body:JSON.stringify(m),headers:{"Content-Type":"application/json"},method:l.exchangeActionId?"PUT":"POST"});let x,C;try{const w=await y.json();x=w.errors,C=w.actionId}catch{x=["Unable to save exchange"],C=null}return y.status==200?{requestId:t,exchangeActionId:C}:i({requestId:t,exchangeActionId:C,errors:x})}),ix=ya("api/saveUsers",async({grantNumber:t},{getState:r,rejectWithValue:i})=>{const u=r().api.projects[t].users,d=u.filter(x=>!yO(x.resourceIds,x.initialResourceIds)||x.isNew).length==0?[]:u.map(x=>({username:x.username,resources:x.resourceIds})),m=u.filter(x=>x.role!=x.initialRole).map(x=>({username:x.username,role:Rw[x.role],initialRole:Rw[x.initialRole]})),h={grantNumber:t,resourceChanges:d,roleChanges:m,authenticity_token:document.querySelector("meta[name=csrf-token]").content};return(await fetch(qt.routes.projects_save_users_path(),{method:"POST",body:JSON.stringify(h),headers:{"Content-Type":"application/json"}})).status==200?{grantNumber:t}:i({grantNumber:t})}),SO=Vm({name:"api",initialState:{error:null,projectsList:[],projectListLoading:!1,projects:{},requests:{},username:null},reducers:{addResource:(t,r)=>{const{resourceId:i}=r.payload,l=ea(t,r),u=l.allowedActions.Exchange;if(!u)return;const d={};for(let y of u.resources)d[y.resourceId]=y;const m=l.resources.map(y=>y.resourceId),h=[i,...d[i].requires||[]].filter(y=>y in d&&!m.includes(y));l.resources.push(...h.map(y=>({...d[y],allocated:0,isNew:!0,used:0,requested:0})))},addUser:(t,r)=>{const i=el(t,r),l=t.requests[i.currentRequestId],{user:u}=r.payload;i.users.map(({username:d})=>d).includes(u.username)||(i.users.push({...u,resourceIds:l.resources.filter(Dw).map(d=>d.resourceId),role:"user",initialResourceIds:[],initialRole:"user",hasChanges:!0,isNew:!0}),i.usersNewRowIndex=i.users.length-1)},closeUsageDetailModal:(t,r)=>{const i=ea(t,r);i.usageDetail=null,i.usageDetailStatus=null},resetResources:(t,r)=>{const i=ea(t,r);i.resourcesReason="",i.resources=i.resources.filter(l=>l.isCredit||l.allocated).map(l=>({...l,requested:l.allocated}))},resetUsers:(t,r)=>{const i=el(t,r);i.users=i.users.filter(({isNew:l})=>!l).map(l=>({...l,resourceIds:[...l.initialResourceIds],role:l.initialRole,hasChanges:!1}))},setRequest:(t,r)=>{const i=el(t,r);i&&(i.selectedRequestId=r.payload.requestId,i.tab=="users"&&i.currentRequestId!=i.selectedRequestId&&(i.tab="overview"))},setResourceQuestionValues:(t,r)=>{const{attributeSetId:i,resourceId:l,values:u}=r.payload,d=ea(t,r);for(let m of d.resources)if(m.resourceId==l){for(let h of m.questions)if(h.attributeSetId==i){h.values=u;break}break}},setResourceRequest:(t,r)=>{const{resourceId:i,requested:l}=r.payload,u=ea(t,r);let d,m=0;for(let h of u.resources)h.resourceId==i&&(h.requested=l),h.isCredit?(d=h,m+=h.allocated*h.exchangeRates.base.unitCost):m-=Tw(h,"difference");d&&(d.requested=Hp(m,d.decimalPlaces,"floor"))},setResourcesReason:(t,r)=>{const i=ea(t,r);i.resourcesReason=r.payload.reason},setTab:(t,r)=>{const i=el(t,r);i&&(i.tab=r.payload.tab)},setUserRole:(t,r)=>{const i=p3(t,r);i.role=r.payload.role,JI(i)},toggleActionsModal:(t,r)=>{const i=ea(t,r);i.showActionsModal=!i.showActionsModal},toggleConfirmModal:(t,r)=>{const i=ea(t,r);i.showConfirmModal=!i.showConfirmModal},toggleDeleteModal:(t,r)=>{const i=$b(t,r);i.showDeleteModal=!i.showDeleteModal},toggleResourcesModal:(t,r)=>{const i=ea(t,r);i.showResourcesModal=!i.showResourcesModal},toggleUsersResources:(t,r)=>{const i=el(t,r),l=t.requests[i.currentRequestId],{username:u,resourceId:d,checked:m}=r.payload,h=u?[i.users.find(y=>y.username==u)]:i.users;for(let y of h){if(d){let x=y.resourceIds.indexOf(d);m&&x==-1?y.resourceIds.push(d):!m&&x>=0&&y.resourceIds.splice(x,1)}else y.resourceIds=m?l.resources.filter(Dw).map(({resourceId:x})=>x):[];JI(y)}}},extraReducers:t=>{t.addCase(tx.pending,r=>{r.projectListLoading=!0}).addCase(tx.fulfilled,(r,i)=>{i.payload.projectsList.sort((l,u)=>Sx(l.requests[0])>Sx(u.requests[0])?-1:1),r.username=i.payload.username,r.projectsList=i.payload.projectsList.map(l=>{const{grantNumber:u,requestMasterId:d,requests:m,status:h,title:y}=l,C=l.requests.filter(w=>w.actions.filter(R=>R.returnedForCorrections).length>0).length>0?"Returned for Corrections":h||m&&(m.find(({timeStatus:w})=>w=="current")?"Active":m[0].timeStatus=="past"?"Inactive":m[0].status);return m&&c3(r,l,C),{grantNumber:u||d,status:C,title:y}}),r.projectListLoading=!1}).addCase(tx.rejected,r=>{r.error="Failed to load project list.",r.projectListLoading=!1}).addCase(xO.rejected,(r,i)=>{const{grantNumber:l}=i.payload;r.projects[l]={error:"Failed to load project data."}}).addCase(CO.rejected,(r,i)=>{const{requestId:l}=i.payload;r.requests[l]={error:"Failed to load request data."}}).addCase(nx.pending,(r,i)=>{const l=ea(r,{payload:i.meta.arg});l.usageDetailStatus=ta.pending}).addCase(nx.fulfilled,(r,i)=>{const l=ea(r,i);l.usageDetail=i.payload.usageDetail,l.usageDetailStatus=ta.success}).addCase(nx.rejected,(r,i)=>{const l=ea(r,i);l.usageDetailStatus=ta.error}).addCase(rx.pending,(r,i)=>{const l=$b(r,{payload:i.meta.arg});l.deleteStatus=ta.pending}).addCase(rx.fulfilled,(r,i)=>{const l=ea(r,i),u=$b(r,i);u.isRequest?(l.error="This request has been deleted.",u.allowedOperations=[]):l.actions=l.actions.filter(d=>d.actionId!=u.actionId),u.deleteStatus=ta.success,u.showDeleteModal=!1}).addCase(rx.rejected,(r,i)=>{const l=$b(r,i);l.deleteStatus=ta.error}).addCase(ax.pending,(r,i)=>{const l=ea(r,{payload:i.meta.arg});l.exchangeStatus=ta.pending,l.showResourcesModal=!1}).addCase(ax.fulfilled,(r,i)=>{const l=ea(r,i);l.exchangeActionId=i.payload.exchangeActionId,l.exchangeActionEditable=!1,l.exchangeErrors=[],l.exchangeStatus=ta.success}).addCase(ax.rejected,(r,i)=>{const l=ea(r,i);l.exchangeActionId=i.payload.exchangeActionId,l.exchangeActionEditable=!0,l.exchangeErrors=i.payload.errors,l.exchangeStatus=ta.error}).addCase(ix.pending,(r,i)=>{const l=el(r,{payload:i.meta.arg});l.usersStatus=ta.pending}).addCase(ix.fulfilled,(r,i)=>{const l=el(r,i);l.users=l.users.map(u=>({...u,initialResourceIds:[...u.resourceIds],initialRole:u.role,hasChanges:!1,isNew:!1})),l.usersStatus=ta.success}).addCase(ix.rejected,(r,i)=>{const l=el(r,i);l.usersStatus=ta.error})}}),v3=t=>t.api.error,m3=t=>t.api.projectsList,g3=t=>t.api.projectListLoading,y3=(t,r)=>el(t.api,{payload:{grantNumber:r}}),b3=(t,r)=>ea(t.api,{payload:{requestId:r}}),x3=t=>t.api.username,{addResource:C3,addUser:S3,closeUsageDetailModal:E3,hideAlert:hJ,resetResources:w3,resetUsers:R3,setRequest:_3,setResourceQuestionValues:T3,setResourceRequest:N3,setResourcesReason:I3,setTab:j3,setUserRole:A3,toggleActionsModal:O3,toggleConfirmModal:D3,toggleDeleteModal:k3,toggleResourcesModal:M3,toggleUsersResources:L3}=SO.actions,P3=SO.reducer,F3=t=>{const r=Tn(v3),i=Tn(g3),l=Tn(m3),u=ai();return k.useEffect(()=>{u(tx(t))},[]),{error:r,loading:i,projects:l}},Qi=(t,r)=>{const i=Tn(d=>y3(d,t)),l=Tn(x3),u=ai();return k.useEffect(()=>{!i&&!r&&u(xO({grantNumber:t}))},[r]),{project:i,addUser:d=>u(S3({grantNumber:t,user:d})),resetUsers:()=>u(R3({grantNumber:t})),saveUsers:()=>u(ix({grantNumber:t})),setRequest:d=>u(_3({grantNumber:t,requestId:d})),setTab:d=>u(j3({grantNumber:t,tab:d})),setUserRole:(d,m)=>u(A3({grantNumber:t,username:d,role:m})),statuses:ta,toggleUsersResources:(d,m,h)=>u(L3({grantNumber:t,username:m,resourceId:h,checked:d})),username:l}},ii=(t,r)=>{const i=Tn(u=>b3(u,t)),l=ai();return k.useEffect(()=>{i||l(CO({grantNumber:r,requestId:t}))},[r,t]),{request:i,addResource:u=>l(C3({requestId:t,resourceId:u})),closeUsageDetailModal:()=>l(E3({requestId:t})),deleteAction:u=>l(rx({actionId:u,requestId:t})),openUsageDetailModal:u=>l(nx({grantNumber:i.grantNumber,requestId:t,resourceRepositoryKey:u})),resetResources:()=>l(w3({requestId:t})),saveResources:()=>l(ax({requestId:t})),setResourceQuestionValues:(u,d,m)=>l(T3({requestId:t,resourceId:u,attributeSetId:d,values:m})),setResourceRequest:(u,d)=>l(N3({requestId:t,resourceId:u,requested:d})),setResourcesReason:u=>l(I3({requestId:t,reason:u})),statuses:ta,toggleActionsModal:()=>l(O3({requestId:t})),toggleConfirmModal:()=>l(D3({requestId:t})),toggleDeleteModal:u=>l(k3({requestId:t,actionId:u})),toggleResourcesModal:()=>l(M3({requestId:t}))}},V3="_project_qqnbz_1",B3="_expand_qqnbz_5",QI={project:V3,expand:B3},$3="_returnedForCorrectionsNotes_jujbd_1",z3={returnedForCorrectionsNotes:$3};function EO(t,r,i){const l=k.useRef(t!==void 0),[u,d]=k.useState(r),m=t!==void 0,h=l.current;return l.current=m,!m&&h&&u!==r&&d(r),[m?t:u,k.useCallback((...y)=>{const[x,...C]=y;let w=i==null?void 0:i(x,...C);return d(x),w},[i])]}var wO={};const Ex={prefix:String(Math.round(Math.random()*1e10)),current:0},RO=ir.createContext(Ex),U3=ir.createContext(!1);let H3=!!(typeof window<"u"&&window.document&&window.document.createElement),QE=new WeakMap;function G3(t=!1){let r=k.useContext(RO),i=k.useRef(null);if(i.current===null&&!t){var l,u;let d=(u=ir.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED)===null||u===void 0||(l=u.ReactCurrentOwner)===null||l===void 0?void 0:l.current;if(d){let m=QE.get(d);m==null?QE.set(d,{id:r.current,state:d.memoizedState}):d.memoizedState!==m.state&&(r.current=m.id,QE.delete(d))}i.current=++r.current}return i.current}function W3(t){let r=k.useContext(RO);r===Ex&&!H3&&console.warn("When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.");let i=G3(!!t),l=r===Ex&&wO.NODE_ENV==="test"?"react-aria":`react-aria${r.prefix}`;return t||`${l}-${i}`}function X3(t){let r=ir.useId(),[i]=k.useState(J3()),l=i||wO.NODE_ENV==="test"?"react-aria":`react-aria${Ex.prefix}`;return t||`${l}-${r}`}const _O=typeof ir.useId=="function"?X3:W3;function Y3(){return!1}function Z3(){return!0}function q3(t){return()=>{}}function J3(){return typeof ir.useSyncExternalStore=="function"?ir.useSyncExternalStore(q3,Y3,Z3):k.useContext(U3)}const Q3=k.createContext(null),ih=Q3,K3=k.createContext(null),Jd=(t,r=null)=>t!=null?String(t):r||null,iu=K3;function eG(t){const r=k.useRef(t);return k.useEffect(()=>{r.current=t},[t]),r}function br(t){const r=eG(t);return k.useCallback(function(...i){return r.current&&r.current(...i)},[r])}const KI=t=>!t||typeof t=="function"?t:r=>{t.current=r};function tG(t,r){const i=KI(t),l=KI(r);return u=>{i&&i(u),l&&l(u)}}function hs(t,r){return k.useMemo(()=>tG(t,r),[t,r])}function TR({children:t,in:r,onExited:i,mountOnEnter:l,unmountOnExit:u}){const d=k.useRef(null),m=k.useRef(r),h=br(i);k.useEffect(()=>{r?m.current=!0:h(d.current)},[r,h]);const y=hs(d,t.ref),x=k.cloneElement(t,{ref:y});return r?x:u||!m.current&&l?null:x}const nG=["active","eventKey","mountOnEnter","transition","unmountOnExit","role","onEnter","onEntering","onEntered","onExit","onExiting","onExited"],rG=["activeKey","getControlledId","getControllerId"],aG=["as"];function kw(t,r){if(t==null)return{};var i={},l=Object.keys(t),u,d;for(d=0;d<l.length;d++)u=l[d],!(r.indexOf(u)>=0)&&(i[u]=t[u]);return i}function TO(t){let{active:r,eventKey:i,mountOnEnter:l,transition:u,unmountOnExit:d,role:m="tabpanel",onEnter:h,onEntering:y,onEntered:x,onExit:C,onExiting:w,onExited:R}=t,A=kw(t,nG);const N=k.useContext(ih);if(!N)return[Object.assign({},A,{role:m}),{eventKey:i,isActive:r,mountOnEnter:l,transition:u,unmountOnExit:d,onEnter:h,onEntering:y,onEntered:x,onExit:C,onExiting:w,onExited:R}];const{activeKey:_,getControlledId:I,getControllerId:M}=N,P=kw(N,rG),V=Jd(i);return[Object.assign({},A,{role:m,id:I(i),"aria-labelledby":M(i)}),{eventKey:i,isActive:r==null&&V!=null?Jd(_)===V:r,transition:u||P.transition,mountOnEnter:l??P.mountOnEnter,unmountOnExit:d??P.unmountOnExit,onEnter:h,onEntering:y,onEntered:x,onExit:C,onExiting:w,onExited:R}]}const NO=k.forwardRef((t,r)=>{let{as:i="div"}=t,l=kw(t,aG);const[u,{isActive:d,onEnter:m,onEntering:h,onEntered:y,onExit:x,onExiting:C,onExited:w,mountOnEnter:R,unmountOnExit:A,transition:N=TR}]=TO(l);return v.jsx(ih.Provider,{value:null,children:v.jsx(iu.Provider,{value:null,children:v.jsx(N,{in:d,onEnter:m,onEntering:h,onEntered:y,onExit:x,onExiting:C,onExited:w,mountOnEnter:R,unmountOnExit:A,children:v.jsx(i,Object.assign({},u,{ref:r,hidden:!d,"aria-hidden":!d}))})})})});NO.displayName="TabPanel";const IO=t=>{const{id:r,generateChildId:i,onSelect:l,activeKey:u,defaultActiveKey:d,transition:m,mountOnEnter:h,unmountOnExit:y,children:x}=t,[C,w]=EO(u,d,l),R=_O(r),A=k.useMemo(()=>i||((_,I)=>R?`${R}-${I}-${_}`:null),[R,i]),N=k.useMemo(()=>({onSelect:w,activeKey:C,transition:m,mountOnEnter:h||!1,unmountOnExit:y||!1,getControlledId:_=>A(_,"tabpane"),getControllerId:_=>A(_,"tab")}),[w,C,m,h,y,A]);return v.jsx(ih.Provider,{value:N,children:v.jsx(iu.Provider,{value:w||null,children:x})})};IO.Panel=NO;const jO=IO;var AO={exports:{}};/*!
292
292
  Copyright (c) 2018 Jed Watson.
293
293
  Licensed under the MIT License (MIT), see
294
294
  http://jedwatson.github.io/classnames
package/dist/xras-ui.js CHANGED
@@ -27626,31 +27626,33 @@ const ta = {
27626
27626
  for (let I of A.resources)
27627
27627
  I.resourceId in N && (I.questions = N[I.resourceId].questions || []);
27628
27628
  }
27629
- !A.usesCredits && h.length && A.resources.push({
27630
- allocated: 0,
27631
- decimalPlaces: 0,
27632
- exchangeRates: {
27633
- base: {
27634
- type: "base",
27635
- unitCost: 1
27629
+ _ && A.resources.length && !A.resources.find((I) => I.isCredit) && A.resources.push(
27630
+ _.resources.find((I) => I.isCredit) || {
27631
+ allocated: 0,
27632
+ decimalPlaces: 0,
27633
+ exchangeRates: {
27634
+ base: {
27635
+ type: "base",
27636
+ unitCost: 1
27637
+ },
27638
+ current: {
27639
+ type: "base",
27640
+ unitCost: 1
27641
+ }
27636
27642
  },
27637
- current: {
27638
- type: "base",
27639
- unitCost: 1
27640
- }
27641
- },
27642
- icon: "credit",
27643
- isActive: !0,
27644
- isBoolean: !1,
27645
- isCredit: !0,
27646
- isFake: !0,
27647
- name: "Credit Equivalents",
27648
- requested: 0,
27649
- requires: [],
27650
- resourceId: 0,
27651
- unit: "Credit Equivalents",
27652
- used: 0
27653
- }), t.requests[d] = A;
27643
+ icon: "credit",
27644
+ isActive: !0,
27645
+ isBoolean: !1,
27646
+ isCredit: !0,
27647
+ isFake: !0,
27648
+ name: "Credit Equivalents",
27649
+ requested: 0,
27650
+ requires: [],
27651
+ resourceId: 0,
27652
+ unit: "Credit Equivalents",
27653
+ used: 0
27654
+ }
27655
+ ), t.requests[d] = A;
27654
27656
  }, d3 = (t) => {
27655
27657
  const r = {};
27656
27658
  for (let {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xras/ui",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "User interface components for XRAS",
5
5
  "repository": "github:access-ci-org/xras-ui",
6
6
  "license": "Apache-2.0",