Compare commits

..
Author SHA1 Message Date
Harald Bamberger 893552357f Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-13 07:57:53 +02:00
Harald Bamberger 7ffb1ab90f Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-12 17:55:01 +02:00
Harald Bamberger 355f7220fe Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-12 17:14:28 +02:00
Harald Bamberger e818bc5e4d Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-12 14:26:11 +02:00
Harald Bamberger dc4939ee78 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-12 11:38:22 +02:00
Harald Bamberger e2c2339f89 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-12 10:33:36 +02:00
Harald Bamberger 68482a429e Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-12 09:38:22 +02:00
Harald Bamberger 6f4482cff4 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-09 13:17:02 +02:00
Harald Bamberger 9e2a818eab Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-06 15:35:02 +02:00
Harald Bamberger 3214ae3101 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-06 14:20:21 +02:00
Harald Bamberger 5313693651 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-05 18:32:04 +02:00
Harald Bamberger 8db60c67f8 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-05 13:11:41 +02:00
Harald Bamberger 65c931ea2d Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-10-01 12:44:52 +02:00
Harald Bamberger 762fd1cadd update demo datenstand 2026-09-30 16:20:15 +02:00
Harald Bamberger 9feb442a07 Merge branch 'cis40_2026-09_ma_rc' into demo-cis40 2026-09-30 16:14:03 +02:00
Harald Bamberger 0ce4acc71b Merge branch 'master' into demo-cis40 2026-08-21 14:10:33 +02:00
Harald Bamberger 33038f409a Merge branch 'cis40_2026-05_ma_rc_routerlink_ma0080' into demo-cis40 2026-08-21 11:44:17 +02:00
Harald Bamberger f8cea9036c Merge branch 'cis40_2026-05_ma_rc_routerlink_ma0080' into demo-cis40 2026-08-21 08:45:25 +02:00
Harald Bamberger 759aad047b Merge branch 'cis40_2026-05_ma_rc_routerlink' into demo-cis40 2026-07-06 15:33:02 +02:00
Harald Bamberger fd0262f708 Merge branch 'cis40_2026-05_ma_rc_routerlink' into demo-cis40 2026-07-06 10:53:15 +02:00
Harald Bamberger 16689f4d6e Merge branch 'cis40_2026-05_ma_rc_routerlink' into demo-cis40 2026-07-03 18:11:59 +02:00
Harald Bamberger 0bd75716f2 Merge branch 'cis40_2026-05_ma_rc_routerlink' into demo-cis40 2026-07-03 16:51:32 +02:00
Harald Bamberger 9782fe5459 Merge branch 'cis40_2026-05_ma_rc_routerlink' into demo-cis40 2026-07-03 14:36:49 +02:00
Harald Bamberger e110e8fa57 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-07-01 13:04:44 +02:00
Harald Bamberger 76b9c6781d Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-06-26 15:17:42 +02:00
Harald Bamberger 856706bc1c Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-06-26 15:17:27 +02:00
Harald Bamberger d54747c4df Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-06-24 15:52:23 +02:00
Harald Bamberger da3b329772 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-06-24 15:42:16 +02:00
Harald Bamberger 41d40102f3 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-06-22 15:26:48 +02:00
Harald Bamberger 1496045c40 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-06-18 13:46:21 +02:00
Harald Bamberger e2dadcd208 Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-06-18 13:23:49 +02:00
Harald Bamberger 070ac1e878 override permission for all methods not only the overwritten ones 2026-06-15 14:37:43 +02:00
Harald Bamberger 63ff8dd4c4 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-29 13:40:02 +02:00
Harald Bamberger 366edb7e90 Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-26 11:01:57 +02:00
Harald Bamberger 9430135592 Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-26 09:40:11 +02:00
Harald Bamberger 199b62d13f Merge branch 'studvw_2026_05_rc' into demo-cis40 2026-05-26 09:07:04 +02:00
Harald Bamberger b0fc5a3618 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-22 10:37:30 +02:00
Harald Bamberger 6e599908cd Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-19 17:30:14 +02:00
Harald Bamberger b1be5a4ba4 Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-19 17:12:55 +02:00
Harald Bamberger 71f68da90b Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-19 16:52:36 +02:00
Harald Bamberger c11fd03362 Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-19 16:42:43 +02:00
Harald Bamberger ec1422a136 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-19 16:18:06 +02:00
Harald Bamberger 89e98056e6 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-19 16:12:31 +02:00
Harald Bamberger 5cf14aa886 Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-19 10:28:32 +02:00
Harald Bamberger 9ee6a0a01a Merge branch 'studvw_2026_05_rc_tags' into demo-cis40 2026-05-19 09:51:42 +02:00
Harald Bamberger 6d26ec2ab7 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-18 16:51:33 +02:00
Harald Bamberger 0a18fcf732 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-13 21:11:36 +02:00
Harald Bamberger e08b731cb5 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-12 11:05:28 +02:00
Harald Bamberger d1a4cfd5df Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-11 13:55:07 +02:00
Harald Bamberger 37b70861d1 update date of use db data 2026-05-07 15:34:53 +02:00
Harald Bamberger 150d54eeda Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-07 14:02:19 +02:00
Harald Bamberger 68b26a1091 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-06 18:36:48 +02:00
Harald Bamberger 5c371a20d2 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-06 18:32:35 +02:00
Harald Bamberger d42157c5f8 Merge branch 'cis40_2026-05_ma_rc' into demo-cis40 2026-05-06 18:19:53 +02:00
Harald Bamberger 502851856b Merge branch 'studvw_2026_05_rc' into demo-cis40 2026-05-06 17:57:36 +02:00
Harald Bamberger 4b767d4a57 Merge branch 'vv_und_studvw_2026_02_rc4_ma0080' into demo-cis40 2026-03-10 08:42:20 +01:00
Harald Bamberger 5d461a72f6 Merge branch 'vv_und_studvw_2026_02_rc4_ma0080' into demo-cis40 2026-03-09 12:11:14 +01:00
Harald Bamberger 942b4512fe Merge branch 'vv_und_studvw_2026_02_rc4_ma0080' into demo-cis40 2026-03-04 18:57:47 +01:00
Harald Bamberger 3778b27574 Datenstand 12.02.2026 2026-03-04 18:31:13 +01:00
Harald Bamberger 15b340db56 Merge branch 'vv_und_studvw_2026_02_rc4_ma0080' into demo-cis40 2026-03-04 17:58:14 +01:00
Andreas Österreicher 05838cc477 Merge branch 'master' into demo-cis40 2026-01-21 16:35:41 +01:00
Andreas Österreicher 96e02c9911 Merge branch 'epic-56039/LV-Evaluierung' into demo-cis40 2026-01-20 10:55:13 +01:00
Andreas Österreicher 248fceb4b5 Merge branch 'epic-56039/LV-Evaluierung' into demo-cis40 2026-01-20 10:34:10 +01:00
Harald Bamberger 92697d9468 Merge branch 'epic-56039/LV-Evaluierung' into demo-cis40 2026-01-12 16:30:15 +01:00
Harald Bamberger d1ec9c92eb Merge branch 'master' into demo-cis40 2026-01-12 16:10:13 +01:00
Harald Bamberger 454cf5ea64 Merge branch 'studvw_2025-12_rc3' into demo-cis40 2025-12-10 15:36:30 +01:00
Harald Bamberger 4563533e67 Merge branch 'feature-69570/StudVw_Filter_broken' into demo-cis40 2025-12-04 08:43:40 +01:00
Harald Bamberger 640e719eda Merge branch 'feature-69438/FHC4_Studierendenverwaltung/FeedbackPunkte' into demo-cis40 2025-12-02 09:46:25 +01:00
Harald Bamberger aece2b1d90 Merge branch 'feature-69065/Projektarbeiten_Firmen_verwalten' into demo-cis40 2025-11-28 11:16:24 +01:00
Harald Bamberger cb13655ecd Merge branch 'master' into demo-cis40 2025-11-24 17:14:14 +01:00
Harald Bamberger 9b3b6cec8f Merge branch 'feature-69388/Pruefung_API_insert_Propleme' into demo-cis40 2025-11-24 16:27:06 +01:00
Harald Bamberger 3ca1a1f1c7 Merge branch 'feature-69388/Pruefung_API_insert_Propleme' into demo-cis40 2025-11-24 09:48:38 +01:00
Harald Bamberger a7210208d6 Merge branch 'studvw_2025-11_rc2' into demo-cis40 2025-11-24 09:42:45 +01:00
Harald Bamberger eaad23ff69 Merge branch 'feature-69388/Pruefung_API_insert_Propleme' into demo-cis40 2025-11-21 12:30:37 +01:00
Harald Bamberger c7ddf0a2a9 Merge branch 'studvw_2025-11_rc2' into demo-cis40 2025-11-21 10:56:32 +01:00
Harald Bamberger b129ef873b Merge branch 'master' into demo-cis40 2025-11-18 16:46:11 +01:00
Harald Bamberger d927426d70 Merge branch 'master' into demo-cis40 2025-11-14 11:40:48 +01:00
Harald Bamberger 9ced137ded Merge branch 'studvw_2025-11_rc' into demo-cis40 2025-11-11 13:18:13 +01:00
Harald Bamberger a89da50e0a add missing comma 2025-11-10 13:08:36 +01:00
Harald Bamberger 9256046b6c Merge branch 'feature-67518/Studierendenverwaltung_Karteireiter_anzeigen_verstecken_wenn_Interessent_gewaehlt' into demo-cis40 2025-11-10 13:05:32 +01:00
Harald Bamberger fd95dd8023 Merge branch 'feature-63443/Studierendenverwaltung_Tab_Abschlusspruefung_Finetuning' into demo-cis40 2025-11-10 10:58:41 +01:00
Harald Bamberger cda2b84939 Merge branch 'feature-68738/FHC4_Studierendenverwaltung_Studentlist_Export' into demo-cis40 2025-11-10 09:28:36 +01:00
Harald Bamberger d893fe63e7 Merge branch 'master' into demo-cis40 2025-11-05 17:15:02 +01:00
Harald Bamberger 5aedf85982 Merge branch 'master' into demo-cis40 2025-11-05 16:52:01 +01:00
Harald Bamberger 55ab79c004 Merge branch 'master' into demo-cis40 2025-11-05 16:32:54 +01:00
Harald Bamberger 7c7a72600d Merge branch 'master' into demo-cis40 2025-11-05 16:18:00 +01:00
Harald Bamberger 01357654c0 Merge branch 'feature-67490/studstatus_suche_abort_controller_haengt' into demo-cis40 2025-11-05 11:03:40 +01:00
Harald Bamberger cd5900481b Merge branch 'feature-68745/Menue_zur_Verlinkung_von_Apps' into demo-cis40 2025-11-04 13:12:56 +01:00
Harald Bamberger ddef97d49f Merge branch 'master' into demo-cis40 2025-11-03 15:35:39 +01:00
Harald Bamberger 47b0449f22 Merge branch 'feature-68745/Menue_zur_Verlinkung_von_Apps' into demo-cis40 2025-10-29 07:41:17 +01:00
Harald Bamberger 0193460678 Merge branch 'master' into demo-cis40 2025-10-16 15:41:06 +02:00
Harald Bamberger e02b3e78d2 Merge branch 'master' into demo-cis40 2025-10-14 10:41:07 +02:00
Harald Bamberger c91e0a6b74 Merge branch 'feature-68390/Studierendenverwaltung-Details_Header_und_Tabsnav_nicht_mitscrollen' into demo-cis40 2025-10-01 18:47:36 +02:00
Harald Bamberger c6852a9514 Merge branch 'feature-63445/Studierendenverwaltung_Filter' into demo-cis40 2025-10-01 18:12:07 +02:00
Harald Bamberger 04b5240615 Merge branch 'master' into demo-cis40 2025-10-01 17:46:28 +02:00
Harald Bamberger 483547cd9c Merge branch 'feature-63394/StV_Favoriten_64_Zeichen_Variablenbeschraenkung' into demo-cis40 2025-09-30 16:37:34 +02:00
Harald Bamberger 345413cd1f change display date of database dump 2025-09-30 14:15:16 +02:00
Harald Bamberger 046a60b89c Merge branch 'master' into demo-cis40 2025-09-30 13:26:17 +02:00
Harald Bamberger da725e3ab1 Merge branch 'feature-63444/stv_mehrfachaktion_mail_an_private_oder_interne_adresse' into demo-cis40 2025-09-29 17:40:26 +02:00
Harald Bamberger edd34941cc Merge branch 'feature-61232/Studierendenverwaltung_Karteireiter_Projektarbeit_portieren' into demo-cis40 2025-09-29 16:57:10 +02:00
Harald Bamberger c65686ef42 Merge branch 'feature-63373/FHC4_Studierendenverwaltung_Dokumente_erstellen' into demo-cis40 2025-09-29 13:53:30 +02:00
Harald Bamberger c7729f85df Merge branch 'master' into demo-cis40 2025-09-29 08:09:33 +02:00
Harald Bamberger 53b187c9b6 Merge branch 'feature-63435/Studierendenverwaltung_Studierende_Verbandsgruppen_und_Spezialgruppen_zuordnen_Multiaktion' into demo-cis40 2025-09-18 07:23:43 +02:00
Harald Bamberger 7bc18e41b1 Merge branch 'feature-63374/Studierendenverwaltung_International_Baum_Filter' into demo-cis40 2025-09-18 07:22:24 +02:00
Harald Bamberger 8bc17eded5 Merge branch 'master' into demo-cis40 2025-09-18 07:17:28 +02:00
Harald Bamberger 9adeb1c63a Merge branch 'master' into demo-cis40 2025-09-17 14:39:30 +02:00
Harald Bamberger 091ed0dacd Merge branch 'master' into demo-cis40 2025-09-17 14:16:05 +02:00
Harald Bamberger cf0a47cab7 Merge branch 'master' into demo-cis40 2025-08-19 17:36:09 +02:00
Harald Bamberger bb7b24346a Merge branch 'master' into demo-cis40 2025-08-19 17:20:43 +02:00
Harald Bamberger a68e2e798b Merge branch 'master' into demo-cis40 2025-08-19 16:08:13 +02:00
Harald Bamberger bd49f3c420 Merge branch 'master' into demo-cis40 2025-08-19 14:00:40 +02:00
Harald Bamberger 3c1d67267d Merge branch 'master' into demo-cis40 2025-08-19 13:53:28 +02:00
Harald Bamberger 61e1933a5b activate button new Student for demo-cis4 2025-08-19 13:33:39 +02:00
Harald Bamberger 25c443098c Merge branch 'master' into demo-cis40 2025-08-19 13:23:37 +02:00
Harald Bamberger 352c6e1d68 Merge branch 'master' into demo-cis40 2025-08-14 18:16:36 +02:00
Harald Bamberger 0e2444d7ce Merge branch 'feature-63411/Notizen_Anzahl_im_Tab_Header_anzeigen' into demo-cis40 2025-08-14 16:46:22 +02:00
Harald Bamberger c4390819a2 Merge branch 'feature-63411/Notizen_Anzahl_im_Tab_Header_anzeigen' into demo-cis40 2025-08-14 16:36:43 +02:00
Harald Bamberger 51104268d8 Merge branch 'feature-63411/Notizen_Anzahl_im_Tab_Header_anzeigen' into demo-cis40 2025-08-14 15:34:25 +02:00
Harald Bamberger cb5d43ab21 Merge branch 'master' into demo-cis40 2025-08-14 10:31:23 +02:00
Harald Bamberger 08de5cd377 Merge branch 'master' into demo-cis40 2025-08-13 18:48:08 +02:00
Harald Bamberger 274fa63658 Merge branch 'feature-62779/xul_abloese_haustechnik_schluesselverwaltung' into demo-cis40 2025-08-13 07:34:45 +02:00
Harald Bamberger 81b2ed6551 Merge branch 'merge_FHC4_55354_55991_55992_60874_60876_60875_61229_61230_61231' into demo-cis40 2025-08-13 07:05:21 +02:00
Harald Bamberger d9c6c3947b Merge branch 'feature-60973/komponente_fuer_lehrfaecherverteilung' into demo-cis40 2025-08-13 07:04:51 +02:00
Harald Bamberger 2d6dbbdb16 alter position and styling of demo info 2025-08-12 09:30:12 +02:00
Harald Bamberger b60faa1cab styling demo info 2025-08-12 09:24:09 +02:00
Harald Bamberger fd19953864 add demo info 2025-08-12 09:20:39 +02:00
Harald Bamberger 927bafd93a Merge branch 'master' into demo-cis40 2025-08-12 09:06:31 +02:00
Harald Bamberger d93b21f0af Merge branch 'master' into demo-cis40 2025-08-11 11:28:38 +02:00
Harald Bamberger 6a8f6fa05a Merge branch 'master' into demo-cis40 2025-08-06 12:17:25 +02:00
Harald Bamberger 7f997c9411 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 18:36:34 +02:00
Harald Bamberger 2e3f98deb0 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 16:34:44 +02:00
Harald Bamberger a5feb656e0 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 16:19:02 +02:00
Harald Bamberger 9329955328 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 13:29:03 +02:00
Harald Bamberger 5b99dd2685 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 12:21:03 +02:00
Harald Bamberger 19288fc8f5 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 12:00:03 +02:00
Andreas Österreicher 9f97de5952 Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 09:42:35 +02:00
Andreas Österreicher c476f7339c Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 09:31:18 +02:00
Harald Bamberger 3dc1cf520a Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 07:22:01 +02:00
Harald Bamberger 616c335a3b Merge branch 'rc1_FHC4_C4' into demo-cis40 2025-08-05 07:10:49 +02:00
16 changed files with 39 additions and 238 deletions
-3
View File
@@ -74,9 +74,6 @@ $config['tabs'] =
],
],
],
'hiddenFields' => [
'uhrzeit'
]
],
'exemptions' => [
//if true, Anrechnungen can be added and edited in tab Anrechnungen
@@ -379,8 +379,7 @@ class LvMenu extends FHCAPI_Controller
'name'=>$this->p->t('lehre', 'gesamtnote'),
'phrase' => 'lehre/gesamtnote',
'c4_icon'=> base_url('skin/images/button_endnote.png'),
'c4_link'=> base_url('cis.php/Cis/Compat/legacy/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
//'c4_link'=> site_url('Cis/Benotungstool/'.urlencode($lvid).'/'.urlencode($angezeigtes_stsem))
'c4_link'=> site_url('Cis/Benotungstool/'.urlencode($lvid).'/'.urlencode($angezeigtes_stsem))
//'c4_link'=> base_url('cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
//'c4_link'=> base_url('benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
);
@@ -32,6 +32,7 @@ class Funktionen extends FHCAPI_Controller
]);
// Load models
$this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model', 'ApiModel');
$this->load->model('ressource/Funktion_model', 'FunktionModel');
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
@@ -315,7 +315,6 @@ class Abschlusspruefung extends FHCAPI_Controller
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
'datum' => $formData['datum'], //TODO(Manu) check if minute format like FAS
'sponsion' => $formData['sponsion'],
'uhrzeit' => $formData['uhrzeit'],
'pruefer1' => $formData['pruefer1'],
'pruefer2' => $formData['pruefer2'],
'pruefer3' => $formData['pruefer3'],
@@ -388,7 +387,6 @@ class Abschlusspruefung extends FHCAPI_Controller
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
'datum' => $datum,
'sponsion' => $sponsion,
'uhrzeit' => $formData['uhrzeit'],
'pruefer1' => $pruefer1,
'pruefer2' => $pruefer2,
'pruefer3' => $pruefer3,
@@ -184,17 +184,10 @@ class Grades extends FHCAPI_Controller
{
$this->load->library('form_validation');
// a Note without Punkte clears old Punkte, else Note and Punkte contradict
$punkte = $this->input->post('punkte');
if (!(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) || trim((string) $punkte) === '')
$punkte = null;
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
$this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
$this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
// with Punkte the Notenschluessel gives the Note
$this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), $punkte === null ? 'required|numeric' : 'numeric');
$this->form_validation->set_rules('punkte', $this->p->t('stv', 'grades_points'), 'numeric|greater_than_equal_to[0]|less_than[10000]');
$this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), 'required|numeric');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
@@ -213,16 +206,6 @@ class Grades extends FHCAPI_Controller
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
// the Notenschluessel of the LV decides the Note for the Punkte
if ($punkte !== null) {
$this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel');
$note = $this->getDataOrTerminateWithError(
$this->NotenschluesselaufteilungModel->getNote($punkte, $lehrveranstaltung_id, $studiensemester_kurzbz)
);
if ($note === null)
$this->terminateWithValidationErrors(['punkte' => $this->p->t('stv', 'grades_error_noGradeForPoints')]);
}
$result = $this->ZeugnisnoteModel->load([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
@@ -237,7 +220,6 @@ class Grades extends FHCAPI_Controller
'lehrveranstaltung_id' => $lehrveranstaltung_id
], [
'note' => $note,
'punkte' => $punkte,
'benotungsdatum' => $now,
'updateamum' => $now,
'updatevon' => $authUID
@@ -248,7 +230,6 @@ class Grades extends FHCAPI_Controller
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'note' => $note,
'punkte' => $punkte,
'benotungsdatum' => $now,
'insertamum' => $now,
'insertvon' => $authUID
@@ -256,8 +237,7 @@ class Grades extends FHCAPI_Controller
}
$this->getDataOrTerminateWithError($result);
// the client shows the Note that the server saved
$this->terminateWithSuccess(['note' => $note, 'punkte' => $punkte]);
$this->terminateWithSuccess(true);
}
/**
@@ -26,13 +26,8 @@ class Notenschluesselzuordnung_model extends DB_Model
$this->db->where("lehrveranstaltung_id", $lehrveranstaltung_id);
if ($studiensemester_kurzbz) {
// without the group the OR matches each row without a semester, of any LV
$this->db->group_start();
$this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz);
$this->db->or_where("studiensemester_kurzbz", null);
$this->db->group_end();
// the row of the semester before the row without a semester (NULLS LAST)
$this->addOrder("studiensemester_kurzbz", "ASC");
} else {
$this->db->where("studiensemester_kurzbz", null);
}
@@ -70,12 +65,7 @@ class Notenschluesselzuordnung_model extends DB_Model
$this->addLimit(1);
if ($studiensemester_kurzbz) {
// IN ('X', NULL) never matches NULL
$this->db->group_start();
$this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz);
$this->db->or_where("studiensemester_kurzbz", null);
$this->db->group_end();
$this->addOrder("studiensemester_kurzbz", "ASC");
$this->db->where_in("studiensemester_kurzbz", [$studiensemester_kurzbz, null]);
$result = $this->load();
} else {
$result = $this->loadWhere([
+2 -3
View File
@@ -52,7 +52,7 @@ export default {
url: url
};
},
updateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, punkte = null, lehrveranstaltung_bezeichnung}) {
updateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {
return {
method: 'post',
url: 'api/frontend/v1/stv/grades/updateCertificate',
@@ -60,8 +60,7 @@ export default {
lehrveranstaltung_id,
student_uid,
studiensemester_kurzbz,
note,
punkte
note
}
};
},
+8 -11
View File
@@ -103,6 +103,13 @@ export default {
keyboard: this.keyboard
});
},
//to avoid pagelocks if more than one instance
beforeUnmount() {
if (this.modal) {
this.modal.dispose();
this.modal = null;
}
},
popup(body, options, title, footer) {
const BsModal = this,
slots = {};
@@ -157,17 +164,7 @@ export default {
});
});
},
template: `
<div
ref="modal"
class="bootstrap-modal modal"
tabindex="-1"
@[\`hide.bs.modal\`]="$emit('hideBsModal', $event)"
@[\`hidden.bs.modal\`]="$emit('hiddenBsModal', $event)"
@[\`hidePrevented.bs.modal\`]="$emit('hidePreventedBsModal', $event)"
@[\`show.bs.modal\`]="$emit('showBsModal', $event)"
@[\`shown.bs.modal\`]="$emit('shownBsModal', $event)"
>
template: `<div ref="modal" class="bootstrap-modal modal" tabindex="-1" @[\`hide.bs.modal\`]="$emit('hideBsModal')" @[\`hidden.bs.modal\`]="$emit('hiddenBsModal')" @[\`hidePrevented.bs.modal\`]="$emit('hidePreventedBsModal')" @[\`show.bs.modal\`]="$emit('showBsModal')" @[\`shown.bs.modal\`]="$emit('shownBsModal')">
<div class="modal-dialog" :class="fullscreen ? 'modal-fullscreen' : dialogClass">
<div class="modal-content">
<div v-if="$slots.title" class="modal-header" :class="headerClass">
@@ -515,7 +515,7 @@ export default {
},
template: /* html */`
<div class="stv" :class="{ 'sidebar-collapsed': sidebarCollapsed }">
<header class="navbar navbar-expand-lg navbar-dark bg-dark flex-md-nowrap p-0 shadow">
<header class="navbar navbar-expand-lg navbar-dark bg-dark flex-md-nowrap p-0 shadow" style="background-color: green !important;">
<div class="col-md-4 col-lg-3 col-xl-2 d-flex align-items-center">
<button
class="btn btn-outline-light border-0 m-1 collapsed"
@@ -528,7 +528,12 @@ export default {
>
<span class="svg-icon svg-icon-apps"></span>
</button>
<a class="navbar-brand me-0" :href="stvRoot">StudVw: {{studiensemesterKurzbz}} {{studiengangKuerzel}}</a>
<a class="navbar-brand me-0" :href="stvRoot">
<span style="font-size: 10px; line-height: 1; display: block; width: 100%; text-wrap: wrap; text-align: left;">
DEMO Datenstand 29.09.2026
</span>
StudVw: {{studiensemesterKurzbz}} {{studiengangKuerzel}}
</a>
<button
class="btn btn-outline-light border-0 d-none d-md-inline-flex m-1 ms-auto"
type="button"
@@ -56,8 +56,7 @@ export default {
anmerkung: null,
protokoll: null,
note: null,
link: null,
uhrzeit: null
link: null
},
statusNew: true,
arrTypen: [],
@@ -311,7 +310,6 @@ export default {
this.formData.pruefungstyp_kurzbz = data.pruefungstyp_kurzbz;
this.formData.datum = data.datum;
this.formData.uhrzeit = data.uhrzeit;
this.formData.sponsion = data.sponsion;
this.formData.akadgrad_id = data.akadgrad_id;
this.formData.pruefungsantritt_kurzbz = data.pruefungsantritt_kurzbz;
@@ -413,7 +411,6 @@ export default {
pruefer3_label: this.selectedPruefer3?.label || null,
akadgrad_id: this.formData.akadgrad_id,
datum: this.formData.datum,
uhrzeit: this.formData.uhrzeit || null,
sponsion: this.formData.sponsion
};
localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));
@@ -530,7 +527,6 @@ export default {
this.formData.abschlussbeurteilung_kurzbz = null;
this.formData.datum = null;
this.formData.sponsion = null;
this.formData.uhrzeit = null;
this.formData.pruefer1 = null;
this.formData.pruefer2 = null;
this.formData.pruefer3 = null;
@@ -624,7 +620,7 @@ export default {
);
}
});
}
},
},
created() {
this.$api
@@ -719,6 +715,7 @@ export default {
</template>
<form-form ref="formFinalExam" @submit.prevent>
<legend>{{this.$p.t('global','details')}}</legend>
<p v-if="statusNew">[{{$p.t('ui', 'neu')}}]</p>
@@ -919,22 +916,6 @@ export default {
</form-input>
</div>
<div v-if="!config.hiddenFields?.includes('uhrzeit')" class="row mb-3">
<form-input
container-class="col-6 stv-details-uhrzeit"
:label="$p.t('global', 'uhrzeit')"
type="DatePicker"
v-model="formData.uhrzeit"
model-type="HH:mm:ss"
time-picker
text-input
name="uhrzeit"
:teleport="true"
:cancel-text="$p.t('ui', 'abbrechen')"
:select-text="$p.t('ui', 'ok')"
/>
</div>
<div class="row mb-3">
<form-input
container-class="col-6 stv-details-abschlusspruefung-sponsion"
@@ -998,7 +979,7 @@ export default {
:cisRoot="cisRoot"
@linkGenerated="printDocument"
></abschlusspruefung-dropdown>
</Teleport>
</Teleport>
</div>
`
}
@@ -317,7 +317,7 @@ export default {
<div class="stv-details-kontakt-contact h-100 pt-3">
<!--Modal: contactModal-->
<bs-modal ref="contactModal" @hideBsModal.stop="">
<bs-modal ref="contactModal">
<template #title>
<p v-if="statusNew" class="fw-bold mt-3">{{$p.t('person', 'kontakt_new')}}</p>
<p v-else class="fw-bold mt-3">{{$p.t('person', 'kontakt_edit')}}</p>
@@ -1,7 +1,6 @@
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
import ZeugnisActions from './Zeugnis/Actions.js';
import ZeugnisDocuments from './Zeugnis/Documents.js';
import { debounce } from '../../../../../helpers/debounce.js';
export default {
name: 'Zeugnis',
@@ -100,7 +99,7 @@ export default {
return;
// get row data
const {lehrveranstaltung_id, uid: student_uid, studiensemester_kurzbz, _punkte: punkte = null} = cell.getData();
const {lehrveranstaltung_id, uid: student_uid, studiensemester_kurzbz} = cell.getData();
listPromise
// get bezeichnung
@@ -112,7 +111,6 @@ export default {
student_uid,
studiensemester_kurzbz,
note,
punkte,
note_bezeichnung
}))
// send to backend
@@ -122,7 +120,7 @@ export default {
.then(list => list.find(el => el.value == note))
.then(found => found?.label)
// update other fields in row
.then(note_bezeichnung => cell.getRow().update({note_bezeichnung, punkte, _punkte: null}))
.then(note_bezeichnung => cell.getRow().update({note_bezeichnung}))
.then(() => cell.getRow().reformat())
// cleanup
.then(cell.clearEdited)
@@ -136,16 +134,13 @@ export default {
if (this.config.usePoints) {
gradeField.editorParams = {
valuesLookup: (cell, filterTerm) => {
// the last typed Punkte go with the selected Note; a decimal comma counts as a point
const punkte = filterTerm ? filterTerm.replace(',', '.') : null;
cell.getData()._punkte = punkte;
if (punkte) {
if (filterTerm) {
return this.$api
.call(
this.endpoint.getGradeFromPoints(
punkte,
filterTerm,
cell.getData().lehrveranstaltung_id,
cell.getData().studiensemester_kurzbz
this.currentSemester
),
{ errorHandling: false }
)
@@ -179,124 +174,6 @@ export default {
gradeField.headerFiler = this.optionalTabulatorOptions?.headerFilter?.note || this.optionalTabulatorOptions?.note || false
}
let punkteField = {
field: 'punkte',
title: this.$p.t('stv/grades_points'),
visible: !!this.config.usePoints,
// numeric(8,4) arrives as "45.5000"
formatter: cell => (cell.getValue() ?? '') === '' ? '' : String(Number(cell.getValue()))
};
if (this.config.usePoints && ['both', 'inline'].includes(this.config.edit)) {
// saves the Punkte of one row; the server derives the Note, the row shows what it saved
const savePunkte = (row, punkte, before) => {
const data = row.getData();
const saveId = data._punkteSaveId = (data._punkteSaveId || 0) + 1;
const { lehrveranstaltung_id, uid: student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung } = data;
this.$api
.call(
// without Punkte the Note before the edit stays; a preview of a shorter input must not stick
this.endpoint.updateCertificate({ lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note: punkte === null ? before.note : data.note, punkte }),
{ errorHeader: lehrveranstaltung_bezeichnung }
)
.then(result => listPromise.then(list => ({
...result.data,
note_bezeichnung: list.find(el => el.value == result.data.note)?.label
})))
.then(saved => {
// a later save of the same row wins
if (row.getData()._punkteSaveId !== saveId)
return;
// update, not reformat: a reformat destroys an editor that is open in this row again
row.update(saved);
this.$fhcAlert.alertSuccess(this.$p.t('stv/grades_updated'));
})
.catch(err => {
if (row.getData()._punkteSaveId === saveId)
row.update(before);
this.$fhcAlert.handleFormValidation(err);
});
};
// the Note of the Notenschluessel shows while typing; Enter, Tab and a click elsewhere save
punkteField.editor = (cell, onRendered, success, cancel) => {
const row = cell.getRow();
const { note, note_bezeichnung, punkte } = row.getData();
const input = document.createElement('input');
input.type = 'text';
input.inputMode = 'decimal';
input.style.cssText = 'width: 100%; height: 100%; box-sizing: border-box; padding: 4px;';
// cellEditCancelled reads this state when Tabulator closes the editor itself
const editor = row.getData()._punkteEditor = {
open: true,
initial: punkteField.formatter(cell),
before: { note, note_bezeichnung, punkte },
value: () => input.value.trim().replace(',', '.'),
save: () => savePunkte(row, editor.value() === '' ? null : editor.value(), editor.before)
};
input.value = editor.initial;
const showNote = debounce(() => {
if (!editor.open)
return;
if (editor.value() === '')
return row.update({ note, note_bezeichnung });
const { lehrveranstaltung_id, studiensemester_kurzbz } = row.getData();
this.$api
.call(this.endpoint.getGradeFromPoints(editor.value(), lehrveranstaltung_id, studiensemester_kurzbz), { errorHandling: false })
.then(result => listPromise.then(list => list.find(el => el.value == result.data)))
.then(found => editor.open && found && row.update({ note: found.value, note_bezeichnung: found.label }))
.catch(() => {});
}, 500);
const finish = save => {
if (!editor.open)
return;
editor.open = false;
if (save && editor.value() !== editor.initial) {
success(editor.value());
return editor.save();
}
cancel();
row.update({ note, note_bezeichnung });
};
input.addEventListener('input', showNote);
input.addEventListener('blur', () => finish(true));
input.addEventListener('keydown', evt => {
if (evt.key === 'Enter')
finish(true);
if (evt.key === 'Escape')
finish(false);
// like the Tabulator editors: else the table keybindings scroll and close the editor
if (evt.key === 'Home' || evt.key === 'End')
evt.stopPropagation();
});
onRendered(() => {
input.focus();
input.select();
});
return input;
};
// Tabulator closes an open editor itself when another edit starts; the typed Punkte still count
punkteField.cellEditCancelled = cell => {
const editor = cell.getData()._punkteEditor;
if (!editor?.open)
return;
editor.open = false;
if (editor.value() === editor.initial)
return cell.getRow().update({ note: editor.before.note, note_bezeichnung: editor.before.note_bezeichnung });
cell.getRow().update({ punkte: editor.value() });
editor.save();
};
// one click opens the editor; without it the first click only selects the row
punkteField.cellClick = (evt, cell) => {
if (!cell.getElement().classList.contains('tabulator-editing'))
cell.edit();
};
}
const columns = [
{ field: 'zeugnis', title: this.$p.t('stv/grades_zeugnis'), formatter: 'tickCross' },
{ field: 'lehrveranstaltung_bezeichnung', title: this.$p.t('lehre/lehrveranstaltung') },
@@ -344,7 +221,7 @@ export default {
{ field: 'ects_lv', title: this.$p.t('lehre/ects'), visible: false },
{ field: 'lehrform', title: this.$p.t('lehre/lehrform'), visible: false },
{ field: 'kurzbz', title: this.$p.t('lehre/kurzbz'), visible: false },
punkteField,
{ field: 'punkte', title: this.$p.t('stv/grades_points'), visible: false },
{ field: 'lehrveranstaltung_bezeichnung_english', title: this.$p.t('stv/grades_lehrveranstaltung_bezeichnung_english'), visible: false },
{ field: 'uid', title: this.$p.t('person/uid'), visible: false },
{ field: 'vorname', title: this.$p.t('person/vorname'), visible: false },
@@ -32,8 +32,7 @@ export default {
return {
grades: [],
suggestions: null,
currentPoints: '',
lastPoints: null
currentPoints: ''
};
},
computed: {
@@ -69,15 +68,14 @@ export default {
},
methods: {
convertPoints({evt, query}) {
this.lastPoints = query ? query.replace(',', '.') : null;
if (!query) {
return this.suggestions = this.grades;
}
this.$refs.points
.call(ApiStvGrades.getGradeFromPoints(
this.lastPoints,
query,
this.selected.find(Boolean)?.lehrveranstaltung_id,
this.selected.find(Boolean)?.studiensemester_kurzbz
this.currentSemester
))
.then(result => {
if (result.data === null) {
@@ -92,7 +90,7 @@ export default {
if (this.selected)
this.selected.forEach(grade => grade.note = note);
this.currentPoints = '';
this.selectedData.forEach(data => this.$emit('setGrade', {...data, note, punkte: this.lastPoints}));
this.current = note;
},
deleteGrades() {
this.selectedData.forEach(data => this.$emit('deleteGrade', data));
@@ -604,11 +604,9 @@ export default {
<!--Modal: KontaktdatenModal -->
<bs-modal
v-if="autocompleteSelectedBetreuer && autocompleteSelectedBetreuer.person_id"
@hideBsModal.stop=""
ref="kontaktdatenModal"
dialog-class="modal-xl modal-dialog-scrollable"
>
v-if="autocompleteSelectedBetreuer && autocompleteSelectedBetreuer.person_id">
<template #title>
<p class="fw-bold mt-3">{{$p.t('projektarbeit', 'kontaktdatenBearbeiten')}}</p>
+1
View File
@@ -0,0 +1 @@
../vendor
-20
View File
@@ -42493,26 +42493,6 @@ In the list:
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'grades_error_noGradeForPoints',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Der Notenschlüssel der Lehrveranstaltung ergibt für diese Punkte keine Note',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The grading key of the course gives no grade for these points',
'description' => '',
'insertvon' => 'system'
)
)
),
// groups
array(
'app' => 'core',