Skip to content

Commit bc058c5

Browse files
authored
Merge pull request #1494 from christer77/fix-delete-folder
fix(other): reviewing delete action on folders
2 parents f19640d + b293ab5 commit bc058c5

File tree

4 files changed

+71
-24
lines changed

4 files changed

+71
-24
lines changed

modules/imap/functions.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ function format_imap_folder_section($folders, $id, $output_mod, $with_input = fa
135135

136136
foreach ($folders as $folder_name => $folder) {
137137
$folder_name = bin2hex($folder_name);
138-
$results .= '<li class="imap_'.$id.'_'.$output_mod->html_safe($folder_name).'">';
138+
$results .= '<li class="imap_'.$id.'_'.$output_mod->html_safe($folder_name).'" data-number-children="'.$output_mod->html_safe($folder['number_of_children']).'">';
139139
if ($folder['children']) {
140140
$results .= '<a href="#" class="imap_folder_link expand_link d-inline-flex" data-target="imap_'.$id.'_'.$output_mod->html_safe($folder_name).'"><i class="bi bi-plus-circle-fill"></i></a>';
141141
}

modules/imap/hm-imap.php

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ class Hm_IMAP extends Hm_IMAP_Cache {
182182
public $folder_state = false;
183183
private $scramAuthenticator;
184184
private $namespace_count = 0;
185+
186+
protected $list_sub_folders = [];
185187
/**
186188
* constructor
187189
*/
@@ -1753,16 +1755,31 @@ public function delete_mailbox($mailbox) {
17531755
$this->debug[] = 'Delete mailbox not permitted in read only mode';
17541756
return false;
17551757
}
1756-
$command = 'DELETE "'.str_replace('"', '\"', $this->utf7_encode($mailbox))."\"\r\n";
1757-
$this->send_command($command);
1758-
$result = $this->get_response(false);
1759-
$status = $this->check_response($result, false);
1760-
if ($status) {
1761-
return true;
1758+
$this->list_sub_folders[] = $mailbox;
1759+
$this->get_recursive_subfolders($mailbox, true);
1760+
$this->list_sub_folders = array_reverse($this->list_sub_folders);
1761+
foreach ($this->list_sub_folders as $key => $del_folder) {
1762+
$command = 'DELETE "'.str_replace('"', '\"', $this->utf7_encode($del_folder))."\"\r\n";
1763+
$this->send_command($command);
1764+
$result = $this->get_response(false);
1765+
$status = $this->check_response($result, false);
1766+
if ($status) {
1767+
unset($this->list_sub_folders[$key]);
1768+
} else {
1769+
$this->debug[] = str_replace('A'.$this->command_count, '', $result[0]);
1770+
return false;
1771+
}
17621772
}
1763-
else {
1764-
$this->debug[] = str_replace('A'.$this->command_count, '', $result[0]);
1765-
return false;
1773+
return true;
1774+
}
1775+
1776+
public function get_recursive_subfolders($parentFolder, $is_delete_action) {
1777+
$infoFolder = $this->get_folder_list_by_level($parentFolder, false, false, $is_delete_action);
1778+
if ($infoFolder) {
1779+
foreach (array_keys($infoFolder) as $folder) {
1780+
$this->list_sub_folders[] = $folder;
1781+
$this->get_recursive_subfolders($folder, $is_delete_action);
1782+
}
17661783
}
17671784
}
17681785

@@ -2499,7 +2516,7 @@ public function get_mailbox_page($mailbox, $sort, $rev, $filter, $offset=0, $lim
24992516
* @param string $level mailbox name or empty string for the top level
25002517
* @return array list of matching folders
25012518
*/
2502-
public function get_folder_list_by_level($level='', $only_subscribed=false, $with_input = false) {
2519+
public function get_folder_list_by_level($level='', $only_subscribed=false, $with_input = false, $is_delete_action = false) {
25032520
$result = array();
25042521
$folders = array();
25052522
if ($this->server_support_children_capability()) {
@@ -2522,6 +2539,9 @@ public function get_folder_list_by_level($level='', $only_subscribed=false, $wit
25222539
if ($with_input) {
25232540
$result[$name]['special'] = $folder['special'];
25242541
}
2542+
if ($folder['can_have_kids'] && !$is_delete_action) {
2543+
$result[$name]['number_of_children'] = count($this->get_folder_list_by_level($folder['name'], false, false, $is_delete_action));
2544+
}
25252545
}
25262546
if ($only_subscribed || $with_input) {
25272547
$subscribed_folders = array_column($this->get_mailbox_list(true, children_capability:$this->server_support_children_capability()), 'name');

modules/imap_folders/modules.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ protected function output() {
422422
<a href="#" class="close">'.$this->trans('Cancel').'</a>
423423
</li>
424424
</ul>
425+
<input type="hidden" value="" id="children_number" />
425426
<input type="hidden" value="" id="delete_source" />
426427
<input type="button" id="delete_folder" class="btn btn-danger" value="'.$this->trans('Delete').'">
427428
</div></div>';

modules/imap_folders/site.js

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,22 @@ var set_folders_page_value = function(id, container, target, id_dest) {
6868
}
6969
$('.'+target).html(link);
7070
$('#'+id_dest).val(id);
71+
if (id_dest === 'delete_source') {
72+
const folder = document.querySelector(`.${id}`);
73+
if (folder) {
74+
const numberChildren = folder.getAttribute('data-number-children');
75+
$('#children_number').val(numberChildren);
76+
} else {
77+
$('#children_number').val(0);
78+
}
79+
80+
}
7181
list.hide();
7282

7383
};
7484

7585
var folder_page_delete = function() {
86+
var children_number = parseInt($('#children_number').val());
7687
var val = $('#delete_source').val();
7788
var id = $('#imap_server_folder').val();
7889
if (!id.length) {
@@ -83,21 +94,36 @@ var folder_page_delete = function() {
8394
Hm_Notices.show($('#delete_folder_error').val(), 'danger');
8495
return;
8596
}
86-
if (!confirm($('#delete_folder_confirm').val())) {
87-
return;
97+
98+
let message = "";
99+
if (children_number) {
100+
message = `<p>${hm_trans('This folder contains '+ children_number +' sub-folders.')}</p>`;
88101
}
89-
Hm_Ajax.request(
90-
[{'name': 'hm_ajax_hook', 'value': 'ajax_imap_folders_delete'},
91-
{'name': 'imap_server_id', value: id},
92-
{'name': 'folder', 'value': val}],
93-
function(res) {
94-
if (res.imap_folders_success) {
95-
$('#delete_source').val('');
96-
$('.selected_delete').html('');
97-
Hm_Folders.reload_folders(true);
102+
103+
const modal = new Hm_Modal({
104+
modalId: 'emptySubjectBodyModal',
105+
title: hm_trans("Deletion confirmation"),
106+
btnSize: 'sm'
107+
});
108+
109+
modal.addFooterBtn(hm_trans('Delete anyway'), 'btn-warning', handleDeleteFolder);
110+
modal.setContent(message + $('#delete_folder_confirm').val());
111+
modal.open();
112+
function handleDeleteFolder() {
113+
Hm_Ajax.request(
114+
[{'name': 'hm_ajax_hook', 'value': 'ajax_imap_folders_delete'},
115+
{'name': 'imap_server_id', value: id},
116+
{'name': 'folder', 'value': val}],
117+
function(res) {
118+
if (res.imap_folders_success) {
119+
$('#delete_source').val('');
120+
$('.selected_delete').html('');
121+
Hm_Folders.reload_folders(true);
122+
}
98123
}
99-
}
100-
);
124+
);
125+
modal.hide();
126+
};
101127
};
102128

103129
var folder_page_rename = function() {

0 commit comments

Comments
 (0)