Files
2026-03-12 16:28:48 +01:00

7 lines
512 KiB
JavaScript

import t from"../../../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js";import e from"../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js";import n from"../../../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js";import i from"../../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js";import a from"../../../../js/components/vueDatepicker.js.php";var s={name:"BootstrapModal",data:()=>({modal:null,fullscreen:!1}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},focus:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},noCloseBtn:Boolean,dialogClass:[String,Array,Object],headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"px-4 py-5"},footerClass:{type:[String,Array,Object],default:""},allowFullscreenExpand:{type:Boolean,default:!1}},emits:["hideBsModal","hiddenBsModal","hidePreventedBsModal","showBsModal","shownBsModal","toggleFullscreen"],methods:{dispose(){return this.modal.dispose()},handleUpdate(){return this.modal.handleUpdate()},hide(){return this.modal.hide()},show(t){return this.modal.show(t)},toggle(){return this.modal.toggle()},toggleFullscreen(){this.fullscreen=!this.fullscreen,this.$emit("toggleFullscreen")}},mounted(){this.$refs.modal&&(this.modal=new bootstrap.Modal(this.$refs.modal,{backdrop:this.backdrop,focus:this.focus,keyboard:this.keyboard}))},popup(t,e,n,i){const a=this,s={};void 0!==t&&(s.default=()=>t),void 0!==n&&(s.title=()=>n),void 0!==i&&(s.footer=()=>i);let r=!1;return"undefined"!=typeof primevue&&(r=!0),new Promise((t,n)=>{const i=Vue.createApp({name:"ModalTmpApp",setup:()=>()=>Vue.h(a,{class:"fade",...e,ref:"modal","onHidden.bs.modal":i.unmount},s),mounted(){this.$refs.modal.show()},beforeUnmount(){this.$refs.modal&&(!1!==this.$refs.modal.result?t(this.$refs.modal.result):n())},unmounted(){o.parentElement.removeChild(o)}}),o=document.createElement("div");r&&i.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return lt}).then(t=>{i.use(t.default),i.mount(o),document.body.appendChild(o)})})},template:'<div ref="modal" class="bootstrap-modal modal" tabindex="-1" @[`hide.bs.modal`]="$emit(\'hideBsModal\')" @[`hidden.bs.modal`]="$emit(\'hiddenBsModal\')" @[`hidePrevented.bs.modal`]="$emit(\'hidePreventedBsModal\')" @[`show.bs.modal`]="$emit(\'showBsModal\')" @[`shown.bs.modal`]="$emit(\'shownBsModal\')">\n\t\t<div class="modal-dialog" :class="fullscreen ? \'modal-fullscreen\' : dialogClass">\n\t\t\t<div class="modal-content">\n\t\t\t\t<div v-if="$slots.title" class="modal-header" :class="headerClass">\n\t\t\t\t\t<h5 class="modal-title"><slot name="title"/></h5>\n\t\t\t\t\t<div class="d-flex align-items-center ms-auto gap-2">\n\t\t\t\t\t\t<button \n\t\t\t\t\t\t\ttype="button" \n\t\t\t\t\t\t\tclass="btn mb-1" \n\t\t\t\t\t\t\tv-if="allowFullscreenExpand" \n\t\t\t\t\t\t\t@click="toggleFullscreen"\n\t\t\t\t\t\t\t:aria-label="fullscreen ? \'Exit Fullscreen\' : \'Enter Fullscreen\'"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<i v-if="!fullscreen" class="fa-solid fa-expand"></i>\n\t\t\t\t\t\t\t<i v-else class="fa-solid fa-compress"></i>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button v-if="!noCloseBtn" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<slot name="modal-header-content"></slot>\n\t\t\t\t</div>\n\t\t\t\t<div class="modal-body" :class="bodyClass">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</div>\n\t\t\t\t<div v-if="$slots.footer" class="modal-footer" :class="footerClass">\n\t\t\t\t\t<slot name="footer"/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>'},r={name:"BootstrapAlert",components:{BsModal:s},mixins:[s],props:{dialogClass:{type:[String,Array,Object],default:"modal-dialog-centered"},onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data:()=>({result:!0}),mounted(){this.modal=this.$refs.modalContainer.modal},popup(t,e){return s.popup.bind(this)(t,e)},template:'<bs-modal ref="modalContainer" class="bootstrap-alert" v-bind="$props">\n\t\t<template v-slot:default>\n\t\t\t<slot></slot>\n\t\t</template>\n\t\t<template v-slot:footer>\n\t\t\t<button type="button" class="btn btn-primary" data-bs-dismiss="modal">OK</button>\n\t\t</template>\n\t</bs-modal>'},o={name:"BootstrapConfirm",mixins:[r],data:()=>({result:!1}),popup(t,e){return r.popup.bind(this)(t,e)},template:'<bs-modal ref="modalContainer" class="bootstrap-confirm" v-bind="$props">\n\t\t<template v-slot:default>\n\t\t\t<slot></slot>\n\t\t</template>\n\t\t<template v-slot:footer>\n\t\t\t<button type="button" class="btn btn-primary" @click="result=true;this.hide()">OK</button>\n\t\t\t<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>\n\t\t</template>\n\t</bs-modal>'},l={name:"GridItem",components:{},inject:{},props:{item:Object,active:Boolean},emits:["mouseDown","mouseUp","startMove","startResize","dragging","endDrag","dropDrag","item","touchStart","touchEnd"],data:()=>({dragAction:"",dragging:!1}),computed:{},methods:{registerDragAction(t){if(this.$emit("mouseDown",t),t.target.hasAttribute("drag-action"))this.dragAction=t.target.getAttribute("drag-action");else{let e=t.target.closest("[drag-action]");this.dragAction=e?e.getAttribute("drag-action"):""}},tryDragStart(t,e){let n=this.dragAction||t.target.getAttribute("drag-action");if(n){if(this.dragging=!0,"move"==n)return this.$emit("startMove",t,e);if("resize"==n)return this.$emit("startResize",t,e)}},touchDragEnd(t){this.dragging&&(this.dragging=!1,this.$emit("touchEnd",t))},touchStart(t){this.$emit("touchStart",t),this.registerDragAction(t),this.tryDragStart(t,this.item)},touchMove(t){this.dragging&&(t.preventDefault(),this.$emit("dragging",t))}},template:'\n\t<div class="drop-grid-item"\n\t\t@mousedown="registerDragAction"\n\t\t@mouseup="$emit(\'mouseUp\', $event)"\n\t\t@touchstart="touchStart"\n\t\t@touchend="touchDragEnd"\n\t\t@dragstart="tryDragStart($event, item)"\n\t\t@drag="$emit(\'dragging\',$event)"\n\t\t@touchmove="touchMove"\n\t\t@dragend="$emit(\'endDrag\', $event); dragging = false"\n\t\t:draggable="active && !item.placeholder">\n\t\t<slot v-bind="item"></slot>\n\t</div>'};class d{constructor(t){t.w?(this.w=t.w,this.h=t.h,this.data=[...t.data],this.grid=[...t.grid]):(this.w=t,this.h=1,this.data=[],this.grid=[])}isFreeSlot(t,e){const n=e*this.w+t;return!this.grid[n]&&0!==this.grid[n]}getMaxY(){return this.data.reduce((t,e)=>(e?.y>t&&(t=e.y),t),0)}getFreeSlots(){const t=[];let e=this.getMaxY(),n=this.w*(e+1);for(let t=0;t<n;t++)this.grid[t]||0===this.grid[t]||(this.grid[t]=void 0);for(let e=0;e<this.grid.length;e++)if(!this.grid[e]&&0!==this.grid[e]){let n=e%this.w,i=Math.floor(e/this.w);t.push({x:n,y:i})}return t}add(t,e){let n=this.getItemsInFrame(t.frame);if(!n.length)return t.frame.forEach(e=>this.grid[e]=t.index),this.data[t.index]=t,this.h=Math.max(this.h,t.y+t.h),[];{const i=new d(this);t.frame.forEach(t=>i.grid[t]=-1);const a=i.tryMoving(n,e);if(a.length){const e=a.sort((t,e)=>(void 0===t.cost&&(t.cost=t.moves.reduce((t,e)=>t*e.cost,1)),void 0===e.cost&&(e.cost=e.moves.reduce((t,e)=>t*e.cost,1)),t.cost>e.cost)),n=[];return e[0].moves.forEach(t=>{const e={...this.data[t.index]};e.x+=t.x,e.y+=t.y,e.frame=this.getItemFrame(e),this.h=Math.max(this.h,e.y+e.h),this.remove(e),e.frame.forEach(t=>this.grid[t]=e.index),this.data[t.index]=e,n[t.index]={index:e.index,x:e.x,y:e.y}}),t.frame.forEach(e=>this.grid[e]=t.index),this.data[t.index]=t,n}console.error("FATAL","can't arrange item on grid")}}move(t,e,n){if(t.data.place[this.w]?.pinned)return[];if(t.x==e&&t.y==n)return[];let i;this.remove(t),t.x==e?i=n-t.y>0?0:3:t.y==n&&(i=e-t.x>0?1:2);const a=Array.isArray(t.frame)?[...t.frame]:[t.frame],s={...t};s.x=e,s.y=n,s.frame=this.getItemFrame(s);let r=this.getItemsInFrame(s.frame);if(r.some(t=>this.data[t]?.data.place[this.w]?.pinned))return[];let o=r.map(t=>this.data[t]),l=o.map(t=>t.frame).flat();if(!l.some(t=>!s.frame.includes(t))&&!l.some(t=>a.includes(t))){let i=[],s=[];for(let t of a){if(s.includes(t))continue;let e=o.shift();e&&(s=[...s,...this.getItemFrame({...e,...this.getSingleFramePosition(t)})],i[e.index]={index:e.index,...this.getSingleFramePosition(t)})}return i[t.index]={index:t.index,x:e,y:n},i}const d=this.add(s,i);return d[t.index]={index:t.index,x:e,y:n},d}resize(t,e,n){if(t.w==e&&t.h==n)return[];this.remove(t);const i={...t};i.w=e,i.h=n,i.frame=this.getItemFrame(i);const a=this.add(i);return a&&(a[t.index]={index:t.index,w:e,h:n,x:t.x,y:t.y,resize:!0}),a}tryMoving(t,e){if(Array.isArray(t)){t.forEach(t=>this.remove({index:t}));let n=[{grid:this,moves:[]}];return t.forEach(t=>{let i=[];n.forEach(n=>{n.grid.tryMoving(t,e).forEach(t=>{n.moves,t.moves=[...t.moves,...n.moves],i.push(t)})}),n=i}),n}const n=[0,3,1,2];this.remove({index:t});const i=1+.2*(this.data[t].weight||0);return n.reduce((n,a)=>{let s=this.tryMovingInDirection(a,t,1,(e===a?.5:1+.1*a)*i);return s?[...n,...s]:n},[]).filter(t=>t)}tryMovingInDirection(t,e,n,i){const a={index:e,x:0,y:0,cost:i};let s;switch(t){case 0:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].y-n<0)return!1;s=this.data[e].frame.map(t=>t-this.w*n),a.y=-n;break;case 3:if(this.data[e].data?.place[this.w]?.pinned)return!1;this.data[e].y+this.data[e].h+n>this.h&&(i+=.4),s=this.data[e].frame.map(t=>t+this.w*n),a.y=n;break;case 1:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].x-n<0)return!1;s=this.data[e].frame.map(t=>t-n),a.x=-n;break;case 2:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].x+this.data[e].w+n>this.w)return!1;s=this.data[e].frame.map(t=>t+n),a.x=n}const r=this.getItemsInFrame(s);if(r.includes(-1))return this.tryMovingInDirection(t,e,n+1,i);const o=new d(this);if(s.forEach(t=>o.grid[t]=-1),!r.length)return[{grid:o,moves:[a]}];const l=o.tryMoving(r).map(t=>t.moves.unshift(a)&&t);return!!l.length&&l}clearWeights(){this.data.forEach(t=>t.weight=void 0)}getItemsInFrame(t){return t.map(t=>this.grid[t]).filter((t,e,n)=>(t||0===t)&&n.indexOf(t)===e)}remove(t){this.grid=this.grid.map(e=>e!=t.index?e:void 0)}getItemFrame(t){const e=[];for(let n=0;n<t.w;n++)for(let i=0;i<t.h;i++)e.push(n+t.x+(i+t.y)*this.w);return e}getSingleFramePosition(t){return{x:t%this.w,y:Math.floor(t/this.w)}}debug(){return this.grid}}var c={name:"Grid",components:{GridItem:l},props:{cols:Number,items:Array,itemsSetup:Object,resizeLimit:Function,active:{type:Boolean,default:!0},marginForExtraRow:{type:Number,default:0},additionalRow:{type:Boolean,default:!1}},emits:["rearrangeItems","newItem","gridHeight","draggedItem","update:additionalRow"],data:()=>({x:-1,y:-1,clientX:0,clientY:0,mode:0,grid:null,dragGrid:null,permUpdates:[],positionUpdates:null,fixedPositionUpdates:null,draggedOffset:[0,0],draggedItem:null,draggedNode:null,reorderedItems:[],clonedWidget:null}),inject:{sectionName:{type:String,default:""}},computed:{additionalRowComputed:{get(){return this.additionalRow},set(t){this.$emit("update:additionalRow",t)}},items_hashmap(){let t={};return this.items.forEach(e=>{if(this.reorderedItems.length>0&&this.needsReordering(e)){let t=this.reorderedItems.filter(t=>t.data.widgetid==e.widgetid)?.pop();t&&(e.x=t.x,e.y=t.y)}t[`x${e.x}y${e.y}`]=e}),t},items_placeholders(){let t=[],e=this.cols,n=this.rows,i={};for(let a=0;a<n;a++)for(let n=0;n<e;n++){if(Object.keys(i).length&&i[`x${n}y${a}`])continue;let e=this.items_hashmap[`x${n}y${a}`];if(e){let t=n+e.w-1,s=a+e.h-1;if(n!=t||a!=s)for(let e=a;e<=s;e++)for(let s=n;s<=t;s++)s==n&&e==a||(i[`x${s}y${e}`]=!0)}else t.push({x:n,y:a,w:1,h:1,placeholder:!0,data:{id:"placeholder_"+String(t.length).padStart(4,"0")}})}return t},placedItems_withPlaceholders(){return[...this.placedItems,...this.items_placeholders]},rows(){return this.additionalRowComputed?this.grid?this.grid.h+1:1:this.grid?this.grid.h:1},gridStyle(){const t=this.active?this.marginForExtraRow:0;return{"--fhc-dg-row-height":100/(this.rows+t)+"%","--fhc-dg-col-width":100/this.cols+"%","--fhc-dg-item-padding-horizontal":"0.25%","--fhc-dg-item-padding-top":"0.5%","padding-bottom":100*(this.rows+t)/this.cols+"%"}},indexedItems(){return this.items.map((t,e)=>({index:e,x:t.x,y:t.y,w:t.w,h:t.h,weight:t.weight||0,data:t}))},prePlacedItems(){return this.fixedPositionUpdates?this.indexedItems.map(t=>this.fixedPositionUpdates[t.index]?{index:t.index,weight:t.weight,data:t.data,x:void 0===this.fixedPositionUpdates[t.index].x?t.x:this.fixedPositionUpdates[t.index].x,y:void 0===this.fixedPositionUpdates[t.index].y?t.y:this.fixedPositionUpdates[t.index].y,w:void 0===this.fixedPositionUpdates[t.index].w?t.w:this.fixedPositionUpdates[t.index].w,h:void 0===this.fixedPositionUpdates[t.index].h?t.h:this.fixedPositionUpdates[t.index].h}:t):this.indexedItems},placedItems(){if(!this.positionUpdates)return this.prePlacedItems;let t=this.prePlacedItems.map(t=>{if(!this.positionUpdates[t.index])return t;let e=this.positionUpdates[t.index]?.h-t.h,n=this.positionUpdates[t.index]?.w-t.w;return{resize:this.positionUpdates[t.index]?.resize,index:t.index,weight:t.weight,data:t.data,x:void 0===this.positionUpdates[t.index].x?t.x:this.positionUpdates[t.index].x,y:void 0===this.positionUpdates[t.index].y?t.y:this.positionUpdates[t.index].y,w:n>0||void 0===this.positionUpdates[t.index].w?t.w:this.positionUpdates[t.index].w,h:e>0||void 0===this.positionUpdates[t.index].h?t.h:this.positionUpdates[t.index].h}}),e=[];return t.forEach(t=>{if(t.resize){let n={...t,w:void 0===this.positionUpdates[t.index].w?t.w:this.positionUpdates[t.index].w,h:void 0===this.positionUpdates[t.index].h?t.h:this.positionUpdates[t.index].h,resizeOverlay:!0,blank:!0};e.push(n)}}),[...t,...e]},showEmptyTileHover(){return!(!this.active||!this.grid||0!=this.mode||this.x<0||this.y<0||this.x>=this.cols||this.y>=this.rows)&&this.grid.isFreeSlot(this.x,this.y)},widgetSetup(){if(this.widgetsSetup)return this.widgetsSetup.reduce((t,e)=>(t[e.widget_id]=e,t),{})}},watch:{active(t){t||this.dragCancel()},cols(){this.dragCancel()},rows:{handler(t){this.$emit("gridHeight",t)},immediate:!0},indexedItems:{handler(t){this.dragCancel();const e=this.createNewGrid(t);this.fixedPositionUpdates=e,e.length&&this.$emit("rearrangeItems",e.filter(t=>t))},immediate:!0,deep:!0}},methods:{needsReordering(t){return!t?.data?.place[this.cols]},toggleDraggedItemOverlay(t){this.draggedNode&&(t?this.draggedNode.firstElementChild.classList.add("dashboard-item-overlay"):this.draggedNode.firstElementChild.classList.remove("dashboard-item-overlay"))},dragging(t){if(1==this.mode){this.toggleDraggedItemOverlay(!0);const t=this.$refs.container.getBoundingClientRect(),e=this.clonedWidget.getBoundingClientRect();let n=this.clientY-20,i=this.clientX-15;const a=0,s=t.height-e.height,r=0,o=t.width-e.width,l=Math.max(a,Math.min(s,n)),d=Math.max(r,Math.min(o,i));this.clonedWidget.style.top=`${l}px`,this.clonedWidget.style.left=`${d}px`}},createNewGrid(t){this.grid=new d(this.cols);const e=[];let n=[...t].sort((t,e)=>this.needsReordering(t)&&this.needsReordering(e)?0:this.needsReordering(t)?999:this.needsReordering(e)?-999:t.weight>e.weight),i=[];return n.forEach(n=>{let a=this.grid.getFreeSlots();if(this.needsReordering(n)){let t=a.shift();t?(n.x=t.x,n.y=t.y):(n.x=0,n.y=this.grid.h),i.push(n)}if(n.x+n.w>this.cols){let t,i=this.cols-n.x;this.resizeLimit&&([i]=this.resizeLimit(n.data,i,n.h)),i<1&&(i=1),i>this.cols&&(i=this.cols),n.x+i>this.cols&&(t=this.cols-i),i==n.w&&(i=void 0),e[n.index]={item:n.data,x:t,w:i}}n.frame=this.grid.getItemFrame(n),this.convertGridResultToUpdate(this.grid.add(n),e,t)}),this.reorderedItems=i,this.grid.clearWeights(),e},convertGridResultToUpdate(t,e,n){t&&(n||(n=this.indexedItems),t.forEach(t=>{let i={item:n[t.index].data};void 0!==t.x&&(i.x=t.x),void 0!==t.y&&(i.y=t.y),void 0!==t.w&&(i.w=t.w),void 0!==t.h&&(i.h=t.h),e[t.index]=i}))},mouseLeave(){},updateCursor(t){if(!this.active)return this.x=this.y=-1,!1;const e=this.active?this.marginForExtraRow:0,n=this.$refs.container.getBoundingClientRect();t.clientX||t.clientY||!t.touches||(t.clientX=t.touches[0].clientX,t.clientY=t.touches[0].clientY),this.clientX=t.clientX-n.left,this.clientY=t.clientY-n.top;const i=Math.floor(this.cols*(t.clientX-n.left)/this.$refs.container.clientWidth),a=Math.floor((this.rows+e)*(t.clientY-n.top)/this.$refs.container.clientHeight);return(this.x!=i||this.y!=a)&&(this.x=i,this.y=a,!0)},_dragStart(t,e){t.dataTransfer&&(t.dataTransfer.setDragImage(t.target,-99999,-99999),t.dataTransfer.dropEffect="move",t.dataTransfer.effectAllowed="move")},startMove(t,e){this.active&&(this.mode=1,this.draggedItem=e,this.$emit("draggedItem",e),setTimeout(()=>{this.draggedNode=t.target.closest(".drop-grid-item");let e=t.target.closest(".drop-grid-item")?.cloneNode(!0);e.style.zIndex=5,e.classList.add("widgetClone"),this.$refs.container.appendChild(e);e.querySelector("[style='display: none;']").style.removeProperty("display"),this.clonedWidget=e},0),this.draggedOffset=[e.x-this.x,e.y-this.y],this._dragStart(t,e))},startResize(t,e){this.active&&(this.mode=2,this.draggedItem=e,this.$emit("draggedItem",e),this._dragStart(t))},dragOver(t){if(this.y+1>this.rows&&(1==this.mode||2==this.mode)&&this.dragCancel(),!this.active)return this.dragCancel();if(this.checkPinnedWidgetAnimation(),2==this.mode&&this.checkWidgetSizeLimitAnimation(),this.updateCursor(t))switch(this.mode){case 1:{t.preventDefault(),this.dragGrid=new d(this.grid);let e=this.x+this.draggedOffset[0],n=this.y+this.draggedOffset[1];e<0?(this.draggedOffset[0]+=e,e=0):e+this.draggedItem.w>this.cols&&(this.draggedOffset[0]+=this.cols-this.draggedItem.w-e,e=this.cols-this.draggedItem.w),n<0&&(this.draggedOffset[1]+=n,n=0),this.positionUpdates=this.dragGrid.move(this.draggedItem,e,n);break}case 2:{t.preventDefault(),this.dragGrid=new d(this.grid);let e=Math.min(this.cols-this.draggedItem.x,Math.max(1,this.x-this.draggedItem.x+1)),n=Math.max(1,this.y-this.draggedItem.y+1);this.resizeLimit&&([e,n]=this.resizeLimit(this.draggedItem.data,e,n)),this.positionUpdates=this.dragGrid.resize(this.draggedItem,e,n);break}}},dragCancel(){this.removeWidgetClones(),this.additionalRowComputed=!1,this.toggleDraggedItemOverlay(!1),this.mode=0,this.positionUpdates=null,this.draggedOffset=[0,0],this.draggedItem=null,this.$emit("draggedItem",null),this.draggedNode=null},dragEnd(){if(this.removeWidgetClones(),this.toggleDraggedItemOverlay(!1),0==this.mode)return;document.getElementById(this.draggedItem.data.widgetid).classList.remove("border-danger"),Array.from(document.getElementsByClassName("denied-dragging-animation"))?.forEach(t=>{t.classList.remove("denied-dragging-animation")}),this.mode=0;let t=[];this.convertGridResultToUpdate(this.positionUpdates,t),t=this._updateFixedPositions(t),t.length&&this.$emit("rearrangeItems",t.filter(t=>t)),this.draggedItem=null,this.draggedNode=null,this.$emit("draggedItem",null)},_updateFixedPositions(t){t.forEach((t,e)=>{this.fixedPositionUpdates[e]?this.fixedPositionUpdates[e]={...this.fixedPositionUpdates[e],...t}:this.fixedPositionUpdates[e]=t});let e=this.createNewGrid(this.prePlacedItems);return e.length?(e.forEach((e,n)=>t[n]=e),this._updateFixedPositions(t)):t},emptyTileClicked(){this.additionalRowComputed=!1,this.$emit("newItem",this.x,this.y)},updateCursorOnMouseMove(t){0==this.mode&&this.updateCursor(t)},checkPinnedWidgetAnimation(){let t=[];switch(this.mode){case 2:for(let e=this.draggedItem.x;e<=this.x;e++)for(let n=this.draggedItem.y;n<=this.y;n++)this.items.forEach(i=>{i.x==e&&i.y==n&&t.push(i)});break;case 1:t=this.items.filter(t=>t.x==this.x&&t.y==this.y)}Array.from(document.getElementsByClassName("denied-dragging-animation"))?.forEach(t=>{t.classList.remove("denied-dragging-animation")}),t.forEach(t=>{if(t.place[this.cols]&&t.place[this.cols].pinned){let e=document.getElementById(t.widgetid).querySelector("[pinned='true']");e.classList.contains("denied-dragging-animation")||e.classList.add("denied-dragging-animation")}})},checkWidgetSizeLimitAnimation(){let t=this.itemsSetup[this.draggedItem.data.widget],e=t.width.max??t.width,n=t.width.min??t.width,i=t.height.max??t.height,a=t.height.min??t.height,s=document.getElementById(this.draggedItem.data.widgetid),r=this.x-this.draggedItem.x+1,o=this.y-this.draggedItem.y+1;r>0&&(r>e||r<n)||o>0&&(o>i||o<a)?s.classList.add("border-danger"):s.classList.remove("border-danger")},removeWidgetClones(){let t=Array.from(document.getElementsByClassName("widgetClone"));for(let e=0;e<t.length;e++)this.$refs.container.removeChild(t[e])},mouseDown(){this.mode=3},mouseUp(){this.mode=0}},template:'\n\t<div\n\t\tref="container"\n\t\tclass="drop-grid position-relative h-0"\n\t\t:style="gridStyle"\n\t\t@touchmove="dragOver"\n\t\t@touchend="dragCancel"\n\t\[email protected]="dragOver"\n\t\t@drop="dragEnd($event)"\n\t\t@mousemove="updateCursorOnMouseMove"\n\t\t@mouseleave="mouseLeave">\n\t\t<TransitionGroup tag="div">\n\t\t\t<grid-item\n\t\t\t\tref="gridItems"\n\t\t\t\tv-for="(item,index) in ((mode != 1 && mode != 2) && active ? placedItems_withPlaceholders : placedItems)"\n\t\t\t\t:key="item.data.id"\n\t\t\t\t:item="item"\n\t\t\t\t@start-move="startMove"\n\t\t\t\t@mouse-down="mouseDown"\n\t\t\t\t@mouse-up="mouseUp"\n\t\t\t\t@start-resize="startResize"\n\t\t\t\t@dragging="dragging"\n\t\t\t\t@end-drag="dragEnd"\n\t\t\t\t@touch-end="dragEnd();mouseUp();"\n\t\t\t\t@touch-start="updateCursorOnMouseMove($event); mouseDown();"\n\t\t\t\tclass="position-absolute"\n\t\t\t\t:active="active"\n\t\t\t\t:style="{\n\t\t\t\t\tzIndex: item.resizeOverlay ? 1 : \'auto\',\n\t\t\t\t\ttop: \'calc(\' + item.y + \' * var(--fhc-dg-row-height))\',\n\t\t\t\t\tleft: \'calc(\' + item.x + \' * var(--fhc-dg-col-width))\',\n\t\t\t\t\twidth: \'calc(\' + item.w + \' * var(--fhc-dg-col-width))\',\n\t\t\t\t\theight: \'calc(\' + item.h + \' * var(--fhc-dg-row-height))\',\n\t\t\t\t\tpaddingTop: \'var(--fhc-dg-item-padding-top)\',\n\t\t\t\t\tpaddingLeft: \'var(--fhc-dg-item-padding-horizontal)\',\n\t\t\t\t\tpaddingRight: \'var(--fhc-dg-item-padding-horizontal)\'\n\t\t\t\t}">\n\t\t\t\t<template v-slot="item">\n\t\t\t\t\t<slot v-bind="{...item, ...item.data, index:index}" :x="item.x" :y="item.y" ></slot>\n\t\t\t\t</template>\n\t\t\t</grid-item>\n\t\t</TransitionGroup>\n\t\t\n\t</div>'};let u={},p={},h=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/dashboard/Widget";var m={getWidget:t=>u[t],loadWidget:t=>u[t]?Promise.resolve(u[t]):p[t]?p[t]:h?(p[t]=new Promise((e,n)=>{axios.get(h,{params:{id:t}}).then(n=>{u[t]=n.data.retval,p[t]=void 0,e(u[t])}).catch(t=>n(t.response.data.retval.error))}),p[t]):Promise.reject("Widget could not be loaded because there is no path yet!"),setPath(t){h=t}},g={name:"Item",components:{BsModal:s,HeightTransition:{data:()=>({}),methods:{onEnter(t,e){t.style.height="0",t.style.height=t.scrollHeight+"px"},onLeave(t,e){t.style.height=t.scrollHeight+"px",t.style.height="0"}},template:'\n\t\t<Transition name="height" @enter="onEnter" @leave="onLeave">\n\t\t\t<slot>\n\t\t\t</slot>\n\t\t</Transition>\n\t'}},data:()=>({component:"",arguments:null,target:!1,widget:null,tmpConfig:{},isLoading:!1,hasConfig:!1,sharedData:null}),emits:["change","remove","dragstart","resizestart","configOpened","configClosed","pinItem","unPinItem"],props:["id","widgetID","config","width","height","custom","hidden","editMode","loading","item_data","place","setup","dragstate","resizeOverlay","additionalRow"],computed:{maxHeight(){return this.setup?.height?.max},maxWidth(){return"[object Number]"==Object.prototype.toString.call(this.setup?.width)?this.setup?.width:this.setup?.width?.max},minHeight(){return this.setup?.height?.min},minWidth(){return this.setup?.width?.min},isResizeable(){return this.maxWidth>1||this.maxHeight>1},isPinned(){return!!this.place?.pinned},ready(){return this.component&&null!==this.arguments}},methods:{unpin(){if(!this.editMode)return;let t={item:this.item_data,x:this.item_data.x,y:this.item_data.y};this.$emit("unPinItem",[t])},pinItem(){let t={item:this.item_data,x:this.item_data.x,y:this.item_data.y};this.$emit("pinItem",[t])},getWidgetC4Link:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+t.setup.cis4link,handleShowBsModal(){this.$emit("configOpened")},handleHideBsModal(){this.$emit("configClosed")},mouseDown(t){this.target=t.target},startDrag(t){this.$refs.dragHandle.contains(this.target)?this.$emit("dragstart",t):this.isResizeable&&this.$refs.resizeHandle.contains(this.target)&&this.isResizeable?this.$emit("resizestart",t):t.preventDefault()},openConfig(){this.tmpConfig={...this.arguments},this.$refs.config.show()},setConfig(t){this.hasConfig=t},changeConfig(){this.isLoading=!0;let t={...this.tmpConfig};this.sendChangeConfig(t)},changeConfigManually(){let t={...this.arguments};this.sendChangeConfig(t)},sendChangeConfig(t){for(var e in t)this.widget.arguments[e]==t[e]&&delete t[e];this.$emit("change",t)}},watch:{config(){this.arguments={...this.widget?.arguments,...this.config},this.tmpConfig={...this.arguments},this.$refs.config&&this.$refs.config.hide(),this.isLoading=!1}},async created(){this.widget=await m.loadWidget(this.id);let t=(await import(this.widget.setup.file)).default;this.$options.components["widget"+this.widget.widget_id]=t,this.component="widget"+this.widget.widget_id,this.arguments={...this.widget.arguments,...this.config},this.tmpConfig={...this.arguments}},template:'\n\t<div v-if="loading">\n\t\t<div class="d-flex justify-content-center align-items-center h-100">\n\t\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t\t</div>\n\t</div>\n\t<div v-else-if="!hidden || editMode" :id="widgetID" class="dashboard-item card overflow-hidden h-100 position-relative" :class="{\'hiddenWidget\':hidden, \'draggedItem\':dragstate, \'dashboard-item-overlay\':resizeOverlay, [arguments?.className]:arguments && arguments.className}">\n\t<div v-show="!dragstate" class="h-100 card border-0">\n\t\t<div v-if="widget" class="card-header d-flex ps-0 pe-2 align-items-center">\n\t\t\t<Transition>\n\t\t\t\t<span type="button" v-if="editMode && !isPinned" drag-action="move" class="col-auto mx-2 px-2 cursor-move" aria-label="move widget" v-tooltip="{showDelay:1000, value:\'move widget\'}"><i class="fa-solid fa-grip-vertical" aria-hidden="true"></i></span>\n\t\t\t</Transition>\n\t\t\t<span class="col mx-2 px-2">{{ widget.setup.name }}</span>\n\t\t\t<template v-if="isPinned">\n\t\t\t\t<div type="button" role="button" v-if="editMode" pinned="true" @click="unpin" title="unpin item" aria-label="unpin item" class="pin cursor-pointer col-auto me-2">\n\t\t\t\t\t<i class="fa-solid fa-thumbtack " aria-hidden="true"></i>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class="col-auto me-2">\n\t\t\t\t\t<i class="fa-solid fa-thumbtack "></i>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<div type="button" role="button" v-if="editMode" class="col-auto me-2 pin" @click="pinItem" aria-label="pin item" title="pin item">\n\t\t\t\t\t<i class="fa-solid fa-thumbtack" aria-hidden="true" style="color:lightgray;"></i>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<a type="button" v-if="widget.setup.cis4link" :href="getWidgetC4Link(widget)" aria-label="widget link" v-tooltip="{showDelay:1000, value:\'widget link\'}" class="col-auto ms-auto ">\n \t\t<i class="fa fa-arrow-up-right-from-square me-1" aria-hidden="true"></i>\n \t</a>\n\t\t\t<a type="button" v-if="hasConfig" class="col-auto px-1" href="#" @click.prevent="openConfig" aria-label="configure widget" v-tooltip="{showDelay:1000,value:\'configure widget\'}"><i class="fa-solid fa-gear" aria-hidden="true"></i></a>\n\t\t\t<a type="button" v-if="custom && editMode" class="col-auto px-1" aria-label="delete widget" v-tooltip="{showDelay:1000,value:\'delete widget\'}" href="#" @click.prevent="$emit(\'remove\')">\n\t\t\t\t<i class="fa-solid fa-trash" aria-hidden="true"></i>\n\t\t\t</a>\n\t\t\t<Transition>\n\t\t\t\t<div v-if="!custom && editMode" class="col-auto px-1 form-switch">\n\t\t\t\t\t<input class="form-check-input ms-0" type="checkbox" role="switch" aria-label="toggle widget" id="flexSwitchCheckChecked" :checked="!hidden" @input="$emit(\'remove\', hidden)">\n\t\t\t\t</div>\n\t\t\t</Transition>\n\t\t</div>\n\t\t<div v-if="ready" class="card-body overflow-hidden p-0">\n\t\t\t<component :is="component" v-model:shared-data="sharedData" :config="arguments" :width="width" :height="height" @setConfig="setConfig" @change="changeConfigManually"></component>\n\t\t</div>\n\t\t<div v-else class="card-body overflow-hidden text-center d-flex flex-column justify-content-center"><i class="fa-solid fa-spinner fa-pulse fa-3x"></i></div>\n\t\t<bs-modal v-if="hasConfig" ref="config" @hideBsModal="handleHideBsModal" @showBsModal="handleShowBsModal">\n\t\t\t<template v-slot:title>\n\t\t\t\t{{ widget ? \'Config for \' + widget.setup.name : \'\' }}\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\t<component v-if="ready && !isLoading" :is="component" v-model:shared-data="sharedData" :config="tmpConfig" @change="changeConfig" :configMode="true"></component>\n\t\t\t\t<div v-else class="text-center"><i class="fa-solid fa-spinner fa-pulse fa-3x"></i></div>\n\t\t\t</template>\n\t\t\t<template v-if="!widget?.setup?.hideFooter" v-slot:footer>\n\t\t\t\t<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>\n\t\t\t\t<button type="button" class="btn btn-primary" @click="changeConfig">Save changes</button>\n\t\t\t</template>\n\t\t</bs-modal>\n\t\t<height-transition>\n\t\t\t<div v-if="editMode && isResizeable && !isPinned " class="card-footer d-flex justify-content-end p-0">\n\t\t\t\t<template v-if="maxWidth < 2">\n\t\t\t\t\t<span type="button" drag-action="resize" class="col-auto px-1 cursor-ns-resize" aria-label="resize widget" v-tooltip="{showDelay:1000, value:\'resize widget\'}">\n\t\t\t\t\t\t<i class="fa-solid fa-up-down pe-2" aria-hidden="true"></i>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template v-else-if="maxHeight < 2">\n\t\t\t\t\t<span type="button" drag-action="resize" class="col-auto px-1 cursor-ew-resize" aria-label="resize widget" v-tooltip="{showDelay:1000, value:\'resize widget\'}">\n\t\t\t\t\t\t<i class="fa-solid fa-left-right pe-2" aria-hidden="true"></i>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<span type="button" drag-action="resize" class="col-auto px-1 cursor-nw-resize" aria-label="resize widget" v-tooltip="{showDelay:1000, value:\'resize widget\'}">\n\t\t\t\t\t\t<i class="fa-solid fa-up-right-and-down-left-from-center mirror-x" aria-hidden="true"></i>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</height-transition>\n\t\t</div>\n\t</div>'},f={data:()=>({}),props:{widget:{type:Object,required:!0}},methods:{path:t=>"/"==t[0]?FHC_JS_DATA_STORAGE_OBJECT.app_root+t:t},emits:["select"],template:'\n\t<div class="card h-100" @click="$emit(\'select\',widget.widget_id);">\n\t\t<img class="card-img-top widget-icon" :src="path(widget.setup.icon)" :alt="\'pictogram for \' + (widget.setup.name || widget.widget_kurzbz)">\n\t\t<div class="card-body">\n\t\t\t<h5 class="card-title">{{ widget.setup.name || widget.widget_kurzbz }}</h5>\n\t\t\t<p class="card-text">{{ widget.beschreibung }}</p>\n\t\t</div>\n\t</div>'},v={name:"Section",components:{DropGrid:c,DashboardItem:g,WidgetIcon:f},inject:{widgetsSetup:{type:Array,default:[]},adminMode:{type:Boolean,default:!1},editMode:{type:Boolean,default:!1}},props:["name","widgets"],emits:["widgetAdd","widgetUpdate","widgetRemove"],data:()=>({configOpened:!1,gridWidth:1,gridHeight:null,draggedItem:null,additionalRow:!1}),provide(){return{editModeIsActive:Vue.computed(()=>this.editModeIsActive),sectionName:Vue.computed(()=>this.name)}},computed:{computedWidgetsSetup(){return this.widgetsSetup?this.widgetsSetup.reduce((t,e)=>(t[e.widget_id]=e.setup,t),{}):{}},editModeIsActive(){return(this.editMode||this.adminMode)&&!this.configOpened},getSectionStyle:()=>"margin-bottom: 8px;",items(){return this.widgets.map(t=>(!t?.widgetid&&t?.id&&(t.widgetid=t.id),{...t,reorder:!1,...t.place[this.gridWidth]||{reorder:!0,x:0,y:0,w:1,h:1}}))}},methods:{sectionNameTranslation(){switch(this.name){case"general":case"custom":return this.$p.t("dashboard",this.name);default:return this.name}},showSectionInformation(){return"general"==this.name?this.$p.t("dashboard","dashboardGeneralSectionDescription"):"custom"==this.name?this.$p.t("dashboard","dashboardCustomSectionDescription"):this.$p.t("dashboard","dashboardSectionDescription",[this.name])},handleConfigOpened(){this.configOpened=!0},handleConfigClosed(){this.configOpened=!1},checkResizeLimit(t,e,n){let i=m.getWidget(t.widget);if(i){let t=i.setup.width;t.max?t.min=t.min||1:t={min:t,max:t},e<t.min&&(e=t.min),e>t.max&&(e=t.max);let a=i.setup.height;a.max?a.min=a.min||1:a={min:a,max:a},n<a.min&&(n=a.min),n>a.max&&(n=a.max)}return[e,n]},removeWidget(t,e){if(t.custom)o.popup("Are you sure you want to delete this widget?").then(()=>this.$emit("widgetRemove",this.name,t.id));else{let n={};n[t.id]={hidden:!e},this.updatePreset(n)}},saveConfig(t,e){let n={};n[e.id]={config:t},this.updatePreset(n)},updatePositions(t,e=!1){let n={};t.forEach(t=>{let i={...t.item};i.placeholder||(i.place[this.gridWidth]||(i.place[this.gridWidth]={x:0,y:0,w:1,h:1}),delete i.x,delete i.y,delete i.w,delete i.h,delete i.place[this.gridWidth].pinned,void 0!==t.x&&(i.place[this.gridWidth].x=t.x),void 0!==t.y&&(i.place[this.gridWidth].y=t.y),void 0!==t.w&&(i.place[this.gridWidth].w=t.w),void 0!==t.h&&(i.place[this.gridWidth].h=t.h),e&&(i.place[this.gridWidth].pinned=!0),n[i.id]=i)}),this.updatePreset(n)},updatePreset(t){let e={};e[this.name]=t,this.$emit("widgetUpdate",this.name,e)}},mounted(){let t=this,e=t.$refs.container;t.gridWidth=parseInt(window.getComputedStyle(e).getPropertyValue("--fhc-dashboard-grid-size")),window.addEventListener("resize",()=>{t.gridWidth=parseInt(window.getComputedStyle(e).getPropertyValue("--fhc-dashboard-grid-size"))})},template:'\n\t<div class="dashboard-section position-relative pb-3 border-bottom" ref="container" :style="getSectionStyle">\n\t\t<h4 v-if="editModeIsActive" class=" mb-2">\n\t\t\t<i v-tooltip="showSectionInformation(name)" class="fa-solid fa-circle-info section-info" ></i>\n\t\t\t{{sectionNameTranslation()}}:\n\t\t</h4>\n\t\t<button v-tooltip="$p.t(\'dashboard\',\'addLine\')" v-if="!additionalRow && editModeIsActive" @click="additionalRow=true" class="btn btn-outline-secondary rounded-circle newGridRow d-flex justify-content-center align-items-center">+</button>\n\t\t<drop-grid v-model:cols="gridWidth" v-model:additionalRow="additionalRow" :items="items" :itemsSetup="computedWidgetsSetup" :active="editModeIsActive" :resize-limit="checkResizeLimit" :margin-for-extra-row=".01" @draggedItem="draggedItem=$event" @rearrange-items="updatePositions" @gridHeight="gridHeight=$event" >\n\t\t\t<template #default="item">\n\t\t\t\t<div v-if="item.placeholder" class="empty-tile-hover" @pointerdown="$emit(\'widgetAdd\', name, { widget: 1, config: {}, place: {[gridWidth]: {x:item.x,y:item.y,w:1,h:1}}, custom: 1 })"></div>\n\t\t\t\t<dashboard-item \n\t\t\t\t\tv-else\n\t\t\t\t\t:id="item.widget"\n\t\t\t\t\t:dragstate="item.blank || (item.widgetid && item.widgetid == draggedItem?.data.widgetid)"\n\t\t\t\t\t:resizeOverlay="item.resizeOverlay"\n\t\t\t\t\t:widgetID="item.id"\n\t\t\t\t\t:width="item.w"\n\t\t\t\t\t:height="item.h"\n\t\t\t\t\t:item_data="{config:item.config, custom:item.custom, h:item.h, w:item.w,id:item.id,reorder:item.reorder,place:item.place,widget:item.widget,widgetid:item.widgetid,x:item.x,y:item.y}"\n\t\t\t\t\t:loading="item.loading"\n\t\t\t\t\t:config="item.config"\n\t\t\t\t\t:custom="item.custom"\n\t\t\t\t\t:hidden="item.hidden"\n\t\t\t\t\t:editMode="editModeIsActive"\n\t\t\t\t\t:place="item.place[gridWidth]"\n\t\t\t\t\t:setup="computedWidgetsSetup[item.widget]"\n\t\t\t\t\t@change="saveConfig($event, item)"\n\t\t\t\t\t@remove="removeWidget(item, $event)"\n\t\t\t\t\t@config-opened="handleConfigOpened"\n\t\t\t\t\t@config-closed="handleConfigClosed"\n\t\t\t\t\t@pinItem="updatePositions($event,true)"\n\t\t\t\t\t@unPinItem="updatePositions">\n\t\t\t\t</dashboard-item>\n\t\t\t\t\n\t\t\t</template>\n\t\t\t\n\t\t</drop-grid>\n\t</div>'},b={components:{BsModal:s,WidgetIcon:f},props:["widgets"],data:()=>({callbacks:{}}),methods:{getWidget(){return new Promise((t,e)=>{this.callbacks={resolve:t,reject:e},this.$refs.modal.show()})},close(){this.callbacks.reject&&this.callbacks.reject(),this.callbacks={}},pick(t){this.callbacks.resolve&&this.callbacks.resolve(t),this.callbacks={},this.$refs.modal.hide()}},template:'<div class="dashboard-widget-picker">\n\t\t<bs-modal ref="modal" class="fade" :dialog-class="{\'modal-fullscreen-sm-down\': 1, \'modal-xl\': widgets && widgets.length > 0}" @hiddenBsModal="close">\n\t\t\t<template v-slot:title>Create new widget</template>\n\t\t\t<template v-slot:default>\n\t\t\t\t<div v-if="widgets" class="row g-2">\n\t\t\t\t\t<div v-if="!widgets.length">\n\t\t\t\t\t\tNo Widgets available\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-for="widget in widgets" :key="widget.widget_id" class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2">\n\t\t\t\t\t\t<widget-icon @select="pick" :widget="widget" ></widget-icon>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class="text-center"><i class="fa-solid fa-spinner fa-pulse fa-3x"></i></div>\n\t\t\t</template>\n\t\t</bs-modal>\n\t</div>'},y={mergeDeep(...t){const e=t=>t&&"object"==typeof t;return t.reduce((t,n)=>(Object.keys(n).forEach(i=>{const a=t[i],s=n[i];Array.isArray(a)&&Array.isArray(s)?t[i]=a.concat(...s):e(a)&&e(s)?t[i]=this.mergeDeep(a,s):t[i]=s}),t),{})}},w={getViewData:()=>({method:"get",url:"/api/frontend/v1/Cis4FhcApi/getViewData"})},k={name:"Dashboard",components:{DashboardSection:v,DashboardWidgetPicker:b},props:{dashboard:{type:String,required:!0,default:"CIS"},viewData:{type:Object,required:!0,validator:t=>t&&t.name&&t.uid&&t.timezone}},data(){return{sections:[],widgets:null,editMode:!1,viewDataInternal:this.viewData}},provide(){return{editMode:Vue.computed(()=>this.editMode),widgetsSetup:Vue.computed(()=>this.widgets),timezone:Vue.computed(()=>this.viewData.timezone)}},computed:{apiurl:()=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/dashboard"},methods:{widgetAdd(t,e){null===this.widgets&&axios.get(this.apiurl+"/Widget/getWidgetsForDashboard",{params:{db:this.dashboard}}).then(t=>{t.data.retval.forEach(t=>{t.arguments=JSON.parse(t.arguments),t.setup=JSON.parse(t.setup)}),this.widgets=t.data.retval}).catch(t=>console.error("ERROR:",t)),this.$refs.widgetpicker.getWidget().then(n=>{e.widget=n,e.id="loading_"+String((new Date).valueOf());let i={...e};i.loading=!0,this.sections.forEach(e=>{e.name==t&&e.widgets.push(i)}),axios.post(this.apiurl+"/Config/addWidgetsToUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgets:[e]}).then(n=>{let a=Object.keys(n.data.retval.data[t].widgets).pop();e.id=a,this.sections.forEach(n=>{n.name==t&&(n.widgets.splice(n.widgets.indexOf(i),1),n.widgets.push(e))})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})}).catch(()=>{})},widgetUpdate(t,e){for(var n in e=e[t]){for(var i in this.sections)if(this.sections[i].name==t){for(var a in this.sections[i].widgets)if(this.sections[i].widgets[a].id==n){for(var s in e[n]=y.mergeDeep(this.sections[i].widgets[a],e[n]),{_x:1,_y:1,_w:1,_h:1,index:1,id:1,preset:1})e[n][s]&&delete e[n][s];break}break}e[n].widgetid=n}axios.post(this.apiurl+"/Config/addWidgetsToUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgets:e}).then(()=>{this.sections.forEach(n=>{n.name==t&&n.widgets.forEach((t,i)=>{e[t.id]&&(e[t.id].id=t.id,e[t.id].index=t.index,n.widgets[i]=e[t.id])})})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})},widgetRemove(t,e){axios.post(this.apiurl+"/Config/removeWidgetFromUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgetid:e}).then(()=>{this.sections.forEach(n=>{n.name==t&&(n.widgets=n.widgets.filter(t=>t.id!=e))})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})}},created(){this.$p.loadCategory("dashboard"),axios.get(this.apiurl+"/Widget/getWidgetsForDashboard",{params:{db:this.dashboard}}).then(t=>{this.widgets=t.data.retval}).catch(t=>console.error("ERROR:",t)),axios.get(this.apiurl+"/Config",{params:{db:this.dashboard}}).then(t=>{for(var e in t.data.retval){let i=[],a=[];for(var n in t.data.retval[e].widgets)t.data.retval[e].widgets[n].id=n,t.data.retval[e].widgets[n].custom||t.data.retval[e].widgets[n].preset?i.push(t.data.retval[e].widgets[n]):a.push(n);this.sections.push({name:e,widgets:i}),a.forEach(t=>this.widgetRemove(e,t))}this.sections=this.sections.sort((t,e)=>"custom"==t.name?1:"custom"==e.name?-1:e.widgets.length-t.widgets.length)}).catch(t=>console.error("ERROR:",t))},async beforeMount(){if(!this.viewData.name||!this.viewData.uid){const t=await this.$api.call(w.getViewData());this.viewDataInternal=t.data}},template:'\n\t<div class="core-dashboard">\n\t\t<h3 v-show="viewDataInternal?.name">\n\t\t\t{{ $p.t(\'global/personalGreeting\', [ viewDataInternal?.name ]) }}\n\t\t\t<button style="margin-left: 8px;" class="btn" @click="editMode = !editMode" aria-label="edit dashboard" v-tooltip="{showDelay:1000,value:\'edit dashboard\'}"><i class="fa-solid fa-gear" aria-hidden="true"></i></button>\n\t\t</h3>\n\t\t<dashboard-section v-for="(section, index) in sections" :key="section.name" :seperator="index" :name="section.name" :widgets="section.widgets" @widgetAdd="widgetAdd" @widgetUpdate="widgetUpdate" @widgetRemove="widgetRemove"></dashboard-section>\n\t\t<dashboard-widget-picker ref="widgetpicker" :widgets="widgets"></dashboard-widget-picker>\n\t</div>'},_={search(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/search",t,e)},searchAdvanced(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/searchAdvanced",t,e)},searchdummy(t){return this.$fhcApi.post("public/js/apps/api/dummyapi.php/Search",t)}},A={loadCategory(t){return this.$fhcApi.get("/api/frontend/v1/phrasen/loadModule/"+t)},setLanguage(t,e){const n={categories:t,language:e};return this.$fhcApi.post("/api/frontend/v1/phrasen/setLanguage",n)},getLanguage(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getLanguage",{})},getActiveDbLanguages(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getAllLanguages",{})}},$={getHeader(t){return this.$fhcApi.get("/api/frontend/v1/navigation/header",{navigation_page:t})},getMenu:function(t){return this.$fhcApi.get("/api/frontend/v1/navigation/menu",{navigation_page:t})}},x={saveCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/saveCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName})},removeCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},applyFilterFields(t){return this.$fhcApi.post("/api/frontend/v1/filter/applyFilterFields",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields})},addFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/addFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},removeFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},getFilterById(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},getFilter(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType})}},S={abmeldung:{getDetails(t,e){const n="/api/frontend/v1/studstatus/abmeldung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(n)},create(t,e,n){return this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n},{errorHandling:"strict"})},cancel(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t.studierendenantrag_id},{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t})}},unterbrechung:{getDetails(t,e){const n="/api/frontend/v1/studstatus/unterbrechung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(n)},create(t,e,n,i,a){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n,datum_wiedereinstieg:i,attachment:a},{errorHandling:"strict"})},cancel(t){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/cancelAntrag",{antrag_id:t},{errorHandling:"strict"})}},wiederholung:{getDetails(t){const e="/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/"+t;return this.$fhcApi.get(e)},getLvs(t){const e="/api/frontend/v1/studstatus/wiederholung/getLvs/"+t;return this.$fhcApi.get(e)},create(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/createAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},cancel(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/cancelAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},saveLvs(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/saveLvs",{forbiddenLvs:t,mandatoryLvs:e})}},leitung:{getStgs(){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getActiveStgs")},getAntraege(t,e,n){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getAntraege/"+t).then(t=>t.data)},getHistory(t){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getHistory/"+t)},getPrestudents(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/getPrestudents",{query:t},{signal:e,timeout:3e4})},approve(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t)},reject(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t)},reopen(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t)},pause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t)},unpause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t)},object(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t)},approveObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t)},denyObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t)}}},z={getView:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getView/${t}`,{})},fotoSperre:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/fotoSperre/${t}`,{})},isStudent:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/isStudent",{uid:t})},isMitarbeiter:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/isMitarbeiter/${t}`,{})},getZustellAdresse:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellAdresse",{})},getZustellKontakt:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellKontakt",{})},getGemeinden:function(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`,{})},getAllNationen:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getAllNationen",{})}},T={
//! API calls for profil update requests
getStatus:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getStatus",{})},getTopic:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getTopic",{})},acceptProfilRequest:function({profil_update_id:t,uid:e,status_message:n,topic:i,requested_change:a}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",{profil_update_id:t,uid:e,status_message:n,topic:i,requested_change:a})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:n,status_message:i}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/denyProfilRequest",{profil_update_id:t,uid:e,topic:n,status_message:i})},insertFile:function(t,e=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,t)},getProfilRequestFiles:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`,{})},selectProfilRequest:function(t=null,e=null){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/selectProfilRequest",{...t?{uid:t}:{},...e?{id:e}:{}})},insertProfilRequest:function(t,e,n=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/insertProfilRequest",{topic:t,payload:e,...n?{fileID:n}:{}})},updateProfilRequest:function(t,e,n,i=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/updateProfilRequest",{topic:t,payload:e,ID:n,...i?{fileID:i}:{}})},deleteProfilRequest:function(t){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",{requestID:t})}},D={getRoomInfo(t,e,n){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getRoomplan",{ort_kurzbz:t,start_date:e,end_date:n})},getStunden(){return this.$fhcApi.get("/api/frontend/v1/LvPlan/Stunden",{})},getOrtReservierungen(t,e,n){return this.$fhcApi.post(`/api/frontend/v1/LvPlan/getReservierungen/${t}`,{start_date:e,end_date:n})},getLvPlanReservierungen(t,e){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getReservierungen",{start_date:t,end_date:e})},getLehreinheitStudiensemester(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`,{})},studiensemesterDateInterval(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`,{})},LvPlanEvents(t,e,n){return this.$fhcApi.get("/api/frontend/v1/LvPlan/LvPlanEvents",{start_date:t,end_date:e,lv_id:n})}},E={verband:{get(){return this.$fhcApi.get("api/frontend/v1/stv/verband")},favorites:{get(){return this.$fhcApi.get("api/frontend/v1/stv/favorites")},set(t){return this.$fhcApi.post("api/frontend/v1/stv/favorites/set",{favorites:t})}}},students:{uid(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/uid/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},prestudent(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/prestudent/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},person(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/person/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},verband(t){return this.$fhcApi.getUri("api/frontend/v1/stv/students/"+t)}},filter:{getStg(){return this.$fhcApi.get("api/frontend/v1/stv/filter/getStg")},setStg(t){return this.$fhcApi.post("api/frontend/v1/stv/filter/setStg",{studiengang_kz:t})}},konto:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/konto/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id),only_open:e.filter,studiengang_kz:e.studiengang_kz_intern?e.stg_kz:""}),t.ajaxRequestFunc=(t,e,n)=>this.$fhcApi.post(t,n,e),t.ajaxResponse=(t,e,n)=>n.data,t},checkDoubles(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/checkDoubles",e,{confirmErrorHandler:t=>!0})},insert(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/insert",e)},counter(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/counter",t)},edit(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/update",e)},delete(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/delete",{buchungsnr:t})},getBuchungstypen(){return this.$fhcApi.get("api/frontend/v1/stv/konto/getBuchungstypen")}},group:{getGruppen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/Gruppen/getGruppen/"+n.id)},deleteGroup(t){return this.$fhcApi.post("api/frontend/v1/stv/Gruppen/deleteGruppe/",t)}},kontakt:{getAdressen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressen/"+n.id)},addNewAddress(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewAddress/"+e,n)},loadAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadAddress/",{address_id:t})},updateAddress(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateAddress/"+e,n)},deleteAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteAddress/",{address_id:t})},getPlaces(t){return this.$fhcApi.get("api/frontend/v1/stv/address/getPlaces/"+t)},getFirmen(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getFirmen/"+t)},getNations(){return this.$fhcApi.get("api/frontend/v1/stv/address/getNations/")},getAdressentypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressentypen/")},getBankverbindung(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getBankverbindung/"+n.id)},addNewBankverbindung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewBankverbindung/"+e,n)},loadBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadBankverbindung/",{bankverbindung_id:t})},updateBankverbindung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateBankverbindung/"+e,n)},deleteBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteBankverbindung/",{bankverbindung_id:t})},getKontakte(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakte/"+n.id)},addNewContact(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewContact/"+e,n)},loadContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadContact/",{kontakt_id:t})},updateContact(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateContact/"+e,n)},deleteContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteContact/",{kontakt_id:t})},getStandorteByFirma(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getStandorteByFirma/"+t)},getKontakttypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakttypen/")}},prestudent:{get(t,e){return this.$fhcApi.post("api/frontend/v1/stv/prestudent/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e))},updatePrestudent(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/prestudent/updatePrestudent/"+e,n)},getBezeichnungZGV(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungZGV/")},getBezeichnungMZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungMZgv/")},getBezeichnungDZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungDZgv/")},getStgs(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStgs/")},getAusbildung(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAusbildung/")},getAufmerksamdurch(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAufmerksamdurch/")},getBerufstaetigkeit(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBerufstaetigkeit/")},getTypenStg(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getTypenStg/")},getBisstandort(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBisstandort/")},getHistoryPrestudent(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/status/getHistoryPrestudent/"+n.id)},getMaxSem(t){return this.$fhcApi.post("api/frontend/v1/stv/status/getMaxSemester/",{studiengang_kzs:t})},advanceStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+n+"/"+i)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+n+"/"+i)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+n+"/"+i)},getLastBismeldestichtag(){return this.$fhcApi.get("api/frontend/v1/stv/status/getLastBismeldestichtag/")},getHistoryPrestudents(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getHistoryPrestudents/"+n.id)}},status:{insertStatus(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/insertStatus/"+e,n)},loadStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+n+"/"+i)},updateStatus(t,{prestudent_id:e,status_kurzbz:n,studiensemester_kurzbz:i,ausbildungssemester:a},s){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+n+"/"+i+"/"+a,s)},getStudienplaene(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudienplaene/"+t)},getStudiengang(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudiengang/"+t)},getStatusgruende(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusgruende/")},getStati(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStati/")},addStudent(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/addStudent/"+t,e,{errorHeader:t})},changeStatus(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/changeStatus/"+t,e,{errorHeader:t})},getStatusarray(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusarray/")}},details:{get(t,e){let n="api/frontend/v1/stv/student/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e);return this.$fhcApi.post(n)},save(t,e,n,i){let a="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(n);return this.$fhcApi.post(t,a,i)}},exam:{getPruefungen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getPruefungen/"+n.id)},loadPruefung(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/loadPruefung/"+t)},getTypenPruefungen(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getTypenPruefungen")},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/getAllLehreinheiten/",t)},getLvsByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsByStudent/"+t)},getLvsandLesByStudent(t,e){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsandLesByStudent/"+t+"/"+e)},getLvsAndMas(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsAndMas/"+t)},getMitarbeiterLv(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getMitarbeiterLv/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getNoten")},checkZeugnisnoteLv(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/",t)},addPruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/insertPruefung/",e)},updatePruefung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/updatePruefung/"+e,n)},deletePruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/deletePruefung/"+t)}},abschlusspruefung:{getAbschlusspruefung(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/"+n.id)},addNewAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/",e)},loadAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/",{id:t})},updateAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/",e)},deleteAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/",{id:t})},getTypenAbschlusspruefung(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/")},getTypenAntritte(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/")},getBeurteilungen(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/")},getAkadGrade(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getAkadGrade/",{studiengang_kz:t})},getTypStudiengang(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/",{studiengang_kz:t})},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/"+t)},getPruefer(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getPruefer/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getNoten/")},checkForExistingExams(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/",{uids:t})}},grades:{list(){return this.$fhcApi.get("api/frontend/v1/stv/grades/list")},getCertificate(t,e){let n="api/frontend/v1/stv/grades/getCertificate/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},getTeacherProposal(t,e){let n="api/frontend/v1/stv/grades/getTeacherProposal/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},getRepeaterGrades(t,e){let n="api/frontend/v1/stv/grades/getRepeaterGrades/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},updateCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:i,lehrveranstaltung_bezeichnung:a}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:i},{errorHeader:a})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:i})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:i})},copyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id:t,lv_bezeichnung:e}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate",{studierendenantrag_lehrveranstaltung_id:t},{errorHeader:e})},getGradeFromPoints(t,e,n,i){const a=i?{errorHandling:!1}:{};return this.$fhcApi.post("api/frontend/v1/stv/grades/getGradeFromPoints",{points:t,lehrveranstaltung_id:e,studiensemester_kurzbz:n},a)}},mobility:{getMobilitaeten(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getMobilitaeten/"+n.id)},getProgramsMobility(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getProgramsMobility/")},addNewMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/insertMobility/",e)},loadMobility(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/loadMobility/"+t)},updateMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/updateMobility/",e)},deleteMobility(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobility/"+t)},getLVList(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLVList/"+t)},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/getAllLehreinheiten/",t)},getLvsandLesByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLvsandLesByStudent/"+t)},getPurposes(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getPurposes/"+n.id)},getSupports(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getSupports/"+n.id)},getListPurposes(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListPurposes/")},getListSupports(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListSupports/")},deleteMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilityPurpose/"+t.bisio_id,t)},addMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilityPurpose/"+t.bisio_id,t)},deleteMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilitySupport/"+t.bisio_id,t)},addMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilitySupport/"+t.bisio_id,t)}},archiv:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/archiv/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id)}),t.ajaxRequestFunc=(t,e,n)=>this.$fhcApi.post(t,n,e),t.ajaxResponse=(t,e,n)=>n.data,t},getArchivVorlagen(){return this.$fhcApi.post("api/frontend/v1/stv/archiv/getArchivVorlagen")},archive(t){return this.$fhcApi.post("api/frontend/v1/documents/archive",t)},archiveSigned(t){return this.$fhcApi.post("api/frontend/v1/documents/archiveSigned",t)},update(t){return this.$fhcApi.post("api/frontend/v1/stv/archiv/update",t)},delete({akte_id:t,studiengang_kz:e}){return this.$fhcApi.post("api/frontend/v1/stv/archiv/delete",{akte_id:t,studiengang_kz:e})}},documents:{getDocumentsUnaccepted(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/"+n.id+"/"+n.studiengang_kz)},getDocumentsAccepted(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsAccepted/"+n.id+"/"+n.studiengang_kz)},deleteZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},createZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/createZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},loadAkte(t){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/loadAkte/"+t)},getDoktypen(){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDoktypen/")},updateFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/updateAkte/"+t,e)},deleteFile(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteAkte/"+t)},uploadFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/uploadDokument/"+t,e)}},exemptions:{getAnrechnungen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getAnrechnungen/"+n.id)},getLehrveranstaltungen(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/"+t)},getBegruendungen(){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getBegruendungen/")},getLvsKompatibel(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLvsKompatibel/"+t)},getLektoren(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLektoren/"+t)},addNewAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/insertAnrechnung/",e)},loadAnrechnung(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/loadAnrechnung/"+t)},editAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/updateAnrechnung/",e)},deleteAnrechnung(t){return this.$fhcApi.post("api/frontend/v1/stv/anrechnungen/deleteAnrechnung/"+t)}},jointstudies:{getStudies(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudien/"+n.id)},getTypenMobility(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/")},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/")},getStudyprograms(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/")},getListPartner(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/")},getStatiPrestudent(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/")},loadStudy(t){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/loadStudie/"+t)},insertStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/insertStudie/",e)},updateStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/updateStudie/",e)},deleteStudy(t){return this.$fhcApi.post("api/frontend/v1/stv/GemeinsameStudien/deleteStudie/"+t)}},courselist:{getCourselist(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStundenplan/"+n.student_uid+"/"+n.start_date+"/"+n.end_date+"/"+n.group_consecutiveHours+"/"+n.dbStundenplanTable)},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStudiensemester/")}},configStudent(){return this.$fhcApi.get("api/frontend/v1/stv/config/student")},configStudents(){return this.$fhcApi.get("api/frontend/v1/stv/config/students")}},C={getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getUid/")},addNewNotiz(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/addNewNotiz/"+e,n)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/updateNotiz/"+e,n)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getMitarbeiter/"+t)},isBerechtigt(t,e){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/isBerechtigt/")}},O={getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizPrestudent/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPrestudent/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizPrestudent/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPrestudent/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPrestudent/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizPrestudent/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizPrestudent/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizPrestudent/getMitarbeiter/"+t)}},F={getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizMitarbeiter/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizMitarbeiter/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizMitarbeiter/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizMitarbeiter/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizMitarbeiter/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizMitarbeiter/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizMitarbeiter/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizMitarbeiter/getMitarbeiter/"+t)}},P={getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/NotizProjekt/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/NotizProjekt/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/NotizProjekt/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/NotizProjekt/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/NotizProjekt/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/NotizProjekt/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/NotizProjekt/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/NotizProjekt/getMitarbeiter/"+t)}},I={person:C,prestudent:O,mitarbeiter:F,anrechnung:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizAnrechnung/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizAnrechnung/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizAnrechnung/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizAnrechnung/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizAnrechnung/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizAnrechnung/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizAnrechnung/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizAnrechnung/getMitarbeiter/"+t)}},bestellung:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizBestellung/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizBestellung/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizBestellung/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizBestellung/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizBestellung/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizBestellung/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizBestellung/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizBestellung/getMitarbeiter/"+t)}},lehreinheit:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizLehreinheit/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizLehreinheit/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizLehreinheit/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizLehreinheit/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizLehreinheit/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizLehreinheit/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizLehreinheit/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizLehreinheit/getMitarbeiter/"+t)}},projekt:P,projektphase:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizProjektphase/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizProjektphase/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjektphase/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjektphase/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjektphase/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjektphase/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjektphase/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizProjektphase/getMitarbeiter/"+t)}},projekttask:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizProjekttask/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizProjekttask/getUid/")},addNewNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjekttask/addNewNotiz/"+t,e)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjekttask/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjekttask/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjekttask/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e){return this.$fhcApi.post("api/frontend/v1/notiz/notizProjekttask/updateNotiz/"+t,e)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizProjekttask/getMitarbeiter/"+t)}}},M={person:{getAllBetriebsmittel(t,e,n){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/"+n.type+"/"+n.id)},addNewBetriebsmittel(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/"+e,n)},loadBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/"+t)},updateBetriebsmittel(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/"+e,n)},deleteBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/"+t)},getTypenBetriebsmittel(){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/")},loadInventarliste(t){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/"+t)}}},L={updatePersonUnrulyStatus(t,e){try{const n={person_id:t,unruly:e},i="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(i,n,null)}catch(t){throw t}},filterPerson(t,e=""){try{const n=e+"/api/frontend/v1/checkperson/CheckPerson/filterPerson";return axios.post(n,t)}catch(t){throw t}}},N={getContentID(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/ContentID",{ort_kurzbz:t})},getRooms(t,e,n,i,a=0){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getRooms",{datum:t,von:e,bis:n,typ:i,personenanzahl:a})},getRoomTypes(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getTypes")}},R={content(t,e=null,n=null,i=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...i?{sichtbar:i}:{}})},getNews(t=1,e=10,n){return this.$fhcApi.get("/api/frontend/v1/Cms/getNews",{page:t,page_size:e,sprache:n})},news(t){return this.$fhcApi.get("/api/frontend/v1/Cms/news",{limit:t})},getNewsRowCount:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getNewsRowCount",{})},getNewsExtra:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getStudiengangInfoForNews",{})}},B={getStudentenMail(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Lehre/lvStudentenMail",{lehreinheit_id:t})},getLvInfo(t,e){return this.$fhcApi.get(`/api/frontend/v1/Lehre/LV/${t}/${e}`,{})},getStudentPruefungen(t){return this.$fhcApi.get(`/api/frontend/v1/Lehre/Pruefungen/${t}`,{})}},j={getLvMenu(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`,{})}},U={person:{getMessages(t,e,n){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessages/"+n.id+"/"+n.type+"/"+n.size+"/"+n.page)},getVorlagen(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getVorlagen/")},getMsgVarsLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/")},getMessageVarsPerson(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessageVarsPerson/"+t.id+"/"+t.type_id)},getMsgVarsPrestudent(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsPrestudent/"+t.id+"/"+t.type_id)},getPersonId(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getPersonId/"+t.id+"/"+t.type_id)},getUid(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getUid/"+t.id+"/"+t.type_id)},getDataVorlage(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getDataVorlage/"+t)},getNameOfDefaultRecipient(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getNameOfDefaultRecipient/"+t.id+"/"+t.type_id)},getPreviewText(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/getPreviewText/"+t.id+"/"+t.type_id,e)},getReplyData(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getReplyData/"+t)},sendMessageFromModalContext(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/messages/messages/sendMessage/"+e,n)},sendMessage(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/sendMessage/"+t,e)},deleteMessage(t){return this.$fhcApi.post("api/frontend/v1/messages/messages/deleteMessage/"+t)}}},V={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},H={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,n=void 0,i=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:n,studienplan:i})},getStudiengaengeForStudienSemester:function(t){return this.$fhcApi.get(`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${t}`,{})},getStudienplaeneBySemester:function(t,e){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienplaeneBySemester",{studiengang:t,studiensemester:e})},getLvPlanForStudiensemester:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${t}/${e}`,{})},getLvEvaluierungInfo:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/Studium/getLvEvaluierungInfo/${t}/${e}`,{})}},q={search:_,phrasen:A,navigation:$,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:x,studstatus:S,profil:z,profilUpdate:T,lvPlan:D,bookmark:{getBookmarks:function(){return this.$fhcApi.get("/api/frontend/v1/Bookmark/getBookmarks",{})},delete:function(t){return this.$fhcApi.get(`/api/frontend/v1/Bookmark/delete/${t}`,{})},update:function({bookmark_id:t,url:e,title:n,tag:i=null}){return this.$fhcApi.post(`/api/frontend/v1/Bookmark/update/${t}`,{url:e,title:n})},insert:function({url:t,title:e,tag:n}){return this.$fhcApi.post("/api/frontend/v1/Bookmark/insert",{url:t,title:e,tag:n})}},stv:E,notiz:I,betriebsmittel:M,checkperson:L,ampeln:{open:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/open",{})},all:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/all",{})},confirm:function(t){return this.$fhcApi.get(`/api/frontend/v1/Ampeln/confirm/${t}`,{})}},ort:N,cms:R,lehre:B,addons:j,messages:U,vorlagen:V,addons:j,studiengang:{studiengangInformation:function(){return this.$fhcApi.get("/api/frontend/v1/Studgang/getStudiengangInfo",{})},getStudiengangByKz:function(t){return this.$fhcApi.get("/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",{studiengang_kz:t})}},menu:{getMenu:function(){return this.$fhcApi.get("/api/frontend/v1/CisMenu/getMenu",{})}},authinfo:{getAuthUID(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthUID",{})},getAuthInfo(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthInfo",{})}},vertraege:{person:{getAllVertraege(t,e,n){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getAllVertraege/"+n.person_id)},getAllContractsNotAssigned(t,e,n){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getAllContractsNotAssigned/"+n.person_id)},getAllContractsAssigned(t,e,n){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getAllContractsAssigned/"+n.person_id+"/"+n.vertrag_id)},getAllContractsNotAssigned2(t){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getAllContractsNotAssigned/"+t)},getStatiOfContract(t,e,n){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getStatiOfContract/"+n.vertrag_id)},getAllContractTypes(){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getAllContractTypes/")},getAllContractStati(){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getAllContractStati/")},addNewContract(t,e){return this.$fhcApi.post(t,"api/frontend/v1/vertraege/vertraege/addNewContract/",e)},loadContract(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/loadContract/"+t)},updateContract(t,e){return this.$fhcApi.post(t,"api/frontend/v1/vertraege/vertraege/updateContract/",e)},deleteContract(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/deleteContract/"+t)},loadContractStatus(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/loadContractStatus/"+t.vertrag_id,t)},insertContractStatus(t,e){return this.$fhcApi.post(t,"api/frontend/v1/vertraege/vertraege/insertContractStatus/"+e.vertrag_id,e)},updateContractStatus(t,e){return this.$fhcApi.post(t,"api/frontend/v1/vertraege/vertraege/updateContractStatus/"+e.vertrag_id,e)},deleteContractStatus(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/deleteContractStatus/"+t.vertrag_id,t)},deleteLehrauftrag(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/deleteLehrauftrag/"+t.vertrag_id,t)},deleteBetreuung(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/deleteBetreuung/"+t.vertrag_id,t)},getMitarbeiter(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/getMitarbeiter/")},getHeader(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/getHeader/"+t)},getPersonAbteilung(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/getPersonAbteilung/"+t)},getLeitungOrg(t){return this.$fhcApi.post("api/frontend/v1/vertraege/vertraege/getLeitungOrg/"+t)},getMitarbeiterUid(t){return this.$fhcApi.get("api/frontend/v1/vertraege/vertraege/getMitarbeiterUid/"+t)}},configPrintDocument(){return this.$fhcApi.get("api/frontend/v1/vertraege/config/printDocument")}},studium:H,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},G={install:(t,e)=>{if(t.config.globalProperties.$fhcApi)return void(e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory.addEndpoints(e.factory)));function n(t,e,n,i){if("string"==typeof t&&void 0===i)[e,n,i]=[t,e,n],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===n&&void 0===i&&(i=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},i?i.form=t:i={form:t}}return[e,n,i]}function i(t){const e=t.data;return delete t.data,e.meta?e.meta.response=t:e.meta={response:t},e}FHC_JS_DATA_STORAGE_OBJECT.app_root,FHC_JS_DATA_STORAGE_OBJECT.ci_router;const a=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});a.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,n])=>{if(n instanceof FileList)for(const i of n)t.FormData.append(e+(n.length>1?"[]":""),i);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(i=>t.FormData.append(e+(n.length>1?"[]":""),i)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),a.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[n.type])(n,e.config))),i(e)),e=>"ERR_CANCELED"==e.code?Promise.reject({handled:!0,...e}):"off"==e.config?.errorHandling||!1===e.config?.errorHandling||"success"==e.config?.errorHandling?Promise.reject(e):e.response?404==e.response.status?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL,!0),Promise.reject({handled:!0,...e})):(e.response.data.errors=e.response.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[n.type])(n,e.config)),e.response.data.errors.length?Promise.reject(e):Promise.reject({handled:!0,...e})):e.request?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL),Promise.reject({handled:!0,...e})):(t.config.globalProperties.$fhcAlert.alertError(e.message),Promise.reject({handled:!0,...e}))),t.config.globalProperties.$fhcApi={getUri:t=>(console.warn("$fhcApi.getUri is DEPRECATED! Use $api.getUri instead."),a.getUri({url:t})),get:(t,e,i,s)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,i,s]=n(t,e,i,s),i&&(s?s.params=i:s={params:i}),a.get(e,s)),post:(t,e,i,s)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,i,s]=n(t,e,i,s),a.post(e,i,s)),_defaultErrorHandlers:{validation(e,n){const i=t.config.globalProperties.$fhcAlert;return n?.form?(n.form.clearValidation(),n.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(i.alertError),!1):"object"!=typeof e.messages||(n?.errorHeader?Object.values(e.messages).forEach(e=>i.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e,!0)):Object.entries(e.messages).forEach(([t,e])=>i.alertDefault("error",t,e,!0)),!1)},general(e,n){const i=t.config.globalProperties.$fhcAlert;n?.form?n.form.setFeedback(!1,e.message):n?.errorHeader?i.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):i.alertError(e.message)},php(e){const n=t.config.globalProperties.$fhcAlert;var i="";switch(i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n.alertDefault("warn","PHP "+e.severity,i,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n.alertDefault("info","PHP "+e.severity,i,!0);break;default:i="Type: PHP "+e.severity+"\n\n"+i,n.alertSystemError(i)}},exception(e){const n=t.config.globalProperties.$fhcAlert;var i="";i+="Type: "+e.class+"\n\n",i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),n.alertSystemError(i)},db(e){const n=t.config.globalProperties.$fhcAlert;var i="";void 0!==e.heading&&(i+=e.heading+"\n\n"),void 0!==e.code&&(i+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(i+="SQL: "+e.sql+"\n\n"),void 0!==e.message?i+="Message: "+e.message+"\n\n":void 0!==e.messages&&(i+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(i+="Filename: "+e.filename+"\n"),void 0!==e.line&&(i+="Line Number: "+e.line+"\n"),n.alertSystemError(i)},auth(e,n){const i=t.config.globalProperties.$fhcAlert;var a="";a+="Controller name: "+e.controller+"\n",a+="Method name: "+e.method+"\n",a+="Required permissions: "+e.required_permissions,n?.errorHeader?i.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):i.alertDefault("error",e.message,a)}}};class s{constructor(e,n){void 0===n?(this.$fhcApi={getUri:e=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.getUri(e)),get:(e,n,i,a)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,n,i,a)),post:(e,n,i,a)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,n,i,a))},Object.defineProperty(this.$fhcApi,"factory",{get:()=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory)}),t.config.globalProperties.$fhcApi.factory=this):Object.defineProperty(this,"$fhcApi",{get(){return(n||this).$fhcApi}}),this.addEndpoints(e,!0)}addEndpoints(t,e){Object.keys(t).forEach(e=>{Object.defineProperty(this,e,{get(){return"function"==typeof t[e]?t[e].bind(this):new s(t[e],this.$fhcApi.factory)}})}),e||console.warn("$fhcApi.factory.addEndpoints() is DEPRECATED!")}}const r=new s(q);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),r.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=r,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const J="error",W="retval",Z={get:function(t,e,n=null){return Z._axiosCall(t,e,"get",n)},post:function(t,e,n=null){return Z._axiosCall(t,e,"post",n)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(J)||!t.hasOwnProperty(W)||0!=t.error)},isError:function(t){return!Z.isSuccess(t)},hasData:function(t){return!(!Z.isSuccess(t)||!("object"==typeof t[W]&&Object.keys(t[W]).length>0||"array"==typeof t[W]&&t[W].length>0||"string"==typeof t[W]&&""!=t[W].trim()||"number"==typeof t[W]))},getData:function(t){return Z.hasData(t)?t[W]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(W)?t[W]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(J)?t[J]:1},_generateRouterURI:function(t){var e=null;return"undefined"!=typeof FHC_JS_DATA_STORAGE_OBJECT&&(e=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"+t),e},_printDebug:function(t,e,n){},_axiosCall:function(t,e,n,i){let a={method:n,url:Z._generateRouterURI(t),timeout:5e3};if("get"==n?a.params=e:a.data=e,"object"==typeof i)for(var s in i)a[s]=i[s];return axios(a)}},K=document.createElement("div"),Y=Vue.createApp({name:"FhcAlertApp",components:{PvToast:e,PvConfirm:n},methods:{mailToUrl:t=>"mailto:"+FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto+"?subject=Meldung%20Systemfehler&body="+("\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method+"%0D%0A\n\t\t\t\tFehler Meldung: "+t.message.detail+"%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!"),openMessagecard(t){bootstrap.Collapse.getOrCreateInstance(t.target.getAttribute("href")).toggle()}},unmounted(){K.parentElement.removeChild(K)},computed:{showmaillink:function(){return""!==FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto}},template:'\n\t<pv-toast ref="toast" class="fhc-alert" :base-z-index="99999">\n\t\t<template #message="{ message }">\n\t\t\t\x3c!--span :class="slotProps.iconClass"></span--\x3e\n\t\t\t<div class="p-toast-message-text">\n\t\t\t\t<span class="p-toast-summary">{{ message.summary }}</span>\n\t\t\t\t<div v-if="message.detail && message.html" class="p-toast-detail" v-html="message.detail"></div>\n\t\t\t\t<div v-else-if="message.detail" class="p-toast-detail">{{ message.detail }}</div>\n\t\t\t</div>\n\t\t</template>\n\t</pv-toast>\n\t<pv-toast ref="alert" class="fhc-alert" :base-z-index="99999" position="center">\n\t\t<template #message="slotProps">\n\t\t\t<i class="fa fa-circle-exclamation fa-2xl mt-3"></i>\n\t\t\t<div class="p-toast-message-text">\n\t\t\t\t<span class="p-toast-summary">{{slotProps.message.summary}}</span>\n\t\t\t\t<div class="p-toast-detail my-3">Sorry! Ein interner technischer Fehler ist aufgetreten.</div>\n\t\t\t\t<div class="d-flex justify-content-between align-items-center">\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass="align-bottom flex-fill me-2"\n\t\t\t\t\t\tdata-bs-toggle="collapse"\n\t\t\t\t\t\t:href="\'#fhcAlertCollapseMessageCard\' + slotProps.message.id"\n\t\t\t\t\t\trole="button"\n\t\t\t\t\t\taria-expanded="false"\n\t\t\t\t\t\t:aria-controls="\'fhcAlertCollapseMessageCard\' + slotProps.message.id"\n\t\t\t\t\t\t@click="openMessagecard"\n\t\t\t\t\t\t>\n\t\t\t\t\t\tFehler anzeigen\n\t\t\t\t\t</a>\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if="showmaillink"\n\t\t\t\t\t\tclass="btn btn-primary flex-fill"\n\t\t\t\t\t\ttarget="_blank"\n\t\t\t\t\t\t:href="mailToUrl(slotProps)"\n\t\t\t\t\t\t>\n\t\t\t\t\t\tFehler melden\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t\t<div ref="messageCard" :id="\'fhcAlertCollapseMessageCard\' + slotProps.message.id" class="collapse mt-3">\n\t\t\t\t\t<div class="card card-body text-body small alertCollapseText">\n\t\t\t\t\t\t{{slotProps.message.detail}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</pv-toast>\n\t<pv-confirm group="fhcAlertConfirm"></pv-confirm>'});Y.use(t),Y.use(i);const Q=Y.mount(K);document.body.appendChild(K);var X={install:(t,e)=>{t.config.globalProperties.$p||t.use(ot);const n={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);Q.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);Q.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);Q.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);Q.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);Q.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,n)=>{Q.$confirm.require({group:"fhcAlertConfirm",header:Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:Vue.computed(()=>t.config.globalProperties.$p.t("alert/confirm_delete")),acceptLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/loeschen")),acceptClass:"p-button-danger",rejectLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:"p-button-secondary",accept(){e(!0)},reject(){e(!1)}})}),confirm:e=>new Promise((n,i)=>{Q.$confirm.require({group:e?.group??"fhcAlertConfirm",header:e?.header??Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:e?.message??"",acceptLabel:e?.acceptLabel??"Ok",acceptClass:e?.acceptClass??"btn btn-primary",rejectLabel:e?.rejectLabel??Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:e?.rejectClass??"btn btn-outline-secondary",accept(){n(!0)},reject(){n(!1)}})}),alertDefault(t,e,n,i=!1,a=!1){let s={severity:t,summary:e,detail:n,html:a};i||(s.life=3e3),Q.$refs.toast.add(s)},alertMultiple(t,e="info",n="Info",i=!1,a=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,n,t,i,a)),!0)},handleSystemError(t){if(!t.hasOwnProperty("name")||t.name.toLowerCase()!=="AbortError".toLowerCase()){if("string"==typeof t)return n.alertSystemError(t);if(Array.isArray(t)&&t.every(t=>"string"==typeof t))return t.every(n.alertSystemError);if(!t.hasOwnProperty("handled")||!t.handled){if("object"==typeof t&&null!==t){let e="";return t.hasOwnProperty("response")&&t.response?.data?.retval?e+="Error Message: "+(t.response.data.retval.message||t.response.data.retval)+"\r\n":t.hasOwnProperty("message")&&(e+="Error Message: "+t.message.toUpperCase()+"\r\n"),t.hasOwnProperty("config")&&t.config.hasOwnProperty("url")&&(e+="Error ConfigURL: "+t.config.url+"\r\n"),t.hasOwnProperty("stack")&&(e+="Error Stack: "+t.stack+"\r\n"),""==e&&(e="Error Message: "+JSON.stringify(t)+"\r\n"),e+="Error Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,n.alertSystemError(e)}n.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method)}}},handleSystemMessage(t){if("string"==typeof t)return n.alertWarning(t);if(Array.isArray(t)){if(t.every(t=>"string"==typeof t))return t.every(n.alertWarning);if(t.every(t=>"object"==typeof t)&&null!==msg)return t.every(t=>{t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?n.alertWarning(JSON.stringify(t.data.retval)):n.alertSystemError(JSON.stringify(t))})}"object"!=typeof t||null===t?n.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method):t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?n.alertWarning(JSON.stringify(t.data.retval)):n.alertSystemError(JSON.stringify(t))},resetFormValidation(t){const e=new Event("fhc-form-reset");t.querySelectorAll(["[data-fhc-form-validate],[data-fhc-form-error]"]).forEach(t=>t.dispatchEvent(e))},handleFormValidation(t,e){if(void 0===e){if(t&&t.nodeType===Node.ELEMENT_NODE)return e=>n.handleFormValidation(e,t)}else if(400==t?.response?.status){let i=Z.getError(t.response.data);"object"!=typeof i&&(i=t.response.data),n.resetFormValidation(e);const a=Object.entries(i).filter(([t,n])=>{const i=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!i||(i.dispatchEvent(new CustomEvent("fhc-form-invalidate",{detail:n})),!1)}).map(t=>t[1]),s=e.querySelector("[data-fhc-form-error]");return void(s&&a.length?s.dispatchEvent(new CustomEvent("fhc-form-error",{detail:a})):a.forEach(n.alertError))}if(400==t?.response?.status){let e=Z.getError(t.response.data);n.alertError("object"==typeof e?Object.values(e):e)}else n.handleSystemError(t)}};t.config.globalProperties.$fhcAlert=n,t.provide("$fhcAlert",t.config.globalProperties.$fhcAlert)}},tt={install:(t,e)=>{if(t.config.globalProperties.$api)return;function n(t,e){Array.isArray(t)?t.forEach(e):Object.entries(t).forEach(([t,n])=>n.forEach(n=>e(n,t)))}t.config.globalProperties.$fhcAlert||t.use(X);let i={success:!0,fail:!0,combine:{form:["validation","general"],toast:["validation","general","not_found","site_failed"]},handler:{form(t,e){t.clearValidation(),e.forEach(e=>t.setFeedback(!1,e.messages||e.message))},async toast(e){const n=t.config.globalProperties.$p;if(!n)return Promise.reject("Phrasen plugin not loaded!");async function i(t){t=t.reduce((t,e)=>{switch(e.type){case"not_found":case"site_failed":e.message?t[e.message]=[e.url]:t._default=[e.url];break;case"general":t._default||(t._default=[]),t._default.push(e.message);break;case"validation":Object.entries(e.messages).forEach(([e,n])=>{t[e]||(t[e]=[]),Array.isArray(n)?t[e].push(...n):t[e].push(n)})}return t},{});let e=0;const i=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,i])=>{if("_default"==t){await n.loadCategory("dashboard");t='<dt class="d-none">'+n.t("dashboard/general")+"</dt>"}else t="<dt>"+t+"</dt>";return e+=i.length,t+"<dd>"+i.join("</dd><dd>")+"</dd>"}));return{counter:e,msgs:i}}let a,s;Array.isArray(e)?({counter:a,msgs:s}=await i(e)):({counter:a,msgs:s}=await Object.entries(e).reduce(async(t,[e,n])=>{const a=await t,{counter:s,msgs:r}=await i(n);return a.counter+=s,a.msgs.push("<dt>"+e+"</dt><dd><dl>"+r.join("")+"</dl></dd>"),a},Promise.resolve({counter:0,msgs:[]}))),await n.loadCategory("ui");const r=n.t("ui/n_errors",{n:a});t.config.globalProperties.$fhcAlert.alertDefault("error",r,"<dl>"+s.join("")+"</dl>",!0,!0)},php(e){n(e,(e,n)=>{var i="";switch(i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n?n+=": PHP "+e.severity:n="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("warn",n,i,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n?n+=": PHP "+e.severity:n="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("info",n,i,!0);break;default:i="Type: PHP "+e.severity+"\n\n"+i,n&&(i=n+"\n\n"+i),t.config.globalProperties.$fhcAlert.alertSystemError(i)}})},exception(e){n(e,(e,n)=>{var i="";n&&(i+=n+"\n\n"),i+="Type: "+e.class+"\n\n",i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(i)})},db(e){n(e,(e,n)=>{var i="";n&&(i+=n+"\n\n"),void 0!==e.heading&&(i+=e.heading+"\n\n"),void 0!==e.code&&(i+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(i+="SQL: "+e.sql+"\n\n"),void 0!==e.message?i+="Message: "+e.message+"\n\n":void 0!==e.messages&&(i+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(i+="Filename: "+e.filename+"\n"),void 0!==e.line&&(i+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(i)})},auth(e){n(e,(e,n)=>{n?n+=": "+e.message:n=e.message;var i="";i+="Controller name: "+e.controller+"\n",i+="Method name: "+e.method+"\n",i+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",n,i,!0)})}}};function a(t,e,n,i){if("string"==typeof t&&void 0===i)[e,n,i]=[t,e,n],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===n&&void 0===i&&(i=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},i?i.form=t:i={form:t}}return[e,n,i]}function s(t){if("string"==typeof t.data||t.data instanceof String)return s({data:t});const e=t.data;return delete t.data,e?(e.meta?e.meta.response=t:e.meta={response:t},e):{meta:{response:t},data:null}}function r(t){if(!1===t||"off"===t)return{...i,success:!1,fail:!1};if(!t||!0===t)return{...i};if("success"===t)return{...i,fail:!1};if("fail"===t)return{...i,success:!1};const{success:e,fail:n,handler:a,combine:s}=t;return t={...i},Object.entries({fail:n,success:e}).forEach(([e,n])=>{void 0!==n&&(t[e]=n)}),Object.entries({handler:a,combine:s}).forEach(([e,n])=>{void 0!==n&&(t[e]={...t[e],...n})}),t}function o(t){const e=r(t?.errorHandling);if(t?.form){const n=e.handler.form;e.handler={...e.handler,form:e=>n(t.form,e)}}else e.combine={...e.combine,form:[]};return e}function l(t){return t.response?404==t.response.status?[{type:"not_found",message:t.message,url:t.request.responseURL}]:null==t.response.data.errors?[]:t.response.data.errors:t.request?[{type:"site_failed",message:t.message,url:t.request.responseURL}]:[{type:"script",message:t.message}]}function d(t,e){const n={},i=[];if(null==e)return{};for(;e.length;)i.push(e.pop());for(var a of i){let i=a.type,r=null;for(var s in t.combine){let e=t.combine[s].includes(i),n=t.handler[s];if(e&&n&&(r=s,"form"==r))break}r&&(i=r);t.handler[i]?(n[i]||(n[i]=[]),Array.isArray(a)?n[i].push(...a):n[i].push(a)):e.push(a)}return n}void 0!==e?.errorHandling&&(i=r(e.errorHandling));const c=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});c.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,n])=>{if(n instanceof FileList)for(const i of n)t.FormData.append(e+(n.length>1?"[]":""),i);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(i=>t.FormData.append(e+(n.length>1?"[]":""),i)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),c.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$api._defaultErrorHandlers[n.type])(n,e.config))),s(e)),t=>{if("ERR_CANCELED"==t.code)return Promise.reject({handled:!0,...t});const e=o(t.config);if(!e.fail)return Promise.reject(t);const n=l(t),i=d(e,n);for(var a in i)e.handler[a](i[a]);return n.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>c.getUri({url:t}),get:(t,e,n,i)=>([e,n,i]=a(t,e,n,i),n&&(i?i.params=n:i={params:n}),c.get(e,i)),post:(t,e,n,i)=>([e,n,i]=a(t,e,n,i),c.post(e,n,i)),call(e,n,i){if(Array.isArray(e)){const s=t.config.globalProperties.$api;return Promise.allSettled(e.map((t,e)=>(Array.isArray(t)||(t=["#"+e,t]),s.call(t[1],{errorHeader:t[0],errorHandling:!1})))).then(t=>{const[,,e]=a(i,void 0,void 0,n||{}),s=o(e);if(!s.success&&!s.fail)return t;const r={};for(var c of t){const[t,e]="fulfilled"===c.status?[s.success,c.value]:[s.fail,c.reason];if(!t)return;const n=d(s,l(e));for(var u in n)r[u]?r[u][e.config.errorHeader]=n[u]:r[u]={[e.config.errorHeader]:n[u]}}for(var p in r)s.handler[p](r[p]);return t})}let{method:s,url:r,params:c,config:u}=e;return void 0!==n&&(u=n),s||(s="get"),s.toLowerCase&&(s=s.toLowerCase()),"get"==s?this.get(i,r,c,u):"post"==s?this.post(i,r,c,u):void console.error("FhcApi: method not allowed:",s)},getErrorHandler:t=>o(t)},t.provide("$api",t.config.globalProperties.$api)}},et={loadCategory:t=>({method:"get",url:"/api/frontend/v1/phrasen/loadModule/"+t}),setLanguage:(t,e)=>({method:"post",url:"/api/frontend/v1/phrasen/setLanguage",params:{categories:t,language:e}}),getLanguage:()=>({method:"get",url:"/api/frontend/v1/phrasen/getLanguage"}),getActiveDbLanguages:()=>({method:"get",url:"/api/frontend/v1/phrasen/getAllLanguages"})};const nt=Vue.reactive({}),it={};let at=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),st=Vue.computed(()=>at.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==at.value).LC_Time:null);const rt={user_language:at,user_locale:st,setLanguage(t){const e=Object.keys(nt);return this.config.globalProperties.$api.call(et.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{nt[t.category][t.phrase]=t.text}),at.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(it[t]||(it[t]=this.config.globalProperties.$api.call(et.loadCategory(t)).then(e=>e?.data?function(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}(e.data,t):{}).then(e=>{nt[t]=e})),it[t])},t_ref(t,e,n){return console.warn("deprecated"),Vue.computed(()=>this.t(t,e,n))},t(t,e,n){if(void 0===n&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(n=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input",t,e,n),"";let i=Vue.computed(()=>nt[t]?function(t,e,n){let i=nt[t][e];return i?(n&&(i=i.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),i):"<< PHRASE "+e+">>"}(t,e,n):"");return nt[t]||this.loadCategory(t),i.value}};var ot={install(t,e){t.config.globalProperties.$fhcApi||t.use(G),t.config.globalProperties.$api||t.use(tt),t.config.globalProperties.$p={t:rt.t,loadCategory:e=>rt.loadCategory.call(t,e),setLanguage:e=>rt.setLanguage.call(t,e),user_language:at,user_locale:st,t_ref:rt.t_ref},t.provide("$p",t.config.globalProperties.$p)}},lt=Object.freeze({__proto__:null,default:ot,user_locale:st});let dt=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.theme.name);const ct=FHC_JS_DATA_STORAGE_OBJECT.theme.modes,ut=t=>{if(!t)return;for(const t of ct)document.documentElement.classList.remove(t);dt.value=t,document.documentElement.classList.add(t),document.body.setAttribute("data-bs-theme",t);let e=document.querySelector('link[href*="primevue/resources/themes"]');"dark"==t?e.attributes.href.value=e.attributes.href.value.replace("bootstrap4-light-blue","bootstrap4-dark-blue"):("light"==t||e.attributes.href.value.includes("bootstrap4-dark-blue"))&&(e.attributes.href.value=e.attributes.href.value.replace("bootstrap4-dark-blue","bootstrap4-light-blue")),localStorage.setItem("theme",t)};var pt={install:(t,e)=>{document.documentElement.classList.add(dt.value),(()=>{let t=localStorage.getItem("theme");t&&ct.includes(t)||(t=ct[0],localStorage.setItem("theme",t)),ut(t)})(),t.config.globalProperties.$theme={theme_name:dt,theme_modes:ct,switchTheme:t=>{ut(t)}}}};const ht=t=>{const e=t.toString(16);return 1===e.length?"0"+e:e};function mt(t){return(299*parseInt(t.substring(1,3),16)+587*parseInt(t.substring(3,5),16)+114*parseInt(t.substring(5,7),16))/1e3>=128?"black":"white"}var gt={mounted(t,e){const n=window.getComputedStyle(t).backgroundColor;let i=new RegExp(/^rgba?\s*\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,?\s*([0-9]+.?[0-9]?)?\s*\)/),a=n.match(i);if(a){a.length<3&&console.error("Invalid RGB color format");let e=parseInt(a[1],10),n=parseInt(a[2],10),i=parseInt(a[3],10),s=`#${ht(e)}${ht(n)}${ht(i)}`;t.style.color=mt(s)}else t.style.color=mt(n)}};const ft={lehreinheit:{id:"lehreinheit_id",dragIcon:"fa-solid fa-chalkboard-user",extras:["stundenblockung"]},vevent:{id:"uid",dragIcon:"fa-solid fa-calendar",extras:["dtstart","dtend","summary"]},person:{id:"person_id",dragIcon:"fa-solid fa-user"},student:{id:"student_uid",dragIcon:"fa-solid fa-user-graduate"},prestudent:{id:"prestudent_id",dragIcon:"fa-solid fa-user-graduate text-muted"}},vt=Object.keys(ft);function bt(t){if(!t)return!1;if(Array.isArray(t))return t.every(bt);if(!t.type)return!1;if("-collection"==t.type.substr(-11)){if(!Object.prototype.hasOwnProperty.call(t,"values"))return!1;if(!vt.includes(t.type.substr(0,t.type.length-11)))return!1}else{if(!Object.prototype.hasOwnProperty.call(t,"id"))return!1;if(!vt.includes(t.type))return!1;if(ft[t.type].extras&&!ft[t.type].extras.every(e=>Object.prototype.hasOwnProperty.call(t,e)))return!1}return!0}function yt(t,e,n){let i=null;try{if(i=wt(t,n),!i)return null;if(!n&&Array.isArray(i)){if(i=i.filter(bt),!i.length)return null}else if(!bt(i))return null;if(e&&e.length)if(Array.isArray(i)){if(n&&!i.every(t=>e.includes(t.type)))return null;if(!n&&(i=i.filter(t=>e.includes(t.type)),!i.length))return null}else if(!e.includes(i.type))return null}catch(t){return null}return Array.isArray(i)&&1==i.length?i.find(Boolean):i}function wt(t,e){const n=[];for(const i of t.dataTransfer.types){if("application/fhc-"!=i.substr(0,16)){if(e)return null;continue}let a=i.substr(16),s=!1;if("-collection"==a.substr(-11)&&(a=a.substr(0,a.length-11),s=!0),!vt.includes(a)){if(e)return null;continue}let r=JSON.parse(t.dataTransfer.getData(i));s?n.push(...r.values):n.push(r)}return n.length?1==n.length?n[0]:n:null}var kt={...Object.keys(ft).reduce((t,e)=>(t["TYPE_"+e.toUpperCase()]=e,t),{}),isValidDragObject:bt,getValidTransferData:yt,isValidTransferData:function(t,e,n){return!!yt(t,e,n)},getTransferData:wt,convertToValidDragObject:function t(e,n){if(Array.isArray(e)){const i=e.map(t).filter(Boolean);if(!i.length)return;if(n&&i.length!=e.length)return;const a=i.reduce((t,e)=>(t[e.type]||(t[e.type]=[]),t[e.type].push(e),t),{});return Object.entries(a).map(([t,e])=>e.length>1?{type:t+"-collection",values:e}:e[0])}if(Object.prototype.hasOwnProperty.call(e,"type")&&bt(e))return e;const i=Object.entries(ft).find(([,t])=>!!Object.prototype.hasOwnProperty.call(e,t.id)&&!(t.extras&&!t.extras.every(t=>Object.prototype.hasOwnProperty.call(e,t))));if(!i)return;const[a,s]=i,r={};return r.type=a,r.id=e[s.id],s.extras&&s.extras.forEach(t=>r[t]=e[t]),r},setTransferData:function t(e,n,i=!1){if(i){const t=(Array.isArray(n)?n:[n]).map(t=>{const e=document.createElement("i"),n=document.createElement("span"),i=document.createElement("span");i.className="btn btn-outline-dark bg-light",n.className="small",ft[t.type]?(e.className=ft[t.type].dragIcon||"fa-solid fa-question",n.textContent=t.id):"-collection"==t.type.substr(-11)&&ft[t.type.substr(0,t.type.length-11)]?(i.style.boxShadow="3px 3px var(--bs-btn-border-color)",e.className=ft[t.type.substr(0,t.type.length-11)].dragIcon||"fa-solid fa-question",n.textContent="x"+t.values.length):(e.className="fa-solid fa-question",n.textContent=t.id||""),i.append(e);const a=document.createElement("div");return a.className="d-flex flex-column align-items-center gap-2 small",a.append(i,n),a}),i=document.createElement("div");i.className="d-flex flex-row gap-2 small",i.append(...t),document.body.append(i),e.dataTransfer.setDragImage(i,-25,0),requestAnimationFrame(()=>{document.body.removeChild(i)})}if(Array.isArray(n))return n.forEach(n=>t(e,n));e.dataTransfer.setData("application/fhc-"+n.type,JSON.stringify(n))},eventHasTypes:function(t,e,n){return e&&e.length||(e=vt),e=e.map(t=>"application/fhc-"+t),!![...t.dataTransfer.types].length&&(n?[...t.dataTransfer.types].every(t=>e.includes(t)):e.some(e=>[...t.dataTransfer.types].includes(e)))},bindDragEnterLeave:function(t,e,n){let i=!1,a=!0;function s(n){i=!1,a=!0,window.addEventListener("dragenter",o,!0),window.addEventListener("dragleave",l,!0),window.addEventListener("drop",d,!0),e(n),t.removeEventListener("dragenter",s)}function r(e,i){window.removeEventListener("dragenter",o,!0),window.removeEventListener("dragleave",l,!0),window.removeEventListener("drop",d,!0),n(e,i),t.addEventListener("dragenter",s)}function o(e){a=!1,t==e.target||t.contains(e.target)?i=!0:r(e)}function l(e){if(t==e.target||t.contains(e.target)){if(i)return void(i=!1)}else if(a)return void(a=!1);r(e)}function d(t){r(t,!0)}return t.addEventListener("dragenter",s),()=>{t.removeEventListener("dragenter",s)}}},_t={mounted(t,e,n){if("draggable"==e.arg)t.addEventListener("update-my-value",t=>{t.preventDefault(),e.value=t.detail.item}),t.addEventListener("dragstart",n=>{t.dispatchEvent(new CustomEvent("calendar-dragstart",{cancelable:!0,bubbles:!0,detail:{item:e.value,x:n.offsetX/t.offsetWidth,y:n.offsetY/t.offsetHeight,originalEvent:n}}))}),t.addEventListener("dragend",n=>{t.dispatchEvent(new CustomEvent("calendar-dragend",{cancelable:!0,bubbles:!0,detail:{item:e.value,originalEvent:n}}))});else if("dropcage"==e.arg){let e=null;t.addEventListener("dragover",n=>{if(!e)return e=t.getBoundingClientRect(),t.dispatchEvent(new CustomEvent("calendar-dragenter",{detail:{originalEvent:n}}))}),window.addEventListener("dragleave",n=>{if(!e)return;let i;return i=void 0===n.clientX?{x:n.pageX+document.documentElement.scrollLeft,y:n.pageY+document.documentElement.scrollTop}:{x:n.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,y:n.clientY+document.body.scrollTop+document.documentElement.scrollTop},i.x>e.left+e.width-1||i.x<e.left||i.y>e.top+e.height-1||i.y<e.top?(e=null,t.dispatchEvent(new CustomEvent("calendar-dragleave",{detail:{originalEvent:n}}))):void 0}),window.addEventListener("drop",n=>{if(e)return e=null,t.dispatchEvent(new CustomEvent("calendar-dragleave",{detail:{originalEvent:n}}))})}else"dropzone"==e.arg&&t.addEventListener(e.modifiers.once?"dragenter":"dragover",n=>{const i=e.value instanceof Function?e.value(n):e.value,a=i.timestamp?i:{timestamp:i};t.dispatchEvent(new CustomEvent("calendar-dragchange",{cancelable:!0,bubbles:!0,detail:a}))})},updated(t,e,n,i){"draggable"==e.arg&&t.dispatchEvent(new CustomEvent("update-my-value",{cancelable:!0,detail:{item:e.value}}))}},At={name:"CalendarDragAndDrop",directives:{CalDnd:_t},provide(){return{events:Vue.computed(()=>this.correctedEvents),backgrounds:Vue.computed(()=>this.backgrounds),dropAllowed:Vue.computed(()=>this.dragging&&this.dropAllowed)}},inject:{mode:"mode",dropableEvents:"dropableEvents"},props:{events:Array,backgrounds:Array},emits:["drop"],data:()=>({dragging:!1,allowed:!1,draggedInternalEvent:null,draggedExternalEvent:null,targetTimestamp:0,targetGridEnds:null,dropAllowed:!1,shadowPreview:!1}),computed:{correctedEvents(){if(this.dragging){if(this.draggedInternalEvent){const t=this.events.findIndex(t=>t.id==this.draggedInternalEvent.id);return this.previewEvent&&!this.shadowPreview?this.events.toSpliced(t,1,this.previewEvent):this.events.toSpliced(t,1)}if(this.previewEvent&&!this.shadowPreview)return[...this.events,this.previewEvent]}return this.events},correctedBackgrounds(){return this.dragging&&this.shadowPreview?[...this.backgrounds,{start:new Date(this.targetTimestamp),class:"shadow-preview"}]:this.backgrounds},previewEvent(){if(!this.dragging||!this.dropAllowed)return null;if(!this.targetTimestamp)return null;const t=this.draggedInternalEvent||this.draggedExternalEvent;if(!t)return null;let e=t.end-t.start;return this.targetGridEnds&&(e=this.targetGridEnds.find(t=>t>=this.targetTimestamp+e)-this.targetTimestamp),{orig:t.orig,start:this.targetTimestamp,end:this.targetTimestamp+e}}},methods:{onDragstart(t){const e=kt.convertToTransferData(t.detail.item.orig);kt.isValidDragObject(e)&&(kt.setTransferData(t.detail.originalEvent,e),this.draggedInternalEvent=t.detail.item)},onDragend(){this.draggedInternalEvent=null,this.dragging=!1},onDragenter(t){if(this.dragging=!0,this.draggedInternalEvent)this.dropAllowed=this.dropableEvents(this.draggedInternalEvent,this.mode);else{const e=kt.getValidTransferData(t.detail.originalEvent);this.draggedExternalEvent=e?{id:e.id,type:e.type,start:e.isostart?luxon.DateTime.fromISO(e.isostart).setZone(this.timezone):luxon.DateTime.local().setZone(this.timezone),end:e.isoend?luxon.DateTime.fromISO(e.isoend).setZone(this.timezone):luxon.DateTime.local().setZone(this.timezone),orig:e}:null,this.dropAllowed=this.dropableEvents(e,this.mode)}},onDragleave(){this.dragging=!1},onDragchange(t){this.targetTimestamp=t.detail.timestamp,this.targetGridEnds=t.detail.ends||null},onDrop(t){this.dragging&&this.dropAllowed&&(this.$emit("drop",t,this.previewEvent.start,this.previewEvent.end),this.dropAllowed=!1,this.dragging=!1)}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-draganddrop"\n\t\t@calendar-dragstart="onDragstart"\n\t\t@calendar-dragend="onDragend"\n\t\tv-cal-dnd:dropcage\n\t\t@calendar-dragenter="onDragenter"\n\t\t@calendar-dragleave="onDragleave"\n\t\t@calendar-dragchange="onDragchange"\n\t\t@drop="onDrop"\n\t>\n\t\t<slot />\n\t</div>\n\t'},$t={name:"CalendarHeader",components:{DatePicker:{name:"CalendarHeaderDatepicker",components:{VueDatePicker:VueDatePicker},inject:["locale","timezone"],props:{date:{type:luxon.DateTime,required:!0},mode:{type:String,required:!0},listLength:{type:Number,default:7}},emits:["update:date"],computed:{convertedDate(){return this.date.setZone(this.timezone).setZone("local",{keepLocalTime:!0})},current(){switch(this.mode){case"month":return{month:this.convertedDate.month-1,year:this.convertedDate.year};case"list":return[this.convertedDate.startOf("day").ts,this.convertedDate.startOf("day").plus({days:this.listLength}).ts-1];case"week":return[this.convertedDate.startOf("week",{useLocaleWeeks:!0}).ts,this.convertedDate.endOf("week",{useLocaleWeeks:!0}).ts];case"day":return this.convertedDate;default:return null}},title(){switch(this.mode){case"month":return this.date.toLocaleString({month:"long",year:"numeric"});case"week":var t=this.date.localWeekYear,e=this.date.toFormat("nn");return this.$p.t("calendar/year_kw",{year:t,week:e});case"list":return this.date.toLocaleString(luxon.DateTime.DATE_FULL)+"-"+this.date.plus({days:this.listLength-1}).toLocaleString(luxon.DateTime.DATE_FULL);case"day":return this.date.toLocaleString(luxon.DateTime.DATE_FULL);default:return"View not Supported"}},weekStart(){return luxon.Info.getStartOfWeek(this.date)%7}},methods:{update(t){let e;switch(this.mode){case"month":t.month++,e=luxon.DateTime.fromObject(t).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;case"list":case"week":e=luxon.DateTime.fromJSDate(t[0]).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;case"day":e=luxon.DateTime.fromJSDate(t).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;default:return}this.$emit("update:date",e)},weekNumbers(t){return luxon.DateTime.fromJSDate(t,{locale:this.locale}).localWeekNumber}},template:'\n\t<vue-date-picker\n\t\t:model-value="current"\n\t\t@update:model-value="update"\n\t\t:format="() => title"\n\t\t:month-picker="mode == \'month\'"\n\t\t:week-picker="mode == \'week\'"\n\t\t:range="mode == \'list\' ? { autoRange: listLength - 1 } : false"\n\t\t:text-input="mode == \'day\'"\n\t\t:week-start="weekStart"\n\t\t:week-numbers="{ type: weekNumbers }"\n\t\t:clearable="false"\n\t\t:enable-time-picker="false"\n\t\t:config="{ keepActionRow: mode != \'month\' }"\n\t\t:action-row="{ showSelect: false, showCancel: false, showNow: mode != \'month\', showPreview: false }"\n\t\tauto-apply\n\t\tsix-weeks\n\t\tteleport\n\t\t:locale="locale"\n\t\t:now-button-label="$p.t(\'calendar/today\')"\n\t\t:week-num-name="$p.t(\'calendar/kw\')"\n\t/>\n\t'}},props:{date:{type:luxon.DateTime,required:!0},mode:{type:String,required:!0},modeOptions:{type:Object,default:{}},btnMonth:Boolean,btnWeek:Boolean,btnDay:Boolean,btnList:Boolean},emits:["next","prev","click:mode","update:date","update:mode"],data:()=>({open:!1}),methods:{clickMode(t,e){this.$emit("click:mode",t),t.defaultPrevented||this.$emit("update:mode",e)}},template:'\n\t<div class="fhc-calendar-base-header">\n\t\t<div class="header-actions">\n\t\t\t<div class="header-userdefined">\n\t\t\t\t<slot />\n\t\t\t</div>\n\t\t\t<div class="header-modes">\n\t\t\t\t<div class="d-flex gap-1 justify-content-end" role="group">\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-if="btnMonth"\n\t\t\t\t\t\ttype="button"\n\t\t\t\t\t\tclass="btn btn-outline-secondary"\n\t\t\t\t\t\t:class="{active: mode === \'month\'}"\n\t\t\t\t\t\t@click="clickMode($event, \'month\')"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class="fa fa-calendar-days"></i>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-if="btnWeek"\n\t\t\t\t\t\ttype="button"\n\t\t\t\t\t\tclass="btn btn-outline-secondary"\n\t\t\t\t\t\t:class="{active: mode === \'week\'}"\n\t\t\t\t\t\t@click="clickMode($event, \'week\')"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class="fa fa-calendar-week"></i>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-if="btnDay"\n\t\t\t\t\t\ttype="button"\n\t\t\t\t\t\tclass="btn btn-outline-secondary"\n\t\t\t\t\t\t:class="{active: mode === \'day\'}"\n\t\t\t\t\t\t@click="clickMode($event, \'day\')"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class="fa fa-calendar-day"></i>\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-if="btnList"\n\t\t\t\t\t\ttype="button"\n\t\t\t\t\t\tclass="btn btn-outline-secondary"\n\t\t\t\t\t\t:class="{active: mode === \'list\'}"\n\t\t\t\t\t\t@click="clickMode($event, \'list\')"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class="fa fa-table-list"></i>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class="header-picker">\n\t\t\t<div class="btn-group" role="group">\n\t\t\t\t<button\n\t\t\t\t\tclass="btn btn-outline-secondary border-0"\n\t\t\t\t\t@click="$emit(\'prev\')"\n\t\t\t\t\t:disabled="open"\n\t\t\t\t>\n\t\t\t\t\t<i class="fa fa-chevron-left"></i>\n\t\t\t\t</button>\n\t\t\t\t<date-picker\n\t\t\t\t\t:mode="mode"\n\t\t\t\t\t:date="date"\n\t\t\t\t\t@update:date="$emit(\'update:date\', $event)"\n\t\t\t\t\t@open="open = true"\n\t\t\t\t\t@closed="open = false"\n\t\t\t\t\t:list-length="modeOptions.length"\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\tclass="btn btn-outline-secondary border-0"\n\t\t\t\t\t@click="$emit(\'next\')"\n\t\t\t\t\t:disabled="open"\n\t\t\t\t>\n\t\t\t\t\t<i class="fa fa-chevron-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t'},xt={name:"CalendarSlider",inject:{time:{from:"sliderTime",default:".3s"}},emits:["slid"],data:()=>({target:0,extrasAfter:0,extrasBefore:0,running:!1,promiseResolve:null}),computed:{itemsAfter(){return[...Array(this.extrasAfter)].map((t,e)=>1+e)},itemsBefore(){return[...Array(this.extrasBefore)].map((t,e)=>e-this.extrasBefore)},styleSlider(){const t={position:"absolute",top:0,left:0,width:"100%",height:"100%"};return this.running&&(t.left=100*-this.target+"%",t.transition="left "+this.time+" ease-in-out"),t},styleBefore(){return{position:"absolute",top:0,height:"100%",display:"flex",right:"100%",width:100*this.extrasBefore+"%"}},styleAfter(){return{position:"absolute",top:0,height:"100%",display:"flex",left:"100%",width:100*this.extrasAfter+"%"}}},methods:{prevPage(){return this.slidePages(-1)},nextPage(){return this.slidePages(1)},slidePages(t){return new Promise(e=>{this.promiseResolve=e,this.running=!0;const n=this.target+t;n>0?this.extrasAfter<n&&(this.extrasAfter=n):n<0&&-this.extrasBefore>n&&(this.extrasBefore=-n),this.target=n})},endSlide(){this.promiseResolve&&(this.promiseResolve(this.target),this.promiseResolve=null),this.$emit("slid",this.target),this.running=!1,this.target=0,this.extrasAfter=this.extrasBefore=0}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-slider h-100"\n\t\tstyle="position:relative;overflow:hidden"\n\t>\n\t\t<div\n\t\t\t:style="styleSlider"\n\t\t\t@transitionend="endSlide"\n\t\t>\n\t\t\t<div :style="styleBefore">\n\t\t\t\t<div\n\t\t\t\t\tv-for="i in itemsBefore"\n\t\t\t\t\t:key="i"\n\t\t\t\t\tstyle="height:100%;width:100%"\n\t\t\t\t>\n\t\t\t\t\t<slot :offset="i" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div :style="styleAfter">\n\t\t\t\t<div\n\t\t\t\t\tv-for="i in itemsAfter"\n\t\t\t\t\t:key="i"\n\t\t\t\t\tstyle="height:100%;width:100%"\n\t\t\t\t>\n\t\t\t\t\t<slot :offset="i" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div style="height:100%;width:100%">\n\t\t\t\t<slot :offset="0" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t'};const St=[];function zt(t,e,n){const i=St.findIndex(e=>e.el==t);i>=0&&(t.removeEventListener("click",St[i].listener),St.splice(i,1));const a=t=>{t.preventDefault(),t.stopPropagation();const i=new CustomEvent("cal-click",{cancelable:!0,bubbles:!0,detail:{source:e,value:n}});t.target.dispatchEvent(i)};St.push({el:t,listener:a}),t.addEventListener("click",a)}var Tt={mounted(t,e,n){"container"==e.arg?t.addEventListener("cal-click",t=>{const n=new Event("click:"+t.detail.source,{cancelable:!0});if(e.instance.$emit("click:"+t.detail.source,n,t.detail.value),!n.defaultPrevented){const e=new CustomEvent("cal-click-default",{cancelable:!0,bubbles:!0,detail:t.detail});t.target.dispatchEvent(e)}}):zt(t,e.arg,e.value)},updated(t,e,n,i){"container"!=e.arg&&zt(t,e.arg,e.value)}},Dt={name:"CalendarBase",components:{BaseDraganddrop:At,BaseHeader:$t,BaseSlider:xt,BsModal:s},directives:{CalClick:Tt},provide(){return{locale:Vue.computed(()=>this.locale),timezone:Vue.computed(()=>this.timezone),timeGrid:Vue.computed(()=>this.timeGrid),draggableEvents:Vue.computed(()=>this.draggableEvents?Array.isArray(this.draggableEvents)?t=>this.draggableEvents.includes(t.type):this.draggableEvents instanceof Function?this.draggableEvents:()=>!0:()=>!1),dropableEvents:Vue.computed(()=>this.onDrop?Array.isArray(this.dropableEvents)?t=>this.dropableEvents.includes(t.type):this.dropableEvents instanceof Function?this.dropableEvents:()=>!0:()=>!1),hasDragoverFunc:Vue.computed(()=>this.onDragover),mode:Vue.computed(()=>this.mode)}},props:{locale:{type:String,default:"de"},timezone:{type:String,required:!0},date:{type:[Date,String,Number,luxon.DateTime],default:t=>luxon.DateTime.now().setZone(t.timezone).startOf("day")},modes:{type:Object,required:!0,default:{}},mode:String,modeOptions:Object,events:{type:Array,default:[]},backgrounds:{type:Array,default:[]},showBtns:Boolean,btnMonth:{type:Boolean,default:void 0},btnWeek:{type:Boolean,default:void 0},btnDay:{type:Boolean,default:void 0},btnList:{type:Boolean,default:void 0},timeGrid:Array,draggableEvents:[Boolean,Array,Function],dropableEvents:[Boolean,Array,Function],onDragover:Function,onDrop:Function},emits:["click:next","click:prev","click:mode","click:event","click:day","click:week","update:date","update:mode","update:range","drop"],data:()=>({internalView:null,internalDate:null,modalEvent:null}),computed:{convertedEvents(){return this.events.map(t=>({id:t.type+t[t.type+"_id"],type:t.type,start:luxon.DateTime.fromISO(t.isostart).setZone(this.timezone),end:luxon.DateTime.fromISO(t.isoend).setZone(this.timezone),orig:t}))},convertedBackgrounds(){return this.backgrounds.map(t=>{const e={...t};return e.start&&(Number.isInteger(e.start)?e.start=luxon.DateTime.fromMillis(e.start,{zone:this.timezone,locale:this.locale}):e.start instanceof Date?e.start=luxon.DateTime.fromJSDate(e.start,{zone:this.timezone,locale:this.locale}):("string"==typeof e.start||e.start instanceof String)&&(e.start=luxon.DateTime.fromISO(e.start,{zone:this.timezone,locale:this.locale}))),e.end&&(Number.isInteger(e.end)?e.end=luxon.DateTime.fromMillis(e.end,{zone:this.timezone,locale:this.locale}):e.end instanceof Date?e.end=luxon.DateTime.fromJSDate(e.end,{zone:this.timezone,locale:this.locale}):("string"==typeof e.end||e.end instanceof String)&&(e.end=luxon.DateTime.fromISO(e.end,{zone:this.timezone,locale:this.locale}))),e})},sDate(){return this.date instanceof luxon.DateTime?this.date:luxon.DateTime.fromJSDate(new Date(this.date)).setZone(this.timezone)},cDate:{get(){return(this.internalDate?this.internalDate:this.sDate).setLocale(this.locale)},set(t){this.internalDate=t,this.$emit("update:date",t,this.cMode)}},sMode(){let t=this.mode;return t&&(t=t.toLowerCase()),t&&this.modes[t]||(t=Object.keys(this.modes).find(Boolean)),t||""},cMode:{get(){return this.internalView?this.internalView:this.sMode},set(t){this.internalView=t,this.$emit("update:mode",t,this.cDate)}}},watch:{sDate(t,e){this.sDate.isValid&&!this.sDate.hasSame(this.internalDate,"day")&&(this.internalDate=this.sDate)},sMode(){this.sMode&&(this.internalView=this.sMode)}},methods:{clickPrev(){const t=new Event("click:prev",{cancelable:!0});this.$emit("click:prev",t),t.defaultPrevented||this.$refs.mode.prevPage()},clickNext(){const t=new Event("click:next",{cancelable:!0});this.$emit("click:next",t),t.defaultPrevented||this.$refs.mode.nextPage()},handleClickDefaults(t){switch(t.detail.source){case"day":"day"!=this.cMode&&this.modes.day&&(t.stopPropagation(),this.cDate=t.detail.value,this.cMode="day");break;case"week":"week"!=this.cMode&&this.modes.week&&(t.stopPropagation(),this.cDate=luxon.DateTime.fromObject({localWeekNumber:t.detail.value.number,localWeekYear:t.detail.value.year},{zone:this.cDate.zoneName,locale:this.cDate.locale}),this.cMode="week")}},onDropItem(t,e,n){this.$emit("drop",t,e,n)},showEventModal(t){this.modalEvent=t,this.$refs.modal.show()},hideEventModal(){this.modalEvent&&(this.modalEvent.closeFn=void 0),this.$refs.modal.hide(),this.modalEvent=null},onModalHidden(){this.modalEvent.closeFn&&this.modalEvent.closeFn()}},beforeUnmount(){this.hideEventModal()},template:'\n\t<div class="fhc-calendar-base h-100">\n\t\t<base-draganddrop\n\t\t\tclass="card h-100"\n\t\t\t:events="convertedEvents"\n\t\t\t:backgrounds="convertedBackgrounds"\n\t\t\t@drop="onDropItem"\n\t\t\tv-cal-click:container\n\t\t\[email protected]="handleClickDefaults"\n\t\t>\n\t\t\t<base-header\n\t\t\t\tclass="card-header"\n\t\t\t\tv-model:date="cDate"\n\t\t\t\tv-model:mode="cMode"\n\t\t\t\t@prev="clickPrev"\n\t\t\t\t@next="clickNext"\n\t\t\t\t@click:mode="$emit(\'click:mode\', $event)"\n\t\t\t\t:btn-day="!!modes[\'day\'] && (btnDay || (showBtns && btnDay !== false))"\n\t\t\t\t:btn-week="!!modes[\'week\'] && (btnWeek || (showBtns && btnWeek !== false))"\n\t\t\t\t:btn-month="!!modes[\'month\'] && (btnMonth || (showBtns && btnMonth !== false))"\n\t\t\t\t:btn-list="!!modes[\'list\'] && (btnList || (showBtns && btnList !== false))"\n\t\t\t\t:mode-options="modeOptions ? modeOptions[cMode] : undefined"\n\t\t\t>\n\t\t\t\t<slot name="actions" />\n\t\t\t</base-header>\n\t\t\t<component\n\t\t\t\t:is="modes ? modes[cMode] : null || \'div\'"\n\t\t\t\tref="mode"\n\t\t\t\tv-model:current-date="cDate"\n\t\t\t\t@update:range="$emit(\'update:range\', $event)"\n\t\t\t\t@request-modal-open="showEventModal"\n\t\t\t\t@request-modal-close="hideEventModal"\n\t\t\t\tv-bind="modeOptions ? modeOptions[cMode] : null || {}"\n\t\t\t>\n\t\t\t\t<template v-slot="slot"><slot v-bind="slot" /></template>\n\t\t\t</component>\n\t\t</base-draganddrop>\n\t\t<bs-modal ref="modal" dialog-class="modal-lg" body-class="" @hidden-bs-modal="onModalHidden">\n\t\t\t<template #title>\n\t\t\t\t<slot v-if="modalEvent" v-bind="{mode: \'eventheader\', event: modalEvent.event}" />\n\t\t\t</template>\n\t\t\t<template #default>\n\t\t\t\t<slot v-if="modalEvent" v-bind="{mode: \'event\', event: modalEvent.event}" />\n\t\t\t</template>\n\t\t</bs-modal>\n\t</div>\n\t'},Et={getRoomInfo:(t,e,n)=>({method:"post",url:"/api/frontend/v1/LvPlan/getRoomplan",params:{ort_kurzbz:t,start_date:e,end_date:n}}),getLvPlan:(t,e,n)=>({method:"get",url:"/api/frontend/v1/LvPlan/getLvPlan",params:{start_date:t,end_date:e,lv_id:n}}),eventsPersonal:(t,e)=>({method:"post",url:"/api/frontend/v1/lvPlan/eventsPersonal",params:{start_date:t,end_date:e}}),eventsLv:(t,e,n)=>({method:"post",url:"/api/frontend/v1/lvPlan/eventsLv",params:{lv_id:t,start_date:e,end_date:n}}),getStunden:()=>({method:"get",url:"/api/frontend/v1/LvPlan/Stunden"}),getOrtReservierungen:(t,e,n)=>({method:"post",url:`/api/frontend/v1/LvPlan/getReservierungen/${t}`,params:{start_date:e,end_date:n}}),getLvPlanReservierungen:(t,e)=>({method:"post",url:"/api/frontend/v1/LvPlan/getReservierungen",params:{start_date:t,end_date:e}}),getLehreinheitStudiensemester:t=>({method:"get",url:`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`}),studiensemesterDateInterval:t=>({method:"get",url:`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`}),LvPlanEvents:(t,e,n)=>({method:"post",url:"/api/frontend/v1/LvPlan/LvPlanEvents",params:{start_date:t,end_date:e,lv_id:n}}),getLv:t=>({method:"get",url:"/api/frontend/v1/LvPlan/getLv/"+t})};var Ct={name:"GridLineEvent",directives:{CalDnd:_t,CalClick:Tt},inject:{draggableEvents:"draggableEvents",mode:"mode"},props:{event:{type:Object,required:!0,validator:t=>t.start&&t.end&&t.orig}},computed:{isHeaderOrFooter(){return["header","footer"].includes(this.event.orig)},draggable(){return!this.isHeaderOrFooter&&this.draggableEvents(this.event.orig,this.mode)},classes(){const t=[];return this.isHeaderOrFooter?t.push("event-"+this.event.orig):(this.event.startsHere&&t.push("event-begin"),this.event.endsHere&&t.push("event-end")),t}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-grid-line-event event"\n\t\t:class="classes"\n\t\tstyle="z-index: 1"\n\t\t:draggable="draggable"\n\t\tv-cal-dnd:draggable="event"\n\t\tv-cal-click:event="isHeaderOrFooter ? event : event.orig"\n\t>\n\t\t<slot :event="isHeaderOrFooter ? event : event.orig">\n\t\t\t{{ event.orig }}\n\t\t</slot>\n\t</div>\n\t'},Ot={name:"CalendarGrid",components:{GridLine:{name:"GridLine",components:{LineEvent:Ct,LineBackground:{name:"GridLineBackground",inject:{flipAxis:"flipAxis"},props:{start:{type:luxon.DateTime,required:!0},end:{type:luxon.DateTime,required:!0},background:{type:Object,required:!0,validator:t=>!(!t.start&&!t.end)&&((!t.start||t.start instanceof luxon.DateTime)&&(!t.end||t.end instanceof luxon.DateTime))}},computed:{styles(){if(!this.background.endsHere&&!this.background.startsHere)return this.background.style;const t=(this.end.ts-this.start.ts)/100;let e={};return this.background.startsHere&&(e[this.flipAxis?"left":"top"]=this.background.start.diff(this.start)/t+"%"),this.background.endsHere&&(e[this.flipAxis?"right":"bottom"]=this.end.diff(this.background.end)/t+"%"),this.background.style?[this.background.style,e]:e},classes(){if(!this.background.endsHere&&!this.background.startsHere)return this.background.class;const t=[];return this.background.class&&t.push(this.background.class),this.background.startsHere&&t.push("bg-begin"),this.background.endsHere&&t.push("bg-end"),t}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-grid-line-background"\n\t\t:class="classes"\n\t\tstyle="position:absolute;inset:0;z-index:0"\n\t\t:style="styles"\n\t\t:title="background.title"\n\t>\n\t\t<span v-if="background.label">{{ background.label }}</span>\n\t</div>\n\t'}},inject:{axisRow:"axisRow"},props:{date:{type:luxon.DateTime,required:!0},start:{type:luxon.DateTime,required:!0},end:{type:luxon.DateTime,required:!0},events:{type:Array,default:[]},backgrounds:{type:Array,default:[]}},computed:{eventsWithRowInfo(){const t=[];return this.events.forEach(e=>{const n=[1,-1];e.startsHere&&(n[0]="t_"+e.start.diff(this.date).toMillis()),e.endsHere&&(n[1]="t_"+e.end.diff(this.date).toMillis()),t.push({...e,rows:n})}),t}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-grid-line"\n\t\tstyle="position:relative;display:grid;grid-auto-flow:dense"\n\t\t:style="\'grid-template-\' + axisRow + \'s:subgrid\'"\n\t>\n\t\t<line-background\n\t\t\tv-for="bg in backgrounds"\n\t\t\t:start="start"\n\t\t\t:end="end"\n\t\t\t:background="bg"\n\t\t></line-background>\n\t\t<line-event\n\t\t\tv-for="(event, i) in eventsWithRowInfo"\n\t\t\t:key="i"\n\t\t\t:style="\'grid-\' + axisRow + \': \' + event.rows.join(\'/\')"\n\t\t\t:event="event"\n\t\t>\n\t\t\t<template v-slot="slot">\n\t\t\t\t<slot name="event" v-bind="slot" />\n\t\t\t</template>\n\t\t</line-event>\n\t\t<slot name="dropzone" />\n\t</div>\n\t'},GridLineEvent:Ct},directives:{CalDnd:_t},inject:{originalEvents:"events",originalBackgrounds:"backgrounds",dropAllowed:"dropAllowed"},provide(){return{flipAxis:Vue.computed(()=>this.flipAxis),axisRow:Vue.computed(()=>this.axisRow)}},props:{axisMain:{type:Array,required:!0,validator:t=>t.every(t=>t instanceof luxon.DateTime)},axisParts:{type:Array,required:!0,validator:t=>t.every(t=>t instanceof luxon.Duration||Number.isInteger(t)||(t.start instanceof luxon.Duration||Number.isInteger(t.start))&&(t.end instanceof luxon.Duration||Number.isInteger(t.end)))},flipAxis:Boolean,allDayEvents:Boolean,axisMainCollapsible:Boolean,snapToGrid:Boolean},data:()=>({dragging:!1,resizeObserver:null,mutationObserver:null,userScroll:!0}),computed:{axisRow(){return this.flipAxis?"column":"row"},axisCol(){return this.flipAxis?"row":"column"},axisPartsWithBreaks(){return this.axisParts.reduce((t,e,n)=>{const i=e.start||e,a=e.end;if(t.length){const e=t.pop();Array.isArray(e)?t.push({start:e[0],end:i,index:e[1]}):e!=i&&t.push({start:e,end:i})}return a?(t.push({start:i,end:a,index:n}),t.push(a)):t.push([i,n]),t},[]).slice(0,-1)},axisPartsSave(){return this.axisParts[this.axisParts.length-1].end?this.axisParts:this.axisParts.slice(0,-1)},start(){return this.axisPartsWithBreaks[0].start},end(){return this.axisPartsWithBreaks[this.axisPartsWithBreaks.length-1].end},ends(){const t=[],e=this.axisPartsWithBreaks.filter(t=>void 0!==t.index).map(t=>t.end);for(var n of this.axisMain)for(var i of e)t.push(n.plus(i));return t},axisMainBorders(){return this.axisMain.reduce((t,e)=>t.concat([e.plus(this.start),e.plus(this.end)]),[])},eventsAllDay(){return this.allDayEvents?this.mapIntoMainAxis(this.originalEvents.filter(t=>t.orig.allDayEvent)):[]},eventsNormal(){return this.allDayEvents?this.mapIntoMainAxis(this.originalEvents.filter(t=>!t.orig.allDayEvent)):this.events},events(){return this.mapIntoMainAxis(this.originalEvents)},backgrounds(){return this.mapIntoMainAxis(this.originalBackgrounds)},hasValidEvents(){return this.events.find(t=>t.length)},styleGridCols(){let t="repeat("+this.axisMain.length+", 1fr)";return this.axisMainCollapsible&&this.hasValidEvents&&(t=this.events.map(t=>t.length?"1fr":"var(--fhc-calendar-axis-collapsible, .5fr)").join(" ")),t},styleGridRows(){const t={};return this.axisPartsWithBreaks.forEach(e=>{let n=e.start.toMillis();t[n]||(t[n]=["t_"+n]),void 0!==e.index&&t[n].push("ps_"+e.index),n=e.end.toMillis(),t[n]||(t[n]=["t_"+n]),void 0!==e.index&&t[n].push("pe_"+e.index)}),this.eventsNormal.forEach((e,n)=>{let i=this.axisMain[n];e.forEach(e=>{if(e.startsHere||e.endsHere){if(e.startsHere){let n=e.start.diff(i).toMillis();t[n]||(t[n]=["t_"+n,"e_"+n])}if(e.endsHere){let n=e.end.diff(i).toMillis();t[n]||(t[n]=["t_"+n,"e_"+n])}}})}),Object.keys(t).sort((t,e)=>parseInt(t)-parseInt(e)).map((e,n,i)=>{let a=i[n+1];return a?"["+t[e].join(" ")+"] "+(a-e)+"fr":(t[e].push("end"),"["+t[e].join(" ")+"]")}).join(" ")}},methods:{mapIntoMainAxis(t){const e=Array.from({length:this.axisMain.length},()=>Array());return t.forEach(t=>{const n=t.start||this.axisMainBorders[0].plus(-1),i=t.end||this.axisMainBorders[this.axisMainBorders.length-1].plus(1);for(var a=0;a<this.axisMain.length;a++){let s=this.axisMainBorders[2*a],r=this.axisMainBorders[2*a+1];if(t.orig?.allDayEvent&&(s=s.startOf("day"),r=r.endOf("day")),n<r&&i>s){const o=n>=s,l=i<=r;e[a].push({...t,startsHere:o,endsHere:l})}}}),e},getPageTop(t){let e=t.offsetTop;return t.offsetParent&&(e+=this.getPageTop(t.offsetParent)),e},getPageLeft(t){let e=t.offsetLeft;return t.offsetParent&&(e+=this.getPageLeft(t.offsetParent)),e},getTimestampFromMouse(t,e){let n,i;return this.flipAxis?(n=t.pageX-this.getPageLeft(this.$refs.body)+this.$refs.main.scrollLeft,i=n/this.$refs.body.offsetWidth):(n=t.pageY-this.getPageTop(this.$refs.body)+this.$refs.main.scrollTop,i=n/this.$refs.body.offsetHeight),e+this.start+Math.floor((this.end-this.start)*i)},enableAutoScroll(){this.resizeObserver||(this.resizeObserver=new ResizeObserver(this.scrollToEarliestEvent)),this.resizeObserver.observe(this.$refs.body),this.mutationObserver||(this.mutationObserver=new MutationObserver(t=>{t.some(t=>t.addedNodes.length&&[].some.call(t.addedNodes,t=>t.matches&&t.matches(".fhc-calendar-base-grid-line-event")))&&this.scrollToEarliestEvent()})),this.mutationObserver.observe(this.$refs.body,{subtree:!0,childList:!0}),this.scrollToEarliestEvent()},disableAutoScroll(){this.resizeObserver&&this.resizeObserver.disconnect(),this.resizeObserver=null,this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=null},scrollToEarliestEvent(){const t=this.$refs.scroller.querySelectorAll(".fhc-calendar-base-grid-line-event");let e=[0,null];for(var n of t.values()){const t=n.offsetTop;(!e[1]||t<e[0])&&(e=[t,n])}this.userScroll=!1,e[1]?e[1].scrollIntoView({behavior:"smooth"}):this.$refs.scroller.scrollTo(0,0)}},beforeUnmount(){this.disableAutoScroll()},template:'\n\t<div\n\t\tclass="fhc-calendar-base-grid"\n\t\tstyle="display:grid;width:100%;height:100%;overflow:auto"\n\t\t:style="\'grid-template-\' + axisRow + \'s:auto\' + (allDayEvents ? \' auto \' : \' \') + \'1fr;grid-template-\' + axisCol + \'s:auto \' + styleGridCols"\n\t>\n\t\t<div\n\t\t\tclass="grid-header"\n\t\t\tstyle="display:grid"\n\t\t\t:style="\'grid-template-\' + axisCol + \'s:subgrid;grid-\' + axisCol + \':1/-1\'"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for="(date, index) in axisMain"\n\t\t\t\t:key="index"\n\t\t\t\tclass="main-header"\n\t\t\t\t:class="{\'collapsed-header\': axisMainCollapsible && hasValidEvents && !events[index].length}"\n\t\t\t\t:style="\'grid-\' + axisCol + \':\' + (2+index)"\n\t\t\t>\n\t\t\t\t<slot name="main-header" v-bind="{ index, date }" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if="allDayEvents"\n\t\t\tclass="grid-allday"\n\t\t\tstyle="display:grid"\n\t\t\t:style="\'grid-template-\' + axisCol + \'s:subgrid;grid-\' + axisCol + \':1/-1\'"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for="(events, index) in eventsAllDay"\n\t\t\t\t:key="index"\n\t\t\t\tclass="all-day-events"\n\t\t\t\t:style="\'grid-\' + axisCol + \':\' + (2+index)"\n\t\t\t>\n\t\t\t\t<grid-line-event\n\t\t\t\t\tv-for="(event, i) in events"\n\t\t\t\t\t:key="i"\n\t\t\t\t\t:event="event"\n\t\t\t\t>\n\t\t\t\t\t<template v-slot="slot">\n\t\t\t\t\t\t<slot name="event" v-bind="slot" />\n\t\t\t\t\t</template>\n\t\t\t\t</grid-line-event>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tref="scroller"\n\t\t\t@scrollend="userScroll ? disableAutoScroll() : userScroll = true"\n\t\t\tstyle="display:grid;overflow:auto"\n\t\t\t:style="\'grid-\' + axisCol + \':1/-1;grid-template-\' + axisCol + \'s:subgrid\'"\n\t\t>\n\t\t\t<div\n\t\t\t\tref="main"\n\t\t\t\tclass="grid-main"\n\t\t\t\tstyle="position:relative;grid-column:1/-1;grid-row:1/-1;display:grid"\n\t\t\t\t:style="\'grid-template-\' + axisCol + \'s:subgrid;grid-template-\' + axisRow + \'s:\' + styleGridRows"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-for="(part, index) in axisPartsSave"\n\t\t\t\t\t:key="index"\n\t\t\t\t\tclass="part-header"\n\t\t\t\t\t:style="\'grid-\' + axisCol + \':1;grid-\' + axisRow + \': ps_\' + index + \'/pe_\' + index"\n\t\t\t\t>\n\t\t\t\t\t<slot name="part-header" v-bind="{ index, part }" />\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tref="body"\n\t\t\t\t\tclass="grid-body"\n\t\t\t\t\tstyle="display:grid;grid-template-rows:subgrid;grid-template-columns:subgrid"\n\t\t\t\t\t:style="\'grid-\' + axisCol + \':2/-1;grid-\' + axisRow + \':1/-1\'"\n\t\t\t\t\tv-cal-dnd:dropcage\n\t\t\t\t\t@calendar-dragenter="dragging = true"\n\t\t\t\t\t@calendar-dragleave="dragging = false"\n\t\t\t\t\t@dragover="dropAllowed ? $event.preventDefault() : null"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-for="(date, index) in axisMain"\n\t\t\t\t\t\t:key="index"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for="(part, i) in axisPartsSave"\n\t\t\t\t\t\t\t:key="i"\n\t\t\t\t\t\t\tclass="part-body"\n\t\t\t\t\t\t\tstyle="position:relative"\n\t\t\t\t\t\t\t:style="\'grid-\' + axisCol + \':\' + (1+index) + \';grid-\' + axisRow + \':ps_\' + i + \'/pe_\' + i"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<slot name="part-body" v-bind="{ index, part }" />\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-if="snapToGrid && dragging"\n\t\t\t\t\t\t\t\tstyle="position:absolute;inset:0;z-index:1"\n\t\t\t\t\t\t\t\tv-cal-dnd:dropzone.once="{date: date.plus(part.start || part), ends: ends.slice(ends.findIndex(end => end > date))}"\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<grid-line\n\t\t\t\t\t\t\t:start="date.plus(start)"\n\t\t\t\t\t\t\t:end="date.plus(end)"\n\t\t\t\t\t\t\t:date="date"\n\t\t\t\t\t\t\t:events="eventsNormal[index]"\n\t\t\t\t\t\t\t:backgrounds="backgrounds[index]"\n\t\t\t\t\t\t\tstyle="position:relative"\n\t\t\t\t\t\t\t:style="\'grid-\' + axisRow + \':1/-1;grid-\' + axisCol + \':\' + (1+index)"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<template #event="slot">\n\t\t\t\t\t\t\t\t<slot name="event" v-bind="slot" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template #dropzone>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tv-if="!snapToGrid && dragging"\n\t\t\t\t\t\t\t\t\tstyle="position:absolute;inset:0;z-index:1"\n\t\t\t\t\t\t\t\t\tv-cal-dnd:dropzone="evt => getTimestampFromMouse(evt, date)"\n\t\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</grid-line>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t'},Ft={name:"LabelDay",directives:{CalClick:Tt},props:{date:{type:luxon.DateTime,required:!0}},computed:{titleFull(){return this.date.toLocaleString({day:"numeric",month:"long",year:"numeric"})},titleLong(){return this.date.toLocaleString({day:"2-digit",month:"2-digit",year:"numeric"})},titleShort(){return this.date.toLocaleString({day:"numeric",month:"numeric"})},titleNarrow(){return this.date.toLocaleString({day:"numeric"})}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-label-day"\n\t\tv-cal-click:day="date"\n\t>\n\t\t<span class="full">{{ titleFull }}</span>\n\t\t<span class="long">{{ titleLong }}</span>\n\t\t<span class="short">{{ titleShort }}</span>\n\t\t<span class="narrow">{{ titleNarrow }}</span>\n\t</div>\n\t'},Pt={name:"LabelDow",directives:{CalClick:Tt},props:{date:{type:luxon.DateTime,required:!0}},computed:{titleLong(){return this.date.toLocaleString({weekday:"long"})},titleShort(){return this.date.toLocaleString({weekday:"short"})},titleNarrow(){return this.date.toLocaleString({weekday:"narrow"})}},template:'\n\t<div\n\t\tclass="fhc-calendar-base-label-dow"\n\t\tv-cal-click:dow="date"\n\t>\n\t\t<b class="long">{{ titleLong }}</b>\n\t\t<b class="short">{{ titleShort }}</b>\n\t\t<b class="narrow">{{ titleNarrow }}</b>\n\t</div>\n\t'},It={name:"LabelTime",props:{part:{type:[luxon.Duration,Number,Object],required:!0,validator(t){if(t instanceof Object){if(t instanceof luxon.Duration)return!0;let e=!0,n=!0;return t.start&&(e=t.start instanceof luxon.Duration||Number.isInteger(t.start)),t.end&&(n=t.end instanceof luxon.Duration||Number.isInteger(t.end)),e&&n}return!0}}},computed:{sanitizedTimestamps(){return this.part.start||this.part.end?this.part:{start:this.part}},start(){return this.sanitizedTimestamps.start?this.formatTime(this.sanitizedTimestamps.start):null},end(){return this.sanitizedTimestamps.end?this.formatTime(this.sanitizedTimestamps.end):null}},methods:{formatTime:t=>t.toISOTime({suppressSeconds:!0})},template:'\n\t<div class="fhc-calendar-base-label-time">\n\t\t<span v-if="start">{{ start }}</span>\n\t\t<span v-if="end">-</span>\n\t\t<span v-if="end">{{ end }}</span>\n\t</div>\n\t'};var Mt={name:"ModeDay",components:{BaseSlider:xt,DayView:{name:"DayView",components:{CalendarGrid:Ot,LabelDay:Ft,LabelDow:Pt,LabelTime:It},inject:{timeGrid:"timeGrid",originalEvents:"events",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0},emptyMessage:String,emptyMessageDetails:String},emits:["requestModalOpen","requestModalClose"],data:()=>({chosenEvent:null,gridMainRef:null}),computed:{axisMain(){return[this.day.startOf("day")]},axisParts(){return this.timeGrid?this.timeGrid.map(t=>({start:luxon.Duration.fromISOTime(t.start),end:luxon.Duration.fromISOTime(t.end)})):Array.from({length:17},(t,e)=>luxon.Duration.fromObject({hours:e+7}))},events(){return this.originalEvents.filter(t=>t.start<this.day.plus({days:1})&&t.end>this.day).sort((t,e)=>t.start.ts-e.start.ts).map(t=>t.orig)},currentEvent(){if(this.chosenEvent&&this.events.find(t=>t==this.chosenEvent))return this.chosenEvent;let t=null;return this.events&&(t=this.events.find(Boolean)),t&&"loading"==t.type?null:t},isToday(){return this.day.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},watch:{compact(){this.compact?this.chosenEvent&&this.$emit("requestModalOpen",{event:this.chosenEvent,closeFn:()=>{this.chosenEvent=null}}):this.$emit("requestModalClose")}},methods:{handleClickDefaults(t){"event"==t.detail.source&&(this.chosenEvent=t.detail.value,this.compact&&this.$emit("requestModalOpen",{event:this.chosenEvent,closeFn:()=>{this.chosenEvent=null}}))}},setup(){const t=Vue.ref(null),{compact:e}=function(t,e){const n=Vue.ref(!1),i=Vue.ref(!1),a=Vue.ref(!1),s=Vue.computed(()=>Vue.isRef(t)?t.value&&t.value.$el?t.value.$el:t.value:t),r=Vue.computed(()=>{const t=Vue.isRef(e)?e.value:e;return Number.isInteger(t)?[["compact",t]]:Array.isArray(t)?t.map((t,e)=>[e,t]).sort((t,e)=>t[1]-e[1]):Object.entries(t).sort((t,e)=>t[1]-e[1])});function o(){if(void 0===s.value.offsetWidth)return;const t=r.value.find(t=>t[1]>s.value.offsetWidth);i.value=t?t[0]:"full",n.value=i.value==r.value[0][0]}const l=new ResizeObserver(()=>{s.value&&o()});function d(){s.value&&(o(),l.observe(s.value),a.value=!0)}function c(){a.value&&l.disconnect()}return Vue.onMounted(d),Vue.onUnmounted(c),Vue.watchEffect(()=>{s.value&&(c(),d())}),{compact:n,size:i}}(t,750);return{container:t,compact:e}},mounted(){this.gridMainRef=this.$refs.grid.$refs.main},template:'\n\t<div\n\t\tref="container"\n\t\tclass="fhc-calendar-mode-day-view d-flex h-100"\n\t\[email protected]="handleClickDefaults"\n\t>\n\t\t<calendar-grid\n\t\t\tref="grid"\n\t\t\t:axis-main="axisMain"\n\t\t\t:axis-parts="axisParts"\n\t\t\t:snap-to-grid="!!timeGrid"\n\t\t\tall-day-events\n\t\t>\n\t\t\t<template #main-header="{ date }">\n\t\t\t\t<div :class="{ today: isToday }">\n\t\t\t\t\t<label-dow\n\t\t\t\t\t\t@cal-click="evt => evt.detail.source = \'day\'"\n\t\t\t\t\t\tv-bind="{ date }"\n\t\t\t\t\t/>\n\t\t\t\t\t<label-day\n\t\t\t\t\t\tv-bind="{ date }"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template #part-header="{ part }">\n\t\t\t\t<label-time v-bind="{ part }" />\n\t\t\t</template>\n\t\t\t<template #event="slot">\n\t\t\t\t<div v-if="slot.event.type == \'loading\'" class="placeholder-glow h-100 opacity-50">\n\t\t\t\t\t<span class="placeholder w-100 h-100" />\n\t\t\t\t</div>\n\t\t\t\t<slot v-else v-bind="slot" mode="day" />\n\t\t\t</template>\n\t\t</calendar-grid>\n\t\t<Teleport :disabled="!gridMainRef" :to="gridMainRef">\n\t\t\t<div\n\t\t\t\tv-if="emptyMessage && currentEvent !== null && !currentEvent"\n\t\t\t\tclass="fhc-calendar-no-events-overlay"\n\t\t\t\tstyle="position:absolute;inset:0"\n\t\t\t>\n\t\t\t\t{{ emptyMessage }}\n\t\t\t</div>\n\t\t</Teleport>\n\t\t<div class="event-details" v-if="!compact">\n\t\t\t<div\n\t\t\t\tv-if="currentEvent === null"\n\t\t\t\tclass="p-4 d-flex w-100 justify-content-center align-items-center"\n\t\t\t>\n\t\t\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t\t\t</div>\n\t\t\t<h3 v-else-if="!currentEvent">{{ emptyMessageDetails }}</h3>\n\t\t\t<slot v-else :event="currentEvent" mode="event" />\n\t\t</div>\n\t</div>\n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen","requestModalClose"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("day"),e=this.focusDate.endOf("day");return 0!=this.rangeOffset&&(this.rangeOffset<0?t=t.plus({days:this.rangeOffset}):e=e.plus({days:this.rangeOffset})),luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("day").diff(this.focusDate.startOf("day"),"days").days,this.rangeOffset&&(this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({days:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},viewAttrs(t){const e=this.focusDate.plus({days:t});return{...this.$attrs,day:e}}},mounted(){this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},template:'\n\t<div\n\t\tclass="fhc-calendar-mode-day flex-grow-1 position-relative"\n\t>\n\t\t<base-slider ref="slider" v-slot="slot">\n\t\t\t<day-view\n\t\t\t\tref="view"\n\t\t\t\tv-bind="viewAttrs(slot.offset)"\n\t\t\t\t@request-modal-open="$emit(\'requestModalOpen\', $event)"\n\t\t\t\t@request-modal-close="$emit(\'requestModalClose\', $event)"\n\t\t\t>\n\t\t\t\t<template v-slot="slot"><slot v-bind="slot" /></template>\n\t\t\t</day-view>\n\t\t</base-slider>\n\t</div>\n\t'},Lt={name:"ModeWeek",components:{BaseSlider:xt,WeekView:{name:"WeekView",components:{CalendarGrid:Ot,LabelDay:Ft,LabelDow:Pt,LabelTime:It},inject:{timeGrid:"timeGrid",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0},collapseEmptyDays:Boolean},computed:{start(){return this.day.startOf("week",{useLocaleWeeks:!0})},axisMain(){return Array.from({length:7},(t,e)=>this.start.plus({days:e}))},axisParts(){return this.timeGrid?this.timeGrid.map(t=>({start:luxon.Duration.fromISOTime(t.start),end:luxon.Duration.fromISOTime(t.end)})):Array.from({length:17},(t,e)=>luxon.Duration.fromObject({hours:e+7}))}},methods:{isToday(t){return t.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},template:'\n\t<div class="fhc-calendar-mode-week-view h-100">\n\t\t<calendar-grid\n\t\t\tref="grid"\n\t\t\t:axis-main="axisMain"\n\t\t\t:axis-parts="axisParts"\n\t\t\t:axis-main-collapsible="collapseEmptyDays"\n\t\t\t:snap-to-grid="!!timeGrid"\n\t\t\tall-day-events\n\t\t>\n\t\t\t<template #main-header="{ date }">\n\t\t\t\t<div :class="{ today: isToday(date) }">\n\t\t\t\t\t<label-dow\n\t\t\t\t\t\tv-bind="{ date }"\n\t\t\t\t\t\t@cal-click="evt => evt.detail.source = \'day\'"\n\t\t\t\t\t/>\n\t\t\t\t\t<label-day\n\t\t\t\t\t\tv-bind="{ date }"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template #part-header="{ part }">\n\t\t\t\t<label-time v-bind="{ part }" />\n\t\t\t</template>\n\t\t\t<template #event="slot">\n\t\t\t\t<div v-if="slot.event.type == \'loading\'" class="placeholder-glow h-100 opacity-50">\n\t\t\t\t\t<span class="placeholder w-100 h-100" />\n\t\t\t\t</div>\n\t\t\t\t<slot v-else v-bind="slot" />\n\t\t\t</template>\n\t\t</calendar-grid>\n\t</div>\n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("week",{useLocaleWeeks:!0}),e=this.focusDate.endOf("week",{useLocaleWeeks:!0});return 0!=this.rangeOffset&&(this.rangeOffset<0?t=t.plus({weeks:this.rangeOffset}):e=e.plus({weeks:this.rangeOffset})),luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("week",{useLocaleWeeks:!0}).diff(this.focusDate.startOf("week",{useLocaleWeeks:!0}),"weeks").weeks,this.rangeOffset&&(this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({weeks:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},viewAttrs(t){const e=this.focusDate.plus({weeks:t});return{...this.$attrs,day:e}},handleClickDefaults(t){switch(t.detail.source){case"day":this.$emit("update:currentDate",t.detail.value);break;case"event":this.$emit("requestModalOpen",{event:t.detail.value})}}},mounted(){this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},template:'\n\t<div\n\t\tclass="fhc-calendar-mode-week flex-grow-1 position-relative"\n\t\[email protected]="handleClickDefaults"\n\t>\n\t\t<base-slider ref="slider" v-slot="slot">\n\t\t\t<week-view ref="view" v-bind="viewAttrs(slot.offset)">\n\t\t\t\t<template v-slot="slot"><slot v-bind="slot" mode="week" /></template>\n\t\t\t</week-view>\n\t\t</base-slider>\n\t</div>\n\t'},Nt={name:"ModeMonth",components:{BaseSlider:xt,MonthView:{name:"MonthView",components:{CalendarGrid:Ot,LabelWeek:{name:"LabelWeek",directives:{CalClick:Tt},props:{date:{type:luxon.DateTime,required:!0}},computed:{weeks(){const t=this.date.startOf("week",{useLocaleWeeks:!0}),e=this.date.endOf("week",{useLocaleWeeks:!0}),n=[{number:t.localWeekNumber,year:t.localWeekYear},{number:e.localWeekNumber,year:e.localWeekYear}];return n[0].number==n[1].number&&n.pop(),n}},template:'\n\t<div class="fhc-calendar-base-label-week">\n\t\t<span\n\t\t\tv-for="week in weeks"\n\t\t\tv-cal-click:week="week"\n\t\t>\n\t\t\t{{ week.number }}\n\t\t</span>\n\t</div>\n\t'},LabelDow:Pt,LabelDay:Ft},provide(){return{events:Vue.computed(()=>{const t=this.events.map(t=>{const e=t.start.startOf("day"),n=t.end.plus({days:1}).startOf("day");return{...t,start:e,end:n}});for(var e=5;e>-1;e--)for(var n=6;n>-1;n--){const i=this.axisMain[e].plus(this.axisParts[n]);t.unshift({start:i,end:i.plus({days:1}),orig:"header"})}return t})}},inject:{events:"events",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0}},computed:{axisMain(){const t=this.day.startOf("month").startOf("week",{useLocaleWeeks:!0});return Array.from({length:6},(e,n)=>t.plus({weeks:n}))},axisParts:()=>Array.from({length:8},(t,e)=>luxon.Duration.fromObject({days:e}))},methods:{isToday(t){return t.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},template:'\n\t<div class="fhc-calendar-mode-month-view h-100">\n\t\t<calendar-grid\n\t\t\tflip-axis\n\t\t\t:axis-main="axisMain"\n\t\t\t:axis-parts="axisParts"\n\n\t\t\tsnap-to-grid\n\t\t>\n\t\t\t<template #main-header="{ date }">\n\t\t\t\t<label-week v-bind="{ date }" />\n\t\t\t</template>\n\t\t\t<template #part-header="{ part }">\n\t\t\t\t<label-dow :date="axisMain[0].plus(part)" class="text-center" />\n\t\t\t</template>\n\t\t\t<template #event="slot">\n\t\t\t\t<label-day\n\t\t\t\t\tv-if="slot.event.orig == \'header\'"\n\t\t\t\t\t:date="slot.event.start"\n\t\t\t\t\t:class="{ disabled: !day.hasSame(slot.event.start, \'month\'), today: isToday(slot.event.start) }"\n\t\t\t\t/>\n\t\t\t\t<div v-else-if="slot.event.type == \'loading\'" class="placeholder-glow opacity-50">\n\t\t\t\t\t<span class="placeholder w-100 fs-1" />\n\t\t\t\t</div>\n\t\t\t\t<slot v-else v-bind="slot" />\n\t\t\t</template>\n\t\t</calendar-grid>\n\t</div>\n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("month").startOf("week",{useLocaleWeeks:!0}),e=t.plus({days:41}).endOf("day");if(0!=this.rangeOffset){const n=this.focusDate.plus({months:this.rangeOffset}).startOf("month").startOf("week",{useLocaleWeeks:!0});this.rangeOffset<0?t=n:e=n.plus({days:41}).endOf("day")}return luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("month").diff(this.focusDate.startOf("month"),"months").months,this.rangeOffset&&(this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({months:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range)},viewAttrs(t){return{day:this.focusDate.plus({months:t})}},handleClickDefaults(t){switch(t.detail.source){case"week":let e=luxon.DateTime.fromObject({localWeekNumber:t.detail.value.number,localWeekYear:t.detail.value.year},{zone:this.currentDate.zoneName,locale:this.currentDate.locale});this.focusDate.hasSame(e.startOf("week",{useLocaleWeeks:!0}),"month")?this.focusDate.hasSame(e.endOf("week",{useLocaleWeeks:!0}),"month")||this.$emit("update:currentDate",e.endOf("week",{useLocaleWeeks:!0})):this.$emit("update:currentDate",e.startOf("week",{useLocaleWeeks:!0}));break;case"day":this.$emit("update:currentDate",t.detail.value);break;case"event":this.$emit("requestModalOpen",{event:t.detail.value})}}},mounted(){this.$emit("update:range",this.range)},template:'\n\t<div\n\t\tclass="fhc-calendar-mode-month flex-grow-1 position-relative"\n\t\[email protected]="handleClickDefaults"\n\t>\n\t\t<base-slider ref="slider" v-slot="slot">\n\t\t\t<month-view v-bind="viewAttrs(slot.offset)">\n\t\t\t\t<template v-slot="slot"><slot v-bind="slot" mode="month" /></template>\n\t\t\t</month-view>\n\t\t</base-slider>\n\t</div>\n\t'},Rt={name:"CalendarLvPlan",components:{FhcCalendar:Dt},inject:["renderers"],props:{timezone:{type:String,required:!0},date:{type:[Date,String,Number,luxon.DateTime],default:luxon.DateTime.local()},mode:{type:String,default:"Week"},getPromiseFunc:{type:Function,required:!0}},emits:["update:date","update:mode","update:range"],data(){return{modes:{day:Vue.markRaw(Mt),week:Vue.markRaw(Lt),month:Vue.markRaw(Nt)},modeOptions:{day:{emptyMessage:Vue.computed(()=>this.$p.t("lehre/noLvFound")),emptyMessageDetails:Vue.computed(()=>this.$p.t("lehre/noLvFound"))},week:{collapseEmptyDays:!1}},teachingunits:null}},computed:{backgrounds(){let t=luxon.DateTime.now().setZone(this.timezone);return"Month"==this.mode?[{class:"background-past",end:t.startOf("day")}]:[{class:"background-past",end:t,label:t.startOf("minute").toISOTime({suppressSeconds:!0,includeOffset:!1})}]}},methods:{eventStyle(t){if(t.farbe)return"--event-bg:#"+t.farbe},updateRange(t){this.rangeInterval=t,this.$emit("update:range",t)}},setup(t,e){const n=Vue.ref(null),{events:i,lv:a}=function(t,e){let n=0;const i=Vue.ref([]),a=Vue.ref([]),s=Vue.computed(()=>i.value.concat(a.value)),r=Vue.ref(null),o=[],l=(t,e)=>Array.isArray(t)?e.concat(t):(e.push(t),e),d=(t,i)=>{let s=[];if(o.length)if(o[o.length-1]+1==t.ts)o[o.length-1]=i.ts;else if(o[o.length-1]<t.ts)o.push(t.ts,i.ts);else if(o[0]==i.ts+1)o[0]=t.ts;else if(o[0]>i.ts)o.unshift(t.ts,i.ts);else{let e=o.findIndex(e=>e>=t.ts);if(e%2){if(o[e]>=i.ts)return[];let n=e==o.length-1;if(n||o[e+1]>i.ts){let a=o[e]+1;t=t.plus(a-t.ts),n||o[e+1]!=i.ts+1?o[e]=i.ts:o.splice(e,2)}else{if(o[e+2]<i.ts){let n=o[e+2]+1;s=l(d(t.plus(n-t.ts),i),s)}let n=o[e]+1;t=t.plus(n-t.ts);let a=o[e+1]-1;i=i.plus(a-i.ts),o.splice(e,2)}}else if(e)if(o[e]==t.ts){if(o[e+1]>=i.ts)return[];let n=o[e+1]+1;s=l(d(t.plus(n-t.ts),i),s)}else{if(o[e+1]<i.ts){let n=o[e+1]+1;s=l(d(t.plus(n-t.ts),i),s)}let n=o[e]-1;i=i.plus(n-i.ts),o[e]=t.ts}else{if(o[1]<i.ts){let e=o[1]+1;s=l(d(t.plus(e-t.ts),i),s)}let e=o[0]-1;i=i.plus(e-i.ts),o[0]=t.ts}}else o.push(t.ts,i.ts);return t.ts>=i.ts?s:(a.value.push({loading_id:n++,type:"loading",isostart:t.toISODate()+"T"+t.toISOTime(),isoend:i.toISODate()+"T"+i.toISOTime()}),l(e(t,i),s))};return Vue.watchEffect(()=>{const e=Vue.toValue(t);if(!(e instanceof luxon.Interval))return;const n=d(e.start,e.end);Promise.allSettled(n).then(t=>{t.forEach(t=>{"fulfilled"===t.status&&"success"===t.value.meta.status&&(t.value.meta.lv&&(r.value=t.value.meta.lv),i.value=i.value.concat(t.value.data),a.value=[])})})}),{events:s,lv:r}}(n,t.getPromiseFunc);return Vue.watch(a,t=>{e.emit("update:lv",t)}),{rangeInterval:n,events:i,lv:a}},created(){this.$api.call(Et.getStunden()).then(t=>this.teachingunits=t.data.map(t=>({id:t.stunde,start:t.beginn,end:t.ende})))},template:'\n\t<fhc-calendar\n\t\tref="calendar"\n\t\tclass="fhc-calendar-lvplan"\n\t\t:date="date"\n\t\t:modes="modes"\n\t\t:mode-options="modeOptions"\n\t\t:mode="mode"\n\t\t:timezone="timezone"\n\t\t:locale="$p.user_locale.value"\n\t\t:events="events || []"\n\t\t:backgrounds="backgrounds"\n\t\t:time-grid="teachingunits"\n\t\tshow-btns\n\t\t@update:date="(newDate, newMode) => $emit(\'update:date\', newDate, newMode)"\n\t\t@update:mode="(newMode, newDate) => $emit(\'update:mode\', newMode, newDate)"\n\t\t@update:range="updateRange"\n\t>\n\t\t<template v-slot="{ event, mode }">\n\t\t\t<div\n\t\t\t\t:class="\'event-type-\' + event.type + \' \' + mode + \'PageContainer\'"\n\t\t\t\t:type="mode == \'day\' ? \'button\' : undefined"\n \t\t\t\t:style="eventStyle(event)"\n\t\t\t>\n\t\t\t\t<component\n\t\t\t\t\tv-if="mode == \'event\'"\n\t\t\t\t\t:is="renderers[event.type]?.modalContent"\n\t\t\t\t\t:event="event"\n\t\t\t\t></component>\n\t\t\t\t<component\n\t\t\t\t\tv-else-if="mode == \'eventheader\'"\n\t\t\t\t\t:is="renderers[event.type]?.modalTitle"\n\t\t\t\t\t:event="event"\n\t\t\t\t></component>\n\t\t\t\t<component\n\t\t\t\t\tv-else\n\t\t\t\t\t:is="renderers[event.type]?.calendarEvent"\n\t\t\t\t\t:event="event"\n\t\t\t\t></component>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<slot />\n\t\t</template>\n\t</fhc-calendar>'},Bt={getAuthUID:()=>({method:"get",url:"/api/frontend/v1/AuthInfo/getAuthUID"}),getAuthInfo:()=>({method:"get",url:"/api/frontend/v1/AuthInfo/getAuthInfo"})};var jt={name:"LvPlanLehrveranstaltung",components:{FhcCalendar:Rt},props:{viewData:Object,propsViewData:Object},data:()=>({lv:null}),computed:{currentDay(){return!this.propsViewData?.focus_date||isNaN(new Date(this.propsViewData?.focus_date))?luxon.DateTime.now().setZone(this.viewData.timezone).toISODate():this.propsViewData?.focus_date},currentMode(){return this.propsViewData?.mode&&["day","week","month"].includes(this.propsViewData?.mode.toLowerCase())?this.propsViewData?.mode:"Week"},currentLv(){return isNaN(parseInt(this.propsViewData?.lv_id))?null:this.propsViewData.lv_id},lvTitle(){return null===this.currentLv?"":this.lv?"English"===this.$p.user_language.value?this.lv.bezeichnung_english:this.lv.bezeichnung:""}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),i=e.toISODate();this.$router.push({name:"LvPlan",params:{mode:n,focus_date:i,lv_id:this.currentLv}})},getPromiseFunc(t,e){return[this.$api.call(Et.eventsLv(this.propsViewData.lv_id,t.toISODate(),e.toISODate())),this.$api.call(Et.getLvPlanReservierungen(t.toISODate(),e.toISODate()))]}},created(){null!==this.currentLv&&this.$api.call(Et.getLv(this.propsViewData?.lv_id)).then(t=>{this.lv=t.data})},template:'\n\t<div class="cis-lvplan-personal d-flex flex-column h-100">\n\t\t<h2>\n\t\t\t{{ $p.t(\'lehre/stundenplan\') }}\n\t\t\t<span v-if="lvTitle" class="ps-3">\n\t\t\t\t{{ lvTitle }}\n\t\t\t</span>\n\t\t</h2>\n\t\t<hr>\n\t\t<div v-if="currentLv === null || lv === false">\n\t\t\t{{ $p.t(\'lehre/noLvFound\') }}\n\t\t</div>\n\t\t<fhc-calendar\n\t\t\tv-else-if="lv"\n\t\t\tref="calendar"\n\t\t\t:timezone="viewData.timezone"\n\t\t\t:get-promise-func="getPromiseFunc"\n\t\t\t:date="currentDay"\n\t\t\t:mode="currentMode"\n\t\t\t@update:date="handleChangeDate"\n\t\t\t@update:mode="handleChangeMode"\n\t\t\tclass="responsive-calendar"\n\t\t/>\n\t</div>'};var Ut={name:"LvPlanPersonal",components:{FhcCalendar:Rt},props:{viewData:Object,propsViewData:Object},data:()=>({studiensemester_kurzbz:null,studiensemester_start:null,studiensemester_ende:null,uid:null,isMitarbeiter:!1,isStudent:!1}),computed:{currentDay(){return!this.propsViewData?.focus_date||isNaN(new Date(this.propsViewData?.focus_date))?luxon.DateTime.now().setZone(this.viewData.timezone).toISODate():this.propsViewData?.focus_date},currentMode(){return this.propsViewData?.mode&&["day","week","month"].includes(this.propsViewData?.mode.toLowerCase())?this.propsViewData?.mode:"Week"},downloadLinks(){if(!this.studiensemester_start||!this.studiensemester_ende||!this.uid)return!1;let t=!1;if(t=this.isStudent?"student":t,t=this.isMitarbeiter?"lektor":t,!1===t)return;const e={zone:this.viewData.timezone},n=luxon.DateTime.fromISO(this.studiensemester_start,e).toUnixInteger(),i=luxon.DateTime.fromISO(this.studiensemester_ende,e).toUnixInteger(),a=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/lvplan/stpl_kalender.php?type="+t+"&pers_uid="+this.uid+"&begin="+n+"&ende="+i;return[{title:"excel",icon:"fa-solid fa-file-excel",link:a+"&format=excel"},{title:"csv",icon:"fa-solid fa-file-csv",link:a+"&format=csv"},{title:"ical1",icon:"fa-regular fa-calendar",link:a+"&format=ical&version=1&target=ical"},{title:"ical2",icon:"fa-regular fa-calendar",link:a+"&format=ical&version=2&target=ical"}]}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),i=e.toISODate();this.$router.push({name:"MyLvPlan",params:{mode:n,focus_date:i}})},updateRange(t){this.$api.call(Et.studiensemesterDateInterval(t.end.startOf("week").toISODate())).then(t=>{this.studiensemester_kurzbz=t.data.studiensemester_kurzbz,this.studiensemester_start=t.data.start,this.studiensemester_ende=t.data.ende})},getPromiseFunc(t,e){return[this.$api.call(Et.eventsPersonal(t.toISODate(),e.toISODate())),this.$api.call(Et.getLvPlanReservierungen(t.toISODate(),e.toISODate()))]}},created(){this.$api.call(Bt.getAuthInfo()).then(t=>{this.uid=t.data.uid,this.isMitarbeiter=t.data.isMitarbeiter,this.isStudent=t.data.isStudent})},template:'\n\t<div class="cis-lvplan-personal d-flex flex-column h-100">\n\t\t<h2>\n\t\t\t{{ $p.t(\'lehre/stundenplan\') }}\n\t\t\t<span v-if="studiensemester_kurzbz" class="ps-3">\n\t\t\t\t{{ studiensemester_kurzbz }}\n\t\t\t</span>\n\t\t</h2>\n\t\t<hr>\n\t\t<fhc-calendar\n\t\t\tref="calendar"\n\t\t\t:timezone="viewData.timezone"\n\t\t\t:get-promise-func="getPromiseFunc"\n\t\t\t:date="currentDay"\n\t\t\t:mode="currentMode"\n\t\t\t@update:date="handleChangeDate"\n\t\t\t@update:mode="handleChangeMode"\n\t\t\t@update:range="updateRange"\n\t\t\tclass="responsive-calendar"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-if="downloadLinks"\n\t\t\t\tclass="d-flex gap-1 justify-items-start"\n\t\t\t>\n\t\t\t\t<div v-for="{ title, icon, link } in downloadLinks">\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href="link"\n\t\t\t\t\t\t:aria-label="title"\n\t\t\t\t\t\tclass="py-1 btn btn-outline-secondary"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class="d-flex flex-column">\n\t\t\t\t\t\t\t<i aria-hidden="true" :class="icon"></i>\n\t\t\t\t\t\t\t<span style="font-size:.5rem">{{ title }}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</fhc-calendar>\n\t</div>'},Vt={components:{BsModal:s},mixins:[s],props:{pruefungenData:null|Array,bezeichnung:String,onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data:()=>({result:!0}),mounted(){this.modal=this.$refs.modalContainer.modal},popup(t){return s.popup.bind(this)(null,t)},template:'<bs-modal ref="modalContainer" class="bootstrap-alert" v-bind="$props" body-class="">\n\t\t<template v-slot:title>\n\t\t\tPrüfungen: {{bezeichnung}}\n\t\t</template>\n\t\t<template v-slot:default>\n\t\t\t<div v-if="!pruefungenData" class="text-center">\n\t\t\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t\t\t</div>\n\t\t\t<p v-else-if="!pruefungenData.length" class="alert alert-info mb-0">\n\t\t\t\tKeine Prüfungen vorhanden!\n\t\t\t</p>\n\t\t\t<table v-else class="table table-hover">\n\t\t\t\t<thead>\n\t\t\t\t\t<td>&nbsp;</td>\n\t\t\t\t\t<td>Datum</td>\n\t\t\t\t\t<td class="text-end">Note</td>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr v-for="pruefung in pruefungenData" :key="pruefung.pruefung_id">\n\t\t\t\t\t\t<th>{{pruefung.pruefungstyp_kurzbz}}</th>\n\t\t\t\t\t\t<td>{{pruefung.datum}}</td>\n\t\t\t\t\t\t<td class="text-end">{{pruefung.note}}</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</template>\n\t</bs-modal>'},Ht={getStudentenMail:t=>({method:"get",url:"/api/frontend/v1/Lehre/lvStudentenMail",params:{lehreinheit_id:t}}),getLvInfo:(t,e)=>({method:"get",url:`/api/frontend/v1/Lehre/LV/${t}/${e}`}),getStudentPruefungen:t=>({method:"get",url:`/api/frontend/v1/Lehre/Pruefungen/${t}`})};const qt={};var Gt={props:{studien_semester:String,lehrveranstaltung_id:Number},data:()=>({bezeichnung:null,studiengang_kuerzel:null,semester:null,orgform_kurzbz:null,sprache:null,ects:null,incoming:null,result:!0,info:null}),computed:{lektorNamesLinks(){let t={};return this.info.lektoren.forEach(e=>{let n=((e.titelpre||"")+" "+(e.vorname||"")+" "+(e.nachname||"")+" "+(e.titelpost||"")).trim();t[n]=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/Cis/Profil/View/${e.uid}`}),t},lektorNames(){return this.info.lektoren.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim())},lvLeitung(){return this.info.lvLeitung&&this.info.lvLeitung.length?this.info.lvLeitung.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):null},oe(){return this.info.oe.organisationseinheittyp?this.info.oe.organisationseinheittyp+" "+this.info.oe.bezeichnung:""},oeLeitung(){return this.info.oeLeitung&&this.info.oeLeitung.length?this.info.oeLeitung.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):["-"]},koordinator(){return this.info.koordinator&&this.info.koordinator.length?this.info.koordinator.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):null},currentLang(){return this.info?this.info.lastLang?this.info.lastLang:this.info.lvinfo?this.info.lvinfoDefaultLang&&this.info.lvinfo[this.info.lvinfoDefaultLang]?this.info.lvinfoDefaultLang:Object.keys(this.info.lvinfo).shift():null:null}},created(){this.$api.call(Ht.getLvInfo(this.studien_semester,this.lehrveranstaltung_id)).then(t=>t.data).then(t=>{Object.assign(this,{bezeichnung:t.bezeichnung,studiengang_kuerzel:t.studiengang_kuerzel,semester:t.semester,orgform_kurzbz:t.orgform_kurzbz,sprache:t.sprache,ects:t.ects,incoming:t.incoming??"-"})}),qt[this.lehrveranstaltung_id]?this.info=qt[this.lehrveranstaltung_id]:axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Info/"+this.studien_semester+"/"+this.lehrveranstaltung_id).then(t=>{this.info=qt[this.lehrveranstaltung_id]=t.data.retval||[]}).catch(()=>this.info={})},template:'\n\t\t\t<h1>{{$p.t(\'lvinfo/lehrveranstaltungsinformationen\')}}</h1>\n\t\t\t<hr>\n\t\t\t\t<div v-if="!info" class="text-center">\n\t\t\t\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t\t\t\t</div>\n\t\t\t\t<table v-else class="table table-hover mb-4">\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/lehrveranstaltung\')}}</th>\n\t\t\t\t\t\t\t<td>{{bezeichnung}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/studiengang\')}}</th>\n\t\t\t\t\t\t\t<td>{{studiengang_kuerzel}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/semester\')}}</th>\n\t\t\t\t\t\t\t<td>{{semester}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/studiensemester\')}}</th>\n\t\t\t\t\t\t\t<td>{{studien_semester}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/organisationsform\')}}</th>\n\t\t\t\t\t\t\t<td>{{orgform_kurzbz}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/lehrbeauftragter\')}}</th>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<ul v-if="lektorNames.length" class="list-unstyled mb-0">\n\t\t\t\t\t\t\t\t\t<li v-for="name in new Set(lektorNames)" :key="name">\n\t\t\t\t\t\t\t\t\t<a :href="lektorNamesLinks[name]?lektorNamesLinks[name]:null"><i class="fa fa-arrow-up-right-from-square me-1 fhc-primary-color" ></i></a>\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t{{$p.t(\'lehre/keinLektorZugeordnet\')}}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if="lvLeitung">\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/lvleitung\')}}</th>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<ul class="list-unstyled mb-0">\n\t\t\t\t\t\t\t\t\t<li v-for="name in lvLeitung" :key="name">\n\t\t\t\t\t\t\t\t\t\t<a :href="lektorNamesLinks[name]?lektorNamesLinks[name]:null"><i class="fa fa-arrow-up-right-from-square me-1 fhc-primary-color" ></i></a>\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'global/sprache\')}}</th>\n\t\t\t\t\t\t\t<td>{{sprache}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/ects\')}}</th>\n\t\t\t\t\t\t\t<td>{{ects}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/incomingplaetze\')}}</th>\n\t\t\t\t\t\t\t<td>{{incoming}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>{{$p.t(\'lehre/organisationseinheit\')}}</th>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t{{oe}} <br>\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t<i>{{$p.t(\'global/leitung\')}}: </i>{{oeLeitung.join(\', \')}}\n\t\t\t\t\t\t\t\t<template v-if="koordinator">\n\t\t\t\t\t\t\t\t\t<i>{{$p.t(\'global/koordination\')}}: </i>{{koordinator.join(\', \')}}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\n\t\t\t\n\t\t\t\t<div v-if="info && info.lvinfo">\n\t\t\t\t\t<div v-if="Object.keys(info.lvinfo).length > 1" class="text-end">\n\t\t\t\t\t\t<div class="btn-group" role="group" :title="$p.t(\'global/verfuegbareSprachen\')" :aria-label="$p.t(\'global/verfuegbareSprachen\')">\n\t\t\t\t\t\t\t<template v-for="lang in info.sprachen" :key="lang.index">\n\t\t\t\t\t\t\t\t<button v-if="info.lvinfo[lang.sprache]" type="button" class="btn btn-outline-primary" :class="lang.sprache == currentLang ? \'active\' : \'\'" @click.prevent="info.lastLang = lang.sprache">{{lang.bezeichnung[lang.index-1]}}</button>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<template v-for="i in info.lvinfo[currentLang]" :key="info">\n\t\t\t\t\t\t<h4>{{i.header}}</h4>\n\t\t\t\t\t\t<h6 v-if="i.subheader">{{i.subheader}}</h6>\n\t\t\t\t\t\t<ul v-if="Array.isArray(i.body)">\n\t\t\t\t\t\t\t<li v-for="e in i.body" :key="e">{{e}}</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p v-else>\n\t\t\t\t\t\t\t{{i.body}}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</template>\n\t\t\t\t</div>'};const Jt={},Wt={};function Zt(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}function Kt(t){for(;Wt[t].length;){var e=Wt[t].pop();e[0].value=Yt(t,e[1],e[2]),Vue.triggerRef(e[0])}}function Yt(t,e,n){let i=Jt[t][e];return i?(n&&(i=i.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),i):"<< PHRASE "+e+">>"}const Qt={t_ref(t,e,n){if(void 0===n&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(n=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input"),"";if(!Jt[t]){var i="";if(void 0!==window.FHC_JS_PHRASES_STORAGE_OBJECT){var a=Zt(FHC_JS_PHRASES_STORAGE_OBJECT,t);void 0!==a[e]&&(i=a[e])}if(!Jt[t]||0===Object.keys(Jt[t]).length){Jt[t]=void 0;let a=Vue.ref(i);return function(t,e,n,i){if(Wt[t])return Wt[t].push([e,n,i]),void(Jt[t]&&Kt(t));Wt[t]=[[e,n,i]],axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Phrasen/loadModule/"+t).then(e=>{e.data.retval?Jt[t]=Zt(e.data.retval,t):Jt[t]={},Kt(t)}).catch(t=>console.error(t))}(t,a,e,n),a}}var s=Yt(t,e,n);return Vue.ref(s)},t(t,e,n){return Vue.unref(this.t_ref(t,e,n))}};var Xt={data:()=>({p:Qt})},te={props:{menu:{type:Array,default:null},containerStyles:Array,rowStyles:Array,hasLvPlanEintraege:{required:!1,default:!0,type:Boolean}},data:()=>({}),methods:{c4_disabled:function(t){return!this.c4_link(t)&&!t.c4_moodle_links?.length||("addon_fhtw_menu_lvplan_lva"==t.id&&!this.hasLvPlanEintraege||null)},c4_target:function(t){return t.c4_moodle_links?.length>0?null:t.c4_target??null},c4_link:t=>t?Array.isArray(t.c4_moodle_links)&&t.c4_moodle_links.length?null:t.c4_link??null:null,getMenuName(t){return t.phrase?this.$p.t(t.phrase):t.name}},template:'\n\t<div v-if="!menu">{{$p.t(\'lehre\',\'lehrveranstaltungsUnavailable\')}}</div>\n\t<div id="cis-menu" v-else>\n\t\t<div class="container" :class="containerStyles">\n\t\t\t<div class="row g-2 justify-content-center" :class="rowStyles">\n\t\t\t\t<div style="min-height:150px; min-width:150px;" class="col-12 col-lg-6 col-xl-4" v-for="(menuItem, index) in menu" :key="index">\n\t\t\t\t\t<a :id="menuItem.name" :class="{\'dropdown-toggle\':menuItem.c4_moodle_links?.length }" role="button" :href="c4_link(menuItem)"\n\t\t\t\t\t:disabled="c4_disabled(menuItem)" :data-bs-toggle="menuItem.c4_moodle_links?.length?\'dropdown\':null"\n\t\t\t\t\tclass="menu-entry p-2 w-100 text-wrap border border-1 rounded-3 d-flex flex-column align-items-center justify-content-center text-center text-decoration-none link h-100">\n\t\t\t\t\t\t<img :src="menuItem.c4_icon" :alt="menuItem.name" />\n\t\t\t\t\t\t<p class="w-100 mt-2 mb-0">{{ getMenuName(menuItem) }}</p>\n\t\t\t\t\t\t<a v-for="([text,link],index) in menuItem.c4_linkList" target="_blank" :href="link" class="my-1 w-100 submenu text-decoration-none" :index="index">{{text}}</a>\n\t\t\t\t\t</a>\n\t\t\t\t\t<ul v-if="menuItem.c4_moodle_links?.length" class="dropdown-menu p-0" :aria-labelledby="menuItem.name">\n\t\t\t\t\t\t<li v-for="item in menuItem.c4_moodle_links"><a class="dropdown-item border-bottom" :href="item.url">{{item.lehrform}}</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t'},ee={getLvMenu:(t,e)=>({method:"get",url:`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`})},ne={props:{event:{type:Object,required:!0,default:null},studiensemester:{type:String,required:!1,default:null},titel:{type:String,required:!1,default:null},preselectedMenu:{type:Object,required:!1,default:null}},data:()=>({result:!1,menu:[],isMenuSelected:!1,hasLvPlanEintraege:!0,lvEvaluierungMessage:""}),mixins:[s],components:{BsModal:s,LvMenu:te},inject:["studium_studiensemester"],methods:{hiddenModal:function(){this.isMenuSelected=!1},showModal:function(){if(this.preselectedMenu?this.isMenuSelected=!0:this.$api.call(ee.getLvMenu(this.event.lehrveranstaltung_id,this.studiensemester??this.event.studiensemester_kurzbz)).then(t=>{t.data&&(this.menu=t.data)}),this.studium_studiensemester&&this.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester,this.event.lehreinheit_id??this.event.lehrveranstaltung_id).then(t=>t.data).then(t=>{this.lvEvaluierungMessage=t.message}),this.studiensemester&&this.event)return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester,this.event.lehreinheit_id??this.event.lehrveranstaltung_id).then(t=>t.data).then(t=>{Array.isArray(t)&&t.length>0?this.hasLvPlanEintraege=!0:this.hasLvPlanEintraege=!1})}},mounted(){this.modal=this.$refs.modalContainer},beforeUnmount(){this.$refs.modalContainer.hide()},template:'\n <bs-modal :bodyClass="isMenuSelected ? \'\' : \'px-4 py-5\'" @showBsModal="showModal" @hiddenBsModal="hiddenModal" ref="modalContainer" :dialogClass="{\'modal-lg\': !isMenuSelected, \'modal-fullscreen\':isMenuSelected}">\n\n\t\t<template #title>\n <template v-if="titel">\n\t\t\t\t<span>{{titel}}</span>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<span v-if="event?.lehrfach_bez ">{{event?.lehrfach_bez + (event?.stg_kurzbzlang?\' / \' + event?.stg_kurzbzlang:\'\')}}</span>\n\t\t\t\t<span v-else>Lehrveranstaltungs Übersicht</span>\n\t\t\t</template>\n\n </template>\n <template #default>\n\t\t\t<div class="mb-4" v-if="lvEvaluierungMessage" v-html="lvEvaluierungMessage"></div>\n\t\t\t<slot name="content"></slot>\n\t\t\t<lv-menu v-model:isMenuSelected="isMenuSelected" :hasLvPlanEintraege="hasLvPlanEintraege" :preselectedMenu="preselectedMenu" :menu="menu" @hideModal="hide"></lv-menu>\n </template>\n \n </bs-modal>\n\n \n '},ie={components:{MylvSemesterStudiengang:{components:{MylvSemesterStudiengangLv:{components:{LvUebersicht:ne},mixins:[Xt],inject:["studien_semester"],props:{lehrveranstaltung_id:Number,bezeichnung:String,bezeichnung_eng:String,module:String,farbe:String,lvinfo:Boolean,benotung:Boolean,lvnote:String,lvnotebez:Array,znote:String,znotebez:Array,studiengang_kuerzel:String,semester:[String,Number],orgform_kurzbz:String,sprache:String,ects:String,incoming:Number,positiv:Boolean,note_index:String},data:()=>({pruefungenData:null,info:null,menu:null,preselectedMenuItem:null}),computed:{gradeColor(){if(null!=this.positiv)return this.positiv?"var(--fhc-success)":"var(--fhc-danger)"},is_organisatorische_einheit(){return"organisatorische_einheit"==this.menu},emptyMenu(){return!this.menu||!Array.isArray(this.menu)||Array.isArray(this.menu)&&0==this.menu.length},bodyStyle:()=>({}),grade(){const t="English"===this.$p.user_language.value?1:0;return this.benotung&&this.znotebez?.length?this.znotebez[t]:this.benotung&&this.lvnotebez?.length?this.lvnotebez[t]:null},LvHasPruefungenInformation(){return this.pruefungenData&&this.pruefungenData.length>0}},methods:{fetchMenu(t=this.lehrveranstaltung_id,e=this.studien_semester){return this.$api.call(ee.getLvMenu(t,e)).then(t=>{this.menu=t.data}).catch(t=>{this.$fhcAlert.handleSystemError(t),this.menu=[]})},c4_link:t=>t?Array.isArray(t.c4_moodle_links)&&t.c4_moodle_links.length?"#":t.c4_link??null:null,openLvOption(t){"core_menu_mailanstudierende"==t.id||"core_menu_digitale_anwesenheitslisten"==t.id?window.location.href=t.c4_link:(this.preselectedMenuItem=t,Vue.nextTick(()=>{this.$refs.lvUebersicht.show()}))},openPruefungen(){this.LvHasPruefungenInformation&&Vt.popup({pruefungenData:this.pruefungenData,bezeichnung:this.bezeichnung})},openInfos(){this.info||(this.info=!0,Gt.popup({lehrveranstaltung_id:this.lehrveranstaltung_id,bezeichnung:this.bezeichnung,bezeichnung_eng:this.bezeichnung_eng,studiengang_kuerzel:this.studiengang_kuerzel,semester:this.semester,studien_semester:this.studien_semester,orgform_kurzbz:this.orgform_kurzbz,sprache:this.sprache,ects:this.ects,incoming:this.incoming}).then(()=>this.info=!1).catch(()=>this.info=!1))}},watch:{studien_semester(t){this.fetchMenu(this.lehrveranstaltung_id,t)}},created(){this.$api.call(Ht.getStudentPruefungen(this.lehrveranstaltung_id)).then(t=>t.data).then(t=>{this.pruefungenData=t})},mounted(){this.fetchMenu(this.lehrveranstaltung_id,this.studien_semester)},template:'<div class="mylv-semester-studiengang-lv card">\n\t\t<lv-uebersicht ref="lvUebersicht" :preselectedMenu="preselectedMenuItem" :event="{\n\t\t\tlehrveranstaltung_id: lehrveranstaltung_id,\n\t\t\tstudiensemester_kurzbz:studien_semester,\n\t\t\tlehrfach_bez:studien_semester,\n\t\t\tstg_kurzbzlang:studien_semester,\n\t\t}"/>\n\n\t\t<div class="p-2" :class="is_organisatorische_einheit?\'\':\'card-header\'">\n\t\t\t\x3c!-- {{module}} if the module of the lv is important then query the module from the api endpoint for LV--\x3e\n\t\t\t<h6 class="fw-bold" v-if="is_organisatorische_einheit" >{{ $p.t(\'lehre/organisationseinheit\') }}:</h6>\n\t\t\t<h6 class="mb-0">{{$p.user_language.value === \'English\' ? bezeichnung_eng : bezeichnung}}</h6>\n\t\t</div>\n\t\t<div v-if="!emptyMenu" class="card-body " :style="bodyStyle">\n\t\t\t<template v-if="menu">\n\t\t\t\t<ul class="list-group border-top-0 border-bottom-0 rounded-0">\n\t\t\t\t\t<li :type="menuItem.c4_link ? \'button\' : null" v-for="menuItem in menu" class="list-group-item border-0 " >\n\t\t\t\t\t\t<div class="d-flex flex-row" :data-bs-toggle="menuItem.c4_moodle_links?.length ? \'dropdown\' : null">\n\t\t\t\t\t\t\t<div class="mx-4">\n\t\t\t\t\t\t\t\t<i :class="[menuItem.c4_icon2 ? menuItem.c4_icon2 : \'fa-solid fa-pen-to-square\', !menuItem.c4_link ? \'unavailable\' : null ]"></i>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass="fhc-body text-decoration-none text-truncate"\n\t\t\t\t\t\t\t:id="\'moodle_links_\'+lehrveranstaltung_id"\n\t\t\t\t\t\t\t:class="{ \'unavailable\':!menuItem.c4_link, \'dropdown-toggle\':menuItem.c4_moodle_links?.length }"\n\t\t\t\t\t\t\t:target="menuItem.c4_target"\n\t\t\t\t\t\t\t:href="c4_link(menuItem) ? c4_link(menuItem) : null">\n\t\t\t\t\t\t\t\t{{ menuItem.phrase ? $p.t(menuItem.phrase) : menuItem.name}}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<ul v-if="menuItem.c4_moodle_links?.length" class="dropdown-menu p-0" :aria-labelledby="\'moodle_links_\'+lehrveranstaltung_id">\n\t\t\t\t\t\t\t\t<li v-for="item in menuItem.c4_moodle_links"><a class="dropdown-item border-bottom" :href="item.url">{{item.lehrform}}</a></li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<div class="text-center d-flex justify-content-center align-items-center h-100" >\n\t\t\t\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t\t<div v-if="!emptyMenu" class="card-footer">\n\t\t\t<div class="row">\n\t\t\t\t\x3c!-- template for the LV if there are multiple pruefungen --\x3e\n\t\t\t\t<template v-if="LvHasPruefungenInformation">\n\t\t\t\t\t<a href="#" class="col-auto text-start text-decoration-none" @click.prevent="openPruefungen">\n\t\t\t\t\t\t<i class="fa fa-check text-success" v-if="positiv"></i>\n\t\t\t\t\t\t<span class="ps-1" :style="\'color:\'+gradeColor">{{ grade || $p.t(\'lehre/noGrades\') }}</span>\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t\t\x3c!-- template for the LV with no pruefungen --\x3e\n\t\t\t\t<template v-else>\n\t\t\t\t\t<span class="col-auto text-start text-decoration-none" >\n\t\t\t\t\t\t<i class="fa fa-check text-success" v-if="positiv"></i>\n\t\t\t\t\t\t<span class="ps-1" :style="\'color:\'+gradeColor">{{ grade || $p.t(\'lehre/noGrades\') }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</div>\n\t</div>'}},mixins:[Xt],props:{bezeichnung:String,kuerzel:String,semester:[String,Number],lvs:Array,sg_bezeichnung_eng:String},computed:{lehrveranstaltungen(){return[...new Map(this.lvs.map(t=>[t.lehrveranstaltung_id,t])).values()]}},methods:{note:t=>t.benotung&&(t.znote||t.lvnote)||null},template:'<div class="card mb-3">\n\t\t<div class="card-body">\n\t\t\t<h4 class="card-title mb-3">{{$p.user_language.value === \'English\' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}\n\t\t\t\t<small>{{semester}}.{{$p.t(\'lehre/semester\')}}</small>\n\t\t\t</h4>\n\t\t\t<div class="row">\n\t\t\t\t<div v-for="lv in lehrveranstaltungen" :key="lv.lehrveranstaltung_id" class="col-12 col-md-6 col-xl-4 col-xxl-3 mb-3">\n\t\t\t\t\t<mylv-semester-studiengang-lv v-bind="lv" class="text-center h-100"></mylv-semester-studiengang-lv>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>'}},provide(){return{studien_semester:Vue.computed(()=>this.semester)}},props:{semester:[String,Number],lvs:Array},computed:{ready(){return null!==this.lvs},studiengaenge(){return[...new Map(this.lvs.map(t=>[t.studiengang_kz+"#"+t.semester,{studiengang_kz:t.studiengang_kz,bezeichnung:t.sg_bezeichnung,sg_bezeichnung_eng:t.sg_bezeichnung_eng,kuerzel:t.studiengang_kuerzel,semester:t.semester}])).values()].sort((t,e)=>t.bezeichnung.toLowerCase()==e.bezeichnung.toLowerCase()?t.semester>e.semester:t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase())}},methods:{lvsForStudiengang(t){return this.lvs.filter(e=>e.studiengang_kz==t.studiengang_kz&&e.semester==t.semester)}},template:'<div class="mylv-semester" v-if="ready">\n\t\t<mylv-semester-studiengang v-for="studiengang in studiengaenge" :key="studiengang.studiengang_kz" v-bind="studiengang" :lvs="lvsForStudiengang(studiengang)"/>\n\t</div>\n\t<div class="mylv-semester text-center" v-else>\n\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t</div>'},ae={components:{MylvSemester:ie},mixins:[Xt],data:()=>({firstLoad:!0,studiensemester:null,lvs:{},currentSemester:null}),computed:{ready(){return null!==this.studiensemester&&(!this.firstLoad||null!==this.current.lvs)},current(){return null===this.currentSemester?{semester:null,lvs:[]}:(void 0===this.lvs[this.currentSemester]&&(this.lvs[this.currentSemester]={semester:this.currentSemester,lvs:null},axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Lvs/"+this.currentSemester).then(t=>{this.lvs[this.currentSemester].lvs=t.data.retval||[],this.firstLoad=!1})),this.lvs[this.currentSemester])},nearestSem(){let t=Date.now(),e=null,n=0;return this.studiensemester.forEach(i=>{let a=new Date(i.start),s=new Date(i.ende);if(t>=a&&t<=s)return e=i.studiensemester_kurzbz,void(n=0);let r=Math.min(Math.abs(t-a),Math.abs(t-s));(null===e||r<n)&&(e=i.studiensemester_kurzbz,n=r)}),e},currentIsFirst(){return this.studiensemester[0].studiensemester_kurzbz==this.currentSemester},currentIsLast(){return this.studiensemester[this.studiensemester.length-1].studiensemester_kurzbz==this.currentSemester}},methods:{prevSem(){this.$refs.studiensemester.selectedIndex--,this.$refs.studiensemester.dispatchEvent(new Event("change",{bubbles:!0}))},nextSem(){this.$refs.studiensemester.selectedIndex++,this.$refs.studiensemester.dispatchEvent(new Event("change",{bubbles:!0}))},updateRouter(t){this.$router.push(`/Cis/MyLv/${t}`)}},created(){axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Studiensemester").then(t=>{this.studiensemester=t.data.retval||[];const e=this.$route.params.studiensemester;e&&this.studiensemester.filter(t=>t.studiensemester_kurzbz==e).length?this.currentSemester=e:this.currentSemester=this.nearestSem})},beforeRouteUpdate(t,e,n){t.params.studiensemester&&this.studiensemester.filter(e=>e.studiensemester_kurzbz==t.params.studiensemester).length&&t.params.studiensemester!=this.currentSemester&&(this.currentSemester=t.params.studiensemester),n()},template:'\n\n\t<h2>{{$p.t(\'lehre/myLV\')}}</h2>\n\t<hr>\n\t<div class="mylv-student" v-if="ready">\n\t\t<div v-if="currentSemester" class="row justify-content-center mb-3">\n\t\t\t<div class="col-auto d-none">\n\t\t\t\t<label class="col-form-label">{{$p.t(\'lehre/studiensemester\')}}</label>\n\t\t\t</div>\n\t\t\t<div class="col-auto">\n\t\t\t\t<div class="input-group">\n\t\t\t\t\t<button :aria-label="$p.t(\'lehre\',\'previousStudSemester\')" v-tooltip.top="{showDelay:1000, value:$p.t(\'lehre\',\'previousStudSemester\')}" class="btn btn-outline-secondary" type="button" :disabled="currentIsFirst" @click="prevSem">\n\t\t\t\t\t\t<i class="fa fa-caret-left" aria-hidden="true"></i>\n\t\t\t\t\t</button>\n\t\t\t\t\t<select ref="studiensemester" v-model="currentSemester" class="form-select" :aria-label="$p.t(\'global/studiensemester_auswaehlen\')" @change="updateRouter($event.target.value)">\n\t\t\t\t\t\t<option v-for="semester in studiensemester" :key="semester.studiensemester_kurzbz">{{semester.studiensemester_kurzbz}}</option>\n\t\t\t\t\t</select>\n\t\t\t\t\t<button class="btn btn-outline-secondary" :aria-label="$p.t(\'lehre\',\'nextStudSemester\')" v-tooltip.top="{showDelay:1000, value:$p.t(\'lehre\',\'nextStudSemester\')}" type="button" :disabled="currentIsLast" @click="nextSem">\n\t\t\t\t\t\t<i class="fa fa-caret-right" aria-hidden="true"></i>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class="alert alert-danger" role="alert" v-else>\n\t\t\t{{$p.t(\'lehre/noLvFound\')}}\n\t\t</div>\n\t\t<mylv-semester v-bind="current"/>\n\t</div>\n\t<div class="mylv-student text-center" v-else>\n\t\t<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>\n\t</div>'};const se={emits:["dataFetched"],props:{refresh:{type:Boolean},apiFunction:{required:!0,type:Function},apiFunctionParameters:{}},watch:{refresh:function(t,e){this.fetchData()}},data:function(){return{loading:!1,error:!1,errorMessage:null}},created:function(){this.fetchData()},methods:{fetchData:function(){if(this.loading=!0,this.error=!1,this.errorMessage=null,"function"==typeof this.apiFunction){let t=this.apiFunction(this.apiFunctionParameters);t instanceof Promise?t.then(this.successHandler).catch(this.errorHandler).finally(this.finallyHandler):this.setError("The called apiFunction does not return a Promise")}else this.setError("Property apiFunction is not a function")},setError:function(t){this.loading=!1,this.error=!0,this.errorMessage=t},successHandler:function(t){this.$emit("dataFetched",t?t.data:void 0)},errorHandler:function(t){t.response?.data?.retval?this.setError(t.response.data.retval):t.data?.message?this.setError(t.data.message):this.setError(t.message)},finallyHandler:function(){this.loading=!1}},template:'\n\t\t<slot v-if="loading" name="loading">\n\t\t\t<div class="fetch-loader">Loading...</div>\n\t\t</slot>\n\t\t<slot v-else-if="error" name="error" :error-message="errorMessage">\n\t\t\t<div class="fetch-error">{{ errorMessage }}</div>\n\t\t</slot>\n\t\t<slot v-else></slot>\n\t'},re="Filter Component New Filter";var oe={props:{filters:{type:Array,default:[]},columns:{type:Array,default:[]},fields:{type:Array,default:[]}},emits:{switchFilter:["filterId"],applyFilterConfig:["filterFields"],saveCustomFilter:["customFilterName"]},data:function(){return{currentFields:[]}},computed:{types(){return this.columns.reduce((t,e)=>{let n=e.type.toLowerCase();return n.indexOf("int")>=0?t[e.name]="Numeric":n.indexOf("varchar")>=0||n.indexOf("text")>=0||n.indexOf("bpchar")>=0?t[e.name]="Text":n.indexOf("timestamp")>=0||n.indexOf("date")>=0?t[e.name]="Date":t[e.name]="",t},{})}},watch:{fields(t){this.currentFields=t}},methods:{switchFilter(t){this.$emit("switchFilter",t.currentTarget.value)},applyFilterConfig(){const t=this.currentFields.filter(t=>t.name!=re);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:re})},removeField(t){this.currentFields.splice(t,1)}},template:'\n\t<div class="filter-config">\n\t\t<div class="card">\n\t\t\t<div class="card-body">\n\t\t\t\t<div v-if="filters.length" class="mb-4">\n\t\t\t\t\t<select class="form-select" @change="switchFilter">\n\t\t\t\t\t\t<option value="">Bitte auswählen...</option>\n\t\t\t\t\t\t<option v-for="filter in filters" :value="filter.id">\n\t\t\t\t\t\t\t{{ filter.description }}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<button class="btn btn-outline-dark" type="button" @click=addField>\n\t\t\t\t\t\t<span class="fa-solid fa-plus" aria-hidden="true"></span> Neuer Filter\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="filter-config-fields my-3">\n\t\t\t\t\t<div v-for="(filterField, index) in currentFields" class="filter-config-field row">\n\n\t\t\t\t\t\t<div class="col-5">\n\t\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t\t<span class="input-group-text">Filter {{ index + 1 }}</span>\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tclass="form-select"\n\t\t\t\t\t\t\t\t\tv-model="filterField.name"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<option value="">Feld zum Filter hinzufügen...</option>\n\t\t\t\t\t\t\t\t\t<option v-for="col in columns" :value="col.name">\n\t\t\t\t\t\t\t\t\t\t{{ col.title }}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\x3c!-- Numeric --\x3e\n\t\t\t\t\t\t<template v-if="types[filterField.name] == \'Numeric\'">\n\t\t\t\t\t\t\t<div class="col-2">\n\t\t\t\t\t\t\t\t<select class="form-select" v-model="filterField.operation">\n\t\t\t\t\t\t\t\t\t<option value="equal">Gleich</option>\n\t\t\t\t\t\t\t\t\t<option value="nequal">Nicht gleich</option>\n\t\t\t\t\t\t\t\t\t<option value="gt">Größer als</option>\n\t\t\t\t\t\t\t\t\t<option value="lt">Weniger als</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-3">\n\t\t\t\t\t\t\t\t<input type="number" class="form-control" v-model="filterField.condition">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\x3c!-- Text --\x3e\n\t\t\t\t\t\t<template v-if="types[filterField.name] == \'Text\'">\n\t\t\t\t\t\t\t<div class="col-2">\n\t\t\t\t\t\t\t\t<select class="form-select" v-model="filterField.operation">\n\t\t\t\t\t\t\t\t\t<option value="equal">Gleich</option>\n\t\t\t\t\t\t\t\t\t<option value="nequal">Nicht gleich</option>\n\t\t\t\t\t\t\t\t\t<option value="contains">Enthält</option>\n\t\t\t\t\t\t\t\t\t<option value="ncontains">Enthält nicht</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-3">\n\t\t\t\t\t\t\t\t<input type="text" class="form-control" v-model="filterField.condition">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\x3c!-- Timestamp and date --\x3e\n\t\t\t\t\t\t<template v-if="types[filterField.name] == \'Date\'">\n\t\t\t\t\t\t\t<div class="col-2">\n\t\t\t\t\t\t\t\t<select class="form-select" v-model="filterField.operation">\n\t\t\t\t\t\t\t\t\t<option value="gt">Größer als</option>\n\t\t\t\t\t\t\t\t\t<option value="lt">Weniger als</option>\n\t\t\t\t\t\t\t\t\t<option value="set">Eingestellt ist</option>\n\t\t\t\t\t\t\t\t\t<option value="nset">Eingestellt nicht ist</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-1">\n\t\t\t\t\t\t\t\t<input type="number" class="form-control" v-model="filterField.condition">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-2">\n\t\t\t\t\t\t\t\t<select class="form-select" v-model="filterField.option">\n\t\t\t\t\t\t\t\t\t<option value="minutes">Minuten</option>\n\t\t\t\t\t\t\t\t\t<option value="hours">Stunden</option>\n\t\t\t\t\t\t\t\t\t<option value="days">Tage</option>\n\t\t\t\t\t\t\t\t\t<option value="months">Monate</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t<div class="col text-end">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass="btn btn-outline-dark"\n\t\t\t\t\t\t\t\ttype="button"\n\t\t\t\t\t\t\t\t@click="removeField(index)"\n\t\t\t\t\t\t\t\ttitle="Filter entfernen"\n\t\t\t\t\t\t\t\taria-title="Filter entfernen"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span class="fa-solid fa-minus" aria-hidden="true"></span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t\x3c!-- Filter save options --\x3e\n\t\t\t\t<div class="row">\n\t\t\t\t\t<div class="col-7">\n\t\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t\t<input ref="filterName" type="text" class="form-control" placeholder="Filternamen eingeben...">\n\t\t\t\t\t\t\t<button type="button" class="btn btn-outline-secondary" @click="$emit(\'saveCustomFilter\', $refs.filterName.value)">Filter speichern</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t<button type="button" class="btn btn-outline-dark" @click="applyFilterConfig">Filter anwenden</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t'},le={props:{fields:Array,selected:{type:Array,default:[]},names:{type:Object,default:{}}},emits:{hide:["fieldName"],show:["fieldName"]},data:function(){return{selectedFields:[]}},watch:{selected(t){this.selectedFields=t}},methods:{toggle(t){-1!=this.selectedFields.indexOf(t)?(this.selectedFields.splice(this.selectedFields.indexOf(t),1),this.$emit("hide",t)):(this.selectedFields.push(t),this.$emit("show",t))}},template:'\n\t<div class="filter-columns">\n\t\t<div class="card">\n\t\t\t<div class="d-flex flex-wrap gap-2 p-3 justify-content-center">\n\t\t\t\t<div\n\t\t\t\t\tv-for="fieldToDisplay in fields"\n\t\t\t\t\tclass="btn"\n\t\t\t\t\t:class="selectedFields.indexOf(fieldToDisplay) != -1 ? \'btn-dark\' : \'btn-outline-dark\' "\n\t\t\t\t\t@click="toggle(fieldToDisplay)"\n\t\t\t\t>\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t'};const de={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},ce={jsonLines:"Download as JSONLINES",xlsx:"Download as XLSX",pdf:"Download as PDF",html:"Download as HTML",json:"Download as JSON",csv:"Download as CSV "};var ue={props:{tabulator:Object,config:{type:[Boolean,String,Function,Array,Object],default:!1},iconClass:[String,Array,Object]},computed:{currentConfig(){if(!this.config)return!1;let t=this.config;if(t instanceof Function)return[t];if(null===t)return[];if(!0===this.config&&(t=["csv"]),"[object String]"===Object.prototype.toString.call(t)&&(t=t.split(",")),"object"==typeof t&&!Array.isArray(t)){let a=[];for(var e in t){var n,i=t[e];i&&("[object String]"===Object.prototype.toString.call(i)?null!==(n=this.stringToFileFormatter(i))?a.push({icon:"fa-solid "+de[n],label:i===e?ce[n]:e,formatter:n}):null!==(n=this.stringToFileFormatter(e))?a.push({icon:"fa-solid "+de[n],label:i,formatter:n}):alert("neither "+e+" nor "+i+" are supported download file types"):"object"!=typeof i||Array.isArray(i)?null!==(n=this.stringToFileFormatter(e))?a.push({icon:"fa-solid "+de[n],label:ce[n],formatter:n}):alert(e+" is not a supported download file type"):null!==(n=this.stringToFileFormatter(e))?(void 0===i.formatter&&(i.formatter=n),void 0===i.label&&(i.label=ce[n]),void 0===i.icon&&(i.icon=de[n]),a.push(i)):(void 0===i.label&&(i.label=e),a.push(i)))}t=a}if(Array.isArray(t)){if(t=t.map(t=>{if("[object String]"===Object.prototype.toString.call(t)){let e=this.stringToFileFormatter(t);return null===e?null:{icon:"fa-solid "+de[e],label:ce[e],formatter:e}}if(t instanceof Function)return{formatter:t};if("object"==typeof t&&!Array.isArray(t)&&null!==t){if(t.formatter instanceof Function)return t;if(this.validateFileFormatter(t.formatter))return t}return null}).filter(t=>null!==t),t.length<2)return t;if(t.filter(t=>t.label||t.icon).length==t.length)return t;alert("Config not valid")}return[]}},methods:{stringToFileFormatter(t){let e=t.toLowerCase();return"jsonlines"==e?"jsonLines":["xlsx","pdf","html","json","csv"].includes(e)?e:null},validateFileFormatter(t){let e=this.stringToFileFormatter(t);if(!e)return alert(t+" is not a supported file formatter"),!1;if("xlsx"==e&&!window.XLSX)return alert("XLSX Library not loaded"),!1;if("pdf"==e){if(!window.jspdf)return alert("jsPDF Library not loaded"),!1;if(!new jspdf.jsPDF({}).autoTable)return alert("jsPDF-AutoTable Plugin not loaded"),!1}return!0},download(t){this.tabulator.download(t.formatter,t.file,t.options)}},template:'\n\t<template v-if="currentConfig">\n\t\t<template v-if="currentConfig.length == 1">\n\t\t\t<a\n\t\t\t\thref="#"\n\t\t\t\tclass="table-download"\n\t\t\t\tv-bind="$attrs"\n\t\t\t\ttitle="Download"\n\t\t\t\taria-title="Download"\n\t\t\t\[email protected]="download(currentConfig[0])"\n\t\t\t>\n\t\t\t\t<span :class="iconClass || \'fa-solid fa-xl fa-download\'" aria-hidden="true"></span>\n\t\t\t</a>\n\t\t</template>\n\t\t<div v-else class="dropdown d-inline">\n\t\t\t<a\n\t\t\t\thref="#"\n\t\t\t\tclass="table-download"\n\t\t\t\tv-bind="$attrs"\n\t\t\t\ttitle="Download"\n\t\t\t\taria-title="Download"\n\t\t\t\trole="button"\n\t\t\t\tdata-bs-toggle="dropdown"\n\t\t\t\taria-expanded="false"\n\t\t\t>\n\t\t\t\t<span :class="iconClass || \'fa-solid fa-xl fa-download\'" aria-hidden="true"></span>\n\t\t\t</a>\n\t\t\t<ul class="dropdown-menu dropdown-menu-end">\n\t\t\t\t<li v-for="(conf, i) in currentConfig" :key="i">\n\t\t\t\t\t<a class="dropdown-item" href="#" @click.prevent="download(conf)">\n\t\t\t\t\t\t<span v-if="conf.icon" :class="conf.icon" aria-hidden="true"></span>\n\t\t\t\t\t\t{{conf.label}}\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</div>\n\t</template>\n\t'};const pe=new WeakMap;var he={mounted(t,e){let n=!1;pe.set(t,e=>{if(!n)return;if(t.contains(e.target))return;const i=bootstrap.Collapse.getInstance(t);i&&i.hide()}),t.addEventListener("shown.bs.collapse",()=>{n=!0}),t.addEventListener("hide.bs.collapse",()=>{n=!1}),document.addEventListener("click",pe.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",pe.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var n=0,i=this.table.rowManager.element.clientWidth,a=0,s=!1;t.forEach((t,e)=>{t.widthFixed||t.reinitializeWidth(),(this.table.options.responsiveLayout?t.modules.responsive.visible:t.visible&&!t.definition.frozen)&&(s=t),t.visible&&(n+=t.getWidth())}),s?(a=i-n+s.getWidth(),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&(s.setWidth(0),this.table.modules.responsiveLayout.update()),a>0?s.setWidth(a):s.reinitializeWidth()):this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update()}});var me={saveCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/saveCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName}}),removeCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/removeCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),applyFilterFields:t=>({method:"post",url:"/api/frontend/v1/filter/applyFilterFields",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields}}),addFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/addFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),removeFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/removeFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),getFilterById:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),getFilter:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType}})},ge=0;const fe={components:{CoreFetchCmpt:se,FilterConfig:oe,FilterColumns:le,TableDownload:ue},directives:{collapseAutoClose:he},emits:["nwNewEntry","click:new","tableBuilt","uuidDefined","headerFilterOn"],props:{onNwNewEntry:Function,title:String,description:String,sideMenu:{type:Boolean,default:!0},filterType:{type:String},tabulatorOptions:Object,tabulatorEvents:Array,tableOnly:Boolean,noColumnFilter:Boolean,reload:Boolean,reloadBtnInfotext:String,download:{type:[Boolean,String,Function,Array,Object],default:!1},newBtnShow:Boolean,newBtnClass:[String,Array,Object],newBtnDisabled:Boolean,newBtnLabel:String,uniqueId:String,idField:String,parentIdField:String,countOnly:Boolean,useSelectionSpan:{type:Boolean,default:!0}},data:function(){return{uuid:0,filterName:null,filterActive:!1,fields:null,dataset:null,datasetMetadata:null,selectedFields:null,filterFields:null,availableFilters:null,selectedFilter:null,fetchCmptRefresh:!1,fetchCmptApiFunction:null,fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchResult:null,tabulator:null,tableBuilt:!1,tabulatorHasSelector:!1,selectedData:[],persistence:{sort:!0,columns:!0,filter:!1,headerFilter:!1,group:!1,page:!1}}},computed:{notSelectedFields(){return this.fields&&this.selectedFields?this.fields.filter(t=>-1===this.selectedFields.indexOf(t)):null},filteredData(){return this.dataset?JSON.parse(JSON.stringify(this.dataset)):[]},filteredColumns(){let t=JSON.parse(JSON.stringify(this.fields))||[],e=JSON.parse(JSON.stringify(this.selectedFields))||[],n=null;if(this.tabulatorOptions&&this.tabulatorOptions.hasOwnProperty("columns")&&(n=this.tabulatorOptions.columns),!Array.isArray(n)||Array.isArray(n)&&n.length<t.length){n=[];for(let i of t){let t={title:i,field:i};t.visible=e.indexOf(i)>=0,n.push(t)}}else for(let i of n)i.visible=e.indexOf(i.field)>=0||-1==t.indexOf(i.field),i.hasOwnProperty("resizable")&&(i.resizable=i.visible);return n},fieldIdsForVisibilty(){return this.tableBuilt?this.tabulator.getColumns().filter(t=>{let e=t.getDefinition();return!e.frozen&&e.title&&"responsiveCollapse"!=e.formatter}).map(t=>t.getField()):[]},fieldNames(){return this.tableBuilt?this.tabulator.getColumns().reduce((t,e)=>(t[e.getField()]=e.getDefinition().title,t),{}):{}},idExtra(){return this.uuid?"-"+this.uuid:""},columnsForFilter(){if(!this.filteredColumns||!this.datasetMetadata)return[];const t=this.filteredColumns.reduce((t,e)=>(t[e.field]=e.title,t),{});return this.datasetMetadata.map(e=>({...e,title:t[e.name]}))}},methods:{reloadTable(){this.tableOnly?this.tabulator.setData():this.getFilter()},async initTabulator(){let t="< Phrasen Plugin not loaded! >";this.$p&&(await this.$p.loadCategory("ui"),t=this.$p.t("ui/keineDatenVorhanden")),this.tableOnly||await new Promise(t=>{const e=window.location.hash?window.location.hash.slice(1):null,n=e=>{this.setRenderData(e),t()};null===e?this.startFetchCmpt(t=>this.$api.call(me.getFilter(t)),null,n):this.startFetchCmpt(t=>this.$api.call(me.getFilterById(t)),{filterId:e},n)});let e={layout:"fitDataStretchFrozen",movableColumns:!0,columnDefaults:{tooltip:!0},placeholder:t,persistence:this.persistence,...this.tabulatorOptions||{}};if(void 0===e.height&&void 0===e.minHeight&&void 0===e.maxHeight&&(e.height=500),this.tableOnly?e.columns.forEach(t=>{void 0===t.visible&&(t.visible=!0)}):(e.data=this.filteredData,e.columns=this.filteredColumns),(e.selectable||e.selectableRows||e.columns&&e.columns.filter(t=>"rowSelection"==t.formatter).length)&&(this.tabulatorHasSelector=!0),this.idField&&(this.parentIdField&&(e.dataTree=!0),e.index=this.idField),this.tabulator=new Tabulator(this.$refs.table,e),Array.isArray(this.tabulatorEvents)&&this.tabulatorEvents.length>0)for(let t of this.tabulatorEvents)this.tabulator.on(t.event,t.handler);this.tabulator.on("tableBuilt",()=>{this.tableBuilt=!0,this.$emit("tableBuilt")}),this.tabulator.on("rowSelectionChanged",t=>{this.selectedData=t}),this.parentIdField&&this.idField&&this.tabulator.on("dataLoading",t=>{let e=[];for(let n=0;n<t.length;n++){let i=t[n];i[this.parentIdField]&&this.appendChild(t,i)&&e.push(n)}for(let n=0;n<e.length;n++)t.splice(e[n]-n,1)}),this.tableOnly&&this.tabulator.on("tableBuilt",()=>{const t=this.tabulator.getColumns();this.fields=t.map(t=>t.getField()),this.selectedFields=t.filter(t=>t.isVisible()).map(t=>t.getField()),this.tabulator.options.persistence.headerFilter&&this._setHeaderFilter()}),this.tabulator.on("dataFiltered",t=>{this.filterActive=t.length>0,this.$emit("headerFilterOn",this.filterActive)})},updateTabulator(){this.tabulator&&(this.tableBuilt?this._updateTabulator():this.tabulator.on("tableBuilt",this._updateTabulator))},_updateTabulator(){this.tabulatorHasSelector=this.tabulatorOptions.selectable||this.tabulatorOptions.selectableRows||this.filteredColumns.filter(t=>"rowSelection"==t.formatter).length,this.tabulator.setColumns(this.filteredColumns),this.tabulator.setData(this.filteredData),this._setHeaderFilter()},clearFilters(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,"")}),this.tabulator.clearFilter(),this.filterActive=!1},_setHeaderFilter(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,t.value)})},getFilter(){null===this.selectedFilter?this.startFetchCmpt(t=>this.$api.call(me.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(me.getFilterById(t)),{filterId:this.selectedFilter},this.render)},setRenderData(t){this.fetchResult=t,this.filterName=t.filterName,this.dataset=t.dataset,this.datasetMetadata=t.datasetMetadata,this.fields=t.fields,this.selectedFields=t.selectedFields,this.filterFields=[];for(let e=0;e<t.datasetMetadata.length;e++)for(let n=0;n<t.filters.length;n++)if(t.datasetMetadata[e].name==t.filters[n].name){let i=t.filters[n];i.type=t.datasetMetadata[e].type,this.filterFields.push(i)}},render(t){let e=t;this.setRenderData(e),!0===this.sideMenu?this.setSideMenu(e):this.setDropDownMenu(e),this.updateTabulator()},setSideMenu(t){let e=t.sideMenu.filters,n=t.sideMenu.personalFilters,i=[];for(let t=0;t<e.length;t++){let n=e[t].link;null==n&&(n="#"),i[i.length]={id:e[t].filter_id,link:n+e[t].filter_id,description:e[t].desc,sort:t,onClickCall:this.handlerGetFilterById}}for(let t=0;t<n.length;t++){let e=n[t].link;null==e&&(e="#"),i[i.length]={id:n[t].filter_id,link:e+n[t].filter_id,description:n[t].desc,subscriptDescription:n[t].subscriptDescription,subscriptLinkClass:n[t].subscriptLinkClass,subscriptLinkValue:n[t].subscriptLinkValue,sort:t,onClickCall:this.handlerGetFilterById,onClickSubscriptCall:this.handlerRemoveCustomFilter}}this.availableFilters=i,this.$emit("nwNewEntry",{link:"#",description:"Filters",icon:"filter",children:i})},setDropDownMenu(t){let e=t.sideMenu.filters,n=t.sideMenu.personalFilters,i=[];for(let t=0;t<e.length;t++)e[t].link,i[i.length]={id:e[t].filter_id,option:e[t].filter_id,description:e[t].desc};for(let t=0;t<n.length;t++)n[t].link,i[i.length]={id:n[t].filter_id,option:n[t].filter_id,description:n[t].desc};this.availableFilters=i},startFetchCmpt(t,e,n){this.fetchCmptApiFunction=t,null==e&&(e={}),e.filterUniqueId=FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,e.filterType=this.filterType,this.uniqueId&&(e.filterUniqueId+="_"+this.uniqueId),this.fetchCmptApiFunctionParams=e,this.fetchCmptDataFetched=n,!0===this.fetchCmptRefresh?this.fetchCmptRefresh=!1:this.fetchCmptRefresh=!0},handlerSaveCustomFilter(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(me.saveCustomFilter(t)),{customFilterName:t},this.getFilter)},handlerRemoveCustomFilter(t){let e=t.currentTarget.getAttribute("href").substring(1);e===this.selectedFilter&&(this.selectedFilter=null),this.startFetchCmpt(t=>this.$api.call(me.removeCustomFilter(t)),{filterId:e},this.getFilter)},handlerGetFilterById:function(t){let e=null,n=t.currentTarget.getAttribute("href");e=null==n?t.currentTarget.value:n.substring(1),this.switchFilter(e)},switchFilter(t){this.selectedFilter=t,this.getFilter()},applyFilterConfig(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(me.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let n=e[this.parentIdField];for(let i=0;i<t.length;i++){let a=t[i];if(a[this.idField]==n)return a._children||(a._children=[]),a._children.includes(e)||a._children.push(e),!0;a._children&&this.appendChild(a._children,e)}return!1}},beforeCreate(){!this.tableOnly==!this.filterType&&alert("You can not have a filter-type in table-only mode!")},created(){!this.sideMenu||this.$props.onNwNewEntry&&this.$props.onNwNewEntry instanceof Function||alert('"nwNewEntry" listener is mandatory when sideMenu is true'),this.uuid=ge++,this.$emit("uuidDefined",this.uuid)},mounted(){this.initTabulator().then(()=>{this.tableOnly||(this.selectedFilter=window.location.hash?window.location.hash.slice(1):null,this.render(this.fetchResult))})},template:'\n\t\t\x3c!-- Load filter data --\x3e\n\t\t<core-fetch-cmpt\n\t\t\tv-if="!tableOnly && fetchCmptApiFunction"\n\t\t\tv-bind:api-function="fetchCmptApiFunction"\n\t\t\tv-bind:api-function-parameters="fetchCmptApiFunctionParams"\n\t\t\tv-bind:refresh="fetchCmptRefresh"\n\t\t\t@data-fetched="fetchCmptDataFetched">\n\t\t</core-fetch-cmpt>\n\n\t\t<div class="row" v-if="title != null && title != \'\'">\n\t\t\t<div class="col-lg-12">\n\t\t\t\t<h3 class="page-header mt-1 mb-4">\n\t\t\t\t\t{{ title }}\n\t\t\t\t</h3>\n\t\t\t</div>\n\t\t</div>\n\t\t<div :id="\'filterCollapsables\' + idExtra">\n\n\t\t\t<div class="d-flex flex-row justify-content-between flex-wrap">\n\t\t\t\t<div v-if="newBtnShow || reload || $slots.search || $slots.actions" class="d-flex gap-2 align-items-baseline flex-wrap">\n\t\t\t\t\t<button v-if="newBtnShow" class="btn btn-primary" :class="newBtnClass" :title="newBtnLabel ? undefined : \'New\'" :aria-label="newBtnLabel ? undefined : \'New\'" @click="$emit(\'click:new\', $event)" :disabled="newBtnDisabled">\n\t\t\t\t\t\t<span class="fa-solid fa-plus" aria-hidden="true"></span>\n\t\t\t\t\t\t{{ newBtnLabel }}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button v-if="reload" class="btn btn-outline-secondary" aria-label="Reload" @click="reloadTable">\n\t\t\t\t\t\t<span class="fa-solid fa-rotate-right" aria-hidden="true" :title="reloadBtnInfotext ? reloadBtnInfotext : \'Reload\'" ></span>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span v-if="$slots.actions && tabulatorHasSelector && useSelectionSpan">\n\t\t\t\t\t\t<span v-if="countOnly">{{ selectedData.length }} ausgewählt</span>\n\t\t\t\t\t\t<span v-else id="selected-info-text"> Mit {{ selectedData.length }} ausgewählten:</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<slot name="actions" v-bind="{selected: tabulatorHasSelector ? selectedData : []}"></slot>\n\t\t\t\t\t<slot name="search"></slot>\n\t\t\t\t</div>\n\t\t\t\t<div class="d-flex gap-1 align-items-baseline flex-grow-1 justify-content-end">\n\t\t\t\t\t<span v-if="!tableOnly">[ {{ filterName }} ]</span>\n\t\t\t\t\t<span v-else-if="description" v-html="description"></span>\n\t\t\t\t\t<a aria-label="filter" v-if="!tableOnly || $slots.filter" href="#" class="btn btn-link px-0 fhc-text" data-bs-toggle="collapse" :data-bs-target="\'#collapseFilters\' + idExtra">\n\t\t\t\t\t\t<span class="fa-solid fa-xl fa-filter"></span>\n\t\t\t\t\t</a>\n\t\t\t\t\t<a aria-label="filter" v-if="filterActive" class="btn btn-link px-0 fhc-text" :title="$p.t(\'ui\',\'filterdelete\')" @click="clearFilters">\n\t\t\t\t\t\t<span class="fa-solid fa-xl fa-filter-circle-xmark"></span>\n\t\t\t\t\t</a>\n\t\t\t\t\t<a aria-label="filter" href="#" class="btn btn-link px-0 fhc-text" data-bs-toggle="collapse" :data-bs-target="\'#collapseColumns\' + idExtra">\n\t\t\t\t\t\t<span class="fa-solid fa-xl fa-table-columns"></span>\n\t\t\t\t\t</a>\n\t\t\t\t\t<table-download class="btn btn-link px-0 fhc-text" :tabulator="tabulator" :config="download"></table-download>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<filter-columns\n\t\t\t\t:id="\'collapseColumns\' + idExtra"\n\t\t\t\tclass="card-body collapse"\n\t\t\t\t:data-bs-parent="\'#filterCollapsables\' + idExtra"\n\t\t\t\t:fields="fieldIdsForVisibilty"\n\t\t\t\t:selected="selectedFields"\n\t\t\t\t:names="fieldNames"\n\t\t\t\t@hide="tabulator.hideColumn($event)"\n\t\t\t\t@show="tabulator.showColumn($event)"\n\t\t\t\tv-collapse-auto-close\n\t\t\t></filter-columns>\n\n\t\t\t<filter-config\n\t\t\t\tv-if="!tableOnly"\n\t\t\t\t:id="\'collapseFilters\' + idExtra"\n\t\t\t\tclass="card-body collapse"\n\t\t\t\t:data-bs-parent="\'#filterCollapsables\' + idExtra"\n\t\t\t\t:filters="!sideMenu ? (availableFilters || []) : []"\n\t\t\t\t:columns="columnsForFilter"\n\t\t\t\t:fields="filterFields || []"\n\t\t\t\t@switch-filter="switchFilter"\n\t\t\t\t@apply-filter-config="applyFilterConfig"\n\t\t\t\t@save-custom-filter="handlerSaveCustomFilter"\n\t\t\t\tv-collapse-auto-close\n\t\t\t></filter-config>\n\t\t\t<div\n\t\t\t\tv-else-if="$slots.filter"\n\t\t\t\t:id="\'collapseFilters\' + idExtra"\n\t\t\t\tclass="card-body collapse"\n\t\t\t\t:data-bs-parent="\'#filterCollapsables\' + idExtra"\n\t\t\t\tv-collapse-auto-close\n\t\t\t\t>\n\t\t\t\t<slot name="filter"></slot>\n\t\t\t</div>\n\t\t</div>\n\n\t\t\x3c!-- Tabulator --\x3e\n\t\t<div ref="table" :id="\'filterTableDataset\' + idExtra" class="filter-table-dataset"></div>\n\t'};var ve={props:{data:Object,title:{type:String}},data:()=>({}),created(){},template:'\n\t<template v-if="Array.isArray(data) && data.length >0">\n <div class="card">\n <div class="card-header">\n {{title}}\n </div>\n <div class="card-body">\n <h4 class="card-title">{{$p.t(\'profil\',\'mailverteilerMitglied\')}}</h4>\n <div class="card-text row text-break mb-2" v-for="verteiler in data">\n <div class="col-12 ">\n <div class="row">\n <div class="col-1 ">\n <i class="fa-solid fa-envelope fhc-link-color" ></i>\n </div>\n <div class="col">\n <a class="fhc-link-color" :href="verteiler.mailto"><b>{{verteiler.gruppe_kurzbz}}</b></a>\n </div>\n </div>\n </div>\n <div class="col-11 offset-1 ">{{verteiler.beschreibung}}</div>\n </div>\n </div>\n </div>\n\t</template>'},be={props:{data:{type:String}},data:()=>({}),template:"\n <div class=\"card\">\n <div class=\"card-body\">\n <span >{{$p.t('profil','fhAusweisStatus',[data])}}</span>\n </div>\n </div>"},ye={props:{data:{type:String},title:{type:String,required:!0},mobile:{type:Boolean,default:!1}},methods:{hideCollapse:function(){this.collapseOpen=!1},showCollapse:function(){this.collapseOpen=!0}},data:()=>({collapseOpen:!1}),template:'\n<div class="card">\n <template v-if="mobile">\n <button class="btn btn-outline-primary" data-bs-toggle="collapse" data-bs-target="#quickLinks" :aria-expanded="collapseOpen" aria-controls="quickLinks" >\n {{title}}\n <i class="fa " :class="collapseOpen?\'fa-chevron-up\':\'fa-chevron-down\'"></i> \n </button>\n <div @[`show.bs.collapse`]="collapseOpen=true;" @[`hide.bs.collapse`]="collapseOpen=false;" class="mt-1 collapse" id="quickLinks">\n <div class="list-group">\n <a href="#" class="list-group-item list-group-item-action">{{$p.t(\'profil\',\'zeitwuensche\')}}</a>\n <a href="#" class="list-group-item list-group-item-action">{{$p.t(\'profil\',\'lehrveranstaltungen\')}}</a>\n <a href="#" class="list-group-item list-group-item-action ">{{$p.t(\'profil\',\'zeitsperren\')}}</a>\n </div>\n </div>\n </template>\n <template v-else>\n <div class="card-header">{{title}}</div>\n <div class="card-body">\n <a style="text-decoration:none" class="my-1 d-block" href="#">{{$p.t(\'profil\',\'zeitwuensche\')}}</a>\n <a style="text-decoration:none" class="my-1 d-block" href="#">{{$p.t(\'profil\',\'lehrveranstaltungen\')}}</a>\n <a style="text-decoration:none" class="my-1 d-block" href="#">{{$p.t(\'profil\',\'zeitsperren\')}}</a>\n </div>\n </template>\n</div>'},we={props:{data:Object,view:String,withZustelladresse:{type:Boolean,default:!0}},data:()=>({}),created(){},template:'\n \n <div class="gy-2 row justify-content-center align-items-center">\n \n \x3c!-- column 1 in the address row --\x3e\n <div class="col-1 text-center">\n <i class="fa fa-location-dot fa-lg fhc-link-color" ></i>\n </div>\n \n <div class="col-11 col-sm-8 col-xl-11 col-xxl-8 order-1">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'person\',\'strasse\')}}</div>\n <span class="form-underline-content">{{data.strasse}} </span>\n </div>\n </div>\n \n \x3c!-- column 2 in the address row --\x3e\n <div class="offset-1 offset-sm-0 offset-xl-1 offset-xxl-0 order-2 order-sm-4 order-xl-2 order-xxl-4 col-11 col-sm-5 col-xl-11 col-xxl-5">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'global\',\'typ\')}}</div>\n <span class="form-underline-content">{{data.typ}} </span>\n </div>\n </div>\n \n <div class="offset-1 order-3 order-sm-3 col-11 col-sm-6 col-xl-7 col-xxl-6"> \n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'person\',\'ort\')}}</div>\n <span class="form-underline-content">{{data.ort}} </span>\n </div>\n </div>\n <div class=" offset-1 offset-sm-0 order-4 order-sm-2 order-xl-4 order-xxl-2 col-11 col-sm-3 col-xl-4 col-xxl-3">\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'person\',\'plz\')}}</div>\n <span class="form-underline-content">{{data.plz}} </span>\n </div>\n </div>\n\n <div v-if="withZustelladresse" class="order-5 offset-1 col-11">\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'person\',\'zustelladresse\')}}</div>\n <div class="ms-2 form-check ">\n <input class="form-check-input" type="checkbox" @click.prevent :checked="data.zustelladresse" >\n </div>\n </div>\n </div>\n </div>\n'},ke={props:{view:String,data:Object},data:()=>({}),created(){},template:'\n\t<template v-if="data.kontakt">\n <div class="gy-2 row align-items-center justify-content-center">\n <div class="col-1 text-center" >\n <i class="fa-solid fhc-link-color" :class="{...(data.kontakt.includes(\'@\')?{\'fa-envelope\':true}:{\'fa-phone\':true})}" ></i>\n </div>\n <div :class="{...(data.anmerkung? {\'col-11\':true, \'col-md-6\':true, \'col-xl-11\':true, \'col-xxl-6\':true} : {\'col-10\':true, \'col-xl-9\':true, \'col-xxl-10\':true})}">\n \x3c!-- rendering KONTAKT emails --\x3e\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'profil\',data.kontakttyp.toUpperCase())}}</div>\n <a v-if="data.kontakt.includes(\'@\')" role="link" :aria-disabled="view?true:false" :href="!view?(\'mailto:\'+data.kontakt):null" class="form-underline-content">{{data.kontakt}} </a>\n <a v-else role="link" :aria-disabled="view?true:false" :href="!view?(\'tel:\'+data.kontakt):null" class="form-underline-content">{{data.kontakt}} </a>\n </div>\n </div>\n <div v-if="data?.anmerkung" class="offset-1 offset-md-0 offset-xl-1 offset-xxl-0 order-2 order-sm-1 col-10 col-md-4 col-xl-9 col-xxl-4 ">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'global\',\'anmerkung\')}}</div>\n <span class="form-underline-content">{{data.anmerkung}} </span>\n </div>\n </div>\n <div class="text-center col-1 col-sm-1 order-2 order-lg-1 col-xl-2 col-xxl-1 allign-middle">\n <i v-if="data.zustellung" class="fa-solid fa-check"></i>\n <i v-else="data.zustellung" class="fa-solid fa-xmark"></i>\n </div>\n </div>\n\t</template>\n'},_e={data:()=>({}),props:{title:{type:String,required:!0},data:{type:Array}},template:'\n<div class="card ">\n <div class="card-header">\n {{title}}\n </div>\n <div class="card-body">\n \x3c!-- HIER SIND DIE EMAILS --\x3e\n <div class="gy-3 row justify-content-center ">\n <div v-for="email in data" class="col-12 ">\n\t\t\t\t<template v-if="email.email">\n\t\t\t\t\t<div class="row align-items-center">\n\t\t\t\t\t\t<div class="col-1 text-center">\n\t\t\t\t\t\t\t<i class="fa-solid fa-envelope fhc-link-color" ></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-11">\n\t\t\t\t\t\t\t<div class="form-underline">\n\t\t\t\t\t\t\t\t<div class="form-underline-titel">{{email?.type}}</div>\n\t\t\t\t\t\t\t\t<a :href="\'mailto:\'+email?.email" class="form-underline-content">{{email?.email}} </a>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n </div>\n </div>\n </div>\n</div>'},Ae={data:()=>({}),props:{data:{type:Object},title:{type:String}},inject:{studiengang_kz:{from:"studiengang_kz",default:!1}},computed:{getLinkGruppeListe(){return!1===this.studiengang_kz?"":this.data.gruppe?.value&&this.data.verband?.value&&this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value+"&verband="+this.data.verband.value+"&grp="+this.data.gruppe.value:""},getLinkVerbandListe(){return!1===this.studiengang_kz?"":this.data.verband?.value&&this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value+"&verband="+this.data.verband.value:""},getLinkSemesterListe(){return!1===this.studiengang_kz?"":this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value:""}},created(){},template:'\n <div class="card"> \n <div class="card-header">{{title}}</div>\n <div class="card-body">\n <div class="gy-3 row">\n\t\t\t\t<div v-for="(entry, key) in data" class="col-md-6 col-sm-12 ">\n\t\t\t\t\t\n\t\t\t\t\t<div class="form-underline">\n\t\t\t\t\t\t<div class="form-underline-titel">{{entry.label }}</div>\n\t\t\t\n\t\t\t\t\t\t\x3c!-- print Telefon link --\x3e\n\t\t\t\t\t\t<a v-if="key == \'telefon\'" :href="entry.value ?\'tel:\'+entry.value:null" :class="{\'form-underline-content\':true,\'text-decoration-none\':!entry.value,\'text-body\':!entry.value}">{{entry.value ?? \'-\'}}</a>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print semester link --\x3e\n\t\t\t\t\t\t<span v-else-if="key == \'semester\' && entry.value" class="form-underline-content">\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t<a :aria-label="$p.t(\'profil\',\'semesterLink\')" class="ms-auto mb-2" target="_blank" :href="getLinkSemesterListe">\n\t\t\t\t\t\t\t\t<i aria-hidden="true" class="fa fa-arrow-up-right-from-square me-1 fhc-link-color"></i>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print verband link --\x3e\n\t\t\t\t\t\t<span v-else-if="key ==\'verband\' && entry.value" class="form-underline-content">\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t<a :aria-label="$p.t(\'profil\',\'verbandLink\')" class="ms-auto mb-2" target="_blank" :href="getLinkVerbandListe">\n\t\t\t\t\t\t\t\t<i aria-hidden="true" class="fa fa-arrow-up-right-from-square me-1 fhc-link-color"></i>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print gruppe link --\x3e\n\t\t\t\t\t\t<span v-else-if="key == \'gruppe\' && entry.value" class="form-underline-content">\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t<a :aria-label="$p.t(\'profil\',\'gruppenLink\')" class="ms-auto mb-2" target="_blank" :href="getLinkGruppeListe">\n\t\t\t\t\t\t\t\t<i aria-hidden="true" class="fa fa-arrow-up-right-from-square me-1 fhc-link-color"></i>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- else print information --\x3e\n\t\t\t\t\t\t<span v-else class="form-underline-content">{{ entry.value ?? \'-\'}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>'},$e={profilViewData(t){let e="/api/frontend/v1/Profil/profilViewData";return t&&(e+=`/${t}`),{method:"get",url:e}},fotoSperre:t=>({method:"get",url:`/api/frontend/v1/Profil/fotoSperre/${t}`}),isStudent:t=>({method:"get",url:"/api/frontend/v1/Profil/isStudent",params:{uid:t}}),isMitarbeiter:t=>({method:"get",url:`/api/frontend/v1/Profil/isMitarbeiter/${t}`}),getZustellAdresse:()=>({method:"get",url:"/api/frontend/v1/Profil/getZustellAdresse"}),getZustellKontakt:()=>({method:"get",url:"/api/frontend/v1/Profil/getZustellKontakt"}),getGemeinden:(t,e)=>({method:"get",url:`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`}),getAllNationen:()=>({method:"get",url:"/api/frontend/v1/Profil/getAllNationen"})},xe={components:{DmsItem:{emits:["delete"],props:{modelValue:{type:[File,Object],required:!0}},data:()=>({preview:""}),watch:{modelValue(t){"application/x.fhc-dms+json"==t.type&&t.text().then(t=>{const e=JSON.parse(t);this.preview=e.preview||""})}},template:'\n\t<li class="form-upload-dms-item">\n\t\t<span class="col-auto"><i class="fa fa-file me-1"></i></span>\n\t\t<span class="col">{{ modelValue.name }}</span>\n\t\t<a v-if="preview" :href="preview" target="_blank" class="col-auto btn btn-outline-secondary btn-p-0 me-2">\n\t\t\t<i class="fa fa-download"></i>\n\t\t</a>\n\t\t<button class="col-auto btn btn-outline-secondary btn-p-0" @click="$emit(\'delete\')">\n\t\t\t<i class="fa fa-close"></i>\n\t\t</button>\n\t</li>'}},emits:["update:modelValue"],props:{modelValue:{type:[FileList,Array],required:!0},multiple:Boolean,id:String,name:String,inputClass:[String,Array,Object],noList:Boolean,accept:{type:String,default:""},disabled:{type:Boolean,default:!1}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),addFiles(t){if(!this.multiple)return this.$emit("update:modelValue",t.target.files);const e=new DataTransfer,n=[];for(var i of this.modelValue)e.items.add(i),n.push(this.stringifyFile(i));for(var i of t.target.files)n.indexOf(this.stringifyFile(i))<0&&e.items.add(i);this.$emit("update:modelValue",e.files)},removeFile(t){const e=Array.from(this.modelValue)[t],n=new DataTransfer;for(var i of this.modelValue)i!==e&&n.items.add(i);this.$emit("update:modelValue",n.files)}},watch:{modelValue(t){if(!t)return;if(t instanceof FileList){if(!this.$refs.upload)return;return this.$refs.upload.files=t}const e=new DataTransfer;for(var n of t)if(n instanceof File)e.items.add(n);else{const t=new File([JSON.stringify(n)],n.name,{type:"application/x.fhc-dms+json"});e.items.add(t)}this.$emit("update:modelValue",e.files)}},template:'\n\t<div class="form-upload-dms">\n\t\t<input ref="upload" class="form-control" :disabled="disabled" :accept="accept" :aria-label="$p.t(\'profilUpdate\',\'documentUpload\')" :title="$p.t(\'profilUpdate\',\'documentUpload\')" :class="inputClass" :id="id" :name="name" :multiple="multiple" type="file" @change="addFiles">\n\t\t<ul v-if="modelValue.length && multiple && !noList" :accept="accept" class="list-unstyled m-0">\n\t\t\t<dms-item\n\t\t\t\tv-for="(file, index) in modelValue"\n\t\t\t\t:key="index"\n\t\t\t\tv-model="file"\n\t\t\t\tclass="d-flex mx-1 mt-1 align-items-start"\n\t\t\t\t@delete="removeFile(index)"\n\t\t\t\t>\n\t\t\t</dms-item>\n\t\t</ul>\n\t</div>'},Se={
//! API calls for profil update requests
getStatus:()=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getStatus"}),getTopic:()=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getTopic"}),acceptProfilRequest:({profil_update_id:t,uid:e,status_message:n,topic:i,requested_change:a})=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",params:{profil_update_id:t,uid:e,status_message:n,topic:i,requested_change:a}}),denyProfilRequest:({profil_update_id:t,uid:e,topic:n,status_message:i})=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/denyProfilRequest",params:{profil_update_id:t,uid:e,topic:n,status_message:i}}),insertFile:(t,e=null)=>({method:"post",url:`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,params:t}),updateProfilbild:t=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/updateProfilbild",params:t}),getProfilUpdateWithPermission:t=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getProfilUpdateWithPermission"+(""!==t?"/"+encodeURIComponent(t):"")}),getProfilRequestFiles:t=>({method:"get",url:`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`}),selectProfilRequest:(t=null,e=null)=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/selectProfilRequest",params:{...t?{uid:t}:{},...e?{id:e}:{}}}),insertProfilRequest:(t,e,n=null)=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/insertProfilRequest",params:{topic:t,payload:e,...n?{fileID:n}:{}}}),updateProfilRequest:(t,e,n,i=null)=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/updateProfilRequest",params:{topic:t,payload:e,ID:n,...i?{fileID:i}:{}}}),deleteProfilRequest:t=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",params:{requestID:t}})},ze={data:()=>({dmsData:[]}),components:{Dms:xe,BsModal:s},mixins:[s],props:{titel:{type:String},files:{type:Array},updateID:{type:Boolean},onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},methods:{async uploadImage(){if(this.dmsData){let t=new FormData;t.append("files[]",this.dmsData[0]),await this.$api.call(Se.updateProfilbild(t)).then(t=>{this.$fhcAlert.alertSuccess(this.$p.t("global","hochgeladen")),this.modal.hide()})}}},mounted(){this.modal=this.$refs.modalContainer.modal,this.files&&(this.dmsData=this.files)},popup(t){return s.popup.bind(this),s.popup(null,t)},template:'\n\n\t<bs-modal ref="modalContainer" v-bind="$props" body-class="" dialog-class="modal-lg" class="bootstrap-alert" :backdrop="false">\n\t\t<template #title>\n\t\t\t<p style="opacity:0.8" class="ms-2" v-if="!updateID">{{$p.t(\'profilUpdate\',\'profilBildUpdateMessage\',[titel])}}</p>\n\t\t</template>\n\t\t<template #default>\n\t\t\t<div class="form-underline">\n\t\t\t\t<div class="form-underline-titel">{{titel?titel:$p.t(\'global\',\'titel\')}}</div>\n\t\t\t</div>\n\t\t\t<div class="row gx-2">\n\t\t\t\t<div class="col">\n\t\t\t\t\t<dms ref="update" id="files" name="files" :multiple="false" v-model="dmsData" ></dms>\n\t\t\t\t</div>\n\t\t\t\t<div class="col-auto">\n\t\t\t\t\t<button @click="dmsData=[]" class="btn btn-danger"><i style="color:white" class="fa fa-trash"></i></button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="d-flex" >\n\t\t\t\t<button @click="uploadImage" class="btn fhc-primary-bg mt-4 text-light" style="margin-left:auto;">{{$p.t(\'global\',\'upload\')}}</button>\n\t\t\t</div>\n\t\t</template>\n\t</bs-modal>\n '},Te={props:{title:{type:String},data:{type:Object},fotoStatus:{type:Boolean,default:!0}},components:{ImageUpload:ze},data(){return{FotoSperre:this.data.foto_sperre}},emits:["showEditProfilModal"],inject:["isEditable"],methods:{showModal(){this.$refs.imageUpload.show()},sperre_foto_function(){this.data&&this.$api.call($e.fotoSperre(!this.FotoSperre)).then(t=>{this.FotoSperre=t.data.foto_sperre})}},computed:{get_image_base64_src:function(){return this.data.foto?"data:image/jpeg;base64,"+this.data.foto:""},name:function(){return{vorname:this.data.Vorname,nachname:this.data.Nachname}},profilInfo:function(){let t={},e=["Vorname","Nachname","foto_sperre","foto"];return Object.keys(this.data).forEach(n=>{e.includes(n)||(t[n]=this.data[n])}),t}},template:'\n\n<div class="card h-100">\n\t<image-upload ref="imageUpload" :titel="$p.t(\'profilUpdate\',\'profilBild\')"></image-upload>\n <div class="card-header">\n <div class="row">\n <div v-if="isEditable" @click="$emit(\'showEditProfilModal\',\'Personen_Informationen\')" class="col-auto" type="button" :title="$p.t(\'profilUpdate\',\'profilBearbeiten\')">\n <i class="fa fa-edit"></i>\n </div>\n <div class="col">\n <span>{{title}}</span>\n </div>\n </div>\n </div>\n <div class="card-body">\n <div class="gy-3 row justify-content-center align-items-center">\n \x3c!-- SQUEEZING THE IMAGE INSIDE THE FIRST INFORMATION COLUMN --\x3e\n \x3c!-- START OF THE FIRST ROW WITH THE PROFIL IMAGE --\x3e\n <div class="col-12 col-sm-6 mb-2">\n <div class="row justify-content-center">\n <div class="col-auto profil-image" style="position:relative">\n <img alt="profile picture" class=" img-thumbnail " style=" max-height:150px; " :src="get_image_base64_src"/>\n \x3c!-- LOCKING IMAGE FUNCTIONALITY --\x3e\n <div v-if="isEditable" role="button" type="button" :title="FotoSperre?$p.t(\'profil\',\'fotoSperren\'):$p.t(\'profil\',\'fotoEntsperren\')" @click.prevent="sperre_foto_function" class="image-lock">\n <i :class="{\'fa\':true, ...(FotoSperre?{\'fa-lock\':true}:{\'fa-lock-open\':true})} "></i>\n </div>\n\t\t\t\t\t\t<div v-if="fotoStatus != null && !fotoStatus" role="button" type="button" :title="$p.t(\'profil\',\'fotoHochladen\')" @click.prevent="showModal" class="image-upload">\n <i class="fa fa-upload"></i>\n </div>\n </div>\n </div>\n \x3c!-- END OF THE ROW WITH THE IMAGE --\x3e\n </div>\n \x3c!-- END OF SQUEEZE --\x3e\n \x3c!-- COLUMNS WITH MULTIPLE ROWS NEXT TO PROFIL PICTURE --\x3e\n <div class="col-12 col-sm-6">\n <div class="row gy-4">\n <div class="col-12">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'profilUpdate\',\'vorname\')}}</div>\n <span class="form-underline-content">{{name.vorname}} </span>\n </div>\n </div>\n <div class="col-12">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'profilUpdate\',\'nachname\')}}</div>\n <span class="form-underline-content">{{name.nachname}} </span>\n </div>\n </div>\n </div>\n </div>\n <div v-for="(wert,bez) in profilInfo" class="col-md-6 col-sm-12">\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'profil\',bez)}}</div>\n <span class="form-underline-content">{{wert?wert:\'-\'}} </span>\n </div>\n </div>\n </div>\n </div>\n</div>\n'},De={name:"EditProfilSelect",components:{Kontakt:ke,EditKontakt:{props:{data:Object},data:()=>({originalValue:null,zustellKontakteCount:null}),inject:["getZustellkontakteCount"],methods:{updateValue:function(t,e){this.data[e]="zustellung"===e?t.target.checked:""===t.target.value?null:t.target.value,this.$emit("profilUpdate",this.isChanged?this.data:null),this.zustellKontakteCount=this.getZustellkontakteCount()}},computed:{showZustellKontakteWarning:function(){if(JSON.parse(this.originalValue).zustellung)return!1;const t=this.zustellKontakteCount.filter(t=>t.kontakttyp===this.data?.kontakttyp);return this.zustellKontakteCount.some(t=>t.kontakt_id===this.data.kontakt_id)?this.kontakteOfSelectedType.length>=2&&this.data.zustellung:this.data.zustellung&&t.length},isChanged:function(){return!(!this.data.kontakt||!this.data.kontakttyp)&&JSON.stringify(this.data)!==this.originalValue}},created(){this.originalValue=JSON.stringify(this.data),this.zustellKontakteCount=this.getZustellkontakteCount()},template:'\n\n <div class="gy-3 row align-items-center justify-content-center">\n\n <div v-if="!data.kontakt_id" class="col-12">\n\n\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'profilUpdate\',\'kontaktTyp\')}}</div>\n\n <select :value="data.kontakttyp" @change="updateValue($event,\'kontakttyp\')" class="form-select" aria-label="Select Kontakttyp">\n <option selected></option>\n <option value="email">{{$p.t(\'person\',\'email\')}}</option>\n <option value="telefon">{{$p.t(\'person\',\'telefon\')}}</option>\n <option value="notfallkontakt">{{$p.t(\'profilUpdate\',\'notfallkontakt\')}}</option>\n <option value="mobil">{{$p.t(\'profilUpdate\',\'mobiltelefonnummer\')}}</option>\n <option value="homepage">{{$p.t(\'profilUpdate\',\'homepage\')}}</option>\n <option value="fax">{{$p.t(\'profilUpdate\',\'faxnummer\')}}</option>\n\n </select>\n </div>\n\n </div>\n <div class="col-12">\n\n \x3c!-- rendering KONTAKT emails --\x3e\n\n\n <div class="form-underline">\n <div class="form-underline-titel">{{data.kontakttyp?data.kontakttyp:$p.t(\'global\',\'kontakt\')}}</div>\n\n <input :aria-label="data.kontakttyp" :title="data.kontakttyp" :disabled="data.kontakttyp?false:true" class="form-control" :value="data.kontakt" @input="updateValue($event,\'kontakt\')" :placeholder="data.kontakt">\n </div>\n\n </div>\n <div class="col-12">\n\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'global\',\'anmerkung\')}}</div>\n\n <input :aria-label="$p.t(\'global\',\'anmerkung\')" :title="$p.t(\'global\',\'anmerkung\')" class="form-control" :value="data.anmerkung" @input="updateValue($event,\'anmerkung\')" :placeholder="data.anmerkung">\n </div>\n\n </div>\n\n \x3c!-- warning message for too many zustellungs Kontakte --\x3e\n <div v-if="showZustellKontakteWarning" class="col-12 ">\n <div class="alert alert-warning mx-2">\n <span>{{$p.t(\'profilUpdate\',\'zustell_kontakte_warning\')}}</span>\n </div>\n </div>\n \x3c!-- End of warning --\x3e\n\n <div class="d-flex flex-row justify-content-start col-12 allign-middle">\n <span style="opacity: 0.65; font-size: .85rem; " class="px-2">{{$p.t(\'profilUpdate\',\'zustellungsKontakt\')}}</span>\n\n <input :aria-label="$p.t(\'profilUpdate\',\'zustellungsKontakt\')" :title="$p.t(\'profilUpdate\',\'zustellungsKontakt\')" class="form-check-input " type="checkbox" :checked="data.zustellung" @change="updateValue($event,\'zustellung\')" id="flexCheckDefault">\n </div>\n </div>\n '},Adresse:we,EditAdresse:{components:{AutoComplete:primevue.autocomplete,Dms:xe},props:{data:Object,files:{type:Array,default:[]}},inject:["getZustelladressenCount","updateFileID","isMitarbeiter"],data:()=>({gemeinden:[],ortschaftnamen:[],selectedNation:null,nationenList:[],originalValue:null,zustellAdressenCount:null,dmsData:[],fileschanged:!1}),watch:{"data.gemeinde":function(t,e){this.$emit("profilUpdate",this.isChanged?this.data:null)},"data.ort":function(t,e){this.$emit("profilUpdate",this.isChanged?this.data:null)}},methods:{autocompleteSearchGemeinden:function(t){this.gemeinden=this.gemeinden.map(t=>t)},autocompleteSearchOrtschaftsnamen:function(t){this.ortschaftnamen=this.ortschaftnamen.map(t=>t)},getGemeinde:function(){this.data.nation&&"A"===this.data.nation&&this.data.plz&&this.data.plz>999&&this.data.plz<32e3?this.$api.call($e.getGemeinden(this.data.nation,this.data.plz)).then(t=>{t.data.length&&(this.gemeinden=[...new Set(t.data.map(t=>t.name))],this.ortschaftnamen=[...new Set(t.data.map(t=>t.ortschaftsname))])}):this.gemeinden=[]},updateValue:function(t,e){"zustelladresse"===e?this.data[e]=t.target.checked:"files"===e?(this.dmsData.length>0&&"application/x.fhc-dms+json"!==this.dmsData[0].type&&(this.fileschanged=!0),this.updateFileID(this.dmsData)):this.data[e]=""===t.target.value?null:t.target.value,this.$emit("profilUpdate",this.isChanged?this.data:null),this.zustellAdressenCount=this.getZustelladressenCount()},deleteDmsData:function(){this.dmsData=[],this.updateValue(null,"files")}},computed:{showZustellAdressenWarning:function(){return!JSON.parse(this.originalValue).zustelladresse&&(this.zustellAdressenCount.includes(this.data.adresse_id)?this.zustellAdressenCount.length>=2&&this.data.zustelladresse:this.data.zustelladresse&&this.zustellAdressenCount.length)},isChanged:function(){if(!(this.data.strasse&&this.data.plz&&this.data.ort&&this.data.typ&&0!==this.dmsData.length))return!1;return this.originalValue!==JSON.stringify(this.data)||this.fileschanged}},created(){this.$api.call($e.getAllNationen()).then(t=>{this.nationenList=t.data,this.getGemeinde()}),this.originalValue=JSON.stringify(this.data),this.zustellAdressenCount=this.getZustelladressenCount()},mounted(){this.files&&(this.dmsData=this.files)},template:'\n<div class="gy-3 row justify-content-center align-items-center">\n \x3c!-- warning message for too many zustellungs Adressen --\x3e\n <div v-if="showZustellAdressenWarning" class="col-12 ">\n <div class="alert alert-warning mx-2">\n\t <span>{{$p.t(\'profilUpdate\',\'zustell_adressen_warning\')}}</span>\n </div>\n </div>\n \x3c!-- End of warning --\x3e\n\n\n <div class="col-12 ">\n <div class="form-check mb-2">\n <input class="form-check-input" type="checkbox" @change="updateValue($event,\'zustelladresse\')" :checked="data.zustelladresse" id="flexCheckDefault">\n <label class="form-check-label" for="flexCheckDefault">\n {{$p.t(\'person\',\'zustelladresse\')}} {{$p.t(\'profilUpdate\',\'infoZustelladresse\')}}\n </label>\n </div>\n </div>\n\n \x3c!-- NATION --\x3e\n <div class="col-8">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'person\',\'nation\')}}*</div>\n <select :value="data.nation" @change="updateValue($event,\'nation\')" @change="getGemeinde" class="form-select" aria-label="Select Kontakttyp">\n <option selected></option>\n <option :value="nation.code" v-for="nation in nationenList">{{nation.langtext}}</option>\n </select>\n </div>\n </div>\n\n \x3c!-- PLZ --\x3e\n <div class=" col-4">\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'person\',\'plz\')}}*</div>\n <input class="form-control" :value="data.plz" :aria-label="$p.t(\'person\',\'plz\')" :title="$p.t(\'person\',\'plz\')" @input="updateValue($event,\'plz\')" @input="getGemeinde" :placeholder="data.plz">\n </div>\n </div>\n\n \x3c!-- GEMEINDE --\x3e\n <div class="col-lg-6">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'person\',\'gemeinde\')}}*</div>\n <auto-complete :aria-label="$p.t(\'person\',\'gemeinde\')" class="w-100" v-model="data.gemeinde" dropdown :forceSelection="data.nation ===\'A\'?true:false" :suggestions="gemeinden" @complete="autocompleteSearchGemeinden" ></auto-complete>\n </div>\n </div>\n\n \x3c!-- ORT --\x3e\n <div class="col-lg-6" >\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'person\',\'ort\')}}*</div>\n <auto-complete :aria-label="$p.t(\'person\',\'ort\')" class="w-100" v-model="data.ort" dropdown :forceSelection="data.nation ===\'A\'?true:false" :suggestions="ortschaftnamen" @complete="autocompleteSearchOrtschaftsnamen" ></auto-complete>\n </div>\n </div>\n\n \x3c!-- STRASSE --\x3e\n <div class="col-lg-8">\n <div class="form-underline ">\n <div class="form-underline-titel">{{$p.t(\'person\',\'strasse\')}}*</div>\n <input :aria-label="$p.t(\'person\',\'strasse\')" class="form-control" :value="data.strasse" @input="updateValue($event,\'strasse\')" :placeholder="data.strasse">\n </div>\n </div>\n \n \x3c!-- ADRESSEN TYP --\x3e\n <div class="col-lg-4">\n <div class="form-underline">\n <div class="form-underline-titel">{{$p.t(\'profilUpdate\',\'kontaktTyp\')}}*</div>\n <select :value="data.typ" @change="updateValue($event,\'typ\')" class="form-select" aria-label="Select Kontakttyp">\n <option selected></option>\n <option value="Nebenwohnsitz">{{$p.t(\'profilUpdate\',\'nebenwohnsitz\')}}</option>\n <option value="Hauptwohnsitz">{{$p.t(\'profilUpdate\',\'hauptwohnsitz\')}}</option>\n <option v-if="isMitarbeiter" value="Homeoffice">{{$p.t(\'profilUpdate\',\'homeoffice\')}}</option>\n <option v-if="isMitarbeiter" value="Rechnungsadresse">{{$p.t(\'profilUpdate\',\'rechnungsadresse\')}}</option>\n </select> \n </div>\n </div>\n\n\t<div class="row g-2">\n\t\t<div class="col">\n\t\t\t<div class="form-underline-titel">{{$p.t(\'profilUpdate\',\'meldebestaetigung\')}}*</div>\n\t\t\t<dms\n\t\t\t\tref="update"\n\t\t\t\tid="files"\n\t\t\t\tname="files"\n\t\t\t\t:multiple="false"\n\t\t\t\tv-model="dmsData"\n\t\t\t\t@update:model-value="updateValue($event,\'files\')"\n\t\t\t></dms>\n\t\t</div>\n\t\t<div class="col-auto">\n\t\t\t<div>&nbsp;</div>\n\t\t\t<button\n\t\t\t\t\t@click="deleteDmsData"\n\t\t\t\t\tclass="btn btn-danger"\n\t\t\t\t\t:aria-label="$p.t(\'profilUpdate\',\'deleteAttachment\')"\n\t\t\t\t\t:title="$p.t(\'profilUpdate\',\'deleteAttachment\')"\n\t\t\t><i style="color:white" class="fa fa-trash" aria-hidden="true"></i></button>\n\t\t</div>\n\t</div>\n\n</div>\n '},Status:{components:{Adresse:we,Kontakt:ke},inject:["profilUpdateTopic"],data:()=>({files:null}),methods:{getDocumentLink:function(t){return FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/Cis/ProfilUpdate/show/${t}`}},computed:{getComponentView:function(){return this.topic==this.profilUpdateTopic["Private Adressen"]||this.topic==this.profilUpdateTopic["Add Adresse"]||this.topic==this.profilUpdateTopic["Delete Adresse"]?"Adresse":this.topic==this.profilUpdateTopic["Private Kontakte"]||this.topic==this.profilUpdateTopic["Add Kontakt"]||this.topic==this.profilUpdateTopic["Delete Kontakt"]?"Kontakt":"text_input"},cardHeader:function(){return this.topic==this.profilUpdateTopic["Delete Addresse"]||this.topic==this.profilUpdateTopic["Delete Kontakt"]?"Delete":this.topic==this.profilUpdateTopic["Add Adresse"]||this.topic==this.profilUpdateTopic["Add Kontakt"]?"Add":"Update"}},props:{data:{type:Object},view:{type:String},status:{type:String},status_message:{type:String},status_timestamp:{type:String},updateID:{type:Number},topic:{type:String}},created(){this.$api.call(Se.getProfilRequestFiles(this.updateID)).then(t=>{this.files=t.data})},template:'\n <div class="row">\n\n <div class="col">\n <div class="form-underline mb-2">\n <div class="form-underline-titel">{{$p.t(\'global\',\'status\')}}</div>\n <span class="form-underline-content">{{status}} </span>\n </div>\n </div>\n\n <div class="col">\n <div class="form-underline mb-2">\n <div class="form-underline-titel">{{$p.t(\'global\',\'datum\')}}</div>\n <span class="form-underline-content">{{status_timestamp}} </span>\n </div>\n </div>\n \n </div>\n <div class="row">\n <div class="col">\n <div v-if="status_message" class="form-underline mb-2 ">\n <div class="form-underline-titel">{{$p.t(\'profilUpdate\',\'statusMessage\')}}</div>\n <textarea class="form-control" rows="4" disabled>{{status_message}} </textarea>\n </div>\n </div>\n </div>\n\n\n <div class="card mt-4">\n <div class="card-header">\n <i class="fa" :class="{\'fa-trash\':cardHeader===\'Delete\', \'fa-edit\':cardHeader===\'Update\', \'fa-plus\':cardHeader===\'Add\'}" ></i>\n {{cardHeader}} \n </div>\n <div class="card-body">\n <template v-if="getComponentView === \'text_input\'">\n <div class="form-underline mb-2">\n <div class="form-underline-titel">{{topic}}</div>\n <span class="form-underline-content">{{data.value}} </span>\n </div>\n </template>\n <component v-else :is="getComponentView" :data="data"></component>\n \n </div>\n </div>\n\n\t<div v-if="files?.length" class="card mt-4">\n\t\t<div class="card-header">{{$p.t(\'profilUpdate\',\'nachweisdokumente\')}}</div>\n\t\t<div class="card-body">\n\t\t\t<a target="_blank" :href="getDocumentLink(file.dms_id)" v-for="file in files">{{file.name}}</a>\n\t\t</div>\n\t</div>\n '},TextInputDokument:{data:()=>({dmsData:[],originalValue:null}),components:{Dms:xe},props:{data:{type:Object},withFiles:{type:Boolean,default:!1},files:{type:Array},updateID:{type:Boolean}},inject:["updateFileID"],computed:{didFilesChange:function(){this.updateFileID(this.dmsData);let t=!1;return this.files?(Array.from(this.dmsData).forEach(e=>{this.files.some(t=>t.name!==e.name)&&(t=!0)}),!(this.dmsData.length==this.files.length)||t):!!Array.from(this.dmsData).length},didDataChange:function(){return JSON.stringify(this.data)!==this.originalValue},isChanged:function(){return this.withFiles?this.updateID?(this.didDataChange||this.didFilesChange)&&this.dmsData.length:this.didDataChange&&this.didFilesChange:this.didDataChange}},emits:["profilUpdate"],watch:{dmsData(t){this.emitChanges()}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),emitChanges:function(){this.isChanged?this.$emit("profilUpdate",{value:this.data.value}):this.$emit("profilUpdate",null)}},mounted(){this.originalValue=JSON.stringify(Vue.toRaw(this.data)),this.files&&(this.dmsData=this.files)},template:'\n\n <p style="opacity:0.8" class="ms-2" v-if="withFiles && !updateID">{{$p.t(\'profilUpdate\',\'profilUpdateInformationMessage\',[data.titel])}}</p>\n\n <div class="form-underline">\n <div class="form-underline-titel">{{data.titel?data.titel:$p.t(\'global\',\'titel\')}}</div>\n\n <input class="mb-2 form-control" @input="emitChanges" :aria-label="data.titel" :tooltip="data.titel" v-model="data.value" :placeholder="data.value">\n\n <div class="row gx-2">\n <div class="col">\n <dms ref="update" v-if="withFiles" id="files" name="files" :multiple="false" v-model="dmsData" @update:model-value="didFilesChange" ></dms>\n </div>\n <div class="col-auto">\n <button @click="dmsData=[]" class="btn btn-danger" :aria-label="$p.t(\'profilUpdate\',\'deleteAttachment\')" :title="$p.t(\'profilUpdate\',\'deleteAttachment\')" ><i style="color:white" class="fa fa-trash" aria-hidden="true"></i></button>\n </div>\n </div>\n </div>\n '}},inject:["profilUpdateTopic","isMitarbeiter"],props:{list:Object,size:{type:Number,default:null},ariaLabel:{type:String,required:!0},profilUpdate:String,topic:String,breadcrumb:String},emits:{"update:profilUpdate":null,"update:topic":null,"update:breadcrumb":null,submit:null,select:null},data(){return{view:null,data:null,breadcrumbItems:[],modal_topic:this.topic,properties:null}},methods:{addItem:function(){this.view=this.modal_topic==this.profilUpdateTopic["Private Kontakte"]?"EditKontakt":"EditAdresse",this.modal_topic=this.modal_topic==this.profilUpdateTopic["Private Kontakte"]?this.profilUpdateTopic["Add Kontakt"]:this.profilUpdateTopic["Add Adresse"],this.$emit("update:topic",this.modal_topic),this.breadcrumbItems.push(this.modal_topic),this.$emit("update:breadcrumb",this.breadcrumbItems),this.data="EditAdresse"==this.view?{add:!0,adresse_id:null,strasse:null,typ:null,plz:null,ort:null,zustelladresse:!1}:{add:!0,kontakt_id:null,kontakttyp:null,kontakt:null,anmerkung:null,zustellung:!1}},deleteItem:function(t){t.data.delete=!0,this.$emit("update:profilUpdate",t.data),this.modal_topic=this.modal_topic==this.profilUpdateTopic["Private Adressen"]?this.profilUpdateTopic["Delete Adresse"]:this.profilUpdateTopic["Delete Kontakt"],this.$emit("update:topic",this.modal_topic),this.$emit("submit")},profilUpdateEmit:function(t){this.$emit("update:profilUpdate",t)},updateOptions:function(t,e){this.properties=e,this.data=e.data,this.view=e.view,e.title?(this.modal_topic=e.topic,this.$emit("update:topic",this.modal_topic),this.breadcrumbItems.push(e.title)):e.data.kontakttyp?(this.breadcrumbItems.push(e.data.kontakttyp),this.breadcrumbItems.push(e.data.kontakt)):e.data.strasse&&this.breadcrumbItems.push(e.data.strasse),this.$emit("update:breadcrumb",this.breadcrumbItems)}},computed:{},created(){this.properties={...this.list},this.data=this.list.data?JSON.parse(JSON.stringify(this.list.data)):null,this.view=this.list.view?JSON.parse(JSON.stringify(this.list.view)):null},mounted(){},template:'\n <template v-if="!view">\n <div class="list-group">\n <template v-for="item in data">\n <div class="d-flex flex-row align-items-center">\n <button\n\t\t\t\t\t\tstyle="position:relative"\n\t\t\t\t\t\ttype="button" class="list-group-item list-group-item-action"\n\t\t\t\t\t\t@click="updateOptions($event,item)"\n\t\t\t\t\t\t:disabled="(this.isMitarbeiter === false && item.listview === \'Adresse\' && item.data.heimatadresse === true)"\n\t\t\t\t\t>\n \x3c!-- render title of options --\x3e\n <p v-if="item.title" class="my-1" >{{item.title}}</p>\n \x3c!-- else render list view of items --\x3e\n <div v-else class="my-2 me-4" >\n <component :is="item.listview" v-bind="item"></component>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-if="(this.isMitarbeiter === false && item.listview === \'Adresse\' && item.data.heimatadresse === true)"\n\t\t\t\t\t\t\t\tclass="gy-2 row justify-content-center align-items-center"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class="col-1">&nbsp;</div>\n\t\t\t\t\t\t\t\t<div class="col-11">\n\t\t\t\t\t\t\t\t\t<div class="alert alert-info mt-4" role="alert">\n\t\t\t\t\t\t\t\t\t\t{{ $p.t(\'profilUpdate\',\'infoHeimatadresse\') }}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n </div>\n </button>\n <button v-if="item.listview" :disabled="(this.isMitarbeiter === false && item.listview === \'Adresse\' && item.data.heimatadresse === true)" @click="deleteItem(item)" type="button" class="mx-3 btn btn-danger btn-circle" :aria-label="$p.t(\'profilUpdate\',\'deleteItem\')" :title="$p.t(\'profilUpdate\',\'deleteItem\')" ><i class="fa fa-trash" aria-hide="true"></i></button>\n </div>\n </template>\n </div>\n <div v-if="Array.isArray(data)" class="mt-4 d-flex justify-content-center">\n <button @click="addItem" type="button" class="btn btn-primary btn-circle" :aria-label="$p.t(\'profilUpdate\',\'addItem\')" :title="$p.t(\'profilUpdate\',\'addItem\')"><i class="fa fa-plus" aria-hide="true"></i></button>\n </div>\n </template>\n <template v-else>\n <component @profilUpdate="profilUpdateEmit" :is="view" v-bind="properties" :data="data" ></component>\n </template>\n '},Ee={components:{BsModal:s},props:{timeout:{type:Number,default:300}},data:()=>({t:null,state:0}),methods:{show(){switch(this.state){case 0:return this.timeout?(this.state=1,void(this.t=window.setTimeout(()=>this.$refs.modal.show(),this.timeout))):this.$refs.modal.show();case 4:return window.setTimeout(()=>this.show(),1)}},hide(){switch(this.state){case 1:return window.clearTimeout(this.t);case 2:return window.setTimeout(()=>this.hide(),1);case 3:this.$refs.modal.hide()}}},mounted(){this.$refs.modal.$refs.modal.addEventListener("show.bs.modal",()=>{this.state=2}),this.$refs.modal.$refs.modal.addEventListener("shown.bs.modal",()=>{this.state=3}),this.$refs.modal.$refs.modal.addEventListener("hide.bs.modal",()=>{this.state=4}),this.$refs.modal.$refs.modal.addEventListener("hidden.bs.modal",()=>{this.state=0})},template:'\n\t<bs-modal ref="modal" class="fade text-center" dialog-class="modal-dialog-centered" backdrop="static" :keyboard="false">\n\t\tLoading...\n\t</bs-modal>'},Ce={components:{BsModal:s,Alert:r,EditProfilSelect:De,Loader:Ee},mixins:[s],props:{isMitarbeiter:{type:Boolean,default:!1},value:Object,titel:String,zustelladressenCount:Function,zustellkontakteCount:Function,onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data(){return{topic:null,profilUpdate:null,editData:this.value,fileID:null,breadcrumb:null,loading:!1,result:!1,info:null}},inject:["setLoading"],provide(){return{updateFileID:this.updateFileIDFunction,isMitarbeiter:this.isMitarbeiter}},methods:{updateFileIDFunction:function(t){this.fileID=t},handleFailedError:function(t){console.error(t),this.loading=!1,this.setLoading(!1),this.result=!1,this.hide()},async submitProfilChange(){if(this.topic&&this.profilUpdate){if(this.fileID){const t=await this.uploadFiles(this.fileID);this.fileID=t||null}const t=t=>{t.data.error?(this.result=!1,r.popup("Ein Fehler ist aufgetreten: "+JSON.stringify(t.data.retval))):(this.result=!0,r.popup("Ihre Anfrage wurde erfolgreich gesendet. Bitte warten Sie, während sich das Team um Ihre Anfrage kümmert."))};this.loading=!0,this.setLoading(!0),this.editData.updateID?this.$api.call(Se.updateProfilRequest(this.topic,this.profilUpdate,this.editData.updateID,this.fileID?this.fileID[0]:null)).then(e=>{t(e)}).catch(t=>this.$fhcAlert.handleSystemError).finally(()=>{this.loading=!1,this.setLoading(!1),this.hide()}):this.$api.call(Se.insertProfilRequest(this.topic,this.profilUpdate,this.fileID?this.fileID[0]:null)).then(e=>{t(e)}).catch(t=>this.$fhcAlert.handleSystemError).finally(()=>{this.loading=!1,this.setLoading(!1),this.hide()})}},uploadFiles:async function(t){if("application/x.fhc-dms+json"!==t[0].type){let e=new FormData;e.append("files[]",t[0]);return this.editData.updateID?await this.$api.call(Se.insertFile(e,this.editData.updateID)).then(t=>t.data?.map(t=>t.dms_id)):await this.$api.call(Se.insertFile(e)).then(t=>t.data?.map(t=>t.dms_id))}return!1}},computed:{showFooter:function(){switch(this.value.view){case"Status":case"Kontakt":case"Adresse":return!1;default:return!0}}},created(){this.editData.topic&&(this.topic=this.editData.topic)},mounted(){this.modal=this.$refs.modalContainer.modal},popup(t){return s.popup.bind(this),s.popup(null,t)},template:'\n<bs-modal v-show="!loading" ref="modalContainer" body-class="" v-bind="$props" dialog-class="modal-lg" class="bootstrap-alert" :backdrop="false">\n\t<template v-if="titel" v-slot:title>{{titel}}</template>\n\t<template v-slot:default>\n\t\t<div>\n\t\t\t<nav aria-label="breadcrumb" class="ps-2">\n\t\t\t\t<ol class="breadcrumb">\n\t\t\t\t\t<li class="breadcrumb-item" v-for="element in breadcrumb">{{element}}</li>\n\t\t\t\t</ol>\n\t\t\t</nav>\n\t\t\t<edit-profil-select @submit="submitProfilChange" v-model:breadcrumb="breadcrumb" v-model:topic="topic" v-model:profilUpdate="profilUpdate" ariaLabel="select" :list="editData"></edit-profil-select>\n\t\t</div>\n\t</template>\n\t\x3c!-- optional footer --\x3e\n\t<template v-slot:footer v-if="showFooter">\n\t\t<loader ref="loaderRef" :timeout="0"></loader>\n\t\t<button class="btn btn-outline-danger " @click="hide">{{$p.t(\'ui\',\'cancel\')}}</button> \n\t\t<button :disabled="!profilUpdate" @click="submitProfilChange" role="button" class="btn btn-primary">{{$p.t(\'ui\',\'senden\')}}</button>\n\t</template>\n \x3c!-- end of optional footer --\x3e \n</bs-modal>'},Oe={components:{EditProfil:Ce},props:{data:{type:Object}},inject:["getZustellkontakteCount","getZustelladressenCount","profilUpdateStates","profilUpdateTopic"],emits:["fetchUpdates"],data(){return{showUpdateModal:!1,content:null,editProfilTitle:this.$p.t("profil","profilBearbeiten")}},methods:{hideEditProfilModal:function(){this.$refs.updateEditModal.result&&this.$emit("fetchUpdates"),this.showUpdateModal=!1},async showEditProfilModal(t){let e=this.getView(t.topic,t.status),n=null,i=null,a=null,s=!1;if("TextInputDokument"===e){n={titel:t.topic,value:t.requested_change.value};a=await this.$api.call(Se.getProfilRequestFiles(t.profil_update_id)).then(t=>t.data),a&&(s=!0)}else n=t.requested_change;if(i={updateID:t.profil_update_id,view:e,data:n,withFiles:s,topic:t.topic,files:a},"EditAdresse"===e){const e=await this.$api.call($e.isMitarbeiter(t.uid)).then(t=>t.data);e&&(i.isMitarbeiter=e);a=await this.$api.call(Se.getProfilRequestFiles(t.profil_update_id)).then(t=>t.data),i.files=a}t.status!==this.profilUpdateStates.Pending&&(i.status=t.status,i.status_message=t.status_message,i.status_timestamp=t.status_timestamp),this.content=i,this.editProfilTitle=t.topic,i&&(this.showUpdateModal=!0,Vue.nextTick(()=>{this.$refs.updateEditModal.show()}))},deleteRequest:function(t){this.$api.call(Se.deleteProfilRequest(t.profil_update_id)).then(t=>{t.data.error?console.error("error happened",t.data):this.$emit("fetchUpdates")})},getView:function(t,e){if(e!==this.profilUpdateStates.Pending)return"Status";switch(t){case this.profilUpdateTopic["Private Kontakte"]:case this.profilUpdateTopic["Add Kontakt"]:return"EditKontakt";case this.profilUpdateTopic["Delete Kontakt"]:return"Kontakt";case this.profilUpdateTopic["Private Adressen"]:case this.profilUpdateTopic["Add Adresse"]:return"EditAdresse";case this.profilUpdateTopic["Delete Adresse"]:return"Adresse";default:return"TextInputDokument"}}},created(){},computed:{},template:'\n<div class="card">\n <edit-profil v-if="showUpdateModal" ref="updateEditModal" @hideBsModal="hideEditProfilModal" :value="content" :titel="editProfilTitle"></edit-profil>\n <div class="card-header">{{$p.t(\'profilUpdate\',\'profilUpdates\')}}</div>\n <div class="card-body">\n <div class="table-responsive text-nowrap">\n <table class="m-0 table table-hover align-middle">\n <thead>\n <tr>\n <th scope="col">{{$p.t(\'profilUpdate\',\'topic\')}}</th>\n <th scope="col">{{$p.t(\'global\',\'status\')}}</th>\n <th scope="col">{{$p.t(\'global\',\'datum\')}}</th>\n <th class="text-center" scope="col">{{$p.t(\'ui\',\'aktion\')}}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for="item in data" :style="item.status==profilUpdateStates[\'Accepted\']?\'background-color:lightgreen\':item.status===profilUpdateStates[\'Rejected\']?\'background-color:lightcoral\':\'\'">\n <td class="align-middle text-wrap ">{{item.topic}}</td>\n <td class="align-middle " >{{item.status}}</td>\n <td class="align-middle">{{item.status_timestamp?item.status_timestamp:item.insertamum}}</td>\n <template v-if="item.status === profilUpdateStates[\'Pending\']">\n <td>\n <div class="d-flex flex-row justify-content-evenly">\n <template v-if="item.topic.toLowerCase().includes(\'delete\')">\n <div class="align-middle text-center"><i role="button" @click="showEditProfilModal(item)" class="fa fa-eye"></i></div>\n </template>\n <template v-else >\n <div class="align-middle text-center" ><i @click="showEditProfilModal(item)" role="button" class="fa fa-edit fhc-primary-color"></i></div>\n </template>\n <div class="align-middle text-center"><i role="button" @click="deleteRequest(item)" class="text-danger fa fa-trash"></i></div>\n </div>\n </td>\n </template> \n <template v-else>\n <td class="align-middle text-center">\n <div class="d-flex flex-row justify-content-evenly">\n <i role="button" @click="showEditProfilModal(item)" class="fa fa-eye"></i>\n </div>\n </td>\n </template>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n'};function Fe(t,e,n){let i=document.createElement("div"),a=null,s=t.getValue();if(Array.isArray(s)){const t=s[0]?new Date(s[0]):null,e=s[1]?new Date(s[1]):null;a=[t,e]}return Vue.createApp({components:{PrimevueCalendar:primevue.calendar},data:()=>({val:a}),watch:{val(t){n(t)}},template:'<primevue-calendar \n\t\t\t\t\tv-model="val" \n\t\t\t\t\tselection-mode="range" \n\t\t\t\t\t:manual-input="false" \n\t\t\t\t\tshow-button-bar \n\t\t\t\t\t:showIcon="true"\n\t\t\t\t\tdateFormat="dd.mm.yy">\n\t\t\t\t </primevue-calendar>'}).use(primevue.config.default).mount(i),i}primevue||console.error("PrimeVue not loaded!"),Tabulator.extendModule("filter","filters",{dates:(t,e)=>{if(!t)return!0;let n=new Date(e);if(Array.isArray(t)){let e=new Date(t[0]);if(t[1]){let i=new Date(t[1]);return i.setHours(23,59,59,999),n>=e&&n<=i}return n.toDateString()===e.toDateString()}let i=new Date(t);return n.toDateString()===i.toDateString()}});var Pe={components:{CoreFilterCmpt:fe,Mailverteiler:ve,AusweisStatus:be,QuickLinks:ye,Adresse:we,Kontakt:ke,ProfilEmails:_e,RoleInformation:Ae,ProfilInformation:Te,FetchProfilUpdates:Oe,EditProfil:Ce},inject:["sortProfilUpdates","collapseFunction","language","isEditable"],data(){return{showModal:!1,collapseIconBetriebsmittel:!0,editDataFilter:null,preloadedPhrasen:{},zutrittsgruppen_table_options:{persistenceID:"filterTableStudentProfilZutrittsgruppen",persistence:{columns:!1},minHeight:200,layout:"fitColumns",columns:[{title:Vue.computed(()=>this.preloadedPhrasen.zutrittsGruppenPhrase),field:"bezeichnung"}]},betriebsmittel_table_options:{persistenceID:"filterTableStudentProfilBetriebsmittel",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"<i id='collapseIconBetriebsmittel' role='button' class='fa-solid fa-angle-down '></i>",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction},{title:Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),field:"betriebsmittel",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.inventarnummerPhrase),field:"Nummer",headerFilter:!0,resizable:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.ausgabedatum),field:"Ausgegeben_am",headerFilterFunc:"dates",headerFilter:Fe,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()}]}}},props:{data:Object,editData:Object},provide(){return{studiengang_kz:Vue.computed({get:()=>this.data.studiengang_kz})}},methods:{betriebsmittelTableBuilt:function(){this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel)},zutrittsgruppenTableBuilt:function(){this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns),this.$refs.zutrittsgruppenTable.tabulator.setData(this.data.zuttritsgruppen)},fetchProfilUpdates:function(){this.$api.call(Se.selectProfilRequest()).then(t=>{!t.error&&t&&(this.data.profilUpdates=t.data?.length?t.data.sort(this.sortProfilUpdates):null)})},hideEditProfilModal:function(){this.$refs.editModal.result&&this.$api.call(Se.selectProfilRequest()).then(t=>{!t.error&&t.data?(this.data.profilUpdates=t.data,this.data.profilUpdates.sort(this.sortProfilUpdates)):console.error("Error when fetching profile updates: "+t)}).catch(t=>{console.error(t)}),this.showModal=!1,this.editDataFilter=null},showEditProfilModal(t){t&&(this.editDataFilter=t),this.showModal=!0,Vue.nextTick(()=>{this.$refs.editModal.show()})},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},computed:{fotoStatus(){return this.data?.fotoStatus??null},filteredEditData(){return this.editDataFilter?this.editData.data[this.editDataFilter]:this.editData},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("person","personenkennzeichen")}`,value:this.data.personenkennzeichen},studiengang:{label:`${this.$p.t("lehre","studiengang")}`,value:this.data.studiengang},semester:{label:`${this.$p.t("lehre","semester")}`,value:this.data.semester},verband:{label:`${this.$p.t("lehre","lehrverband")}`,value:this.data.verband},gruppe:{label:`${this.$p.t("lehre","gruppe")}`,value:this.data.gruppe.trim()}}:{}}},created(){this.$p.loadCategory("profil").then(()=>{this.preloadedPhrasen.zutrittsGruppenPhrase=this.$p.t("profil/zutrittsGruppen"),this.preloadedPhrasen.entlehnteBetriebsmittelPhrase=this.$p.t("profil/entlehnteBetriebsmittel"),this.preloadedPhrasen.inventarnummerPhrase=this.$p.t("profil/inventarnummer"),this.preloadedPhrasen.ausgabedatum=this.$p.t("profil/ausgabedatum"),this.preloadedPhrasen.loaded=!0}),this.data.profilUpdates?.sort(this.sortProfilUpdates)},watch:{"language.value"(t){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.zutrittsgruppenTable&&this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)}},template:'\n<div class="container-fluid text-break fhc-form">\n <edit-profil v-if="showModal" ref="editModal" @hideBsModal="hideEditProfilModal"\n :value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t(\'profil\',\'profilBearbeiten\')"></edit-profil>\n \x3c!-- ROW --\x3e\n <div class="row">\n \x3c!-- HIDDEN QUICK LINKS --\x3e\n <div class="d-md-none col-12 ">\n \x3c!--TODO: uncomment when implemented\n\t\t\t<div class="row py-2">\n <div class="col">\n <quick-links :title="$p.t(\'profil\',\'quickLinks\')" :mobile="true"></quick-links>\n </div>\n </div>--\x3e\n\n\t\t\t\x3c!-- Bearbeiten Button --\x3e\n\t\t\t<div v-if="isEditable" class="row ">\n\t\t\t\t<div class="col mb-3">\n\t\t\t\t\t<button @click="showEditProfilModal" type="button" class="card text-start w-100 btn btn-outline-secondary" >\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="col-2">\n\t\t\t\t\t\t\t\t<i class="fa fa-edit"></i>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-10">{{$p.t(\'ui\',\'bearbeiten\')}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\t<div v-if="data.profilUpdates" class="row mb-3">\n\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\x3c!-- MOBILE PROFIL UPDATES --\x3e\n\t\t\t\t\t\t<fetch-profil-updates v-if="data.profilUpdates && data.profilUpdates.length" @fetchUpdates="fetchProfilUpdates" :data="data.profilUpdates"></fetch-profil-updates>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n\n\t\t\t\x3c!-- MAIN PANNEL --\x3e\n\t\t\t<div class="col-sm-12 col-md-8 col-xxl-9 ">\n\t\t\t\t\x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n\t\t\t\t\x3c!-- INFORMATION CONTENT START --\x3e\n\t\t\t\t\x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n\t\t\t\t<div class="row mb-4 ">\n\t\t\t\t\t<div class="col-lg-12 col-xl-6 ">\n\t\t\t\t\t\t<div class="row mb-4">\n\t\t\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\t\t\x3c!-- PROFIL INFORMATION --\x3e\n\t\t\t\t\t\t\t\t<profil-information @showEditProfilModal="showEditProfilModal" :title="$p.t(\'profil\',\'studentIn\')" :data="profilInformation" :fotoStatus="fotoStatus"></profil-information>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row mb-4">\n\t\t\t\t\t\t\t<div class=" col-lg-12">\n\t\t\t\t\t\t\t\t\x3c!-- STUDENT INFO --\x3e\n\t\t\t\t\t\t\t\t<role-information :title="$p.t(\'profil\',\'studentInformation\')" :data="roleInformation"></role-information>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-xl-6 col-lg-12 ">\n\t\t\t\t\t\t<div class="row mb-4">\n\t\t\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\t\t\x3c!-- EMAILS --\x3e\n\t\t\t\t\t\t\t\t<profil-emails :title="this.$p.t(\'person\',\'email\')" :data="data.emails" ></profil-emails>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="row mb-4 ">\n\t\t\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\t\t\x3c!-- PRIVATE KONTAKTE--\x3e\n\t\t\t\t\t\t\t\t<div class="card">\n\t\t\t\t\t\t\t\t\t<div class="card-header">\n\t\t\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t\t\t<div @click="showEditProfilModal(\'Private_Kontakte\')" class="col-auto" type="button">\n\t\t\t\t\t\t\t\t\t\t\t\t<i class="fa fa-edit"></i>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\t\t\t\t\t<span>{{$p.t(\'profil\',\'privateKontakte\')}}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="card-body ">\n\t\t\t\t\t\t\t\t\t<div class="gy-3 row">\n\t\t\t\t\t\t\t\t\t\t<div v-for="element in data.kontakte" class="col-12">\n\t\t\t\t\t\t\t\t\t\t\t<Kontakt :data="element"></Kontakt>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="row mb-4">\n\t\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\t\x3c!-- PRIVATE ADRESSEN--\x3e\n\t\t\t\t\t\t\t<div class="card">\n\t\t\t\t\t\t\t\t<div class="card-header">\n\t\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t\t<div @click="showEditProfilModal(\'Private_Adressen\')" class="col-auto" type="button">\n\t\t\t\t\t\t\t\t\t\t\t<i class="fa fa-edit"></i>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class="col">\n\t\t\t\t\t\t\t\t\t\t\t<span>{{$p.t(\'profil\',\'privateAdressen\')}}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="card-body">\n\t\t\t\t\t\t\t\t\t<div class="gy-3 row ">\n\t\t\t\t\t\t\t\t\t\t<div v-for="element in data.adressen" class="col-12">\n\t\t\t\t\t\t\t\t\t\t\t<Adresse :data="element"></Adresse>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div >\n\t\t\t\x3c!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES --\x3e\n\t\t\t<div class="row">\n\t\t\t\t<div class="col-12 mb-4" >\n\t\t\t\t\t<core-filter-cmpt\n\t\t\t\t\tv-if="preloadedPhrasen.loaded"\n\t\t\t\t\t@tableBuilt="betriebsmittelTableBuilt"\n\t\t\t\t\t:title="$p.t(\'profil\',\'entlehnteBetriebsmittel\')"\n\t\t\t\t\tref="betriebsmittelTable"\n\t\t\t\t\t:tabulator-options="betriebsmittel_table_options"\n\t\t\t\t\ttableOnly\n\t\t\t\t\t:sideMenu="false" />\n\t\t\t\t</div>\n\t\t\t\t<div class="col-12 mb-4" >\n\t\t\t\t\t<core-filter-cmpt\n\t\t\t\t\tv-if="preloadedPhrasen.loaded"\n\t\t\t\t\t@tableBuilt="zutrittsgruppenTableBuilt" \n\t\t\t\t\t:title="$p.t(\'profil\',\'zutrittsGruppen\')" \n\t\t\t\t\tref="zutrittsgruppenTable" \n\t\t\t\t\t:tabulator-options="zutrittsgruppen_table_options" \n\t\t\t\t\ttableOnly \n\t\t\t\t\t:sideMenu="false" \n\t\t\t\t\tnoColumnFilter />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\x3c!-- END OF MAIN CONTENT COL --\x3e\n\t\t</div>\n\t\t\x3c!-- START OF SIDE PANEL --\x3e\n\t\t<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >\n\t\t\t\x3c!--TODO: uncomment when implemented\n\t\t\t<div class="row d-none d-md-block mb-3">\n\t\t\t\t<div class="col">\n\t\t\t\t\t<quick-links :title="$p.t(\'profil\',\'quickLinks\')"></quick-links>\n\t\t\t\t</div>\n\t\t\t</div>--\x3e\n\t\t\t\x3c!-- Bearbeiten Button --\x3e\n\t\t\t<div class="row d-none d-md-block">\n\t\t\t\t<div class="col mb-3">\n\t\t\t\t\t<button @click="()=>showEditProfilModal()" type="button" class="card text-start w-100 btn btn-outline-secondary" >\n\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t<div class="col-2">\n\t\t\t\t\t\t\t\t<i class="fa fa-edit"></i>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-10">{{$p.t(\'ui\',\'bearbeiten\')}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if="data.profilUpdates" class="row d-none d-md-block mb-3">\n\t\t\t\t<div class="col mb-3">\n\t\t\t\t\t\x3c!-- PROFIL UPDATES --\x3e\n\t\t\t\t\t<fetch-profil-updates v-if="data.profilUpdates && data.profilUpdates.length" @fetchUpdates="fetchProfilUpdates" :data="data.profilUpdates"></fetch-profil-updates>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="row mb-3" >\n\t\t\t\t<div class="col-12">\n\t\t\t\t\t<ausweis-status :data="data.zutrittsdatum"></ausweis-status>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- START OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n\t\t\t<div class="row">\n\t\t\t\t<div class="col">\n\t\t\t\t\t\x3c!-- HIER SIND DIE MAILVERTEILER --\x3e\n\t\t\t\t\t<mailverteiler :title="$p.t(\'profil\',\'mailverteiler\')" :data="data?.mailverteiler"></mailverteiler>\n\t\t\t\t</div>\n \x3c!-- END OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n </div>\n \x3c!-- END OF SIDE PANEL --\x3e\n </div>\n \x3c!-- END OF CONTAINER ROW--\x3e\n </div> \n\x3c!-- END OF CONTAINER --\x3e\n</div>\n'},Ie={components:{CoreFilterCmpt:fe,EditProfil:Ce,Adresse:we,Kontakt:ke,FetchProfilUpdates:Oe,AusweisStatus:be,Mailverteiler:ve,QuickLinks:ye,ProfilEmails:_e,RoleInformation:Ae,ProfilInformation:Te},inject:["sortProfilUpdates","collapseFunction","language","isEditable"],data(){return{showModal:!1,editDataFilter:null,preloadedPhrasen:{},funktionen_table_options:{persistenceID:"filterTableMaProfilFunktionen",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"<i id='collapseIconFunktionen' role='button' class='fa-solid fa-angle-down '></i>",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.bezeichnungPhrase),field:"Bezeichnung",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.organisationseinheitPhrase),field:"Organisationseinheit",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.gueltigVonPhrase),field:"Gültig_von",headerFilterFunc:"dates",headerFilter:Fe,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.preloadedPhrasen.gueltigBisPhrase),field:"Gültig_bis",headerFilterFunc:"dates",headerFilter:Fe,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.preloadedPhrasen.wochenstundenPhrase),field:"Wochenstunden",headerFilter:!0,minWidth:200,visible:!0}]},betriebsmittel_table_options:{persistenceID:"filterTableMaProfilBetriebsmittel",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,data:[{betriebsmittel:"",Nummer:"",Ausgegeben_am:""}],columns:[{title:"<i id='collapseIconBetriebsmittel' role='button' class='fa-solid fa-angle-down '></i>",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),field:"betriebsmittel",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.inventarnummerPhrase),field:"Nummer",headerFilter:!0,resizable:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.ausgabedatumPhrase),field:"Ausgegeben_am",headerFilterFunc:"dates",headerFilter:Fe,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()}]}}},props:{data:Object,editData:Object},methods:{betriebsmittelTableBuilt:function(){this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel)},funktionenTableBuilt:function(){this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns),this.$refs.funktionenTable.tabulator.setData(this.data.funktionen)},hideEditProfilModal:function(){this.$refs.editModal.result&&this.$api.call(Se.selectProfilRequest()).then(t=>{!t.error&&t.data?(this.data.profilUpdates=t.data,this.data.profilUpdates.sort(this.sortProfilUpdates)):console.error("Error when fetching profile updates: "+t)}).catch(t=>{console.error(t)}),this.showModal=!1,this.editDataFilter=null},showEditProfilModal(t){t&&(this.editDataFilter=t),this.showModal=!0,Vue.nextTick(()=>{this.$refs.editModal.show()})},fetchProfilUpdates:function(){this.$api.call(Se.selectProfilRequest()).then(t=>{!t.error&&t&&(this.data.profilUpdates=t.data?.length?t.data.sort(this.sortProfilUpdates):null)})},setTableColumnTitles(){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},computed:{fotoStatus(){return this.data?.fotoStatus??null},getTelefonValue(){return this.data.standort_telefon?.kontakt?this.data.standort_telefon.kontakt+" "+this.data.telefonklappe:this.data.standort_telefon?this.data.standort_telefon+" "+this.data.telefonklappe:this.data.telefonklappe},filteredEditData(){return this.editDataFilter?this.editData.data[this.editDataFilter]:this.editData},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("profil","Kurzzeichen")}`,value:this.data.kurzbz},telefon:{label:`${this.$p.t("profil","Telefon")}`,value:this.getTelefonValue},office:{label:`${this.$p.t("profil","Büro")}`,value:this.data.ort_kurzbz}}:{}}},created(){this.$p.loadCategory(["ui","lehre","global","profil"]).then(()=>{this.preloadedPhrasen.bezeichnungPhrase=this.$p.t("ui/bezeichnung"),this.preloadedPhrasen.organisationseinheitPhrase=this.$p.t("lehre/organisationseinheit"),this.preloadedPhrasen.gueltigVonPhrase=this.$p.t("global/gueltigVon"),this.preloadedPhrasen.gueltigBisPhrase=this.$p.t("global/gueltigBis"),this.preloadedPhrasen.wochenstundenPhrase=this.$p.t("profil/wochenstunden"),this.preloadedPhrasen.entlehnteBetriebsmittelPhrase=this.$p.t("profil/entlehnteBetriebsmittel"),this.preloadedPhrasen.inventarnummerPhrase=this.$p.t("profil/inventarnummer"),this.preloadedPhrasen.ausgabedatumPhrase=this.$p.t("profil/ausgabedatum"),this.preloadedPhrasen.loaded=!0}),this.data.profilUpdates?.sort(this.sortProfilUpdates)},watch:{"data.funktionen"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setData(t)},"data.mittel"(t){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setData(t)},"language.value"(t){this.setTableColumnTitles()}},template:'\n<div class="container-fluid text-break fhc-form" >\n <edit-profil v-if="showModal" ref="editModal" :isMitarbeiter="true" @hideBsModal="hideEditProfilModal" :value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t(\'profil\',\'profilBearbeiten\')"></edit-profil>\n <div class="row">\n <div class="d-md-none col-12 ">\n \x3c!--TODO: uncomment when implemented\n <div class="row mb-3">\n <div class="col">\n <quick-links :title="$p.t(\'profil\',\'quickLinks\')" :mobile="true"></quick-links>\n </div>\n </div>--\x3e\n \x3c!-- Bearbeiten Button --\x3e\n <div v-if="isEditable" class="row mb-3 ">\n <div class="col">\n <button @click="()=>showEditProfilModal()" type="button" class="text-start card w-100 btn btn-outline-secondary" >\n <div class="row">\n <div class="col-auto">\n <i class="fa fa-edit"></i>\n </div>\n <div class="col-auto">{{$p.t(\'ui\',\'bearbeiten\')}}</div>\n </div>\n </button>\n </div>\n </div>\n <div v-if="data.profilUpdates" class="row mb-3">\n <div class="col">\n \x3c!-- MOBILE PROFIL UPDATES --\x3e\n <fetch-profil-updates v-if="data.profilUpdates && data.profilUpdates.length" @fetchUpdates="fetchProfilUpdates" :data="data.profilUpdates" ></fetch-profil-updates>\n </div>\n </div>\n </div>\n \x3c!-- END OF HIDDEN ROW (HIDDEN IN VIEWPORTS GREATER THEN-EQUAL MD) --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n <div class="col-sm-12 col-md-8 col-xxl-9 ">\n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n <div class="row mb-4">\n <div class="col-lg-12 col-xl-6 ">\n <div class="row mb-4">\n <div class="col">\n \x3c!-- PROFIL INFORMATION --\x3e\n <profil-information @showEditProfilModal="showEditProfilModal" :title="$p.t(\'profil\',\'mitarbeiterIn\')" :data="profilInformation" :fotoStatus="fotoStatus"></profil-information>\n </div>\n </div>\n <div class="row mb-4">\n <div class=" col-lg-12">\n \x3c!-- MITARBEITER INFO --\x3e\n <role-information :title="$p.t(\'profil\',\'mitarbeiterInformation\')" :data="roleInformation"></role-information>\n </div>\n </div>\n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n </div>\n <div class="col-xl-6 col-lg-12 ">\n <div class="row mb-4">\n <div class="col">\n \x3c!-- EMAILS --\x3e\n <profil-emails :title="this.$p.t(\'person\',\'email\')" :data="data.emails" ></profil-emails>\n </div>\n </div>\n <div class="row mb-4 ">\n <div class="col">\n \x3c!-- PRIVATE KONTAKTE--\x3e\n <div class="card">\n <div class="card-header">\n <div class="row">\n <div @click="showEditProfilModal(\'Private_Kontakte\')" class="col-auto" type="button">\n <i class="fa fa-edit"></i>\n </div>\n <div class="col">\n <span>{{$p.t(\'profil\',\'privateKontakte\')}}</span>\n </div>\n </div>\n </div>\n <div class="card-body ">\n <div class="gy-3 row ">\n <div v-for="element in data.kontakte" class="col-12">\n <Kontakt :data="element"></Kontakt>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="row mb-4">\n <div class="col">\n \x3c!-- PRIVATE ADRESSEN--\x3e\n <div class="card">\n <div class="card-header">\n <div class="row">\n <div @click="showEditProfilModal(\'Private_Adressen\')" class="col-auto" type="button">\n <i class="fa fa-edit"></i>\n </div>\n <div class="col">\n <span>{{$p.t(\'profil\',\'privateAdressen\')}}</span>\n </div>\n </div>\n </div>\n <div class="card-body">\n <div class="gy-3 row ">\n <div v-for="element in data.adressen" class="col-12">\n <Adresse :data="element"></Adresse>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div >\n <div class="row">\n <div class="col-12 mb-4" >\n \x3c!-- FUNKTIONEN TABELLE --\x3e\n <core-filter-cmpt\n\t\t\t\t\t\tv-if="preloadedPhrasen.loaded"\n \t@tableBuilt="funktionenTableBuilt"\n\t\t\t\t\t\t:title="$p.t(\'person\',\'funktionen\')"\n\t\t\t\t\t\tref="funktionenTable"\n\t\t\t\t\t\t:tabulator-options="funktionen_table_options"\n\t\t\t\t\t\ttableOnly\n\t\t\t\t\t\t:sideMenu="false"\n />\n </div>\n <div class="col-12 mb-4" >\n \x3c!-- BETRIEBSMITTEL TABELLE --\x3e\n <core-filter-cmpt\n\t\t\t\t\t\tv-if="preloadedPhrasen.loaded"\n \t@tableBuilt="betriebsmittelTableBuilt"\n\t\t\t\t\t\t:title="$p.t(\'profil\',\'entlehnteBetriebsmittel\')"\n\t\t\t\t\t\tref="betriebsmittelTable"\n\t\t\t\t\t\t:tabulator-options="betriebsmittel_table_options"\n\t\t\t\t\t\ttableOnly\n\t\t\t\t\t\t:sideMenu="false"\n />\n </div>\n </div>\n </div>\n \x3c!-- START OF SIDE PANEL --\x3e\n <div class="col-md-4 col-xxl-3 col-sm-12 text-break" >\n \x3c!--TODO: uncomment when implemented\n <div class="row d-none d-md-block mb-3">\n \n <div class="col">\n \n <quick-links :title="$p.t(\'profil\',\'quickLinks\')"></quick-links>\n \n \n \n </div>\n </div>--\x3e\n \x3c!-- Bearbeiten Button --\x3e\n <div class="row d-none d-md-block ">\n <div class="col mb-3">\n <button @click="()=>showEditProfilModal()" type="button" class="text-start card w-100 btn btn-outline-secondary" >\n <div class="row">\n <div class="col-auto">\n <i class="fa fa-edit"></i>\n </div>\n <div class="col-auto">{{$p.t(\'ui\',\'bearbeiten\')}}</div>\n </div>\n </button>\n </div>\n </div>\n <div v-if="data.profilUpdates" class="row d-none d-md-block mb-3">\n <div class="col mb-3">\n \x3c!-- PROFIL UPDATES --\x3e\n <fetch-profil-updates v-if="data.profilUpdates && data.profilUpdates.length" @fetchUpdates="fetchProfilUpdates" :data="data.profilUpdates"></fetch-profil-updates>\n </div>\n </div>\n <div class="row mb-3" >\n <div class="col-12">\n \x3c!-- AUSWEIS STATUS --\x3e\n <ausweis-status :data="data.zutrittsdatum"></ausweis-status>\n </div>\n </div>\n <div class="row">\n <div class="col">\n \x3c!-- MAILVERTEILER --\x3e\n <mailverteiler :data="data?.mailverteiler" :title="$p.t(\'profil\',\'mailverteiler\')"></mailverteiler>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n \n '},Me={data:()=>({}),components:{QuickLinks:ye,Mailverteiler:ve,ProfilEmails:_e,RoleInformation:Ae,ProfilInformation:Te},props:["data"],provide(){return{studiengang_kz:Vue.computed({get:()=>this.data.studiengang_kz})}},methods:{},computed:{fotoStatus(){return this.data?.fotoStatus??null},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},personEmails(){return this.data?.emails?this.data.emails:[]},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("person","personenkennzeichen")}`,value:this.data.personenkennzeichen},studiengang:{label:`${this.$p.t("lehre","studiengang")}`,value:this.data.studiengang},semester:{label:`${this.$p.t("lehre","semester")}`,value:this.data.semester},verband:{label:`${this.$p.t("lehre","lehrverband")}`,value:this.data.verband},gruppe:{label:`${this.$p.t("lehre","gruppe")}`,value:this.data.gruppe.trim()}}:{}}},mounted(){},template:' \n\n<div class="container-fluid text-break fhc-form" >\n \x3c!-- ROW --\x3e \n <div class="row">\n \x3c!-- HIDDEN QUICK LINKS --\x3e\n \x3c!-- uncomment when implemented\n <div class="d-md-none col-12 ">\n \n <quick-links :title="$p.t(\'profil\',\'quickLinks\')" :mobile="true"></quick-links>\n \n </div>--\x3e\n \x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n <div class="col-sm-12 col-md-8 col-xxl-9 ">\n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e \n <div class="row mb-4">\n \x3c!-- FIRST KAESTCHEN --\x3e\n <div class="col-lg-12 col-xl-6 ">\n <div class="row mb-4">\n <div class="col">\n <profil-information :data="profilInformation" :title="$p.t(\'profil\',\'studentIn\')" :fotoStatus="fotoStatus"></profil-information>\n </div>\n </div>\n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n \x3c!-- END OF PROFIL INFORMATION ROW --\x3e\n \x3c!-- INFORMATION CONTENT END --\x3e\n </div>\n <div class="col-xl-6 col-lg-12 ">\n <div class="row mb-4">\n <div class="col">\n \x3c!-- EMAILS --\x3e\n <profil-emails :title="this.$p.t(\'person\',\'email\')" :data="personEmails"></profil-emails>\n </div>\n </div>\n \x3c!-- SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n <div class=" row mb-4">\n <div class=" col-lg-12">\n <role-information :title="$p.t(\'profil\',\'studentInformation\')" :data="roleInformation"></role-information>\n </div>\n </div>\n \x3c!-- END OF SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n \x3c!-- END OF THE SECOND INFORMATION COLUMN --\x3e\n </div>\n \x3c!-- START OF THE SECOND PROFIL INFORMATION ROW --\x3e \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION END --\x3e\n </div >\n \x3c!-- END OF MAIN CONTENT COL --\x3e\n </div>\n \x3c!-- START OF SIDE PANEL --\x3e\n <div class="col-md-4 col-xxl-3 col-sm-12 text-break" >\n \x3c!-- SRART OF QUICK LINKS IN THE SIDE PANEL --\x3e\n \x3c!-- START OF THE FIRDT ROW IN THE SIDE PANEL --\x3e\n \x3c!-- THESE QUCK LINKS ARE ONLY VISIBLE UNTIL VIEWPORT MD --\x3e\n \x3c!--TODO: uncomment when implemented\n <div class="row d-none d-md-block mb-3">\n <div class="col">\n \n <quick-links :title="$p.t(\'profil\',\'quickLinks\')"></quick-links>\n \n </div>\n </div>--\x3e\n \x3c!-- START OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n <div class="row">\n <div class="col">\n \x3c!-- HIER SIND DIE MAILVERTEILER --\x3e\n <mailverteiler :title="$p.t(\'profil\',\'mailverteiler\')" :data="data?.mailverteiler"></mailverteiler>\n </div>\n \x3c!-- END OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n </div>\n \x3c!-- END OF SIDE PANEL --\x3e\n </div>\n \x3c!-- END OF CONTAINER ROW--\x3e\n </div>\n \x3c!-- END OF CONTAINER --\x3e\n</div> \n '},Le={components:{CoreFilterCmpt:fe,Mailverteiler:ve,QuickLinks:ye,RoleInformation:Ae,ProfilEmails:_e,ProfilInformation:Te},inject:["collapseFunction","language"],data(){return{collapseIconFunktionen:!0,preloadedPhrasen:{},funktionen_table_options:{persistenceID:"filterTableMaViewProfilFunktionen",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"<i id='collapseIconFunktionen' role='button' class='fa-solid fa-angle-down '></i>",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.$p.t("ui/bezeichnung")),field:"Bezeichnung",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.$p.t("lehre/organisationseinheit")),field:"Organisationseinheit",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.$p.t("global/gueltigVon")),field:"Gültig_von",headerFilterFunc:"dates",headerFilter:Fe,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.$p.t("global/gueltigBis")),field:"Gültig_bis",headerFilterFunc:"dates",headerFilter:Fe,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.$p.t("profil/wochenstunden")),field:"Wochenstunden",headerFilter:!0,minWidth:200,visible:!0}]}}},props:["data"],methods:{funktionenTableBuilt:function(){this.$refs.funktionenTable.tabulator.setData(this.data.funktionen)},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},watch:{"data.funktionen"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setData(t)},"language.value"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)}},computed:{getTelefonValue(){return this.data.standort_telefon?.kontakt?this.data.standort_telefon.kontakt+" "+this.data.telefonklappe:this.data.standort_telefon?this.data.standort_telefon+" "+this.data.telefonklappe:this.data.telefonklappe},fotoStatus(){return this.data?.fotoStatus??null},personEmails(){return this.data?.emails?this.data.emails:[]},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("profil","Kurzzeichen")}`,value:this.data.kurzbz},telefon:{label:`${this.$p.t("profil","Telefon")}`,value:this.getTelefonValue},office:{label:`${this.$p.t("profil","Büro")}`,value:this.data.ort_kurzbz}}:{}}},created(){this.$p.loadCategory(["ui","lehre","global","profil"]).then(()=>{this.preloadedPhrasen.bezeichnungPhrase=this.$p.t("ui/bezeichnung"),this.preloadedPhrasen.organisationseinheitPhrase=this.$p.t("lehre/organisationseinheit"),this.preloadedPhrasen.gueltigVonPhrase=this.$p.t("global/gueltigVon"),this.preloadedPhrasen.gueltigBisPhrase=this.$p.t("global/gueltigBis"),this.preloadedPhrasen.wochenstundenPhrase=this.$p.t("profil/wochenstunden"),this.preloadedPhrasen.loaded=!0})},template:'\n\n<div class="container-fluid text-break fhc-form" >\n \x3c!-- ROW --\x3e\n <div class="row">\n \x3c!-- HIDDEN QUICK LINKS --\x3e\n \x3c!-- TODO: uncomment when implemented\n <div class="d-md-none col-12 ">\n\n <quick-links :title="$p.t(\'profil\',\'quickLinks\')" :mobile="true" ></quick-links>\n\n </div>\n --\x3e\n \x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n <div class="col-sm-12 col-md-8 col-xxl-9 ">\n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n <div class="row mb-4">\n \x3c!-- FIRST KAESTCHEN --\x3e\n <div class="col-lg-12 col-xl-6 ">\n <div class="row mb-4">\n <div class="col">\n \x3c!-- Profil Informationen --\x3e\n <profil-information :title="$p.t(\'profil\',\'mitarbeiterIn\')" :data="profilInformation" :fotoStatus="fotoStatus"></profil-information>\n </div>\n </div>\n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n \x3c!-- END OF PROFIL INFORMATION ROW --\x3e\n \x3c!-- INFORMATION CONTENT END --\x3e\n </div>\n <div class="col-xl-6 col-lg-12 ">\n <div class="row mb-4">\n <div class="col">\n \x3c!-- EMAILS --\x3e\n <profil-emails :title="this.$p.t(\'person\',\'email\')" :data="personEmails"></profil-emails>\n </div>\n </div>\n \x3c!-- SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n <div class="row mb-4">\n <div class=" col-lg-12">\n \x3c!-- roleInformation --\x3e\n <role-information :data="roleInformation" :title="$p.t(\'profil\',\'mitarbeiterInformation\')"></role-information>\n </div>\n </div>\n \x3c!-- END OF SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n \x3c!-- END OF THE SECOND INFORMATION COLUMN --\x3e\n </div>\n \x3c!-- START OF THE SECOND PROFIL INFORMATION ROW --\x3e\n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION END --\x3e\n </div >\n \x3c!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES --\x3e\n <div class="row">\n \x3c!-- FIRST TABLE --\x3e\n <div class="col-12 mb-4" >\n <core-filter-cmpt v-if="preloadedPhrasen.loaded" @tableBuilt="funktionenTableBuilt" :title="$p.t(\'person\',\'funktionen\')" ref="funktionenTable" :tabulator-options="funktionen_table_options" tableOnly :sideMenu="false" />\n </div>\n \x3c!-- END OF THE ROW WITH THE TABLES UNDER THE PROFIL INFORMATION --\x3e\n </div>\n \x3c!-- END OF MAIN CONTENT COL --\x3e\n </div>\n \x3c!-- START OF SIDE PANEL --\x3e\n <div class="col-md-4 col-xxl-3 col-sm-12 text-break" >\n \x3c!-- VISIBLE UNTIL VIEWPORT MD --\x3e\n \x3c!--TODO: uncomment when implemented\n <div class="row d-none d-md-block mb-3">\n <div class="col">\n \n <quick-links :title="$p.t(\'profil\',\'quickLinks\')" ></quick-links>\n \n </div>\n </div>\n --\x3e\n <div class="row">\n <div class="col">\n \x3c!-- MAILVERTEILER --\x3e\n <mailverteiler :data="data?.mailverteiler" :title="$p.t(\'profil\',\'mailverteiler\')"></mailverteiler>\n </div>\n </div>\n \x3c!-- END OF SIDE PANEL --\x3e\n </div>\n \x3c!-- END OF CONTAINER ROW--\x3e\n </div>\n \x3c!-- END OF CONTAINER --\x3e\n</div>\n'};Vue.$collapseFormatter=function(t){var e=document.createElement("div");e.classList.add("tabulator-collapsed-row"),e.classList.add("text-break");var n=document.createElement("div");return n.classList.add("row"),e.appendChild(n),t.forEach(function(t){let e=document.createElement("div");e.classList.add("col-6");let i=document.createElement("div");i.classList.add("col-6"),e.innerHTML="<strong>"+t.title+"</strong>",i.innerHTML=t.value?t.value:"-",n.appendChild(e),n.appendChild(i)}),Object.keys(t).length?e:""};const Ne={name:"Profil",components:{StudentProfil:Pe,MitarbeiterProfil:Ie,ViewStudentProfil:Me,ViewMitarbeiterProfil:Le,Loading:Ee},props:{uid:{type:String,required:!1},viewData:{type:Object}},data(){return{loading:!1,profilUpdateStates:null,profilUpdateTopic:null,view:null,data:null,notFoundUID:null,isEditable:this.viewData.editable??!1}},provide(){return{isEditable:Vue.computed(()=>this.isEditable),profilUpdateStates:Vue.computed(()=>!!this.profilUpdateStates&&this.profilUpdateStates),profilUpdateTopic:Vue.computed(()=>!!this.profilUpdateTopic&&this.profilUpdateTopic),setLoading:t=>{this.loading=t},getZustellkontakteCount:this.zustellKontakteCount,getZustelladressenCount:this.zustellAdressenCount,collapseFunction:(t,e)=>{void 0===this[t.target.id]&&(this[t.target.id]=!0),this[t.target.id]=!this[t.target.id];let n=e._column.cells.map(t=>t.element.children[0]);this[t.target.id]?t.target.classList.replace("fa-angle-up","fa-angle-down"):t.target.classList.replace("fa-angle-down","fa-angle-up"),this[t.target.id]?n.filter(t=>!t.classList.contains("open")).forEach(t=>{t.click()}):n.filter(t=>t.classList.contains("open")).forEach(t=>{t.click()})},sortProfilUpdates:(t,e)=>{let n=0;return n="pending"===t.status.toLowerCase()||"accepted"===t.status.toLowerCase()&&"rejected"===e.status.toLowerCase()?-1:1,t.status===e.status&&(n=new Date(e.insertamum.split(".").reverse().join("-"))-new Date(t.insertamum.split(".").reverse().join("-"))),n}}},methods:{async load(){await this.$api.call(Se.getStatus()).then(t=>{this.profilUpdateStates=t.data}).catch(t=>{console.error(t)}),this.$api.call(Se.getTopic()).then(t=>{this.profilUpdateTopic=t.data}).catch(t=>{console.error(t)}),this.$api.call($e.profilViewData(this.$route.params.uid??null)).then(t=>t.data).then(t=>{this.view=t?.profil_data.view,this.data=t?.profil_data.data,this.isEditable=t?.editable??!1}).catch(t=>{console.error(t)})},zustellAdressenCount(){if(!this.data||!this.data.adressen)return null;let t=[];return this.data.profilUpdates?.length&&(t=t.concat(this.data.profilUpdates.filter(t=>t.requested_change.zustelladresse).map(t=>t.requested_change.adresse_id))),this.data.profilUpdates?.length&&this.data.adressen.filter(t=>t.zustelladresse).every(t=>this.data.profilUpdates.some(e=>e.requested_change.adresse_id==t.adresse_id))||(t=t.concat(this.data.adressen.filter(t=>t.zustelladresse).map(t=>t.adresse_id))),[...new Set(t)]},zustellKontakteCount(){if(!this.data||!this.data.kontakte)return null;let t=[];return this.data.profilUpdates?.length&&(t=t.concat(this.data.profilUpdates.filter(t=>"Pending"===t.status&&t.requested_change.zustellung).map(t=>({kontakt_id:t.requested_change.kontakt_id,kontakttyp:t.requested_change.kontakttyp})))),this.data.profilUpdates?.length&&this.data.kontakte.filter(t=>t.zustellung).every(t=>this.data.profilUpdates.some(e=>"Pending"===e.status&&e.requested_change.kontakt_id==t.kontakt_id))||(t=t.concat(this.data.kontakte.filter(t=>t.zustellung).map(t=>({kontakt_id:t.kontakt_id,kontakttyp:t.kontakttyp})))),[...new Set(t)]}},computed:{filteredEditData(){if(this.data)return{view:null,data:{Personen_Informationen:{title:this.$p.t("profil","personenInformationen"),topic:"Personen_informationen",view:null,data:{vorname:{title:this.$p.t("person","vorname"),topic:this.profilUpdateTopic?.Vorname,view:"TextInputDokument",withFiles:!0,data:{titel:"vorname",value:this.data.vorname}},nachname:{title:this.$p.t("person","nachname"),topic:this.profilUpdateTopic?.Nachname,view:"TextInputDokument",withFiles:!0,data:{titel:"nachname",value:this.data.nachname}},titel:{title:this.$p.t("global","titel"),topic:this.profilUpdateTopic?.Titel,view:"TextInputDokument",withFiles:!0,data:{titel:"titel",value:this.data.titel}},postnomen:{title:this.$p.t("profil","postnomen"),topic:this.profilUpdateTopic?.Postnomen,view:"TextInputDokument",withFiles:!0,data:{titel:"postnomen",value:this.data.postnomen}}}},Private_Kontakte:{title:this.$p.t("profil","privateKontakte"),topic:this.profilUpdateTopic?.["Private Kontakte"],data:this.data.kontakte?.filter(t=>!this.data.profilUpdates?.some(e=>e.status===this.profilUpdateStates.Pending&&e.requested_change?.kontakt_id===t.kontakt_id)).map(t=>({listview:"Kontakt",view:"EditKontakt",data:t}))},Private_Adressen:{title:this.$p.t("profil","privateAdressen"),topic:this.profilUpdateTopic?.["Private Adressen"],data:this.data.adressen?.filter(t=>!this.data.profilUpdates?.some(e=>e.status===this.profilUpdateStates.Pending&&e.requested_change?.adresse_id==t.adresse_id)).map(t=>({listview:"Adresse",view:"EditAdresse",data:t}))}}}}},watch:{loading:function(t){t?this.$refs.loadingModalRef.show():this.$refs.loadingModalRef.hide()},uid(t,e){this.load()}},created(){this.load()},template:'\n\t<div>\n\t\t<div v-if="notFoundUID">\n\t\t\t<h3>Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden</h3>\n\t\t</div>\n\t\t<div v-else>\n <loading ref="loadingModalRef" :timeout="0"></loading>\n <component :is="view" :data="data" :editData="filteredEditData" ></component>\n\t\t</div>\n\t</div>'};var Re={getContentID:t=>({method:"get",url:"/api/frontend/v1/Ort/ContentID",params:{ort_kurzbz:t}}),getRooms:(t,e,n,i,a=0)=>({method:"get",url:"/api/frontend/v1/Ort/getRooms",params:{datum:t,von:e,bis:n,typ:i,personenanzahl:a}}),getRoomTypes:()=>({method:"get",url:"/api/frontend/v1/Ort/getTypes",params:{}})};const Be={name:"Raumsuche",props:{},components:{VueDatePicker:a,CoreFilterCmpt:fe,InputNumber:primevue.inputnumber},data(){return{phrasenPromise:null,phrasenResolved:!1,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,roomtypes:null,defaultType:{raumtyp_kurzbz:"",beschreibung:Vue.computed(()=>this.$p.t("global/alle"))},anzahl:1,selectedType:null,datum:new Date,von:Vue.ref({hours:(new Date).getHours(),minutes:(new Date).getMinutes()}),bis:Vue.ref({hours:(new Date).getHours()+1,minutes:(new Date).getMinutes()}),datepickerTextInputOptions:{enterSubmit:!0,tabSubmit:!0,selectOnFocus:!0,format:"dd.MM.yyyy",escClose:!0},timepickerTextInputOptions:{enterSubmit:!0,tabSubmit:!0,selectOnFocus:!0,format:"HH:mm",escClose:!0},raumsucheTableOptions:{height:Vue.ref(400),index:"ort_kurzbz",layout:"fitColumns",placeholder:this.$p.t("global/noDataAvailable"),columns:[{title:Vue.computed(()=>this.$p.t("rauminfo/raum_kurzbz")),field:"ort_kurzbz",widthGrow:1},{title:Vue.computed(()=>this.$p.t("global/bezeichnung")),field:"bezeichnung",widthGrow:2},{title:Vue.computed(()=>this.$p.t("rauminfo/raumnummer")),field:"nummer",widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/personcap")),field:"personen",widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/rauminfo")),field:"linkInfo",formatter:this.linkFormatter,widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/roomReservations")),field:"linkRes",formatter:this.linkFormatter,widthGrow:1}],persistence:!1},raumsucheTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}}]}},methods:{tableResolve(t){this.tableBuiltResolve=t},linkFormatter(t){const e=t.getValue(),n="linkInfo"===t.getField()?this.$p.t("rauminfo/rauminfo"):this.$p.t("rauminfo/roomReservations");return e?'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a href="'+e+'" aria-label="'+n+'"><i class="fa fa-arrow-up-right-from-square me-1 fhc-primary-color" ></i></a></div>':'<div style="display: flex; justify-content: center; align-items: center; height: 100%">-</div>'},roomPlanLink:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/getRoomInformation/"+t.ort_kurzbz,roomInfoLink:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/content/"+t.content_id,getTimeString:t=>`${String(t.hours).padStart(2,"0")}:${String(t.minutes).padStart(2,"0")}`,setupData(t){const e=t.map(t=>({ort_kurzbz:t.ort_kurzbz,bezeichnung:t.bezeichnung.replace("&amp;","&"),nummer:t.planbezeichnung,personen:t.max_person,linkInfo:t.content_id?this.roomInfoLink(t):null,linkRes:this.roomPlanLink(t)}));this.$refs.raumsucheTable.tabulator.setData(e)},loadRoomTypes(){this.$api.call(Re.getRoomTypes()).then(t=>{t?.data?.forEach(t=>{t.beschreibung=t.beschreibung.replace("&amp;","&")}),this.selectedType=this.defaultType,this.roomtypes=t?.data??[]})},loadRooms(){this.$api.call(Re.getRooms(this.datum.toISOString(),this.getTimeString(this.von),this.getTimeString(this.bis),this.selectedType?.raumtyp_kurzbz??"",this.anzahl)).then(t=>{t?.data?.retval&&this.setupData(t.data.retval)})},handleUuidDefined(t){this.tabulatorUuid=t},search(){this.loadRooms()},setRoute(t){},dateFormat:t=>`${String(t.getDate()).padStart(2,"0")}.${String(t.getMonth()+1).padStart(2,"0")}.${t.getFullYear()}`,timeFormat:t=>`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadRoomTypes(),this.loadRooms();const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect(),i=window.visualViewport.height-n.top-100;this.$refs.raumsucheTable&&this.$refs.raumsucheTable.$refs.table.style.setProperty("height",i+"px")}},computed:{isDarkMode(){return"dark"==this.$theme.theme_name.value}},created(){this.phrasenPromise=this.$p.loadCategory(["rauminfo","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t<h1 class="h3">{{$p.t(\'rauminfo/roomSearch\')}}</h1>\n\t<hr>\n\t<div class="row">\n\t\t<div class="col-12 col-lg-2">\n\t\t\t<VueDatePicker\n\t\t\t\t:dark="isDarkMode"\n\t\t\t\tv-model="datum"\n\t\t\t\t:clearable="false"\n\t\t\t\tdate-picker\n\t\t\t\t:enable-time-picker="false"\n\t\t\t\t:format="dateFormat"\n\t\t\t\t:text-input="datepickerTextInputOptions"\n\t\t\t\t:min-date="new Date()"\n\t\t\t\tauto-apply>\n\t\t\t</VueDatePicker>\n\t\t</div>\n\t\t<div class="col-12 col-lg-1">\n\t\t\t<VueDatePicker\n\t\t\t\t:dark="isDarkMode"\n\t\t\t\tv-model="von"\n\t\t\t\t:clearable="false"\n\t\t\t\ttime-picker\n\t\t\t\t:format="timeFormat"\n\t\t\t\t:text-input="timepickerTextInputOptions"\n\t\t\t\t:is-24="true"\n\t\t\t\tauto-apply\n\t\t\t\t>\n\t\t\t</VueDatePicker>\n\t\t</div>\n\t\t<div class="col-12 col-lg-1">\n\t\t\t<VueDatePicker\n\t\t\t\t:dark="isDarkMode"\n\t\t\t\tv-model="bis"\n\t\t\t\t:clearable="false"\n\t\t\t\ttime-picker\n\t\t\t\t:format="timeFormat"\n\t\t\t\t:text-input="timepickerTextInputOptions"\n\t\t\t\t:is-24="true"\n\t\t\t\tauto-apply>\n\t\t\t</VueDatePicker>\n\t\t</div>\n\t\t\n\t\t<div class="col-12 col-lg-3">\n\t\t\t<select ref="raumtyp" id="raumtypSelect" v-model="selectedType" class="form-select" \n\t\t\t:aria-label="$p.t(\'global/studiensemester_auswaehlen\')" @change="setRoute($event.target.value)">\n\t\t\t\t<option :key="defaultType" selected :value="defaultType">{{defaultType.beschreibung}}</option>\n\t\t\t\t<option v-for="typ in roomtypes" :key="typ" :value="typ">{{typ.beschreibung}}</option>\n\t\t\t</select>\n\t\t</div>\n\t\t\n\n\t\t<div class="col-12 col-lg-3">\n\t\t\t<InputNumber v-model="anzahl" \n\t\t\t:prefix="$p.t(\'rauminfo/minCapacity\') + \': \'" \n\t\t\tinputId="anzahlInput" :min="1" :max="1000" \n\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t/>\n\t\t</div>\n\t\t<div class="col-12 col-lg-2">\n\t\t\t<button class="btn btn-primary border-0" @click="search">{{ $p.t(\'rauminfo/roomSearch\') }} <i class="fa fa-magnifying-glass"></i></button>\n\t\t</div>\n\t</div>\n\t\n\n <core-filter-cmpt \n \tv-if="phrasenResolved"\n\t\t@uuidDefined="handleUuidDefined"\n\t\t:title="\'\'" \n\t\tref="raumsucheTable" \n\t\t:tabulator-options="raumsucheTableOptions" \n\t\t:tabulator-events="raumsucheTableEventHandlers"\n\t\ttableOnly \n\t\t:sideMenu="false"\n\t />\n '};var je={components:{paginator:primevue.paginator},emits:["update:rows"],props:{maxPageCount:{type:Number,default:0},page_size:{type:Number,required:!0}},data:()=>({}),methods:{newPageEvent:function(t){}},mounted(){},template:'\n \t\x3c!-- Desktop --\x3e\n\t<div class="d-none d-md-block">\n\t\t<paginator v-model:rows="page_size" @page="(data)=>$emit(\'page\',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" >\n\t\t</paginator>\n\t</div>\n\t\x3c!-- Mobile --\x3e\n\t<div class="d-block d-md-none">\n\t\t<paginator v-model:rows="page_size" @page="(data)=>$emit(\'page\',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" template="FirstPageLink PrevPageLink CurrentPageReport NextPageLink LastPageLink RowsPerPageDropdown">\n\t\t</paginator>\n\t</div>\n '},Ue={props:{uid:String,vorname:String,nachname:String,titelpre:String,kontakt:String,telefoneklappe:String,email:String,planbezeichnung:String,foto:String,displayWidget:{type:Boolean,default:!1}},template:'\n\t<div class="card border-0" :style="{\'width\':displayWidget?\'12rem\':\'15rem\'}">\n\t\t<div class="d-flex justify-content-center">\n\t\t\t<img :src="base64Image" alt="mitarbeiter_foto" style="width: 110px; height: auto; object-fir:scale-down;" class="card-img-top" >\n\t\t</div>\n\t\t<div class="card-body p-2 flex-grow-0" style="min-height: 50px;">\n\t\t\t<h6 class="text-center card-title mb-0">{{fullname}} <a v-if="profilViewLink" :href="profilViewLink" :aria-label="$p.t(\'profil\',\'profil\')" :title="$p.t(\'profil\',\'profil\')"><i class="ms-2 fa fa-arrow-up-right-from-square fhc-primary-color" aria-hidden="true"></i></a></h6>\n\t\t</div>\n\t\t<hr class="my-0">\n\t\t<div class="card-body p-2">\n\n\t\t\t<dl class="stgkontaktinfo">\n\t\t\t\t<dt><i class="fa fa-phone me-2"></i></dt>\n\t\t\t\t<dd class="mb-3"><a class="fhc-link-color" :href="phone.link">{{phone.number}}</a></dd>\n\n\t\t\t\t<dt><i class="fa fa-home me-2"></i></dt>\n\t\t\t\t<dd class="mb-3">{{ort}}</dd>\n\n\t\t\t\t<dt><i class="fa-regular fa-envelope me-2"></i></dt>\n\t\t\t\t<dd class="mb-3"><a class="fhc-link-color" :href="email_link" v-html="formattedEmail"></a></dd>\n\t\t\t</dl>\n\n\t\t</div>\n\t</div>\n\t',computed:{formattedEmail:function(){if(!this.email)return null;let t=this.email.replace("mailto:","").split("@");return t[0]+"@<wbr>"+t[1]},fullname:function(){return this.titelpre&&this.vorname&&this.nachname?`${this.titelpre} ${this.vorname} ${this.nachname}`:this.vorname&&this.nachname?`${this.vorname} ${this.nachname}`:this.nachname?this.vorname:null},phone:function(){return this.kontakt&&this.telefoneklappe?{link:"tel:".concat(this.kontakt).concat(" "+this.telefoneklappe),number:this.kontakt.concat(" "+this.telefoneklappe)}:this.kontakt?{link:"tel:".concat(this.kontakt),number:this.kontakt}:null},email_link:function(){return this.email?"mailto:".concat(this.email):null},base64Image:function(){return this.foto?"data:image/png;base64,".concat(this.foto):null},ort:function(){return this.planbezeichnung??null},profilViewLink:function(){return this.uid?FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat("/Cis/Profil/View/").concat(this.uid):null}}},Ve={props:{title:String,vertretungsList:Array,showBezeichnung:Boolean},template:'\n\t<div class="card mb-3 border-0">\n\t\t<div class="card-header">\n\t\t\t<span>{{title}}</span>\n\t\t</div>\n\t\t<div class="card-body">\n\t\t\t<p v-for="vertretung in vertretungsList">\n\t\t\t\t<a v-if="profilViewLink(vertretung.uid)" :href="profilViewLink(vertretung.uid)" :aria-label="$p.t(\'profil\',\'profil\')" :title="$p.t(\'profil\',\'profil\')">\n\t\t\t\t\t<i class="me-2 fa fa-arrow-up-right-from-square fhc-primary-color" aria-hidden="true"></i>\n\t\t\t\t</a>\n\t\t\t\t{{vertretungFormatedName(vertretung,false)}}\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\t',methods:{profilViewLink:function(t){return t?FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat("/Cis/Profil/View/").concat(t):null},vertretungFormatedName:function(t){return t?`${t.vorname??""} ${t.nachname??""} ${t.bezeichnung&&this.showBezeichnung?"(".concat(t.bezeichnung.replace("(","").replace(")","")).concat(")"):""}`:null}}},He={studiengangInformation:()=>({method:"get",url:"/api/frontend/v1/Studgang/getStudiengangInfo"}),getStudiengangByKz:t=>({method:"get",url:"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",params:{studiengang_kz:t}})},qe={data:()=>({studiengang:null,semester:null,stg_ltg:null,gf_ltg:null,stv_ltg:null,ass:null,hochschulvertr:null,stdv:null,jahrgangsvertr:null}),props:{displayWidget:{type:Boolean,default:!1}},components:{StudiengangPerson:Ue,StudiengangVertretung:Ve},template:'\n\t\t<div id="fhc-studiengang-informationen">\n\t\t<template v-if="studiengang?.bezeichnung && semester">\n\t\t\t<div class="card card-body mb-3 border-0">\n\t\t\t\t<div class="mb-1">\n\t\t\t\t\t<h2 class="h4 mb-1 pb-0">{{$p.t(\'lehre\',\'studiengang\')}}:</h2>\n\t\t\t\t\t<span class="mb-1">{{studiengang?.bezeichnung}}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class="mb-1">\n\t\t\t\t\t<h2 class="h4 mb-1 pb-0">Moodle:</h2>\n\t\t\t\t\t<a class="fhc-link-color mb-1" target="_blank" :href="moodleLink">{{studiengang?.kurzbzlang}}</a>\n\t\t\t\t</div>\n\t\t\t\t<div :class="{\'mb-1\':studiengang?.zusatzinfo_html}">\n\t\t\t\t\t<h2 class="h4 mb-1 pb-0">{{$p.t(\'lehre\',\'studiensemester\')}}: </h2>\n\t\t\t\t\t<span class="mb-1">{{semester}}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class="zusatzinfo" v-if="studiengang?.zusatzinfo_html" v-html="studiengang?.zusatzinfo_html"></div>\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-for="{title, collection} in collection_array">\n\t\t\t<template v-if="Array.isArray(collection) && collection.length !==0">\n\t\t\t\t<h2 class="h5 text-truncate">{{title}}</h2>\n\t\t\t\t<template v-if="displayWidget">\n\t\t\t\t\t<div class="d-flex flex-wrap flex-row mb-3 gap-2">\n\t\t\t\t\t\t<template v-for="person in collection">\n\t\t\t\t\t\t\t<studiengang-person displayWidget v-bind="person"></studiengang-person>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<template v-for="person in collection">\n\t\t\t\t\t\t<div class="mb-3">\n\t\t\t\t\t\t\t<studiengang-person v-bind="person"></studiengang-person>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t</template>\n\t\t<template v-if="hochschulvertr && Array.isArray(hochschulvertr) && hochschulvertr.length >0">\n\t\t\t<studiengang-vertretung showBezeichnung :title="$p.t(\'studiengangInformation\', \'Hochschulvertretung\')" :vertretungsList="hochschulvertr"></studiengang-vertretung>\n\t\t</template>\n\t\t<template v-if="stdv && Array.isArray(stdv) && stdv.length >0">\n\t\t\t<studiengang-vertretung :title="$p.t(\'studiengangInformation\', \'Studienvertretung\').concat(studiengang.kurzbzlang??\'\')" :vertretungsList="stdv"></studiengang-vertretung>\n\t\t</template>\n\t\t<template v-if="jahrgangsvertr && Array.isArray(jahrgangsvertr) && jahrgangsvertr.length >0">\n\t\t\t<studiengang-vertretung :title="$p.t(\'studiengangInformation\', \'Jahrgangsvertretung\')" :vertretungsList="jahrgangsvertr"></studiengang-vertretung>\n\t\t</template>\n\t\t</div>\n\t\n',computed:{collection_array:function(){let t=[];return Array.isArray(this.stg_ltg)&&1==this.stg_ltg.length&&Array.isArray(this.ass)&&1==this.ass.length?t.push({title:`${this.$p.t("global","studiengangsleitung")}/${this.$p.t("studiengangInformation","assistenz")}`,collection:[...this.stg_ltg,...this.ass]}):(t.push({title:this.$p.t("global","studiengangsleitung"),collection:this.stg_ltg}),t.push({title:this.$p.t("studiengangInformation","assistenz"),collection:this.ass})),Array.isArray(this.gf_ltg)&&1==this.gf_ltg.length&&Array.isArray(this.stv_ltg)&&1==this.stv_ltg.length?t.push({title:this.$p.t("studiengangInformation","geschaeftsfuehrende_stellvertretende_leitung"),collection:[...this.gf_ltg,...this.stv_ltg]}):(t.push({title:this.$p.t("studiengangInformation","geschaeftsfuehrende_leitung"),collection:this.gf_ltg}),t.push({title:this.$p.t("studiengangInformation","stellvertretende_leitung"),collection:this.stv_ltg})),t},moodleLink:function(){if(this.studiengang&&this.studiengang.studiengang_kz)return"https://moodle.technikum-wien.at/course/view.php?idnumber=dl"+this.studiengang.studiengang_kz}},mounted(){this.$api.call(He.studiengangInformation()).then(t=>t.data).then(t=>{Object.assign(this,t)})}},Ge={content:(t,e=null,n=null,i=null)=>({method:"get",url:"/api/frontend/v1/Cms/content",params:{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...i?{sichtbar:i}:{}}}),getNews:(t=1,e=10,n)=>({method:"get",url:"/api/frontend/v1/Cms/getNews",params:{page:t,page_size:e,sprache:n}}),news:t=>({method:"get",url:"/api/frontend/v1/Cms/news",params:{limit:t}}),getNewsRowCount:()=>({method:"get",url:"/api/frontend/v1/Cms/getNewsRowCount"}),getNewsExtra:()=>({method:"get",url:"/api/frontend/v1/Cms/getStudiengangInfoForNews"})},Je={name:"NewsComponent",components:{Pagination:je,StudiengangInformation:qe},data:()=>({content:null,maxPageCount:0,page_size:10,page:1}),watch:{"$p.user_language.value":function(t){this.fetchNews()}},computed:{sprache:function(){return this.$p.user_language.value}},methods:{fetchNews(){return this.$api.call(Ge.getNews(this.page,this.page_size,this.sprache)).then(t=>t.data).then(t=>{this.content=t,document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),o.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),Vue.nextTick(()=>{document.querySelectorAll(".card-header").forEach(t=>{t.classList.add("fhc-primary")}),document.querySelectorAll(".row").forEach(t=>{t.classList.add("w-100"),t.classList.add("align-items-center")}),document.querySelectorAll(".row h2").forEach(t=>{t.classList.add("mb-0")})})})},loadNewPageContent(t){this.$api.call(Ge.getNews(t.page,t.rows)).then(t=>t.data).then(t=>{this.content=t})}},created(){this.fetchNews(),this.$api.call(Ge.getNewsRowCount()).then(t=>t.data).then(t=>{this.maxPageCount=t})},template:'\n \t<h2 class="fhc-primary-color">News</h2>\n\t<hr/>\n\t<pagination v-show="content?true:false" :page_size="page_size" @page="page=$event.page; loadNewPageContent($event)" :maxPageCount="maxPageCount">\n\t</pagination>\n\t<div class="container-fluid mt-4">\n\t\t<div class="row">\n\t\t\t<div class="col" v-html="content">\n\t\t\t</div>\n\t\t\t<div class="col-auto">\n\t\t\t\t<div style="width:15rem">\n\t\t\t\t\t<studiengang-information></studiengang-information>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<pagination v-show="content?true:false" :page_size="page_size" @page="loadNewPageContent" :maxPageCount="maxPageCount">\n\t</pagination>\n '},We={name:"RaumComponent",data:()=>({imgContent:null}),props:{content:{type:String,required:!0},content_id:{type:[Number,String]}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})}},mounted(){let t=document.getElementsByClassName("tablesorter");for(let e of t)this.sanitizeLegacyTables(e),new Tabulator(e,{layout:"fitDataStretch",columnDefaults:{formatter:"html",resizable:!1,minWidth:"100px"}});let e=document.getElementsByTagName("h1");if(e=e.length?e[0]:null,e&&e.innerText){let t=e.innerText,n=new RegExp("\\w*\\s([a-zA-Z][0-9\\.]+)$"),i=t.match(n);if(i){t=i[0],t=t.replace(" ","_");let n=document.createElement("a");n.href=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/getRoomInformation/"+t,n.appendChild(e.cloneNode(!0)),e.replaceWith(n);let a=document.querySelectorAll('.menubox a[href*="stpl_week.php"]');for(let t of a)t.href=n.href}else console.error(`the regular expression did not match the room name: ${t}`);return}const n=(new DOMParser).parseFromString(`<div>${this.content}</div>`,"text/html").querySelector("img");if(n&&n.title){const t={};for(let e of n.attributes)t[e.name]=e.value;this.imgContent=t}console.error("was not able to get the title of the raum_contentmittitel")},template:'\n \x3c!-- div that contains the content --\x3e\n\x3c!-- TODO: test with more img content from cms--\x3e\n <div v-if="imgContent"><img v-bind="imgContent"/></div>\n <div v-html="content" v-else-if="content" ></div>\n <p v-else>Content was not found</p>\n '};const Ze={relative:[{priority:1,regex:new RegExp(/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/content",group_replacement_strategy:"PATH_SEGMENTS"},{priority:2,regex:new RegExp(/^\.\.\/cms\/news\.php/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/news"},{priority:3,regex:new RegExp(/^\.\.\/index\.ci\.php/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router},{priority:10,regex:new RegExp(/^\.\.\//),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root}],absolute:[{}]},Ke=Ze.relative.sort((t,e)=>t.priority-e.priority).map(t=>({regex:t.regex,replacement:t.replacement,group_replacement_strategy:t.group_replacement_strategy}));function Ye(t){for(let{regex:e,replacement:n,group_replacement_strategy:i}of Ke){let a=t.match(e);if(a){let s=t.replace(e,n);switch(i){case"QUERY_PARAMETERS":s=s.concat(`?${a[1]}`);for(let t of a.slice(2))s=s.concat(`&${t}`);break;case"PATH_SEGMENTS":for(let t of a.slice(1))s=s.concat(`/${t}`)}return s}}return t}Ze.absolute.sort((t,e)=>t.priority-e.priority).map(t=>({regex:t.regex,replacement:t.replacement,group_replacement_strategy:t.group_replacement_strategy}));var Qe={name:"GeneralComponent",props:{content:{type:String,required:!0}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})},prepareContent(){Array.from(document.getElementsByClassName("tablesorter")).forEach((t,e)=>{this.sanitizeLegacyTables(t),new Tabulator(t,{index:e,layout:"fitDataFill",columnDefaults:{formatter:"html",resizable:!0,minWidth:"100px"}})}),document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),BsConfirm.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),document.querySelectorAll("[href]").forEach(t=>{let e=Ye(t.getAttribute("href"));t.href=e}),document.querySelectorAll("[style*=background-color]").forEach(t=>{"rgb(255, 255, 255)"==t.style.backgroundColor&&(t.style.backgroundColor="var(--fhc-background)"),t.querySelector("*[style*=background-color]")&&(t.style.backgroundColor="var(--fhc-tertiary)")})}},updated(){this.prepareContent()},mounted(){this.prepareContent()},template:'\n \x3c!-- div that contains the content --\x3e\n <div v-if="content" class="container" style="max-width: 100%;"><div class="row"><div class="col">\n \t<div v-html="content" ></div>\n </div></div></div>\n <p v-else>Content was not found</p>\n '},Xe={name:"ContentComponent",props:{content_id:{type:[Number,String],required:!0},version:{type:[String,Number],default:null},sichtbar:{type:[String,Number],default:null}},components:{raum_contentmittitel:We,news_content:{name:"NewsContentType",props:{content:{type:String,required:!0}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})}},mounted(){Array.from(document.getElementsByClassName("tablesorter")).forEach((t,e)=>{this.sanitizeLegacyTables(t),new Tabulator(t,{index:e,layout:"fitDataFill",columnDefaults:{formatter:"html",resizable:!0,minWidth:"100px"}})}),document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),BsConfirm.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),document.querySelectorAll("[href]").forEach(t=>{let e=Ye(t.getAttribute("href"));t.href=e}),document.querySelectorAll("[style*=background-color]").forEach(t=>{"rgb(255, 255, 255)"==t.style.backgroundColor&&(t.style.backgroundColor="var(--fhc-background)"),t.querySelector("*[style*=background-color]")&&(t.style.backgroundColor="var(--fhc-tertiary)")}),Vue.nextTick(()=>{document.querySelectorAll(".card-header").forEach(t=>{t.classList.add("fhc-primary")}),document.querySelectorAll(".row").forEach(t=>{t.classList.add("w-100"),t.classList.add("align-items-center")}),document.querySelectorAll(".row h2").forEach(t=>{t.classList.add("mb-0")})})},template:'\n\t \x3c!-- div that contains the content --\x3e\n\t <div v-if="content" class="container" style="max-width: 100%;"><div class="row"><div class="col">\n\t\t<div v-html="content" ></div>\n\t </div></div></div>\n\t <p v-else>Content was not found</p>\n\t '},general:Qe,iframe_content:{name:"iframe_content",props:{content:{type:String,required:!0}},computed:{srcUrl(){const t=(new DOMParser).parseFromString(`<div>${this.content}</div>`,"text/html").querySelector("iframe[src]");if(!t)return"";return Ye(t.getAttribute("src")||"")}},template:'\n\t\t<div class="w-100">\n\t\t\t<iframe\n\t\t\t\tv-if="srcUrl"\n\t\t\t\t:src="srcUrl"\n\t\t\t\tstyle="width:100%; height:90vh; border:0; display:block;"\n\t\t\t></iframe>\n\t\t<div v-else class="alert alert-warning">Keine URL gefunden.</div>\n\t\t</div>\n\t'}},data(){return{content_type:null,content:null,content_id_internal:this.content_id}},methods:{fetchContent(){this.$api.call(Ge.content(this.content_id_internal,this.version,this.sprache,this.sichtbar)).then(t=>{this.$nextTick(function(){this.content=t.data.content,this.content_type=t.data.type})})}},watch:{sprache:function(t){this.fetchContent()},"$route.params.content_id"(t){this.content_id_internal=t,this.fetchContent()}},computed:{sprache(){return this.$p.user_language.value},computeContentType:function(){switch(this.content_type){case"raum_contentmittitel":return"raum_contentmittitel";case"news":return"news_content";case"iframe":return"iframe_content";default:return"general"}}},created(){this.fetchContent()},template:'\n \x3c!-- div that contains the content --\x3e\n\t<div id="fhc-cms-content" v-if="content">\n \t<component ref="content" :is="computeContentType" :content="content" :content_id="content_id_internal" />\n\t</div>\n <p v-else>No content is available to display</p>\n '};const tn="Week";var en={name:"RoomInformation",components:{FhcCalendar:Rt},props:{viewData:Object,propsViewData:Object},computed:{currentDay(){return this.propsViewData?.focus_date||luxon.DateTime.now().setZone(this.viewData.timezone).toISODate()},currentMode(){return this.propsViewData?.mode||tn}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),i=e.toISODate();this.$router.push({name:"RoomInformation",params:{mode:n,focus_date:i,ort_kurzbz:this.propsViewData.ort_kurzbz}})},getPromiseFunc(t,e){return[this.$api.call(Et.getRoomInfo(this.propsViewData.ort_kurzbz,t.toISODate(),e.toISODate())),this.$api.call(Et.getOrtReservierungen(this.propsViewData.ort_kurzbz,t.toISODate(),e.toISODate()))]}},template:'\n\t<div class="fhc-roominformation d-flex flex-column h-100">\n\t\t<h2>{{ $p.t(\'rauminfo/rauminfo\') }} {{ propsViewData.ort_kurzbz }}</h2>\n\t\t<hr>\n\t\t<fhc-calendar \n\t\t\tref="calendar"\n\t\t\t:timezone="viewData.timezone"\n\t\t\t:get-promise-func="getPromiseFunc"\n\t\t\t:date="currentDay"\n\t\t\t:mode="currentMode"\n\t\t\t@update:date="handleChangeDate"\n\t\t\t@update:mode="handleChangeMode"\n\t\t\tclass="responsive-calendar"\n\t\t></fhc-calendar>\n\t</div>'},nn={getConfig:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfig"}),getConfigStudent:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfigStudent"}),getStudentProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektarbeiten",params:{uid:t}}),getStudentProjektabgaben:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektabgaben",params:{projektarbeit_id:t.projektarbeit_id,student_uid:t.student_uid}}),postStudentProjektarbeitEndupload:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),postStudentProjektarbeitZwischenabgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getMitarbeiterProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten",params:{showall:t}}),postProjektarbeitAbgabe(t){let e=t.datum;if(t.datum instanceof Date){e=`${t.datum.getFullYear()}-${String(t.datum.getMonth()+1).padStart(2,"0")}-${String(t.datum.getDate()).padStart(2,"0")}`}return{method:"post",url:"/api/frontend/v1/Abgabe/postProjektarbeitAbgabe",params:{paabgabe_id:t.paabgabe_id,paabgabetyp_kurzbz:t.bezeichnung.paabgabetyp_kurzbz,datum:e,note:t.note_pk,upload_allowed:!!t.upload_allowed,beurteilungsnotiz:t.beurteilungsnotiz??"",fixtermin:t.fixtermin,insertvon:t.insertvon,kurzbz:t.kurzbz,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.betreuer_person_id}}},deleteProjektarbeitAbgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe",params:{paabgabe_id:t}}),postSerientermin:(t,e,n,i,a,s,r)=>({method:"post",url:"/api/frontend/v1/Abgabe/postSerientermin",params:{datum:t,paabgabetyp_kurzbz:e,bezeichnung:n,kurzbz:i,upload_allowed:a,projektarbeit_ids:s,fixtermin:r}}),fetchDeadlines:t=>({method:"post",url:"/api/frontend/v1/Abgabe/fetchDeadlines",params:{person_id:t}}),getPaAbgabetypen:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getPaAbgabetypen"}),getNoten:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getNoten"}),getProjektarbeitenForStudiengang:(t,e=0)=>({method:"get",url:"/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang",params:{studiengang_kz:t,benotet:e}}),getStudiengaenge:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudiengaenge"}),postStudentProjektarbeitZusatzdaten:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getSignaturStatusForProjektarbeitAbgaben:(t,e)=>({method:"post",url:"/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben",params:{paabgabe_ids:t,student_uid:e}})};const an={name:"FhcOverlay",props:{active:{type:Boolean,default:!1}},template:'\t\n\t\t<div v-show="active"\n\t\t\tstyle="\n\t\t\t\tposition: fixed;\n\t\t\t\tinset: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground: rgba(255,255,255,0.5);\n\t\t\t\tz-index: 99999999999;\n\t\t\t\tpointer-events: none;\n\t\t\t">\n\t\t\t<i class="fa-solid fa-spinner fa-pulse fa-5x"></i>\n\t\t</div>\n\t'},sn={name:"AbgabeStudentDetail",components:{Upload:xe,BsModal:s,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,Inplace:primevue.inplace,VueDatePicker:a,FhcOverlay:an},inject:["notenOptions","isMobile","isViewMode","moodle_link"],props:{projektarbeit:{type:Object,default:null},viewMode:{type:Boolean,default:!1}},data:()=>({loading:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}),methods:{getNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung?e?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==e?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},async validate(t,e=!1){return t.file.length?!e||!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmEnduploadSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"}):(this.$fhcAlert.alertWarning(this.$capitalize(this.$p.t("global/warningChooseFile"))),!1)},async triggerEndupload(){if(!await this.validate(this.enduploadTermin,!0))return!1;const t=new FormData;t.append("paabgabetyp_kurzbz",this.enduploadTermin.paabgabetyp_kurzbz),t.append("projektarbeit_id",this.enduploadTermin.projektarbeit_id),t.append("paabgabe_id",this.enduploadTermin.paabgabe_id),t.append("student_uid",this.projektarbeit.student_uid),t.append("bperson_id",this.projektarbeit.bperson_id),t.append("sprache",this.form.sprache.sprache),t.append("abstract",this.form.abstract),t.append("abstract_en",this.form.abstract_en),t.append("schlagwoerter",this.form.schlagwoerter),t.append("schlagwoerter_en",this.form.schlagwoerter_en),t.append("seitenanzahl",this.form.seitenanzahl);for(let e=0;e<this.enduploadTermin.file.length;e++)t.append("file",this.enduploadTermin.file[e]);this.loading=!0,this.$api.call(nn.postStudentProjektarbeitEndupload(t)).then(t=>{this.handleUploadRes(t,this.enduploadTermin)}).finally(()=>{this.loading=!1}),this.$refs.modalContainerEnduploadZusatzdaten.hide()},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),i=n(e.getMonth()+1);return`${n(e.getDate())}.${i}.${e.getFullYear()}`},async upload(t){if(!await this.validate(t))return!1;if("end"===t.bezeichnung?.paabgabetyp_kurzbz)this.enduploadTermin=t,this.$refs.modalContainerEnduploadZusatzdaten.show();else{const e=new FormData;e.append("paabgabetyp_kurzbz",t.paabgabetyp_kurzbz),e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("paabgabe_id",t.paabgabe_id),e.append("student_uid",this.projektarbeit.student_uid),e.append("bperson_id",this.projektarbeit.bperson_id);for(let n=0;n<t.file.length;n++)e.append("file",t.file[n]);this.loading=!0,this.$api.call(nn.postStudentProjektarbeitZwischenabgabe(e)).then(e=>{this.handleUploadRes(e,t)}).finally(()=>{this.loading=!1})}},handleUploadRes(t,e){"success"==t.meta.status?(this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t("abgabetool/c4fileUploadSuccessv3"))),e.abgabedatum=(new Date).toISOString().split("T")[0],void 0!==t?.data?.signatur&&(e.signatur=t.data.signatur)):this.$fhcAlert.alertError(this.$capitalize(this.$p.t("abgabetool/c4fileUploadErrorv3"))),t.meta.signaturInfo&&this.$fhcAlert.alertInfo(t.meta.signaturInfo)},getOptionLabel:t=>t.sprache,getTerminNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:""}},watch:{projektarbeit(t){this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},computed:{getMoodleLink(){return this.moodle_link+this.projektarbeit.studiengang_kz},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$capitalize(this.$p.t("abgabetool/c4eidesstattlicheErklaerung"))},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedToSendEndupload(){return this.eidAkzeptiert&&this.allowedToSaveZusatzdaten},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.paabgabetyp_kurzbz&&"qualgate2"!=e.paabgabetyp_kurzbz||(t=!0)}),t},getTooltipVerspaetet(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerspaetet")),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerpasst")),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbzugeben")),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipStandardv2")),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgegeben")),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipFixtermin")),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToUpload(){return this.isViewMode?{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedInViewMode")),class:"custom-tooltip"}:{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedRegular")),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich")),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}}},created(){},mounted(){},template:'\n\t\t<FhcOverlay :active="loading"></FhcOverlay>\n\n\t\t<div v-if="projektarbeit">\n\t\t\n\t\t\t<h5>{{$capitalize( $p.t(\'abgabetool/c4abgabeStudentenbereich\') )}}</h5>\n\t\t\t<div class="row">\n\t\t\t\t<div class="col-8">\n\t\t\t\t\t<p> {{$capitalize( $p.t(\'person/student\') ) }}: {{projektarbeit?.student}}</p>\n\t\t\t\t\t<p> {{$capitalize( $p.t(\'abgabetool/c4titel\') ) }}: {{projektarbeit?.titel}}</p>\n\t\t\t\t\t<p> {{$capitalize( $p.t(\'abgabetool/c4betreuerv2\') ) }}: {{projektarbeit ? $p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz) + \' \' + projektarbeit.betreuer : \'\'}}</p>\n\t\t\t\t</div>\n\t\t\t\t<div class="col-4">\n\t\t\t\t\t<p>{{ $p.t(\'abgabetool/c4checkoutStgMoodleInfos\') }} \n\t\t\t\t\t\t<a :href="getMoodleLink" target="_blank">Moodle</a>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t\t<Accordion :multiple="true">\n\t\t\t\t<template v-for="termin in this.projektarbeit?.abgabetermine" :key="termin.paabgabe_id">\n\t\t\t\t\t<AccordionTab :headerClass="termin.dateStyle + \'-header\'">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class="d-flex flex-nowrap align-items-center w-100">\n\t\t\t\t\t\t\t\t<div class="flex-shrink-0 d-flex align-items-center justify-content-center" style="width: 36px; height: 36px; margin-left: -68px;">\n\t\t\t\t\t\t\t\t\t<i v-if="termin.dateStyle == \'verspaetet\'" v-tooltip.right="getTooltipVerspaetet" class="fa-solid fa-triangle-exclamation"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'verpasst\'" v-tooltip.right="getTooltipVerpasst" class="fa-solid fa-calendar-xmark"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'abzugeben\'" v-tooltip.right="getTooltipAbzugeben" class="fa-solid fa-hourglass-half"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'standard\'" v-tooltip.right="getTooltipStandard" class="fa-solid fa-clock"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'abgegeben\'" v-tooltip.right="getTooltipAbgegeben" class="fa-solid fa-paperclip"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'beurteilungerforderlich\'" v-tooltip.right="getTooltipBeurteilungerforderlich" class="fa-solid fa-list-check"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'bestanden\'" v-tooltip.right="getTooltipBestanden" class="fa-solid fa-check"></i>\n\t\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'nichtbestanden\'" v-tooltip.right="getTooltipNichtBestanden" class="fa-solid fa-circle-exclamation"></i>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="text-start px-2" style="min-width: 150px; max-width: 300px; margin-left: 40px">\n\t\t\t\t\t\t\t\t\t<span>{{ termin ? $p.t(\'abgabetool/c4paatyp\' + termin.paabgabetyp_kurzbz) : \'\' }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="text-start px-2" style="min-width: 100px;">\n\t\t\t\t\t\t\t\t\t<span>{{ formatDate(termin.datum) }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="px-1">\n\t\t\t\t\t\t\t\t\t<i v-if="termin?.fixtermin" v-tooltip.right="getTooltipFixtermin" class="fa-solid fa-lock"></i>\n\t\t\t\t\t\t\t\t\t<i v-if="termin?.abgabedatum && isMobile" v-tooltip.right="getTooltipAbgabeDetected" class="fa-solid fa-file"></i>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if="termin?.abgabedatum && !isMobile" class="px-1">\n\t\t\t\t\t\t\t\t\t<i v-tooltip.right="getTooltipAbgabeDetected" class="fa-solid fa-file"></i>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="flex-grow-1 text-end pe-2">\n\t\t\t\t\t\t\t\t\t<span class="fw-bold">{{getNoteBezeichnung(termin)}}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div v-if="isMobile" class="row mt-2 align-items-center">\t\t\t\t\t\t\n\t\t\t\t\t\t\t<Inplace\n\t\t\t\t\t\t\t\tclosable\n\t\t\t\t\t\t\t\t:closeButtonProps="{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tposition: \'relative\',\n\t\t\t\t\t\t\t\t\t\tbottom: \'100px\',\n\t\t\t\t\t\t\t\t\t\tleft: \'80%\',\n\t\t\t\t\t\t\t\t\t\tzIndex: 1\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #display>{{ $capitalize($p.t(\'abgabetool/c4tapForTooltipInfo\'))}}</template>\n\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\t<div class="col-auto">\n\t\t\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{ $capitalize($p.t(\'abgabetool/c4abgabeZeitstatus\')) }}</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-12 col-md-9">{{$p.t(\'abgabetool/c4tooltip\' + $capitalize(termin?.dateStyle) )}}</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{ $capitalize($p.t(\'abgabetool/c4fixterminv4\')) }}</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-12 col-md-9">{{!termin?.fixtermin}}</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{ $capitalize($p.t(\'abgabetool/c4fileUploaded\')) }}</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-12 col-md-9">{{termin?.abgabedatum !== null}}</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</Inplace>\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 align-content-center">\n\t\t\t\t\t\t\t\t<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t(\'abgabetool/c4zieldatumv2\') )}}</div>\n\t\t\t\t\t\t\t\t<div class="row fw-light" style="margin-left: 2px">{{$capitalize( $p.t(\'abgabetool/c4abgabeuntil2359\') )}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t\t<VueDatePicker\n\t\t\t\t\t\t\t\t\tv-model="termin.datum"\n\t\t\t\t\t\t\t\t\t:clearable="false"\n\t\t\t\t\t\t\t\t\t:disabled="true"\n\t\t\t\t\t\t\t\t\t:enable-time-picker="false"\n\t\t\t\t\t\t\t\t\tlocale="de"\n\t\t\t\t\t\t\t\t\tformat="dd.MM.yyyy"\n\t\t\t\t\t\t\t\t\t:text-input="true"\n\t\t\t\t\t\t\t\t\tauto-apply>\n\t\t\t\t\t\t\t\t</VueDatePicker>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabetyp\') )}}</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t\t{{ termin ? $p.t(\'abgabetool/c4paatyp\' + termin.paabgabetyp_kurzbz) : \'\' }}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class="row mt-2" v-if="termin.note">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4note\') )}}</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t\t<div class="col-auto d-flex justify-content-start align-items-start">\n\t\t\t\t\t\t\t\t\t{{ getTerminNoteBezeichnung(termin) }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class="row mt-2" v-if="termin.paabgabetyp_kurzbz === \'qualgate1\' || termin.paabgabetyp_kurzbz === \'qualgate2\'">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4notizQualGatev2\') )}}</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="termin.beurteilungsnotiz" rows="1" class="w-100" disabled></Textarea>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div v-if="termin.kurzbz && termin.kurzbz.length > 0" class="row mt-2">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabekurzbzv2\') )}}</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" rows="1" class="w-100" :disabled="true"></Textarea>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class="row mt-2" v-if="termin.upload_allowed">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabedatum\') )}}</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<template v-if="termin?.abgabedatum">\n\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t<div style="width:100px; align-content: center;">\n\t\t\t\t\t\t\t\t\t\t<h6>{{ termin.abgabedatum?.split("-").reverse().join(".") }}</h6>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class="col-auto">\n\t\t\t\t\t\t\t\t\t\t<button v-if="termin?.abgabedatum" @click="downloadAbgabe(termin)" class="btn btn-primary">\n\t\t\t\t\t\t\t\t\t\t\t<a> {{$capitalize($p.t(\'abgabetool/c4downloadAbgabe\') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\t\n\t\t\t\t\t\t\t\t\t<template v-if="termin.paabgabetyp_kurzbz == \'end\'">\t\n\t\t\t\t\t\t\t\t\t\t<div v-if="termin?.signatur !== undefined && termin?.signatur !== null" class="col-auto">\n\t\t\t\t\t\t\t\t\t\t\t<Message v-if="termin?.signatur == true" severity="success" :closable="false" :pt="getMessagePtStyle"> {{ $p.t(\'abgabetool/c4signaturGefunden\') }} </Message>\n\t\t\t\t\t\t\t\t\t\t\t<Message v-else-if="termin?.signatur == false" severity="error" :closable="false" :pt="getMessagePtStyle"> {{ $p.t(\'abgabetool/c4keineSignatur\') }} </Message>\n\t\t\t\t\t\t\t\t\t\t\t<Message v-else-if="termin?.signatur == \'error\'" severity="warn" :closable="false" :pt="getMessagePtStyle"> {{ $p.t(\'abgabetool/c4signaturServerError\') }} </Message>\n\t\t\t\t\t\t\t\t\t\t</div>\n\x3c!--\t\t\t\t\t\t\t\t\t\t<div v-else class="col-auto">--\x3e\n\x3c!--\t\t\t\t\t\t\t\t\t\t\t<Message severity="info" :closable="false" :pt="getMessagePtStyle"> {{ $p.t(\'abgabetool/c4noFileFound\') }} </Message>--\x3e\n\x3c!--\t\t\t\t\t\t\t\t\t\t</div>--\x3e\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</div>\t\t\t\t\t\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ $capitalize( $p.t(\'abgabetool/c4nochNichtsAbgegeben\') )}}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class="row mt-2" v-if="termin.upload_allowed">\n\t\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4fileupload\') )}}</div>\n\t\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t\t<div class="row" v-if="termin?.allowedToUpload">\n\t\t\t\t\t\t\t\t\t<div class="col-12 col-sm-6 mb-2">\n\t\t\t\t\t\t\t\t\t\t<Upload \n\t\t\t\t\t\t\t\t\t\t\taccept=".pdf" \n\t\t\t\t\t\t\t\t\t\t\tv-model="termin.file"\n\t\t\t\t\t\t\t\t\t\t></Upload>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class="col-12 col-sm-6">\n\t\t\t\t\t\t\t\t\t\t<button \n\t\t\t\t\t\t\t\t\t\t\tclass="btn btn-primary border-0 w-100" \n\t\t\t\t\t\t\t\t\t\t\t@click="upload(termin)" \n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4upload\') )}}\n\t\t\t\t\t\t\t\t\t\t\t<i class="fa-solid fa-upload"></i>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="row" v-else-if="!termin?.allowedToUpload || isViewMode" v-tooltip.right="getTooltipNotAllowedToUpload">\n\t\t\t\t\t\t\t\t\t<div class="col-12 col-sm-6 mb-2">\n\t\t\t\t\t\t\t\t\t\t<Upload \n\t\t\t\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t\t\t\t\taccept=".pdf" \n\t\t\t\t\t\t\t\t\t\t\tv-model="termin.file"\n\t\t\t\t\t\t\t\t\t\t></Upload>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class="col-12 col-sm-6">\n\t\t\t\t\t\t\t\t\t\t<button \n\t\t\t\t\t\t\t\t\t\t\tclass="btn btn-primary border-0 w-100" \n\t\t\t\t\t\t\t\t\t\t\t@click="upload(termin)" \n\t\t\t\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4upload\') )}}\n\t\t\t\t\t\t\t\t\t\t\t<i class="fa-solid fa-upload"></i>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AccordionTab>\n\t\t\t\t</template>\n\t\t\t</Accordion>\n\t\t\t\n\t\t\t<div v-if="projektarbeit?.abgabetermine.length == 0" style="display:flex; justify-content: center; align-content: center;">\n\t\t\t\t<h5>{{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}</h5>\n\t\t\t</div>\n\t\t\t\n\t\t </div>\n\t \t\n\t \t<bs-modal \n\t \t\tref="modalContainerEnduploadZusatzdaten"\n\t \t\tclass="bootstrap-prompt"\n\t \t\tdialogClass="bordered-modal modal-lg">\n\t\t\t<template v-slot:title>\n\t\t\t\t<div>\n\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4enduploadZusatzdaten\') )}}\n\t\t\t\t</div>\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t\n\t\t\t\t\t<p class="ml-4 mr-4">Student UID: {{ projektarbeit?.student_uid}}</p>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t\n\t\t\t\t\t<p class="ml-4 mr-4">{{$capitalize( $p.t(\'abgabetool/c4titel\') )}}: {{ projektarbeit?.titel }}</p>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4Sprache\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Dropdown \n\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\tv-model="form.sprache"\n\t\t\t\t\t\t\t:options="allActiveLanguages"\n\t\t\t\t\t\t\t:optionLabel="getOptionLabel">\n\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\x3c!--\t\t\t\t lektor fills these out--\x3e\n\x3c!--\t\t\t\t<div class="row mb-3 align-items-start">--\x3e\n\x3c!--\t\t\t\t\t<div class="row">Kontrollierte Schlagwörter</div>--\x3e\n\x3c!--\t\t\t\t\t<div class="row">--\x3e\n\x3c!--\t\t\t\t\t\t<Textarea v-model="form.kontrollschlagwoerter"></Textarea>--\x3e\n\x3c!--\t\t\t\t\t</div>--\x3e\n\x3c!--\t\t\t\t\t--\x3e\n\x3c!--\t\t\t\t--\x3e\n\x3c!--\t\t\t\t</div>--\x3e\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4schlagwoerterGer\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.schlagwoerter" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4schlagwoerterEng\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.schlagwoerter_en" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4abstractGer\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.abstract" rows="10" maxlength="5000" class="w-100"></Textarea>\n\t\t\t\t\t\t<p>{{ form.abstract?.length ? form.abstract.length : 0 }} / 5000 characters</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4abstractEng\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.abstract_en" rows="10" maxlength="5000" class="w-100"></Textarea>\n\t\t\t\t\t\t<p>{{ form.abstract_en?.length ? form.abstract_en.length : 0 }} / 5000 characters</p>\n\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4seitenanzahl\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<InputNumber \n\t\t\t\t\t\t\tv-model="form.seitenanzahl"\n\t\t\t\t\t\t\tinputId="seitenanzahlInput" :min="1" :max="100000">\n\t\t\t\t\t\t</InputNumber>\n\t\t\t\t\t</div>\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div v-if="projektarbeit">\n\t\t\t\t\t<div v-html="getEid"></div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<div class="col-9"></div>\n\t\t\t\t\t\t<div class="col-2"><p>{{$capitalize( $p.t(\'abgabetool/c4gelesenUndAkzeptiert\') )}}</p></div>\n\t\t\t\t\t\t<div class="col-1">\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<Checkbox \n\t\t\t\t\t\t\t\tv-model="eidAkzeptiert" \n\t\t\t\t\t\t\t\t:binary="true" \n\t\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</template>\n\t\t\t<template v-slot:footer>\n\t\t\t\t<div v-show="!allowedToSaveZusatzdaten">{{ $p.t(\'abgabetool/c4zusatzdatenausfuellen\') }}</div>\n\t\t\t\t<button class="btn btn-primary" :disabled="!getAllowedToSendEndupload" @click="triggerEndupload">{{$capitalize( $p.t(\'ui/hochladen\') )}}</button>\n\t\t\t</template>\n\t\t</bs-modal>\n\t \t\n '},rn="Europe/Vienna",on=luxon.DateTime.now().setZone(rn);function ln(t,e){const n=luxon.DateTime.fromISO(t.datum,{zone:rn}).endOf("day"),i=t.abgabedatum?luxon.DateTime.fromISO(t.abgabedatum,{zone:rn}):null;t.diffindays=n.diff(on,"days").days;const a=i&&i>n;if(t.note){const n="object"==typeof t.note?t.note:e.find(e=>e.note==t.note);if(!0===n?.positiv)return"bestanden";if(!1===n?.positiv)return"nichtbestanden"}return t.bezeichnung?.benotbar&&n<=on?"beurteilungerforderlich":t.upload_allowed?t.abgabedatum?a?"verspaetet":"abgegeben":n<on?"verpasst":t.diffindays<=12?"abzugeben":"standard":n<on?"verpasst":"standard"}const dn={name:"AbgabetoolStudent",components:{Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,BsModal:s,AbgabeDetail:sn,FhcOverlay:an},provide(){return{notenOptions:Vue.computed(()=>this.notenOptions),isViewMode:Vue.computed(()=>this.isViewMode),moodle_link:Vue.computed(()=>this.moodle_link)}},props:{student_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({uid:""}),validator:t=>t&&t.uid}},data:()=>({activeTabIndex:[0],abgabeTypeOptions:null,phrasenPromise:null,phrasenResolved:!1,loading:!1,notenOptions:null,detail:null,projektarbeiten:null,selectedProjektarbeit:null,moodle_link:null}),methods:{checkQualityGatesStrict(t){let e=!1,n=!1;return t.forEach(t=>{const i=this.notenOptions?.find(e=>e.note==t.note);i&&i.positiv&&("qualgate1"==t.paabgabetyp_kurzbz?e=!0:"qualgate2"==t.paabgabetyp_kurzbz&&(n=!0))}),e&&n},checkQualityGatesOptional(t){const e=t.find(t=>"qualgate1"==t.paabgabetyp_kurzbz),n=t.find(t=>"qualgate2"==t.paabgabetyp_kurzbz);let i=!0;e&&(i=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate1"==t.paabgabetyp_kurzbz&&(i=!0)}));let a=!0;return n&&(a=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate2"==t.paabgabetyp_kurzbz&&(a=!0)})),i&&a},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){this.loading=!0,this.loadAbgaben(t).then(e=>{const n=this.projektarbeiten?.find(e=>e.projektarbeit_id==t.projektarbeit_id);n.abgabetermine=e.data[0].retval;const i=null!==n.note;n.abgabetermine.forEach(t=>{if(t.file=[],t.allowedToUpload=!1,"end"==t.paabgabetyp_kurzbz){const e=!t.fixtermin||!this.isPastDate(t.datum);t.allowedToUpload=e&&this.checkQualityGatesOptional(n.abgabetermine)}else t.fixtermin?t.allowedToUpload=!this.isPastDate(t.datum):t.allowedToUpload=t.upload_allowed;i&&(t.allowedToUpload=!1),t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz),t.dateStyle=ln(t,this.notenOptions)}),n.betreuer=this.buildBetreuer(n),n.student_uid=this.student_uid,this.selectedProjektarbeit=n,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%;"><p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+t.getValue()+"</p></div>",detailFormatter(t){const e=t.getValue();return"detailTermine"===e.mode?'<div style="display: flex; justify-content: center; align-items: center; height: 100%;"><a><i class="fa fa-folder-open" style="color:#00649C"></i></a></div>':"beurteilungDownload"===e.mode?'<div style="display: flex; justify-content: center; align-items: center; height: 100%;"><a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>':void 0},mailFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%;"><a href='+t.getValue()+'><i class="fa fa-envelope" style="color:#00649C"></i></a></div>',beurteilungFormatter:t=>t.getValue()?'<div style="display: flex; justify-content: center; align-items: center; height: 100%;"><a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>':"-",buildMailToLink:t=>"mailto:"+t.email,buildBetreuer:t=>(t.btitelpre?t.btitelpre+" ":"")+t.bvorname+" "+t.bnachname+(t.btitelpost?" "+t.btitelpost:""),async setupData(t){const e=t[0]??null;e&&(this.projektarbeiten=e.map(t=>({...t,details:{student_uid:this.student_uid,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.bperson_id,betreuerart_kurzbz:t.betreuerart_kurzbz,mode:"detailTermine"},beurteilung1:t.downloadLink1??null,beurteilung2:t.downloadLink2??null,sem:t.studiensemester_kurzbz,stg:t.kurzbzlang,mail:this.buildMailToLink(t),betreuer:this.buildBetreuer(t),typ:t.projekttypbezeichnung,titel:t.titel})))},loadProjektarbeiten(){this.$api.call(nn.getStudentProjektarbeiten(this.student_uid)).then(t=>{t?.data&&this.setupData(t.data)})},loadAbgaben(t){return new Promise(e=>{this.$api.call(nn.getStudentProjektabgaben(t)).then(t=>{e(t)})})},async setupMounted(){this.loadProjektarbeiten()},getAccTabHeaderForProjektarbeit(t){let e="";return e+=t.titel??this.$p.t("abgabetool/keinTitel"),e},getMailLink:t=>t.email?"mailto:"+t.email:"",getNoteBezeichnung(t){if(t.note&&this.notenOptions){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung}return""},handleDownloadBeurteilung1(t){window.open(t.beurteilung1)},handleDownloadBeurteilung2(t){window.open(t.beurteilung2)}},watch:{},computed:{isViewMode(){return this.student_uid!==this.viewData.uid},student_uid(){return this.student_uid_prop||this.viewData?.uid||null}},async created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.loading=!0,await this.$api.call(nn.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)))}).finally(()=>{this.loading=!1}),this.$api.call(nn.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1}),this.$api.call(nn.getConfigStudent()).then(t=>{this.moodle_link=t.data?.moodle_link}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n<template v-if="phrasenResolved">\n\t<FhcOverlay :active="loading"></FhcOverlay>\n\t\n\t<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"\n\t\tdialogClass="modal-xl" :allowFullscreenExpand="true">\n\t\t<template v-slot:title>\n\t\t\t<div>\n\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4abgabeStudentDetailTitle\') )}}\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-slot:default>\n\t\t\t<AbgabeDetail :projektarbeit="selectedProjektarbeit"></AbgabeDetail>\n\t\t</template>\n\t</bs-modal>\n\t\n\t<h2>{{$capitalize( $p.t(\'abgabetool/abgabetoolTitle\') )}}</h2>\n\t<hr>\n\t\n\t<div v-if="projektarbeiten === null">\n\t\t{{$capitalize( $p.t(\'abgabetool/c4abgabeStudentNoProjectsFound\') )}}\n\t</div>\n\t\n\t<Accordion :multiple="true" :activeIndex="activeTabIndex">\n\t\t<template v-for="projektarbeit in projektarbeiten" :key="projektarbeit.projektarbeit_id">\n\t\t\t<AccordionTab>\n\t\t\t\t\n\t\t\t\t<template #header>\n\t\t\t\t\t<div class="d-flex row w-100">\n\t\t\t\t\t\t<div class="text-start" :class="projektarbeit.note != null ? \'col-6\' : \'col-12\'">\n\t\t\t\t\t\t\t<span>{{getAccTabHeaderForProjektarbeit(projektarbeit)}}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-6 text-end">\n\t\t\t\t\t\t\t<span>{{getNoteBezeichnung(projektarbeit)}}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<div class="row">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4details\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<button @click="setDetailComponent(projektarbeit.details)" class="btn btn-primary">\n\t\t\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4projektdetailsOeffnen\') )}} <a><i class="fa fa-folder-open"></i></a>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4beurteilung\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<button v-if="projektarbeit.beurteilung1" @click="handleDownloadBeurteilung1(projektarbeit)" class="btn btn-primary">\n\t\t\t\t\t\t\t<a> {{$capitalize( $p.t(\'abgabetool/c4downloadBeurteilungErstbetreuerv2\') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<a v-else>{{$capitalize( $p.t(\'abgabetool/c4nobeurteilungVorhanden\') )}}</a>\n\t\t\t\t\t\t<button v-if="projektarbeit.beurteilung2" @click="handleDownloadBeurteilung2(projektarbeit)" class="btn btn-primary" style="margin-left: 4px;">\n\t\t\t\t\t\t\t<a> {{$capitalize( $p.t(\'abgabetool/c4downloadBeurteilungZweitbetreuerv2\') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4sem\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t{{ projektarbeit.sem }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4stg\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<div class="col-1 d-flex justify-content-start align-items-start">\n\t\t\t\t\t\t\t{{ projektarbeit.stg }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{ projektarbeit?.betreuerart_kurzbz ? $capitalize( $p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz) ) : $capitalize( $p.t(\'abgabetool/c4betreuerv2\') ) }}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t{{ projektarbeit.betreuerart_kurzbz ? projektarbeit.betreuer : \'\' }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4betreuerEmailKontaktv2\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<a :href="getMailLink(projektarbeit)"><i class="fa fa-envelope" style="color:#00649C"></i></a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div v-if="projektarbeit.zweitbetreuer_person_id || projektarbeit.zweitbetreuer" class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{ projektarbeit.zweitbetreuer_betreuerart_kurzbz ? $p.t(\'abgabetool/c4betrart\' + projektarbeit.zweitbetreuer_betreuerart_kurzbz) : \'\' }}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t{{ projektarbeit.zweitbetreuer?.first }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4projekttyp\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t{{ projektarbeit.projekttypbezeichnung }}\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t(\'abgabetool/c4titel\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t{{ projektarbeit.titel }}\t\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</AccordionTab>\n\t\t</template>\n\t</Accordion>\n</template>\n '},cn={name:"AbgabeMitarbeiterDetail",components:{BsModal:s,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,SpeedDial:primevue.speeddial,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,VueDatePicker:a},emits:["paUpdated"],inject:["abgabeTypeOptions","abgabetypenBetreuer","allowedNotenOptions","notenOptionsNonFinal","turnitin_link","old_abgabe_beurteilung_link"],props:{projektarbeit:{type:Object,default:null},isFullscreen:{type:Boolean,default:!1},assistenzMode:{type:Boolean,default:!1}},data(){return{showAutomagicModalPhrase:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,speedDialItems:[{label:Vue.computed(()=>this.$p.t("abgabetool/c4newAbgabetermin")),icon:"fa fa-plus",command:this.openCreateNewAbgabeModal,disabled:Vue.computed(()=>!this.getAllowedToCreateNewTermin)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4benoten")),icon:"fa fa-user-check",command:this.openBenotung,disabled:Vue.computed(()=>1==this.assistenzMode)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4plagiatcheck_link")),icon:"fa fa-clipboard-check",command:this.openPlagiatcheck},{label:Vue.computed(()=>this.$p.t("abgabetool/c4student_perspective")),icon:"fa fa-eye",command:this.openStudentPage}],newTermin:null,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}},methods:{getNoteBezeichnung(t){return t.noteBackend?.bezeichnung?t.noteBackend?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==t.bezeichnung?.benotbar||t.noteBackend?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},getPlaceholderTermin(t){return t?.bezeichnung?this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz):this.$p.t("abgabetool/abgabetypPlaceholder")},saveTermin(t){return t.paabgabe_id,t.note_pk=t.note?.note??null,t.betreuer_person_id=this.projektarbeit.betreuer_person_id,t.fixtermin=!t.invertedFixtermin,this.$api.call(nn.postProjektarbeitAbgabe(t)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert"));const n=this.allowedNotenOptions.find(t=>t.note==e.data[0].note),i={allowedToSave:!0,allowedToDelete:!0,...e.data[0]};i.note&&(i.note=n,i.noteBackend=n),i.invertedFixtermin=!i.fixtermin;const a=e.data[1],s=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==i.paabgabetyp_kurzbz);if(i.bezeichnung={bezeichnung:t.bezeichnung?.bezeichnung,paabgabetyp_kurzbz:t.bezeichnung?.paabgabetyp_kurzbz,benotbar:s.benotbar},a){const e=this.allowedNotenOptions.find(t=>t.note==a.note);a.note=e,t.paabgabetyp_kurzbz=i.paabgabetyp_kurzbz,t.noteBackend=n,t.dateStyle=ln(t,this.notenOptions)}else i.dateStyle=ln(i,this.notenOptions),this.projektarbeit.abgabetermine.push(i);this.projektarbeit.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum)),this.projektarbeit.abgabetermine.findIndex(e=>t.paabgabe_id==e.paabgabe_id);const r=!a&&!i.note?.positiv&&null!==i.note,o=a&&!i.note?.positiv&&null!==i.note&&(a.note?.positiv||void 0===a.note);r||o?(this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===i.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""},this.showAutomagicModalPhrase=!0,this.$refs.modalContainerCreateNewAbgabe.show()):this.showAutomagicModalPhrase=!1,this.$emit("paUpdated",this.projektarbeit)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},openZusatzdatenModal(){this.$refs.modalContainerZusatzdaten.show()},async saveZusatzdaten(){if(!await this.validateZusatzdaten())return!1;const t=this.projektarbeit,e=new FormData;e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("sprache",this.form.sprache.sprache),e.append("abstract",this.form.abstract),e.append("abstract_en",this.form.abstract_en),e.append("schlagwoerter",this.form.schlagwoerter),e.append("schlagwoerter_en",this.form.schlagwoerter_en),e.append("seitenanzahl",this.form.seitenanzahl),this.loading=!0,this.$api.call(nn.postStudentProjektarbeitZusatzdaten(e)).then(e=>{if("success"==e.meta.status){if(this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert")),!data?.retval?.[0])return;const e=data.retval[0];t.seitenanzahl=e.seitenanzahl??1,t.kontrollschlagwoerter=e.kontrollschlagwoerter??"",t.schlagwoerter=e.schlagwoerter??"",t.sprache=e.sprache??"",t.schlagwoerter_en=e.schlagwoerter_en??"",t.abstract=e.abstract??"",t.abstract_en=e.abstract_en??""}}).finally(()=>{this.loading=!1}),this.$refs.modalContainerZusatzdaten.hide()},async validateZusatzdaten(){return!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmZusatzdatenSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"})},async handleDeleteTermin(t){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4confirm_delete"),acceptLabel:"Löschen",acceptClass:"p-button-danger",rejectLabel:"Zurück",rejectClass:"p-button-secondary"}))return!1;this.deleteTermin(t)},deleteTermin(t){this.$api.call(nn.deleteProjektarbeitAbgabe(t.paabgabe_id)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/genericDeleted",[this.$p.t("abgabetool/abgabe")]));const e=this.projektarbeit.abgabetermine.findIndex(e=>e.paabgabe_id===t.paabgabe_id);this.projektarbeit.abgabetermine.splice(e,1),this.$emit("paUpdated",this.projektarbeit)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},validate:function(t){return!!t.file.length||(this.$fhcAlert.alertWarning(this.$p.t("global/warningChooseFile")),!1)},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},openBeurteilungLink(t){window.open(t,"_blank")},getOptionLabelSprache:t=>t.sprache,getOptionLabelAbgabetyp(t){return this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz)},getOptionDisabled:t=>!t.aktiv,getNotenOptionLabel:t=>t.bezeichnung,openStudentPage(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Student/"+this.projektarbeit?.student_uid;window.open(t,"_blank")},openPlagiatcheck(){const t=this.turnitin_link;window.open(t,"_blank")},async openBenotung(){if(this.getSemesterBenotbar&&this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkNew){const t=this.projektarbeit?.beurteilungLinkNew;window.open(t,"_blank")}else if(this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkOld){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4aeltereParbeitBenotenv2"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1;const t=this.projektarbeit?.beurteilungLinkOld;window.open(t,"_blank")}else if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4keinEnduploadErfolgt"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1},formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),i=n(e.getMonth()+1);return`${n(e.getDate())}.${i}.${e.getFullYear()}`},openCreateNewAbgabeModal(){if("Zweitbegutachter"!=this.projektarbeit?.betreuerart_kurzbz){if(!this.newTermin){const t=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:t.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:t,abgabedatum:null,insertvon:this.viewData?.uid??""}}this.$refs.modalContainerCreateNewAbgabe.show()}else this.$fhcAlert.alertWarning("Terminanlage disabled")},validateTermin:t=>!0,async handleSaveNewAbgabe(t){if(!this.validateTermin(t))return this.$fhcAlert.alertWarning("invalid termin"),!1;await this.saveTermin(t),this.$refs.modalContainerCreateNewAbgabe.hide(),this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""}},handleChangeAbgabetyp(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""}},computed:{getAllowedToCreateNewTermin(){if(this.assistenzMode)return!0;if("Zweitbegutachter"==this.projektarbeit?.betreuerart_kurzbz)return!1;if(void 0!==this.projektarbeit?.note&&null!==this.projektarbeit.note){return!!this.notenOptionsNonFinal.find(t=>t.note)}return!0},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedAbgabeTypeOptions(){return this.assistenzMode?this.abgabeTypeOptions:this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$p.t("abgabetool/c4eidesstattlicheErklaerung")},getEnduploadErlaubt(){return!this.eidAkzeptiert},getSemesterBenotbar(){return this.projektarbeit?.isCurrent??!1},endUploadVorhanden(){return this.projektarbeit?.abgabetermine.find(t=>"end"===t.paabgabetyp_kurzbz&&null!==t.abgabedatum)},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.bezeichnung?.paabgabetyp_kurzbz&&"qualgate2"!=e?.bezeichnung?.paabgabetyp_kurzbz||(t=!0)}),t},getSpeedDialStyle:()=>"position: static !important;",getSpeedDialWrapperStyle:()=>"position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;",getTooltipVerspaetet(){return{value:this.$p.t("abgabetool/c4tooltipVerspaetet"),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$p.t("abgabetool/c4tooltipVerpasst"),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$p.t("abgabetool/c4tooltipAbzugeben"),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$p.t("abgabetool/c4tooltipStandardv2"),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich"),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$p.t("abgabetool/c4tooltipAbgegeben"),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$p.t("abgabetool/c4tooltipFixtermin"),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToSave(){return{value:this.$p.t("abgabetool/c4notAllowedToEditAbgabeTermin"),class:"custom-tooltip"}},getTooltipNotAllowedToDelete(){return{value:this.$p.t("abgabetool/c4notAllowedToDeleteAbgabeTermin"),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}},getProjektarbeitTitel(){return this.projektarbeit?.titel?this.$capitalize(this.$p.t("abgabetool/c4titel"))+": "+this.projektarbeit.titel:""},getProjektarbeitStudent(){return this.projektarbeit?.student?this.$capitalize(this.$p.t("person/student"))+": "+this.projektarbeit.student:""}},watch:{"newTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.newTermin.kurzbz=t.bezeichnung),this.newTermin.upload_allowed=t.upload_allowed_default},projektarbeit(t){const e=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:t.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:e.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:e,abgabedatum:null,insertvon:this.viewData?.uid??""},t?.abgabetermine?.forEach(t=>t.invertedFixtermin=!t.fixtermin),this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},created(){},mounted(){},template:'\n\t<bs-modal\n\t\tid="innerModalNewAbgabe" \n\t\tref="modalContainerCreateNewAbgabe" \n\t\tclass="bootstrap-prompt" \n\t\tdialogClass="bordered-modal modal-lg" \n\t\t:backdrop="true"\n\t\t@hideBsModal="showAutomagicModalPhrase=false;"\n\t>\n\t\t<template v-slot:title>\n\t\t\t<div>\n\t\t\t\t{{ $p.t(\'abgabetool/c4newAbgabetermin\') }}\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-slot:default>\n\t\t\t<div v-if="showAutomagicModalPhrase" class="text-center"><p>{{$p.t(\'abgabetool/c4abgabeQualGateNegativAddNewAutomagisch\')}}</p></div>\n\t\t\t<div v-if="newTermin">\n\t\t\t\t<div v-if="assistenzMode" class="row">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold align-content-center">{{$p.t(\'abgabetool/c4fixterminv4\')}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<Checkbox \n\t\t\t\t\t\t\tv-model="newTermin.invertedFixtermin"\n\t\t\t\t\t\t\t:binary="true" \n\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold align-content-center">{{ $capitalize( $p.t(\'abgabetool/c4zieldatumv2\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<VueDatePicker\n\t\t\t\t\t\t\tv-model="newTermin.datum"\n\t\t\t\t\t\t\t:clearable="false"\n\t\t\t\t\t\t\t:enable-time-picker="false"\n\t\t\t\t\t\t\tlocale="de"\n\t\t\t\t\t\t\tformat="dd.MM.yyyy"\n\t\t\t\t\t\t\t:text-input="true"\n\t\t\t\t\t\t\tauto-apply>\n\t\t\t\t\t\t</VueDatePicker>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold align-content-center">{{ $capitalize( $p.t(\'abgabetool/c4abgabetyp\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\tv-model="newTermin.bezeichnung"\n\t\t\t\t\t\t\t:options="getAllowedAbgabeTypeOptions"\n\t\t\t\t\t\t\t:optionLabel="getOptionLabelAbgabetyp"\n\t\t\t\t\t\t\t:optionDisabled="getOptionDisabled"\n\t\t\t\t\t\t\tscrollHeight="300px">\n\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold align-content-center">{{ $capitalize( $p.t(\'abgabetool/c4upload_allowed\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tv-model="newTermin.upload_allowed"\n\t\t\t\t\t\t\t:binary="true"\n\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-4 col-md-3 fw-bold align-content-center">{{ $capitalize( $p.t(\'abgabetool/c4abgabekurzbzv2\') )}}</div>\n\t\t\t\t\t<div class="col-8 col-md-9">\n\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="newTermin.kurzbz" rows="1" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\t\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-slot:footer>\n\t\t\t<button type="button" class="btn btn-primary" @click="handleSaveNewAbgabe(newTermin)">{{$capitalize( $p.t(\'abgabetool/c4saveNewAbgabetermin\') )}}</button>\n\t\t</template>\n\t</bs-modal>\n\n\t<div v-if="projektarbeit">\n\t\t<h5>{{$capitalize( $p.t(\'abgabetool/c4abgabeMitarbeiterbereich\') )}}</h5>\n\n\t\t<div class="row">\n\t\t\t<div class="col-6">\n\t\t\t\t<p> {{getProjektarbeitStudent}}</p>\n\t\t\t\t<p> {{getProjektarbeitTitel}}</p>\n\t\t\t\t<template v-if="assistenzMode">\n\t\t\t\t\t<p v-if="projektarbeit?.erstbetreuer_full_name"> {{ projektarbeit.betreuerart ? $capitalize($p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart)) : $capitalize( $p.t(\'abgabetool/c4betreuerv2\') )}}: {{projektarbeit?.erstbetreuer_full_name}}</p>\n\t\t\t\t\t<p v-if="projektarbeit?.zweitbetreuer_full_name"> {{ projektarbeit?.zweitbetreuer_betreuerart_kurzbz ? $capitalize($p.t(\'abgabetool/c4betrart\' + projektarbeit.zweitbetreuer_betreuerart_kurzbz)) : $capitalize( $p.t(\'abgabetool/c4zweitbetreuerv2\') )}}: {{projektarbeit?.zweitbetreuer_full_name}}</p>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<p v-if="projektarbeit?.betreuer"> {{$capitalize($p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz))}}: {{projektarbeit?.betreuer?.first}}</p>\n\t\t\t\t</template>\t\t\n\t\t\t</div>\n\t\t\t<div class="col-6 d-flex justify-content-end align-items-start">\n\t\t\t\t<SpeedDial\n\t\t\t\t\t:model="speedDialItems" \n\t\t\t\t\tdirection="left"\n\t\t\t\t\t:radius="80"\n\t\t\t\t\ttype="linear"\n\t\t\t\t\tbuttonClass="p-button-rounded p-button-lg p-button-primary"\n\t\t\t\t\t:tooltipOptions="{ position: \'down\' }"\n\t\t\t\t>\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<i class="fa-solid fa-bars"></i>\n\t\t\t\t\t</template>\n\t\t\t\t</SpeedDial>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class="row" style="margin-bottom: 12px;">\n\t\t\t<div class="col-auto">\n\x3c!--\t\t\t\tTODO: tooltip why this button is disabled--\x3e\n\t\t\t\t<button type="button" :disabled="!getAllowedToCreateNewTermin" class="btn btn-primary" @click="openCreateNewAbgabeModal">\n\t\t\t\t\t<i class="fa-solid fa-plus"></i>\n\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4newAbgabetermin\') )}}\n\t\t\t\t</button>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t<div class="col-auto">\n\t\t\t\t<button type="button" class="btn btn-primary ml-4" @click="openZusatzdatenModal">\n\t\t\t\t\t<i class="fa-solid fa-pen-to-square"></i>\n\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4ZusatzdatenBearbeiten\') )}}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<Accordion :multiple="true">\n\t\t\t<template v-for="termin in this.projektarbeit?.abgabetermine" :key="termin.paabgabe_id">\n\t\t\t\t<AccordionTab :headerClass="termin.dateStyle + \'-header\'">\n\t\t\t\t\t<template #header>\n\t\t\t\t\t\t<div class="d-flex flex-nowrap align-items-center w-100">\n\t\t\t\n\t\t\t\t\t\t\t<div class="flex-shrink-0 d-flex align-items-center justify-content-center" style="width: 36px; height: 36px; margin-left: -68px;">\t\n\t\t\t\t\t\t\t\t<i v-if="termin.dateStyle == \'verspaetet\'" v-tooltip.right="getTooltipVerspaetet" class="fa-solid fa-triangle-exclamation"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'verpasst\'" v-tooltip.right="getTooltipVerpasst" class="fa-solid fa-calendar-xmark"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'abzugeben\'" v-tooltip.right="getTooltipAbzugeben" class="fa-solid fa-hourglass-half"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'standard\'" v-tooltip.right="getTooltipStandard" class="fa-solid fa-clock"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'abgegeben\'" v-tooltip.right="getTooltipAbgegeben" class="fa-solid fa-paperclip"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'beurteilungerforderlich\'" v-tooltip.right="getTooltipBeurteilungerforderlich" class="fa-solid fa-list-check"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'bestanden\'" v-tooltip.right="getTooltipBestanden" class="fa-solid fa-check"></i>\n\t\t\t\t\t\t\t\t<i v-else-if="termin.dateStyle == \'nichtbestanden\'" v-tooltip.right="getTooltipNichtBestanden" class="fa-solid fa-circle-exclamation"></i>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t<div class="text-start px-2" style="min-width: 150px; max-width: 300px; margin-left: 40px">\n\t\t\t\t\t\t\t\t<span class="text-truncate d-block">{{ termin ? $p.t(\'abgabetool/c4paatyp\' + termin.paabgabetyp_kurzbz) : \'\' }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t<div class="text-start px-2" style="min-width: 100px;">\n\t\t\t\t\t\t\t\t<span>{{ formatDate(termin.datum) }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t<div v-if="termin?.fixtermin" class="px-1">\n\t\t\t\t\t\t\t\t<i v-tooltip.right="getTooltipFixtermin" class="fa-solid fa-lock"></i>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if="termin?.abgabedatum" class="px-1">\n\t\t\t\t\t\t\t\t<i v-tooltip.right="getTooltipAbgabeDetected" class="fa-solid fa-file"></i>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t<div class="flex-grow-1 text-end pe-2">\n\t\t\t\t\t\t\t\t<span class="fw-bold">{{getNoteBezeichnung(termin)}}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div class="row mt-2" v-if="assistenzMode">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4fixterminv4\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<Checkbox \n\t\t\t\t\t\t\t\tv-model="termin.invertedFixtermin"\n\t\t\t\t\t\t\t\t:binary="true" \n\t\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t<div class="col-12 col-md-3 align-content-center">\n\t\t\t\t\t\t\t<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t(\'abgabetool/c4zieldatumv2\') )}}</div>\n\t\t\t\t\t\t\t<div class="row fw-light" style="margin-left: 2px">{{$capitalize( $p.t(\'abgabetool/c4abgabeuntil2359\') )}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<VueDatePicker\n\t\t\t\t\t\t\t\tv-model="termin.datum"\n\t\t\t\t\t\t\t\t:clearable="false"\n\t\t\t\t\t\t\t\t:disabled="!termin.allowedToSave"\n\t\t\t\t\t\t\t\t:enable-time-picker="false"\n\t\t\t\t\t\t\t\tlocale="de"\n\t\t\t\t\t\t\t\tformat="dd.MM.yyyy"\n\t\t\t\t\t\t\t\t:text-input="true"\n\t\t\t\t\t\t\t\tauto-apply>\n\t\t\t\t\t\t\t</VueDatePicker>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabetyp\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\t\t:disabled="!termin.allowedToSave"\n\t\t\t\t\t\t\t\t:placeholder="getPlaceholderTermin(termin)"\n\t\t\t\t\t\t\t\tv-model="termin.bezeichnung"\n\t\t\t\t\t\t\t\t@change="handleChangeAbgabetyp(termin)"\n\t\t\t\t\t\t\t\t:options="getAllowedAbgabeTypeOptions"\n\t\t\t\t\t\t\t\t:optionLabel="getOptionLabelAbgabetyp"\n\t\t\t\t\t\t\t\t:optionDisabled="getOptionDisabled">\n\t\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2" v-if="termin.bezeichnung?.paabgabetyp_kurzbz === \'qualgate1\' || termin.bezeichnung?.paabgabetyp_kurzbz === \'qualgate2\'">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4upload_allowed\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t:disabled="!termin.allowedToSave"\n\t\t\t\t\t\t\t\tv-model="termin.upload_allowed"\n\t\t\t\t\t\t\t\t:binary="true"\n\t\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2" v-if="termin.bezeichnung?.benotbar">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4note\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\t\tv-model="termin.note"\n\t\t\t\t\t\t\t\t:options="allowedNotenOptions"\n\t\t\t\t\t\t\t\t:optionLabel="getNotenOptionLabel">\n\t\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2" v-if="termin.bezeichnung?.benotbar">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4notizQualGatev2\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="termin.beurteilungsnotiz" rows="1" class="w-100" :disabled="!termin.allowedToSave"></Textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabekurzbzv2\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" class="w-100" rows="1" :disabled="!termin.allowedToSave"></Textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabedatum\') )}}</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<template v-if="termin?.abgabedatum">\n\t\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t\t<div style="width:250px">\n\t\t\t\t\t\t\t\t\t\t<VueDatePicker\n\t\t\t\t\t\t\t\t\t\t\tv-model="termin.abgabedatum"\n\t\t\t\t\t\t\t\t\t\t\t:clearable="false"\n\t\t\t\t\t\t\t\t\t\t\t:disabled="true"\n\t\t\t\t\t\t\t\t\t\t\tlocale="de"\n\t\t\t\t\t\t\t\t\t\t\tformat="dd.MM.yyyy"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</VueDatePicker>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class="col-auto">\n\t\t\t\t\t\t\t\t\t\t<button v-if="termin?.abgabedatum" @click="downloadAbgabe(termin)" class="btn btn-primary">\n\t\t\t\t\t\t\t\t\t\t\t<a> {{$capitalize( $p.t(\'abgabetool/c4downloadAbgabe\') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>\n\t\t\t\t\t\t\t\t\t\t</button>\t\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div v-if="termin?.signatur !== undefined && termin?.signatur !== null" class="col-auto">\n\t\t\t\t\t\t\t\t\t\t<Message v-if="termin?.signatur == true" severity="success" :closable="false" :pt="getMessagePtStyle"> {{ $capitalize($p.t(\'abgabetool/c4signaturGefunden\')) }} </Message>\n\t\t\t\t\t\t\t\t\t\t<Message v-else-if="termin?.signatur == false" severity="error" :closable="false" :pt="getMessagePtStyle"> {{ $capitalize($p.t(\'abgabetool/c4keineSignatur\')) }} </Message>\n\t\t\t\t\t\t\t\t\t\t<Message v-else-if="termin?.signatur == \'error\'" severity="warn" :closable="false" :pt="getMessagePtStyle"> {{ $capitalize($p.t(\'abgabetool/c4signaturServerError\')) }} </Message>\n\t\t\t\t\t\t\t\t\t</div>\n\x3c!--\t\t\t\t\t\t\t\t\t<div v-else class="col-auto">--\x3e\n\x3c!--\t\t\t\t\t\t\t\t\t\t<Message severity="info" :closable="false" :pt="getMessagePtStyle"> {{ $p.t(\'abgabetool/c4noFileFound\') }} </Message>--\x3e\n\x3c!--\t\t\t\t\t\t\t\t\t</div>--\x3e\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</div>\t\t\t\t\t\t\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ $capitalize( $p.t(\'abgabetool/c4nochNichtsAbgegeben\') )}}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">\n\t\t\t\t\t\t\t\t {{ $capitalize( $p.t(\'abgabetool/c4actions\') )}}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<div class="col-auto">\n\t\t\t\t\t\t\t\t\t<button v-if="termin.allowedToSave" style="max-height: 40px;" class="btn btn-primary border-0" @click="saveTermin(termin)">\n\t\t\t\t\t\t\t\t\t\t{{ $capitalize( $p.t(\'abgabetool/c4save\') )}}\n\t\t\t\t\t\t\t\t\t\t<i class="fa-solid fa-floppy-disk"></i>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<div v-else v-tooltip.right="getTooltipNotAllowedToSave">\n\t\t\t\t\t\t\t\t\t\t<button disabled style="max-height: 40px;" class="btn btn-primary border-0">\n\t\t\t\t\t\t\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4save\') )}}\n\t\t\t\t\t\t\t\t\t\t\t<i class="fa-solid fa-floppy-disk"></i>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="col-auto">\n\t\t\t\t\t\t\t\t\t<button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-danger border-0" @click="handleDeleteTermin(termin)">\n\t\t\t\t\t\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4delete\') )}}\n\t\t\t\t\t\t\t\t\t\t<i class="fa-solid fa-trash"></i>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<div v-else v-tooltip.right="getTooltipNotAllowedToDelete">\n\t\t\t\t\t\t\t\t\t\t<button disabled style="max-height: 40px;" class="btn btn-danger border-0">\n\t\t\t\t\t\t\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4delete\') )}}\n\t\t\t\t\t\t\t\t\t\t\t<i class="fa-solid fa-trash"></i>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</AccordionTab>\n\t\t\t</template>\n\t\t</Accordion>\n\t\t\n\t\t<div v-if="projektarbeit?.abgabetermine.length == 0" style="display:flex; justify-content: center; align-content: center;">\n\t\t\t<h5>{{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}</h5>\n\t\t</div>\n\t\t\n\t\t<bs-modal \n\t \t\tref="modalContainerZusatzdaten"\n\t \t\tclass="bootstrap-prompt"\n\t \t\tdialogClass="bordered-modal modal-lg">\n\t\t\t<template v-slot:title>\n\t\t\t\t<div>\n\t\t\t\t\t{{$capitalize( $p.t(\'abgabetool/c4enduploadZusatzdaten\') )}}\n\t\t\t\t</div>\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t\n\t\t\t\t\t<p class="ml-4 mr-4">Student UID: {{ projektarbeit?.student_uid}}</p>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t\n\t\t\t\t\t<p class="ml-4 mr-4">{{$capitalize( $p.t(\'abgabetool/c4titel\') )}}: {{ projektarbeit?.titel }}</p>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4Sprache\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Dropdown \n\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\tv-model="form.sprache"\n\t\t\t\t\t\t\t:options="allActiveLanguages"\n\t\t\t\t\t\t\t:optionLabel="getOptionLabelSprache">\n\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\x3c!--\t\t\t\t lektor fills these out--\x3e\n\x3c!--\t\t\t\t<div class="row mb-3 align-items-start">--\x3e\n\x3c!--\t\t\t\t\t<div class="row">Kontrollierte Schlagwörter</div>--\x3e\n\x3c!--\t\t\t\t\t<div class="row">--\x3e\n\x3c!--\t\t\t\t\t\t<Textarea v-model="form.kontrollschlagwoerter"></Textarea>--\x3e\n\x3c!--\t\t\t\t\t</div>--\x3e\n\x3c!--\t\t\t\t\t--\x3e\n\x3c!--\t\t\t\t--\x3e\n\x3c!--\t\t\t\t</div>--\x3e\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4schlagwoerterGer\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.schlagwoerter" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4schlagwoerterEng\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.schlagwoerter_en" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4abstractGer\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.abstract" rows="10" maxlength="5000" class="w-100"></Textarea>\n\t\t\t\t\t\t<p>{{ form.abstract?.length ? form.abstract.length : 0 }} / 5000 characters</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4abstractEng\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<Textarea v-model="form.abstract_en" rows="10" maxlength="5000" class="w-100"></Textarea>\n\t\t\t\t\t\t<p>{{ form.abstract_en?.length ? form.abstract_en.length : 0 }} / 5000 characters</p>\n\t\t\t\t\t</div>\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mb-3 align-items-start">\n\t\t\t\t\t<div class="row">{{$capitalize( $p.t(\'abgabetool/c4seitenanzahl\') )}}</div>\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<InputNumber \n\t\t\t\t\t\t\tv-model="form.seitenanzahl"\n\t\t\t\t\t\t\tinputId="seitenanzahlInput" :min="1" :max="100000">\n\t\t\t\t\t\t</InputNumber>\n\t\t\t\t\t</div>\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</template>\n\t\t\t<template v-slot:footer>\n\t\t\t\t<div v-show="!allowedToSaveZusatzdaten">{{ $p.t(\'abgabetool/c4zusatzdatenausfuellen\') }}</div>\n\t\t\t\t<button class="btn btn-primary" :disabled="!allowedToSaveZusatzdaten" @click="saveZusatzdaten">{{ $capitalize( $p.t(\'abgabetool/c4save\') )}}</button>\n\t\t\t</template>\n\t\t</bs-modal>\n\t\t\n\t</div>\n'};async function un(t,e,n,i,a){let s=t.join(","),r="";const o=n&&"string"==typeof n?n.length+9:0;if(s.length>2024&&!1===await i.confirm({message:a.t("stv","zuvieleEMails")}))return;let l=!0,d=e?.ctrlKey||e?.metaKey;for(;s.length>0;){if(s.length+o>2024){let t=s.lastIndexOf(",",1900);r=s.substring(0,t),s=s.substring(t+1)}else r=s,s="";let t=d?`mailto:?bcc=${r}`:`mailto:${r}`;n&&"string"==typeof n&&(t+=`?subject=${n}`),l?(window.location.href=t,l=!1):!0===await i.confirm({message:a.t("stv","weitereEMail")})&&(window.location.href=t)}}const pn={name:"AbgabetoolMitarbeiter",components:{BsModal:s,CoreFilterCmpt:fe,AbgabeDetail:cn,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,TieredMenu:primevue.tieredmenu,VueDatePicker:a,FhcOverlay:an},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),abgabetypenBetreuer:Vue.computed(()=>this.abgabetypenBetreuer),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link)}},props:{viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,abgabetypenBetreuer:null,detailIsFullscreen:!1,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,BETREUER_SAMMELMAIL_BUTTON_STUDENT:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitDataStretch",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,columns:[{formatter:function(t,e,n){if(!t.getRow().getData().selectable)return;let i=document.createElement("input");i.type="checkbox",i.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),t.getRow().getData().checkbox=i;let a=document.createElement("div");return a.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",a.appendChild(i),a},titleFormatter:function(t,e,n){let i=document.createElement("input");return i.type="checkbox",i.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),i},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.detailFormatter,headerFilter:!1,headerSort:!1,widthGrow:1,tooltip:!1,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,maxWidth:500,widthGrow:8},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4betreuerartv2"))),field:"betreuerart_beschreibung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),field:"prevTermin",headerFilter:Fe,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),field:"nextTermin",headerFilter:Fe,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabeTableBetreuer2026-02-26"},abgabeTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{"details"===e.getColumn().getField()?(this.setDetailComponent(e.getValue()),this.undoSelection(e)):"mail"===e.getColumn().getField()&&this.undoSelection(e)}},{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{handlePaUpdated(t){this.checkAbgabetermineProjektarbeit(t),this.$refs.abgabeTable.tabulator.redraw(!0)},sammelMailStudent(t){const e=[];this.selectedData.forEach(t=>{e.push(`${t.student_uid}@${this.domain}`)});un([...new Set(e)],t.originalEvent,"",this.$fhcAlert,this.$p)},getQGateStatusList(){return[this.$p.t("abgabetool/c4keinTerminVorhanden"),this.$p.t("abgabetool/c4positivBenotet"),this.$p.t("abgabetool/c4negativBenotet"),this.$p.t("abgabetool/c4notYetGraded"),this.$p.t("abgabetool/c4notSubmitted"),this.$p.t("abgabetool/c4notHappenedYet")]},sortFuncTerminCol:(t,e,n,i,a,s,r)=>null==t?1:null==e?-1:"prevTermin"==a._column.field?Math.abs(e.diffMs)-Math.abs(t.diffMs):"nextTermin"==a._column.field?Math.abs(t.diffMs)-Math.abs(e.diffMs):Math.abs(e.diffMs)-Math.abs(t.diffMs),headerFilterTerminCol(t,e){if(!e||!e.luxonDate||!e.luxonDate.isValid)return!1;const n=e.luxonDate,i=t=>{if(!t)return null;let e;return e=t instanceof Date?luxon.DateTime.fromJSDate(t):"string"==typeof t?luxon.DateTime.fromISO(t):luxon.DateTime.fromMillis(Number(t)),e.isValid?e:null},a=i(t[0]),s=i(t[1]);return a&&!s?n.hasSame(a,"day"):!(!a||!s)&&(n>=a.startOf("day")&&n<=s.endOf("day"))},loadState(){return JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID)||"null")},saveState(t){if(!this.stateRestored)return;const e={columns:t.getColumnLayout().map(t=>({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const n=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(n),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let n of e.headerFilters)t.setHeaderFilterValue(n.field,n.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const n=e.sort.map(e=>{const n=t.columnManager.findColumn(e.field);return n?{column:n,dir:e.dir}:null}).filter(Boolean);t.setSort(n)},100)),this.stateRestored=!0}})},checkQualityGateStatus(t){const e=[],n=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&n.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),n.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},checkAbgabetermineProjektarbeit(t){const e=luxon.DateTime.now();t.abgabetermine.forEach(n=>{n.dateStyle=ln(n,this.notenOptions);const i=luxon.DateTime.fromISO(n.datum).endOf("day");n.luxonDate=i,n.diffMs=i.toMillis()-e.toMillis(),n.diffMs<0?(!t.prevTermin||n.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=n):n.diffMs>0&&(!t.nextTermin||n.diffMs<t.nextTermin.diffMs)&&(t.nextTermin=n)}),this.checkQualityGateStatus(t)},abgabterminFormatter(t){const e=t.getValue();if(e){let t="";switch(e.dateStyle){case"verspaetet":t='<i class="fa-solid fa-triangle-exclamation"></i>';break;case"verpasst":t='<i class="fa-solid fa-calendar-xmark"></i>';break;case"abzugeben":t='<i class="fa-solid fa-hourglass-half"></i>';break;case"standard":t='<i class="fa-solid fa-clock"></i>';break;case"abgegeben":t='<i class="fa-solid fa-paperclip"></i>';break;case"beurteilungerforderlich":t='<i class="fa-solid fa-list-check"></i>';break;case"bestanden":t='<i class="fa-solid fa-check"></i>';break;case"nichtbestanden":t='<i class="fa-solid fa-circle-exclamation"></i>'}const n=e.bezeichnung?.bezeichnung??e.bezeichnung;return'<div style="display: flex; height: 100%"><div class='+e.dateStyle+'-header style="width:48px; height: 100%; padding: 0px; display: flex; align-items: center; justify-content: center;">'+t+'</div><div style="margin-left: 4px;"><p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+n+" - "+this.formatDate(e.datum)+"</p></div></div>"}return""},selectHandler(t,e){const n=e.getRow();return n.isSelected()?n.deselect():n.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const n=e.getTable().getRows().filter(t=>t.getData().selectable);return n.every(t=>t.isSelected())?n.forEach(t=>t.deselect()):n.forEach(t=>t.select()),t.stopPropagation(),!1},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),i=n(e.getMonth()+1);return`${n(e.getDate())}.${i}.${e.getFullYear()}`},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},toggleShowAll(t){this.showAll=t,this.loading=!0,this.loadProjektarbeiten(t,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1})},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){this.saving=!0,this.$api.call(nn.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,this.selectedData?.map(t=>t.projektarbeit_id),!1)).then(t=>{if("success"===t.meta.status&&t.data){this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert"));const t=this.$refs.abgabeTable?.tabulator.rowManager.scrollLeft,e=this.$refs.abgabeTable?.tabulator.rowManager.scrollTop;this.loading=!0,this.loadProjektarbeiten(this.showAll,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1,Vue.nextTick(()=>{const n=this.$refs.abgabeTable?.tabulator.element.querySelector(".tabulator-tableholder");n&&(n.scrollLeft=t,n.scrollTop=e)})})}else this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"))}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){this.loading=!0;const e=this.projektarbeiten?.retval?.find(e=>e.projektarbeit_id==t.projektarbeit_id);let n=!1;if(void 0!==e.note&&null!==e.note){this.notenOptionsNonFinal.find(t=>t.note)&&(n=!1),n=!0}e?.abgabetermine?.length&&this.$api.call(nn.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const n=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);n&&void 0!==t.signatur&&(n.signatur=t.signatur)})}),e.abgabetermine.forEach(t=>{const e=this.allowedNotenOptions.find(e=>e.note==t.note);e&&(t.note=e),t.file=[],!t.noteBackend&&e&&(t.noteBackend=e),t.allowedToSave=!n,t.allowedToDelete=t.allowedToSave&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)}),e.student_uid=t.student_uid,e.student=`${e.vorname} ${e.nachname}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show(),this.loading=!1},centeredTextFormatter(t){const e=t.getValue();if(e)return'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><p style="max-width: 100%; width: 100%; overflow-wrap: break-word; word-break: break-word; white-space: normal; margin: 0px; text-align: center">'+e+"</p></div>"},detailFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a><i class="fa fa-folder-open" style="color:#00649C"></i></a></div>',beurteilungFormatter:t=>t.getValue()?'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>':"-",pkzTextFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+t.getValue()+"</a></div>",tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.uid+"@"+this.domain},buildPKZ:t=>`${t.uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=t[0]?.retval?.map(t=>(this.checkAbgabetermineProjektarbeit(t),t.selectable="Zweitbegutachter"!==t.betreuerart_kurzbz,{...t,details:{student_uid:t.uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),typ:t.projekttyp_kurzbz,titel:t.titel})),this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns),this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.$api.call(nn.getMitarbeiterProjektarbeiten(t)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()})},loadAbgaben(t){return new Promise(e=>{this.$api.call(nn.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-n.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadProjektarbeiten(),this.calcMaxTableHeight()}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default}},computed:{emailItems(){const t=[];return this.BETREUER_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),t},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size},getAllowedAbgabeTypeOptions(){return this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))}},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.$api.call(nn.getConfig()).then(t=>{this.turnitin_link=t.data?.turnitin_link,this.old_abgabe_beurteilung_link=t.data?.old_abgabe_beurteilung_link,this.abgabetypenBetreuer=t.data?.abgabetypenBetreuer,this.BETREUER_SAMMELMAIL_BUTTON_STUDENT=t.data?.BETREUER_SAMMELMAIL_BUTTON_STUDENT}).catch(t=>{this.loading=!1}),this.$api.call(nn.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)),this.notenOptionsNonFinal=this.notenOptions.filter(e=>t.data[2].includes(e.note)))}).catch(t=>{this.loading=!1}),this.$api.call(nn.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t<template v-if="phrasenResolved">\n\t\t<FhcOverlay :active="loading || saving"></FhcOverlay>\n\n\t\t<bs-modal ref="modalContainerAddSeries" class="bootstrap-prompt"\n\t\t\tdialogClass="modal-lg">\n\t\t\t<template v-slot:title>\n\t\t\t\t<div>\n\t\t\t\t\t{{ $p.t(\'abgabetool/neueTerminserie\') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 align-content-center">\n\t\t\t\t\t\t<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t(\'abgabetool/c4zieldatumv2\') )}}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<VueDatePicker\n\t\t\t\t\t\t\tstyle="width: 95%;"\n\t\t\t\t\t\t\tv-model="serienTermin.datum"\n\t\t\t\t\t\t\t:clearable="false"\n\t\t\t\t\t\t\t:enable-time-picker="false"\n\t\t\t\t\t\t\tlocale="de"\n\t\t\t\t\t\t\tformat="dd.MM.yyyy"\n\t\t\t\t\t\t\t:text-input="true"\n\t\t\t\t\t\t\tauto-apply>\n\t\t\t\t\t\t</VueDatePicker>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4upload_allowed\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tv-model="serienTermin.upload_allowed"\n\t\t\t\t\t\t\t:binary="true"\n\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabetyp\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9"\n\t\t\t\t\t\tv-if="abgabetypenBetreuer && abgabeTypeOptions"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\tv-model="serienTermin.bezeichnung"\n\t\t\t\t\t\t\t:options="getAllowedAbgabeTypeOptions"\n\t\t\t\t\t\t\t:optionLabel="getOptionLabelAbgabetyp">\n\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabekurzbzv2\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="serienTermin.kurzbz" rows="1" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</template>\n\t\t\t<template v-slot:footer>\n\t\t\t\t<button type="button" class="btn btn-primary" @click="addSeries">{{ $p.t(\'global/speichern\') }}</button>\n\t\t\t</template>\n\t\t</bs-modal>\t\n\t\t\n\t\t<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"\n\t\t\tdialogClass="modal-xl" :allowFullscreenExpand="true"\n\t\t\t@toggle-fullscreen="handleToggleFullscreenDetail">\n\t\t\t<template v-slot:title>\n\t\t\t\t<div>\n\t\t\t\t\t{{$p.t(\'abgabetool/c4abgabeMitarbeiterDetailTitle\')}}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\t<AbgabeDetail \n\t\t\t\t\t:projektarbeit="selectedProjektarbeit" \n\t\t\t\t\t:isFullscreen="detailIsFullscreen"\n\t\t\t\t\t@paUpdated="handlePaUpdated">\n\t\t\t\t</AbgabeDetail>\n\t\t\t\t\n\t\t\t</template>\n\t\t</bs-modal>\t\n\t\t\n\t\t\x3c!-- low max height on this vsplit wrapper to avoid padding scrolls, elements have their inherent height anyways --\x3e\n\t\t<div id="abgabetable" style="max-height:40vw;">\n\t\t\n\t\t\t<h2>{{$p.t(\'abgabetool/abgabetoolTitle\')}}</h2>\n\t\t\t<hr>\n\t\t\t<core-filter-cmpt\n\t\t\t\t:title="\'\'" \n\t\t\t\t@uuidDefined="handleUuidDefined"\n\t\t\t\tref="abgabeTable"\n\t\t\t\t:newBtnShow="true"\n\t\t\t\t:newBtnLabel="$p.t(\'abgabetool/neueTerminserie\')"\n\t\t\t\t:newBtnDisabled="!selectedData.length"\n\t\t\t\t@click:new=openAddSeriesModal\n\t\t\t\t:tabulator-options="abgabeTableOptions" \n\t\t\t\t:tabulator-events="abgabeTableEventHandlers"\n\t\t\t\t@tableBuilt="handleTableBuilt"\n\t\t\t\ttableOnly\n\t\t\t\t:sideMenu="false"\n\t\t\t\t:useSelectionSpan="false"\n\t\t\t>\n\t\t\t\t<template #actions>\n\t\t\t\t\t<button @click="toggleShowAll(!showAll)" role="button" class="btn btn-secondary ml-2">\n\t\t\t\t\t\t<i v-show="!showAll" class="fa fa-eye"></i>\n\t\t\t\t\t\t<i v-show="showAll" class="fa fa-eye-slash"></i>\n\t\t\t\t\t\t{{ $p.t(\'abgabetool/showAll\') }}\n\t\t\t\t\t</button>\n\t\t\t\t\t\n\t\t\t\t\t<button @click="showDeadlines" role="button" class="btn btn-secondary ml-2">\n\t\t\t\t\t\t<i class="fa fa-hourglass-end"></i>\n\t\t\t\t\t\t{{ $p.t(\'abgabetool/showDeadlines\') }}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button \n\t\t\t\t\t\tv-if="emailItems.length"\n\t\t\t\t\t\trole="button"\n\t\t\t\t\t\t@click="evt => $refs.menu.toggle(evt)"\n\t\t\t\t\t\tclass="btn btn-outline-secondary dropdown-toggle"\n\t\t\t\t\t\taria-haspopup="true"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class="fa fa-envelope"></i>\n\t\t\t\t\t</button>\n\t\t\t\t\t<tiered-menu ref="menu" :model="emailItems" popup :autoZIndex="false" />\n\n\t\t\t\t</template>\n\t\t\t</core-filter-cmpt>\n\t\t\n\t\t</div>\n\t</template>\n '};var hn={name:"BootstrapOffcanvas",data:()=>({offcanvas:null}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},keyboard:{type:Boolean,default:!0},scroll:{type:Boolean,default:!1},placement:{type:String,default:"start",validator:t=>["start","end","top","bottom"].includes(t)},noCloseBtn:Boolean,headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"p-4"},footerClass:{type:[String,Array,Object],default:""},dialogClass:[String,Array,Object]},emits:["hideBsOffcanvas","hiddenBsOffcanvas","hidePreventedBsOffcanvas","showBsOffcanvas","shownBsOffcanvas"],methods:{dispose(){return this.offcanvas?.dispose()},hide(){return this.offcanvas?.hide()},show(t){return this.offcanvas?.show(t)},toggle(){return this.offcanvas?.toggle()},popup(t,e,n,i){const a=this,s={};void 0!==t&&(s.default=()=>t),void 0!==n&&(s.title=()=>n),void 0!==i&&(s.footer=()=>i);let r=!1;return"undefined"!=typeof primevue&&(r=!0),new Promise((t,n)=>{const i=Vue.createApp({name:"OffcanvasTmpApp",setup:()=>()=>Vue.h(a,{class:"offcanvas-wrapper",ref:"offcanvas",...e},s),mounted(){this.$refs.offcanvas.show()},beforeUnmount(){this.$refs.offcanvas&&(!1!==this.$refs.offcanvas.result?t(this.$refs.offcanvas.result):n())},unmounted(){o.parentElement.removeChild(o)}}),o=document.createElement("div");r&&i.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return lt}).then(t=>{i.use(t.default),i.mount(o),document.body.appendChild(o)})})}},mounted(){this.$refs.offcanvas&&(this.offcanvas=new bootstrap.Offcanvas(this.$refs.offcanvas,{backdrop:this.backdrop,keyboard:this.keyboard,scroll:this.scroll}))},template:'\n\t\t<div ref="offcanvas"\n\t\t\tclass="bootstrap-offcanvas offcanvas"\n\t\t\t:class="[\'offcanvas-\' + placement, dialogClass]"\n\t\t\ttabindex="-1"\n\t\t\t@[`hide.bs.offcanvas`]="$emit(\'hideBsOffcanvas\')"\n\t\t\t@[`hidden.bs.offcanvas`]="$emit(\'hiddenBsOffcanvas\')"\n\t\t\t@[`hidePrevented.bs.offcanvas`]="$emit(\'hidePreventedBsOffcanvas\')"\n\t\t\t@[`show.bs.offcanvas`]="$emit(\'showBsOffcanvas\')"\n\t\t\t@[`shown.bs.offcanvas`]="$emit(\'shownBsOffcanvas\')"\n\t\t>\n\t\t\t<div class="offcanvas-header" :class="headerClass" v-if="$slots.title">\n\t\t\t\t<h5 class="offcanvas-title">\n\t\t\t\t\t<slot name="title"></slot>\n\t\t\t\t</h5>\n\t\t\t\t<button v-if="!noCloseBtn" type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>\n\t\t\t</div>\n\n\t\t\t<div class="offcanvas-body" :class="bodyClass">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\n\t\t\t<div v-if="$slots.footer" class="offcanvas-footer" :class="footerClass">\n\t\t\t\t<slot name="footer"></slot>\n\t\t\t</div>\n\t\t</div>\n\t'},mn={getAllStudiensemesterAndAktOrNext:()=>({method:"get",url:"/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext"}),getAll:(t=null,e=null)=>({method:"get",url:"api/frontend/v1/organisation/studiensemester/getAll",params:{order:t,start:e}})};const gn={name:"AbgabetoolAssistenz",components:{AbgabeterminStatusLegende:{name:"AbgabeterminStatusLegende",template:'\t\n\t\t<div class="text-center">\n\t\t\t<div class="col" style="width: 80%; margin-left: 12px;">\n\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto verspaetet-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-triangle-exclamation"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipVerspaetet\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto verpasst-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-calendar-xmark"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipVerpasst\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto abzugeben-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-hourglass-half"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipAbzugeben\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto standard-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-clock"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipStandardv2\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto abgegeben-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-paperclip"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipAbgegeben\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto beurteilungerforderlich-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-list-check"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipBeurteilungerforderlich\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto bestanden-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-check"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipBestanden\')) }}</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row" style="margin-bottom: 2px">\n\t\t\t\t\t<div class="col-auto nichtbestanden-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i class="fa-solid fa-circle-exclamation"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-auto" style="display: flex; align-items: center;">\n\t\t\t\t\t\t<h5>{{ $capitalize($p.t(\'abgabetool/c4tooltipNichtBestanden\')) }}</h5>\n\t\t\t\t\t</div>\t\n\t\t\t\t</div>\n\n\t\t\t</div>\n\t\t</div>\t\n\t'},BsModal:s,BsOffcanvas:hn,CoreFilterCmpt:fe,AbgabeDetail:cn,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Inplace:primevue.inplace,Textarea:primevue.textarea,Timeline:primevue.timeline,TieredMenu:primevue.tieredmenu,VueDatePicker:a,FhcOverlay:an},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link),abgabetypenBetreuer:Vue.computed(()=>this.abgabeTypeOptions)}},props:{stg_kz_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,studiensemesterOptions:null,allSem:null,curSem:null,notenOptionFilter:null,inplaceToggle:!1,headerFiltersRestored:!1,filtersRestored:!1,colLayoutRestored:!1,sortRestored:!1,stateRestored:!1,timelineProjekt:null,selectedStudiengangOption:null,studiengaengeOptions:null,detailIsFullscreen:!1,allConfigPromise:null,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT:null,ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenFilterOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",fixtermin:!1,invertedFixtermin:!0,upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitData",placeholder:Vue.computed(()=>this.$capitalize(this.$p.t("global/noDataAvailable"))),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,renderVerticalBuffer:2e3,columns:[{formatter:function(t,e,n){if(!t.getRow().getData().selectable)return;let i=document.createElement("input");i.type="checkbox",i.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),t.getRow().getData().checkbox=i;let a=document.createElement("div");return a.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",a.appendChild(i),a},titleFormatter:function(t,e,n){let i=document.createElement("input");return i.type="checkbox",i.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),i},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",headerFilter:!1,headerSort:!1,formatter:this.formAction,tooltip:!1,minWidth:150,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"student_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"student_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4studstatus"))),field:"studienstatus",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4orgform"))),field:"orgform",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4note"))),field:"note_bez",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerv2"))),field:"erstbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerTitelPre"))),field:"betreuer_titelpre",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerVorname"))),field:"betreuer_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerNachname"))),field:"betreuer_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerTitelPost"))),field:"betreuer_titelpost",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerv2"))),field:"zweitbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerTitelPre"))),field:"zweitbetreuer_titelpre",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerVorname"))),field:"zweitbetreuer_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerNachname"))),field:"zweitbetreuer_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerTitelPost"))),field:"zweitbetreuer_titelpost",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),headerFilter:Fe,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,field:"prevTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),field:"nextTermin",headerFilter:Fe,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabetool_2026_02_26"},abgabeTableEventHandlers:[{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{handlePaUpdated(t){this.checkAbgabetermineProjektarbeit(t),this.$refs.abgabeTable.tabulator.redraw(!0)},getQGateStatusList(){return[this.$p.t("abgabetool/c4keinTerminVorhanden"),this.$p.t("abgabetool/c4positivBenotet"),this.$p.t("abgabetool/c4negativBenotet"),this.$p.t("abgabetool/c4notYetGraded"),this.$p.t("abgabetool/c4notSubmitted"),this.$p.t("abgabetool/c4notHappenedYet")]},sortFuncTerminCol:(t,e,n,i,a,s,r)=>null==t?1:null==e?-1:"prevTermin"==a._column.field?Math.abs(e.diffMs)-Math.abs(t.diffMs):"nextTermin"==a._column.field?Math.abs(t.diffMs)-Math.abs(e.diffMs):Math.abs(e.diffMs)-Math.abs(t.diffMs),headerFilterTerminCol(t,e){if(!e||!e.luxonDate||!e.luxonDate.isValid)return!1;const n=e.luxonDate,i=t=>{if(!t)return null;let e;return e=t instanceof Date?luxon.DateTime.fromJSDate(t):"string"==typeof t?luxon.DateTime.fromISO(t):luxon.DateTime.fromMillis(Number(t)),e.isValid?e:null},a=i(t[0]),s=i(t[1]);return a&&!s?n.hasSame(a,"day"):!(!a||!s)&&(n>=a.startOf("day")&&n<=s.endOf("day"))},sammelMailStudent(t){const e=[];this.selectedData.forEach(t=>{e.push(`${t.student_uid}@${this.domain}`)});const n=[...new Set(e)],i=this.$p.t("abgabetool/c4sammelmailStudentBetreff",[this.selectedStudiengangOption?.bezeichnung]);un(n,t.originalEvent,i,this.$fhcAlert,this.$p)},sammelMailBetreuer(t){const e=[];this.selectedData.forEach(t=>{t.betreuer_mail&&e.push(t.betreuer_mail),t.zweitbetreuer_mail&&e.push(t.zweitbetreuer_mail)});const n=[...new Set(e)],i=this.$p.t("abgabetool/c4sammelmailBetreuerBetreff",[this.selectedStudiengangOption?.bezeichnung]);un(n,t.originalEvent,i,this.$fhcAlert,this.$p)},selectHandler(t,e){const n=e.getRow();return n.isSelected()?n.deselect():n.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const n=e.getTable().getRows().filter(t=>t.getData().selectable);return n.every(t=>t.isSelected())?n.forEach(t=>t.deselect()):n.forEach(t=>t.select()),t.stopPropagation(),!1},checkQualityGateStatus(t){const e=[],n=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&n.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),n.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},getItemBezeichnung:t=>t.bezeichnung?t?.bezeichnung?.bezeichnung??t?.bezeichnung:"",getItemNote(t){if(!t?.note)return"";if(t.note?.bezeichnung)return t.note.bezeichnung;const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:t.note},handleChangeAbgabetypSerientermin(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""},semesterChanged(t){if(this.$refs.abgabeTable.tabulator){const e=this.$refs.abgabeTable.tabulator,n=e.getFilters().filter(t=>"studiensemester_kurzbz"!=t.field),i=t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"":t.value.studiensemester_kurzbz,a={field:"studiensemester_kurzbz",type:t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"!=":"=",value:i};e.setFilter([...n,a])}},checkAbgabetermineProjektarbeit(t){const e=luxon.DateTime.now();t.abgabetermine.forEach(n=>{n.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===n.paabgabetyp_kurzbz),n.dateStyle=ln(n,this.notenOptions);const i=luxon.DateTime.fromISO(n.datum).endOf("day");n.luxonDate=i,n.diffMs=i.toMillis()-e.toMillis(),n.diffMs<0?(!t.prevTermin||n.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=n):n.diffMs>0&&(!t.nextTermin||n.diffMs<t.nextTermin.diffMs)&&(t.nextTermin=n)}),this.checkQualityGateStatus(t)},loadState(){return JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID)||"null")},saveState(t){if(!this.stateRestored)return;const e={columns:t.getColumnLayout().map(t=>({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const n=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(n),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let n of e.headerFilters)t.setHeaderFilterValue(n.field,n.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const n=e.sort.map(e=>{const n=t.columnManager.findColumn(e.field);return n?{column:n,dir:e.dir}:null}).filter(Boolean);t.setSort(n)},100)),this.stateRestored=!0}})},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,getOptionLabelStg:t=>t.kurzbzlang+" "+t.bezeichnung,getOptionLabelStudiensemester:t=>t.studiensemester_kurzbz,getNotenFilterOptionLabel:t=>t.bezeichnung,formatDate(t){if(null===t)return"";const e=new Date(t),n=t=>String(t).padStart(2,"0"),i=n(e.getMonth()+1);return`${n(e.getDate())}.${i}.${e.getFullYear()}`},formAction(t){const e=document.createElement("div");e.className="d-flex gap-3",e.style.display="flex",e.style.alignItems="stretch",e.style.justifyContent="center",e.style.height="100%";const n=t.getValue(),i=(t,e,n)=>{const i=document.createElement("button");return i.className="btn btn-outline-secondary",i.style.display="flex",i.style.alignItems="center",i.style.justifyContent="center",i.style.height="100%",i.style.aspectRatio="1 / 1",i.style.padding="0","fa fa-timeline"==t&&(i.style.transform="rotate(90deg)"),i.innerHTML=`<i class="${t}" style="color:#00649C; font-size:1.1rem;"></i>`,i.title=this.$capitalize(this.$p.t(e)),i.addEventListener("click",t=>{t.stopPropagation(),t.stopImmediatePropagation(),n()}),i};return e.append(i("fa fa-folder-open","abgabetool/c4details",()=>this.setDetailComponent(n)),i("fa fa-timeline","abgabetool/c4termineTimeLine",()=>this.openTimeline(n))),e},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){const t=this.selectedData?.map(t=>t.projektarbeit_id),e=[...this.selectedData];this.saving=!0,this.serienTermin.fixtermin=!this.serienTermin.invertedFixtermin,this.$api.call(nn.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,t,this.serienTermin.fixtermin)).then(e=>{"success"===e.meta.status&&e.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"));const n=e.data;t.forEach(t=>{const e=n.find(e=>e.projektarbeit_id==t),i=this.projektarbeiten.find(e=>e.projektarbeit_id==t);e.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==e.paabgabetyp_kurzbz),i.abgabetermine.push(e),i.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum))});const i=this.$refs.abgabeTable.tabulator,a=i.rowManager.scrollLeft,s=i.rowManager.scrollTop,r=this.mapProjekteToTableData(this.projektarbeiten);i.setData(r),i.redraw(!0),Vue.nextTick(()=>{const t=this.$refs.abgabeTable?.tabulator.element.querySelector(".tabulator-tableholder");t&&(t.scrollLeft=a,t.scrollTop=s)})}).finally(()=>{this.saving=!1,this.selectedData=e}),this.$refs.modalContainerAddSeries.hide()},mapProjekteToTableData(t){return t.map(t=>{if(t.selectable=!0,t.prevTermin=null,t.nextTermin=null,this.checkAbgabetermineProjektarbeit(t),this.notenOptions&&t.note){const e=this.notenOptions.find(e=>e.note==t.note);t.note_bez=e.bezeichnung}return{...t,abgabetermine:t.abgabetermine,details:{student_uid:t.student_uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),erstbetreuer:this.buildErstbetreuer(t),zweitbetreuer:this.buildZweitbetreuer(t),typ:t.projekttyp_kurzbz,titel:t.titel}})},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){const e=this.projektarbeiten.find(e=>e.projektarbeit_id==t.projektarbeit_id);e?.abgabetermine?.length&&this.$api.call(nn.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const n=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);n&&void 0!==t.signatur&&(n.signatur=t.signatur)})});const n=null!==e.note;e.abgabetermine.forEach(t=>{"object"!=typeof t.note&&(t.note=this.allowedNotenOptions.find(e=>e.note==t.note)),!t.noteBackend&&t.note&&(t.noteBackend=t.note),t.file=[],t.allowedToSave=!n,t.allowedToDelete=!n&&!t.abgabedatum});const i=e.vorname??e.student_vorname,a=e.nachname??e.student_nachname;e.student=`${i} ${a}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show()},openTimeline(t){const e=this.projektarbeiten.find(e=>e.projektarbeit_id==t.projektarbeit_id);e?(e.abgabetermine.forEach(t=>{const e=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz==t.paabgabetyp_kurzbz);t.benotbar=e.benotbar}),this.timelineProjekt=e,this.$refs.drawer.show()):this.$fhcAlert.alertInfo("Keine projektarbeit gefunden")},centeredTextFormatter(t){const e=t.getValue();if(e)return'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><p style="max-width: 100%; overflow-wrap: break-word; word-break: break-word; white-space: normal; margin: 0px; text-align: center">'+e+"</p></div>"},detailFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a><i class="fa fa-folder-open" style="color:#00649C"></i></a></div>',mailFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a href='+t.getValue()+'><i class="fa fa-envelope" style="color:#00649C"></i></a></div>',timelineFormatter:()=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a><i class="fa fa-timeline" style="color:#00649C"></i></a></div>',beurteilungFormatter:t=>t.getValue()?'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>':"-",pkzTextFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><a style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+t.getValue()+"</a></div>",abgabterminFormatter(t){const e=t.getValue();if(e){let t="";switch(e.dateStyle){case"verspaetet":t='<i class="fa-solid fa-triangle-exclamation"></i>';break;case"verpasst":t='<i class="fa-solid fa-calendar-xmark"></i>';break;case"abzugeben":t='<i class="fa-solid fa-hourglass-half"></i>';break;case"standard":t='<i class="fa-solid fa-clock"></i>';break;case"abgegeben":t='<i class="fa-solid fa-paperclip"></i>';break;case"beurteilungerforderlich":t='<i class="fa-solid fa-list-check"></i>';break;case"bestanden":t='<i class="fa-solid fa-check"></i>';break;case"nichtbestanden":t='<i class="fa-solid fa-circle-exclamation"></i>'}const n=e.bezeichnung?.bezeichnung??e.bezeichnung;return'<div style="display: flex; height: 100%"><div class='+e.dateStyle+'-header style="width:48px; height: 100%; padding: 0px; display: flex; align-items: center; justify-content: center;">'+t+'</div><div style="margin-left: 4px;"><p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+n+" - "+this.formatDate(e.datum)+"</p></div></div>"}return""},tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.student_uid+"@"+this.domain},buildPKZ:t=>`${t.student_uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),buildErstbetreuer:t=>t.erstbetreuer_full_name?t.erstbetreuer_full_name:t.betreuer_vorname+" "+t.betreuer_nachname,buildZweitbetreuer:t=>t.zweitbetreuer_full_name??"",async setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=this.mapProjekteToTableData(this.projektarbeiten),await this.tableBuiltPromise,this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.loading=!0,this.$api.call(nn.getProjektarbeitenForStudiengang(this.selectedStudiengangOption.studiengang_kz,this.notenOptionFilter?.benotet??0)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()}).finally(()=>{this.loading=!1})},loadAbgaben(t){return new Promise(e=>{this.$api.call(nn.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-n.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,await this.allConfigPromise,this.calcMaxTableHeight()},getOptionDisabled:t=>!t.aktiv},computed:{emailItems(){const t=[];return this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER&&t.push({label:this.$p.t("abgabetool/c4sendEmailBetreuerv3",[this.uniqueBetreuerEmailCount]),command:this.sammelMailBetreuer}),t},uniqueBetreuerEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.betreuer_mail&&t.add(e.betreuer_mail),e.zweitbetreuer_mail&&t.add(e.zweitbetreuer_mail)}),t.size},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default},selectedStudiengangOption(t,e){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},notenOptionFilter(t){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},selectedData(t){const e=this.$refs.abgabeTable?.tabulator;if(!e)return;const n=e.getRows();t.forEach(t=>{const e=n.find(e=>{if(e.getData().projektarbeit_id==t.projektarbeit_id)return e});e.select();const i=e.getElement().children[0]?.children[0]?.children[0];i&&(i.checked=!0)})}},created(){this.loading=!0,this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0});const t=[this.$api.call(nn.getConfig()),this.$api.call(nn.getStudiengaenge()),this.$api.call(mn.getAllStudiensemesterAndAktOrNext()),this.$api.call(nn.getNoten()),this.$api.call(nn.getPaAbgabetypen())];this.allConfigPromise=Promise.allSettled(t).then(t=>{if("fulfilled"===t[0].status){const e=t[0].value;this.turnitin_link=e.data?.turnitin_link,this.old_abgabe_beurteilung_link=e.data?.old_abgabe_beurteilung_link,this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER}if("fulfilled"===t[1].status){const e=t[1].value;this.studiengaengeOptions=e.data,this.studiengaengeOptions?.length&&(this.selectedStudiengangOption=this.stg_kz_prop?e.data.find(t=>t.studiengang_kz==this.stg_kz_prop):e.data[0])}if("fulfilled"===t[2].status){const e=t[2].value;this.allSem=e.data[0];const n={studiensemester_kurzbz:this.$p.t("abgabetool/c4all")};this.curSem=n,this.studiensemesterOptions=[n,...this.allSem]}if("fulfilled"===t[3].status){const e=t[3].value;"success"===e.meta?.status&&(this.notenOptions=e.data[0],this.allowedNotenOptions=this.notenOptions.filter(t=>e.data[1].includes(t.note)),this.notenOptionsNonFinal=this.notenOptions.filter(t=>e.data[2].includes(t.note))),this.allowedNotenFilterOptions=[{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/keineNoteEingetragen")),benotet:0},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/c4benotet")),benotet:1},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/showAll")),benotet:-1}],this.notenOptionFilter=this.allowedNotenFilterOptions[0]}if("fulfilled"===t[4].status){const e=t[4].value;this.abgabeTypeOptions=e.data}}).finally(()=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t<template v-if="phrasenResolved">\n\t\t<FhcOverlay :active="loading || saving"></FhcOverlay>\n\n\t\t<bs-modal ref="modalContainerAddSeries" class="bootstrap-prompt"\n\t\t\tdialogClass="modal-lg">\n\t\t\t<template v-slot:title>\n\t\t\t\t<div>\n\t\t\t\t\t{{ $p.t(\'abgabetool/neueTerminserie\') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4fixterminv4\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tv-model="serienTermin.invertedFixtermin"\n\t\t\t\t\t\t\t:binary="true"\n\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 align-content-center">\n\t\t\t\t\t\t<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t(\'abgabetool/c4zieldatumv2\') )}}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<VueDatePicker\n\t\t\t\t\t\t\tstyle="width: 95%;"\n\t\t\t\t\t\t\tv-model="serienTermin.datum"\n\t\t\t\t\t\t\t:clearable="false"\n\t\t\t\t\t\t\tlocale="de"\n\t\t\t\t\t\t\tformat="dd.MM.yyyy"\n\t\t\t\t\t\t\t:enable-time-picker="false"\n\t\t\t\t\t\t\t:text-input="true"\n\t\t\t\t\t\t\tauto-apply>\n\t\t\t\t\t\t</VueDatePicker>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4upload_allowed\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tv-model="serienTermin.upload_allowed"\n\t\t\t\t\t\t\t:binary="true"\n\t\t\t\t\t\t\t:pt="{ root: { class: \'ml-auto\' }}"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabetyp\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<Dropdown \n\t\t\t\t\t\t\t:style="{\'width\': \'100%\'}"\n\t\t\t\t\t\t\tv-model="serienTermin.bezeichnung"\n\t\t\t\t\t\t\t:options="abgabeTypeOptions"\n\t\t\t\t\t\t\t:optionLabel="getOptionLabelAbgabetyp"\n\t\t\t\t\t\t\t:optionDisabled="getOptionDisabled">\n\t\t\t\t\t\t</Dropdown>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class="row mt-2">\n\t\t\t\t\t<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t(\'abgabetool/c4abgabekurzbzv2\') )}}</div>\n\t\t\t\t\t<div class="col-12 col-md-9">\n\t\t\t\t\t\t<Textarea style="margin-bottom: 4px;" v-model="serienTermin.kurzbz" rows="1" class="w-100"></Textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</template>\n\t\t\t<template v-slot:footer>\n\t\t\t\t<button type="button" class="btn btn-primary" @click="addSeries">{{ $p.t(\'global/speichern\') }}</button>\n\t\t\t</template>\n\t\t</bs-modal>\t\n\t\t\n\t\t<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"\n\t\t\tdialogClass="modal-xl" :allowFullscreenExpand="true"\n\t\t\t@toggle-fullscreen="handleToggleFullscreenDetail">\n\t\t\t<template v-slot:title>\n\t\t\t\t<div>\n\t\t\t\t\t{{$p.t(\'abgabetool/c4abgabeMitarbeiterDetailTitle\')}}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-slot:default>\n\t\t\t\t<AbgabeDetail \n\t\t\t\t\t:projektarbeit="selectedProjektarbeit" \n\t\t\t\t\t:isFullscreen="detailIsFullscreen" \n\t\t\t\t\t:assistenzMode="true"\n\t\t\t\t\t@paUpdated="handlePaUpdated">\n\t\t\t\t\n\t\t\t\t</AbgabeDetail>\n\t\t\t\t\n\t\t\t</template>\n\t\t</bs-modal>\t\n\t\t\n\t\t<BsOffcanvas\n\t\t\tref="drawer"\n\t\t\tplacement="end"\n\t\t\t:backdrop="true"\n\t\t\t:style="{ \'--bs-offcanvas-width\': \'600px\' }"\n\t\t>\n\t\t\t<template #title>\n\t\t\t\t{{ $p.t(\'abgabetool/c4projektarbeitTimelineTitle\') }}\n\t\t\t</template>\n\n\t\t\t<div class="row" style="margin-bottom: 12px;">\n\t\t\t\t<Inplace\n\t\t\t\t\tclosable\n\t\t\t\t\t:closeButtonProps="{\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tposition: \'absolute\',\n\t\t\t\t\t\t\ttop: \'80px\',\n\t\t\t\t\t\t\tright: \'80px\',\n\t\t\t\t\t\t\tzIndex: 1\n\t\t\t\t\t\t}\n\t\t\t\t\t}"\n\t\t\t\t>\n\t\t\t\t\t<template #display> {{ $capitalize($p.t(\'abgabetool/showStudentDetails\'))}} </template>\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div class="col-auto">\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<div class="col-3">Student: </div>\n\t\t\t\t\t\t\t\t<div class="col-7">{{timelineProjekt?.student_vorname}} {{timelineProjekt?.student_nachname}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<div class="col-3">Uid: </div>\n\t\t\t\t\t\t\t\t<div class="col-7">{{timelineProjekt?.student_uid}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<div class="col-3">{{timelineProjekt?.betreuerart}}: </div>\n\t\t\t\t\t\t\t\t<div class="col-7">{{timelineProjekt?.erstbetreuer_full_name}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\t\t<div class="col-3">Titel: </div>\n\t\t\t\t\t\t\t\t<div class="col-7">{{timelineProjekt?.titel}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t</Inplace>\n\t\t\t</div>\n\t\t\n\t\t\t<Timeline \n\t\t\t\t:value="timelineProjekt?.abgabetermine"\n\t\t\t\talign="right"\n\t\t\t>\t\n\t\t\t\t<template #marker="slotProps">\n\t\t\t\t\t<div :class="slotProps.item.dateStyle + \'-header\'" style="height: 48px; width:48px; padding: 0px; display: flex; align-items: center; justify-content: center;">\n\t\t\t\t\t\t<i v-if="slotProps.item.dateStyle == \'verspaetet\'" class="fa-solid fa-triangle-exclamation"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'verpasst\'" class="fa-solid fa-calendar-xmark"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'abzugeben\'" class="fa-solid fa-hourglass-half"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'standard\'" class="fa-solid fa-clock"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'abgegeben\'" class="fa-solid fa-paperclip"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'beurteilungerforderlich\'" class="fa-solid fa-list-check"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'bestanden\'" class="fa-solid fa-check"></i>\n\t\t\t\t\t\t<i v-else-if="slotProps.item.dateStyle == \'nichtbestanden\'" class="fa-solid fa-circle-exclamation"></i>\n\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\n\t\t\t\t<template #opposite="slotProps">\n\t\t\t\t\t<div class="row g-1">\n\t\t\t\t\t\t<div class="col-5 fw-semibold text-end">\n\t\t\t\t\t\t\t{{ $capitalize($p.t(\'abgabetool/c4zieldatumv2\')) }}:\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-7">\n\t\t\t\t\t\t\t{{ formatDate(slotProps.item.datum) }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template #content="slotProps">\n\t\t\t\t \t<div class="row g-1">\n\t\t\t\t\t\t<div class="col-5 fw-semibold text-end">\n\t\t\t\t\t\t\t{{ $capitalize($p.t(\'abgabetool/c4abgabetyp\')) }}:\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-7">\n\t\t\t\t\t\t\t{{ getItemBezeichnung(slotProps.item) }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\t\t<div class="col-5 fw-semibold text-end">\n\t\t\t\t\t\t\t{{ $capitalize($p.t(\'abgabetool/c4abgabedatum\')) }}:\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="col-7">\n\t\t\t\t\t\t\t{{ formatDate(slotProps.item.abgabedatum) }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div v-if="slotProps.item.benotbar" class="col-5 fw-semibold text-end">\n\t\t\t\t\t\t\t{{ $capitalize($p.t(\'abgabetool/c4note\')) }}:\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if="slotProps.item.benotbar" class="col-7">\n\t\t\t\t\t\t\t{{ getItemNote(slotProps.item) }}\n\t\t\t\t\t\t</div>\n\t\t\t\t \t</div>\n\t\t\t\t \t<hr/>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t</Timeline>\n\t\t\t\n\t\t\t<template #footer>\n\t\t\t\t<AbgabeterminStatusLegende></AbgabeterminStatusLegende>\n\t\t\t</template>\n\t\t</BsOffcanvas>\n\t\t\n\t\t<div id="abgabetable" style="max-height:40vw;">\n\t\t\t<div class="row">\n\t\t\t\t<div class="col-auto">\n\t\t\t\t\t<h2 tabindex="1">{{$p.t(\'abgabetool/abgabetoolTitle\')}}</h2>\n\t\t\t\t</div>\n\t\t\t\t<div class="col-3">\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t:placeholder="$capitalize($p.t(\'lehre/studiengang\'))" \n\t\t\t\t\t\t:style="{\'width\': \'100%\', \'scroll-behavior\': \'auto !important\'}" \n\t\t\t\t\t\t:optionLabel="getOptionLabelStg" \n\t\t\t\t\t\tv-model="selectedStudiengangOption" \n\t\t\t\t\t\t:options="studiengaengeOptions"\n\t\t\t\t\t\t:tabindex="2"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #optionsgroup="slotProps">\n\t\t\t\t\t\t\t<div> {{ option.kurzbzlang }} {{ option.bezeichnung }} </div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Dropdown>\n\t\t\t\t</div>\n\t\t\t\t<div class="col-3">\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t:placeholder="$p.t(\'lehre/note\')" \n\t\t\t\t\t\t:style="{\'width\': \'100%\', \'scroll-behavior\': \'auto !important\'}" \n\t\t\t\t\t\t:optionLabel="getNotenFilterOptionLabel" \n\t\t\t\t\t\tv-model="notenOptionFilter" \n\t\t\t\t\t\t:options="allowedNotenFilterOptions" \n\t\t\t\t\t\t:tabindex="3"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #optionsgroup="slotProps">\n\t\t\t\t\t\t\t<div>{{ option.bezeichnung }} </div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Dropdown>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<hr>\n\t\t\t<core-filter-cmpt\n\t\t\t\t:title="\'\'" \n\t\t\t\t@uuidDefined="handleUuidDefined"\n\t\t\t\tref="abgabeTable"\n\t\t\t\t:newBtnShow="true"\n\t\t\t\t:newBtnLabel="$p.t(\'abgabetool/neueTerminserie\')"\n\t\t\t\t:newBtnDisabled="!selectedData.length"\n\t\t\t\t@click:new=openAddSeriesModal\n\t\t\t\t:tabulator-options="abgabeTableOptions" \n\t\t\t\t:tabulator-events="abgabeTableEventHandlers"\n\t\t\t\t@tableBuilt="handleTableBuilt"\n\t\t\t\ttableOnly\n\t\t\t\t:sideMenu="false"\n\t\t\t\t:useSelectionSpan="false"\n\t\t\t>\n\t\t\t\t<template #actions>\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\t@change="semesterChanged" \n\t\t\t\t\t\t:placeholder="$capitalize($p.t(\'lehre/studiensemester\'))" \n\t\t\t\t\t\t:style="{\'scroll-behavior\': \'auto !important\'}" \n\t\t\t\t\t\t:optionLabel="getOptionLabelStudiensemester" \n\t\t\t\t\t\tv-model="curSem" \n\t\t\t\t\t\t:options="studiensemesterOptions" \n\t\t\t\t\t>\n\t\t\t\t\t\t<template #optionsgroup="slotProps">\n\t\t\t\t\t\t\t<div>{{ option.studiensemester_kurzbz }}</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Dropdown>\n\t\t\t\t\t\n\t\t\t\t\t<button \n\t\t\t\t\t\tv-if="emailItems.length"\n\t\t\t\t\t\trole="button"\n\t\t\t\t\t\t@click="evt => $refs.menu.toggle(evt)"\n\t\t\t\t\t\tclass="btn btn-outline-secondary dropdown-toggle"\n\t\t\t\t\t\taria-haspopup="true"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class="fa fa-envelope"></i>\n\t\t\t\t\t</button>\n\t\t\t\t\t<tiered-menu ref="menu" :model="emailItems" popup :autoZIndex="false" />\n\t\t\t\t</template>\n\t\t\t</core-filter-cmpt>\n\t\t</div>\n\t</template>\n '},fn={name:"DeadlineOverview",components:{CoreFilterCmpt:fe},props:{person_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.name&&t.uid}},data(){return{fullName:null,deadlines:null,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,phrasenPromise:null,phrasenResolved:!1,deadlineTableOptions:{height:700,index:"projektarbeit_id",layout:"fitColumns",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),columns:[{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zieldatumv2"))),field:"datum",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4fixterminv4"))),field:"fixterminstring",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabetyp"))),field:"typ_bezeichnung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabekurzbzv2"))),field:"kurzbz",formatter:this.centeredTextFormatter,widthGrow:3},{title:Vue.computed(()=>this.$capitalize(this.$p.t("person/studentIn"))),field:"student",formatter:this.centeredTextFormatter,widthGrow:2},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"semester",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},deadlineTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{if("details"===e.getColumn().getField()){const t=e.getValue();if("detailTermine"===t.mode)this.setDetailComponent(e.getValue());else if("beurteilungDownload"===t.mode){const e=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz="+t.betreuerart_kurzbz+"&projektarbeit_id="+t.projektarbeit_id+"&person_id="+t.betreuer_person_id;window.open(e,"_blank")}}else if("beurteilung"===e.getColumn().getField()){const t=e.getValue();"-"!=t&&window.open(t,"_blank")}t.stopPropagation()}}]}},methods:{centeredTextFormatter:t=>'<div style="display: flex; justify-content: center; align-items: center; height: 100%"><p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+t.getValue()+"</p></div>",tableResolve(t){this.tableBuiltResolve=t},loadDeadlines(){this.$api.call(nn.fetchDeadlines(this.person_uid_prop??null)).then(t=>{t?.data&&this.setupData(t.data)})},setupData(t){this.deadlines=t,this.deadlines.forEach(t=>{t.student=(t.stud_titelpre?t.stud_titelpre+" ":"")+t.stud_vorname+" "+t.stud_nachname+(t.stud_titelpost?" "+t.stud_titelpost:""),t.fixterminstring=t.fixtermin?this.$p.t("abgabetool/c4yes"):this.$p.t("abgabetool/c4no")}),this.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns),this.$refs.deadlineTable.tabulator.setData(this.deadlines)},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.deadlineTableOptions.height=window.visualViewport.height-n.top-30,this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadDeadlines(),this.calcMaxTableHeight()}},watch:{},computed:{},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t\t<h2>{{$p.t(\'abgabetool/deadlinesTitle\')}} {{ fullName ? (\'-\' + fullName) : \'\'}}</h2>\n\t\t<hr>\n\t\t\t\n\t\t <core-filter-cmpt\n\t\t\t@uuidDefined="handleUuidDefined"\n\t\t\t:title="\'\'" \n\t\t\tref="deadlineTable" \n\t\t\t:tabulator-options="deadlineTableOptions" \n\t\t\t:tabulator-events="deadlineTableEventHandlers"\n\t\t\ttableOnly\n\t\t\t:sideMenu="false"\n\t\t />\n '};var vn={data:()=>({studienSemester:[],selectedStudiensemester:null,studiengaenge:[],selectedStudiengang:null,studienOrdnung:[],selectedStudienordnung:null,semester:[],selectedSemester:null,lehrveranstaltungen:[],selectedLehrveranstaltung:null,menu:null}),provide(){return{studium_studiengang:Vue.computed(()=>this.selectedStudiengang),studium_studiensemester:Vue.computed(()=>this.selectedStudiensemester),studium_semester:Vue.computed(()=>this.selectedSemester),studium_studienordnung:Vue.computed(()=>this.selectedStudienordnung)}},components:{LvUebersicht:ne},watch:{selectedStudiensemester:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("sudiensemester");t&&(!e||e&&e!=t)&&this.storeDataToLocalStorage("sudiensemester",t)}},selectedSemester:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("semester");(!e||e&&e!=t)&&this.storeDataToLocalStorage("semester",t)}},selectedStudiengang:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("studiengang");(!e||e&&e!=t)&&this.storeDataToLocalStorage("studiengang",JSON.stringify(t))}},selectedStudienordnung:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("studienordnung");(!e||e&&e!=t)&&this.storeDataToLocalStorage("studienordnung",JSON.stringify(t))}}},methods:{changeStudiensemester(t){let e=this.$refs.studiensemester;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedStudienSemester(e.value)},changeStudiengang(t){let e=this.$refs.studiengaenge;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedStudienGang(e.value)},changeSemester(t){let e=this.$refs.semester;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedSemester(e.value)},changeStudienordnung(t){let e=this.$refs.studienordnung,n=(e.selectedIndex+t+e.options.length)%e.options.length;e.options[n].disabled&&(n=(n+t+e.options.length)%e.options.length),e.selectedIndex=n,this.changeSelectedStudienPlan(e.value)},storeDataToLocalStorage(t,e){localStorage.setItem(t,e)},getDataFromLocalStorage:t=>localStorage.getItem(t),changeSelectedStudienSemester(t){this.$fhcApi.factory.studium.getAllStudienSemester(t,this.selectedStudiengang,this.selectedSemester,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedStudienGang(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,t,this.selectedSemester,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedSemester(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,this.selectedStudiengang,t,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedStudienPlan(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,this.selectedStudiengang,this.selectedSemester,t).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},openLvUebersicht(t){this.selectedLehrveranstaltung=t,this.selectedLehrveranstaltung.type="lehreinheit",this.selectedLehrveranstaltung.lehreinheit_id=this.selectedLehrveranstaltung.lehrveranstaltung_id,this.selectedLehrveranstaltung&&Vue.nextTick(()=>{this.$refs.lvUebersicht.show()})},sortStudienSemester(t){let e=new RegExp(/^(WS|SS)([0-9]{4})/);t.sort((t,n)=>{let[i,a,s]=t.studiensemester_kurzbz.match(e),[r,o,l]=n.studiensemester_kurzbz.match(e);return s==l?a>o?-1:1:s>l?-1:1})},setHash(t){location.hash=t},extractPropertyValues(t){let{studienSemester:e,studiengang:n,semester:i,studienplan:a,lehrveranstaltungen:s}=t;this.sortStudienSemester(e.all),this.studienSemester=e.all,this.selectedStudiensemester=e.preselected.studiensemester_kurzbz,this.studiengaenge=n.all,this.selectedStudiengang=n.preselected?.studiengang_kz,this.semester=i.all,this.selectedSemester=i?.preselected,this.studienOrdnung=a.all,this.selectedStudienordnung=a.preselected?.studienplan_id,this.lehrveranstaltungen=s,this.lehrveranstaltungen.sort((t,e)=>t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase()?1:t.bezeichnung.toLowerCase()<e.bezeichnung.toLowerCase()?-1:0),this.lehrveranstaltungen.forEach(t=>{t.lehrveranstaltungen.sort((t,e)=>t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase()?1:t.bezeichnung.toLowerCase()<e.bezeichnung.toLowerCase()?-1:0)})},studienordnungTitel:t=>t?`${t?.bezeichnung}-${t?.orgform_kurzbz} ( ${t?.orgform_bezeichnung}, ${t?.sprache} )`:"",studiengangTitel:t=>t?`${t?.kurzbzlang} (${t?.bezeichnung})`:"",studiensemesterTitel(t){if(!t)return"";let e=new RegExp(/^(WS|SS)([0-9]{4})/),n=t.match(e);switch(n[1]){case"WS":return`Wintersemester ${n[2]}`;case"SS":return`Sommersemester ${n[2]}`;default:return`${t}`}}},computed:{selectedLehrveranstaltungTitel(){const t=this.studiengaenge.find(t=>t.studiengang_kz==this.selectedStudiengang);return`${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${t.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`},computedStudienOrdnung(){return this.studienOrdnung?Object.values(this.studienOrdnung).reduce((t,e)=>(t[e.bezeichnung]||(t[e.bezeichnung]=[]),t[e.bezeichnung].push(e),t),{}):null},computedStudienOrdnungSelectValues(){if(!this.computedStudienOrdnung)return null;let t=[];return Object.entries(this.computedStudienOrdnung).forEach(([e,n])=>{t.push({bezeichnung:`Studienordnung: ${e}`,disabled:!0}),n.forEach(e=>{t.push({studienplan:e,diabled:!1,bezeichnung:`${e?.bezeichnung}-${e?.orgform_kurzbz} ( ${e?.orgform_bezeichnung}, ${e?.sprache} )`})})}),t}},created(){const t=this.getDataFromLocalStorage("sudiensemester")??void 0,e=JSON.parse(this.getDataFromLocalStorage("studiengang"))??void 0,n=this.getDataFromLocalStorage("semester")??void 0,i=JSON.parse(this.getDataFromLocalStorage("studienordnung"))??void 0;this.$fhcApi.factory.studium.getAllStudienSemester(t,e,n,i).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},template:'\n\t<div>\n\t<h2>Studium</h2>\n\t<hr>\n\t<lv-uebersicht ref="lvUebersicht" :titel="selectedLehrveranstaltungTitel" :event="selectedLehrveranstaltung" :studiensemester="selectedStudiensemester" v-if="selectedLehrveranstaltung">\n\t\t<template #content>\n\t\t\t<div v-if="Array.isArray(selectedLehrveranstaltung.lektoren) && selectedLehrveranstaltung.lektoren.length>0" class="mb-4">\n\t\t\t\t<h4>Lektoren:</h4>\n\t\t\t\t<a :href="\'mailto:\'+lektor?.email" class="fhc-link-color mx-2" v-for="lektor in selectedLehrveranstaltung.lektoren">{{lektor.name}}</a>\n\t\t\t</div>\n\t\t\t<h4>Menu:</h4>\n\t\t</template>\n\t</lv-uebersicht>\n\t<div class="lvOptions">\n\t\t<div>\n\t\t<h6>Studiensemester:</h6>\n\t\t<div class="input-group">\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiensemester(1)" :aria-label="$p.t(\'global\',\'previous\')" :title="$p.t(\'global\',\'previous\')">\n\t\t\t\t<i class="fa fa-caret-left" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t\t<select ref="studiensemester" v-model="selectedStudiensemester" class="form-select" :aria-label="$p.t(\'global/studiensemester_auswaehlen\')" @change="setHash($event.target.value)">\n\t\t\t\t<option v-for="semester in studienSemester" @click="changeSelectedStudienSemester(semester.studiensemester_kurzbz)" :key="semester" :value="semester.studiensemester_kurzbz">{{studiensemesterTitel(semester.studiensemester_kurzbz)\t}}</option>\n\t\t\t</select>\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiensemester(-1)" :aria-label="$p.t(\'global\',\'next\')" :title="$p.t(\'global\',\'next\')">\n\t\t\t\t<i class="fa fa-caret-right" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t</div>\n\t\t</div>\n\n\t\t<div>\n\t\t<h6>Studiengang:</h6>\n\t\t<div class="input-group">\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiengang(-1)" :aria-label="$p.t(\'global\',\'previous\')" :title="$p.t(\'global\',\'previous\')">\n\t\t\t\t<i class="fa fa-caret-left" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t\t<select ref="studiengaenge" v-model="selectedStudiengang" class="form-select" :aria-label="$p.t(\'global/studiensemester_auswaehlen\')" @change="setHash($event.target.value)">\n\t\t\t\t<option v-for="studiengang in studiengaenge" @click="changeSelectedStudienGang(studiengang.studiengang_kz)" :key="studiengang.studiengang_kz" :value="studiengang.studiengang_kz" >{{studiengangTitel(studiengang)}}</option>\n\t\t\t</select>\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiengang(1)" :aria-label="$p.t(\'global\',\'next\')" :title="$p.t(\'global\',\'next\')">\n\t\t\t\t<i class="fa fa-caret-right" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t</div>\n\t\t</div>\n\n\t\t<div>\n\t\t<h6>Semester:</h6>\n\t\t<div class="input-group">\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeSemester(-1)" :aria-label="$p.t(\'global\',\'previous\')" :title="$p.t(\'global\',\'previous\')">\n\t\t\t\t<i class="fa fa-caret-left" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t\t<select ref="semester" v-model="selectedSemester" class="form-select" :aria-label="$p.t(\'global/studiensemester_auswaehlen\')" @change="setHash($event.target.value)">\n\t\t\t\t<option v-for="sem in semester" @click="changeSelectedSemester(sem)" :key="semester" :value="sem">{{sem}}. Semester</option>\n\t\t\t</select>\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeSemester(1)" :aria-label="$p.t(\'global\',\'next\')" :title="$p.t(\'global\',\'next\')">\n\t\t\t\t<i class="fa fa-caret-right" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t</div>\n\t\t</div>\n\n\t\t<div>\n\t\t<h6>Studienordnung:</h6>\n\t\t<div class="input-group">\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudienordnung(-1)" :aria-label="$p.t(\'global\',\'previous\')" :title="$p.t(\'global\',\'previous\')">\n\t\t\t\t<i class="fa fa-caret-left" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t\t<select ref="studienordnung" v-model="selectedStudienordnung" class="form-select" :aria-label="$p.t(\'global/studiensemester_auswaehlen\')" @change="setHash($event.target.value)">\n\t\t\t\t<option v-for="ordnung in computedStudienOrdnungSelectValues" :disabled="ordnung.disabled" @click="changeSelectedStudienPlan(ordnung?.studienplan?.studienplan_id)" :key="ordnung?.studienplan?.bezeichnung\t" :value="ordnung?.studienplan?.studienplan_id">{{ordnung.bezeichnung}}</option>\n\t\t\t</select>\n\t\t\t<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudienordnung(1)" :aria-label="$p.t(\'global\',\'next\')" :title="$p.t(\'global\',\'next\')">\n\t\t\t\t<i class="fa fa-caret-right" aria-hidden="true"></i>\n\t\t\t</button>\n\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<hr>\n\n\t<div class="lvUebersicht " >\n\t<template v-for="lehrveranstaltung in lehrveranstaltungen" :key="lehrveranstaltung.lehrveranstaltung_id">\n\t\t<div class="card" v-if="Array.isArray(lehrveranstaltung.lehrveranstaltungen) && lehrveranstaltung.lehrveranstaltungen.length >0" >\n\t\t\t<div class="card-header">\n\t\t\t\t<h5 class=" card-title">{{lehrveranstaltung.bezeichnung}}</h5>\n\t\t\t\t<h6 class=" card-subtitle">{{lehrveranstaltung.lehrform_kurzbz}}</h6>\n\t\t\t</div>\n\t\t\t<div class="card-body">\n\t\t\t\t<ul class="list-group list-group-flush">\n\t\t\t\t\t<li class="d-flex list-group-item" v-for="lv in lehrveranstaltung.lehrveranstaltungen">\n\t\t\t\t\t\t<a class="fhc-link-color d-block me-auto" href="#" @click="openLvUebersicht(lv)">{{lv.bezeichnung}}</a>\n\t\t\t\t\t\t<p>{{lv.lehrform_kurzbz}}</p>\n\t\t\t\t\t</li>\t\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t</template>\n\t</div>\n\n\n\t</div>\n\t\n\t'},bn={loadRenderers:()=>({method:"get",url:"/api/frontend/v1/RendererLoader/GetRenderers",params:{}})},yn={info:(t,e)=>({method:"post",url:"/api/frontend/v1/RouteInfo/info",params:{app:t,path:e}})};const wn=FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g,"")+FHC_JS_DATA_STORAGE_OBJECT.ci_router,kn=VueRouter.createRouter({history:VueRouter.createWebHistory(`/${wn}`),routes:[{path:"/Cis/Studium",name:"Studium",component:vn,props:!0},{path:"/Cis/Profil/View/:uid",name:"ProfilView",component:Ne,props:!0},{path:"/Cis/Profil",name:"Profil",component:Ne,props:!0},{path:"/Cis/Abgabetool/Student/:student_uid_prop?",name:"AbgabetoolStudent",component:dn,props:!0},{path:"/Cis/Abgabetool/Mitarbeiter",name:"AbgabetoolMitarbeiter",component:pn,props:!0},{path:"/Cis/Abgabetool/Assistenz/:stg_kz_prop?",name:"AbgabetoolAssistenz",component:gn,props:!0},{path:"/Cis/Abgabetool/Deadlines/:person_uid_prop?",name:"DeadlineOverview",component:fn,props:!0},{path:"/Cis/Raumsuche",name:"Raumsuche",component:Be,props:!0},{path:"/CisVue/Cms/getRoomInformation/:ort_kurzbz",name:"RoomInformationOld",component:en,redirect:t=>({name:"RoomInformation",params:{ort_kurzbz:t.params.ort_kurzbz,mode:tn,focus_date:(new Date).toISOString().split("T")[0]}})},{path:"/CisVue/Cms/getRoomInformation/:mode/:focus_date/:ort_kurzbz",name:"RoomInformation",component:en,props:t=>{const e=t.params.mode&&["Month","Week","Day"].includes(t.params.mode.charAt(0).toUpperCase()+t.params.mode.slice(1).toLowerCase())?t.params.mode.charAt(0).toUpperCase()+t.params.mode.slice(1).toLowerCase():tn,n=new Date(t.params.focus_date);return{propsViewData:{mode:e,focus_date:isNaN(n)?(new Date).toISOString().split("T")[0]:t.params.focus_date,ort_kurzbz:t.params.ort_kurzbz}}},beforeEnter:(t,e,n)=>{t.params.mode&&t.params.focus_date?n():n({name:"RoomInformation",params:{mode:t.params.mode||tn,focus_date:t.params.focus_date||(new Date).toISOString().split("T")[0],ort_kurzbz:route.params.ort_kurzbz}})}},{path:"/CisVue/Cms/Content/:content_id",name:"Content",component:Xe,props:!0},{path:"/CisVue/Cms/News",name:"News",component:Je,props:!0},{path:"/Cis/MyLv/:studiensemester?",name:"MyLv",component:ae,props:!0},{path:"/Cis/MyLv/Info/:studien_semester/:lehrveranstaltung_id",name:"LvInfo",component:Gt,props:!0},{path:"/Cis/LvPlan/:lv_id(\\d+)",name:"LvPlanOld",component:jt,redirect(t){const e=Vue.unref(kn.currentRoute),{mode:n,focus_date:i}=e.params;return{name:"LvPlan",params:{mode:n,focus_date:i,lv_id:t.params.lv_id}}}},{path:"/Cis/LvPlan/:mode?/:focus_date?/:lv_id?",name:"LvPlan",component:jt,props:t=>({propsViewData:t.params})},{path:"/Cis/MyLvPlan/:mode?/:focus_date?",name:"MyLvPlan",component:Ut,props:t=>({propsViewData:t.params})},{path:"/Cis4",name:"Cis4",component:k,props:{dashboard:"CIS"}},{path:"/",name:"FhcDashboard",component:k,props:{dashboard:"CIS"}},{path:"/:pathMatch(.*)*",name:"Fallback",component:k,props:{dashboard:"CIS"},redirect:()=>({name:"Cis4",params:{dashboard:"CIS"}})}]}),_n=Vue.createApp({name:"FhcApp",data:()=>({appSideMenuEntries:{},renderers:null}),components:{},computed:{isMobile:()=>window.matchMedia("(max-width: 767px)").matches},provide(){return{language:Vue.computed(()=>this.$p.user_language),renderers:Vue.computed(()=>this.renderers),isMobile:this.isMobile}},methods:{isInternalRoute(t){const e=window.location.origin;return t.startsWith(e)},handleClick(t){const e=t.target.closest("a");if("skiplink"!=e?.id&&e&&this.isInternalRoute(e.href)){const n=new URL(e.href).pathname,i=this.$router.options.history.base,a=n.replace(i,"")||"/",s=this.$router.resolve(a);if(!s?.matched?.length||"Fallback"===s.name)return;if(t.preventDefault(),this.isMobile){document.getElementById("nav-main").classList.contains("show")&&document.getElementById("nav-main-btn").click()}this.$router.push(a)}}},async created(){await this.$api.call(bn.loadRenderers()).then(t=>t.data).then(t=>{for(let i of Object.keys(t)){let a=null,s=null,r=null;if(t[i].modalTitle&&(a=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[i].modalTitle)))),t[i].modalContent&&(s=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[i].modalContent)))),t[i].calendarEvent&&(r=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[i].calendarEvent)))),t[i].calendarEventStyles){var e=document.head;if(!e.querySelector(`link[href="${t[i].calendarEventStyles}"]`)){var n=document.createElement("link");n.type="text/css",n.rel="stylesheet",n.href=t[i].calendarEventStyles,e.appendChild(n)}}null===this.renderers&&(this.renderers={}),this.renderers[i]||(this.renderers[i]={}),this.renderers[i].modalTitle=a,this.renderers[i].modalContent=s,this.renderers[i].calendarEvent=r}})},mounted(){document.addEventListener("click",this.handleClick)},beforeUnmount(){document.removeEventListener("click",this.handleClick)}});!function(){const t=/Chrome/.test(navigator.userAgent),e=/Firefox/.test(navigator.userAgent);if(t){const t=function(){const t=document.createElement("div");t.style.position="absolute",t.style.top="-9999px",t.style.width="100px",t.style.height="100px",t.style.overflow="scroll",document.body.appendChild(t);const e=t.offsetWidth-t.clientWidth;return document.body.removeChild(t),e}()+"px";document.body.style.setProperty("--scrollbar-width",t)}else e&&document.body.style.setProperty("--scrollbar-width","0px")}(),_n.config.globalProperties.$capitalize=function(t){return t?t[0].toUpperCase()+t.slice(1):""},FhcApps.router.makeExtendable(kn),FhcApps.makeExtendable(_n),_n.use(kn),_n.use(primevue.config.default,{zIndex:{overlay:9e3,tooltip:8e3}}),_n.directive("tooltip",primevue.tooltip),_n.use(ot),_n.use(pt),_n.directive("contrast",gt),_n.mount("#fhccontent"),kn.afterEach((t,e,n)=>{_n.config.globalProperties.$api.call(yn.info("cis4",t.fullPath))});
//# sourceMappingURL=Fhc.js.map