start Table Mobility

This commit is contained in:
ma0068
2024-12-18 16:31:39 +01:00
parent ba62abc19b
commit 39a23693ba
7 changed files with 737 additions and 1 deletions
@@ -91,6 +91,11 @@ class Config extends FHCAPI_Controller
'title' => $this->p->t('stv', 'tab_resources'),
'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js'
];
$result['mobility'] = [
'title' => $this->p->t('stv', 'tab_mobility'),
'component' => './Stv/Studentenverwaltung/Details/Mobility.js'
];
/* TODO(chris): Ausgeblendet für Testing
$result['grades'] = [
'title' => $this->p->t('stv', 'tab_grades'),
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Mobility extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getMobilitaeten' => ['admin:r', 'assistenz:r'],
'loadMobility' => ['admin:r', 'assistenz:r'],
'insertMobility' => ['admin:rw', 'assistenz:rw'],
'updateMobility' => ['admin:rw', 'assistenz:rw'],
'deleteMobility' => ['admin:rw', 'assistenz:rw'],
'getTypenMobility' => ['admin:rw', 'assistenz:rw'],
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui'
]);
// Load models
$this->load->model('codex/Mobilitaet_model', 'MobilitaetModel');
}
public function getMobilitaeten($prestudent_id)
{
$this->MobilitaetModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_mobilitaet.mobilitaetsprogramm_code)', 'LEFT');
$result = $this->MobilitaetModel->loadWhere(
array('prestudent_id' => $prestudent_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
}
+2
View File
@@ -2,12 +2,14 @@ import verband from './stv/verband.js';
import students from './stv/students.js';
import filter from './stv/filter.js';
import konto from './stv/konto.js';
import mobility from './stv/mobility.js';
export default {
verband,
students,
filter,
konto,
mobility,
configStudent() {
return this.$fhcApi.get('api/frontend/v1/stv/config/student');
},
+5
View File
@@ -0,0 +1,5 @@
export default {
getMobilitaeten (url, config, params){
return this.$fhcApi.get('api/frontend/v1/stv/mobility/getMobilitaeten/' + params.id);
},
}
@@ -0,0 +1,25 @@
import TableMobility from "./Mobility/Mobility.js";
export default {
components: {
TableMobility
},
provide() {
return {
config: this.config
};
},
props: {
modelValue: Object,
},
data(){
return {}
},
template: `
<div class="stv-details-mobility h-100 d-flex flex-column">
<h1>TEST Mob</h1>
<table-mobility ref="tbl_mobility" :prestudent="modelValue"></table-mobility>
</div>`
};
@@ -0,0 +1,629 @@
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
import BsModal from "../../../../Bootstrap/Modal.js";
import FormForm from '../../../../Form/Form.js';
import FormInput from '../../../../Form/Input.js';
export default {
components: {
CoreFilterCmpt,
BsModal,
FormForm,
FormInput
},
inject: {
$reloadList: {
from: '$reloadList',
required: true
}
},
props: {
prestudent: Object
},
data() {
return {
tabulatorOptions: {
ajaxURL: 'dummy',
ajaxRequestFunc: this.$fhcApi.factory.stv.mobility.getMobilitaeten,
ajaxParams: () => {
return {
id: this.prestudent.prestudent_id
};
},
ajaxResponse: (url, params, response) => response.data,
columns: [
{title: "Kurzbz", field: "kurzbz"},
{title: "Nation", field: "beurteilung_bezeichnung"},
{title: "firma_id", field: "firma_id", visible: false},
// {title: "prueferIn2", field: "p2_nachname", visible: false},
// {title: "prueferIn3", field: "p3_nachname", visible: false},
// {title: "datum", field: "format_datum"},
// {title: "uhrzeit", field: "uhrzeit"},
// {title: "freigabe", field: "format_freigabedatum"},
// {title: "pruefungsantritt", field: "antritt_bezeichnung"},
// {title: "sponsion", field: "format_sponsion"},
// {title: "anmerkung", field: "anmerkung"},
// {title: "mobility_id", field: "mobility_id", visible: false},
// {title: "typ", field: "pruefungstyp_kurzbz", visible: false},
{
title: 'Aktionen', field: 'actions',
minWidth: 150, // Ensures Action-buttons will be always fully displayed
formatter: (cell, formatterParams, onRendered) => {
let container = document.createElement('div');
container.className = "d-flex gap-2";
let button = document.createElement('button');
button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '<i class="fa fa-edit"></i>';
button.title = this.$p.t('ui', 'bearbeiten');
button.addEventListener('click', (event) =>
this.actionEditmobility(cell.getData().mobility_id)
);
container.append(button);
button = document.createElement('button');
button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '<i class="fa fa-xmark"></i>';
button.title = this.$p.t('ui', 'loeschen');
button.addEventListener('click', () =>
this.actionDeletemobility(cell.getData().mobility_id)
);
container.append(button);
return container;
},
frozen: true
},
],
layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
minHeight: '200',
selectable: true,
index: 'mobility_id',
persistenceID: 'stv-details-table_mobiliy'
},
tabulatorEvents: [
{
event: 'tableBuilt',
handler: async() => {
await this.$p.loadCategory(['global', 'person', 'stv', 'mobility', 'ui']);
let cm = this.$refs.table.tabulator.columnManager;
// cm.getColumnByField('vorsitz_nachname').component.updateDefinition({
// title: this.$p.t('mobility', 'vorsitz_header')
// });
// cm.getColumnByField('beurteilung_bezeichnung').component.updateDefinition({
// title: this.$p.t('mobility', 'abschlussbeurteilung')
// });
// cm.getColumnByField('p1_nachname').component.updateDefinition({
// title: this.$p.t('mobility', 'pruefer1')
// });
// cm.getColumnByField('p2_nachname').component.updateDefinition({
// title: this.$p.t('mobility', 'pruefer2')
// });
// cm.getColumnByField('p3_nachname').component.updateDefinition({
// title: this.$p.t('mobility', 'pruefer3')
// });
// cm.getColumnByField('format_datum').component.updateDefinition({
// title: this.$p.t('global', 'datum')
// });
// cm.getColumnByField('uhrzeit').component.updateDefinition({
// title: this.$p.t('global', 'uhrzeit')
// });
// cm.getColumnByField('format_freigabedatum').component.updateDefinition({
// title: this.$p.t('mobility', 'freigabe')
// });
// cm.getColumnByField('antritt_bezeichnung').component.updateDefinition({
// title: this.$p.t('mobility', 'pruefungsantritt')
// });
// cm.getColumnByField('format_sponsion').component.updateDefinition({
// title: this.$p.t('mobility', 'sponsion')
// });
// cm.getColumnByField('anmerkung').component.updateDefinition({
// title: this.$p.t('global', 'anmerkung')
// });
// cm.getColumnByField('pruefungstyp_kurzbz').component.updateDefinition({
// title: this.$p.t('global', 'typ')
// });
// cm.getColumnByField('mobility_id').component.updateDefinition({
// title: this.$p.t('ui', 'mobility_id')
// });
/*
cm.getColumnByField('actions').component.updateDefinition({
title: this.$p.t('global', 'aktionen')
});
*/
}
}
],
tabulatorData: [],
lastSelected: null,
formData: {
},
statusNew: true,
arrTypen: [],
arrAntritte: [],
arrBeurteilungen: [],
arrAkadGrad: [],
arrNoten: [],
filteredMitarbeiter: [],
filteredPruefer: [],
abortController: {
mitarbeiter: null,
pruefer: null
},
stgTyp: null,
stgKz: null,
}
},
watch: {
student(){
if (this.$refs.table) {
this.$refs.table.reloadTable();
}
}
},
methods: {
getStudiengangsTyp(){
this.stgTyp = '';
this.$fhcApi.factory.stv.mobility.getTypStudiengang(this.stg_kz)
.then(result => this.stgTyp = result.data)
.catch(this.$fhcAlert.handleSystemError);
},
actionNewmobility() {
this.resetForm();
this.statusNew = true;
this.setDefaultFormData();
},
actionEditmobility(mobility_id) {
this.resetForm();
this.statusNew = false;
this.loadmobility(mobility_id);
},
actionDeletemobility(mobility_id) {
this.$fhcAlert
.confirmDelete()
.then(result => result
? mobility_id
: Promise.reject({handled: true}))
.then(this.deletemobility)
.catch(this.$fhcAlert.handleSystemError);
},
addNewmobility() {
const dataToSend = {
uid: this.student.uid,
formData: this.formData
};
return this.$refs.formFinalExam.factory.stv.mobility.addNewmobility(dataToSend)
.then(response => {
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
this.resetForm();
})
.catch(this.$fhcAlert.handleSystemError)
.finally(() => {
this.reload();
});
},
reload() {
this.$refs.table.reloadTable();
},
loadmobility(mobility_id) {
return this.$fhcApi.factory.stv.mobility.loadmobility(mobility_id)
.then(result => {
this.formData = result.data;
//TODO(Manu) check if cisRoot is okay
this.formData.link = this.cisRoot + 'index.ci.php/lehre/Pruefungsprotokoll/showProtokoll?mobility_id=' + this.formData.mobility_id + '&fhc_controller_id=67481e5ed5490';
return result;
})
.catch(this.$fhcAlert.handleSystemError);
},
updatemobility(mobility_id) {
const dataToSend = {
id: mobility_id,
formData: this.formData
};
return this.$refs.formFinalExam.factory.stv.mobility.updatemobility(dataToSend)
.then(response => {
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
this.resetForm();
})
.catch(this.$fhcAlert.handleSystemError)
.finally(() => {
this.reload();
});
},
deletemobility(mobility_id) {
return this.$fhcApi.factory.stv.mobility.deletemobility(mobility_id)
.then(response => {
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete'));
})
.catch(this.$fhcAlert.handleSystemError)
.finally(() => {
this.reload();
});
},
resetForm() {
this.formData = null;
},
},
created() {
// this.$fhcApi.factory.stv.mobility.getTypenmobility()
// .then(result => {
// this.arrTypen = result.data;
// })
// .catch(this.$fhcAlert.handleSystemError);
// this.$fhcApi.factory.stv.mobility.getTypenAntritte()
// .then(result => {
// this.arrAntritte = result.data;
// })
// .catch(this.$fhcAlert.handleSystemError);
// this.$fhcApi.factory.stv.mobility.getBeurteilungen()
// .then(result => {
// this.arrBeurteilungen = result.data;
// })
// .catch(this.$fhcAlert.handleSystemError);
// this.$fhcApi.factory.stv.mobility.getNoten()
// .then(result => {
// this.arrNoten = result.data;
// })
// .catch(this.$fhcAlert.handleSystemError);
// this.$fhcApi.factory.stv.mobility.getAkadGrade(this.student.studiengang_kz)
// .then(result => {
// this.arrAkadGrad = result.data;
// })
// .catch(this.$fhcAlert.handleSystemError);
// if (!this.student.length) {
// this.$fhcApi.factory.stv.mobility.getTypStudiengang(this.student.studiengang_kz)
// .then(result => {
// this.stgTyp = result.data;
// this.setDefaultFormData();
// })
// .catch(this.$fhcAlert.handleSystemError);
// } else
// this.getStudiengangsTyp();
},
template: `
<div class="stv-details-mobility h-100 pb-3">
<h4>In/out</h4>
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
table-only
:side-menu="false"
reload
new-btn-show
new-btn-label="Mobilität"
@click:new="actionNewmobility"
>
</core-filter-cmpt>
<form-form v-if="!this.prestudent.length" ref="formMobility" @submit.prevent>
<!-- <legend>{{this.$p.t('global','details')}}</legend>
<p v-if="statusNew">[{{$p.t('ui', 'neu')}}]</p>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-mobility-typ"
:label="$p.t('global', 'typ')"
type="select"
v-model="formData.pruefungstyp_kurzbz"
name="pruefungstyp_kurzbz"
>
<option
v-for="typ in arrTypen"
:key="typ.pruefungstyp_kurzbz"
:value="typ.pruefungstyp_kurzbz"
>
{{typ.beschreibung}}
</option>
</form-input>
<form-input
container-class="col-6 stv-details-mobility-note"
:label="$p.t('lehre', 'note')"
type="select"
v-model="formData.note"
name="note"
>
<option :value="null"> -- {{$p.t('fehlermonitoring', 'keineAuswahl')}} -- </option>
<option
v-for="note in arrNoten"
:key="note.note"
:value="note.note"
>
{{note.bezeichnung}}
</option>
</form-input>
</div>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-mobility-pruefungsantritt"
:label="$p.t('mobility', 'pruefungsantritt')"
type="select"
v-model="formData.pruefungsantritt_kurzbz"
name="pruefungsantritt_kurzbz"
>
<option :value="null"> -- {{$p.t('fehlermonitoring', 'keineAuswahl')}} -- </option>
<option
v-for="antritt in arrAntritte"
:key="antritt.pruefungsantritt_kurzbz"
:value="antritt.pruefungsantritt_kurzbz"
>
{{antritt.bezeichnung}}
</option>
</form-input>
</div>
<div class="row mb-3">
<template v-if="statusNew">
<form-input
container-class="col-6 stv-details-mobility-vorsitz"
:label="$p.t('mobility', 'vorsitz_header')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.vorsitz"
name="vorsitz"
:suggestions="filteredMitarbeiter"
@complete="search"
:min-length="3"
>
</form-input>
</template>
<template v-else >
<form-input
v-if= "formData.pv"
container-class="col-6 stv-details-mobility-vorsitz"
type="text"
name="name"
:label="$p.t('mobility', 'vorsitz_header')"
v-model="formData.pv"
>
</form-input>
<form-input
v-else
container-class="col-6 stv-details-mobility-vorsitz"
:label="$p.t('mobility', 'vorsitz_header')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.vorsitz"
name="vorsitz"
:suggestions="filteredMitarbeiter"
@complete="search"
:min-length="3"
>
</form-input>
</template>
<template v-if="statusNew">
<form-input
container-class="col-6 stv-details-mobility-pruefer1"
:label="$p.t('mobility', 'pruefer1')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.pruefer1"
name="pruefer1"
:suggestions="filteredPruefer"
@complete="searchNotAkad"
:min-length="3"
>
</form-input>
</template>
<template v-else >
<form-input
v-if= "formData.p1"
container-class="col-6 stv-details-mobility-pruefer1"
type="text"
name="name"
:label="$p.t('mobility', 'pruefer1')"
v-model="formData.p1"
>
</form-input>
<form-input
v-else
container-class="col-6 stv-details-mobility-pruefer1"
:label="$p.t('mobility', 'pruefer1')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.pruefer1"
name="pruefer1"
:suggestions="filteredPruefer"
@complete="searchNotAkad"
:min-length="3"
>
</form-input>
</template>
</div>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-mobility-abschlussbeurteilung_kurzbz"
:label="$p.t('mobility', 'abschlussbeurteilung')"
type="select"
v-model="formData.abschlussbeurteilung_kurzbz"
name="abschlussbeurteilung_kurzbz"
>
<option :value="null"> -- {{$p.t('fehlermonitoring', 'keineAuswahl')}} -- </option>
<option
v-for="beurteilung in arrBeurteilungen"
:key="beurteilung.abschlussbeurteilung_kurzbz"
:value="beurteilung.abschlussbeurteilung_kurzbz"
>
{{beurteilung.bezeichnung}}
</option>
</form-input>
<template v-if="statusNew">
<form-input
container-class="col-6 stv-details-mobility-pruefer2"
:label="$p.t('mobility', 'pruefer2')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.pruefer2"
name="pruefer2"
:suggestions="filteredPruefer"
@complete="searchNotAkad"
:min-length="3"
>
</form-input>
</template>
<template v-else >
<form-input
v-if= "formData.p2"
container-class="col-6 stv-details-mobility-pruefer2"
type="text"
name="name"
:label="$p.t('mobility', 'pruefer2')"
v-model="formData.p2"
>
</form-input>
<form-input
v-else
container-class="col-6 stv-details-mobility-pruefer2"
:label="$p.t('mobility', 'pruefer2')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.pruefer2"
name="pruefer2"
:suggestions="filteredPruefer"
@complete="searchNotAkad"
:min-length="3"
>
</form-input>
</template>
</div>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-mobility-akadgrad"
:label="$p.t('mobility', 'akadGrad')"
type="select"
v-model="formData.akadgrad_id"
name="akadgrad"
>
<option
v-for="grad in arrAkadGrad"
:key="grad.akadgrad_id"
:value="grad.akadgrad_id"
>
{{grad.titel}}
</option>
</form-input>
<template v-if="statusNew">
<form-input
container-class="col-6 stv-details-mobility-pruefer3"
:label="$p.t('mobility', 'pruefer3')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.pruefer3"
name="pruefer3"
:suggestions="filteredPruefer"
@complete="searchNotAkad"
:min-length="3"
>
</form-input>
</template>
<template v-else >
<form-input
v-if= "formData.p3"
container-class="col-6 stv-details-mobility-pruefer3"
type="text"
name="name"
:label="$p.t('mobility', 'pruefer3')"
v-model="formData.p3"
>
</form-input>
<form-input
v-else
container-class="col-6 stv-details-mobility-pruefer3"
:label="$p.t('mobility', 'pruefer3')"
type="autocomplete"
optionLabel="mitarbeiter"
v-model="formData.pruefer3"
name="pruefer3"
:suggestions="filteredPruefer"
@complete="searchNotAkad"
:min-length="3"
>
</form-input>
</template>
</div>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-mobility-datum"
:label="$p.t('global', 'datum')"
type="DatePicker"
v-model="formData.datum"
auto-apply
:enable-time-picker="false"
format="dd.MM.yyyy"
name="datum"
:teleport="true"
>
</form-input>
<form-input
container-class="col-6 stv-details-mobility-anmerkung"
:label="$p.t('global', 'anmerkung')"
type="textarea"
v-model="formData.anmerkung"
name="anmerkung"
>
</form-input>
</div>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-mobility-sponsion"
:label="$p.t('mobility', 'sponsion')"
type="DatePicker"
v-model="formData.sponsion"
auto-apply
:enable-time-picker="false"
format="dd.MM.yyyy"
name="sponsion"
:teleport="true"
>
</form-input>
<form-input
container-class="col-6 stv-details-mobility-protokoll"
:label="$p.t('mobility', 'protokoll')"
type="textarea"
v-model="formData.protokoll"
name="protokoll"
:rows= 10
>
</form-input>
</div>
<div class="row mb-3 col-6">
<div class="col">
<p >{{$p.t('mobility', 'zurBeurteilung')}}</p>
</div>
<div class="col">
<p>
<a :href="formData.link" target="_blank" rel="noopener noreferrer">
{{$p.t('mobility', 'pruefungsprotokoll')}}
</a>
</p>
</div>
</div>
<div class="text-end mb-3">
<button v-if="statusNew" class="btn btn-primary" @click="addNewmobility()"> {{$p.t('ui', 'speichern')}}</button>
<button v-else class="btn btn-primary" @click="updatemobility(formData.mobility_id)"> {{$p.t('ui', 'speichern')}}</button>
</div> -->
</form-form>
</div>
`
}
+24 -1
View File
@@ -37277,7 +37277,30 @@ array(
'insertvon' => 'system'
)
)
)
),
// FHC4 Phrases Mobility Start
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'tab_mobility',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Mobilität',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Mobility',
'description' => '',
'insertvon' => 'system'
)
)
),
// FHC4 Phrases Mobility Start
);