1&&(z.forEach(function(o){u.addAnimationState({target:o,rect:Mt?lt(o):t}),cr(o),o.fromRect=t,i.removeAnimationState(o)}),Mt=!1,Pi(!this.options.removeCloneOnHide,e))},dragOverCompleted:function(n){var i=n.sortable,e=n.isOwner,u=n.insertion,t=n.activeSortable,o=n.parentEl,a=n.putSortable,l=this.options;if(u){if(e&&t._hideClone(),De=!1,l.animation&&z.length>1&&(Mt||!e&&!t.options.sort&&!a)){var f=lt(nt,!1,!0,!0);z.forEach(function(d){d!==nt&&(Lr(d,f),o.appendChild(d))}),Mt=!0}if(!e)if(Mt||Qe(),z.length>1){var c=Je;t._showClone(i),t.options.animation&&!Je&&c&&Lt.forEach(function(d){t.addAnimationState({target:d,rect:Ae}),d.fromRect=Ae,d.thisAnimationDuration=null})}else t._showClone(i)}},dragOverAnimationCapture:function(n){var i=n.dragRect,e=n.isOwner,u=n.activeSortable;if(z.forEach(function(o){o.thisAnimationDuration=null}),u.options.animation&&!e&&u.multiDrag.isMultiDrag){Ae=Vt({},i);var t=ve(nt,!0);Ae.top-=t.f,Ae.left-=t.e}},dragOverAnimationComplete:function(){Mt&&(Mt=!1,Qe())},drop:function(n){var i=n.originalEvent,e=n.rootEl,u=n.parentEl,t=n.sortable,o=n.dispatchSortableEvent,a=n.oldIndex,l=n.putSortable,f=l||this.sortable;if(i){var c=this.options,d=u.children;if(!me)if(c.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),ft(nt,c.selectedClass,!~z.indexOf(nt)),~z.indexOf(nt))z.splice(z.indexOf(nt),1),Pe=null,we({sortable:t,rootEl:e,name:"deselect",targetEl:nt,originalEvt:i});else{if(z.push(nt),we({sortable:t,rootEl:e,name:"select",targetEl:nt,originalEvt:i}),i.shiftKey&&Pe&&t.el.contains(Pe)){var v=pt(Pe),h=pt(nt);if(~v&&~h&&v!==h){var p,g;for(h>v?(g=v,p=h):(g=h,p=v+1);g1){var m=lt(nt),b=pt(nt,":not(."+this.options.selectedClass+")");if(!De&&c.animation&&(nt.thisAnimationDuration=null),f.captureAnimationState(),!De&&(c.animation&&(nt.fromRect=m,z.forEach(function(y){if(y.thisAnimationDuration=null,y!==nt){var T=Mt?lt(y):m;y.fromRect=T,f.addAnimationState({target:y,rect:T})}})),Qe(),z.forEach(function(y){d[b]?u.insertBefore(y,d[b]):u.appendChild(y),b++}),a===pt(nt))){var C=!1;z.forEach(function(y){if(y.sortableIndex!==pt(y)){C=!0;return}}),C&&o("update")}z.forEach(function(y){cr(y)}),f.animateAll()}Kt=f}(e===u||l&&l.lastPutMode!=="clone")&&Lt.forEach(function(y){y.parentNode&&y.parentNode.removeChild(y)})}},nullingGlobal:function(){this.isMultiDrag=me=!1,Lt.length=0},destroyGlobal:function(){this._deselectMultiDrag(),Z(document,"pointerup",this._deselectMultiDrag),Z(document,"mouseup",this._deselectMultiDrag),Z(document,"touchend",this._deselectMultiDrag),Z(document,"keydown",this._checkKeyDown),Z(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(n){if(!(typeof me<"u"&&me)&&Kt===this.sortable&&!(n&&Ht(n.target,this.options.draggable,this.sortable.el,!1))&&!(n&&n.button!==0))for(;z.length;){var i=z[0];ft(i,this.options.selectedClass,!1),z.shift(),we({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:i,originalEvt:n})}},_checkKeyDown:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},Vt(s,{pluginName:"multiDrag",utils:{select:function(n){var i=n.parentNode[Dt];!i||!i.options.multiDrag||~z.indexOf(n)||(Kt&&Kt!==i&&(Kt.multiDrag._deselectMultiDrag(),Kt=i),ft(n,i.options.selectedClass,!0),z.push(n))},deselect:function(n){var i=n.parentNode[Dt],e=z.indexOf(n);!i||!i.options.multiDrag||!~e||(ft(n,i.options.selectedClass,!1),z.splice(e,1))}},eventProperties:function(){var n=this,i=[],e=[];return z.forEach(function(u){i.push({multiDragElement:u,index:u.sortableIndex});var t;Mt&&u!==nt?t=-1:Mt?t=pt(u,":not(."+n.options.selectedClass+")"):t=pt(u),e.push({multiDragElement:u,index:t})}),{items:Za(z),clones:[].concat(Lt),oldIndicies:i,newIndicies:e}},optionListeners:{multiDragKey:function(n){return n=n.toLowerCase(),n==="ctrl"?n="Control":n.length>1&&(n=n.charAt(0).toUpperCase()+n.substr(1)),n}}})}function Pi(s,r){z.forEach(function(n,i){var e=r.children[n.sortableIndex+(s?Number(i):0)];e?r.insertBefore(n,e):r.appendChild(n)})}function Br(s,r){Lt.forEach(function(n,i){var e=r.children[n.sortableIndex+(s?Number(i):0)];e?r.insertBefore(n,e):r.appendChild(n)})}function Qe(){z.forEach(function(s){s!==nt&&s.parentNode&&s.parentNode.removeChild(s)})}K.mount(new Oi);K.mount(Rr,Ar);const Di=Object.freeze(Object.defineProperty({__proto__:null,MultiDrag:Ci,Sortable:K,Swap:Ti,default:K},Symbol.toStringTag,{value:"Module"})),Ai=Wr(Di);(function(s,r){(function(i,e){s.exports=e(Ya,Ai)})(typeof self<"u"?self:Ua,function(n,i){return function(e){var u={};function t(o){if(u[o])return u[o].exports;var a=u[o]={i:o,l:!1,exports:{}};return e[o].call(a.exports,a,a.exports,t),a.l=!0,a.exports}return t.m=e,t.c=u,t.d=function(o,a,l){t.o(o,a)||Object.defineProperty(o,a,{enumerable:!0,get:l})},t.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},t.t=function(o,a){if(a&1&&(o=t(o)),a&8||a&4&&typeof o=="object"&&o&&o.__esModule)return o;var l=Object.create(null);if(t.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:o}),a&2&&typeof o!="string")for(var f in o)t.d(l,f,(function(c){return o[c]}).bind(null,f));return l},t.n=function(o){var a=o&&o.__esModule?function(){return o.default}:function(){return o};return t.d(a,"a",a),a},t.o=function(o,a){return Object.prototype.hasOwnProperty.call(o,a)},t.p="",t(t.s="fb15")}({"00ee":function(e,u,t){var o=t("b622"),a=o("toStringTag"),l={};l[a]="z",e.exports=String(l)==="[object z]"},"0366":function(e,u,t){var o=t("1c0b");e.exports=function(a,l,f){if(o(a),l===void 0)return a;switch(f){case 0:return function(){return a.call(l)};case 1:return function(c){return a.call(l,c)};case 2:return function(c,d){return a.call(l,c,d)};case 3:return function(c,d,v){return a.call(l,c,d,v)}}return function(){return a.apply(l,arguments)}}},"057f":function(e,u,t){var o=t("fc6a"),a=t("241c").f,l={}.toString,f=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(d){try{return a(d)}catch{return f.slice()}};e.exports.f=function(v){return f&&l.call(v)=="[object Window]"?c(v):a(o(v))}},"06cf":function(e,u,t){var o=t("83ab"),a=t("d1e7"),l=t("5c6c"),f=t("fc6a"),c=t("c04e"),d=t("5135"),v=t("0cfb"),h=Object.getOwnPropertyDescriptor;u.f=o?h:function(g,m){if(g=f(g),m=c(m,!0),v)try{return h(g,m)}catch{}if(d(g,m))return l(!a.f.call(g,m),g[m])}},"0cfb":function(e,u,t){var o=t("83ab"),a=t("d039"),l=t("cc12");e.exports=!o&&!a(function(){return Object.defineProperty(l("div"),"a",{get:function(){return 7}}).a!=7})},"13d5":function(e,u,t){var o=t("23e7"),a=t("d58f").left,l=t("a640"),f=t("ae40"),c=l("reduce"),d=f("reduce",{1:0});o({target:"Array",proto:!0,forced:!c||!d},{reduce:function(h){return a(this,h,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"14c3":function(e,u,t){var o=t("c6b6"),a=t("9263");e.exports=function(l,f){var c=l.exec;if(typeof c=="function"){var d=c.call(l,f);if(typeof d!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return d}if(o(l)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return a.call(l,f)}},"159b":function(e,u,t){var o=t("da84"),a=t("fdbc"),l=t("17c2"),f=t("9112");for(var c in a){var d=o[c],v=d&&d.prototype;if(v&&v.forEach!==l)try{f(v,"forEach",l)}catch{v.forEach=l}}},"17c2":function(e,u,t){var o=t("b727").forEach,a=t("a640"),l=t("ae40"),f=a("forEach"),c=l("forEach");e.exports=!f||!c?function(v){return o(this,v,arguments.length>1?arguments[1]:void 0)}:[].forEach},"1be4":function(e,u,t){var o=t("d066");e.exports=o("document","documentElement")},"1c0b":function(e,u){e.exports=function(t){if(typeof t!="function")throw TypeError(String(t)+" is not a function");return t}},"1c7e":function(e,u,t){var o=t("b622"),a=o("iterator"),l=!1;try{var f=0,c={next:function(){return{done:!!f++}},return:function(){l=!0}};c[a]=function(){return this},Array.from(c,function(){throw 2})}catch{}e.exports=function(d,v){if(!v&&!l)return!1;var h=!1;try{var p={};p[a]=function(){return{next:function(){return{done:h=!0}}}},d(p)}catch{}return h}},"1d80":function(e,u){e.exports=function(t){if(t==null)throw TypeError("Can't call method on "+t);return t}},"1dde":function(e,u,t){var o=t("d039"),a=t("b622"),l=t("2d00"),f=a("species");e.exports=function(c){return l>=51||!o(function(){var d=[],v=d.constructor={};return v[f]=function(){return{foo:1}},d[c](Boolean).foo!==1})}},"23cb":function(e,u,t){var o=t("a691"),a=Math.max,l=Math.min;e.exports=function(f,c){var d=o(f);return d<0?a(d+c,0):l(d,c)}},"23e7":function(e,u,t){var o=t("da84"),a=t("06cf").f,l=t("9112"),f=t("6eeb"),c=t("ce4e"),d=t("e893"),v=t("94ca");e.exports=function(h,p){var g=h.target,m=h.global,b=h.stat,C,y,T,E,R,N;if(m?y=o:b?y=o[g]||c(g,{}):y=(o[g]||{}).prototype,y)for(T in p){if(R=p[T],h.noTargetGet?(N=a(y,T),E=N&&N.value):E=y[T],C=v(m?T:g+(b?".":"#")+T,h.forced),!C&&E!==void 0){if(typeof R==typeof E)continue;d(R,E)}(h.sham||E&&E.sham)&&l(R,"sham",!0),f(y,T,R,h)}}},"241c":function(e,u,t){var o=t("ca84"),a=t("7839"),l=a.concat("length","prototype");u.f=Object.getOwnPropertyNames||function(c){return o(c,l)}},"25f0":function(e,u,t){var o=t("6eeb"),a=t("825a"),l=t("d039"),f=t("ad6d"),c="toString",d=RegExp.prototype,v=d[c],h=l(function(){return v.call({source:"a",flags:"b"})!="/a/b"}),p=v.name!=c;(h||p)&&o(RegExp.prototype,c,function(){var m=a(this),b=String(m.source),C=m.flags,y=String(C===void 0&&m instanceof RegExp&&!("flags"in d)?f.call(m):C);return"/"+b+"/"+y},{unsafe:!0})},"2ca0":function(e,u,t){var o=t("23e7"),a=t("06cf").f,l=t("50c4"),f=t("5a34"),c=t("1d80"),d=t("ab13"),v=t("c430"),h="".startsWith,p=Math.min,g=d("startsWith"),m=!v&&!g&&!!function(){var b=a(String.prototype,"startsWith");return b&&!b.writable}();o({target:"String",proto:!0,forced:!m&&!g},{startsWith:function(C){var y=String(c(this));f(C);var T=l(p(arguments.length>1?arguments[1]:void 0,y.length)),E=String(C);return h?h.call(y,E,T):y.slice(T,T+E.length)===E}})},"2d00":function(e,u,t){var o=t("da84"),a=t("342f"),l=o.process,f=l&&l.versions,c=f&&f.v8,d,v;c?(d=c.split("."),v=d[0]+d[1]):a&&(d=a.match(/Edge\/(\d+)/),(!d||d[1]>=74)&&(d=a.match(/Chrome\/(\d+)/),d&&(v=d[1]))),e.exports=v&&+v},"342f":function(e,u,t){var o=t("d066");e.exports=o("navigator","userAgent")||""},"35a1":function(e,u,t){var o=t("f5df"),a=t("3f8c"),l=t("b622"),f=l("iterator");e.exports=function(c){if(c!=null)return c[f]||c["@@iterator"]||a[o(c)]}},"37e8":function(e,u,t){var o=t("83ab"),a=t("9bf2"),l=t("825a"),f=t("df75");e.exports=o?Object.defineProperties:function(d,v){l(d);for(var h=f(v),p=h.length,g=0,m;p>g;)a.f(d,m=h[g++],v[m]);return d}},"3bbe":function(e,u,t){var o=t("861d");e.exports=function(a){if(!o(a)&&a!==null)throw TypeError("Can't set "+String(a)+" as a prototype");return a}},"3ca3":function(e,u,t){var o=t("6547").charAt,a=t("69f3"),l=t("7dd0"),f="String Iterator",c=a.set,d=a.getterFor(f);l(String,"String",function(v){c(this,{type:f,string:String(v),index:0})},function(){var h=d(this),p=h.string,g=h.index,m;return g>=p.length?{value:void 0,done:!0}:(m=o(p,g),h.index+=m.length,{value:m,done:!1})})},"3f8c":function(e,u){e.exports={}},4160:function(e,u,t){var o=t("23e7"),a=t("17c2");o({target:"Array",proto:!0,forced:[].forEach!=a},{forEach:a})},"428f":function(e,u,t){var o=t("da84");e.exports=o},"44ad":function(e,u,t){var o=t("d039"),a=t("c6b6"),l="".split;e.exports=o(function(){return!Object("z").propertyIsEnumerable(0)})?function(f){return a(f)=="String"?l.call(f,""):Object(f)}:Object},"44d2":function(e,u,t){var o=t("b622"),a=t("7c73"),l=t("9bf2"),f=o("unscopables"),c=Array.prototype;c[f]==null&&l.f(c,f,{configurable:!0,value:a(null)}),e.exports=function(d){c[f][d]=!0}},"44e7":function(e,u,t){var o=t("861d"),a=t("c6b6"),l=t("b622"),f=l("match");e.exports=function(c){var d;return o(c)&&((d=c[f])!==void 0?!!d:a(c)=="RegExp")}},4930:function(e,u,t){var o=t("d039");e.exports=!!Object.getOwnPropertySymbols&&!o(function(){return!String(Symbol())})},"4d64":function(e,u,t){var o=t("fc6a"),a=t("50c4"),l=t("23cb"),f=function(c){return function(d,v,h){var p=o(d),g=a(p.length),m=l(h,g),b;if(c&&v!=v){for(;g>m;)if(b=p[m++],b!=b)return!0}else for(;g>m;m++)if((c||m in p)&&p[m]===v)return c||m||0;return!c&&-1}};e.exports={includes:f(!0),indexOf:f(!1)}},"4de4":function(e,u,t){var o=t("23e7"),a=t("b727").filter,l=t("1dde"),f=t("ae40"),c=l("filter"),d=f("filter");o({target:"Array",proto:!0,forced:!c||!d},{filter:function(h){return a(this,h,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(e,u,t){var o=t("0366"),a=t("7b0b"),l=t("9bdd"),f=t("e95a"),c=t("50c4"),d=t("8418"),v=t("35a1");e.exports=function(p){var g=a(p),m=typeof this=="function"?this:Array,b=arguments.length,C=b>1?arguments[1]:void 0,y=C!==void 0,T=v(g),E=0,R,N,I,M,F,Y;if(y&&(C=o(C,b>2?arguments[2]:void 0,2)),T!=null&&!(m==Array&&f(T)))for(M=T.call(g),F=M.next,N=new m;!(I=F.call(M)).done;E++)Y=y?l(M,C,[I.value,E],!0):I.value,d(N,E,Y);else for(R=c(g.length),N=new m(R);R>E;E++)Y=y?C(g[E],E):g[E],d(N,E,Y);return N.length=E,N}},"4fad":function(e,u,t){var o=t("23e7"),a=t("6f53").entries;o({target:"Object",stat:!0},{entries:function(f){return a(f)}})},"50c4":function(e,u,t){var o=t("a691"),a=Math.min;e.exports=function(l){return l>0?a(o(l),9007199254740991):0}},5135:function(e,u){var t={}.hasOwnProperty;e.exports=function(o,a){return t.call(o,a)}},5319:function(e,u,t){var o=t("d784"),a=t("825a"),l=t("7b0b"),f=t("50c4"),c=t("a691"),d=t("1d80"),v=t("8aa5"),h=t("14c3"),p=Math.max,g=Math.min,m=Math.floor,b=/\$([$&'`]|\d\d?|<[^>]*>)/g,C=/\$([$&'`]|\d\d?)/g,y=function(T){return T===void 0?T:String(T)};o("replace",2,function(T,E,R,N){var I=N.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,M=N.REPLACE_KEEPS_$0,F=I?"$":"$0";return[function(w,W){var j=d(this),V=w==null?void 0:w[T];return V!==void 0?V.call(w,j,W):E.call(String(j),w,W)},function(D,w){if(!I&&M||typeof w=="string"&&w.indexOf(F)===-1){var W=R(E,D,this,w);if(W.done)return W.value}var j=a(D),V=String(this),tt=typeof w=="function";tt||(w=String(w));var at=j.global;if(at){var Et=j.unicode;j.lastIndex=0}for(var ct=[];;){var dt=h(j,V);if(dt===null||(ct.push(dt),!at))break;var bt=String(dt[0]);bt===""&&(j.lastIndex=v(V,f(j.lastIndex),Et))}for(var xt="",mt=0,it=0;it=mt&&(xt+=V.slice(mt,jt)+Ot,mt=jt+ut.length)}return xt+V.slice(mt)}];function Y(D,w,W,j,V,tt){var at=W+D.length,Et=j.length,ct=C;return V!==void 0&&(V=l(V),ct=b),E.call(tt,ct,function(dt,bt){var xt;switch(bt.charAt(0)){case"$":return"$";case"&":return D;case"`":return w.slice(0,W);case"'":return w.slice(at);case"<":xt=V[bt.slice(1,-1)];break;default:var mt=+bt;if(mt===0)return dt;if(mt>Et){var it=m(mt/10);return it===0?dt:it<=Et?j[it-1]===void 0?bt.charAt(1):j[it-1]+bt.charAt(1):dt}xt=j[mt-1]}return xt===void 0?"":xt})}})},5692:function(e,u,t){var o=t("c430"),a=t("c6cd");(e.exports=function(l,f){return a[l]||(a[l]=f!==void 0?f:{})})("versions",[]).push({version:"3.6.5",mode:o?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56ef":function(e,u,t){var o=t("d066"),a=t("241c"),l=t("7418"),f=t("825a");e.exports=o("Reflect","ownKeys")||function(d){var v=a.f(f(d)),h=l.f;return h?v.concat(h(d)):v}},"5a34":function(e,u,t){var o=t("44e7");e.exports=function(a){if(o(a))throw TypeError("The method doesn't accept regular expressions");return a}},"5c6c":function(e,u){e.exports=function(t,o){return{enumerable:!(t&1),configurable:!(t&2),writable:!(t&4),value:o}}},"5db7":function(e,u,t){var o=t("23e7"),a=t("a2bf"),l=t("7b0b"),f=t("50c4"),c=t("1c0b"),d=t("65f0");o({target:"Array",proto:!0},{flatMap:function(h){var p=l(this),g=f(p.length),m;return c(h),m=d(p,0),m.length=a(m,p,p,g,0,1,h,arguments.length>1?arguments[1]:void 0),m}})},6547:function(e,u,t){var o=t("a691"),a=t("1d80"),l=function(f){return function(c,d){var v=String(a(c)),h=o(d),p=v.length,g,m;return h<0||h>=p?f?"":void 0:(g=v.charCodeAt(h),g<55296||g>56319||h+1===p||(m=v.charCodeAt(h+1))<56320||m>57343?f?v.charAt(h):g:f?v.slice(h,h+2):(g-55296<<10)+(m-56320)+65536)}};e.exports={codeAt:l(!1),charAt:l(!0)}},"65f0":function(e,u,t){var o=t("861d"),a=t("e8b5"),l=t("b622"),f=l("species");e.exports=function(c,d){var v;return a(c)&&(v=c.constructor,typeof v=="function"&&(v===Array||a(v.prototype))?v=void 0:o(v)&&(v=v[f],v===null&&(v=void 0))),new(v===void 0?Array:v)(d===0?0:d)}},"69f3":function(e,u,t){var o=t("7f9a"),a=t("da84"),l=t("861d"),f=t("9112"),c=t("5135"),d=t("f772"),v=t("d012"),h=a.WeakMap,p,g,m,b=function(I){return m(I)?g(I):p(I,{})},C=function(I){return function(M){var F;if(!l(M)||(F=g(M)).type!==I)throw TypeError("Incompatible receiver, "+I+" required");return F}};if(o){var y=new h,T=y.get,E=y.has,R=y.set;p=function(I,M){return R.call(y,I,M),M},g=function(I){return T.call(y,I)||{}},m=function(I){return E.call(y,I)}}else{var N=d("state");v[N]=!0,p=function(I,M){return f(I,N,M),M},g=function(I){return c(I,N)?I[N]:{}},m=function(I){return c(I,N)}}e.exports={set:p,get:g,has:m,enforce:b,getterFor:C}},"6eeb":function(e,u,t){var o=t("da84"),a=t("9112"),l=t("5135"),f=t("ce4e"),c=t("8925"),d=t("69f3"),v=d.get,h=d.enforce,p=String(String).split("String");(e.exports=function(g,m,b,C){var y=C?!!C.unsafe:!1,T=C?!!C.enumerable:!1,E=C?!!C.noTargetGet:!1;if(typeof b=="function"&&(typeof m=="string"&&!l(b,"name")&&a(b,"name",m),h(b).source=p.join(typeof m=="string"?m:"")),g===o){T?g[m]=b:f(m,b);return}else y?!E&&g[m]&&(T=!0):delete g[m];T?g[m]=b:a(g,m,b)})(Function.prototype,"toString",function(){return typeof this=="function"&&v(this).source||c(this)})},"6f53":function(e,u,t){var o=t("83ab"),a=t("df75"),l=t("fc6a"),f=t("d1e7").f,c=function(d){return function(v){for(var h=l(v),p=a(h),g=p.length,m=0,b=[],C;g>m;)C=p[m++],(!o||f.call(h,C))&&b.push(d?[C,h[C]]:h[C]);return b}};e.exports={entries:c(!0),values:c(!1)}},"73d9":function(e,u,t){var o=t("44d2");o("flatMap")},7418:function(e,u){u.f=Object.getOwnPropertySymbols},"746f":function(e,u,t){var o=t("428f"),a=t("5135"),l=t("e538"),f=t("9bf2").f;e.exports=function(c){var d=o.Symbol||(o.Symbol={});a(d,c)||f(d,c,{value:l.f(c)})}},7839:function(e,u){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(e,u,t){var o=t("1d80");e.exports=function(a){return Object(o(a))}},"7c73":function(e,u,t){var o=t("825a"),a=t("37e8"),l=t("7839"),f=t("d012"),c=t("1be4"),d=t("cc12"),v=t("f772"),h=">",p="<",g="prototype",m="script",b=v("IE_PROTO"),C=function(){},y=function(I){return p+m+h+I+p+"/"+m+h},T=function(I){I.write(y("")),I.close();var M=I.parentWindow.Object;return I=null,M},E=function(){var I=d("iframe"),M="java"+m+":",F;return I.style.display="none",c.appendChild(I),I.src=String(M),F=I.contentWindow.document,F.open(),F.write(y("document.F=Object")),F.close(),F.F},R,N=function(){try{R=document.domain&&new ActiveXObject("htmlfile")}catch{}N=R?T(R):E();for(var I=l.length;I--;)delete N[g][l[I]];return N()};f[b]=!0,e.exports=Object.create||function(M,F){var Y;return M!==null?(C[g]=o(M),Y=new C,C[g]=null,Y[b]=M):Y=N(),F===void 0?Y:a(Y,F)}},"7dd0":function(e,u,t){var o=t("23e7"),a=t("9ed3"),l=t("e163"),f=t("d2bb"),c=t("d44e"),d=t("9112"),v=t("6eeb"),h=t("b622"),p=t("c430"),g=t("3f8c"),m=t("ae93"),b=m.IteratorPrototype,C=m.BUGGY_SAFARI_ITERATORS,y=h("iterator"),T="keys",E="values",R="entries",N=function(){return this};e.exports=function(I,M,F,Y,D,w,W){a(F,M,Y);var j=function(it){if(it===D&&ct)return ct;if(!C&&it in at)return at[it];switch(it){case T:return function(){return new F(this,it)};case E:return function(){return new F(this,it)};case R:return function(){return new F(this,it)}}return function(){return new F(this)}},V=M+" Iterator",tt=!1,at=I.prototype,Et=at[y]||at["@@iterator"]||D&&at[D],ct=!C&&Et||j(D),dt=M=="Array"&&at.entries||Et,bt,xt,mt;if(dt&&(bt=l(dt.call(new I)),b!==Object.prototype&&bt.next&&(!p&&l(bt)!==b&&(f?f(bt,b):typeof bt[y]!="function"&&d(bt,y,N)),c(bt,V,!0,!0),p&&(g[V]=N))),D==E&&Et&&Et.name!==E&&(tt=!0,ct=function(){return Et.call(this)}),(!p||W)&&at[y]!==ct&&d(at,y,ct),g[M]=ct,D)if(xt={values:j(E),keys:w?ct:j(T),entries:j(R)},W)for(mt in xt)(C||tt||!(mt in at))&&v(at,mt,xt[mt]);else o({target:M,proto:!0,forced:C||tt},xt);return xt}},"7f9a":function(e,u,t){var o=t("da84"),a=t("8925"),l=o.WeakMap;e.exports=typeof l=="function"&&/native code/.test(a(l))},"825a":function(e,u,t){var o=t("861d");e.exports=function(a){if(!o(a))throw TypeError(String(a)+" is not an object");return a}},"83ab":function(e,u,t){var o=t("d039");e.exports=!o(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},8418:function(e,u,t){var o=t("c04e"),a=t("9bf2"),l=t("5c6c");e.exports=function(f,c,d){var v=o(c);v in f?a.f(f,v,l(0,d)):f[v]=d}},"861d":function(e,u){e.exports=function(t){return typeof t=="object"?t!==null:typeof t=="function"}},8875:function(e,u,t){var o,a,l;(function(f,c){a=[],o=c,l=typeof o=="function"?o.apply(u,a):o,l!==void 0&&(e.exports=l)})(typeof self<"u"?self:this,function(){function f(){var c=Object.getOwnPropertyDescriptor(document,"currentScript");if(!c&&"currentScript"in document&&document.currentScript||c&&c.get!==f&&document.currentScript)return document.currentScript;try{throw new Error}catch(R){var d=/.*at [^(]*\((.*):(.+):(.+)\)$/ig,v=/@([^@]*):(\d+):(\d+)\s*$/ig,h=d.exec(R.stack)||v.exec(R.stack),p=h&&h[1]||!1,g=h&&h[2]||!1,m=document.location.href.replace(document.location.hash,""),b,C,y,T=document.getElementsByTagName("script");p===m&&(b=document.documentElement.outerHTML,C=new RegExp("(?:[^\\n]+?\\n){0,"+(g-2)+"}[^<]*
diff --git a/resources/default/js/Pages/Admin/CommandQueue/IndexCommandQueue.vue b/resources/default/js/Pages/Admin/CommandQueue/IndexCommandQueue.vue
new file mode 100644
index 000000000..975057d73
--- /dev/null
+++ b/resources/default/js/Pages/Admin/CommandQueue/IndexCommandQueue.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
+ {{ __("Command History") }}
+
+
+
+ {{ __("Retry All Failed") }}
+
+
+
+
+
+
+
+ {{ item.id }}
+
+
+
+ {{ item.parsed_command }}
+
+
+
+ {{ item.server.name }}
+
+
+
+
+
+
+
+
+ {{ formatTimeAgoToNow(item.last_attempt_at) }}
+
+
+ {{ "not yet" }}
+
+
+ {{ __("Attempts: :attempts/:max_attempts", {
+ attempts: item.attempts,
+ max_attempts: item.max_attempts ?? 1,
+ }) }}
+
+
+
+
+
+ {{ formatTimeAgoToNow(item.execute_at) }}
+
+
+ {{ "no delay" }}
+
+
+
+
+ {{ item.tag ?? __("none") }}
+
+
+
+
+ {{ item.player.username }}
+ {{ __("Unknown") }}
+
+
+ {{ __("none") }}
+
+
+
+
+
+ {{ item.output.length > 10 ? item.output.substring(0, 10) + '...' : item.output }}
+
+
+ {{ __("none") }}
+
+
+
+
+
+
+ {{ formatTimeAgoToNow(item.created_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/default/js/Pages/Admin/CustomForm/IndexCustomForm.vue b/resources/default/js/Pages/Admin/CustomForm/IndexCustomForm.vue
index 21923957b..bb4bd7a89 100644
--- a/resources/default/js/Pages/Admin/CustomForm/IndexCustomForm.vue
+++ b/resources/default/js/Pages/Admin/CustomForm/IndexCustomForm.vue
@@ -31,13 +31,20 @@ const headerRow = [
},
{
key: 'title',
- sortable: true,
label: __('Title'),
+ sortable: true,
+ filterable: {
+ type: 'text',
+ }
},
{
key: 'status',
label: __('Status'),
sortable: true,
+ filterable: {
+ type: 'multiselect',
+ options: ['draft', 'active', 'disabled', 'archived'],
+ }
},
{
key: 'can_create_submission',
diff --git a/resources/default/js/Pages/Admin/CustomFormSubmission/IndexCustomFormSubmission.vue b/resources/default/js/Pages/Admin/CustomFormSubmission/IndexCustomFormSubmission.vue
index 7e69efe83..e2e824b0b 100644
--- a/resources/default/js/Pages/Admin/CustomFormSubmission/IndexCustomFormSubmission.vue
+++ b/resources/default/js/Pages/Admin/CustomFormSubmission/IndexCustomFormSubmission.vue
@@ -56,6 +56,10 @@ const headerRow = [
sortable: true,
label: __('User'),
class: 'w-3/12',
+ filterable: {
+ key: 'user.name',
+ type: 'text',
+ },
},
{
key: 'custom_form_id',
diff --git a/resources/default/js/Pages/Admin/Download/IndexDownload.vue b/resources/default/js/Pages/Admin/Download/IndexDownload.vue
index 900e6618d..1081942f1 100644
--- a/resources/default/js/Pages/Admin/Download/IndexDownload.vue
+++ b/resources/default/js/Pages/Admin/Download/IndexDownload.vue
@@ -29,6 +29,9 @@ const headerRow = [
key: 'name',
sortable: true,
label: __('Name'),
+ filterable: {
+ type: 'text',
+ },
},
{
key: 'is_active',
diff --git a/resources/default/js/Pages/Admin/FailedJob/IndexFailedJob.vue b/resources/default/js/Pages/Admin/FailedJob/IndexFailedJob.vue
new file mode 100644
index 000000000..ed99f8ca1
--- /dev/null
+++ b/resources/default/js/Pages/Admin/FailedJob/IndexFailedJob.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+ {{ __("Failed Jobs") }}
+
+
+
+ {{ __("Retry All Jobs") }}
+
+
+ {{ __("Clear All Jobs") }}
+
+
+
+
+
+
+
+ {{ item.id }}
+
+
+
+ {{ item.uuid }}
+
+
+
+
+
+ {{ item.payload.displayName }}
+
+
+ {{ __("Attempts: :attempts", {
+ attempts: item.payload.attempts,
+ }) }}
+
+
+
+
+
+ {{ item.connection + '/' + item.queue }}
+
+
+
+
+ {{ item.exception.substring(0, 30) + '...' }}
+
+
+
+
+
+ {{ formatTimeAgoToNow(item.failed_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/default/js/Pages/Admin/PlayerIntel/PlayersList.vue b/resources/default/js/Pages/Admin/PlayerIntel/PlayersList.vue
index c4f243bdb..cc224166b 100644
--- a/resources/default/js/Pages/Admin/PlayerIntel/PlayersList.vue
+++ b/resources/default/js/Pages/Admin/PlayerIntel/PlayersList.vue
@@ -15,10 +15,13 @@ const { can } = useAuthorizable();
const { formatTimeAgoToNow, formatToDayDateString, secondsToHMS } =
useHelpers();
-defineProps({
+const props = defineProps({
serverList: {
type: Object,
},
+ countries: {
+ type: Array,
+ },
filters: {
type: Object,
},
@@ -33,12 +36,21 @@ const headerRow = [
label: __('Flag'),
sortable: true,
class: 'text-left',
+ filterable: {
+ key: 'country.name',
+ type: 'multiselect',
+ options: props.countries,
+ searchable: true,
+ }
},
{
key: 'player_username',
label: __('Username'),
sortable: true,
class: 'text-left',
+ filterable: {
+ type: 'text',
+ }
},
{
key: 'server_play_count',
@@ -64,11 +76,32 @@ const headerRow = [
key: 'last_join_address',
label: __('Join Address'),
sortable: true,
+ filterable: {
+ type: 'text',
+ }
},
{
key: 'last_minecraft_version',
label: __('MC Version'),
sortable: true,
+ filterable: {
+ type: 'multiselect',
+ options: [
+ '1.20',
+ '1.19',
+ '1.18',
+ '1.17',
+ '1.16',
+ '1.15',
+ '1.14',
+ '1.13',
+ '1.12',
+ '1.11',
+ '1.10',
+ '1.9',
+ '1.8',
+ ]
+ }
},
{
key: 'first_seen_at',
diff --git a/resources/default/js/Pages/Admin/Poll/CreatePoll.vue b/resources/default/js/Pages/Admin/Poll/CreatePoll.vue
index ba8713002..935fe1c88 100644
--- a/resources/default/js/Pages/Admin/Poll/CreatePoll.vue
+++ b/resources/default/js/Pages/Admin/Poll/CreatePoll.vue
@@ -97,7 +97,8 @@
v-model:value="form.started_at"
:placeholder="__('Poll Starts At')"
class="w-full"
- value-type="format"
+ value-type="date"
+ format="YYYY-MM-DD hh:mm:ss A"
type="datetime"
input-class="border-gray-300 h-14 p-3 text-sm pt-7 focus:border-light-blue-300 focus:ring focus:ring-light-blue-200 focus:ring-opacity-50 rounded-md block w-full dark:bg-cool-gray-900 dark:text-gray-300 dark:border-gray-900"
/>
@@ -117,7 +118,8 @@
v-model:value="form.closed_at"
:placeholder="__('Poll Ends At')"
class="w-full"
- value-type="format"
+ value-type="date"
+ format="YYYY-MM-DD hh:mm:ss A"
type="datetime"
input-class="border-gray-300 h-14 p-3 text-sm pt-7 focus:border-light-blue-300 focus:ring focus:ring-light-blue-200 focus:ring-opacity-50 rounded-md block w-full dark:bg-cool-gray-900 dark:text-gray-300 dark:border-gray-900"
/>
diff --git a/resources/default/js/Pages/Admin/Recruitment/CreateRecruitment.vue b/resources/default/js/Pages/Admin/Recruitment/CreateRecruitment.vue
index 6d86ac03d..0abf07b93 100644
--- a/resources/default/js/Pages/Admin/Recruitment/CreateRecruitment.vue
+++ b/resources/default/js/Pages/Admin/Recruitment/CreateRecruitment.vue
@@ -1,11 +1,11 @@
-
+
- {{ __("Create Recruitment Form") }}
+ {{ __("Create Application Form") }}
@@ -483,7 +483,7 @@
class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-light-blue-500 hover:bg-light-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-light-blue-500 disabled:opacity-50"
type="submit"
>
- {{ __("Create Recruitment") }}
+ {{ __("Create Application Form") }}
@@ -542,10 +542,10 @@ defineProps({
});
const formStatusList = {
- draft: 'Draft - Recruitment is under development and not visible to users',
- active: 'Active - Recruitment is actively accepting submissions',
- disabled: 'Disabled - Recruitment is disabled for new submissions',
- archived: 'Archived - Recruitment is archived and not visible to users',
+ draft: 'Draft - Application is under development and not visible to users',
+ active: 'Active - Application is actively accepting submissions',
+ disabled: 'Disabled - Application is disabled for new submissions',
+ archived: 'Archived - Application is archived and not visible to users',
};
const formFieldType = {
diff --git a/resources/default/js/Pages/Admin/Recruitment/EditRecruitment.vue b/resources/default/js/Pages/Admin/Recruitment/EditRecruitment.vue
index c1af9c491..9e56d5d15 100644
--- a/resources/default/js/Pages/Admin/Recruitment/EditRecruitment.vue
+++ b/resources/default/js/Pages/Admin/Recruitment/EditRecruitment.vue
@@ -1,11 +1,11 @@
-
+
- {{ __("Edit Recruitment Form") }}
+ {{ __("Edit Application Form") }}
@@ -483,7 +483,7 @@
class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-light-blue-500 hover:bg-light-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-light-blue-500 disabled:opacity-50"
type="submit"
>
- {{ __("Update Recruitment") }}
+ {{ __("Update Application Form") }}
@@ -546,10 +546,10 @@ const props = defineProps({
});
const formStatusList = {
- draft: 'Draft - Recruitment is under development and not visible to users',
- active: 'Active - Recruitment is actively accepting submissions',
- disabled: 'Disabled - Recruitment is disabled for new submissions',
- archived: 'Archived - Recruitment is archived and not visible to users',
+ draft: 'Draft - Application is under development and not visible to users',
+ active: 'Active - Application is actively accepting submissions',
+ disabled: 'Disabled - Application is disabled for new submissions',
+ archived: 'Archived - Application is archived and not visible to users',
};
const formFieldType = {
diff --git a/resources/default/js/Pages/Admin/Recruitment/IndexRecruitment.vue b/resources/default/js/Pages/Admin/Recruitment/IndexRecruitment.vue
index 6f8261521..be96e7fa5 100644
--- a/resources/default/js/Pages/Admin/Recruitment/IndexRecruitment.vue
+++ b/resources/default/js/Pages/Admin/Recruitment/IndexRecruitment.vue
@@ -33,11 +33,18 @@ const headerRow = [
key: 'title',
sortable: true,
label: __('Title'),
+ filterable: {
+ type: 'text',
+ },
},
{
key: 'status',
label: __('Status'),
sortable: true,
+ filterable: {
+ type: 'multiselect',
+ options: ['draft', 'active', 'disabled', 'archived'],
+ }
},
{
key: 'is_notify_staff_on_submission',
@@ -79,12 +86,12 @@ const headerRow = [
-
+
- {{ __("Manage Recruitment Forms") }}
+ {{ __("Manage Application Forms") }}
{{ __("Create") }}
- {{ __("Recruitment") }}
+ {{ __("Application Form") }}
@@ -206,7 +213,7 @@ const headerRow = [
as="a"
:href="route('admin.recruitment.edit', item.id)"
class="inline-flex items-center justify-center text-yellow-600 dark:text-yellow-500 hover:text-yellow-800 dark:hover:text-yellow-800"
- :title="__('Edit Recruitment Form')"
+ :title="__('Edit Application Form')"
>
@@ -214,14 +221,14 @@ const headerRow = [
v-if="can('delete recruitments')"
v-confirm="{
message:
- 'Deleting this Recruitment will also delete all its applications. Are you sure you want to delete this recruitment form & its applications permanently?',
+ 'Deleting this Application Form will also delete all its requests. Are you sure you want to delete this application form & its requests permanently?',
}"
v-tippy
as="button"
method="DELETE"
:href="route('admin.recruitment.delete', item.id)"
class="inline-flex items-center justify-center text-red-600 hover:text-red-900 focus:outline-none"
- :title="__('Delete Recruitment')"
+ :title="__('Delete Application Form')"
>
diff --git a/resources/default/js/Pages/Admin/Recruitment/ShowRecruitment.vue b/resources/default/js/Pages/Admin/Recruitment/ShowRecruitment.vue
index 0fe58f68d..775c97bb7 100644
--- a/resources/default/js/Pages/Admin/Recruitment/ShowRecruitment.vue
+++ b/resources/default/js/Pages/Admin/Recruitment/ShowRecruitment.vue
@@ -42,7 +42,7 @@ const submissionCountByStatusData = {
@@ -94,7 +94,7 @@ const submissionCountByStatusData = {
- {{ __("This recruitment hiring for") }}
+ {{ __("This application hiring for") }}
{{ recruitment.related_role ? recruitment.related_role.display_name : __("not applicable") }}
diff --git a/resources/default/js/Pages/Admin/RecruitmentSubmission/IndexRecruitmentSubmission.vue b/resources/default/js/Pages/Admin/RecruitmentSubmission/IndexRecruitmentSubmission.vue
index e2f0bdf08..373bc3a26 100644
--- a/resources/default/js/Pages/Admin/RecruitmentSubmission/IndexRecruitmentSubmission.vue
+++ b/resources/default/js/Pages/Admin/RecruitmentSubmission/IndexRecruitmentSubmission.vue
@@ -11,7 +11,8 @@ import XSelect from '@/Components/Form/XSelect.vue';
import { computed, ref, watch } from 'vue';
import { router } from '@inertiajs/vue3';
import { pickBy } from 'lodash';
-import RecruitmentStatusBadge from '@/Shared/RecruitmentStatusBadge.vue';
+import CommonStatusBadge from '@/Shared/CommonStatusBadge.vue';
+import UserDisplayname from '@/Components/UserDisplayname.vue';
const { can } = useAuthorizable();
const { __ } = useTranslations();
@@ -45,16 +46,44 @@ const headerRow = [
sortable: true,
label: __('Applicant'),
class: 'w-3/12',
+ filterable: {
+ key: 'user.name',
+ type: 'text',
+ }
},
{
key: 'recruitment_id',
- label: __('Recruitment'),
+ label: __('Application'),
sortable: true,
},
{
key: 'status',
label: __('Status'),
sortable: true,
+ filterable: {
+ type: 'multiselect',
+ options: ['pending', 'inprogress', 'approved', 'rejected', 'withdrawn', 'onhold'],
+ }
+ },
+ {
+ key: 'last_act_at',
+ sortable: true,
+ label: __('Last Actor'),
+ class: 'text-right',
+ filterable: {
+ key: 'lastActor.name',
+ type: 'text',
+ }
+ },
+ {
+ key: 'last_comment_at',
+ sortable: true,
+ label: __('Last Comment'),
+ class: 'text-right',
+ filterable: {
+ key: 'lastCommentor.name',
+ type: 'text',
+ }
},
{
key: 'created_at',
@@ -106,8 +135,8 @@ watch(selectedForms, (newSelectedForms) => {
@@ -118,10 +147,10 @@ watch(selectedForms, (newSelectedForms) => {
>
{{
closed
- ? __("Closed Recruitment Submissions:")
- : __("Open Recruitment Submissions:")
+ ? __("Closed Requests:")
+ : __("Open Requests:")
}}
- {{ showing ?? __("All Recruitments") }}
+ {{ showing ?? __("All Applications") }}
{
v-model="selectedForms"
name="selectForms"
:select-list="forms"
- :placeholder="__('All Recruitments')"
+ :placeholder="__('All Applications')"
class="w-48 max-w-48 dark:border dark:rounded dark:border-gray-700"
/>
@@ -145,13 +174,27 @@ watch(selectedForms, (newSelectedForms) => {
- {{ item.id }}
+
+ {{ item.id }}
+
@@ -184,11 +227,59 @@ watch(selectedForms, (newSelectedForms) => {
- {{ item.recruitment.title }}
+
+ {{ item.recruitment.title }}
+
-
+
+
+
+
+
+
+ {{ formatTimeAgoToNow(item.last_act_at) }}
+
+
+
+ {{ __('None') }}
+
+
+
+
+
+
+ {{ formatTimeAgoToNow(item.last_comment_at) }}
+
+
+
+ {{ __('None') }}
+
{
"
v-confirm="{
message:
- 'Delete this Recruitment Submission? This action cannot be undone.',
+ 'Delete this Request? This action cannot be undone.',
}"
v-tippy
as="button"
diff --git a/resources/default/js/Pages/Admin/RecruitmentSubmission/ShowRecruitmentSubmission.vue b/resources/default/js/Pages/Admin/RecruitmentSubmission/ShowRecruitmentSubmission.vue
index 015e6fc01..407a79a98 100644
--- a/resources/default/js/Pages/Admin/RecruitmentSubmission/ShowRecruitmentSubmission.vue
+++ b/resources/default/js/Pages/Admin/RecruitmentSubmission/ShowRecruitmentSubmission.vue
@@ -7,7 +7,7 @@ import { computed } from 'vue';
import { FormKitSchema } from '@formkit/vue';
import {useFormKit} from '@/Composables/useFormKit';
import RecruitmentMessagesBox from '@/Shared/RecruitmentMessagesBox.vue';
-import RecruitmentStatusBadge from '@/Shared/RecruitmentStatusBadge.vue';
+import CommonStatusBadge from '@/Shared/CommonStatusBadge.vue';
import JetDialogModal from '@/Jetstream/DialogModal.vue';
import JetSecondaryButton from '@/Jetstream/SecondaryButton.vue';
import { useForm } from '@inertiajs/vue3';
@@ -48,7 +48,7 @@ const rejectForm = useForm({
+
- {{ __("Recruitment") }}
+ {{ __("Application") }}
{{ submission.recruitment.title }}
@@ -156,11 +156,10 @@ const rejectForm = useForm({
-
- {{ __("Submission Status") }}
-
+ {{ __("Request Status") }}
+
@@ -221,7 +220,7 @@ const rejectForm = useForm({
confirmButtonColor: 'green',
icon: 'success',
message:
- 'Approve this application? This action cannot be undone.',
+ 'Approve this request? This action cannot be undone.',
}"
as="button"
method="POST"
diff --git a/resources/default/js/Pages/Admin/Server/CreateEditBungeeServer.vue b/resources/default/js/Pages/Admin/Server/CreateEditBungeeServer.vue
index f70e81677..85bf16df4 100644
--- a/resources/default/js/Pages/Admin/Server/CreateEditBungeeServer.vue
+++ b/resources/default/js/Pages/Admin/Server/CreateEditBungeeServer.vue
@@ -9,10 +9,10 @@
:title="__('Edit Bungee Server: :name', {name: server.name})"
/>
-
+
- {{ isCreateOperation ? __('Add Bungee Server') : __('Edit Bungee Server: :name', {name: server.name}) }}
+ {{ isCreateOperation ? __('Add Bungee/Velocity Server') : __('Edit Bungee/Velocity Server: :name', {name: server.name}) }}
-
-
-
-
- {{ __("Overview") }}
-
-
- {{ __("Minetrax only support adding one bungee server. This server will be used to show online players and server status. All sensitive information will be encrypted.") }}
-
- {{ __("Please note Proxy servers don't need Minetrax.jar plugin. Only install them on actual servers like spigot, bukkit etc.") }}
-
-
-
+
@@ -188,48 +473,80 @@
-
diff --git a/resources/default/js/Pages/Admin/User/EditUser.vue b/resources/default/js/Pages/Admin/User/EditUser.vue
index ac7208a17..386f94e6a 100644
--- a/resources/default/js/Pages/Admin/User/EditUser.vue
+++ b/resources/default/js/Pages/Admin/User/EditUser.vue
@@ -153,7 +153,7 @@
- {{ item.email }}
+
+ {{ item.email }}
+
+
+ {{ __('Discord ID') }}:
+ {{ item.discord_user_id }}
+
+
+
+ {{ __("Continue with empty password if you have no password.") }}
+
diff --git a/resources/default/js/Pages/CustomForm/IndexCustomForm.vue b/resources/default/js/Pages/CustomForm/IndexCustomForm.vue
index 2df04886f..b59aa1371 100644
--- a/resources/default/js/Pages/CustomForm/IndexCustomForm.vue
+++ b/resources/default/js/Pages/CustomForm/IndexCustomForm.vue
@@ -21,8 +21,11 @@ defineProps({
const headerRow = [
{
key: 'title',
- sortable: true,
label: __('Title'),
+ sortable: true,
+ filterable: {
+ type: 'text',
+ }
},
{
key: 'flags',
@@ -35,6 +38,10 @@ const headerRow = [
label: __('Status'),
sortable: true,
class: 'w-1/12 hidden text-right md:table-cell',
+ filterable: {
+ type: 'multiselect',
+ options: ['active', 'disabled']
+ }
},
{
key: 'created_at',
diff --git a/resources/default/js/Pages/Download/IndexDownload.vue b/resources/default/js/Pages/Download/IndexDownload.vue
index 60c9fb4af..a87e95a2d 100644
--- a/resources/default/js/Pages/Download/IndexDownload.vue
+++ b/resources/default/js/Pages/Download/IndexDownload.vue
@@ -21,6 +21,9 @@ const headerRow = [
key: 'name',
sortable: true,
label: __('Name'),
+ filterable: {
+ type: 'text',
+ },
},
{
key: 'download_count',
diff --git a/resources/default/js/Pages/Player/ShowPlayer.vue b/resources/default/js/Pages/Player/ShowPlayer.vue
index c8169a7a9..62ed58a59 100644
--- a/resources/default/js/Pages/Player/ShowPlayer.vue
+++ b/resources/default/js/Pages/Player/ShowPlayer.vue
@@ -646,7 +646,7 @@
{{ __("Claimed By") }}
-
+
{{ __("None") }}
+
+
+
+
+
@@ -769,65 +786,61 @@
-
diff --git a/resources/default/js/Pages/PlayerIntel/ShowSession.vue b/resources/default/js/Pages/PlayerIntel/ShowSession.vue
index f33f3dd78..38023790d 100644
--- a/resources/default/js/Pages/PlayerIntel/ShowSession.vue
+++ b/resources/default/js/Pages/PlayerIntel/ShowSession.vue
@@ -393,7 +393,7 @@ activeTime = Math.max(activeTime, 0);
@@ -473,7 +473,7 @@ activeTime = Math.max(activeTime, 0);
{{ __("World Location") }}
-
+
{{ worldLocation }}
diff --git a/resources/default/js/Pages/Profile/UpdateNotificationPreferencesForm.vue b/resources/default/js/Pages/Profile/UpdateNotificationPreferencesForm.vue
index f31e3164a..21b145f2e 100644
--- a/resources/default/js/Pages/Profile/UpdateNotificationPreferencesForm.vue
+++ b/resources/default/js/Pages/Profile/UpdateNotificationPreferencesForm.vue
@@ -121,7 +121,7 @@
{{
- __("Recruitment submission status changed")
+ __("Application request status changed")
}}
@@ -150,7 +150,7 @@
{{
- __("New message in recruitment submission")
+ __("New message in application request")
}}
@@ -186,7 +186,7 @@
- {{ __("Recruitment submission received") }}
+ {{ __("Application request received") }}
-
+
- {{ __("Recruitments") }}
+ {{ __("Application Forms") }}
{
disabledErrorMessage.value = {
title: __('Application Closed!'),
body: __(
- 'This recruitment form is currently closed. Please check back later.'
+ 'This application form is currently closed. Please check back later.'
),
};
formDisabled.value = true;
@@ -83,7 +83,7 @@ watchEffect(() => {
if (!usePage().props?.auth?.user) {
disabledErrorMessage.value = {
title: __('Login or Register to Apply!'),
- body: __('You need to be logged in to apply to this recruitment.'),
+ body: __('You need to be logged in to apply to this application.'),
};
formDisabled.value = true;
}
@@ -99,7 +99,7 @@ watchEffect(() => {
disabledErrorMessage.value = {
title: __('Max Submissions Reached!'),
body: __(
- 'You have reached the maximum number of submissions for this recruitment.'
+ 'You have reached the maximum number of submissions for this application.'
),
};
formDisabled.value = true;
@@ -130,7 +130,7 @@ watchEffect(() => {
disabledErrorMessage.value = {
title: __('Account Verification Required!'),
body: __(
- 'Only verified users can apply to this recruitment. Please verify your account.'
+ 'Only verified users can apply to this application. Please verify your account.'
),
};
formDisabled.value = true;
@@ -143,7 +143,7 @@ watchEffect(() => {
disabledErrorMessage.value = {
title: __('Account Linking Required!'),
body: __(
- 'Only users with linked players can apply to this recruitment. Please link a player to your account.'
+ 'Only users with linked players can apply to this application. Please link a player to your account.'
),
};
formDisabled.value = true;
@@ -195,7 +195,7 @@ watchEffect(() => {
{{
__(
- "You have an active application for this recruitment. Applied on :date.",
+ "You have an active request for this application. Applied on :date.",
{
date: formatToDayDateString(
userLastActiveSubmission.created_at
@@ -216,7 +216,7 @@ watchEffect(() => {
})
"
>
- {{ __("View Application") }}
+ {{ __("View Request") }}
@@ -256,7 +256,7 @@ watchEffect(() => {
})
"
>
- {{ __("View Approved Application") }}
+ {{ __("View Approved Request") }}
@@ -291,7 +291,7 @@ watchEffect(() => {
>
{{
__(
- "You can apply to this recruitment :count more time(s).",
+ "You can apply to this application :count more time(s).",
{
count:
recruitment.max_submission_per_user -
diff --git a/resources/default/js/Pages/RecruitmentSubmission/IndexRecruitmentSubmission.vue b/resources/default/js/Pages/RecruitmentSubmission/IndexRecruitmentSubmission.vue
index e13dc92bd..f7fcb94c5 100644
--- a/resources/default/js/Pages/RecruitmentSubmission/IndexRecruitmentSubmission.vue
+++ b/resources/default/js/Pages/RecruitmentSubmission/IndexRecruitmentSubmission.vue
@@ -7,7 +7,7 @@ import {useHelpers} from '@/Composables/useHelpers';
import DataTable from '@/Components/DataTable/DataTable.vue';
import DtRowItem from '@/Components/DataTable/DtRowItem.vue';
import { EyeIcon } from '@heroicons/vue/24/outline';
-import RecruitmentStatusBadge from '@/Shared/RecruitmentStatusBadge.vue';
+import CommonStatusBadge from '@/Shared/CommonStatusBadge.vue';
const { __ } = useTranslations();
const { formatTimeAgoToNow, formatToDayDateString } = useHelpers();
@@ -30,13 +30,17 @@ const headerRow = [
},
{
key: 'recruitment_id',
- label: __('Recruitment'),
+ label: __('Application'),
sortable: true,
},
{
key: 'status',
label: __('Status'),
sortable: true,
+ filterable: {
+ type: 'multiselect',
+ options: ['pending', 'inprogress', 'approved', 'rejected', 'withdrawn', 'onhold'],
+ }
},
{
key: 'created_at',
@@ -62,12 +66,12 @@ const headerRow = [
-
+
- {{ __("My Recruitment Applications") }}
+ {{ __("My Application Requests") }}
-
+
-
+
- {{ __("Recruitment") }}
+ {{ __("Application") }}
{{ submission.recruitment.title }}
@@ -136,8 +136,8 @@ const withdrawForm = useForm({
- {{ __("Submission Status") }}
-
+ {{ __("Request Status") }}
+
diff --git a/resources/default/js/Pages/User/ListLinkedPlayer.vue b/resources/default/js/Pages/User/ListLinkedPlayer.vue
index e46bc8980..121bef3d3 100644
--- a/resources/default/js/Pages/User/ListLinkedPlayer.vue
+++ b/resources/default/js/Pages/User/ListLinkedPlayer.vue
@@ -4,15 +4,24 @@
:title="__('Your Linked Players')"
/>
-
+
@@ -21,31 +30,89 @@
/>
-
+
- {{ __("You can link upto :count :player to your account! ( :left available )", {
- count: maxPlayerPerUser,
- player: maxPlayerPerUser === 1 ? __('player'): __('players'),
- left: maxPlayerPerUser - linkedPlayers.length
- }) }}
-
-
- {{ __("Initiate the process by joining the server and typing /account-link in chat. A link will be generated, click on that link and your player will added to your account.") }}
+
+ {{ __("You can link upto :count :player to your account! ( :left available )", {
+ count: maxPlayerPerUser,
+ player: maxPlayerPerUser === 1 ? __('player'): __('players'),
+ left: linkSlotsLeft
+ }) }}
+
+
+ {{ __("You have already linked maximum number of players to your account!") }}
+
+
+
+ {{ __("To link a player to your account, join server and type '/link :otp' in your chat.", {
+ otp: currentLinkOtp?.otp
+ }) }}
+
+
+
+
+
+
+ {{ '/link ' + currentLinkOtp?.otp }}
+
+
+ {{ __("Copied!") }}
+
+
+
+
+
+ {{ __("This OTP will expire in :seconds seconds.", {
+ seconds: otpExpiryCountdownSeconds
+ }) }}
+
+
+
+ {{ __("This OTP has expired. Refresh the page to get a new OTP.") }}
+
+
+ {{ __("Click here to refresh.") }}
+
+
+
+
-
+
{{ __("No players linked to your account right now.") }}
@@ -53,7 +120,7 @@
@@ -62,7 +129,7 @@
{{ player.username }}
@@ -75,16 +142,16 @@
{{ __("Position") }}:
-
@@ -102,7 +169,7 @@
/>
{{ __("None") }}
@@ -120,7 +187,7 @@
{{ __("None") }}
@@ -177,13 +244,14 @@
:href="route('change-player-skin.show', {
player_uuid: player.uuid,
})"
- class="mt-5 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-sky-400 hover:bg-sky-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-sky-400 disabled:opacity-50"
+ class="inline-flex justify-center px-4 py-2 mt-5 text-sm font-medium text-white border border-transparent rounded-md shadow-sm bg-sky-400 hover:bg-sky-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-sky-400 disabled:opacity-50"
:title="__('Change Skin of this player.')"
>
-
+
-
+
@@ -210,6 +278,7 @@ import Icon from '@/Components/Icon.vue';
import * as skinview3d from 'skinview3d';
import { useHelpers } from '@/Composables/useHelpers';
import { LockOpenIcon, PaintBrushIcon } from '@heroicons/vue/24/solid';
+import CopyToClipboard from '@/Components/CopyToClipboard.vue';
export default {
@@ -218,15 +287,37 @@ export default {
AppLayout,
LockOpenIcon,
PaintBrushIcon,
+ CopyToClipboard,
},
props: {
linkedPlayers: Array,
- maxPlayerPerUser: Number
+ maxPlayerPerUser: Number,
+ currentLinkOtp: Object,
+ isUnlinkingDisabled: Boolean,
},
setup() {
const {formatTimeAgoToNow,formatToDayDateString} = useHelpers();
return {formatTimeAgoToNow, formatToDayDateString};
},
+ data() {
+ return {
+ skinViewers: [],
+ otpExpiryCountdownInterval: null,
+ otpExpiryCountdownSeconds: this.currentLinkOtp?.expires_at ? Math.floor((new Date(this.currentLinkOtp.expires_at).getTime() - new Date().getTime()) / 1000) : null,
+ };
+ },
+ computed: {
+ linkSlotsLeft () {
+ return this.maxPlayerPerUser - this.linkedPlayers.length;
+ }
+ },
+ unmounted() {
+ for (const skinViewer of this.skinViewers) {
+ skinViewer.dispose();
+ }
+
+ clearInterval(this.otpExpiryCountdownInterval);
+ },
mounted() {
for (const player of this.linkedPlayers) {
let skinViewer = new skinview3d.SkinViewer({
@@ -235,15 +326,26 @@ export default {
height: 300,
skin: route('player.skin.get', {uuid: player.uuid, username: player.username, textureid: player.skin_texture_id}),
});
- let control = skinview3d.createOrbitControls(skinViewer);
- control.enableRotate = true;
- control.enableZoom = false;
- control.enablePan = false;
- let walk = skinViewer.animations.add(skinview3d.WalkingAnimation);
- walk.speed = 0.1;
- let rotate = skinViewer.animations.add(skinview3d.RotatingAnimation);
- rotate.speed = 0.5;
+ skinViewer.autoRotate = true;
+ skinViewer.animation = new skinview3d.WalkingAnimation();
+ skinViewer.animation.speed = 0.1;
+ skinViewer.autoRotateSpeed = 0.5;
+ this.skinViewers.push(skinViewer);
}
+
+ this.startOtpExpiryCountdown();
},
+ methods: {
+ startOtpExpiryCountdown() {
+ if (this.otpExpiryCountdownSeconds > 0) {
+ this.otpExpiryCountdownInterval = setInterval(() => {
+ this.otpExpiryCountdownSeconds--;
+ if (this.otpExpiryCountdownSeconds <= 0) {
+ clearInterval(this.otpExpiryCountdownInterval);
+ }
+ }, 1000);
+ }
+ },
+ }
};
diff --git a/resources/default/js/Shared/AdminSideMenu.vue b/resources/default/js/Shared/AdminSideMenu.vue
index a6edba62f..0c06fa315 100644
--- a/resources/default/js/Shared/AdminSideMenu.vue
+++ b/resources/default/js/Shared/AdminSideMenu.vue
@@ -15,6 +15,7 @@ import {
ClipboardDocumentListIcon,
BugAntIcon,
AcademicCapIcon,
+ CommandLineIcon,
} from '@heroicons/vue/24/outline';
import SideNavItem from '@/Components/Navigation/SideNavItem.vue';
import { useAuthorizable } from '@/Composables/useAuthorizable';
@@ -194,11 +195,11 @@ const navItems = [
visible: canWild('ask_db')
},
{
- label: 'Recruitments',
+ label: 'Applicatons',
active: false,
children: [
{
- label: 'List Recruitment Forms',
+ label: 'List Application Forms',
href: route('admin.recruitment.index'),
active: route().current('admin.recruitment.index'),
children: [],
@@ -257,6 +258,30 @@ const navItems = [
icon: ClipboardDocumentListIcon,
visible: canWild('custom_forms')
},
+ {
+ label: 'Commands',
+ active: false,
+ children: [
+ {
+ label: 'Run Command',
+ href: route('admin.command-queue.create'),
+ active: route().current('admin.command-queue.create'),
+ children: [],
+ icon: null,
+ visible: can('create command_queues')
+ },
+ {
+ label: 'Command History',
+ href: route('admin.command-queue.index'),
+ active: route().current('admin.command-queue.index'),
+ children: [],
+ icon: null,
+ visible: can('read command_queues')
+ },
+ ],
+ icon: CommandLineIcon,
+ visible: canWild('command_queues')
+ },
{
label: 'Settings', href: '#', active: false, children: [
{
@@ -321,6 +346,14 @@ const navItems = [
},
{
label: 'Debug', href: '#', active: false, children: [
+ {
+ label: 'Failed Jobs',
+ href: route('admin.failed-job.index'),
+ active: route().current('admin.failed-job.index'),
+ children: [],
+ icon: null,
+ visible: can('read failed_jobs')
+ },
{
label: 'Pulse',
href: '/admin/pulse',
diff --git a/resources/default/js/Shared/RecruitmentStatusBadge.vue b/resources/default/js/Shared/CommonStatusBadge.vue
similarity index 94%
rename from resources/default/js/Shared/RecruitmentStatusBadge.vue
rename to resources/default/js/Shared/CommonStatusBadge.vue
index 51cc45904..aee0bdbfe 100644
--- a/resources/default/js/Shared/RecruitmentStatusBadge.vue
+++ b/resources/default/js/Shared/CommonStatusBadge.vue
@@ -15,12 +15,16 @@ const colorClass = computed(() => {
case 'pending':
return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 border border-yellow-300 dark:border-yellow-700';
case 'inprogress':
+ case 'running':
return 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900 dark:text-cyan-200 border border-cyan-300 dark:border-cyan-700';
case 'approved':
+ case 'completed':
return 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200 border border-green-300 dark:border-green-700';
case 'rejected':
+ case 'failed':
return 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200 border border-red-300 dark:border-red-700';
case 'onhold':
+ case 'deferred':
return 'bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-200 border border-amber-300 dark:border-amber-700';
default:
return 'bg-gray-100 text-gray-600 dark:bg-gray-900 dark:text-gray-300 border border-gray-300 dark:border-gray-700';
diff --git a/resources/default/js/Shared/HeroSection.vue b/resources/default/js/Shared/HeroSection.vue
index 7215fb370..1c47e4a82 100644
--- a/resources/default/js/Shared/HeroSection.vue
+++ b/resources/default/js/Shared/HeroSection.vue
@@ -15,7 +15,6 @@
v-if="settings.home_hero_bg_particles"
id="tsparticles"
class="absolute w-full h-full"
- :particles-init="particlesInit"
:options="particleOptions"
/>
@@ -131,18 +130,12 @@ import axios from 'axios';
import { usePage } from '@inertiajs/vue3';
import { useClipboard } from '@vueuse/core';
const { copy, copied, isSupported } = useClipboard({ legacy: true });
-import { loadFull } from 'tsparticles';
const props = defineProps({
settings: Object, // This is Theme Settings
server: Object,
});
-const particlesInit = async engine => {
- //await loadFull(engine);
- await loadFull(engine);
-};
-
const serverInfo = ref({});
const loading = ref(true);
const error = ref(null);
diff --git a/resources/default/js/Shared/IngameChatBox.vue b/resources/default/js/Shared/IngameChatBox.vue
index a598442ea..918e3e6bd 100644
--- a/resources/default/js/Shared/IngameChatBox.vue
+++ b/resources/default/js/Shared/IngameChatBox.vue
@@ -365,6 +365,7 @@ export default {
}
this.serverId = newId;
this.getChatListForServer(newId);
+ this.shouldDisplayPlayerList = true;
clearInterval(this.playerListQueryInterval);
this.getPlayerListForServer(newId);
@@ -460,7 +461,7 @@ export default {
getPlayerListForServer(sId) {
axios.get(route('server.webquery.get', sId)).then(data => {
- this.playersList = data.data;
+ this.playersList = data.data.players;
this.isWebQuerySuccess = true;
}).catch(() => {
this.shouldDisplayPlayerList = false;
diff --git a/resources/default/js/Shared/NetworkTrendsMetricBox.vue b/resources/default/js/Shared/NetworkTrendsMetricBox.vue
index cdb7cbb4a..4e824ce99 100644
--- a/resources/default/js/Shared/NetworkTrendsMetricBox.vue
+++ b/resources/default/js/Shared/NetworkTrendsMetricBox.vue
@@ -171,7 +171,7 @@ const { data, isFinished, isLoading, error } = useAxios(route('admin.graph.netwo
{{ data.avg_afktime.change }}%
@@ -193,7 +193,7 @@ const { data, isFinished, isLoading, error } = useAxios(route('admin.graph.netwo
{{ data.avg_player_ping.change }}%
diff --git a/resources/default/js/Shared/OnlinePlayersBox.vue b/resources/default/js/Shared/OnlinePlayersBox.vue
index 731a9eb5a..c683460bd 100644
--- a/resources/default/js/Shared/OnlinePlayersBox.vue
+++ b/resources/default/js/Shared/OnlinePlayersBox.vue
@@ -8,10 +8,11 @@
class="float-right text-green-500 font-semibold"
>
- {{ serverInfo['Players'] }} / {{ serverInfo['MaxPlayers'] }}
+ {{ serverInfo["Players"] }} /
+ {{ serverInfo["MaxPlayers"] }}
- {{ serverInfo['Players'] }} {{ __("online") }}
+ {{ serverInfo["Players"] }} {{ __("online") }}
@@ -60,7 +61,13 @@
{{ __("No players online.") }}
@@ -78,7 +88,6 @@
-