diff --git a/admin/include/functions.php b/admin/include/functions.php index 3521c619a..98946772e 100644 --- a/admin/include/functions.php +++ b/admin/include/functions.php @@ -2454,6 +2454,50 @@ SELECT name return $groupname; } +function delete_groups($group_ids) { + + $group_id_string = implode(',', $group_ids); + + // destruction of the access linked to the group + $query = ' +DELETE + FROM '. GROUP_ACCESS_TABLE .' + WHERE group_id IN('. $group_id_string .') +;'; + pwg_query($query); + + // destruction of the users links for this group + $query = ' +DELETE + FROM '. USER_GROUP_TABLE .' + WHERE group_id IN('. $group_id_string .') +;'; + pwg_query($query); + + $query = ' +SELECT id, name + FROM `'. GROUPS_TABLE .'` + WHERE id IN('. $group_id_string .') +;'; + + $group_list = query2array($query, 'id', 'name'); + $groupids = array_keys($group_list); + + // destruction of the group + $query = ' +DELETE + FROM `'. GROUPS_TABLE .'` + WHERE id IN('. $group_id_string .') +;'; + pwg_query($query); + + trigger_notify('delete_group', $groupids); + pwg_activity('group', $groupids, 'delete'); + + + return $group_list; +} + /** * Returns the username corresponding to the given user identifier if exists. * diff --git a/admin/themes/clear/theme.css b/admin/themes/clear/theme.css index c62e929a7..32451510d 100644 --- a/admin/themes/clear/theme.css +++ b/admin/themes/clear/theme.css @@ -602,7 +602,7 @@ input:focus + .slider { border:1px solid #3c3c3c; } -.ValidationUserAssociated{ +.ValidationUserAssociated, .ValidationUserDissociated{ color:#00aa00; background-color:#c2f5c2; } diff --git a/admin/themes/default/js/group_list.js b/admin/themes/default/js/group_list.js index 529e1c01a..f7f61d746 100644 --- a/admin/themes/default/js/group_list.js +++ b/admin/themes/default/js/group_list.js @@ -90,6 +90,7 @@ jQuery(document).ready(function () { newgroup.css("order", -id); newgroup.attr("data-id", id); newgroup.find("#group_name").html(name); + newgroup.find(".group_name-editable").val(name); newgroup.find(".Group-checkbox label").attr("for", "Group-Checkbox-selection-" + id); newgroup.find(".Group-checkbox input").attr("id", "Group-Checkbox-selection-" + id); newgroup.find(".input-edit-group-name").attr("placeholder", name); @@ -109,9 +110,9 @@ jQuery(document).ready(function () { newgroup.find(".groupMessage").fadeIn(); newgroup.find(".groupMessage").delay(DELAY_FEEDBACK).fadeOut(); } else { - $("#showAddGroup .groupError").html(str_name_taken); - $("#showAddGroup .groupError").fadeIn(); - $("#showAddGroup .groupError").delay(DELAY_FEEDBACK).fadeOut(); + $("#addGroupForm .groupError").html(str_name_taken); + $("#addGroupForm .groupError").fadeIn(); + $("#addGroupForm .groupError").delay(DELAY_FEEDBACK).fadeOut(); } }, error: function (err) { @@ -129,54 +130,14 @@ jQuery(document).ready(function () { setupGroupBox($(this)); }); }); - var setupGroupBox = function (groupBox) { var id = groupBox.data("id"); /* Change background color of group block if checked in selection mode */ groupBox.find(".Group-checkbox input[type='checkbox']").change(function () { - if ($(this).is(":checked")) { - groupBox.addClass("OrangeBackground"); - groupBox.find(".icon-users-1").addClass("OrangeIcon"); - groupBox.find(".group_number_users").addClass("OrangeFont"); - - //Display item selection on selection panel - item = $( - "
" - ); - item.appendTo(".DeleteGroupList"); - item.find("a").on("click", function () { - groupBox.find(".Group-checkbox input").attr("checked", false); - groupBox - .find(".Group-checkbox input[type='checkbox']") - .trigger("change"); - }); - updateSelectionPanel(); - option = $('') - option.appendTo("#MergeOptionsChoices"); - } else { - groupBox.removeClass("OrangeBackground"); - groupBox.find(".icon-users-1").removeClass("OrangeIcon"); - groupBox.find(".group_number_users").removeClass("OrangeFont"); - $(".DeleteGroupList div").each(function () { - if ($(this).data("id") == id) { - $(this).remove(); - } - }); - updateSelectionPanel(); - $("#MergeOptionsChoices option").each(function () { - if ($(this).attr("value") == id) { - $(this).remove(); - } - }); - } + toogleSelection(id, groupBox.find(".Group-checkbox input[type='checkbox']").is(":checked")); }); + groupBox.find(".Group-checkbox input[type='checkbox']").attr("checked", false) /* Display the option on the click on "..." */ groupBox.find(".group-dropdown-options").click(function GroupOptions() { @@ -186,18 +147,40 @@ var setupGroupBox = function (groupBox) { /* Set the delete action */ groupBox.find("#GroupDelete").on("click", function () { $.confirm({ - title: str_delete+' '+groupBox.find("#group_name").html(), - content: str_are_you_sure, + title: str_delete.replace("%s",groupBox.find("#group_name").html()), + draggable: false, + titleClass: "groupDeleteConfirm", + theme: "modern", + content: "", + animation: "zoom", boxWidth: '30%', useBootstrap: false, type: 'red', - typeAnimated: true, + animateFromElement: false, + backgroundDismiss: true, + typeAnimated: false, buttons: { confirm: { text: str_yes_delete_confirmation, btnClass: 'btn-red', action: function () { - deleteGroup(id); + let groupName = groupBox.find(".Group-name-container p").html(); + deleteGroup(id).then(() => { + $.alert({ + title: str_group_deleted.replace("%s",groupName), + icon: 'icon-ok', + titleClass: "groupDeleteAlert", + theme:"modern", + closeIcon: true, + content: "", + animation: "zoom", + boxWidth: '20%', + useBootstrap: false, + backgroundDismiss: true, + animateFromElement: false, + typeAnimated: false, + }); + }); } }, cancel: { @@ -249,28 +232,71 @@ var setupGroupBox = function (groupBox) { }; +var toogleSelection = function(group_id, toggle) { + groupBox = $("#group-"+group_id); + if (toggle) { + groupBox.find(".Group-checkbox input").attr("checked", true); + groupBox.addClass("OrangeBackground"); + groupBox.find(".icon-users-1").addClass("OrangeIcon"); + groupBox.find(".group_number_users").addClass("OrangeFont"); + + //Display item selection on selection panel + item = $( + "" + ); + item.appendTo(".DeleteGroupList"); + item.find("a").on("click", function () { + groupBox.find(".Group-checkbox input").attr("checked", false); + toogleSelection(group_id); + }); + updateSelectionPanel(); + option = $('') + option.appendTo("#MergeOptionsChoices"); + } else { + groupBox.find(".Group-checkbox input").attr("checked", false); + groupBox.removeClass("OrangeBackground"); + groupBox.find(".icon-users-1").removeClass("OrangeIcon"); + groupBox.find(".group_number_users").removeClass("OrangeFont"); + $(".DeleteGroupList div").each(function () { + if ($(this).data("id") == group_id) { + $(this).remove(); + } + }); + updateSelectionPanel(); + $("#MergeOptionsChoices option").each(function () { + if ($(this).attr("value") == group_id) { + $(this).remove(); + } + }); + } +} + /* Group Ajax and Display Functions */ var deleteGroup = function (id) { - jQuery.ajax({ - url: "ws.php?format=json&method=pwg.groups.delete", - type: "POST", - data: "group_id=" + id + "&pwg_token=" + pwg_token, - success: function (raw_data) { - data = jQuery.parseJSON(raw_data); - if (data.stat === "ok") { - $.alert({ - title: str_group_deleted, - content: "", - boxWidth: '20%', - useBootstrap: false - }); - $("#group-" + id).remove(); - } - }, - error: function (err) { - console.log(err); - }, - }); + return new Promise((resolve, reject) => { + jQuery.ajax({ + url: "ws.php?format=json&method=pwg.groups.delete", + type: "POST", + data: "group_id=" + id + "&pwg_token=" + pwg_token, + success: function (raw_data) { + data = jQuery.parseJSON(raw_data); + if (data.stat === "ok") { + $("#group-" + id).remove(); + $(".DeleteGroupList div[data-id="+id+"]").remove() + resolve(); + } + }, + error: function (err) { + console.log(err); + }, + }); + }) }; var renameGroup = function(id, newName) { @@ -338,13 +364,9 @@ var setDefaultGroup = function (id, is_default) { if (data.stat === "ok") { if (is_default) { setupDefaultActions(id,true) - //$("#group-" + id).find(".groupMessage").html(str_set_default_state); } else { setupDefaultActions(id,false) - //$("#group-" + id).find(".groupMessage").html(str_unset_default_state); } - //$("#group-" + id).find(".groupMessage").fadeIn(); - //$("#group-" + id).find(".groupMessage").delay(DELAY_FEEDBACK).fadeOut(); } }, error: function (err) { @@ -379,6 +401,7 @@ var setupDefaultActions = function(id, is_default) { -------*/ $(function () { + $("#toggleSelectionMode").attr("checked", false) $("#toggleSelectionMode").click(function () { if ($(this).is(":checked")) { $(".in-selection-mode").show(); @@ -478,17 +501,98 @@ var buttonUnavailable = function(button) { button.removeAttr("OnClick"); } +/*------- + Merge function on button's pannel + -------*/ + +$('.ConfirmMergeButton').on("click", function() { + let loadState = new TemporaryState(); + loadState.changeAttribute($('.ConfirmMergeButton'), "style", "pointer-events: none"); + loadState.changeHTML($('.ConfirmMergeButton'), " "); + loadState.removeClass($('.ConfirmMergeButton'), "icon-ok"); + merge_group = []; + str_merge_group = ""; + dest_grp = $("#MergeOptionsChoices").val(); + + $(".DeleteGroupList div").each(function () { + if (dest_grp != $(this).attr("data-id")) { + str_merge_group += "&merge_group_id[]="+$(this).attr("data-id"); + merge_group.push($(this).attr("data-id")); + } + }) + + jQuery.ajax({ + url: "ws.php?format=json&method=pwg.groups.merge", + type: "POST", + data: "destination_group_id=" + dest_grp + str_merge_group + "&pwg_token=" + pwg_token, + success: function (raw_data) { + loadState.reverse(); + data = jQuery.parseJSON(raw_data); + if (data.stat === "ok") { + updateSelectionPanel('Selection'); + console.log(data); + merge_group.forEach(function(id) { + ($("#group-"+id).fadeOut(complete=function(){ + $(this).remove(); + })) + }) + toogleSelection(dest_grp, false) + + $("#group-"+dest_grp + " .group_number_users").html(" "); + jQuery.ajax({ + url: "ws.php?format=json&method=pwg.users.getList", + type: "POST", + data: "group_id=" + dest_grp, + success: function (raw_data) { + data = jQuery.parseJSON(raw_data); + let number = data.result.users.length; + $("#group-"+dest_grp + " .group_number_users").html( + number + " " + ((number > 1)? str_members_default:str_member_default) + ); + } + }) + }; + } + }) +}) + /*------- Delete function on button's pannel -------*/ $('.ConfirmDeleteButton').on("click", function() { + let names = []; + let promises = []; $('.DeleteGroupList div').each(function () { - deleteGroup($(this).data('id')); - $(this).remove(); + let id = $(this).data('id'); + names.push($("#group-"+id+" #group_name").html()); + promises.push(deleteGroup(id)); + }); + + let loadState = new TemporaryState; + loadState.changeAttribute($('.ConfirmDeleteButton'), "style", "pointer-events: none"); + loadState.changeHTML($('.ConfirmDeleteButton'), " "); + loadState.removeClass($('.ConfirmDeleteButton'),"icon-ok"); + + Promise.all(promises).then(() => { + loadState.reverse(); updateSelectionPanel("NoSelection"); + $.alert({ + title: str_groups_deleted.replace("%s",names.toString()), + titleClass: "groupDeleteAlert", + theme: "modern", + icon: 'icon-ok', + closeIcon: true, + content: "", + animation: "zoom", + boxWidth: '20%', + useBootstrap: false, + backgroundDismiss: true, + animateFromElement: false, + typeAnimated: false, + backgroundDismiss: true, + }); }) -}) /*------- Manage User Part @@ -505,9 +609,13 @@ var usersInGroup = []; // Max offset of the user container (322 = 6 lines) var maxOffsetUserCont = 322; -var infoUsers = $("{'Choose which group to merge these groups into'|@translate}
{'The other groups will be removed'|@translate}
You are about to delete 0 groups, are you sure?
- - No, I have changed my mind + + {"No, I have changed my mind"|@translate}