diff --git a/app/GraphQL/Queries/TotalCash.php b/app/GraphQL/Queries/TotalCash.php index a51a7cf..c316231 100644 --- a/app/GraphQL/Queries/TotalCash.php +++ b/app/GraphQL/Queries/TotalCash.php @@ -20,7 +20,9 @@ public function __invoke($_, array $args) { $income = Transaction::income()->sum('amount'); $expenses = Transaction::expenses()->sum('amount'); + $investment = Transaction::investment()->sum('amount'); + $savings = Transaction::savings()->sum('amount'); - return $income - $expenses; + return $income - ($expenses + $investment + $savings); } } diff --git a/app/GraphQL/Queries/TotalInvestment.php b/app/GraphQL/Queries/TotalInvestment.php new file mode 100644 index 0000000..27adeb1 --- /dev/null +++ b/app/GraphQL/Queries/TotalInvestment.php @@ -0,0 +1,23 @@ + $args + */ + public function __invoke($_, array $args) + { + return Transaction::investment()->sum('amount'); + } +} diff --git a/app/GraphQL/Queries/TotalSavings.php b/app/GraphQL/Queries/TotalSavings.php new file mode 100644 index 0000000..f237d19 --- /dev/null +++ b/app/GraphQL/Queries/TotalSavings.php @@ -0,0 +1,23 @@ + $args + */ + public function __invoke($_, array $args) + { + return Transaction::savings()->sum('amount'); + } +} diff --git a/app/Models/Category.php b/app/Models/Category.php index 0372217..96d00b2 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -11,6 +11,8 @@ class Category extends Model const INCOME = "INCOME"; const EXPENSES = "EXPENSES"; + const SAVINGS = "SAVINGS"; + const INVESTMENT = "INVESTMENT"; protected $guarded = []; diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 945b173..48e5e86 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -34,6 +34,20 @@ public function scopeIncome($query) }); } + public function scopeSavings($query) + { + return $query->whereHas('brand.category', function ($query) { + return $query->where('type', Category::SAVINGS); + }); + } + + public function scopeInvestment($query) + { + return $query->whereHas('brand.category', function ($query) { + return $query->where('type', Category::INVESTMENT); + }); + } + public static function tryCreateFromSms($sms) { $brandFromSms = $sms->meta['data']['brand'] ?? null; diff --git a/config/finance.php b/config/finance.php index 3d5bb66..0eb3d75 100644 --- a/config/finance.php +++ b/config/finance.php @@ -2,8 +2,10 @@ use App\GraphQL\Queries\TotalCash; use App\GraphQL\Queries\TotalIncome; +use App\GraphQL\Queries\TotalSavings; use App\GraphQL\Queries\TotalExpenses; use App\GraphQL\Queries\TotalPerBrand; +use App\GraphQL\Queries\TotalInvestment; use App\GraphQL\Queries\TotalIncomeTrend; use App\GraphQL\Queries\IncomePerCategory; use App\GraphQL\Queries\TotalExpensesTrend; @@ -20,6 +22,8 @@ ], 'reports' => [ new TotalCash, + new TotalSavings, + new TotalInvestment, new TotalIncome, new TotalExpenses, new IncomePerCategory, diff --git a/graphql/schema.graphql b/graphql/schema.graphql index c157448..827e135 100644 --- a/graphql/schema.graphql +++ b/graphql/schema.graphql @@ -44,8 +44,10 @@ type Query { sms: [Sms!]! @paginate(defaultCount: 100) @orderBy(column: transaction_id direction: ASC) - totalExpenses(range: String!): Json totalIncome(range: String!): Json + totalExpenses(range: String!): Json + totalSavings: Json + totalInvestment: Json totalCash: Json expensesPerCategory(range: String!): Json diff --git a/public/js/app.js b/public/js/app.js index 52596ed..418667d 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1,2 +1,2 @@ /*! For license information please see app.js.LICENSE.txt */ -(()=>{var e,t={7757:(e,t,n)=>{e.exports=n(5666)},9642:(e,t,n)=>{"use strict";function r(){return r=Object.assign||function(e){for(var t=1;t=0||(i[n]=e[n]);return i}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}n.d(t,{Ul:()=>a,gY:()=>r,gK:()=>i})},6518:(e,t,n)=>{"use strict";n.d(t,{V:()=>X});var r,i=n(9642),o=n(7294),a=n(133),s=n(8529);function l(){for(var e=arguments.length,t=new Array(e),n=0;n=l||s+l<=0)return p.Error;var f=o+s;if(t&h.WrapAround)f=(f+l)%l;else{if(f<0)return p.Underflow;if(f>=l)return p.Overflow}null==(c=u=n[f])||c.focus(a),s+=i}while(u!==document.activeElement);return u.hasAttribute("tabindex")||u.setAttribute("tabindex","0"),p.Success}!function(e){e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll"}(h||(h={})),function(e){e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow"}(p||(p={})),function(e){e[e.Previous=-1]="Previous",e[e.Next=1]="Next"}(g||(g={})),function(e){e[e.Strict=0]="Strict",e[e.Loose=1]="Loose"}(m||(m={}));var x,w=n(7933);function _(e,t,n){void 0===t&&(t=x.All);var a=void 0===n?{}:n,s=a.initialFocus,l=a.containers,u=(0,o.useRef)("undefined"!=typeof window?document.activeElement:null),c=(0,o.useRef)(null),f=(0,w.t)(),g=Boolean(t&x.RestoreFocus),m=Boolean(t&x.InitialFocus);(0,o.useEffect)((function(){g&&(u.current=document.activeElement)}),[g]),(0,o.useEffect)((function(){if(g)return function(){v(u.current),u.current=null}}),[g]),(0,o.useEffect)((function(){if(m&&e.current){var t=document.activeElement;if(null==s?void 0:s.current){if((null==s?void 0:s.current)===t)return void(c.current=t)}else if(e.current.contains(t))return void(c.current=t);(null==s?void 0:s.current)?v(s.current):b(e.current,h.First)===p.Error&&console.warn("There are no focusable elements inside the "),c.current=document.activeElement}}),[e,s,m]),d("keydown",(function(n){t&x.TabLock&&e.current&&n.key===r.Tab&&(n.preventDefault(),b(e.current,(n.shiftKey?h.Previous:h.Next)|h.WrapAround)===p.Success&&(c.current=document.activeElement))})),d("focus",(function(n){if(t&x.FocusLock){var r=new Set(null==l?void 0:l.current);if(r.add(e),r.size){var o=c.current;if(o&&f.current){var a=n.target;a&&a instanceof HTMLElement?!function(e,t){for(var n,r=(0,i.Ul)(e);!(n=r()).done;){var o;if(null==(o=n.value.current)?void 0:o.contains(t))return!0}return!1}(r,a)?(n.preventDefault(),n.stopPropagation(),v(o)):(c.current=a,v(a)):v(c.current)}}}}),!0)}!function(e){e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All"}(x||(x={}));var k=n(852),S=new Set,E=new Map;function O(e){e.setAttribute("aria-hidden","true"),e.inert=!0}function C(e){var t=E.get(e);t&&(null===t["aria-hidden"]?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",t["aria-hidden"]),e.inert=t.inert)}var j=(0,o.createContext)(!1);function N(e){return o.createElement(j.Provider,{value:e.force},e.children)}var A=n(3935);function T(){var e=(0,o.useContext)(j),t=(0,o.useContext)(D),n=(0,o.useState)((function(){if(!e&&null!==t)return null;if("undefined"==typeof window)return null;var n=document.getElementById("headlessui-portal-root");if(n)return n;var r=document.createElement("div");return r.setAttribute("id","headlessui-portal-root"),document.body.appendChild(r)})),r=n[0],i=n[1];return(0,o.useEffect)((function(){e||null!==t&&i(t.current)}),[t,i,e]),r}var P=o.Fragment;function M(e){var t=e,n=T(),r=(0,o.useState)((function(){return"undefined"==typeof window?null:document.createElement("div")}))[0],i=(0,c.H)();return(0,k.e)((function(){if(n&&r)return n.appendChild(r),function(){var e;n&&(r&&(n.removeChild(r),n.childNodes.length<=0&&(null==(e=n.parentElement)||e.removeChild(n))))}}),[n,r]),i&&n&&r?(0,A.createPortal)((0,s.sY)({props:t,defaultTag:P,name:"Portal"}),r):null}var I=o.Fragment,D=(0,o.createContext)(null);M.Group=function(e){var t=e.target,n=(0,i.gK)(e,["target"]);return o.createElement(D.Provider,{value:t},(0,s.sY)({props:n,defaultTag:I,name:"Popover.Group"}))};var L=(0,o.createContext)(null);function R(){var e=(0,o.useContext)(L);if(null===e){var t=new Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,R),t}return e}var F,B,z,U,V=n(3980),W=(0,o.createContext)((function(){}));function $(e){var t=e.children,n=e.onUpdate,r=e.type,i=e.element,a=(0,o.useContext)(W),s=(0,o.useCallback)((function(){for(var e=arguments.length,t=new Array(e),r=0;r is missing a parent <"+X.displayName+" /> component.");throw Error.captureStackTrace&&Error.captureStackTrace(n,Y),n}return t}function G(e,t){return(0,a.E)(t.type,H,e,t)}q.displayName="DialogContext";var K=s.AN.RenderStrategy|s.AN.Static,Z=(0,s.yV)((function(e,t){var n,u=e.open,h=e.onClose,p=e.initialFocus,g=(0,i.gK)(e,["open","onClose","initialFocus"]),m=(0,o.useState)(0),y=m[0],v=m[1],b=(0,V.oJ)();void 0===u&&null!==b&&(u=(0,a.E)(b,((n={})[V.ZM.Open]=!0,n[V.ZM.Closed]=!1,n)));var w=(0,o.useRef)(new Set),j=(0,o.useRef)(null),A=l(j,t),T=e.hasOwnProperty("open")||null!==b,P=e.hasOwnProperty("onClose");if(!T&&!P)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!T)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!P)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if("boolean"!=typeof u)throw new Error("You provided an `open` prop to the `Dialog`, but the value is not a boolean. Received: "+u);if("function"!=typeof h)throw new Error("You provided an `onClose` prop to the `Dialog`, but the value is not a function. Received: "+h);var I=u?z.Open:z.Closed,D=null!==b?b===V.ZM.Open:I===z.Open,R=(0,o.useReducer)(G,{titleId:null,descriptionId:null}),B=R[0],W=R[1],H=(0,o.useCallback)((function(){return h(!1)}),[h]),Y=(0,o.useCallback)((function(e){return W({type:U.SetTitleId,id:e})}),[W]),Z=(0,c.H)()&&I===z.Open,Q=y>1,X=null!==(0,o.useContext)(q),J=Q?"parent":"leaf";_(j,Z?(0,a.E)(J,{parent:x.RestoreFocus,leaf:x.All}):x.None,{initialFocus:p,containers:w}),function(e,t){void 0===t&&(t=!0),(0,k.e)((function(){if(t&&e.current){var n=e.current;S.add(n);for(var r,o=(0,i.Ul)(E.keys());!(r=o()).done;){var a=r.value;a.contains(n)&&(C(a),E.delete(a))}return document.querySelectorAll("body > *").forEach((function(e){if(e instanceof HTMLElement){for(var t,n=(0,i.Ul)(S);!(t=n()).done;){var r=t.value;if(e.contains(r))return}1===S.size&&(E.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),O(e))}})),function(){if(S.delete(n),S.size>0)document.querySelectorAll("body > *").forEach((function(e){if(e instanceof HTMLElement&&!E.has(e)){for(var t,n=(0,i.Ul)(S);!(t=n()).done;){var r=t.value;if(e.contains(r))return}E.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),O(e)}}));else for(var e,t=(0,i.Ul)(E.keys());!(e=t()).done;){var r=e.value;C(r),E.delete(r)}}}}),[t])}(j,!!Q&&Z),d("mousedown",(function(e){var t,n=e.target;I===z.Open&&(Q||(null==(t=j.current)?void 0:t.contains(n))||H())})),d("keydown",(function(e){e.key===r.Escape&&I===z.Open&&(Q||(e.preventDefault(),e.stopPropagation(),H()))})),(0,o.useEffect)((function(){if(I===z.Open&&!X){var e=document.documentElement.style.overflow,t=document.documentElement.style.paddingRight,n=window.innerWidth-document.documentElement.clientWidth;return document.documentElement.style.overflow="hidden",document.documentElement.style.paddingRight=n+"px",function(){document.documentElement.style.overflow=e,document.documentElement.style.paddingRight=t}}}),[I,X]),(0,o.useEffect)((function(){if(I===z.Open&&j.current){var e=new IntersectionObserver((function(e){for(var t,n=(0,i.Ul)(e);!(t=n()).done;){var r=t.value;0===r.boundingClientRect.x&&0===r.boundingClientRect.y&&0===r.boundingClientRect.width&&0===r.boundingClientRect.height&&H()}}));return e.observe(j.current),function(){return e.disconnect()}}}),[I,j,H]);var ee=function(){var e=(0,o.useState)([]),t=e[0],n=e[1];return[t.length>0?t.join(" "):void 0,(0,o.useMemo)((function(){return function(e){var t=(0,o.useCallback)((function(e){return n((function(t){return[].concat(t,[e])})),function(){return n((function(t){var n=t.slice(),r=n.indexOf(e);return-1!==r&&n.splice(r,1),n}))}}),[]),r=(0,o.useMemo)((function(){return{register:t,slot:e.slot,name:e.name,props:e.props}}),[t,e.slot,e.name,e.props]);return o.createElement(L.Provider,{value:r},e.children)}}),[n])]}(),te=ee[0],ne=ee[1],re="headlessui-dialog-"+(0,f.M)(),ie=(0,o.useMemo)((function(){return[{dialogState:I,close:H,setTitleId:Y},B]}),[I,B,H,Y]),oe=(0,o.useMemo)((function(){return{open:I===z.Open}}),[I]),ae={ref:A,id:re,role:"dialog","aria-modal":I===z.Open||void 0,"aria-labelledby":B.titleId,"aria-describedby":te,onClick:function(e){e.stopPropagation()}},se=g;return o.createElement($,{type:"Dialog",element:j,onUpdate:(0,o.useCallback)((function(e,t,n){var r;"Dialog"===t&&(0,a.E)(e,((r={})[F.Add]=function(){w.current.add(n),v((function(e){return e+1}))},r[F.Remove]=function(){w.current.add(n),v((function(e){return e-1}))},r))}),[])},o.createElement(N,{force:!0},o.createElement(M,null,o.createElement(q.Provider,{value:ie},o.createElement(M.Group,{target:j},o.createElement(N,{force:!1},o.createElement(ne,{slot:oe,name:"Dialog.Description"},(0,s.sY)({props:(0,i.gY)({},se,ae),slot:oe,defaultTag:"div",features:K,visible:D,name:"Dialog"}))))))))})),Q=(0,s.yV)((function e(t,n){var r=Y([X.displayName,e.name].join("."))[0],a=r.dialogState,c=r.close,d=l(n),h="headlessui-dialog-overlay-"+(0,f.M)(),p=(0,o.useCallback)((function(e){if(e.target===e.currentTarget){if(u(e.currentTarget))return e.preventDefault();e.preventDefault(),e.stopPropagation(),c()}}),[c]),g=(0,o.useMemo)((function(){return{open:a===z.Open}}),[a]),m={ref:d,id:h,"aria-hidden":!0,onClick:p},y=t;return(0,s.sY)({props:(0,i.gY)({},y,m),slot:g,defaultTag:"div",name:"Dialog.Overlay"})}));var X=Object.assign(Z,{Overlay:Q,Title:function e(t){var n=Y([X.displayName,e.name].join("."))[0],r=n.dialogState,a=n.setTitleId,l="headlessui-dialog-title-"+(0,f.M)();(0,o.useEffect)((function(){return a(l),function(){return a(null)}}),[l,a]);var u=(0,o.useMemo)((function(){return{open:r===z.Open}}),[r]),c={id:l},d=t;return(0,s.sY)({props:(0,i.gY)({},d,c),slot:u,defaultTag:"h2",name:"Dialog.Title"})},Description:function(e){var t=R(),n="headlessui-description-"+(0,f.M)();(0,k.e)((function(){return t.register(n)}),[n,t.register]);var r=e,o=(0,i.gY)({},t.props,{id:n});return(0,s.sY)({props:(0,i.gY)({},r,o),slot:t.slot||{},defaultTag:"p",name:t.name||"Description"})}})},5131:(e,t,n)=>{"use strict";n.d(t,{u:()=>j});var r,i=n(9642),o=n(7294),a=n(133),s=n(8529),l=n(852),u=n(5989),c=n(2506),f=n(7933),d=n(3980);function h(){var e=[],t={requestAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){var e=requestAnimationFrame.apply(void 0,arguments);t.add((function(){return cancelAnimationFrame(e)}))})),nextFrame:function(){for(var e=arguments.length,n=new Array(e),r=0;r1?n-1:0),i=1;i0&&(t=e.classList).add.apply(t,r)}function g(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),i=1;i0&&(t=e.classList).remove.apply(t,r)}function m(e,t,n,i,o,a){var s,l,u=h(),c=void 0!==a?(s=a,l={called:!1},function(){if(!l.called)return l.called=!0,s.apply(void 0,arguments)}):function(){};return g.apply(void 0,[e].concat(o)),p.apply(void 0,[e].concat(t,n)),u.nextFrame((function(){g.apply(void 0,[e].concat(n)),p.apply(void 0,[e].concat(i)),u.add(function(e,t){var n=h();if(!e)return n.dispose;var i=getComputedStyle(e),o=[i.transitionDuration,i.transitionDelay].map((function(e){var t=e.split(",").filter(Boolean).map((function(e){return e.includes("ms")?parseFloat(e):1e3*parseFloat(e)})).sort((function(e,t){return t-e}))[0];return void 0===t?0:t})),a=o[0],s=o[1];return 0!==a?n.setTimeout((function(){t(r.Finished)}),a+s):t(r.Finished),n.add((function(){return t(r.Cancelled)})),n.dispose}(e,(function(n){return g.apply(void 0,[e].concat(i,t)),p.apply(void 0,[e].concat(o)),c(n)})))})),u.add((function(){return g.apply(void 0,[e].concat(t,n,i,o))})),u.add((function(){return c(r.Cancelled)})),u.dispose}function y(e){return void 0===e&&(e=""),(0,o.useMemo)((function(){return e.split(" ").filter((function(e){return e.trim().length>1}))}),[e])}!function(e){e.Finished="finished",e.Cancelled="cancelled"}(r||(r={}));var v,b=(0,o.createContext)(null);b.displayName="TransitionContext",function(e){e.Visible="visible",e.Hidden="hidden"}(v||(v={}));var x=(0,o.createContext)(null);function w(e){return"children"in e?w(e.children):e.current.filter((function(e){return e.state===v.Visible})).length>0}function _(e){var t=(0,o.useRef)(e),n=(0,o.useRef)([]),r=(0,f.t)();(0,o.useEffect)((function(){t.current=e}),[e]);var i=(0,o.useCallback)((function(e,i){var o;void 0===i&&(i=s.l4.Hidden);var l=n.current.findIndex((function(t){return t.id===e}));-1!==l&&((0,a.E)(i,((o={})[s.l4.Unmount]=function(){n.current.splice(l,1)},o[s.l4.Hidden]=function(){n.current[l].state=v.Hidden},o)),!w(n)&&r.current&&(null==t.current||t.current()))}),[t,r,n]),l=(0,o.useCallback)((function(e){var t=n.current.find((function(t){return t.id===e}));return t?t.state!==v.Visible&&(t.state=v.Visible):n.current.push({id:e,state:v.Visible}),function(){return i(e,s.l4.Unmount)}}),[n,i]);return(0,o.useMemo)((function(){return{children:n,register:l,unregister:i}}),[l,i,n])}function k(){}x.displayName="NestingContext";var S=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function E(e){for(var t,n={},r=(0,i.Ul)(S);!(t=r()).done;){var o,a=t.value;n[a]=null!=(o=e[a])?o:k}return n}var O=s.AN.RenderStrategy;function C(e){var t,n=e.beforeEnter,f=e.afterEnter,h=e.beforeLeave,p=e.afterLeave,g=e.enter,k=e.enterFrom,S=e.enterTo,C=e.entered,j=e.leave,N=e.leaveFrom,A=e.leaveTo,T=(0,i.gK)(e,["beforeEnter","afterEnter","beforeLeave","afterLeave","enter","enterFrom","enterTo","entered","leave","leaveFrom","leaveTo"]),P=(0,o.useRef)(null),M=(0,o.useState)(v.Visible),I=M[0],D=M[1],L=T.unmount?s.l4.Unmount:s.l4.Hidden,R=function(){var e=(0,o.useContext)(b);if(null===e)throw new Error("A is used but it is missing a parent or .");return e}(),F=R.show,B=R.appear,z=R.initial,U=function(){var e=(0,o.useContext)(x);if(null===e)throw new Error("A is used but it is missing a parent or .");return e}(),V=U.register,W=U.unregister,$=(0,c.M)(),H=(0,o.useRef)(!1),q=_((function(){H.current||(D(v.Hidden),W($),ee.current.afterLeave())}));(0,l.e)((function(){if($)return V($)}),[V,$]),(0,l.e)((function(){var e;L===s.l4.Hidden&&$&&(F&&I!==v.Visible?D(v.Visible):(0,a.E)(I,((e={})[v.Hidden]=function(){return W($)},e[v.Visible]=function(){return V($)},e)))}),[I,$,V,W,F,L]);var Y=y(g),G=y(k),K=y(S),Z=y(C),Q=y(j),X=y(N),J=y(A),ee=function(e){var t=(0,o.useRef)(E(e));return(0,o.useEffect)((function(){t.current=E(e)}),[e]),t}({beforeEnter:n,afterEnter:f,beforeLeave:h,afterLeave:p}),te=(0,u.H)();(0,o.useEffect)((function(){if(te&&I===v.Visible&&null===P.current)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}),[P,I,te]);var ne=z&&!B;(0,l.e)((function(){var e=P.current;if(e&&!ne)return H.current=!0,F&&ee.current.beforeEnter(),F||ee.current.beforeLeave(),F?m(e,Y,G,K,Z,(function(e){H.current=!1,e===r.Finished&&ee.current.afterEnter()})):m(e,Q,X,J,Z,(function(e){H.current=!1,e===r.Finished&&(w(q)||(D(v.Hidden),W($),ee.current.afterLeave()))}))}),[ee,$,H,W,q,P,ne,F,Y,G,K,Q,X,J]);var re={ref:P},ie=T;return o.createElement(x.Provider,{value:q},o.createElement(d.up,{value:(0,a.E)(I,(t={},t[v.Visible]=d.ZM.Open,t[v.Hidden]=d.ZM.Closed,t))},(0,s.sY)({props:(0,i.gY)({},ie,re),defaultTag:"div",features:O,visible:I===v.Visible,name:"Transition.Child"})))}function j(e){var t,n=e.show,r=e.appear,l=void 0!==r&&r,u=e.unmount,c=(0,i.gK)(e,["show","appear","unmount"]),f=(0,d.oJ)();void 0===n&&null!==f&&(n=(0,a.E)(f,((t={})[d.ZM.Open]=!0,t[d.ZM.Closed]=!1,t)));if(![!0,!1].includes(n))throw new Error("A is used but it is missing a `show={true | false}` prop.");var h=(0,o.useState)(n?v.Visible:v.Hidden),p=h[0],g=h[1],m=_((function(){g(v.Hidden)})),y=function(){var e=(0,o.useRef)(!0);return(0,o.useEffect)((function(){e.current=!1}),[]),e.current}(),k=(0,o.useMemo)((function(){return{show:n,appear:l||!y,initial:y}}),[n,l,y]);(0,o.useEffect)((function(){n?g(v.Visible):w(m)||g(v.Hidden)}),[n,m]);var S={unmount:u};return o.createElement(x.Provider,{value:m},o.createElement(b.Provider,{value:k},(0,s.sY)({props:(0,i.gY)({},S,{as:o.Fragment,children:o.createElement(C,Object.assign({},S,c))}),defaultTag:o.Fragment,features:O,visible:p===v.Visible,name:"Transition"})))}j.Child=function(e){var t=null!==(0,o.useContext)(b),n=null!==(0,d.oJ)();return!t&&n?o.createElement(j,Object.assign({},e)):o.createElement(C,Object.assign({},e))},j.Root=j},2506:(e,t,n)=>{"use strict";n.d(t,{M:()=>l});var r=n(7294),i=n(852),o=n(5989),a=0;function s(){return++a}function l(){var e=(0,o.H)(),t=(0,r.useState)(e?s:null),n=t[0],a=t[1];return(0,i.e)((function(){null===n&&a(s())}),[n]),null!=n?""+n:void 0}},7933:(e,t,n)=>{"use strict";n.d(t,{t:()=>i});var r=n(7294);function i(){var e=(0,r.useRef)(!1);return(0,r.useEffect)((function(){return e.current=!0,function(){e.current=!1}}),[]),e}},852:(e,t,n)=>{"use strict";n.d(t,{e:()=>i});var r=n(7294),i="undefined"!=typeof window?r.useLayoutEffect:r.useEffect},5989:(e,t,n)=>{"use strict";n.d(t,{H:()=>o});var r=n(7294),i={serverHandoffComplete:!1};function o(){var e=(0,r.useState)(i.serverHandoffComplete),t=e[0],n=e[1];return(0,r.useEffect)((function(){!0!==t&&n(!0)}),[t]),(0,r.useEffect)((function(){!1===i.serverHandoffComplete&&(i.serverHandoffComplete=!0)}),[]),t}},3980:(e,t,n)=>{"use strict";n.d(t,{up:()=>s,ZM:()=>r,oJ:()=>a});var r,i=n(7294),o=(0,i.createContext)(null);function a(){return(0,i.useContext)(o)}function s(e){var t=e.value,n=e.children;return i.createElement(o.Provider,{value:t},n)}o.displayName="OpenClosedContext",function(e){e[e.Open=0]="Open",e[e.Closed=1]="Closed"}(r||(r={}))},133:(e,t,n)=>{"use strict";function r(e,t){if(e in t){for(var n=t[e],i=arguments.length,o=new Array(i>2?i-2:0),a=2;ar})},8529:(e,t,n)=>{"use strict";n.d(t,{AN:()=>r,l4:()=>i,yV:()=>c,sY:()=>l});var r,i,o=n(9642),a=n(7294),s=n(133);function l(e){var t=e.props,n=e.slot,a=e.defaultTag,l=e.features,c=e.visible,f=void 0===c||c,d=e.name;if(f)return u(t,n,a,d);var h=null!=l?l:r.None;if(h&r.Static){var p=t.static,g=void 0!==p&&p,m=(0,o.gK)(t,["static"]);if(g)return u(m,n,a,d)}if(h&r.RenderStrategy){var y,v=t.unmount,b=void 0===v||v,x=(0,o.gK)(t,["unmount"]),w=b?i.Unmount:i.Hidden;return(0,s.E)(w,((y={})[i.Unmount]=function(){return null},y[i.Hidden]=function(){return u((0,o.gY)({},x,{hidden:!0,style:{display:"none"}}),n,a,d)},y))}return u(t,n,a,d)}function u(e,t,n,r){var i;void 0===t&&(t={});var s=f(e,["unmount","static"]),l=s.as,u=void 0===l?n:l,c=s.children,d=s.refName,h=void 0===d?"ref":d,p=(0,o.gK)(s,["as","children","refName"]),g=void 0!==e.ref?((i={})[h]=e.ref,i):{},m="function"==typeof c?c(t):c;if(p.className&&"function"==typeof p.className&&(p.className=p.className(t)),u===a.Fragment&&Object.keys(p).length>0){if(!(0,a.isValidElement)(m)||Array.isArray(m)&&m.length>1)throw new Error(['Passing props on "Fragment"!',"","The current component <"+r+' /> is rendering a "Fragment".',"However we need to passthrough the following props:",Object.keys(p).map((function(e){return" - "+e})).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map((function(e){return" - "+e})).join("\n")].join("\n"));return(0,a.cloneElement)(m,Object.assign({},function(e,t,n){for(var r,i=Object.assign({},e),a=function(){var n,o=r.value;void 0!==e[o]&&void 0!==t[o]&&Object.assign(i,((n={})[o]=function(n){n.defaultPrevented||e[o](n),n.defaultPrevented||t[o](n)},n))},s=(0,o.Ul)(n);!(r=s()).done;)a();return i}(function(e){var t=Object.assign({},e);for(var n in t)void 0===t[n]&&delete t[n];return t}(f(p,["ref"])),m.props,["onClick"]),g))}return(0,a.createElement)(u,Object.assign({},f(p,["ref"]),u!==a.Fragment&&g),m)}function c(e){var t;return Object.assign((0,a.forwardRef)(e),{displayName:null!=(t=e.displayName)?t:e.name})}function f(e,t){void 0===t&&(t=[]);for(var n,r=Object.assign({},e),i=(0,o.Ul)(t);!(n=i()).done;){var a=n.value;a in r&&delete r[a]}return r}!function(e){e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static"}(r||(r={})),function(e){e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden"}(i||(i={}))},1636:(e,t,n)=>{function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var i=r(n(2307)),o=n(7294),a=r(o),s=n(9680);function l(){return(l=Object.assign||function(e){for(var t=1;t"}(t);return t.props.children&&(n+=function(t){return"string"==typeof t.props.children?t.props.children:t.props.children.reduce((function(t,n){return t+e(n)}),"")}(t)),t.props.dangerouslySetInnerHTML&&(n+=t.props.dangerouslySetInnerHTML.__html),function(e){return["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"].indexOf(e.type)>-1}(t)||(n+=""),n}(function(e){return a.cloneElement(e,{inertia:void 0!==e.props["head-key"]?e.props["head-key"]:""})}(e))}(e)})),i&&!n.find((function(e){return e.startsWith(""+i+""),n)),null}f.displayName="InertiaHeadContext",d.displayName="Inertia";var p=["children","as","data","href","method","preserveScroll","preserveState","replace","only","headers","onClick","onCancelToken","onBefore","onStart","onProgress","onFinish","onCancel","onSuccess","onError"],g=function(){},m=o.forwardRef((function(e,t){var n=e.children,r=e.as,i=void 0===r?"a":r,a=e.data,u=void 0===a?{}:a,c=e.href,f=e.method,d=void 0===f?"get":f,h=e.preserveScroll,m=void 0!==h&&h,y=e.preserveState,v=void 0===y?null:y,b=e.replace,x=void 0!==b&&b,w=e.only,_=void 0===w?[]:w,k=e.headers,S=void 0===k?{}:k,E=e.onClick,O=void 0===E?g:E,C=e.onCancelToken,j=void 0===C?g:C,N=e.onBefore,A=void 0===N?g:N,T=e.onStart,P=void 0===T?g:T,M=e.onProgress,I=void 0===M?g:M,D=e.onFinish,L=void 0===D?g:D,R=e.onCancel,F=void 0===R?g:R,B=e.onSuccess,z=void 0===B?g:B,U=e.onError,V=void 0===U?g:U,W=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}(e,p),$=o.useCallback((function(e){O(e),s.shouldIntercept(e)&&(e.preventDefault(),s.Inertia.visit(c,{data:u,method:d,preserveScroll:m,preserveState:null!=v?v:"get"!==d,replace:x,only:_,headers:S,onCancelToken:j,onBefore:A,onStart:P,onProgress:I,onFinish:L,onCancel:F,onSuccess:z,onError:V}))}),[u,c,d,m,v,x,_,S,O,j,A,P,I,L,F,z,V]);i=i.toLowerCase(),d=d.toLowerCase();var H=s.mergeDataIntoQueryString(d,c||"",u);return c=H[0],u=H[1],"a"===i&&"get"!==d&&console.warn('Creating POST/PUT/PATCH/DELETE links is discouraged as it causes "Open Link in New Tab/Window" accessibility issues.\n\nPlease specify a more appropriate element using the "as" attribute. For example:\n\n...'),o.createElement(i,l({},W,"a"===i?{href:c}:{},{ref:t,onClick:$}),n)}));t.Fb=h,t.rU=m,t.yP=function(e){try{var t,n,r,i,a,s,l;n=void 0===(t=e.id)?"app":t,r=e.resolve,i=e.setup,a=e.title,s=e.page,l=e.render;var u="undefined"==typeof window,c=u?null:document.getElementById(n),f=s||JSON.parse(c.dataset.page),h=function(e){return Promise.resolve(r(e)).then((function(e){return e.default||e}))},p=[];return Promise.resolve(h(f.component).then((function(e){return i({el:c,App:d,props:{initialPage:f,initialComponent:e,resolveComponent:h,titleCallback:a,onHeadUpdate:u?function(e){return p=e}:null}})}))).then((function(e){return function(){if(u)return Promise.resolve(l(o.createElement("div",{id:n,"data-page":JSON.stringify(f)},e))).then((function(e){return{head:p,body:e}}))}()}))}catch(e){return Promise.reject(e)}},t.cI=function(){var e=[].slice.call(arguments),t=o.useRef(null),n="string"==typeof e[0]?e[0]:null,r=("string"==typeof e[0]?e[1]:e[0])||{},a=o.useRef(null),c=o.useRef(null),f=n?u(r,n+":data"):o.useState(r),d=f[0],h=f[1],p=n?u({},n+":errors"):o.useState({}),g=p[0],m=p[1],y=o.useState(!1),v=y[0],b=y[1],x=o.useState(!1),w=x[0],_=x[1],k=o.useState(null),S=k[0],E=k[1],O=o.useState(!1),C=O[0],j=O[1],N=o.useState(!1),A=N[0],T=N[1],P=function(e){return e};o.useEffect((function(){return t.current=!0,function(){t.current=!1}}),[]);var M=o.useCallback((function(e,n,r){void 0===r&&(r={});var i=l({},r,{onCancelToken:function(e){if(a.current=e,r.onCancelToken)return r.onCancelToken(e)},onBefore:function(e){if(j(!1),T(!1),clearTimeout(c.current),r.onBefore)return r.onBefore(e)},onStart:function(e){if(_(!0),r.onStart)return r.onStart(e)},onProgress:function(e){if(E(e),r.onProgress)return r.onProgress(e)},onSuccess:function(e){if(t.current&&(_(!1),E(null),m({}),b(!1),j(!0),T(!0),c.current=setTimeout((function(){t.current&&T(!1)}),2e3)),r.onSuccess)return r.onSuccess(e)},onError:function(e){if(t.current&&(_(!1),E(null),m(e),b(!0)),r.onError)return r.onError(e)},onCancel:function(){if(t.current&&(_(!1),E(null)),r.onCancel)return r.onCancel()},onFinish:function(){if(t.current&&(_(!1),E(null)),a.current=null,r.onFinish)return r.onFinish()}});"delete"===e?s.Inertia.delete(n,l({},i,{data:P(d)})):s.Inertia[e](n,P(d),i)}),[d,m]);return{data:d,setData:function(e,t){var n;h("string"==typeof e?l({},d,((n={})[e]=t,n)):"function"==typeof e?function(t){return e(t)}:e)},isDirty:!i(d,r),errors:g,hasErrors:v,processing:w,progress:S,wasSuccessful:C,recentlySuccessful:A,transform:function(e){P=e},reset:function(){var e=[].slice.call(arguments);h(0===e.length?r:Object.keys(r).filter((function(t){return e.includes(t)})).reduce((function(e,t){return e[t]=r[t],e}),l({},d)))},clearErrors:function(){var e=[].slice.call(arguments);m(Object.keys(g).reduce((function(t,n){var r;return l({},t,e.length>0&&!e.includes(n)?((r={})[n]=g[n],r):{})}),{})),b(Object.keys(g).length>0)},submit:M,get:function(e,t){M("get",e,t)},post:function(e,t){M("post",e,t)},put:function(e,t){M("put",e,t)},patch:function(e,t){M("patch",e,t)},delete:function(e,t){M("delete",e,t)},cancel:function(){a.current&&a.current.cancel()}}}},9680:(e,t,n)=>{function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var i=r(n(9669)),o=n(129),a=r(n(9996));function s(){return(s=Object.assign||function(e){for(var t=1;t0&&"back_forward"===window.performance.getEntriesByType("navigation")[0].type},n.handleBackForwardVisit=function(e){var t=this;window.history.state.version=e.version,this.setPage(window.history.state,{preserveScroll:!0,preserveState:!0}).then((function(){t.restoreScrollPositions(),b(e)}))},n.locationVisit=function(e,t){try{window.sessionStorage.setItem("inertiaLocationVisit",JSON.stringify({preserveScroll:t})),window.location.href=e.href,m(window.location).href===m(e).href&&window.location.reload()}catch(e){return!1}},n.isLocationVisit=function(){try{return null!==window.sessionStorage.getItem("inertiaLocationVisit")}catch(e){return!1}},n.handleLocationVisit=function(e){var t,n,r,i,o=this,a=JSON.parse(window.sessionStorage.getItem("inertiaLocationVisit")||"");window.sessionStorage.removeItem("inertiaLocationVisit"),e.url+=window.location.hash,e.rememberedState=null!=(t=null==(n=window.history.state)?void 0:n.rememberedState)?t:{},e.scrollRegions=null!=(r=null==(i=window.history.state)?void 0:i.scrollRegions)?r:[],this.setPage(e,{preserveScroll:a.preserveScroll,preserveState:!0}).then((function(){a.preserveScroll&&o.restoreScrollPositions(),b(e)}))},n.isLocationVisitResponse=function(e){return e&&409===e.status&&e.headers["x-inertia-location"]},n.isInertiaResponse=function(e){return null==e?void 0:e.headers["x-inertia"]},n.createVisitId=function(){return this.visitId={},this.visitId},n.cancelVisit=function(e,t){var n=t.cancelled,r=void 0!==n&&n,i=t.interrupted,o=void 0!==i&&i;!e||e.completed||e.cancelled||e.interrupted||(e.cancelToken.cancel(),e.onCancel(),e.completed=!1,e.cancelled=r,e.interrupted=o,v(e),e.onFinish(e))},n.finishVisit=function(e){e.cancelled||e.interrupted||(e.completed=!0,e.cancelled=!1,e.interrupted=!1,v(e),e.onFinish(e))},n.resolvePreserveOption=function(e,t){return"function"==typeof e?e(t):"errors"===e?Object.keys(t.props.errors||{}).length>0:e},n.visit=function(e,n){var r=this,o=void 0===n?{}:n,a=o.method,l=void 0===a?t.Method.GET:a,c=o.data,d=void 0===c?{}:c,h=o.replace,v=void 0!==h&&h,b=o.preserveScroll,x=void 0!==b&&b,w=o.preserveState,_=void 0!==w&&w,k=o.only,S=void 0===k?[]:k,E=o.headers,O=void 0===E?{}:E,C=o.errorBag,j=void 0===C?"":C,N=o.forceFormData,A=void 0!==N&&N,T=o.onCancelToken,P=void 0===T?function(){}:T,M=o.onBefore,I=void 0===M?function(){}:M,D=o.onStart,L=void 0===D?function(){}:D,R=o.onProgress,F=void 0===R?function(){}:R,B=o.onFinish,z=void 0===B?function(){}:B,U=o.onCancel,V=void 0===U?function(){}:U,W=o.onSuccess,$=void 0===W?function(){}:W,H=o.onError,q=void 0===H?function(){}:H,Y="string"==typeof e?p(e):e;if(!function e(t){return t instanceof File||t instanceof Blob||t instanceof FileList&&t.length>0||t instanceof FormData&&Array.from(t.values()).some((function(t){return e(t)}))||"object"==typeof t&&null!==t&&Object.values(t).some((function(t){return e(t)}))}(d)&&!A||d instanceof FormData||(d=f(d)),!(d instanceof FormData)){var G=g(l,Y,d),K=G[1];Y=p(G[0]),d=K}var Z={url:Y,method:l,data:d,replace:v,preserveScroll:x,preserveState:_,only:S,headers:O,errorBag:j,forceFormData:A,cancelled:!1,completed:!1,interrupted:!1};if(!1!==I(Z)&&function(e){return y("before",{cancelable:!0,detail:{visit:e}})}(Z)){this.activeVisit&&this.cancelVisit(this.activeVisit,{interrupted:!0}),this.saveScrollPositions();var Q=this.createVisitId();this.activeVisit=s({},Z,{onCancelToken:P,onBefore:I,onStart:L,onProgress:F,onFinish:z,onCancel:V,onSuccess:$,onError:q,cancelToken:i.CancelToken.source()}),P({cancel:function(){r.activeVisit&&r.cancelVisit(r.activeVisit,{cancelled:!0})}}),function(e){y("start",{detail:{visit:e}})}(Z),L(Z),i({method:l,url:m(Y).href,data:l===t.Method.GET?{}:d,params:l===t.Method.GET?d:{},cancelToken:this.activeVisit.cancelToken.token,headers:s({},O,{Accept:"text/html, application/xhtml+xml","X-Requested-With":"XMLHttpRequest","X-Inertia":!0},S.length?{"X-Inertia-Partial-Component":this.page.component,"X-Inertia-Partial-Data":S.join(",")}:{},j&&j.length?{"X-Inertia-Error-Bag":j}:{},this.page.version?{"X-Inertia-Version":this.page.version}:{}),onUploadProgress:function(e){d instanceof FormData&&(e.percentage=Math.round(e.loaded/e.total*100),function(e){y("progress",{detail:{progress:e}})}(e),F(e))}}).then((function(e){var t;if(!r.isInertiaResponse(e))return Promise.reject({response:e});var n=e.data;S.length&&n.component===r.page.component&&(n.props=s({},r.page.props,n.props)),x=r.resolvePreserveOption(x,n),(_=r.resolvePreserveOption(_,n))&&null!=(t=window.history.state)&&t.rememberedState&&n.component===r.page.component&&(n.rememberedState=window.history.state.rememberedState);var i=Y,o=p(n.url);return i.hash&&!o.hash&&m(i).href===o.href&&(o.hash=i.hash,n.url=o.href),r.setPage(n,{visitId:Q,replace:v,preserveScroll:x,preserveState:_})})).then((function(){var e=r.page.props.errors||{};if(Object.keys(e).length>0){var t=j?e[j]?e[j]:{}:e;return function(e){y("error",{detail:{errors:e}})}(t),q(t)}return y("success",{detail:{page:r.page}}),$(r.page)})).catch((function(e){if(r.isInertiaResponse(e.response))return r.setPage(e.response.data,{visitId:Q});if(r.isLocationVisitResponse(e.response)){var t=p(e.response.headers["x-inertia-location"]),n=Y;n.hash&&!t.hash&&m(n).href===t.href&&(t.hash=n.hash),r.locationVisit(t,!0===x)}else{if(!e.response)return Promise.reject(e);y("invalid",{cancelable:!0,detail:{response:e.response}})&&u.show(e.response.data)}})).then((function(){r.activeVisit&&r.finishVisit(r.activeVisit)})).catch((function(e){if(!i.isCancel(e)){var t=y("exception",{cancelable:!0,detail:{exception:e}});if(r.activeVisit&&r.finishVisit(r.activeVisit),t)return Promise.reject(e)}}))}},n.setPage=function(e,t){var n=this,r=void 0===t?{}:t,i=r.visitId,o=void 0===i?this.createVisitId():i,a=r.replace,s=void 0!==a&&a,l=r.preserveScroll,u=void 0!==l&&l,c=r.preserveState,f=void 0!==c&&c;return Promise.resolve(this.resolveComponent(e.component)).then((function(t){o===n.visitId&&(e.scrollRegions=e.scrollRegions||[],e.rememberedState=e.rememberedState||{},(s=s||p(e.url).href===window.location.href)?n.replaceState(e):n.pushState(e),n.swapComponent({component:t,page:e,preserveState:f}).then((function(){u||n.resetScrollPositions(),s||b(e)})))}))},n.pushState=function(e){this.page=e,window.history.pushState(e,"",e.url)},n.replaceState=function(e){this.page=e,window.history.replaceState(e,"",e.url)},n.handlePopstateEvent=function(e){var t=this;if(null!==e.state){var n=e.state,r=this.createVisitId();Promise.resolve(this.resolveComponent(n.component)).then((function(e){r===t.visitId&&(t.page=n,t.swapComponent({component:e,page:n,preserveState:!1}).then((function(){t.restoreScrollPositions(),b(n)})))}))}else{var i=p(this.page.url);i.hash=window.location.hash,this.replaceState(s({},this.page,{url:i.href})),this.resetScrollPositions()}},n.get=function(e,n,r){return void 0===n&&(n={}),void 0===r&&(r={}),this.visit(e,s({},r,{method:t.Method.GET,data:n}))},n.reload=function(e){return void 0===e&&(e={}),this.visit(window.location.href,s({},e,{preserveScroll:!0,preserveState:!0}))},n.replace=function(e,t){var n;return void 0===t&&(t={}),console.warn("Inertia.replace() has been deprecated and will be removed in a future release. Please use Inertia."+(null!=(n=t.method)?n:"get")+"() instead."),this.visit(e,s({preserveState:!0},t,{replace:!0}))},n.post=function(e,n,r){return void 0===n&&(n={}),void 0===r&&(r={}),this.visit(e,s({preserveState:!0},r,{method:t.Method.POST,data:n}))},n.put=function(e,n,r){return void 0===n&&(n={}),void 0===r&&(r={}),this.visit(e,s({preserveState:!0},r,{method:t.Method.PUT,data:n}))},n.patch=function(e,n,r){return void 0===n&&(n={}),void 0===r&&(r={}),this.visit(e,s({preserveState:!0},r,{method:t.Method.PATCH,data:n}))},n.delete=function(e,n){return void 0===n&&(n={}),this.visit(e,s({preserveState:!0},n,{method:t.Method.DELETE}))},n.remember=function(e,t){var n;void 0===t&&(t="default"),this.replaceState(s({},this.page,{rememberedState:s({},this.page.rememberedState,(n={},n[t]=e,n))}))},n.restore=function(e){var t,n;return void 0===e&&(e="default"),null==(t=window.history.state)||null==(n=t.rememberedState)?void 0:n[e]},n.on=function(e,t){var n=function(e){var n=t(e);e.cancelable&&!e.defaultPrevented&&!1===n&&e.preventDefault()};return document.addEventListener("inertia:"+e,n),function(){return document.removeEventListener("inertia:"+e,n)}},e}(),w={buildDOMElement:function(e){var t=document.createElement("template");t.innerHTML=e;var n=t.content.firstChild;if(!e.startsWith("