Skip to content

Commit 4ffc55f

Browse files
christer77Revisto
authored andcommitted
fix(other): reviewing delete action on folders
1 parent 255a7bd commit 4ffc55f

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
*/
@@ -1923,16 +1925,31 @@ public function delete_mailbox($mailbox) {
19231925
$this->debug[] = 'Delete mailbox not permitted in read only mode';
19241926
return false;
19251927
}
1926-
$command = 'DELETE "'.str_replace('"', '\"', $this->utf7_encode($mailbox))."\"\r\n";
1927-
$this->send_command($command);
1928-
$result = $this->get_response(false);
1929-
$status = $this->check_response($result, false);
1930-
if ($status) {
1931-
return true;
1928+
$this->list_sub_folders[] = $mailbox;
1929+
$this->get_recursive_subfolders($mailbox, true);
1930+
$this->list_sub_folders = array_reverse($this->list_sub_folders);
1931+
foreach ($this->list_sub_folders as $key => $del_folder) {
1932+
$command = 'DELETE "'.str_replace('"', '\"', $this->utf7_encode($del_folder))."\"\r\n";
1933+
$this->send_command($command);
1934+
$result = $this->get_response(false);
1935+
$status = $this->check_response($result, false);
1936+
if ($status) {
1937+
unset($this->list_sub_folders[$key]);
1938+
} else {
1939+
$this->debug[] = str_replace('A'.$this->command_count, '', $result[0]);
1940+
return false;
1941+
}
19321942
}
1933-
else {
1934-
$this->debug[] = str_replace('A'.$this->command_count, '', $result[0]);
1935-
return false;
1943+
return true;
1944+
}
1945+
1946+
public function get_recursive_subfolders($parentFolder, $is_delete_action) {
1947+
$infoFolder = $this->get_folder_list_by_level($parentFolder, false, false, $is_delete_action);
1948+
if ($infoFolder) {
1949+
foreach (array_keys($infoFolder) as $folder) {
1950+
$this->list_sub_folders[] = $folder;
1951+
$this->get_recursive_subfolders($folder, $is_delete_action);
1952+
}
19361953
}
19371954
}
19381955

@@ -2669,7 +2686,7 @@ public function get_mailbox_page($mailbox, $sort, $rev, $filter, $offset=0, $lim
26692686
* @param string $level mailbox name or empty string for the top level
26702687
* @return array list of matching folders
26712688
*/
2672-
public function get_folder_list_by_level($level='', $only_subscribed=false, $with_input = false) {
2689+
public function get_folder_list_by_level($level='', $only_subscribed=false, $with_input = false, $is_delete_action = false) {
26732690
$result = array();
26742691
$folders = array();
26752692
if ($this->server_support_children_capability()) {
@@ -2692,6 +2709,9 @@ public function get_folder_list_by_level($level='', $only_subscribed=false, $wit
26922709
if ($with_input) {
26932710
$result[$name]['special'] = $folder['special'];
26942711
}
2712+
if ($folder['can_have_kids'] && !$is_delete_action) {
2713+
$result[$name]['number_of_children'] = count($this->get_folder_list_by_level($folder['name'], false, false, $is_delete_action));
2714+
}
26952715
}
26962716
if ($only_subscribed || $with_input) {
26972717
$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)