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: `
+ +
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 ' + + @@ -275,7 +296,8 @@ echo ' - + + @@ -291,6 +313,7 @@ if(count($faktor->lv_faktoren) > 0) { 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').'
".$lv_faktor->faktor."".$lv_faktor->lehrform_kurzbz." ".$lv_faktor->studiensemester_kurzbz_von." ".$lv_faktor->studiensemester_kurzbz_bis."