mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
Moved embedded js-script within view files --> to own javascript files
Moved out all js related code from views lehrauftrag bestellen/erteilen/akzeptieren to own javascript files.
This commit is contained in:
@@ -1,3 +1,11 @@
|
||||
<script>
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars to be known in public/js/lehre/lehrauftrag/acceptLehrauftrag.js
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Store boolean has_inkludierteLehre. If true, used to hide column Betrag.
|
||||
var has_inkludierteLehre = new Boolean(<?php echo $has_inkludierteLehre ?>).valueOf();
|
||||
</script>
|
||||
|
||||
<?php
|
||||
$this->load->view(
|
||||
'templates/FHC-Header',
|
||||
@@ -18,8 +26,9 @@ $this->load->view(
|
||||
'phrases' => array(
|
||||
'global' => array('lehrauftraegeAnnehmen'),
|
||||
),
|
||||
// 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css',
|
||||
'customJSs' => array('public/js/bootstrapper.js')
|
||||
'customJSs' => array(
|
||||
'public/js/bootstrapper.js',
|
||||
'public/js/lehre/lehrauftrag/acceptLehrauftrag.js')
|
||||
)
|
||||
);
|
||||
|
||||
@@ -92,561 +101,3 @@ $this->load->view(
|
||||
|
||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
// Store boolean has_inkludierteLehre. If true, used to hide column Betrag.
|
||||
var has_inkludierteLehre = new Boolean(<?php echo $has_inkludierteLehre ?>).valueOf();
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0"+(d.getMonth()+1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell){
|
||||
if (cell.getValue() == null){
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters erteilte initially
|
||||
function func_initialFilter(){
|
||||
return [
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt
|
||||
{field: 'erteilt', type: '!=', value: null}, // AND erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert
|
||||
]
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- orange: geaendert
|
||||
- default: bestellte und erteilte (= zu akzeptierende)
|
||||
- green: akzeptierte
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden)
|
||||
{
|
||||
cell.getElement().classList.add('bg-warning'); // geaenderte
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return; // bestellte + erteilte
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptierte
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// only allow to select bestellte && erteilte && nicht geaenderte Lehraufträge
|
||||
return row.getData().bestellt != null && // bestellt
|
||||
row.getData().erteilt != null && // AND erteilt
|
||||
row.getData().akzeptiert == null && // AND nicht akzeptiert
|
||||
betrag == vertrag_betrag &&
|
||||
stunden == vertrag_stunden; // OR nicht geaenderte
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// Set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Deselect and disable new selection of updated rows
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
// Hide betrag, if lector has inkludierte Lehre
|
||||
function func_renderComplete(table){
|
||||
|
||||
// If the lectors actual Verwendung has inkludierte Lehre, hide the column betrag
|
||||
if (has_inkludierteLehre)
|
||||
{
|
||||
table.hideColumn("betrag");
|
||||
}
|
||||
}
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows and ignore rows that are bestellt and erteilt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#filterTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().bestellt != null && // bestellt
|
||||
row.getData().erteilt != null && // AND erteilt
|
||||
row.getData().akzeptiert == null && // AND NOT akzeptiert
|
||||
row.getData().status != 'Geändert') // AND NOT geändert
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#filterTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Annehmen ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (bestellt != null && isNaN(vertrag_betrag))
|
||||
{
|
||||
return "<i class='fas fa-user-minus'></i>"; // kein Vertrag
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
// return "<i class='fas fa-user-graduate'></i>";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
var text = 'Lehrauftrag in Bearbeitung. ';
|
||||
|
||||
if (bestellt != null && erteilt == null && akzeptiert == null
|
||||
&& (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when never erteilt before)
|
||||
{
|
||||
text += 'Wartet auf Erteilung.';
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null
|
||||
&& (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when has been erteilt once)
|
||||
{
|
||||
text += 'Wartet auf erneute Erteilung.';
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#filterTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter', [
|
||||
{field: 'bestellt', type: '!=', value: null}, // filter when is bestellt
|
||||
{field: 'erteilt', type: '!=', value: null}, // and is erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // and is not akzeptiert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with akzeptierte lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
});
|
||||
|
||||
// Approve Lehrauftraege
|
||||
$("#accept-lehrauftraege").click(function(){
|
||||
|
||||
// Get selected rows data
|
||||
var selected_data = $('#filterTabulator').tabulator('getSelectedData')
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index' : data.row_index,
|
||||
'vertrag_id' : data.vertrag_id
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
|
||||
// Emtpy password field
|
||||
$("#password").val('');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Get password for verification
|
||||
var password = $("#password").val();
|
||||
if (password == '')
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte verifizieren Sie sich mit Ihrem Login Passwort.');
|
||||
|
||||
// Focus on password field
|
||||
$("#password").focus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare data object for ajax call
|
||||
var data = {
|
||||
'password': password,
|
||||
'selected_data': selected_data
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/acceptLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (data.error)
|
||||
{
|
||||
// Password not verified
|
||||
FHC_DialogLib.alertWarning(data.retval);
|
||||
}
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Erteilt'
|
||||
$('#filterTabulator').tabulator('updateData', data.retval);
|
||||
FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden akzeptiert.");
|
||||
}
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// Empty password field
|
||||
$("#password").val('');
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -18,7 +18,10 @@ $this->load->view(
|
||||
'phrases' => array(
|
||||
'global' => array('lehrauftraegeErteilen'),
|
||||
),
|
||||
'customJSs' => array('public/js/bootstrapper.js')
|
||||
'customJSs' => array(
|
||||
'public/js/bootstrapper.js',
|
||||
'public/js/lehre/lehrauftrag/approveLehrauftrag.js'
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
@@ -123,605 +126,3 @@ $this->load->view(
|
||||
</body>
|
||||
|
||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell){
|
||||
if (cell.getValue() == null){
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters bestellte initially
|
||||
function func_initialFilter(){
|
||||
return [
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector
|
||||
{field: 'bestellt', type: '!=', value: null}, // AND bestellt
|
||||
{field: 'erteilt', type: '=', value: null}, // AND NOT erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert
|
||||
]
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formats the group header
|
||||
function func_groupHeader(data){
|
||||
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
|
||||
};
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- blue: dummy lectors
|
||||
- orange: geaendert
|
||||
- default (white) : bestellte
|
||||
- green: akzeptiert
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if(is_dummy)
|
||||
{
|
||||
cell.getElement().classList.add('bg-info'); // dummy lectors
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden &&
|
||||
!row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows
|
||||
{
|
||||
cell.getElement().classList.add('bg-warning'); // geaenderte
|
||||
}
|
||||
else if(bestellt != null && erteilt == null)
|
||||
{
|
||||
return; // bestellt
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// only allow to select bestellte Lehraufträge
|
||||
return !is_dummy && // NOT dummy lector
|
||||
row.getData().bestellt != null && // AND NOT neue
|
||||
row.getData().erteilt == null && // AND bestellt
|
||||
betrag == vertrag_betrag &&
|
||||
stunden == vertrag_stunden; // AND nicht geändert
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Deselect and disable new selection of updated rows
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows that are bestellt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#filterTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
|
||||
row.getData().bestellt != null && // AND bestellt
|
||||
row.getData().erteilt == null && // AND NOT erteilt
|
||||
row.getData().status != 'Geändert') // AND NOT geaendert
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#filterTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Erteilung ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (is_dummy)
|
||||
{
|
||||
return "<i class='fa fa-user-secret'></i>"; // dummy lector
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
// return "<i class='fas fa-user-graduate'></i>";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden)){
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
var text = 'Lehrauftragstunden/-stundensatz geändert.';
|
||||
text += "\n";
|
||||
|
||||
if (is_dummy) // dummy (no lector)
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Ohne Lektor verplant.'
|
||||
}
|
||||
else if ((bestellt != null && erteilt == null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && erteilt == null && stunden != vertrag_stunden)) // geaendert (when never erteilt before)
|
||||
{
|
||||
return text += 'Wartet auf Bestellung, danach Erteilen möglich.';
|
||||
}
|
||||
else if ((bestellt != null && erteilt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && erteilt != null && stunden != vertrag_stunden)) // geaendert (when has been erteilt once)
|
||||
{
|
||||
return text += 'Wartet auf neuerliche Bestellung, danach erneut Erteilen möglich.';
|
||||
}
|
||||
else if (bestellt == null) // neu
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Wartet auf Bestellung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#filterTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with new lehrauftraege (not dummy lectors)
|
||||
$("#show-new").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with accepted lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-dummies").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '!=', value: null},
|
||||
{field: 'personalnummer', type: '<=', value: 0},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-changed").click(function(){
|
||||
// needs custom filter to compare fields betrag and vertrag_betrag
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt AND
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
case 'show-changed':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_CHANGED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag erteilen'
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
|
||||
// Enable button 'Lehrauftrag bestellen' by default
|
||||
$('#approve-lehrauftraege').attr('disabled', false).attr('title', '');
|
||||
|
||||
// Disable button Lehrauftrag bestellen for dummies
|
||||
if (this.id == 'show-dummies')
|
||||
{
|
||||
$('#approve-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.');
|
||||
}
|
||||
});
|
||||
|
||||
// Approve Lehrauftraege
|
||||
$("#approve-lehrauftraege").click(function(){
|
||||
|
||||
var selected_data = $('#filterTabulator').tabulator('getSelectedData')
|
||||
.filter(function(val){
|
||||
// filter pseudo lines of groupBy (e.g. the bottom calculations lines)
|
||||
return val.row_index != null || typeof(val.row_index) !== 'undefined';
|
||||
})
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index': data.row_index,
|
||||
'mitarbeiter_uid' : data.mitarbeiter_uid,
|
||||
'vertrag_id' : data.vertrag_id
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare data object for ajax call
|
||||
* NOTE: Stringify to send only ONE post param (json string) instead of many single post params.
|
||||
* This avoids issues with POST param limitation.
|
||||
*/
|
||||
var data = {
|
||||
'selected_data': JSON.stringify(selected_data)
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/approveLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Erteilt'
|
||||
$('#filterTabulator').tabulator('updateData', data.retval);
|
||||
}
|
||||
|
||||
FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden erteilt.");
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -19,7 +19,10 @@ $this->load->view(
|
||||
'phrases' => array(
|
||||
'global' => array('lehrauftraegeBestellen'),
|
||||
),
|
||||
'customJSs' => array('public/js/bootstrapper.js')
|
||||
'customJSs' => array(
|
||||
'public/js/bootstrapper.js',
|
||||
'public/js/lehre/lehrauftrag/orderLehrauftrag.js'
|
||||
)
|
||||
)
|
||||
);
|
||||
?>
|
||||
@@ -121,629 +124,4 @@ $this->load->view(
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell){
|
||||
if (cell.getValue() == null){
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
* Filters neue AND geaenderte initially
|
||||
* NOTE: This is a workaround. The tabulators callback initialFilter is not used here because
|
||||
* it is processed before the callback tableBuilt, where the status is going to be built.
|
||||
* The callback dataLoaded is processed after tableBuild and provides the status.
|
||||
*/
|
||||
function func_dataLoaded(data, table){
|
||||
table.setFilter([
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // not dummy lector AND
|
||||
[
|
||||
{field: 'status', type: '=', value: 'Neu'}, // neu OR
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formats the group header
|
||||
function func_groupHeader(data){
|
||||
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
|
||||
};
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
// console.log(betrag);
|
||||
// console.log(vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- blue: dummy lectors
|
||||
- bold: geaendert
|
||||
- default (white): neu und erteilt
|
||||
- green: akzeptiert
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if(is_dummy)
|
||||
{
|
||||
cell.getElement().classList.add('bg-info'); // dummy lectors
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden &&
|
||||
!row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows
|
||||
{
|
||||
row.getElement().style['font-weight'] = 'bold'; // geaendert
|
||||
}
|
||||
else if(bestellt == null)
|
||||
{
|
||||
return; // neu und erteilt
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// Only allow to select neue and geaenderte
|
||||
return !is_dummy && // NOT dummy lector
|
||||
row.getData().bestellt == null || // AND neue
|
||||
row.getData().bestellt != null && betrag != vertrag_betrag || // OR geaenderte
|
||||
row.getData().bestellt != null && stunden != vertrag_stunden // OR geanderte (if betrag is 0 or null)
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Format font-weight normal (needed after geaenderte were bestellt)
|
||||
row.getElement().style['font-weight'] = 'normal';
|
||||
|
||||
// Deselect and disable new selection of updated rows (ordering done)
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows and ignore rows which have status bestellt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#filterTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
|
||||
row.getData().bestellt == null || // AND neu
|
||||
row.getData().bestellt != null && // OR (bestellt
|
||||
row.getData().status == 'Geändert') // AND geaendert)
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#filterTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Bestellung ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (is_dummy)
|
||||
{
|
||||
return "<i class='fa fa-user-secret'></i>"; // dummy lector
|
||||
}
|
||||
else if (bestellt != null && isNaN(vertrag_betrag))
|
||||
{
|
||||
return "<i class='fa fa-user-minus'></i>"; // kein Vertrag
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var stundensatz = cell.getRow().getData().stundensatz;
|
||||
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
var vertrag_stundensatz = 0;
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// Calculate vertrag stundensatz
|
||||
if (vertrag_stunden != 0)
|
||||
{
|
||||
vertrag_stundensatz = vertrag_betrag/vertrag_stunden;
|
||||
}
|
||||
|
||||
// Return tooltip message
|
||||
if (is_dummy) // dummy (no lector)
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Ohne Lektor verplant.'
|
||||
}
|
||||
else if (isNaN(vertrag_betrag)) // neu
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Wartet auf Bestellung.'
|
||||
}
|
||||
else if (betrag != vertrag_betrag || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert (if betrag is 0 or null)
|
||||
{
|
||||
var text = 'NACH Änderung: Stundensatz: ' + stundensatz + ' Stunden: ' + stunden;
|
||||
text += "\n";
|
||||
text += 'VOR Änderung:' + '\xa0\xa0\xa0' + 'Stundensatz: ' + vertrag_stundensatz + ' Stunden: ' + vertrag_stunden;
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#filterTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with new lehrauftraege (not dummy lectors)
|
||||
$("#show-new").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with akzeptierte lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with geaenderte lectors
|
||||
$("#show-changed").click(function(){
|
||||
// needs custom filter to compare fields betrag and vertrag_betrag
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt AND
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-dummies").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '!=', value: null},
|
||||
{field: 'personalnummer', type: '<=', value: 0},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
case 'show-changed':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_CHANGED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag bestellen'
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
|
||||
//Enable button 'Lehrauftrag bestellen' by default
|
||||
$('#order-lehrauftraege').attr('disabled', false).attr('title', '');
|
||||
|
||||
// Disable button Lehrauftrag bestellen for dummies
|
||||
if (this.id == 'show-dummies')
|
||||
{
|
||||
$('#order-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.');
|
||||
}
|
||||
});
|
||||
|
||||
// Order Lehrauftraege
|
||||
$("#order-lehrauftraege").click(function(){
|
||||
|
||||
var selected_data = $('#filterTabulator').tabulator('getSelectedData')
|
||||
.filter(function(val){
|
||||
// filter pseudo lines of groupBy (e.g. the bottom calculations lines)
|
||||
return val.row_index != null || typeof(val.row_index) !== 'undefined';
|
||||
})
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index' : data.row_index,
|
||||
'lehreinheit_id' : data.lehreinheit_id,
|
||||
'lehrveranstaltung_id' : data.lehrveranstaltung_id,
|
||||
'person_id' : data.person_id,
|
||||
'mitarbeiter_uid' : data.mitarbeiter_uid,
|
||||
'vertrag_id' : data.vertrag_id,
|
||||
'projektarbeit_id' : data.projektarbeit_id,
|
||||
'stunden' : data.stunden,
|
||||
'betrag' : data.betrag,
|
||||
'vertrag_betrag' : data.vertrag_betrag,
|
||||
'studiensemester_kurzbz' : data.studiensemester_kurzbz,
|
||||
'studiengang_kz' : data.studiengang_kz,
|
||||
'lv_oe_kurzbz' : data.lv_oe_kurzbz
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare data object for ajax call
|
||||
* NOTE: Stringify to send only ONE post param (json string) instead of many single post params.
|
||||
* This avoids issues with POST param limitation.
|
||||
*/
|
||||
var data = {
|
||||
'selected_data': JSON.stringify(selected_data)
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/orderLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Bestellt'
|
||||
$('#filterTabulator').tabulator('updateData', data.retval);
|
||||
}
|
||||
|
||||
FHC_DialogLib.alertSuccess("Alle " + data.retval.length + " Lehraufträge wurden bestellt.")
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Sytemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
||||
@@ -0,0 +1,562 @@
|
||||
/**
|
||||
* Javascript file for Lehrauftraege annehmen view and tabulator
|
||||
* Lehrauftraege annehmen: acceptLehrauftrag.php
|
||||
* Lehrauftraege annehmen - Tabulator: acceptLehrauftragData.php
|
||||
*/
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
// Store boolean has_inkludierteLehre. If true, used to hide column Betrag.
|
||||
// has_inkludierteLehre is defined in acceptLehrauftrag.php BEFORE loading this js-script (to pass php variable)
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0"+(d.getMonth()+1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell){
|
||||
if (cell.getValue() == null){
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters erteilte initially
|
||||
function func_initialFilter(){
|
||||
return [
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt
|
||||
{field: 'erteilt', type: '!=', value: null}, // AND erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert
|
||||
]
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- orange: geaendert
|
||||
- default: bestellte und erteilte (= zu akzeptierende)
|
||||
- green: akzeptierte
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden)
|
||||
{
|
||||
cell.getElement().classList.add('bg-warning'); // geaenderte
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return; // bestellte + erteilte
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptierte
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// only allow to select bestellte && erteilte && nicht geaenderte Lehraufträge
|
||||
return row.getData().bestellt != null && // bestellt
|
||||
row.getData().erteilt != null && // AND erteilt
|
||||
row.getData().akzeptiert == null && // AND nicht akzeptiert
|
||||
betrag == vertrag_betrag &&
|
||||
stunden == vertrag_stunden; // OR nicht geaenderte
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// Set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Deselect and disable new selection of updated rows
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
// Hide betrag, if lector has inkludierte Lehre
|
||||
function func_renderComplete(table){
|
||||
|
||||
// If the lectors actual Verwendung has inkludierte Lehre, hide the column betrag
|
||||
if (has_inkludierteLehre)
|
||||
{
|
||||
table.hideColumn("betrag");
|
||||
}
|
||||
}
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows and ignore rows that are bestellt and erteilt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#filterTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().bestellt != null && // bestellt
|
||||
row.getData().erteilt != null && // AND erteilt
|
||||
row.getData().akzeptiert == null && // AND NOT akzeptiert
|
||||
row.getData().status != 'Geändert') // AND NOT geändert
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#filterTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Annehmen ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (bestellt != null && isNaN(vertrag_betrag))
|
||||
{
|
||||
return "<i class='fas fa-user-minus'></i>"; // kein Vertrag
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
// return "<i class='fas fa-user-graduate'></i>";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
var text = 'Lehrauftrag in Bearbeitung. ';
|
||||
|
||||
if (bestellt != null && erteilt == null && akzeptiert == null
|
||||
&& (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when never erteilt before)
|
||||
{
|
||||
text += 'Wartet auf Erteilung.';
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null
|
||||
&& (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when has been erteilt once)
|
||||
{
|
||||
text += 'Wartet auf erneute Erteilung.';
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#filterTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter', [
|
||||
{field: 'bestellt', type: '!=', value: null}, // filter when is bestellt
|
||||
{field: 'erteilt', type: '!=', value: null}, // and is erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // and is not akzeptiert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with akzeptierte lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
});
|
||||
|
||||
// Approve Lehrauftraege
|
||||
$("#accept-lehrauftraege").click(function(){
|
||||
|
||||
// Get selected rows data
|
||||
var selected_data = $('#filterTabulator').tabulator('getSelectedData')
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index' : data.row_index,
|
||||
'vertrag_id' : data.vertrag_id
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
|
||||
// Emtpy password field
|
||||
$("#password").val('');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Get password for verification
|
||||
var password = $("#password").val();
|
||||
if (password == '')
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte verifizieren Sie sich mit Ihrem Login Passwort.');
|
||||
|
||||
// Focus on password field
|
||||
$("#password").focus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare data object for ajax call
|
||||
var data = {
|
||||
'password': password,
|
||||
'selected_data': selected_data
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/acceptLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (data.error)
|
||||
{
|
||||
// Password not verified
|
||||
FHC_DialogLib.alertWarning(data.retval);
|
||||
}
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Erteilt'
|
||||
$('#filterTabulator').tabulator('updateData', data.retval);
|
||||
FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden akzeptiert.");
|
||||
}
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// Empty password field
|
||||
$("#password").val('');
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
@@ -0,0 +1,608 @@
|
||||
/**
|
||||
* Javascript file for Lehrauftraege erteilen view and tabulator
|
||||
* Lehrauftraege erteilen: approveLehrauftrag.php
|
||||
* Lehrauftraege erteilen - Tabulator: approveLehrauftragData.php
|
||||
*/
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell){
|
||||
if (cell.getValue() == null){
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters bestellte initially
|
||||
function func_initialFilter(){
|
||||
return [
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector
|
||||
{field: 'bestellt', type: '!=', value: null}, // AND bestellt
|
||||
{field: 'erteilt', type: '=', value: null}, // AND NOT erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert
|
||||
]
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formats the group header
|
||||
function func_groupHeader(data){
|
||||
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
|
||||
};
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- blue: dummy lectors
|
||||
- orange: geaendert
|
||||
- default (white) : bestellte
|
||||
- green: akzeptiert
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if(is_dummy)
|
||||
{
|
||||
cell.getElement().classList.add('bg-info'); // dummy lectors
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden &&
|
||||
!row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows
|
||||
{
|
||||
cell.getElement().classList.add('bg-warning'); // geaenderte
|
||||
}
|
||||
else if(bestellt != null && erteilt == null)
|
||||
{
|
||||
return; // bestellt
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// only allow to select bestellte Lehraufträge
|
||||
return !is_dummy && // NOT dummy lector
|
||||
row.getData().bestellt != null && // AND NOT neue
|
||||
row.getData().erteilt == null && // AND bestellt
|
||||
betrag == vertrag_betrag &&
|
||||
stunden == vertrag_stunden; // AND nicht geändert
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Deselect and disable new selection of updated rows
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows that are bestellt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#filterTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
|
||||
row.getData().bestellt != null && // AND bestellt
|
||||
row.getData().erteilt == null && // AND NOT erteilt
|
||||
row.getData().status != 'Geändert') // AND NOT geaendert
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#filterTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Erteilung ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (is_dummy)
|
||||
{
|
||||
return "<i class='fa fa-user-secret'></i>"; // dummy lector
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
// return "<i class='fas fa-user-graduate'></i>";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden)){
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
var text = 'Lehrauftragstunden/-stundensatz geändert.';
|
||||
text += "\n";
|
||||
|
||||
if (is_dummy) // dummy (no lector)
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Ohne Lektor verplant.'
|
||||
}
|
||||
else if ((bestellt != null && erteilt == null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && erteilt == null && stunden != vertrag_stunden)) // geaendert (when never erteilt before)
|
||||
{
|
||||
return text += 'Wartet auf Bestellung, danach Erteilen möglich.';
|
||||
}
|
||||
else if ((bestellt != null && erteilt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && erteilt != null && stunden != vertrag_stunden)) // geaendert (when has been erteilt once)
|
||||
{
|
||||
return text += 'Wartet auf neuerliche Bestellung, danach erneut Erteilen möglich.';
|
||||
}
|
||||
else if (bestellt == null) // neu
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Wartet auf Bestellung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#filterTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with new lehrauftraege (not dummy lectors)
|
||||
$("#show-new").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with accepted lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-dummies").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '!=', value: null},
|
||||
{field: 'personalnummer', type: '<=', value: 0},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-changed").click(function(){
|
||||
// needs custom filter to compare fields betrag and vertrag_betrag
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt AND
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
case 'show-changed':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_CHANGED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag erteilen'
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
|
||||
// Enable button 'Lehrauftrag bestellen' by default
|
||||
$('#approve-lehrauftraege').attr('disabled', false).attr('title', '');
|
||||
|
||||
// Disable button Lehrauftrag bestellen for dummies
|
||||
if (this.id == 'show-dummies')
|
||||
{
|
||||
$('#approve-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.');
|
||||
}
|
||||
});
|
||||
|
||||
// Approve Lehrauftraege
|
||||
$("#approve-lehrauftraege").click(function(){
|
||||
|
||||
var selected_data = $('#filterTabulator').tabulator('getSelectedData')
|
||||
.filter(function(val){
|
||||
// filter pseudo lines of groupBy (e.g. the bottom calculations lines)
|
||||
return val.row_index != null || typeof(val.row_index) !== 'undefined';
|
||||
})
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index': data.row_index,
|
||||
'mitarbeiter_uid' : data.mitarbeiter_uid,
|
||||
'vertrag_id' : data.vertrag_id
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare data object for ajax call
|
||||
* NOTE: Stringify to send only ONE post param (json string) instead of many single post params.
|
||||
* This avoids issues with POST param limitation.
|
||||
*/
|
||||
var data = {
|
||||
'selected_data': JSON.stringify(selected_data)
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/approveLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Erteilt'
|
||||
$('#filterTabulator').tabulator('updateData', data.retval);
|
||||
}
|
||||
|
||||
FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden erteilt.");
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,630 @@
|
||||
/**
|
||||
* Javascript file for Lehrauftraege bestellen view and tabulator
|
||||
* Lehrauftraege bestellen: orderLehrauftrag.php
|
||||
* Lehrauftraege bestellen - Tabulator: orderLehrauftragData.php
|
||||
*/
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell){
|
||||
if (cell.getValue() == null){
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
* Filters neue AND geaenderte initially
|
||||
* NOTE: This is a workaround. The tabulators callback initialFilter is not used here because
|
||||
* it is processed before the callback tableBuilt, where the status is going to be built.
|
||||
* The callback dataLoaded is processed after tableBuild and provides the status.
|
||||
*/
|
||||
function func_dataLoaded(data, table){
|
||||
table.setFilter([
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // not dummy lector AND
|
||||
[
|
||||
{field: 'status', type: '=', value: 'Neu'}, // neu OR
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formats the group header
|
||||
function func_groupHeader(data){
|
||||
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
|
||||
};
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
// console.log(betrag);
|
||||
// console.log(vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- blue: dummy lectors
|
||||
- bold: geaendert
|
||||
- default (white): neu und erteilt
|
||||
- green: akzeptiert
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if(is_dummy)
|
||||
{
|
||||
cell.getElement().classList.add('bg-info'); // dummy lectors
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden &&
|
||||
!row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows
|
||||
{
|
||||
row.getElement().style['font-weight'] = 'bold'; // geaendert
|
||||
}
|
||||
else if(bestellt == null)
|
||||
{
|
||||
return; // neu und erteilt
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// Only allow to select neue and geaenderte
|
||||
return !is_dummy && // NOT dummy lector
|
||||
row.getData().bestellt == null || // AND neue
|
||||
row.getData().bestellt != null && betrag != vertrag_betrag || // OR geaenderte
|
||||
row.getData().bestellt != null && stunden != vertrag_stunden // OR geanderte (if betrag is 0 or null)
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Format font-weight normal (needed after geaenderte were bestellt)
|
||||
row.getElement().style['font-weight'] = 'normal';
|
||||
|
||||
// Deselect and disable new selection of updated rows (ordering done)
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows and ignore rows which have status bestellt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#filterTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
|
||||
row.getData().bestellt == null || // AND neu
|
||||
row.getData().bestellt != null && // OR (bestellt
|
||||
row.getData().status == 'Geändert') // AND geaendert)
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#filterTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Bestellung ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (is_dummy)
|
||||
{
|
||||
return "<i class='fa fa-user-secret'></i>"; // dummy lector
|
||||
}
|
||||
else if (bestellt != null && isNaN(vertrag_betrag))
|
||||
{
|
||||
return "<i class='fa fa-user-minus'></i>"; // kein Vertrag
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var stundensatz = cell.getRow().getData().stundensatz;
|
||||
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
var vertrag_stundensatz = 0;
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// Calculate vertrag stundensatz
|
||||
if (vertrag_stunden != 0)
|
||||
{
|
||||
vertrag_stundensatz = vertrag_betrag/vertrag_stunden;
|
||||
}
|
||||
|
||||
// Return tooltip message
|
||||
if (is_dummy) // dummy (no lector)
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Ohne Lektor verplant.'
|
||||
}
|
||||
else if (isNaN(vertrag_betrag)) // neu
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Wartet auf Bestellung.'
|
||||
}
|
||||
else if (betrag != vertrag_betrag || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert (if betrag is 0 or null)
|
||||
{
|
||||
var text = 'NACH Änderung: Stundensatz: ' + stundensatz + ' Stunden: ' + stunden;
|
||||
text += "\n";
|
||||
text += 'VOR Änderung:' + '\xa0\xa0\xa0' + 'Stundensatz: ' + vertrag_stundensatz + ' Stunden: ' + vertrag_stunden;
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#filterTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with new lehrauftraege (not dummy lectors)
|
||||
$("#show-new").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with akzeptierte lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with geaenderte lectors
|
||||
$("#show-changed").click(function(){
|
||||
// needs custom filter to compare fields betrag and vertrag_betrag
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt AND
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-dummies").click(function(){
|
||||
$('#filterTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '!=', value: null},
|
||||
{field: 'personalnummer', type: '<=', value: 0},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
case 'show-changed':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_CHANGED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag bestellen'
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
|
||||
//Enable button 'Lehrauftrag bestellen' by default
|
||||
$('#order-lehrauftraege').attr('disabled', false).attr('title', '');
|
||||
|
||||
// Disable button Lehrauftrag bestellen for dummies
|
||||
if (this.id == 'show-dummies')
|
||||
{
|
||||
$('#order-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.');
|
||||
}
|
||||
});
|
||||
|
||||
// Order Lehrauftraege
|
||||
$("#order-lehrauftraege").click(function(){
|
||||
|
||||
var selected_data = $('#filterTabulator').tabulator('getSelectedData')
|
||||
.filter(function(val){
|
||||
// filter pseudo lines of groupBy (e.g. the bottom calculations lines)
|
||||
return val.row_index != null || typeof(val.row_index) !== 'undefined';
|
||||
})
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index' : data.row_index,
|
||||
'lehreinheit_id' : data.lehreinheit_id,
|
||||
'lehrveranstaltung_id' : data.lehrveranstaltung_id,
|
||||
'person_id' : data.person_id,
|
||||
'mitarbeiter_uid' : data.mitarbeiter_uid,
|
||||
'vertrag_id' : data.vertrag_id,
|
||||
'projektarbeit_id' : data.projektarbeit_id,
|
||||
'stunden' : data.stunden,
|
||||
'betrag' : data.betrag,
|
||||
'vertrag_betrag' : data.vertrag_betrag,
|
||||
'studiensemester_kurzbz' : data.studiensemester_kurzbz,
|
||||
'studiengang_kz' : data.studiengang_kz,
|
||||
'lv_oe_kurzbz' : data.lv_oe_kurzbz
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare data object for ajax call
|
||||
* NOTE: Stringify to send only ONE post param (json string) instead of many single post params.
|
||||
* This avoids issues with POST param limitation.
|
||||
*/
|
||||
var data = {
|
||||
'selected_data': JSON.stringify(selected_data)
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/orderLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Bestellt'
|
||||
$('#filterTabulator').tabulator('updateData', data.retval);
|
||||
}
|
||||
|
||||
FHC_DialogLib.alertSuccess("Alle " + data.retval.length + " Lehraufträge wurden bestellt.")
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Sytemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user