167 lines
5.9 KiB
JavaScript
167 lines
5.9 KiB
JavaScript
|
|
class ListManager {
|
|
|
|
currentTypes = [];
|
|
displayedTypes = [];
|
|
editableTypes = [];
|
|
|
|
constructor(listContainer, initialData, editableTypes) {
|
|
this.listContainer = listContainer;
|
|
this.currentTypes = initialData;
|
|
this.editableTypes = editableTypes;
|
|
this.generateList();
|
|
}
|
|
|
|
generateList() {
|
|
for (let i = 0; i < this.currentTypes.length; i++) {
|
|
this.createNewListEntry(this.currentTypes[i]);
|
|
}
|
|
}
|
|
|
|
createNewListEntry(item) {
|
|
let listItem = this.getListItem(item);
|
|
this.displayedTypes.push($(listItem));
|
|
const index = this.displayedTypes.length-1;
|
|
let JQueryItem = this.displayedTypes[index];
|
|
this.listContainer.append(JQueryItem);
|
|
JQueryItem.on('click', () => {
|
|
this.showEditPopup(index);
|
|
});
|
|
}
|
|
|
|
deleteListEntry(id) {
|
|
$('#listItem_' + id).remove();
|
|
}
|
|
|
|
getListItem(item) {
|
|
let listItem = "<li id='listItem_" + item["id"] + "'><div>";
|
|
for (let i = 0; i < this.editableTypes.length; i++) {
|
|
listItem += "<span class='list-" + this.editableTypes[i]["name"] + "'>";
|
|
if (this.editableTypes[i]["type"] === "icon")
|
|
listItem += "<i class='mdi mdi-" + item["icon"] + "' style='margin-right: 5px'></i></span>";
|
|
else
|
|
listItem += item["name"] + '</span>';
|
|
}
|
|
listItem += "</div></li>";
|
|
return listItem;
|
|
}
|
|
|
|
getFormData(defaultValues) {
|
|
let formData = '<form action="" class="categoryForm"><div class="form-group">';
|
|
for (let i = 0; i < this.editableTypes.length; i++) {
|
|
let inputId = this.editableTypes[i]['name'] + 'Input';
|
|
let value = defaultValues[this.editableTypes[i]['name']];
|
|
formData += '<label for="' + inputId + '">' + this.editableTypes[i]['description'] + ' :</label>' +
|
|
'<input id="' + inputId + '" type="text" placeholder="Entrez une valeur" class="form-control" value="' + value + '" required />';
|
|
}
|
|
formData += "</div></form>";
|
|
return formData;
|
|
}
|
|
|
|
getFormValues(form) {
|
|
let values = [];
|
|
for (let i = 0; i < this.editableTypes.length; i++) {
|
|
values.push(form.find('#' + this.editableTypes[i]['name'] + 'Input').val())
|
|
}
|
|
return values;
|
|
}
|
|
|
|
isFormValid(values) {
|
|
let isValid = true;
|
|
for (let i = 0; i < values.length; i++) {
|
|
if (values[i] === '') {
|
|
isValid = false;
|
|
break;
|
|
}
|
|
}
|
|
return isValid;
|
|
}
|
|
|
|
insertFormDataIntoObject(values, object) {
|
|
for (let i = 0; i < values.length; i++) {
|
|
object[this.editableTypes[i]['name']] = values[i];
|
|
}
|
|
return object;
|
|
}
|
|
|
|
updateListItem(values, index) {
|
|
for (let i = 0; i < values.length; i++) {
|
|
if (this.editableTypes[i]['type'] === 'icon')
|
|
this.displayedTypes[index].find(".mdi")[0].className = "mdi mdi-" + values[i];
|
|
else
|
|
this.displayedTypes[index].find(".list-" + this.editableTypes[i]['name']).text(values[i]);
|
|
}
|
|
}
|
|
|
|
showEditPopup(index) {
|
|
let defaultValues = {
|
|
name: "",
|
|
icon: ""
|
|
};
|
|
let title = "Créer une nouvelle entrée";
|
|
if (index !== -1) {
|
|
defaultValues = this.currentTypes[index];
|
|
title = "Modifier l'entrée";
|
|
}
|
|
let formData = this.getFormData(defaultValues);
|
|
let thisInstance = this;
|
|
$.confirm({
|
|
title: title,
|
|
content: formData,
|
|
buttons: {
|
|
formSubmit: {
|
|
text: 'Sauvegarder',
|
|
btnClass: 'btn-blue',
|
|
action: async function () {
|
|
let values = thisInstance.getFormValues(this.$content);
|
|
if (!thisInstance.isFormValid(values)) {
|
|
$.alert('Merci de rentrer toutes les valeurs');
|
|
return false;
|
|
}
|
|
let itemToSave = {};
|
|
if (index !== -1) {
|
|
itemToSave = thisInstance.currentTypes[index];
|
|
}
|
|
|
|
itemToSave = thisInstance.insertFormDataIntoObject(values, itemToSave);
|
|
|
|
if (index !== -1) {
|
|
thisInstance.currentTypes[index] = itemToSave;
|
|
thisInstance.updateListItem(values, index);
|
|
}
|
|
let id = await SaveManager.saveCategory(itemToSave, index === -1);
|
|
if (id >= 0 && index === -1) {
|
|
itemToSave["id"] = id;
|
|
thisInstance.currentTypes[thisInstance.displayedTypes.length] = itemToSave;
|
|
thisInstance.createNewListEntry(itemToSave);
|
|
}
|
|
}
|
|
},
|
|
deleteButton: {
|
|
text: 'Supprimer',
|
|
btnClass: 'btn-red',
|
|
isHidden: index === -1,
|
|
action: function () {
|
|
let id = thisInstance.currentTypes[index]['id'];
|
|
SaveManager.deleteCategory(id);
|
|
thisInstance.deleteListEntry(id);
|
|
}
|
|
},
|
|
cancelButton: {
|
|
text: 'Annuler',
|
|
},
|
|
},
|
|
onContentReady: function () {
|
|
// bind to events
|
|
let jc = this;
|
|
this.$content.find('form').on('submit', function (e) {
|
|
// if the user submits the form by pressing enter in the field.
|
|
e.preventDefault();
|
|
jc.$$formSubmit.trigger('click'); // reference the button and click it
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
}
|