Merge branch 'master' into feature-40953/LV-Template_Uebersichtsseite

This commit is contained in:
Cristina
2025-03-11 17:35:34 +01:00
22 changed files with 656 additions and 240 deletions
+32 -7
View File
@@ -33,22 +33,30 @@ class Tag_Controller extends FHCAPI_Controller
public function getTag()
{
$language = $this->_getLanguageIndex();
$id = $this->input->get('id');
$this->NotizModel->addSelect(
'tbl_notiz.titel,
"tbl_notiz.titel,
tbl_notiz.text,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
tbl_notiz.insertvon,
tbl_notiz.updatevon
'
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
$this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
$this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.verfasser_uid = bearbeiterbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
@@ -134,7 +142,11 @@ class Tag_Controller extends FHCAPI_Controller
{
$postData = $this->getPostJson();
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('text' => $postData->notiz)
array('text' => $postData->notiz,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid,
)
);
$this->terminateWithSuccess($updateData);
}
@@ -142,7 +154,11 @@ class Tag_Controller extends FHCAPI_Controller
{
$postData = $this->getPostJson();
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('erledigt' => !$postData->done)
array('erledigt' => !$postData->done,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid,
)
);
$this->terminateWithSuccess($updateData);
@@ -183,5 +199,14 @@ class Tag_Controller extends FHCAPI_Controller
show_error('User authentification failed');
}
private function _getLanguageIndex()
{
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->SpracheModel->addSelect('index');
$result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
return hasData($result) ? getData($result)[0]->index : 1;
}
}
+1 -1
View File
@@ -10,7 +10,7 @@ $this->load->view(
);
?>
<iframe style="width:100%; height:100%;" id="Infoterminal" src="<?php echo base_url() . 'cis/infoterminal/?forcelogin=true'; ?>" name="Infoterminal" frameborder="0" >
<iframe style="width:100%; height:90vh;" id="Infoterminal" src="<?php echo base_url() . 'cis/infoterminal/?forcelogin=true'; ?>" name="Infoterminal" frameborder="0" >
No iFrames
</iframe>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
+104 -62
View File
@@ -8,6 +8,7 @@ class lehrveranstaltung_faktor extends basis_db
public $lehrveranstaltung_faktor_id; // serial
public $lehrveranstaltung_id; // integer
public $faktor; // numeric
public $lehrform_kurzbz; // varchar(8)
public $studiensemester_kurzbz_von; // varchar(16)
public $studiensemester_kurzbz_bis; // varchar(16)
public $insertamum; // timestamp
@@ -58,7 +59,44 @@ class lehrveranstaltung_faktor extends basis_db
return true;
}
public function loadByLV($lv_id, $von = null, $bis = null, $id = null)
public function loadByLV($lv_id)
{
if (!is_numeric($lv_id))
{
$this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein';
return false;
}
$qry = "SELECT *
FROM lehre.tbl_lehrveranstaltung_faktor
LEFT JOIN public.tbl_studiensemester vonstsem
ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz
LEFT JOIN public.tbl_studiensemester bisstem
ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz
WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER);
if (!$result = $this->db_query($qry)) {
$this->errormsg = 'Datensatz konnte nicht geladen werden';
return false;
}
while ($row = $this->db_fetch_object($result))
{
$lv_faktor_objekt = new lehrveranstaltung_faktor();
$lv_faktor_objekt->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id;
$lv_faktor_objekt->lehrveranstaltung_id = $row->lehrveranstaltung_id;
$lv_faktor_objekt->faktor = $row->faktor;
$lv_faktor_objekt->lehrform_kurzbz = $row->lehrform_kurzbz;
$lv_faktor_objekt->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von;
$lv_faktor_objekt->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis;
$this->lv_faktoren[] = $lv_faktor_objekt;
}
return true;
}
public function checkIfExists($lv_id, $von = null, $bis = null, $id = null, $lehrform_kurzbz = null)
{
if (!is_numeric($lv_id))
@@ -105,50 +143,80 @@ class lehrveranstaltung_faktor extends basis_db
lehrveranstaltung_faktor_id != ". $this->db_add_param($id, FHC_INTEGER);
}
if (!$result = $this->db_query($qry)) {
$this->errormsg = 'Datensatz konnte nicht geladen werden';
return false;
}
while ($row = $this->db_fetch_object($result))
if (!empty($lehrform_kurzbz) && $lehrform_kurzbz !== "")
{
$lv_faktor_objekt = new lehrveranstaltung_faktor();
$lv_faktor_objekt->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id;
$lv_faktor_objekt->lehrveranstaltung_id = $row->lehrveranstaltung_id;
$lv_faktor_objekt->faktor = $row->faktor;
$lv_faktor_objekt->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von;
$lv_faktor_objekt->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis;
$this->lv_faktoren[] = $lv_faktor_objekt;
$qry .= "
AND
lehrform_kurzbz = ". $this->db_add_param($lehrform_kurzbz);
}
else
{
$qry .= "
AND lehrform_kurzbz IS NULL
";
}
return true;
if ($result = $this->db_query($qry))
{
if ($this->db_num_rows($result) > 0)
return true;
else
return false;
}
}
public function addFaktor($lv_id, $faktor, $von, $bis = NULL)
public function save($new = false)
{
$qry = 'INSERT INTO lehre.tbl_lehrveranstaltung_faktor (lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, studiensemester_kurzbz_bis)
VALUES ('. $this->db_add_param($lv_id, FHC_INTEGER) . ', '.
$this->db_add_param($faktor, FHC_INTEGER) . ', '.
$this->db_add_param($von, FHC_STRING) . ', '.
$this->db_add_param($bis, FHC_STRING) . ');';
if ($new)
{
$qry = 'INSERT INTO lehre.tbl_lehrveranstaltung_faktor (lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, studiensemester_kurzbz_bis, lehrform_kurzbz, insertvon)
VALUES ('. $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER) . ', '.
$this->db_add_param($this->faktor, FHC_INTEGER) . ', '.
$this->db_add_param($this->studiensemester_kurzbz_von) . ', '.
$this->db_add_param($this->studiensemester_kurzbz_bis) . ', '.
$this->db_add_param($this->lehrform_kurzbz) . ', '.
$this->db_add_param($this->insertvon) . ');';
}
else
{
$qry = "UPDATE lehre.tbl_lehrveranstaltung_faktor
SET faktor = ". $this->db_add_param($this->faktor) ." ,
studiensemester_kurzbz_von = ". $this->db_add_param($this->studiensemester_kurzbz_von) .",
studiensemester_kurzbz_bis = ". $this->db_add_param($this->studiensemester_kurzbz_bis) .",
lehrform_kurzbz = ". $this->db_add_param($this->lehrform_kurzbz) .",
updatevon = ". $this->db_add_param($this->updatevon) .",
updateamum = ". $this->db_add_param($this->updateamum) ."
WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($this->lehrveranstaltung_faktor_id, FHC_INTEGER);
}
if ($this->db_query($qry))
{
$qry_id = "SELECT currval('lehre.lehrveranstaltung_faktor_id_seq') as id;";
if($this->db_query($qry_id))
if ($new)
{
if($row = $this->db_fetch_object())
$qry_id = "SELECT currval('lehre.lehrveranstaltung_faktor_id_seq') as id;";
if($this->db_query($qry_id))
{
$this->db_query('COMMIT');
return [
'id' => $row->id,
'lv_id' => $lv_id,
'faktor' => $faktor,
'von' => $von,
'bis' => $bis
];
if($row = $this->db_fetch_object())
{
$this->db_query('COMMIT');
return [
'id' => $row->id,
'lv_id' => $this->lehrveranstaltung_id,
'faktor' => $this->faktor,
'lehrform_kurzbz' => $this->lehrform_kurzbz,
'von' => $this->studiensemester_kurzbz_von,
'bis' => $this->studiensemester_kurzbz_bis
];
}
else
{
$this->db_query('ROLLBACK');
return [
'status' => 'error',
'message' => 'Fehler beim Einfügen in die Datenbank:'
];
}
}
else
{
@@ -160,34 +228,7 @@ class lehrveranstaltung_faktor extends basis_db
}
}
else
{
$this->db_query('ROLLBACK');
return [
'status' => 'error',
'message' => 'Fehler beim Einfügen in die Datenbank:'
];
}
}
else
{
return [
'status' => 'error',
'message' => 'Fehler beim Einfügen in die Datenbank:'
];
}
}
public function updateFaktor($id, $faktor, $von, $bis)
{
$qry = "UPDATE lehre.tbl_lehrveranstaltung_faktor
SET faktor = ". $this->db_add_param($faktor) ." ,
studiensemester_kurzbz_von = ". $this->db_add_param($von) .",
studiensemester_kurzbz_bis = ". $this->db_add_param($bis) ."
WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER);
if ($this->db_query($qry))
{
return true;
return true;
}
else
{
@@ -215,6 +256,7 @@ class lehrveranstaltung_faktor extends basis_db
WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER) . "
AND (vonstsem.start <= now() OR vonstsem.start IS NULL)
AND (bisstem.ende >= now() OR bisstem.ende IS NULL)
AND lehrform_kurzbz IS NULL
ORDER BY vonstsem.start DESC LIMIT 1
";
+1
View File
@@ -7,6 +7,7 @@ $this->phrasen['lvaliste/hilfeAnzeigen']='Hilfe anzeigen';
$this->phrasen['lvaliste/lehrfach']='Lehrfach';
$this->phrasen['lvaliste/lehrform']='Lehrform';
$this->phrasen['lvaliste/faktor']='Faktor';
$this->phrasen['lvaliste/lvBezeichnung']='LV Bezeichnung';
$this->phrasen['lvaliste/lehrfachBezeichnung']='Lehrfach Bezeichnung';
$this->phrasen['lvaliste/lektor']='LektorIn';
+1
View File
@@ -7,6 +7,7 @@ $this->phrasen['lvaliste/hilfeAnzeigen']='Show Legend';
$this->phrasen['lvaliste/lehrfach']='Subject';
$this->phrasen['lvaliste/lehrform']='Course Type';
$this->phrasen['lvaliste/faktor']='Factor';
$this->phrasen['lvaliste/lvBezeichnung']='Course Title';
$this->phrasen['lvaliste/lehrfachBezeichnung']='Subject Title';
$this->phrasen['lvaliste/lektor']='Lector';
+16 -8
View File
@@ -524,29 +524,29 @@ html {
}
@media screen and ( max-width: 576px ) {
.searchbar_icon img {
#nav-search .searchbar_results .searchbar_icon img {
max-width: 65px !important;
}
.searchbar_icon i {
#nav-search .searchbar_results .searchbar_icon i {
font-size: 3em !important;
}
.searchbar_grid {
#nav-search .searchbar_results .searchbar_grid {
grid-template-columns: [icon] 75px [data] auto;
}
.searchbar_table,
.searchbar_tablerow,
.searchbar_tablecell {
#nav-search .searchbar_results .searchbar_table,
#nav-search .searchbar_results .searchbar_tablerow,
#nav-search .searchbar_results .searchbar_tablecell {
display: block;
}
.searchbar_tablecell.searchbar_label {
#nav-search .searchbar_results .searchbar_tablecell.searchbar_label {
font-weight: bold;
}
.searchbar_tablecell.searchbar_value {
#nav-search .searchbar_results .searchbar_tablecell.searchbar_value {
padding-left: 2.5rem;
overflow-wrap: anywhere;
}
@@ -571,4 +571,12 @@ html {
.height-enter-from,
.height-leave-to {
height: 0px;
}
.zusatzinfo h2 {
font-size: 1.5em;
}
.dashboard-item {
overscroll-behavior: none;
}
+10 -1
View File
@@ -582,7 +582,16 @@ var FHC_TableWidget = {
options.columns = arrayTabulatorColumns;
options.data = data.dataset;
options.persistence = (typeof options.persistence == 'undefined') ? true : options.persistence; // enables persistence (default store in localStorage if available, else in cookie)
let defaultPersistence = {
sort: true,
columns: true,
filter: false,
headerFilter: false,
group: false,
page: false,
}
options.persistence = (typeof options.persistence == 'undefined') ? defaultPersistence : options.persistence; // enables persistence (default store in localStorage if available, else in cookie)
options.persistenceID = (typeof options.persistenceID == 'undefined') ? data.tableUniqueId : options.persistenceID; // persistenceID to store persistence data seperately for multiple tables
options.movableColumns = (typeof options.movableColumns == 'undefined') ? true : options.movableColumns; // allows changing column order
options.tooltipsHeader = (typeof options.tooltipsHeader == 'undefined') ? true : options.tooltipsHeader; // set header tooltip with column title
@@ -30,23 +30,23 @@ template:/*html*/`
<template v-if="studiengang?.bezeichnung && semester">
<div class="card card-body mb-3">
<div class="mb-1">
<h2 class="mb-1 pb-0">{{$p.t('lehre','studiengang')}}:</h2>
<h2 class="h4 mb-1 pb-0">{{$p.t('lehre','studiengang')}}:</h2>
<span class="mb-1">{{studiengang?.bezeichnung}}</span>
</div>
<div class="mb-1">
<h2 class="mb-1 pb-0">Moodle:</h2>
<h2 class="h4 mb-1 pb-0">Moodle:</h2>
<a class="mb-1" target="_blank" :href="moodleLink">{{studiengang?.kurzbzlang}}</a>
</div>
<div :class="{'mb-1':studiengang?.zusatzinfo_html}">
<h2 class="mb-1 pb-0">{{$p.t('lehre','studiensemester')}}: </h2>
<h2 class="h4 mb-1 pb-0">{{$p.t('lehre','studiensemester')}}: </h2>
<span class="mb-1">{{semester}}</span>
</div>
<div v-if="studiengang?.zusatzinfo_html" v-html="studiengang?.zusatzinfo_html"></div>
<div class="zusatzinfo" v-if="studiengang?.zusatzinfo_html" v-html="studiengang?.zusatzinfo_html"></div>
</div>
</template>
<template v-for="{title, collection} in collection_array">
<template v-if="Array.isArray(collection) && collection.length !==0">
<h2 class="text-truncate">{{title}}</h2>
<h2 class="h5 text-truncate">{{title}}</h2>
<template v-if="displayWidget">
<div class="d-flex flex-wrap flex-row mb-3 gap-2">
<template v-for="person in collection">
+31 -14
View File
@@ -14,6 +14,8 @@ export default {
selected: null,
size:0,
}),
props: ['width', 'height']
,
mixins: [AbstractWidget],
computed: {
sizeClass() {
@@ -102,6 +104,31 @@ export default {
this.singleNews = singleNews;
this.$refs.newsModal.show();
},
initCarouselInstance() {
Vue.nextTick(()=> {
if(this.$refs.carousel) { // carousel ref might not exist in every widget width/height
this.carouselInstance = new bootstrap.Carousel(this.$refs.carousel, {
wrap: false, // keep this off even though it actually wraps
interval: false
});
}
})
},
initActiveItem() {
Vue.nextTick(()=> {
if (Array.isArray(this.$refs.carouselItems) && this.$refs.carouselItems.length >0) {
this.$refs.carouselItems[0].classList.add("active")
}
})
}
},
watch: {
width(newVal, oldVal) {
if(oldVal == 1 && newVal > 1) { // carousel instance will have been disposed
this.initCarouselInstance()
this.initActiveItem()
}
}
},
created() {
this.$emit("setConfig", false);
@@ -111,12 +138,9 @@ export default {
.then((news) => {
this.allNewsList = Array.from(Object.values(news));
this.selected = this.allNewsList.length ? this.allNewsList[0] : null
Vue.nextTick(()=>{
if (Array.isArray(this.$refs.carouselItems) && this.$refs.carouselItems.length >0) {
this.$refs.carouselItems[0].classList.add("active")
}
})
})
this.initActiveItem()
})
.catch((err) => {
console.error("ERROR: ", err);
});
@@ -139,15 +163,8 @@ export default {
}
}).observe(this.$refs.container);
}
Vue.nextTick(()=> {
if(this.$refs.carousel) { // carousel ref might not exist in every widget width/height
this.carouselInstance = new bootstrap.Carousel(this.$refs.carousel, {
wrap: false, // keep this off even though it actually wraps
interval: false
});
}
})
this.initCarouselInstance()
},
template: /*html*/ `
<div ref="container" class="widgets-news h-100" :class="sizeClass" :style="getNewsWidgetStyle">
+31 -12
View File
@@ -82,10 +82,10 @@ export default {
this.tagData.style = item.style;
this.tagData.zuordnung_typ = this.zuordnung_typ;
this.tagData.done = item.done;
this.tagData.insertamum = item.insertamum;
this.tagData.updateamum = item.updateamum;
this.tagData.updatevon = item.updatevon;
this.tagData.insertvon = item.insertvon;
this.tagData.insertamum = this.formatDateTime(item.insertamum)
this.tagData.updateamum = this.formatDateTime(item.updateamum)
this.tagData.bearbeiter = item.bearbeiter;
this.tagData.verfasser = item.verfasser;
if (item && item.notiz_id)
{
@@ -146,8 +146,6 @@ export default {
this.$refs.tagModal.hide();
});
}
},
async doneTag()
{
@@ -181,22 +179,35 @@ export default {
id: "",
done: false,
insertamum: "",
insertvon: "",
verfasser: "",
updateamum: "",
updatevon: "",
bearbeiter: "",
response: ""
};
this.selectedTagId = null;
this.mode = "create";
},
formatDateTime: (dateString) => {
if (!dateString) return null;
return new Date(dateString).toLocaleString('de-AT', {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
second: "2-digit"
});
}
},
template: `
<div class="plus_button_container" @mouseleave="hideList">
<span :title="values.length === 0 ? 'Bitte Zeilen markieren' : ''">
<button @mouseover="showList = true"
:disabled="!values || values.length === 0"
class="btn btn-sm">
<i class="fa-solid fa-tag fa-xl"></i>
</button>
</span>
<ul v-if="showList" class="dropdown_list">
<li v-for="(item, index) in tags" :key="index" @click="openModal(item)" :title="item.bezeichnung">
{{ item.bezeichnung }}
@@ -221,7 +232,15 @@ export default {
field="notiz"
placeholder="Notiz..."
></form-input>
<div class="modificationdate">angelegt von {{ tagData.insertvon }} am {{ tagData.insertamum }}</div>
<div class="modificationdate">
<span v-if="tagData.verfasser">
{{ $p.t('notiz', 'tag_verfasser', { 0: tagData.verfasser, 1: tagData.insertamum }) }}
</span>
<br />
<span v-if="tagData.bearbeiter && tagData.insertamum !== tagData.updateamum">
{{ $p.t('notiz', 'tag_bearbeiter', { 0: tagData.bearbeiter, 1: tagData.updateamum }) }}
</span>
</div>
</div>
</template>
<template #footer>
@@ -232,12 +251,12 @@ export default {
class="btn btn-success me-2"
@click="doneTag"
>
{{ tagData.done ? 'Rückgängig' : 'Erledigt' }}
{{ tagData.done ? $p.t('notiz', 'tag_rueckgaengig') : $p.t('notiz', 'tag_erledigt') }}
</button>
<button v-if="mode === 'edit'" class="btn btn-danger" @click="deleteTag">Löschen</button>
<button v-if="mode === 'edit'" class="btn btn-danger" @click="deleteTag">{{ $p.t('global', 'loeschen' )}}</button>
</div>
<button type="button" class="btn btn-primary" @click="saveTag">
{{ mode === "edit" ? $p.t('ui', 'bearbeiten') : $p.t('studierendenantrag', 'btn_create') }}
{{ mode === "edit" ? $p.t('global', 'speichern') : $p.t('global', 'create') }}
</button>
</div>
</template>
+46 -10
View File
@@ -20,7 +20,6 @@ import FilterConfig from './Filter/Config.js';
import FilterColumns from './Filter/Columns.js';
import TableDownload from './Table/Download.js';
import collapseAutoClose from '../../directives/collapseAutoClose.js';
import { defaultHeaderFilter } from '../../tabulator/filters/defaultHeaderFilter.js';
import moduleLayoutFitDataStretchFrozen from '../../tabulator/layouts/fitDataStretchFrozen.js';
@@ -84,6 +83,7 @@ export const CoreFilterCmpt = {
uuid: 0,
// FilterCmpt properties
filterName: null,
filterActive: false,
fields: null,
dataset: null,
datasetMetadata: null,
@@ -103,7 +103,15 @@ export const CoreFilterCmpt = {
tabulator: null,
tableBuilt: false,
tabulatorHasSelector: false,
selectedData: []
selectedData: [],
persistence: {
sort: true,
columns: true,
filter: false,
headerFilter: false,
group: false,
page: false,
}
};
},
computed: {
@@ -210,12 +218,11 @@ export const CoreFilterCmpt = {
layout: "fitDataStretchFrozen",
movableColumns: true,
columnDefaults:{
tooltip: true,
headerFilterFunc: defaultHeaderFilter,
tooltip: true
},
placeholder,
reactiveData: true,
persistence: true
persistence: this.persistence,
}, ...(this.tabulatorOptions || {})};
if (!this.tableOnly) {
@@ -281,11 +288,15 @@ export const CoreFilterCmpt = {
const cols = this.tabulator.getColumns();
this.fields = cols.map(col => col.getField());
this.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());
if (this.tabulator.options.persistence.headerFilter)
this._setHeaderFilter();
});
}
this.tabulator.on("dataFiltered", filters => {
this.filterActive = filters.length > 0;
});
},
updateTabulator() {
if (this.tabulator) {
@@ -299,6 +310,23 @@ export const CoreFilterCmpt = {
this.tabulatorHasSelector = this.tabulatorOptions.selectable || this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;
this.tabulator.setColumns(this.filteredColumns);
this.tabulator.setData(this.filteredData);
this._setHeaderFilter()
},
clearFilters()
{
let existingFilters = this.tabulator.getHeaderFilters();
existingFilters.forEach(filter => {
this.tabulator.setHeaderFilterValue(filter.field, "");
});
this.tabulator.clearFilter();
this.filterActive = false;
},
_setHeaderFilter()
{
const existingFilters = this.tabulator.getHeaderFilters();
existingFilters.forEach(filter => {
this.tabulator.setHeaderFilterValue(filter.field, filter.value);
});
},
/**
*
@@ -581,16 +609,21 @@ export const CoreFilterCmpt = {
alert('"nwNewEntry" listener is mandatory when sideMenu is true');
this.uuid = _uuid++;
this.$emit('uuidDefined', this.uuid)
if (!this.tableOnly)
this.getFilter(); // get the filter data
},
mounted() {
this.initTabulator();
this.initTabulator().then(() => {
if (!this.tableOnly) {
this.selectedFilter = window.location.hash ? window.location.hash.slice(1) : null;
this.getFilter(); // get the filter data
}
});
},
template: `
<!-- Load filter data -->
<core-fetch-cmpt
v-if="!tableOnly"
v-if="!tableOnly && fetchCmptApiFunction"
v-bind:api-function="fetchCmptApiFunction"
v-bind:api-function-parameters="fetchCmptApiFunctionParams"
v-bind:refresh="fetchCmptRefresh"
@@ -629,6 +662,9 @@ export const CoreFilterCmpt = {
<a v-if="!tableOnly || $slots.filter" href="#" class="btn btn-link px-0 text-dark" data-bs-toggle="collapse" :data-bs-target="'#collapseFilters' + idExtra">
<span class="fa-solid fa-xl fa-filter"></span>
</a>
<a v-if="filterActive" class="btn btn-link px-0 text-dark" :title="$p.t('ui','filterdelete')" @click="clearFilters">
<span class="fa-solid fa-xl fa-filter-circle-xmark"></span>
</a>
<a href="#" class="btn btn-link px-0 text-dark" data-bs-toggle="collapse" :data-bs-target="'#collapseColumns' + idExtra">
<span class="fa-solid fa-xl fa-table-columns"></span>
</a>
+10 -10
View File
@@ -31,36 +31,36 @@ export default {
<div class="searchbar_table">
<div class="searchbar_tablerow">
<div class="searchbar_tablecell">Student UID</div>
<div class="searchbar_tablecell">
<div class="searchbar_tablecell searchbar_label">Student UID</div>
<div class="searchbar_tablecell searchbar_value">
{{ res.uid }}
</div>
</div>
<div class="searchbar_tablerow">
<div class="searchbar_tablecell">{{$p.t('lehre','studiengang')}}</div>
<div class="searchbar_tablecell">
<div class="searchbar_tablecell searchbar_label">{{$p.t('lehre','studiengang')}}</div>
<div class="searchbar_tablecell searchbar_value">
{{ res.studiengang }}
</div>
</div>
<div class="searchbar_tablerow">
<div class="searchbar_tablecell">Verband</div>
<div class="searchbar_tablecell">
<div class="searchbar_tablecell searchbar_label">Verband</div>
<div class="searchbar_tablecell searchbar_value">
{{ res.verband }}
</div>
</div>
<div class="searchbar_tablerow">
<div class="searchbar_tablecell">{{$p.t('person','personenkennzeichen')}}</div>
<div class="searchbar_tablecell">
<div class="searchbar_tablecell searchbar_label">{{$p.t('person','personenkennzeichen')}}</div>
<div class="searchbar_tablecell searchbar_value">
{{ res.matrikelnr }}
</div>
</div>
<div class="searchbar_tablerow">
<div class="searchbar_tablecell">{{$p.t('person','email')}}</div>
<div class="searchbar_tablecell">
<div class="searchbar_tablecell searchbar_label">{{$p.t('person','email')}}</div>
<div class="searchbar_tablecell searchbar_value">
<a :href="this.mailtourl">
{{ res.email }}
</a>
+39 -10
View File
@@ -7,26 +7,49 @@ Tabulator.extendModule('filter', 'filters', {
"dates": (headerValue, rowValue) => {
if (!headerValue)
return true;
let v = new Date(rowValue);
if (Array.isArray(headerValue)) {
if (headerValue[1]) {
return v >= headerValue[0] && v <= headerValue[1].setHours(23, 59, 59, 999);
let rowDate = new Date(rowValue);
if (Array.isArray(headerValue))
{
let startDate = new Date(headerValue[0]);
if (headerValue[1])
{
let endDate = new Date(headerValue[1]);
endDate.setHours(23, 59, 59, 999);
return rowDate >= startDate && rowDate <= endDate;
}
return v.toDateString() == headerValue[0].toDateString();
return rowDate.toDateString() === startDate.toDateString();
}
return v.toDateString() == headerValue.toDateString();
let singleDate = new Date(headerValue);
return rowDate.toDateString() === singleDate.toDateString();
}
});
function dateFilter(cell, onRendered, success) {
let div = document.createElement('div');
let initialValue = null;
let val = cell.getValue();
if (Array.isArray(val))
{
const start = val[0] ? new Date(val[0]) : null;
const end = val[1] ? new Date(val[1]) : null;
initialValue = [start, end];
}
Vue.createApp({
components: {
PrimevueCalendar: primevue.calendar
},
data() {
return {
val: null
val: initialValue
}
},
watch: {
@@ -34,10 +57,16 @@ function dateFilter(cell, onRendered, success) {
success(n);
}
},
template: `<primevue-calendar v-model="val" selection-mode="range" :manual-input="false" show-button-bar></primevue-calendar>`
template: `<primevue-calendar
v-model="val"
selection-mode="range"
:manual-input="false"
show-button-bar
:showIcon="true"
dateFormat="dd.mm.yy">
</primevue-calendar>`
}).use(primevue.config.default).mount(div);
return div;
}
export { dateFilter as 'dateFilter' };
export { dateFilter };
@@ -1,87 +0,0 @@
function parseFilterExpression(expression){
const includeGroups = [];
const excludeTerms = [];
const comparisons = [];
if( typeof expression !== 'string' ) {
comparisons.push({ operator: '=', number: expression });
return { includeGroups, excludeTerms, comparisons };
}
const andParts = expression.split('&&').map(part => part.trim());
andParts.forEach(part => {
const orTerms = part.split('||').map(p => p.trim());
const orRegexes = [];
orTerms.forEach(term => {
const comparisonMatch = term.match(/^(<=|>=|<|>|=|!=)\s*(\d+)$/);
if (comparisonMatch)
{
const operator = comparisonMatch[1];
const number = parseFloat(comparisonMatch[2]);
comparisons.push({ operator, number });
}
else if (term.startsWith('!'))
{
const excludeTerm = term.substring(1).trim().replace(/\*/g, '.*');
excludeTerms.push(new RegExp(excludeTerm, 'i'));
}
else
{
const includeTerm = term.replace(/\*/g, '.*');
orRegexes.push(new RegExp(includeTerm, 'i'));
}
});
if (orRegexes.length > 0)
{
includeGroups.push(orRegexes);
}
});
return { includeGroups, excludeTerms, comparisons };
}
export function defaultHeaderFilter(headerValue, rowValue)
{
const { includeGroups, excludeTerms, comparisons } = parseFilterExpression(headerValue);
const includes = includeGroups.every(group =>
group.some(regex => regex.test(rowValue))
);
const excludes = excludeTerms.every(regex => !regex.test(rowValue));
const comparisonCheck = comparisons.every(({ operator, number }) => {
let value = rowValue;
if (!isNaN(number) && typeof number !== 'boolean')
{
value = parseFloat(rowValue);
if (isNaN(value)) return false;
}
switch (operator) {
case '<':
return value < number;
case '>':
return value > number;
case '<=':
return value <= number;
case '>=':
return value >= number;
case '=':
return value === number;
case '!=':
return value !== number;
default:
return false;
}
});
return includes && excludes && comparisonCheck;
}
@@ -0,0 +1,125 @@
function parseFilterExpression(expression)
{
const collections = [];
try {
const orParts = expression.split('||').map(part => part.trim());
orParts.forEach(part => {
const andParts = part.split('&&').map(p => p.trim());
const collection = { positives: [], negatives: [] };
andParts.forEach(term => {
const comparisonMatch = term.match(/^(<=|>=|<|>|=|!=)\s*(\d+(?:[.,]\d+)?)$/);
if (comparisonMatch)
{
const operator = comparisonMatch[1];
const numberStr = comparisonMatch[2].replace(',', '.');
const number = parseFloat(numberStr);
collection.positives.push({ type: 'comparison', operator, number });
}
else if (term.startsWith('!'))
{
const excludeTerm = term.substring(1).trim().replace(/\*/g, '.*');
collection.negatives.push({ type: 'regex', regex: new RegExp(excludeTerm, 'i') });
}
else
{
const includeTerm = term.replace(/\*/g, '.*');
collection.positives.push({ type: 'regex', regex: new RegExp(includeTerm, 'i') });
}
});
collections.push(collection);
});
} catch (e) {}
return collections;
}
export function extendedHeaderFilter(headerValue, rowValue)
{
if (typeof headerValue === 'boolean')
{
return rowValue === headerValue;
}
const collections = parseFilterExpression(headerValue);
try {
return collections.some(collection => {
let positives = collection.positives.length === 0 || collection.positives.every(condition => {
if (condition.type === 'comparison')
{
let value = parseFloat(rowValue);
if (isNaN(value)) return false;
switch (condition.operator) {
case '<':
return value < condition.number;
case '>':
return value > condition.number;
case '<=':
return value <= condition.number;
case '>=':
return value >= condition.number;
case '=':
return value === condition.number;
case '!=':
return value !== condition.number;
default:
return false;
}
}
else if (condition.type === 'regex')
{
return condition.regex.test(rowValue);
}
return false;
});
let negatives = collection.negatives.every(condition => {
return !condition.regex.test(rowValue);
});
return positives && negatives;
});
} catch (e) {
}
}
export function tagHeaderFilter(headerValue, rowValue) {
let data;
try {
data = typeof rowValue === 'string' ? JSON.parse(rowValue) : rowValue;
} catch (error) {
return false;
}
let combinedText;
if (Array.isArray(data))
{
combinedText = data
.map(item => `${item?.beschreibung} ${item?.notiz}`)
.join(' ');
}
else if (typeof data === 'object' && data !== null)
{
combinedText = `${data?.beschreibung} ${data?.notiz}`;
}
else
{
combinedText = String(data);
}
return extendedHeaderFilter(headerValue, combinedText)
}
+26 -7
View File
@@ -40,7 +40,7 @@ switch($method)
]);
break;
}
if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis']))
if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis'], null, $faktor['lehrform_kurzbz']))
{
echo json_encode([
'status' => 'error',
@@ -49,12 +49,22 @@ switch($method)
break;
}
$result = $lv_faktor->addFaktor($faktor['lv_id'], $faktor['faktor'], $faktor['von'], $faktor['bis']);
$newFaktor = new lehrveranstaltung_faktor();
$newFaktor->lehrveranstaltung_id = $faktor['lv_id'];
$newFaktor->faktor = $faktor['faktor'];
$newFaktor->studiensemester_kurzbz_von = $faktor['von'];
$newFaktor->studiensemester_kurzbz_bis = $faktor['bis'];
$newFaktor->lehrform_kurzbz = $faktor['lehrform_kurzbz'];
$newFaktor->insertvon = get_uid();
$result = $newFaktor->save(true);
echo json_encode($result);
}
break;
case 'updateFaktor':
$faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ;
if ($faktor !== '')
{
if (vonHigherThanBis($faktor['von'], $faktor['bis']))
@@ -65,7 +75,7 @@ switch($method)
]);
break;
}
if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis'], $faktor['id']))
if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis'], $faktor['id'], $faktor['lehrform_kurzbz']))
{
echo json_encode([
'status' => 'error',
@@ -74,7 +84,15 @@ switch($method)
break;
}
$result = $lv_faktor->updateFaktor($faktor['id'], $faktor['faktor'], $faktor['von'], $faktor['bis']);
$updateFaktor = new lehrveranstaltung_faktor();
$updateFaktor->lehrveranstaltung_faktor_id = $faktor['id'];
$updateFaktor->faktor = $faktor['faktor'];
$updateFaktor->studiensemester_kurzbz_von = $faktor['von'];
$updateFaktor->studiensemester_kurzbz_bis = $faktor['bis'];
$updateFaktor->lehrform_kurzbz = $faktor['lehrform_kurzbz'];
$updateFaktor->updatevon = get_uid();
$updateFaktor->updateamum = date('Y-m-d H:i:s');
$result = $updateFaktor->save();
echo json_encode($result);
}
break;
@@ -99,11 +117,12 @@ function isRightType($lv_id)
return false;
}
function exists($lv_id, $von, $bis, $id = null)
function exists($lv_id, $von, $bis, $id = null, $lehrform_kurzbz = null)
{
$lv_faktor = new lehrveranstaltung_faktor();
$lv_faktor->loadByLV($lv_id, $von, $bis, $id);
return !empty($lv_faktor->lv_faktoren);
$lehrform_kurzbz = $lehrform_kurzbz === ' - ' ? null : $lehrform_kurzbz;
return $lv_faktor->checkIfExists($lv_id, $von, $bis, $id, $lehrform_kurzbz);
}
function vonHigherThanBis($von, $bis)
+2 -1
View File
@@ -71,6 +71,7 @@ require_once('dbupdate_3.4/41950_perm_gehaelter.php');
require_once('dbupdate_3.4/53903_valorisierung.php');
require_once('dbupdate_3.4/55968_index_anrechnung.php');
require_once('dbupdate_3.4/25999_locale_update.php');
require_once('dbupdate_3.4/55289_pep_fine_tuning.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -270,7 +271,7 @@ $tabellen=array(
"lehre.tbl_zeitfenster" => array("wochentag","stunde","ort_kurzbz","studiengang_kz","gewicht"),
"lehre.tbl_zeugnis" => array("zeugnis_id","student_uid","zeugnis","erstelltam","gedruckt","titel","bezeichnung","updateamum","updatevon","insertamum","insertvon","ext_id"),
"lehre.tbl_zeugnisnote" => array("lehrveranstaltung_id","student_uid","studiensemester_kurzbz","note","uebernahmedatum","benotungsdatum","bemerkung","updateamum","updatevon","insertamum","insertvon","ext_id","punkte"),
"lehre.tbl_lehrveranstaltung_faktor" => array("lehrveranstaltung_faktor_id", "lehrveranstaltung_id","faktor","studiensemester_kurzbz_von","studiensemester_kurzbz_bis","insertamum","insertvon","updateamum","updatevon"),
"lehre.tbl_lehrveranstaltung_faktor" => array("lehrveranstaltung_faktor_id", "lehrveranstaltung_id","faktor", "lehrform_kurzbz", "studiensemester_kurzbz_von","studiensemester_kurzbz_bis","insertamum","insertvon","updateamum","updatevon"),
"public.ci_apikey" => array("apikey_id","key","level","ignore_limits","date_created"),
"public.tbl_adresse" => array("adresse_id","person_id","name","strasse","plz","ort","gemeinde","nation","typ","heimatadresse","zustelladresse","firma_id","updateamum","updatevon","insertamum","insertvon","ext_id","rechnungsadresse","anmerkung", "co_name"),
"public.tbl_adressentyp" => array("adressentyp_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig", "sort"),
+13
View File
@@ -78,3 +78,16 @@ if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_lehrv
}
}
if(!@$db->db_query("SELECT lehrform_kurzbz FROM lehre.tbl_lehrveranstaltung_faktor LIMIT 1"))
{
$qry = "ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD COLUMN lehrform_kurzbz varchar(8);
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_lehrform_kurzbz FOREIGN KEY (lehrform_kurzbz) REFERENCES lehre.tbl_lehrform (lehrform_kurzbz) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor DROP CONSTRAINT fk_lehrveranstaltung_faktor_lehrveranstaltung_id;
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_lehrveranstaltung_id FOREIGN KEY (lehrveranstaltung_id) REFERENCES lehre.tbl_lehrveranstaltung (lehrveranstaltung_id) ON DELETE CASCADE ON UPDATE CASCADE;
";
if(!$db->db_query($qry))
echo '<strong>lehre.tbl_lehrveranstaltung_faktor '.$db->db_last_error().'</strong><br>';
else
echo '<br>Spalte lehrform_kurzbz zu Tabelle lehre.tbl_lehrveranstaltung_faktor hinzugefügt';
}
@@ -0,0 +1,16 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// system.tbl_berechtigung: add berechtigung addons/reports:begrenzt
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz='addon/reports:begrenzt'"))
{
if($db->db_num_rows($result)==0)
{
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('addon/reports:begrenzt', 'Reports nur über Direktlink aufrufbar');";
if(!$db->db_query($qry))
echo '<strong>Berechtigung: '.$db->db_last_error().'</strong><br>';
else
echo '<br>Neue Berechtigung addon/reports:begrenzt zu system.tbl_berechtigung hinzugefügt';
}
}
+120
View File
@@ -1233,6 +1233,26 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'global',
'phrase' => 'create',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anlegen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Create',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'global',
@@ -1815,6 +1835,26 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'filterdelete',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Filter löschen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Clear filter',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -24891,6 +24931,86 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'notiz',
'phrase' => 'tag_rueckgaengig',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Rückgängig',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Undo',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'notiz',
'phrase' => 'tag_erledigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Erledigt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Done',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'notiz',
'phrase' => 'tag_verfasser',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'angelegt von {0} am {1}',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Created by {0} on {1}',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'notiz',
'phrase' => 'tag_bearbeiter',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'bearbeitet von {0} am {1}',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Edited by {0} on {1}',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
+3 -4
View File
@@ -1331,9 +1331,6 @@ if ($result_lv!=0)
echo '<td>
<a href="'.$_SERVER['PHP_SELF'].'?delete_lvid='.$row->lehrveranstaltung_id.'&stg_kz='.$stg_kz.'&semester='.$semester.'&fachbereich_kurzbz='.$oe_fachbereich.'&isaktiv='.$isaktiv.'&oe_kurzbz='.$oe_kurzbz.'&orgform='.$orgform_kurzbz.'" onclick="return conf_del()">löschen</a>
';
if (in_array($row->lehrtyp_kurzbz, array("tpl", "lv")))
echo '<br /><a href="lehrveranstaltung_faktor.php?lehrveranstaltung_id='.$db->convert_html_chars($row->lehrveranstaltung_id).'" target="lv_detail">Faktor</a>';
echo '</td>';
echo '
<td nowrap>';
@@ -1341,7 +1338,9 @@ if ($result_lv!=0)
$lv_faktor = new lehrveranstaltung_faktor();
$lv_faktor->getAkt($row->lehrveranstaltung_id);
echo $lv_faktor->faktor.'</td>';
if (in_array($row->lehrtyp_kurzbz, array("tpl", "lv")))
echo '<a href="lehrveranstaltung_faktor.php?lehrveranstaltung_id='.$db->convert_html_chars($row->lehrveranstaltung_id).'" target="lv_detail">Bearbeiten</a>';
echo '</td>';
echo "</tr>\n";
}
}
+24 -1
View File
@@ -6,6 +6,7 @@ require_once('../../include/phrasen.class.php');
require_once('../../include/lehrveranstaltung.class.php');
require_once('../../include/lehrveranstaltung_faktor.class.php');
require_once('../../include/studiensemester.class.php');
require_once('../../include/lehrform.class.php');
$uid = get_uid();
$rechte = new benutzerberechtigung();
@@ -38,12 +39,14 @@ echo '<!DOCTYPE HTML>
var row = $(this).closest('tr');
var id = row.data('id');
var faktor = row.find('.faktor').text();
var lehrform = row.find('.lehrform').text();
var von = row.find('.von').text();
var bis = row.find('.bis').text();
$('#action').val('edit');
$('#id').val(id);
$('#faktor').val(faktor);
$('#lehrform').val(lehrform);
$('#von').val(von);
$('#bis').val(bis);
});
@@ -63,12 +66,14 @@ echo '<!DOCTYPE HTML>
var id = $('#id').val();
var faktor = $('#faktor').val();
var lehrform = $('#lehrform').val();
var von = $('#von').val();
var bis = $('#bis').val();
var lv_id = $('#lv_id').val();
var formData = {
faktor: faktor,
lehrform_kurzbz: lehrform,
von: von,
bis: bis,
lv_id: lv_id
@@ -132,6 +137,7 @@ echo '<!DOCTYPE HTML>
{
var row = $('#faktorTable tbody tr[data-id="' + formData.id + '"]');
row.find('.faktor').text(formData.faktor);
row.find('.lehrform').text(formData.lehrform_kurzbz);
row.find('.von').text(formData.von);
row.find('.bis').text(formData.bis);
@@ -189,6 +195,7 @@ echo '<!DOCTYPE HTML>
var row = tr
.append(
$('<td>').text(faktor.faktor).addClass('faktor'),
$('<td>').text(faktor.lehrform_kurzbz || "").addClass('lehrform'),
$('<td>').text(faktor.von).addClass('von'),
$('<td>').text(faktor.bis).addClass('bis'),
$('<td>').append(editButton).addClass('edit'),
@@ -232,6 +239,9 @@ $faktor->loadByLV($lv->lehrveranstaltung_id);
$studiensemester = new studiensemester();
$studiensemester->getAll('desc');
$lehrform = new lehrform();
$lehrform->getAll();
echo '
</head>
@@ -267,6 +277,17 @@ echo '
echo '
</select>
<label for="lehrform">Lehrform</label>
<select id="lehrform" name="lehrform">
<option value="">---keine Auswahl---</option>';
foreach ($lehrform->lehrform as $lehrform)
{
echo '<option value="'.$lehrform->lehrform_kurzbz.'">'.$lehrform->lehrform_kurzbz . ' ' . $lehrform->bezeichnung.'</option>';
}
echo '
</select>
<button type="submit">'.$p->t('global/speichern').'</button>
<span id="success_message_save" class="alert alert-success" style="display:none;">'. $p->t('global/erfolgreichgespeichert') . '</span>
<span id="success_message_delete" class="alert alert-success" style="display:none;">'. $p->t('global/erfolgreichgelöscht') . '</span>
@@ -275,7 +296,8 @@ echo '
<table class="tablesorter" id="faktorTable">
<thead>
<tr>
<th>'.$p->t('lv/faktor').'</th>
<th>'.$p->t('lvaliste/faktor').'</th>
<th>'.$p->t('lvaliste/lehrform').'</th>
<th>'.$p->t('global/von').'</th>
<th>'.$p->t('global/bis').'</th>
<th>'.$p->t('global/bearbeiten').'</th>
@@ -291,6 +313,7 @@ if(count($faktor->lv_faktoren) > 0)
{
echo "<tr data-id=". $lv_faktor->lehrveranstaltung_faktor_id .">
<td class='faktor'>".$lv_faktor->faktor."</td>
<td class='lehrform'>".$lv_faktor->lehrform_kurzbz."</td>
<td class='von'>".$lv_faktor->studiensemester_kurzbz_von."</td>
<td class='bis'>".$lv_faktor->studiensemester_kurzbz_bis."</td>
<td><button class='edit'>".$p->t('global/bearbeiten')."</button></td>