diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 6f6cef31b..10e54780e 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -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;
+ }
+
}
\ No newline at end of file
diff --git a/include/lehrveranstaltung_faktor.class.php b/include/lehrveranstaltung_faktor.class.php
index 49459321b..b61ce907d 100644
--- a/include/lehrveranstaltung_faktor.class.php
+++ b/include/lehrveranstaltung_faktor.class.php
@@ -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
";
diff --git a/locale/de-AT/lvaliste.php b/locale/de-AT/lvaliste.php
index e51ddcbf5..5f57dd27c 100644
--- a/locale/de-AT/lvaliste.php
+++ b/locale/de-AT/lvaliste.php
@@ -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';
diff --git a/locale/en-US/lvaliste.php b/locale/en-US/lvaliste.php
index 4560a4182..d94f41c81 100644
--- a/locale/en-US/lvaliste.php
+++ b/locale/en-US/lvaliste.php
@@ -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';
diff --git a/public/js/TableWidget.js b/public/js/TableWidget.js
index ec93422fc..4fa89aa0b 100644
--- a/public/js/TableWidget.js
+++ b/public/js/TableWidget.js
@@ -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
diff --git a/public/js/components/Tag/Tag.js b/public/js/components/Tag/Tag.js
index b1bf33dbd..c7552a5a9 100644
--- a/public/js/components/Tag/Tag.js
+++ b/public/js/components/Tag/Tag.js
@@ -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: `
@@ -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') }}
-
+
diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js
index aa6d29a09..9c2a13529 100644
--- a/public/js/components/filter/Filter.js
+++ b/public/js/components/filter/Filter.js
@@ -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: `
+
+
+
diff --git a/public/js/tabulator/filters/Dates.js b/public/js/tabulator/filters/Dates.js
index 7c9f268f0..429d63e1a 100644
--- a/public/js/tabulator/filters/Dates.js
+++ b/public/js/tabulator/filters/Dates.js
@@ -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: ``
+ template: `
+ `
}).use(primevue.config.default).mount(div);
return div;
}
-
-export { dateFilter as 'dateFilter' };
+export { dateFilter };
\ No newline at end of file
diff --git a/public/js/tabulator/filters/defaultHeaderFilter.js b/public/js/tabulator/filters/defaultHeaderFilter.js
deleted file mode 100644
index facce437a..000000000
--- a/public/js/tabulator/filters/defaultHeaderFilter.js
+++ /dev/null
@@ -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;
-}
diff --git a/public/js/tabulator/filters/extendedHeaderFilter.js b/public/js/tabulator/filters/extendedHeaderFilter.js
new file mode 100644
index 000000000..d8ead88bc
--- /dev/null
+++ b/public/js/tabulator/filters/extendedHeaderFilter.js
@@ -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)
+}
+
diff --git a/soap/lehrveranstaltung_faktor.json.php b/soap/lehrveranstaltung_faktor.json.php
index 49f13ac47..c182e0f70 100644
--- a/soap/lehrveranstaltung_faktor.json.php
+++ b/soap/lehrveranstaltung_faktor.json.php
@@ -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)
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index f43240797..d007c04f6 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -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 'Pruefe Tabellen und Attribute!
';
@@ -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"),
diff --git a/system/dbupdate_3.4/40717_lv_faktor.php b/system/dbupdate_3.4/40717_lv_faktor.php
index c304e292d..0e3b3d9bc 100644
--- a/system/dbupdate_3.4/40717_lv_faktor.php
+++ b/system/dbupdate_3.4/40717_lv_faktor.php
@@ -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 'lehre.tbl_lehrveranstaltung_faktor '.$db->db_last_error().'
';
+ else
+ echo '
Spalte lehrform_kurzbz zu Tabelle lehre.tbl_lehrveranstaltung_faktor hinzugefügt';
+}
\ No newline at end of file
diff --git a/system/dbupdate_3.4/55289_pep_fine_tuning.php b/system/dbupdate_3.4/55289_pep_fine_tuning.php
new file mode 100644
index 000000000..00a236a68
--- /dev/null
+++ b/system/dbupdate_3.4/55289_pep_fine_tuning.php
@@ -0,0 +1,16 @@
+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 'Berechtigung: '.$db->db_last_error().'
';
+ else
+ echo '
Neue Berechtigung addon/reports:begrenzt zu system.tbl_berechtigung hinzugefügt';
+ }
+}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index d92127cde..acb7a12e6 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -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',
diff --git a/vilesci/lehre/lehrveranstaltung.php b/vilesci/lehre/lehrveranstaltung.php
index 2b3346d02..25fe143b6 100644
--- a/vilesci/lehre/lehrveranstaltung.php
+++ b/vilesci/lehre/lehrveranstaltung.php
@@ -1331,9 +1331,6 @@ if ($result_lv!=0)
echo '
löschen
';
-
- if (in_array($row->lehrtyp_kurzbz, array("tpl", "lv")))
- echo ' Faktor';
echo ' | ';
echo '
';
@@ -1341,7 +1338,9 @@ if ($result_lv!=0)
$lv_faktor = new lehrveranstaltung_faktor();
$lv_faktor->getAkt($row->lehrveranstaltung_id);
- echo $lv_faktor->faktor.' | ';
+ if (in_array($row->lehrtyp_kurzbz, array("tpl", "lv")))
+ echo 'Bearbeiten';
+ echo '';
echo "\n";
}
}
diff --git a/vilesci/lehre/lehrveranstaltung_faktor.php b/vilesci/lehre/lehrveranstaltung_faktor.php
index a9ad051d0..dc5387719 100644
--- a/vilesci/lehre/lehrveranstaltung_faktor.php
+++ b/vilesci/lehre/lehrveranstaltung_faktor.php
@@ -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 '
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 '
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 '
{
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 '
var row = tr
.append(
$('').text(faktor.faktor).addClass('faktor'),
+ $(' | ').text(faktor.lehrform_kurzbz || "").addClass('lehrform'),
$(' | ').text(faktor.von).addClass('von'),
$(' | ').text(faktor.bis).addClass('bis'),
$(' | ').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 '
@@ -267,6 +277,17 @@ echo '
echo '
+
+
'. $p->t('global/erfolgreichgespeichert') . '
'. $p->t('global/erfolgreichgelöscht') . '
@@ -275,7 +296,8 @@ echo '
- | '.$p->t('lv/faktor').' |
+ '.$p->t('lvaliste/faktor').' |
+ '.$p->t('lvaliste/lehrform').' |
'.$p->t('global/von').' |
'.$p->t('global/bis').' |
'.$p->t('global/bearbeiten').' |
@@ -291,6 +313,7 @@ if(count($faktor->lv_faktoren) > 0)
{
echo "
| ".$lv_faktor->faktor." |
+ ".$lv_faktor->lehrform_kurzbz." |
".$lv_faktor->studiensemester_kurzbz_von." |
".$lv_faktor->studiensemester_kurzbz_bis." |
|
|