Merge branch 'feature-19538/Gruppenadministratoren'

This commit is contained in:
Andreas Österreicher
2022-09-12 18:08:17 +02:00
12 changed files with 1378 additions and 8 deletions
+7
View File
@@ -119,6 +119,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 30,
'requiredPermissions' => 'system/issues_verwalten:r'
),
'gruppenmanagement' => array(
'link' => site_url('person/Gruppenmanagement'),
'description' => 'Gruppenmanagement',
'expand' => true,
'sort' => 40,
'requiredPermissions' => 'lehre/gruppenmanager:r'
)
)
),
@@ -0,0 +1,254 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Page for managing groups of which user is the manager
*/
class Gruppenmanagement extends Auth_Controller
{
private $_uid; // contains the UID of the logged user
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => 'lehre/gruppenmanager:r',
'showBenutzergruppe' => 'lehre/gruppenmanager:r',
'getBenutzer' => 'lehre/gruppenmanager:r',
'getAllBenutzer' => 'lehre/gruppenmanager:r',
'addBenutzer' => 'lehre/gruppenmanager:rw',
'removeBenutzer' => 'lehre/gruppenmanager:rw'
)
);
// Loads models
$this->load->model('person/benutzer_model', 'BenutzerModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel');
$this->load->model('system/Log_model', 'LogModel');
$this->load->library('WidgetLib');
$this->loadPhrases(
array(
'global',
'person',
'lehre',
'ui',
'filter',
'gruppenmanagement'
)
);
$this->setControllerId(); // sets the controller id
$this->_setAuthUID(); // sets property uid
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Main page
*/
public function index()
{
$this->load->view(
'person/gruppenmanagement/gruppenmanagement.php',
array('uid' => $this->_uid)
);
}
/**
* Shows Benutzergruppe overview page.
*/
public function showBenutzergruppe()
{
$this->_setNavigationMenuShowDetails();
$gruppe_kurzbz = $this->input->get('gruppe_kurzbz');
$data[self::FHC_CONTROLLER_ID] = $this->getControllerId();
$this->load->view(
'person/gruppenmanagement/benutzergruppe.php',
array('gruppe_kurzbz' => $gruppe_kurzbz)
);
}
/**
* Gets Benutzer assigned to a Gruppe
*/
public function getBenutzer()
{
$gruppe_kurzbz = $this->input->get('gruppe_kurzbz');
$this->BenutzergruppeModel->addSelect('uid, vorname, nachname, ben.aktiv');
$this->BenutzergruppeModel->addJoin('public.tbl_benutzer ben', 'uid');
$this->BenutzergruppeModel->addJoin('public.tbl_person', 'person_id');
$benutzerRes = $this->BenutzergruppeModel->loadWhere(array('gruppe_kurzbz' => $gruppe_kurzbz));
$this->outputJson($benutzerRes);
}
/**
* Gets all Benutzer for assignment to Gruppe
*/
public function getAllBenutzer()
{
$this->BenutzerModel->addSelect('uid, vorname, nachname');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id');
$benutzerRes = $this->BenutzerModel->loadWhere(
array('tbl_benutzer.aktiv' => true)
);
$this->outputJson($benutzerRes);
}
/**
* Adds a Benutzer to Gruppe
*/
public function addBenutzer()
{
$uid = $this->input->post('uid');
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
if (isEmptyString($uid))
$result = error('Uid missing');
else
{
$benutzerExistsRes = $this->BenutzergruppeModel->loadWhere(
array(
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz
)
);
if (isError($benutzerExistsRes))
{
$this->outputJsonError(getError($benutzerExistsRes));
return;
}
if (hasData($benutzerExistsRes))
{
$this->outputJsonError($this->p->t('gruppenmanagement', 'benutzerSchonZugewiesen'));
return;
}
$result = $this->BenutzergruppeModel->insert(
array(
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => $this->_uid
)
);
// log the group add
$lastQry = $this->db->last_query();
if (isSuccess($result))
{
$beschreibung = 'Gruppenmanagement: Nutzer zu Gruppe hinzugefügt';
$this->_writeLog($this->_uid, $beschreibung, $lastQry);
}
}
$this->outputJson($result);
}
/**
* Removes Benutzer from Gruppe
*/
public function removeBenutzer()
{
$uid = $this->input->post('uid');
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
if (isEmptyString($uid))
$result = error('Uid missing');
else
{
$result = $this->BenutzergruppeModel->delete(
array(
'uid' => $uid,
'gruppe_kurzbz' => $gruppe_kurzbz
)
);
}
// log the group remove
$lastQry = $this->db->last_query();
if (isSuccess($result))
{
$beschreibung = 'Gruppenmanagement: Nutzer aus Gruppe entfernt';
$this->_writeLog($this->_uid, $beschreibung, $lastQry);
}
$this->outputJson($result);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Define the navigation menu for the showDetails page
*/
private function _setNavigationMenuShowDetails()
{
$this->load->library('NavigationLib', array('navigation_page' => 'person/Gruppenmanagement/showBenutzergruppe'));
$link = site_url('person/Gruppenmanagement');
$this->navigationlib->setSessionMenu(
array(
'back' => $this->navigationlib->oneLevel(
'Zurück', // description
$link, // link
array(), // children
'angle-left', // icon
true, // expand
null, // subscriptDescription
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
1 // sort
)
)
);
}
/**
* Set uid of authentificated user
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
/**
* Writes an entry in the log table
*/
private function _writeLog($uid, $beschreibung, $lastQry)
{
$mitarbeiterResult = $this->MitarbeiterModel->load(array('mitarbeiter_uid'=>$this->_uid));
if(!isSuccess($mitarbeiterResult) || !hasData($mitarbeiterResult))
{
$uid = DUMMY_LEKTOR_UID;
$beschreibung .= ': '.$this->_uid;
$beschreibung = mb_substr($beschreibung, 0, 64);
}
$this->LogModel->insert(array(
'mitarbeiter_uid' => $uid,
'beschreibung' => $beschreibung,
'sql' => $lastQry
));
}
}
@@ -0,0 +1,75 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Benutzer in Gruppe',
'jquery' => true,
'jqueryui' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
'tablesorter' => true,
'ajaxlib' => true,
'dialoglib' => true,
'navigationwidget' => true,
'phrases' => array(
'gruppenmanagement',
'ui'
),
'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css',
'customJSs' => array('public/js/bootstrapper.js', 'public/js/tablesort/tablesort.js', 'public/js/person/benutzergruppe.js')
)
);
?>
<body>
<div id="wrapper">
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
<?php echo ucfirst($this->p->t('gruppenmanagement', 'benutzergruppe')).' '.$gruppe_kurzbz ?>
</h3>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="form-inline">
<div class="input-group" id="absgstatusgrselect_137998">
<input type="text" class="form-control" name="teilnehmerSelect" id="teilnehmerSelect">
<input type="hidden" name="teilnehmer_uid" id="teilnehmer_uid">
<input type="hidden" name="gruppe_kurzbz" id="gruppe_kurzbz" value="<?php echo $gruppe_kurzbz ?>">
<span class="input-group-btn">
<button type="button" class="btn btn-default" id="teilnehmerHinzufuegen">
<?php echo $this->p->t('gruppenmanagement', 'benutzerHinzufuegen') ?>
</button>
</span>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<table class="table table-bordered table-condensed table-responsive" id="benutzer-table">
<thead>
<th>Uid</th>
<th><?php echo ucfirst($this->p->t('person', 'vorname')); ?></th>
<th><?php echo ucfirst($this->p->t('person', 'nachname')); ?></th>
<th><?php echo ucfirst($this->p->t('gruppenmanagement', 'aktiv')); ?></th>
<th><?php echo ucfirst($this->p->t('ui', 'entfernen')); ?></th>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,46 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Gruppenmanagement',
'jquery' => true,
'jqueryui' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
'tablesorter' => true,
'ajaxlib' => true,
'filterwidget' => true,
'navigationwidget' => true,
'phrases' => array(
'ui'
),
'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css',
'customJSs' => array('public/js/bootstrapper.js')
)
);
?>
<body>
<div id="wrapper">
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
<?php echo ucfirst($this->p->t('gruppenmanagement', 'gruppenmanagement')); ?>
</h3>
</div>
</div>
<div>
<?php $this->load->view('person/gruppenmanagement/gruppenmanagementData.php'); ?>
</div>
</div>
</div>
</div>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,66 @@
<?php
$filterWidgetArray = array(
'query' => '
SELECT gruppe_kurzbz, grp.bezeichnung AS gruppe_bezeichnung, grp.beschreibung AS gruppe_beschreibung,
studiengang_kz, UPPER(stg.typ||stg.kurzbz) AS studiengang_kurzbz, semester, sichtbar, lehre, grp.aktiv, mailgrp, generiert
FROM public.tbl_gruppe grp
JOIN public.tbl_studiengang stg USING (studiengang_kz)
JOIN public.tbl_gruppe_manager grpmgr USING (gruppe_kurzbz)
WHERE grp.aktiv = TRUE
AND grpmgr.uid = \''.$uid.'\'',
'requiredPermissions' => 'lehre/gruppenmanager',
'datasetRepresentation' => 'tablesorter',
'additionalColumns' => array('Teilnehmer'),
'columnsAliases' => array(
ucfirst($this->p->t('gruppenmanagement', 'kurzbezeichnung')),
ucfirst($this->p->t('gruppenmanagement', 'bezeichnung')),
ucfirst($this->p->t('gruppenmanagement', 'beschreibung')),
ucfirst($this->p->t('lehre', 'studiengangskennzahlLehre')),
ucfirst($this->p->t('lehre', 'studiengang')),
ucfirst($this->p->t('lehre', 'semester')),
'Sichtbar',
'Lehre',
'Aktiv',
'Mailgrp',
'Generiert'
),
'formatRow' => function($datasetRaw) {
/* NOTE: Dont use $this here for PHP Version compatibility */
$datasetRaw->{'Teilnehmer'} = sprintf(
'<a href="%s?gruppe_kurzbz=%s&origin_page=%s&fhc_controller_id=%s">'.$this->p->t('gruppenmanagement', 'zuweisenloeschen').'</a>',
site_url('person/Gruppenmanagement/showBenutzergruppe'),
$datasetRaw->{'gruppe_kurzbz'},
'index',
(isset($_GET['fhc_controller_id'])?$_GET['fhc_controller_id']:'')
);
if ($datasetRaw->{'gruppe_bezeichnung'} == null)
{
$datasetRaw->{'gruppe_bezeichnung'} = '-';
}
if ($datasetRaw->{'gruppe_beschreibung'} == null)
{
$datasetRaw->{'gruppe_beschreibung'} = '-';
}
if ($datasetRaw->{'semester'} == null)
{
$datasetRaw->{'semester'} = '-';
}
$datasetRaw->{'sichtbar'} = $datasetRaw->{'sichtbar'} == 'true' ? 'ja' : 'nein';
$datasetRaw->{'lehre'} = $datasetRaw->{'lehre'} == 'true' ? 'ja' : 'nein';
$datasetRaw->{'aktiv'} = $datasetRaw->{'aktiv'} == 'true' ? 'ja' : 'nein';
$datasetRaw->{'mailgrp'} = $datasetRaw->{'mailgrp'} == 'true' ? 'ja' : 'nein';
$datasetRaw->{'generiert'} = $datasetRaw->{'generiert'} == 'true' ? 'ja' : 'nein';
return $datasetRaw;
}
);
$filterWidgetArray['app'] = 'core';
$filterWidgetArray['datasetName'] = 'gruppenmanagement';
$filterWidgetArray['filterKurzbz'] = 'gruppenmanagement';
$filterWidgetArray['filter_id'] = $this->input->get('filter_id');
echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray);
?>
+3
View File
@@ -258,6 +258,9 @@ define('STIP_USER_PASSWORD','password');
// Array mit Usern die nicht Kollidieren
define('KOLLISIONSFREIE_USER',serialize(array('_DummyLektor')));
// UID des Dummy Lektors
define('DUMMY_LEKTOR_UID','_DummyLektor');
// Soll der Lageplan am Infoterminal angezeigt werden (true|false)
//define('CIS_INFOSCREEN_LAGEPLAN_ANZEIGEN', true);
+187
View File
@@ -0,0 +1,187 @@
<?php
/* Copyright (C) 2006 Technikum-Wien
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Alexei Karpenko <karpenko@technikum-wien.at>.
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
class gruppemanager extends basis_db
{
public $new;
//Tabellenspalten
public $uid; // varchar(32)
public $gruppe_kurzbz; // varchar(32)
public $insertamum; // timestamp
public $insertvon; // varchar(32)
public $uids = array(); // array
/**
* Konstruktor - Laedt optional einen Gruppenmanager
* @param $uid
* @param $gruppe_kurzbz
*/
public function __construct($uid=null, $gruppe_kurzbz=null)
{
parent::__construct();
if(!is_null($gruppe_kurzbz) && !is_null($uid))
$this->load($uid, $gruppe_kurzbz);
}
/**
* Laedt die BenutzerGruppe
* @param uid, gruppe_kurzbz
* @return true wenn ok, false im Fehlerfall
*/
public function load($uid, $gruppe_kurzbz)
{
$qry = "SELECT * FROM public.tbl_gruppe_manager WHERE uid=".$this->db_add_param($uid)." AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz);
if($this->db_query($qry))
{
if($row = $this->db_fetch_object())
{
$this->uid = $row->uid;
$this->gruppe_kurzbz = $row->gruppe_kurzbz;
$this->insertamum = $row->insertamum;
$this->insertvon = $row->insertvon;
return true;
}
else
{
$this->errormsg = 'Es wurde kein Datensatz gefunden';
return false;
}
}
else
{
$this->errormsg = 'Fehler beim Laden des Datensatzes';
return false;
}
}
/**
* Laedt die Manager einer Benutzergruppe
* @param gruppe_kurzbz
* @return true wenn ok, false im Fehlerfall
*/
public function load_uids($gruppe_kurzbz)
{
$qry = "SELECT * FROM public.tbl_gruppe_manager
WHERE gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz);
if ($this->db_query($qry))
{
if ($this->db_num_rows() == 0)
return false;
else
{
while ($row = $this->db_fetch_object())
{
$gm_obj = new gruppemanager();
$gm_obj->uid = $row->uid;
$this->uids[] = $gm_obj;
}
return true;
}
}
else
{
$this->errormsg = 'Fehler beim Laden des Datensatzes';
return false;
}
}
/**
* Prueft die Variablen vor dem Speichern
* auf Gueltigkeit.
* @return true wenn ok, false im Fehlerfall
*/
protected function validate()
{
if(mb_strlen($this->uid)>32)
{
$this->errormsg = 'UID darf nich laenger als 32 Zeichen sein';
return false;
}
if(mb_strlen($this->gruppe_kurzbz)>32)
{
$this->errormsg = 'Gruppe_kurzbz darf nicht laenger als 32 Zeichen sein';
return false;
}
if(mb_strlen($this->insertvon)>32)
{
$this->errormsg = 'Insertvon darf nicht laenger als 32 Zeichen sein';
return false;
}
return true;
}
/**
* Speichert GruppeManager in die Datenbank
* Wenn $new auf true gesetzt ist wird ein neuer Datensatz
* angelegt, ansonsten der Datensatz upgedated
* @return true wenn erfolgreich, false im Fehlerfall
*/
public function save()
{
//Variablen auf Gueltigkeit pruefen
if(!$this->validate())
return false;
$qry = 'INSERT INTO public.tbl_gruppe_manager (uid, gruppe_kurzbz, insertamum, insertvon)
VALUES('.$this->db_add_param($this->uid).','.
$this->db_add_param($this->gruppe_kurzbz).','.
$this->db_add_param($this->insertamum).','.
$this->db_add_param($this->insertvon).');';
if($this->db_query($qry))
{
//Log schreiben
return true;
}
else
{
$this->errormsg = 'Fehler beim Speichern des GruppeManagers';
return false;
}
}
/**
* Loescht eine Gruppenmanagerzuordnung
*
* @param $uid
* @param $gruppe_kurzbz
* @return boolean
*/
public function delete($uid, $gruppe_kurzbz)
{
$qry = "DELETE FROM public.tbl_gruppe_manager WHERE uid=".$this->db_add_param($uid)." AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz);
if($this->db_query($qry))
return true;
else
{
$this->errormsg = 'Fehler beim Loeschen der Zuteilung';
return false;
}
}
}
?>
+223
View File
@@ -0,0 +1,223 @@
/**
* Javascript file for benutzergruppe management page
*/
var Benutzergruppe = {
getBenutzer: function(gruppe_kurzbz) {
FHC_AjaxClient.ajaxCallGet(
'person/gruppenmanagement/getBenutzer',
{
gruppe_kurzbz: gruppe_kurzbz
},
{
successCallback: function(data, textStatus, jqXHR) {
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
return;
}
let benutzerTable = $("#benutzer-table tbody");
benutzerTable.empty();
if (FHC_AjaxClient.hasData(data))
{
// save loaded data
let benutzerData = FHC_AjaxClient.getData(data);
// fill table with Benutzer of Gruppe
for (let i = 0; i < benutzerData.length; i++)
{
let benutzer = benutzerData[i];
benutzerTable.append(
"<tr>"+
"<td>"+benutzer.uid+"</td>"+
"<td>"+benutzer.vorname+"</td>"+
"<td>"+benutzer.nachname+"</td>"+
"<td>"+(benutzer.aktiv === true ? "Ja" : "Nein")+"</td>"+
"<td>"+
"<button class='btn btn-default benutzerLoeschen' id='"+benutzer.uid+"_benutzerLoeschen'>"+
FHC_PhrasesLib.t('ui', 'entfernen')+
"</button>"+
"</td>"+
"</tr>"
);
// add delete event to button
$("#"+benutzer.uid+"_benutzerLoeschen").click(
function() {
Benutzergruppe.removeBenutzer(benutzer.uid, gruppe_kurzbz);
}
)
}
}
// add tablesorter to benutzergruppe table
Benutzergruppe._setTablesorter();
},
errorCallback: function(jqXHR, textStatus, errorThrown) {
FHC_DialogLib.alertError(textStatus);
}
}
);
},
getAllBenutzer: function() {
FHC_AjaxClient.ajaxCallGet(
'person/gruppenmanagement/getAllBenutzer',
null,
{
successCallback: function(data, textStatus, jqXHR) {
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
return;
}
if (FHC_AjaxClient.hasData(data))
{
benutzerArr = [];
// save loaded data
let benutzerData = FHC_AjaxClient.getData(data);
for (let i = 0; i < benutzerData.length; i++)
{
let ben = benutzerData[i];
benutzerArr.push(
{
vorname: ben.vorname,
nachname: ben.nachname,
uid: ben.uid,
label: ben.nachname + " " + ben.vorname + " (" + ben.uid + ")",
id: ben.uid
}
);
}
// callback for searching source mitarbeiter array correctly
let sourceCallback = function(request, response)
{
// case insensitive matcher
let matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
// match vorname nachname OR nachname vorname OR uid
response($.grep(benutzerArr, function (value) {
return matcher.test(value.nachname + ' '+value.vorname + ' ' + value.nachname)
|| matcher.test(value.uid);
}));
}
// fill autocomplete field with benutzer data
Benutzergruppe._fillAutocomplete(
'teilnehmerSelect',
'teilnehmer_uid',
sourceCallback
);
}
},
errorCallback: function(jqXHR, textStatus, errorThrown) {
FHC_DialogLib.alertError(textStatus);
}
}
);
},
addBenutzer: function(uid, gruppe_kurzbz) {
FHC_AjaxClient.ajaxCallPost(
'person/gruppenmanagement/addBenutzer',
{
uid: uid,
gruppe_kurzbz: gruppe_kurzbz
},
{
successCallback: function(data, textStatus, jqXHR) {
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
return;
}
if (FHC_AjaxClient.hasData(data))
{
// load Benutzer after add to show change
Benutzergruppe.getBenutzer(gruppe_kurzbz);
}
},
errorCallback: function(jqXHR, textStatus, errorThrown) {
FHC_DialogLib.alertError(textStatus);
}
}
);
},
removeBenutzer: function(uid, gruppe_kurzbz) {
FHC_AjaxClient.ajaxCallPost(
'person/gruppenmanagement/removeBenutzer',
{
uid: uid,
gruppe_kurzbz: gruppe_kurzbz
},
{
successCallback: function(data, textStatus, jqXHR) {
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
return;
}
if (FHC_AjaxClient.hasData(data))
{
// load Benutzer after remove to show change
Benutzergruppe.getBenutzer(gruppe_kurzbz);
}
},
errorCallback: function(jqXHR, textStatus, errorThrown) {
FHC_DialogLib.alertError(textStatus);
}
}
);
},
_fillAutocomplete: function(autocompleteId, idFieldId, source) {
// jQuery ui autocomplete for benutzer
$("#"+autocompleteId).autocomplete(
{
// custom matcher
source: source,
autoFocus: true,
select: function(event, ui)
{
// when autocmplete entry selected, display label text in autocomplete, fill hidden value field
$("#"+autocompleteId).val(ui.item.label);
$("#"+idFieldId).val(ui.item.id);
return false;
}
}
);
},
_setTablesorter: function() {
Tablesort.addTablesorter(
// sort by first and third column asc, show filters beggining with 2 Benutzer, exclude fifth column from filter
"benutzer-table", [[0,0], [2,0]], ["filter", "zebra"], 2, {headers: {4: {filter: false}}}
)
}
};
/**
* When JQuery is up
*/
$(document).ready(function() {
// get the group name
let gruppe_kurzbz = $("#gruppe_kurzbz").val();
// load Benutzer for autocomplete selection
Benutzergruppe.getAllBenutzer();
// load Benutzer for table
Benutzergruppe.getBenutzer(gruppe_kurzbz);
// add click event to "add Benutzer" button
$("#teilnehmerHinzufuegen").click(function(){
let uid = $("#teilnehmer_uid").val();
Benutzergruppe.addBenutzer(uid, gruppe_kurzbz);
$("#teilnehmerSelect").val('');
}
);
});
+66
View File
@@ -6243,6 +6243,72 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht
}
}
// Creates table public.tbl_gruppe_manager if it doesn't exist and grants privileges
if (!$result = @$db->db_query('SELECT 1 FROM public.tbl_gruppe_manager LIMIT 1'))
{
$qry = 'CREATE TABLE public.tbl_gruppe_manager (
gruppe_manager_id integer,
gruppe_kurzbz varchar(32) NOT NULL,
uid varchar(32) NOT NULL,
insertamum timestamp DEFAULT NOW(),
insertvon varchar(32)
);
COMMENT ON TABLE public.tbl_gruppe_manager IS \'Table to save assignments groups to their managers.\';
COMMENT ON COLUMN public.tbl_gruppe_manager.gruppe_kurzbz IS \'Name of group\';
COMMENT ON COLUMN public.tbl_gruppe_manager.uid IS \'User id of group manager\';
CREATE SEQUENCE public.seq_gruppe_manager_gruppe_manager_id
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.tbl_gruppe_manager ALTER COLUMN gruppe_manager_id SET DEFAULT nextval(\'public.seq_gruppe_manager_gruppe_manager_id\'::regclass);
GRANT SELECT, UPDATE ON SEQUENCE public.seq_gruppe_manager_gruppe_manager_id TO vilesci;
GRANT SELECT, UPDATE ON SEQUENCE public.seq_gruppe_manager_gruppe_manager_id TO fhcomplete;
ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT pk_gruppe_manager PRIMARY KEY (gruppe_manager_id);
ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT fk_gruppe_manager_gruppe_kurzbz FOREIGN KEY (gruppe_kurzbz) REFERENCES public.tbl_gruppe(gruppe_kurzbz) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT fk_gruppe_manager_uid FOREIGN KEY (uid) REFERENCES public.tbl_benutzer(uid) ON UPDATE CASCADE ON DELETE RESTRICT;
ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT uk_gruppe_manager_gruppe_kurzbz_uid UNIQUE (gruppe_kurzbz, uid);';
if (!$db->db_query($qry))
echo '<strong>public.tbl_gruppe_manager: '.$db->db_last_error().'</strong><br>';
else
echo '<br>public.tbl_gruppe_manager table created';
$qry = 'GRANT SELECT ON TABLE public.tbl_gruppe_manager TO web;';
if (!$db->db_query($qry))
echo '<strong>public.tbl_gruppe_manager: '.$db->db_last_error().'</strong><br>';
else
echo '<br>Granted privileges to <strong>web</strong> on public.tbl_gruppe_manager';
$qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_gruppe_manager TO vilesci;';
if (!$db->db_query($qry))
echo '<strong>public.tbl_gruppe_manager: '.$db->db_last_error().'</strong><br>';
else
echo '<br>Granted privileges to <strong>vilesci</strong> on public.tbl_gruppe_manager';
}
// Add permission for managing user groups
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/gruppenmanager';"))
{
if($db->db_num_rows($result) == 0)
{
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/gruppenmanager', 'Manager einer Gruppe werden und die Gruppe verwalten');";
if(!$db->db_query($qry))
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
else
echo ' system.tbl_berechtigung: Added permission for lehre/gruppenmanager<br>';
}
}
// NOTE(chris): Add "Template" to "Lehrtyp"
if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_lehrtyp WHERE bezeichnung = 'Template';"))
{
+21
View File
@@ -1112,6 +1112,27 @@ $filters = array(
}
',
'oe_kurzbz' => null
),
array(
'app' => 'core',
'dataset_name' => 'gruppenmanagement',
'filter_kurzbz' => 'gruppenmanagement',
'description' => '{Meine Gruppen}',
'sort' => 1,
'default_filter' => true,
'filter' => '
{
"name": "gruppenmanagement",
"columns": [
{"name": "gruppe_kurzbz"},
{"name": "gruppe_bezeichnung"},
{"name": "gruppe_beschreibung"},
{"name": "studiengang_kurzbz"}
],
"filters": []
}
',
'oe_kurzbz' => null,
)
);
+181 -1
View File
@@ -16238,7 +16238,7 @@ array(
'sprache' => 'German',
'text' => 'Ab dem Studienjahr 2022/23 ist der Erwerb von internationalen und interkulturellen Kompetenzen Teil des Curriculums. <br />
Auf der Grundlage der vorliegenden Maßnahmen absolvieren Sie im Laufe ihres Studiums Internationalisierungsaktivitäten, die mit unterschiedlichen ECTS-Punkten hinterlegt sind. <br />
In Summe müssen 5 ECTS erworben werden, die im 6. Semester wirksam werden. <br/>
In Summe müssen 5 ECTS erworben werden, die im 6. Semester wirksam werden. <br/>
Das Modul „International skills“ wird mit der Beurteilung „Mit Erfolg teilgenommen“ abgeschlossen. <br />
Bitte wählen Sie die für Sie in Frage kommenden Maßnahmen aus und planen Sie das entsprechende Semester. <br />
Sobald die 5 ECTS erreicht wurden, überprüft der Studiengang die von Ihnen hochgeladenen Dokumente.',
@@ -16758,6 +16758,186 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'benutzerSchonZugewiesen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Benutzer ist bereits der Gruppe zugewiesen",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "User is already assigned to the group",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'gruppenmanagement',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Gruppenmanagement",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Group management",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'kurzbezeichnung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Kurzbezeichnung",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Short description",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'bezeichnung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Bezeichnung",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Name",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'beschreibung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Beschreibung",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Description",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'zuweisenloeschen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Zuweisen/Entfernen",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Assign/Remove",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'benutzergruppe',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Benutzergruppe",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "User group",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'benutzerHinzufuegen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Benutzer hinzufügen",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Add user",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
'phrase' => 'aktiv',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "aktiv",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "active",
'description' => '',
'insertvon' => 'system'
)
)
)
);
+249 -7
View File
@@ -24,6 +24,7 @@ require_once('../../config/vilesci.config.inc.php');
require_once('../../include/functions.inc.php');
require_once('../../include/studiengang.class.php');
require_once('../../include/gruppe.class.php');
require_once('../../include/gruppemanager.class.php');
require_once('../../include/person.class.php');
require_once('../../include/benutzer.class.php');
require_once('../../include/student.class.php');
@@ -82,17 +83,59 @@ if(!$rechte->isBerechtigt('lehre/gruppe', null, 's'))
<title>Gruppe-Verwaltung</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="../../skin/vilesci.css" type="text/css">
<link rel="stylesheet" href="../../skin/jquery-ui-1.9.2.custom.min.css" type="text/css">
<?php
include('../../include/meta/jquery.php');
include('../../include/meta/jquery-tablesorter.php');
?>
<?php
// html Vorlage für ein manager span
const MANAGER_HTML = "<span class='manager-uid'>%s - %s %s&nbsp;"
."<img class='manager-delete-image' src='../../skin/images/cross.png' title='Manager entfernen' alt='Manager entfernen'>"
."<input type='hidden' name='gruppemanager[]' value='%s'>"
."</span>";
?>
<script type="text/javascript" src="../../vendor/components/jqueryui/jquery-ui.min.js"></script>
<script language="JavaScript" type="text/javascript">
function conf_del()
{
return confirm('Diese Gruppe wirklich löschen?');
}
function setManagerDeleteEvent()
{
var deleteImages = $('.manager-delete-image');
deleteImages.off("click");
deleteImages.click(function()
{
// closest manager uid parent
$(this).closest('.manager-uid').remove();
adjustManagerTableCellSize();
});
}
function showIfManagerAssignable()
{
var generiert = $("#generiert").prop('checked');
if (generiert === true)
{
$("#gruppemanager").prop("disabled", true);
$("#genGruppenManagerHinweis").removeClass("hiddenNotice");
}
else
{
$("#gruppemanager").prop("disabled", false);
$("#genGruppenManagerHinweis").addClass("hiddenNotice");
}
}
function adjustManagerTableCellSize()
{
// Tabellenzelle vergrössern wenn es Administratorelemente gibt
if ($("input[name='gruppemanager[]']").length)
$("#gruppenmanager-cell").addClass("gruppenmanager-cell");
else
$("#gruppenmanager-cell").removeClass("gruppenmanager-cell");
}
$(document).ready(function()
{
$("#t1").tablesorter(
@@ -110,11 +153,82 @@ if(!$rechte->isBerechtigt('lehre/gruppe', null, 's'))
return false;
});
$( "#mailgrp" ).click(function() {
$( "#mailgrp" ).click(function()
{
$( "#domain_text" ).toggle();
$('#gesperrt').prop('disabled', function(i, v) { return !v; });
});
// Löschen von Gruppemanager html bei Klick
setManagerDeleteEvent();
// Hinzufügen von Managern deaktiviert wenn generierte Gruppe
showIfManagerAssignable();
// autocomplete für user input Feld
$("#gruppemanager").autocomplete({
source: "einheit_autocomplete.php?work=searchUser",
minLength:3,
response: function(event, ui)
{
// Value und Label fuer die Anzeige setzen
for(i in ui.content)
{
ui.content[i].value=ui.content[i].uid;
ui.content[i].label=ui.content[i].uid+" - "+ui.content[i].vorname+" "+ui.content[i].nachname;
}
},
// bei Auswahl einer uid
select: function(event, ui)
{
// Administrator html holen und Werte ersetzen
var managerHtml = "<?php echo MANAGER_HTML ?>";
var managerHtmlValues = [ui.item.uid, ui.item.vorname, ui.item.nachname, ui.item.uid];
for (var i = 0; i < managerHtmlValues.length; i++)
{
managerHtml = managerHtml.replace(/%s/, managerHtmlValues[i]);
}
// wenn noch nicht vorhanden, Administrator unterhalb des Inputfeldes einfügen
if (!$("input[name='gruppemanager[]'][value='"+ui.item.uid+"']").length)
{
var counter = 0;
$(".manager-uid-container").children().each(
function() {
if ($(this).hasClass('manager-uid'))
counter++;
else
return false;
}
);
// nach 5 Managern in nächste Zeile springen
if (counter >= 5)
{
$(".manager-uid-container").prepend(
"<p class='manager-separator'></p>"
);
}
$(".manager-uid-container").prepend(
managerHtml
);
// Loeschen Event für neuen Administrator setzen
setManagerDeleteEvent();
// Größe der Administrator Tabellenzelle anpassen
adjustManagerTableCellSize();
}
// Feld leeren
$("#gruppemanager").val('');
return false; // prevent default, damit text nicht im Inputfeld bleibt
}
});
// Hinzufügen von Managern deaktiviert wenn Gruppe auf generiert setzen
$("#generiert").click(showIfManagerAssignable);
});
</script>
<style>
@@ -126,6 +240,35 @@ if(!$rechte->isBerechtigt('lehre/gruppe', null, 's'))
{
background-color: #d1d1d1;
}
col.first-table-column
{
width: 130px;
}
.manager-uid
{
border: 1px solid black;
padding: 2px;
margin-right: 2px;
white-space: nowrap;
}
.manager-delete-image
{
position: relative;
top: 4px;
cursor: pointer;
}
.manager-separator
{
margin: 3px;
}
.gruppenmanager-cell
{
padding-bottom: 3px;
}
.hiddenNotice
{
display: none;
}
</style>
</head>
<body>
@@ -158,8 +301,10 @@ else if (isset($_GET['type']) && $_GET['type']=='delete')
if($rechte->isBerechtigt('lehre/gruppe', $oe_studiengang, 'suid'))
{
$grp_kurzbz = $_GET['einheit_id'];
$e=new gruppe();
if(!$e->delete($_GET['einheit_id']))
if(!$e->delete($grp_kurzbz))
echo $e->errormsg;
}
else
@@ -214,6 +359,7 @@ function printDropDown()
echo '<input type="submit" value="Anzeigen" />';
echo '</form>';
}
function doSave()
{
global $rechte;
@@ -241,8 +387,10 @@ function doSave()
$e->new = false;
}
$user = get_uid();
$e->updateamum = date('Y-m-d H:i:s');
$e->updatevon = get_uid();
$e->updatevon = $user;
$e->bezeichnung = $_POST['bezeichnung'];
$e->beschreibung = $_POST['beschreibung'];
$e->studiengang_kz = $_POST['studiengang_kz'];
@@ -258,13 +406,66 @@ function doSave()
$e->sort = $_POST['sort'];
$e->content_visible = isset($_POST['content_visible']);
// gruppemanager immer array, leer wenn keine angegeben
$gruppemanager_uids = isset($_POST['gruppemanager']) && is_array($_POST['gruppemanager']) ? $_POST['gruppemanager'] : array();
// Prüfung: generierte Gruppen haben keine Manager
if (count($gruppemanager_uids) > 0 && $e->generiert === true)
{
echo "<span class='error'>Generierte Gruppen dürfen keine Administratoren haben!</span>";
return;
}
if(!$e->save())
echo $e->errormsg;
echo "<span class='error'>".$e->errormsg."</span>";
else // wenn Gruppe erfolgreich gespeichert, Gruppenmanager speichern
{
// Gruppe gemäss Konvention in Großbuchstaben
$gruppe_kurzbz = mb_strtoupper($_POST['kurzbz']);
// bestehende Gruppenmanager laden
$bestehende_gruppemanager_uids = array();
$gruppemanager_hlp = new gruppemanager();
if ($gruppemanager_hlp->load_uids($gruppe_kurzbz))
{
foreach ($gruppemanager_hlp->uids as $uid_obj)
{
$bestehende_gruppemanager_uids[] = $uid_obj->uid;
}
}
foreach ($gruppemanager_uids as $gruppemanager_uid)
{
// wenn Gruppenmanager noch nicht zugewiesen
if (!in_array($gruppemanager_uid, $bestehende_gruppemanager_uids))
{
// Gruppemanager speichern
$gruppemgr = new gruppemanager();
$gruppemgr->uid = $gruppemanager_uid;
$gruppemgr->gruppe_kurzbz = $gruppe_kurzbz;
$gruppemgr->insertamum = date('Y-m-d H:i:s');
$gruppemgr->insertvon = $user;
if(!$gruppemgr->save())
echo $gruppemgr->errormsg;
}
}
// zu löschende Gruppemanager ermitteln
$geloeschte_gruppemanager_uids = array_diff($bestehende_gruppemanager_uids, $gruppemanager_uids);
// Nicht mehr vorhandene Gruppenmanager löschen
$gruppemanager_hlp = new gruppemanager();
foreach ($geloeschte_gruppemanager_uids as $geloeschte_uid)
{
if (!$gruppemanager_hlp->delete($geloeschte_uid, $gruppe_kurzbz))
echo $gruppemanager_hlp->errormsg;
}
}
}
}
function doEdit($kurzbz,$new=false)
{
global $db, $rechte, $studiengang, $searchItems;
@@ -282,6 +483,9 @@ function doEdit($kurzbz,$new=false)
<form name="gruppe" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<p><b>Gruppe <?php echo ($new?'hinzufügen':'bearbeiten'); ?></b><br>
<table id="newFormTable" border="0">
<colgroup>
<col span="1" class="first-table-column">
</colgroup>
<tbody>
<tr>
<td>Kurzbezeichnung</td>
@@ -341,6 +545,44 @@ function doEdit($kurzbz,$new=false)
</td>
<td></td>
</tr>
<tr>
<td>Gruppenadministrator</td>
<?php
$gruppemanagerCellClass = '';
$gruppemanager_hlp = new gruppemanager();
$gruppemanager_uids_result = $gruppemanager_hlp->load_uids($e->gruppe_kurzbz);
// richtige Tabellenzeige Grösse wenn Administratoren vorhanden
if ($gruppemanager_uids_result === true)
{
$gruppemanagerCellClass = ' class="gruppenmanager-cell"';
}
?>
<td<?php echo $gruppemanagerCellClass ?> id="gruppenmanager-cell">
<input type="text" name="gruppemanager" id="gruppemanager" autofocus="autofocus" />
<span class="hiddenNotice" id="genGruppenManagerHinweis">
Generierte Gruppen dürfen keine Administratoren haben.
</span>
<?php
echo "<div class='manager-uid-container'>";
// alle Manager der Gruppe anzeigen
if ($gruppemanager_uids_result === true)
{
$count = 1;
foreach ($gruppemanager_hlp->uids as $uid_obj)
{
$ben = new benutzer($uid_obj->uid);
// Vorlagestring durch Werte ersetzen und ausgeben
echo sprintf(MANAGER_HTML, $uid_obj->uid, $ben->vorname, $ben->nachname, $uid_obj->uid);
if ($count % 5 == 0) // neue Zeile nach 5 Elementen
echo "<p class='manager-separator'></p>";
$count++;
}
}
?>
</td>
<td>Optional, Administratoren, die Benutzer zur Gruppe entfernen/hinzufügen können</td>
</tr>
<tr>
<td>Semester</td>
<td><input type="text" name="semester" size="2" maxlength="1" value="<?php echo $e->semester ?>"></td>