mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-28 23:03:01 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bd9d7845c | ||
|
|
5f196e1298 | ||
|
|
81312645f0 | ||
|
|
d768f89f52 | ||
|
|
b6f9d53a29 | ||
|
|
bf17450131 |
@@ -22,6 +22,109 @@ $config["list_columns"] = [
|
||||
];
|
||||
*/
|
||||
|
||||
$config['tabs'] =
|
||||
[
|
||||
'details' => [
|
||||
//all fields can be configured to be hidden, see class attribute stv-details-details-name for name
|
||||
'hiddenFields' => [],
|
||||
'hideUDFs' => false
|
||||
],
|
||||
|
||||
'prestudent' => [
|
||||
|
||||
//all fields can be configured to be hidden, see class attribute stv-details-prestudent-name for name
|
||||
'hiddenFields' => [
|
||||
|
||||
//propably used by FH-Communities
|
||||
'aufnahmeschluessel', 'standort_code', 'facheinschlaegigBerufstaetig'
|
||||
|
||||
],
|
||||
'hideUDFs' => false
|
||||
],
|
||||
'finalexam' => [
|
||||
'documents' => [
|
||||
'pruefungsprotokoll' => [
|
||||
'de' => [
|
||||
'Bakk' => 'PrProtBA',
|
||||
'Master' => 'PrProtMA',
|
||||
],
|
||||
'en' => [
|
||||
'Bakk' => 'PrProtBAEng',
|
||||
'Master' => 'PrProtMAEng',
|
||||
],
|
||||
],
|
||||
'pruefungszeugnis' => [
|
||||
'de' => [
|
||||
'Bakk' => 'Bakkzeugnis',
|
||||
'Master' => 'Diplomzeugnis',
|
||||
],
|
||||
'en' => [
|
||||
'Bakk' => 'BakkzeugnisEng',
|
||||
'Master' => 'DiplomzeugnisEng',
|
||||
],
|
||||
],
|
||||
'urkunde' => [
|
||||
'de' => [
|
||||
'Bakk' => 'Bakkurkunde',
|
||||
'Master' => 'Diplomurkunde',
|
||||
],
|
||||
'en' => [
|
||||
'Bakk' => 'BakkurkundeEng',
|
||||
'Master' => 'DiplomurkundeEng',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'exemptions' => [
|
||||
//if true, Anrechnungen can be added and edited in tab Anrechnungen
|
||||
'editableAnrechnungen' => false,
|
||||
],
|
||||
'notes' => [
|
||||
//if true, the count of Messages will be shown in the header of the Tab Messages
|
||||
'showCountNotes' => true,
|
||||
|
||||
//if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt'
|
||||
'showErweitert' => false,
|
||||
|
||||
//notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal"
|
||||
'notizLayout' => 'popupModal'
|
||||
],
|
||||
'combinePeople' => [
|
||||
//multitab should only be shown with this length of selection
|
||||
'validCountMulti' => 2,
|
||||
],
|
||||
];
|
||||
|
||||
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
|
||||
$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code'];
|
||||
|
||||
// List of fields to show when ZGV_ERFUELLT_ANZEIGEN is defined
|
||||
$fieldsZgvErfuellt = ['zgv_erfuellt', 'zgvmas_erfuellt','zgvdoktor_erfuellt'];
|
||||
|
||||
//order important: to show zgf_erfuellt_doktor just in case visibility of doktor is true
|
||||
if (!defined('ZGV_ERFUELLT_ANZEIGEN') || !ZGV_ERFUELLT_ANZEIGEN) {
|
||||
$config['tabs']['prestudent']['hiddenFields'] = array_merge(
|
||||
$config['tabs']['prestudent']['hiddenFields'], $fieldsZgvErfuellt
|
||||
);
|
||||
}
|
||||
|
||||
if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
|
||||
$config['tabs']['prestudent']['hiddenFields'] = array_merge(
|
||||
$config['tabs']['prestudent']['hiddenFields'],
|
||||
$fieldsZgvDoktor
|
||||
);
|
||||
}
|
||||
|
||||
$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] =
|
||||
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR')
|
||||
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR
|
||||
: '0.0';
|
||||
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] =
|
||||
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER')
|
||||
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER
|
||||
: '0.0';
|
||||
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0';
|
||||
|
||||
$config['student_tab_order'] = [
|
||||
'details',
|
||||
'notes',
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['showEditPermissions'] = [
|
||||
'admin'
|
||||
];
|
||||
@@ -1,116 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['showZahlungsbestaetigung'] = (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN);
|
||||
|
||||
$config['showBuchungsnrPermissions'] = ['admin'];
|
||||
|
||||
$config['showMahnspanne'] = (!defined('FAS_KONTO_SHOW_MAHNSPANNE') || FAS_KONTO_SHOW_MAHNSPANNE === true);
|
||||
|
||||
$config['showCreditpoints'] = (defined('FAS_KONTO_SHOW_CREDIT_POINTS') && FAS_KONTO_SHOW_CREDIT_POINTS == 'true');
|
||||
|
||||
$config['columns'] = [
|
||||
'buchungsdatum' => [
|
||||
'field' => "buchungsdatum",
|
||||
'title' => 'buchungsdatum',
|
||||
'titlePhrase' => 'konto/buchungsdatum'
|
||||
],
|
||||
'buchungstext' => [
|
||||
'field' => "buchungstext",
|
||||
'title' => 'buchungstext',
|
||||
'titlePhrase' => 'konto/buchungstext'
|
||||
],
|
||||
'betrag' => [
|
||||
'field' => "betrag",
|
||||
'title' => 'betrag',
|
||||
'titlePhrase' => 'konto/betrag'
|
||||
],
|
||||
'studiensemester_kurzbz' => [
|
||||
'field' => "studiensemester_kurzbz",
|
||||
'title' => 'studiensemester',
|
||||
'titlePhrase' => 'lehre/studiensemester'
|
||||
],
|
||||
'buchungstyp_kurzbz' => [
|
||||
'field' => "buchungstyp_kurzbz",
|
||||
'title' => 'buchungstyp',
|
||||
'titlePhrase' => 'konto/buchungstyp',
|
||||
'visible' => false
|
||||
],
|
||||
'buchungsnr' => [
|
||||
'field' => "buchungsnr",
|
||||
'title' => 'buchungsnr',
|
||||
'titlePhrase' => 'konto/buchungsnr',
|
||||
'visible' => false
|
||||
],
|
||||
'insertvon' => [
|
||||
'field' => "insertvon",
|
||||
'title' => 'insertvon',
|
||||
'titlePhrase' => 'global/insertvon',
|
||||
'visible' => false
|
||||
],
|
||||
'insertamum' => [
|
||||
'field' => "insertamum",
|
||||
'title' => 'insertamum',
|
||||
'titlePhrase' => 'global/insertamum',
|
||||
'visible' => false
|
||||
],
|
||||
'kuerzel' => [
|
||||
'field' => "kuerzel",
|
||||
'title' => 'studiengang',
|
||||
'titlePhrase' => 'lehre/studiengang',
|
||||
'visible' => false
|
||||
],
|
||||
'anmerkung' => [
|
||||
'field' => "anmerkung",
|
||||
'title' => 'anmerkung',
|
||||
'titlePhrase' => 'global/anmerkung'
|
||||
],
|
||||
'actions' => [
|
||||
'title' => 'actions',
|
||||
'titlePhrase' => 'global/actions',
|
||||
'frozen' => true
|
||||
]
|
||||
];
|
||||
|
||||
$config['columnsMultiPerson'] = [
|
||||
'person_id' => [
|
||||
'field' => "person_id",
|
||||
'title' => 'person_id',
|
||||
'titlePhrase' => 'person/person_id'
|
||||
],
|
||||
'anrede' => [
|
||||
'field' => "anrede",
|
||||
'title' => 'anrede',
|
||||
'titlePhrase' => 'person/anrede',
|
||||
'visible' => false
|
||||
],
|
||||
'titelpost' => [
|
||||
'field' => "titelpost",
|
||||
'title' => 'titelpost',
|
||||
'titlePhrase' => 'person/titelpost',
|
||||
'visible' => false
|
||||
],
|
||||
'titelpre' => [
|
||||
'field' => "titelpre",
|
||||
'title' => 'titelpre',
|
||||
'titlePhrase' => 'person/titelpre',
|
||||
'visible' => false
|
||||
],
|
||||
'vorname' => [
|
||||
'field' => "vorname",
|
||||
'title' => 'vorname',
|
||||
'titlePhrase' => 'person/vorname'
|
||||
],
|
||||
'vornamen' => [
|
||||
'field' => "vornamen",
|
||||
'title' => 'vornamen',
|
||||
'titlePhrase' => 'person/vornamen',
|
||||
'visible' => false
|
||||
],
|
||||
'nachname' => [
|
||||
'field' => "nachname",
|
||||
'title' => 'nachname',
|
||||
'titlePhrase' => 'person/nachname'
|
||||
]
|
||||
] + $config['columns'];
|
||||
|
||||
$config['additionalCols'] = [];
|
||||
@@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
//multitab should only be shown with this length of selection
|
||||
$config['validCountMulti'] = 2;
|
||||
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['showBankaccountPermissions'] = [
|
||||
'mitarbeiter/bankdaten',
|
||||
'student/bankdaten'
|
||||
];
|
||||
@@ -1,6 +0,0 @@
|
||||
<?php
|
||||
|
||||
//all fields can be configured to be hidden, see class attribute stv-details-details-name for name
|
||||
$config['hiddenFields'] = [];
|
||||
|
||||
$config['hideUDFs'] = false;
|
||||
@@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
//if true, Anrechnungen can be added and edited in tab Anrechnungen
|
||||
$config['editableAnrechnungen'] = false;
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['documents'] = [
|
||||
'pruefungsprotokoll' => [
|
||||
'de' => [
|
||||
'Bakk' => 'PrProtBA',
|
||||
'Master' => 'PrProtMA',
|
||||
],
|
||||
'en' => [
|
||||
'Bakk' => 'PrProtBAEng',
|
||||
'Master' => 'PrProtMAEng',
|
||||
],
|
||||
],
|
||||
'pruefungszeugnis' => [
|
||||
'de' => [
|
||||
'Bakk' => 'Bakkzeugnis',
|
||||
'Master' => 'Diplomzeugnis',
|
||||
],
|
||||
'en' => [
|
||||
'Bakk' => 'BakkzeugnisEng',
|
||||
'Master' => 'DiplomzeugnisEng',
|
||||
],
|
||||
],
|
||||
'urkunde' => [
|
||||
'de' => [
|
||||
'Bakk' => 'Bakkurkunde',
|
||||
'Master' => 'Diplomurkunde',
|
||||
],
|
||||
'en' => [
|
||||
'Bakk' => 'BakkurkundeEng',
|
||||
'Master' => 'DiplomurkundeEng',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
$config['hiddenFields'] = [
|
||||
'uhrzeit'
|
||||
];
|
||||
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['usePoints'] = (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE);
|
||||
// Possible values: both|header|inline
|
||||
$config['edit'] = 'both';
|
||||
|
||||
// Possible values: both|header|inline
|
||||
$config['delete'] = 'inline';
|
||||
|
||||
// Possible values: both|header|inline
|
||||
$config['documents'] = 'inline';
|
||||
|
||||
$config['documentslist'] = gradesDocumentsList();
|
||||
@@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['changeStatusToAbbrecherStglPermissions'] = [ 'admin' ];
|
||||
|
||||
$config['changeStatusToAbbrecherStudPermissions'] = [ 'admin' ];
|
||||
|
||||
$config['changeStatusToUnterbrecherPermissions'] = [ 'admin' ];
|
||||
|
||||
$config['changeStatusToDiplomandPermissions'] = [ 'admin' ];
|
||||
|
||||
$config['changeStatusToAbsolventPermissions'] = [ 'admin' ];
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
//if true, the count of Messages will be shown in the header of the Tab Messages
|
||||
$config['showCountNotes'] = true;
|
||||
|
||||
//if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt'
|
||||
$config['showErweitert'] = false;
|
||||
|
||||
//notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal"
|
||||
$config['notizLayout'] = 'popupModal';
|
||||
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
//all fields can be configured to be hidden, see class attribute stv-details-prestudent-name for name
|
||||
$config['hiddenFields'] = [
|
||||
//propably used by FH-Communities
|
||||
'aufnahmeschluessel', 'standort_code', 'facheinschlaegigBerufstaetig'
|
||||
];
|
||||
|
||||
$config['hideUDFs'] = false;
|
||||
|
||||
$config['showZgvErfuellt'] = (defined('ZGV_ERFUELLT_ANZEIGEN') && ZGV_ERFUELLT_ANZEIGEN);
|
||||
|
||||
$config['showZgvDoktor'] = (defined('ZGV_DOKTOR_ANZEIGEN') && ZGV_DOKTOR_ANZEIGEN);
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['defaultProjektbetreuerStunden'] =
|
||||
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR')
|
||||
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR
|
||||
: '0.0';
|
||||
$config['defaultProjektbetreuerStundenDiplom'] =
|
||||
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER')
|
||||
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER
|
||||
: '0.0';
|
||||
$config['defaultProjektbetreuerStundensatz'] = '80.0';
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<?php
|
||||
|
||||
$config['showStatusVorruecken'] = defined('STATUS_VORRUECKEN_ANZEIGEN') ? STATUS_VORRUECKEN_ANZEIGEN : true;
|
||||
@@ -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,
|
||||
|
||||
@@ -303,79 +303,68 @@ class Config extends FHCAPI_Controller
|
||||
{
|
||||
$this->load->helper('hlp_document');
|
||||
$result = [];
|
||||
$config = $this->config->item('tabs');
|
||||
|
||||
$result['details'] = [
|
||||
'title' => $this->p->t('stv', 'tab_details'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Details.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('details')
|
||||
'config' => $config['details']
|
||||
];
|
||||
|
||||
$result['notes'] = [
|
||||
'title' => $this->p->t('stv', 'tab_notes'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Notizen.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('notes'),
|
||||
'config' => $config['notes'],
|
||||
'showSuffix' => ($config['notes']['showCountNotes'] ?? false),
|
||||
'suffixhelper' => absoluteJsImportUrl('public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js')
|
||||
];
|
||||
$result['notes']['showSuffix'] = ($result['notes']['config']['notes']['showCountNotes'] ?? false);
|
||||
|
||||
$result['contact'] = [
|
||||
'title' => $this->p->t('stv', 'tab_contact'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('config', ['showBankaccount'])
|
||||
'config' => [
|
||||
'showBankaccount' => $this->permissionlib->isBerechtigt('mitarbeiter/bankdaten')
|
||||
|| $this->permissionlib->isBerechtigt('student/bankdaten')
|
||||
]
|
||||
];
|
||||
|
||||
$result['prestudent'] = [
|
||||
'title' => $this->p->t('stv', 'tab_prestudent'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('prestudent')
|
||||
'config' => $config['prestudent']
|
||||
];
|
||||
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
|
||||
$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code'];
|
||||
// List of fields to show when ZGV_ERFUELLT_ANZEIGEN is defined
|
||||
$fieldsZgvErfuellt = ['zgv_erfuellt', 'zgvmas_erfuellt','zgvdoktor_erfuellt'];
|
||||
//order important: to show zgf_erfuellt_doktor just in case visibility of doktor is true
|
||||
if (!$result['prestudent']['config']['showZgvErfuellt']) {
|
||||
$result['prestudent']['config']['hiddenFields'] = array_merge(
|
||||
$result['prestudent']['config']['hiddenFields'],
|
||||
$fieldsZgvErfuellt
|
||||
);
|
||||
}
|
||||
if (!$result['prestudent']['config']['showZgvDoktor']) {
|
||||
$result['prestudent']['config']['hiddenFields'] = array_merge(
|
||||
$result['prestudent']['config']['hiddenFields'],
|
||||
$fieldsZgvDoktor
|
||||
);
|
||||
}
|
||||
|
||||
$result['status'] = [
|
||||
'title' => 'Status',
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('status')
|
||||
'config' => [
|
||||
'showStatusVorruecken' => defined('STATUS_VORRUECKEN_ANZEIGEN') ? STATUS_VORRUECKEN_ANZEIGEN : true,
|
||||
]
|
||||
];
|
||||
|
||||
$result['documents'] = [
|
||||
'title' => $this->p->t('stv', 'tab_documents'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Dokumente.js')
|
||||
];
|
||||
|
||||
$result['banking'] = [
|
||||
'title' => $this->p->t('stv', 'tab_banking'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('banking', ['showBuchungsnr'])
|
||||
'config' => [
|
||||
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
|
||||
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'showMahnspanne' => (!defined('FAS_KONTO_SHOW_MAHNSPANNE') || FAS_KONTO_SHOW_MAHNSPANNE===true),
|
||||
'showCreditpoints' => (defined('FAS_KONTO_SHOW_CREDIT_POINTS') && FAS_KONTO_SHOW_CREDIT_POINTS == 'true'),
|
||||
'columns' => $this->kontoColumns(),
|
||||
'additionalCols' => []
|
||||
]
|
||||
];
|
||||
|
||||
$result['resources'] = [
|
||||
'title' => $this->p->t('stv', 'tab_resources'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Betriebsmittel.js'),
|
||||
'showOnlyWithUid' => true
|
||||
];
|
||||
|
||||
$result['groups'] = [
|
||||
'title' => $this->p->t('stv', 'tab_groups'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
|
||||
'showOnlyWithUid' => true
|
||||
];
|
||||
|
||||
$result['messages'] = [
|
||||
'title' => $this->p->t('stv', 'tab_messages'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'),
|
||||
@@ -385,7 +374,13 @@ class Config extends FHCAPI_Controller
|
||||
'title' => $this->p->t('stv', 'tab_grades'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Noten.js'),
|
||||
'showOnlyWithUid' => true,
|
||||
'config' => $this->getTabConfigFromConfigFile('grades')
|
||||
'config' => [
|
||||
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
|
||||
'edit' => 'both', // Possible values: both|header|inline
|
||||
'delete' => 'inline', // Possible values: both|header|inline
|
||||
'documents' => 'inline', // Possible values: both|header|inline
|
||||
'documentslist' => gradesDocumentsList()
|
||||
]
|
||||
];
|
||||
|
||||
$result['exam'] = [
|
||||
@@ -397,22 +392,25 @@ class Config extends FHCAPI_Controller
|
||||
$result['exemptions'] = [
|
||||
'title' => $this->p->t('lehre', 'anrechnungen'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('exemptions')
|
||||
'config' => $config['exemptions']
|
||||
];
|
||||
|
||||
$result['finalexam'] = [
|
||||
'title' => $this->p->t('stv', 'tab_finalexam'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
|
||||
'showOnlyWithUid' => true,
|
||||
'config' => $this->getTabConfigFromConfigFile('finalexam')
|
||||
'config' => $config['finalexam']
|
||||
];
|
||||
|
||||
$result['projektarbeit'] = [
|
||||
'title' => $this->p->t('stv', 'tab_projektarbeit'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('projektarbeit')
|
||||
'config' => array_merge(
|
||||
$config['projektarbeit'],
|
||||
['showVertragsdetails' =>
|
||||
defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN]
|
||||
)
|
||||
];
|
||||
$result['projektarbeit']['config']['showVertragsdetails'] = (defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN);
|
||||
|
||||
$result['mobility'] = [
|
||||
'title' => $this->p->t('stv', 'tab_mobility'),
|
||||
@@ -423,7 +421,9 @@ class Config extends FHCAPI_Controller
|
||||
$result['archive'] = [
|
||||
'title' => $this->p->t('stv', 'tab_archive'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('archive', ['showEdit'])
|
||||
'config' => [
|
||||
'showEdit' => $this->permissionlib->isBerechtigt('admin')
|
||||
]
|
||||
];
|
||||
|
||||
$result['jointstudies'] = [
|
||||
@@ -460,42 +460,47 @@ class Config extends FHCAPI_Controller
|
||||
public function students()
|
||||
{
|
||||
$result = [];
|
||||
|
||||
$config = $this->config->item('tabs');
|
||||
$result['banking'] = [
|
||||
'title' => $this->p->t('stv', 'tab_banking'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('banking', ['showBuchungsnr'])
|
||||
'config' => [
|
||||
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
|
||||
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'showMahnspanne' => (!defined('FAS_KONTO_SHOW_MAHNSPANNE') || FAS_KONTO_SHOW_MAHNSPANNE===true),
|
||||
'showCreditpoints' => (defined('FAS_KONTO_SHOW_CREDIT_POINTS') && FAS_KONTO_SHOW_CREDIT_POINTS == 'true'),
|
||||
'columns' => $this->kontoColumnsMultiPerson(),
|
||||
'additionalCols' => []
|
||||
]
|
||||
];
|
||||
$result['banking']['config']['columns'] = $result['banking']['config']['columnsMultiPerson'];
|
||||
|
||||
$result['groups'] = [
|
||||
'title' => $this->p->t('stv', 'tab_groups'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
|
||||
'showOnlyWithUid' => true
|
||||
];
|
||||
|
||||
$result['status'] = [
|
||||
'title' => 'Status',
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('multiStatus', [
|
||||
'changeStatusToAbbrecherStgl',
|
||||
'changeStatusToAbbrecherStud',
|
||||
'changeStatusToUnterbrecher',
|
||||
'changeStatusToDiplomand',
|
||||
'changeStatusToAbsolvent'
|
||||
])
|
||||
'config' => [
|
||||
'changeStatusToAbbrecherStgl' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'changeStatusToAbbrecherStud' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'changeStatusToUnterbrecher' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'changeStatusToDiplomand' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'changeStatusToAbsolvent' => $this->permissionlib->isBerechtigt('admin')
|
||||
]
|
||||
];
|
||||
|
||||
$result['finalexam'] = [
|
||||
'title' => $this->p->t('stv', 'tab_finalexam'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
|
||||
'showOnlyWithUid' => true,
|
||||
'config' => $this->getTabConfigFromConfigFile('finalexam')
|
||||
'config' => $config['finalexam']
|
||||
];
|
||||
$result['archive'] = [
|
||||
'title' => $this->p->t('stv', 'tab_archive'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('archive', ['showEdit'])
|
||||
'config' => [
|
||||
'showEdit' => $this->permissionlib->isBerechtigt('admin')
|
||||
]
|
||||
];
|
||||
|
||||
if($this->permissionlib->isBerechtigt('basis/person'))
|
||||
@@ -503,7 +508,7 @@ class Config extends FHCAPI_Controller
|
||||
$result['combinePeople'] = [
|
||||
'title' => $this->p->t('stv', 'tab_combine_people'),
|
||||
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/CombinePeople.js'),
|
||||
'config' => $this->getTabConfigFromConfigFile('combinePeople')
|
||||
'config' => $config['combinePeople']
|
||||
];
|
||||
}
|
||||
|
||||
@@ -526,35 +531,96 @@ class Config extends FHCAPI_Controller
|
||||
$this->terminateWithSuccess($this->sortTabList($result, $sortConfig));
|
||||
}
|
||||
|
||||
/**
|
||||
* Load config and return it as array
|
||||
*
|
||||
* @param string $file
|
||||
* @param array $convertPermission
|
||||
* @return array
|
||||
*/
|
||||
protected function getTabConfigFromConfigFile($file, $convertPermissions = [])
|
||||
protected function kontoColumns()
|
||||
{
|
||||
$this->config->load('stv/tabs/' . $file, true, true);
|
||||
$config = $this->config->item('stv/tabs/' . $file) ?? [];
|
||||
|
||||
// convert permissions into booleans
|
||||
if (!is_array($convertPermissions))
|
||||
$convertPermissions = [ $convertPermissions ];
|
||||
|
||||
foreach ($convertPermissions as $permKey => $resultKey) {
|
||||
if (is_numeric($permKey))
|
||||
$permKey = $resultKey . 'Permissions';
|
||||
$permissions = $config[$permKey] ?? [];
|
||||
foreach ($permissions as $permission) {
|
||||
if ($this->permissionlib->isBerechtigt($permission)) {
|
||||
$config[$resultKey] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $config;
|
||||
return [
|
||||
'buchungsdatum' => [
|
||||
'field' => "buchungsdatum",
|
||||
'title' => $this->p->t('konto', 'buchungsdatum')
|
||||
],
|
||||
'buchungstext' => [
|
||||
'field' => "buchungstext",
|
||||
'title' => $this->p->t('konto', 'buchungstext')
|
||||
],
|
||||
'betrag' => [
|
||||
'field' => "betrag",
|
||||
'title' => $this->p->t('konto', 'betrag')
|
||||
],
|
||||
'studiensemester_kurzbz' => [
|
||||
'field' => "studiensemester_kurzbz",
|
||||
'title' => $this->p->t('lehre', 'studiensemester')
|
||||
],
|
||||
'buchungstyp_kurzbz' => [
|
||||
'field' => "buchungstyp_kurzbz",
|
||||
'title' => $this->p->t('konto', 'buchungstyp'),
|
||||
'visible' => false
|
||||
],
|
||||
'buchungsnr' => [
|
||||
'field' => "buchungsnr",
|
||||
'title' => $this->p->t('konto', 'buchungsnr'),
|
||||
'visible' => false
|
||||
],
|
||||
'insertvon' => [
|
||||
'field' => "insertvon",
|
||||
'title' => $this->p->t('global', 'insertvon'),
|
||||
'visible' => false
|
||||
],
|
||||
'insertamum' => [
|
||||
'field' => "insertamum",
|
||||
'title' => $this->p->t('global', 'insertamum'),
|
||||
'visible' => false
|
||||
],
|
||||
'kuerzel' => [
|
||||
'field' => "kuerzel",
|
||||
'title' => $this->p->t('lehre', 'studiengang'),
|
||||
'visible' => false
|
||||
],
|
||||
'anmerkung' => [
|
||||
'field' => "anmerkung",
|
||||
'title' => $this->p->t('global', 'anmerkung')
|
||||
],
|
||||
'actions' => [
|
||||
'title' => $this->p->t('global', 'actions'),
|
||||
'frozen' => true
|
||||
]
|
||||
];
|
||||
}
|
||||
protected function kontoColumnsMultiPerson()
|
||||
{
|
||||
return [
|
||||
'person_id' => [
|
||||
'field' => "person_id",
|
||||
'title' => $this->p->t('person', 'person_id')
|
||||
],
|
||||
'anrede' => [
|
||||
'field' => "anrede",
|
||||
'title' => $this->p->t('person', 'anrede'),
|
||||
'visible' => false
|
||||
],
|
||||
'titelpost' => [
|
||||
'field' => "titelpost",
|
||||
'title' => $this->p->t('person', 'titelpost'),
|
||||
'visible' => false
|
||||
],
|
||||
'titelpre' => [
|
||||
'field' => "titelpre",
|
||||
'title' => $this->p->t('person', 'titelpre'),
|
||||
'visible' => false
|
||||
],
|
||||
'vorname' => [
|
||||
'field' => "vorname",
|
||||
'title' => $this->p->t('person', 'vorname')
|
||||
],
|
||||
'vornamen' => [
|
||||
'field' => "vornamen",
|
||||
'title' => $this->p->t('person', 'vornamen'),
|
||||
'visible' => false
|
||||
],
|
||||
'nachname' => [
|
||||
'field' => "nachname",
|
||||
'title' => $this->p->t('person', 'nachname')
|
||||
]
|
||||
] + $this->kontoColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -22,7 +22,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
pickerWidgets() {
|
||||
return this.widgets.filter(widget => widget.allowed);
|
||||
return this.widgets.filter(widget => widget.allowed).map(widget => ({ ...widget, permitted: true }));
|
||||
},
|
||||
sizeLimits() {
|
||||
return Object.fromEntries(this.widgets.map(({ setup, widget_id: type }) => {
|
||||
|
||||
@@ -6,10 +6,16 @@ export default {
|
||||
BsModal,
|
||||
WidgetIcon,
|
||||
},
|
||||
props: [
|
||||
"widgets",
|
||||
"hiddenWidgets"
|
||||
],
|
||||
props: {
|
||||
widgets: {
|
||||
type: [ Array, null ],
|
||||
required: true
|
||||
},
|
||||
hiddenWidgets: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
},
|
||||
data: () => ({
|
||||
callbacks: {}
|
||||
}),
|
||||
|
||||
+4
-23
@@ -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>
|
||||
`
|
||||
}
|
||||
|
||||
@@ -127,7 +127,6 @@ export default {
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
dataTree: true,
|
||||
columns: this.tabulatorColumns,
|
||||
locale: true,
|
||||
selectableRows: true,
|
||||
selectableRowsRangeMode: 'click',
|
||||
index: 'buchungsnr',
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
function loadCss(path) {
|
||||
if (!document.head) {
|
||||
return new Promise((resolve, reject) => {
|
||||
window.addEventListener('load', () => loadCss(path).then(resolve).catch(reject));
|
||||
});
|
||||
}
|
||||
if (path.match(/^\/[^\/]/))
|
||||
path = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/\/$/, "") + path;
|
||||
|
||||
if (document.querySelector('link[href="' + path + '"]'))
|
||||
return Promise.resolve();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const link = document.createElement('link');
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
|
||||
link.onload = resolve;
|
||||
link.onerror = reject;
|
||||
|
||||
link.href = path;
|
||||
|
||||
document.head.append(link);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
export {
|
||||
loadCss,
|
||||
};
|
||||
|
||||
export default {
|
||||
loadCss,
|
||||
};
|
||||
@@ -62,3 +62,7 @@ function splitWordsInCamelCase(string) {
|
||||
splitWords.push(string.slice(lastUpperCaseLetterIndex));
|
||||
return splitWords;
|
||||
}
|
||||
|
||||
export function isString(str) {
|
||||
return typeof str === 'string' || str instanceof String;
|
||||
}
|
||||
|
||||
@@ -2153,6 +2153,46 @@ $phrases = array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'aborted_by_user',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Abbruch durch Benutzer',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Aborted by the user',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'no_preview_available',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Keine Vorschau verfügbar',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'No preview available',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'anrechnung',
|
||||
@@ -67370,6 +67410,128 @@ I have been informed that I am under no obligation to consent to the transmissio
|
||||
)
|
||||
),
|
||||
// ### Phrases Dashboard Studstatus Widget END
|
||||
// ### Phrases Dashboard OpenProject Widget START
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_login',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'In OpenProject anmelden',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Login to OpenProject',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listWpOpen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Offene WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Open WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listWpOverdue',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Überfällige WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Overdue WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listWpNew',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Neue WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'New WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listMentioned',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Erwähnungen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Mentions',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_select_endpoint',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Anzeigen:',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Show:',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
// ### Phrases Dashboard OpenProject Widget END
|
||||
//******************* CORE/reservierung
|
||||
array(
|
||||
'app' => 'core',
|
||||
|
||||
Reference in New Issue
Block a user