mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-11-14 20:17:14 +01:00
360 lines
13 KiB
JavaScript
360 lines
13 KiB
JavaScript
|
var ArticleMatrixSelection = function ($) {
|
||
|
"use strict";
|
||
|
|
||
|
var me = {
|
||
|
|
||
|
selector: {
|
||
|
dataTable: '#kundeartikelpreise',
|
||
|
dataTableForm: '#kundeartikelpreiseform',
|
||
|
|
||
|
articleSelectionCheckboxes: '.articlematrix-checkbox',
|
||
|
articleQuantityInputs: '.articlematrix-quantity',
|
||
|
articleQuickAddButtons: '.articlematrix-quickadd',
|
||
|
|
||
|
selectAllCheckbox: '#articlematrixselection-selectall-checkbox',
|
||
|
insertButton: '#articlematrixselection-insert-button',
|
||
|
resetButton: '#articlematrixselection-reset-button',
|
||
|
backButton: '#profisuche-back-button'
|
||
|
},
|
||
|
|
||
|
/** @property Vorgangs-ID */
|
||
|
processId: null,
|
||
|
|
||
|
/** @property Vorgangstyp: Auftrag, Angebot, Rechnung, usw. */
|
||
|
processType: null,
|
||
|
|
||
|
/** @property URL für alle Ajax-Anfragen; es fehlt lediglich der "cmd" Parameter
|
||
|
ajaxBaseUrl: null,
|
||
|
|
||
|
/**
|
||
|
* Modul initialisieren
|
||
|
*/
|
||
|
init: function () {
|
||
|
|
||
|
// Bei Bestellungen und (Preis-)Anfragen gibt es andere Selektoren.
|
||
|
// Hier werden auch Einkaufspreise angezeigt; ansonten Verkaufspreise.
|
||
|
if ($(me.selector.dataTable).length === 0) {
|
||
|
me.selector.dataTable = '#lieferantartikelpreise';
|
||
|
me.selector.dataTableForm = '#lieferantartikelpreiseform';
|
||
|
}
|
||
|
|
||
|
var $form = $(me.selector.dataTableForm);
|
||
|
me.processId = parseInt($form.data('process-id'));
|
||
|
me.processType = $form.data('process-type');
|
||
|
|
||
|
if (me.processId <= 0) {
|
||
|
console.warn('Vorgangs-ID ist ungültig: ' + me.processType + '(' + me.processId + ')');
|
||
|
return;
|
||
|
}
|
||
|
if (me.processType === '') {
|
||
|
console.warn('Vorgangstyp ist nicht gesetzt.');
|
||
|
}
|
||
|
|
||
|
me.ajaxBaseUrl =
|
||
|
'index.php?module=ajax&action=articlematrixselection' +
|
||
|
'&typ=' + me.processType + '&id=' + me.processId;
|
||
|
|
||
|
me.attachEvents();
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Registriert alle benötigten Events
|
||
|
*/
|
||
|
attachEvents: function () {
|
||
|
|
||
|
// Einzelnen Artikel über QuickAdd-Button zu Positionen hinzufügen
|
||
|
$(document).on('click', me.selector.articleQuickAddButtons, function (e) {
|
||
|
e.preventDefault();
|
||
|
me.quickAddArticle($(this));
|
||
|
});
|
||
|
|
||
|
// Bei Auswahl bzw. Mengeänderungen in Matrix > Auswahl in Userkonfiguration speichern
|
||
|
$(document).on('change', me.selector.articleSelectionCheckboxes, me.saveSelection);
|
||
|
$(document).on('change', me.selector.articleQuantityInputs, me.saveSelection);
|
||
|
|
||
|
// "Alle auswählen" Checkbox
|
||
|
$(document).on('change', me.selector.selectAllCheckbox, function () {
|
||
|
var checked = $(this).prop('checked');
|
||
|
me.selectAll(checked);
|
||
|
});
|
||
|
|
||
|
// Ausgewählte Artikel aus Matrix in Auftrag übernehmen
|
||
|
$(document).on('click', me.selector.insertButton, function (e) {
|
||
|
e.preventDefault();
|
||
|
me.insertSelection();
|
||
|
});
|
||
|
|
||
|
// Matrix-Auswahl zurücksetzen
|
||
|
$(document).on('click', me.selector.resetButton, function (e) {
|
||
|
e.preventDefault();
|
||
|
me.resetSelection();
|
||
|
});
|
||
|
|
||
|
// Bei Änderungen der DataTable (Sortierung, Seitenwechsel) > Matrix aus Userkonfiguration laden
|
||
|
$(me.selector.dataTable).on('draw.dt', function () {
|
||
|
me.loadSelection();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Artikelauswahl und -mengen laden + Felder füllen
|
||
|
*/
|
||
|
loadSelection: function () {
|
||
|
jQuery.ajax({
|
||
|
type: 'POST',
|
||
|
url: me.ajaxBaseUrl + '&cmd=get',
|
||
|
success: function (data) {
|
||
|
me.fillMatrix(data);
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Checkboxen und Mengefelder füllen
|
||
|
*
|
||
|
* @param {Object} data
|
||
|
*/
|
||
|
fillMatrix: function (data) {
|
||
|
var verkaufpreisId;
|
||
|
var selectAllChecked = true;
|
||
|
|
||
|
// Erstmal alle Mengen- und Auswahlfelder zurücksetzen
|
||
|
$(me.selector.articleSelectionCheckboxes).prop('checked', false);
|
||
|
$(me.selector.articleQuantityInputs).val('');
|
||
|
|
||
|
// Auswahlfelder setzen
|
||
|
if (typeof data.auswahl !== 'undefined') {
|
||
|
for (verkaufpreisId in data.auswahl) {
|
||
|
if (data.auswahl.hasOwnProperty(verkaufpreisId)) {
|
||
|
$('#articlematrix-checkbox-' + verkaufpreisId).prop('checked', true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Mengenfelder ausfüllen
|
||
|
if (typeof data.menge !== 'undefined') {
|
||
|
for (verkaufpreisId in data.menge) {
|
||
|
if (data.menge.hasOwnProperty(verkaufpreisId)) {
|
||
|
var menge = parseInt(data.menge[verkaufpreisId]);
|
||
|
$('#articlematrix-quantity-' + verkaufpreisId).val(menge);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// "Alle auswählen"-Checkbox setzen
|
||
|
$(me.selector.articleSelectionCheckboxes).each(function (index, checkbox) {
|
||
|
if ($(checkbox).prop('checked') === false) {
|
||
|
selectAllChecked = false;
|
||
|
}
|
||
|
$(me.selector.selectAllCheckbox).prop('checked', selectAllChecked);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Aktuelle Auswahl in Userkonfiguration speichern
|
||
|
*
|
||
|
* @param event jQuery-EventObject
|
||
|
*/
|
||
|
saveSelection: function (event) {
|
||
|
var elementType = event.target.type;
|
||
|
var $element = $(event.target);
|
||
|
|
||
|
// Checkbox wurde aktiviert bzw. deaktiviert
|
||
|
if (elementType === 'checkbox') {
|
||
|
var rowId = $element.data('id');
|
||
|
var isChecked = $element.prop('checked');
|
||
|
|
||
|
// Mengeneingabefeld selektieren
|
||
|
var $inputElement = $('#articlematrix-quantity-' + rowId);
|
||
|
var defaultQuantity = $inputElement.data('default-quantity');
|
||
|
var currentQuantity = $inputElement.val();
|
||
|
|
||
|
// Bei Aktivierung > Menge-Eingabefeld mit "Ab Menge" füllen
|
||
|
if (isChecked === true && currentQuantity === '') {
|
||
|
$inputElement.val(defaultQuantity);
|
||
|
}
|
||
|
|
||
|
// Bei Deaktivierung > Menge-Eingabefeld leeren
|
||
|
if (isChecked === false) {
|
||
|
$inputElement.val('');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Aktuelle Auswahl (aktive Checkboxen und Mengen) in Userkonfiguration speichern
|
||
|
$.ajax({
|
||
|
type: 'POST',
|
||
|
url: me.ajaxBaseUrl + '&cmd=set',
|
||
|
data: $(me.selector.dataTableForm).serializeArray()
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Aktuelle Auswahl in Positionen übernehmen
|
||
|
*/
|
||
|
insertSelection: function () {
|
||
|
jQuery.ajax({
|
||
|
type: 'POST',
|
||
|
url: me.ajaxBaseUrl + '&cmd=get',
|
||
|
success: function (data) {
|
||
|
|
||
|
if (typeof data.auswahl === 'undefined' || typeof data.menge === 'undefined') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var auswahlCount = Object.keys(data.auswahl).length;
|
||
|
if (auswahlCount === 0) {
|
||
|
alert('Kann Einträge nicht hinzufügen. Es sind keine Einträge ausgewählt.');
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var confirmMsg = 'Möchten Sie die ' + auswahlCount + ' Einträge wirklich einfügen?';
|
||
|
var confirmResult = confirm(confirmMsg);
|
||
|
if (confirmResult !== true) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Loading-Overlay einblenden
|
||
|
if ($.fn.loadingOverlay !== undefined) {
|
||
|
$('body').loadingOverlay();
|
||
|
}
|
||
|
|
||
|
// Pro ausgewähltem Artikel einen AJAX-Request abschicken
|
||
|
for (var verkaufpreisId in data.auswahl) {
|
||
|
if (data.auswahl.hasOwnProperty(verkaufpreisId)) {
|
||
|
var quantity = parseInt(data.menge[verkaufpreisId]);
|
||
|
me.insertSingleArticle(verkaufpreisId, quantity);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Loading-Overlay ausblenden
|
||
|
if ($.fn.loadingOverlay !== undefined) {
|
||
|
$('body').loadingOverlay('remove');
|
||
|
}
|
||
|
|
||
|
// Auswahl zurücksetzen
|
||
|
me.resetSelection();
|
||
|
|
||
|
// Zurück zu den Positionen
|
||
|
window.setTimeout(function () {
|
||
|
window.location.href = $(me.selector.backButton).attr('href');
|
||
|
}, 250);
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Einzelnen Artikel in Positionen übernehmen
|
||
|
*
|
||
|
* @param verkaufpreisId
|
||
|
* @param quantity
|
||
|
*/
|
||
|
insertSingleArticle: function (verkaufpreisId, quantity) {
|
||
|
if (parseInt(verkaufpreisId) <= 0) {
|
||
|
return;
|
||
|
}
|
||
|
if (isNaN(quantity) || parseInt(quantity) <= 0) {
|
||
|
quantity = null;
|
||
|
}
|
||
|
|
||
|
jQuery.ajax({
|
||
|
type: 'POST',
|
||
|
async: false,
|
||
|
url: 'index.php?module=artikel&action=profisuche&insert=true&batch=true' +
|
||
|
'&cmd=' + me.processType +
|
||
|
'&sid=' + me.processId +
|
||
|
'&id=' + verkaufpreisId,
|
||
|
data: {'menge': quantity}
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Alle Artikel-Checkboxen aktivieren/deaktivieren
|
||
|
*
|
||
|
* @param {boolean} isChecked
|
||
|
*/
|
||
|
selectAll: function (isChecked) {
|
||
|
$(me.selector.articleSelectionCheckboxes).each(function (index, checkbox) {
|
||
|
var $checkbox = $(checkbox);
|
||
|
var rowId = $checkbox.data('id');
|
||
|
|
||
|
// Checkbox aktivieren/deaktivieren
|
||
|
$checkbox.prop('checked', isChecked);
|
||
|
|
||
|
// Mengeneingabefeld selektieren
|
||
|
var $inputElement = $('#articlematrix-quantity-' + rowId);
|
||
|
var defaultQuantity = $inputElement.data('default-quantity');
|
||
|
var currentQuantity = $inputElement.val();
|
||
|
|
||
|
// Bei Aktivierung > Menge-Eingabefeld mit "Ab Menge" füllen
|
||
|
if (isChecked === true && currentQuantity === '') {
|
||
|
$inputElement.val(defaultQuantity);
|
||
|
}
|
||
|
|
||
|
// Bei Deaktivierung > Menge-Eingabefeld leeren
|
||
|
if (isChecked === false) {
|
||
|
$inputElement.val('');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Aktuelle Auswahl (aktive Checkboxen und Mengen) in Userkonfiguration speichern
|
||
|
$.ajax({
|
||
|
type: 'POST',
|
||
|
url: me.ajaxBaseUrl + '&cmd=set',
|
||
|
data: $(me.selector.dataTableForm).serializeArray()
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Aktuelle Auswahl zurücksetzen/löschen
|
||
|
*/
|
||
|
resetSelection: function () {
|
||
|
$.ajax({
|
||
|
type: 'POST',
|
||
|
url: me.ajaxBaseUrl + '&cmd=reset',
|
||
|
success: function () {
|
||
|
me.loadSelection();
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* EventHandler für QuickAdd-Button
|
||
|
*
|
||
|
* @param $element Angeklickter QuickAdd-Button als jQuery-Element
|
||
|
*/
|
||
|
quickAddArticle: function ($element) {
|
||
|
var quantity, confirmResult;
|
||
|
var id = $element.data('id');
|
||
|
var insertUrl = $element.data('insert-url');
|
||
|
var $quantityInput = $('#articlematrix-quantity-' + id);
|
||
|
|
||
|
// Menge aus Eingabefeld an Einfügen-URL hängen
|
||
|
if ($quantityInput.length > 0) {
|
||
|
quantity = $quantityInput.val();
|
||
|
if (quantity !== '') {
|
||
|
insertUrl += '&menge=' + quantity;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
confirmResult = confirm('Soll der Eintrag wirklich eingefügt werden?');
|
||
|
if (confirmResult === true) {
|
||
|
window.location.href = insertUrl;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return {
|
||
|
init: me.init
|
||
|
};
|
||
|
|
||
|
}(jQuery);
|
||
|
|
||
|
$(document).ready(function () {
|
||
|
if ($('#kundeartikelpreise').length === 0 &&
|
||
|
$('#lieferantartikelpreise').length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ArticleMatrixSelection.init();
|
||
|
});
|