Skip to content

Commit 7cf5fa9

Browse files
committed
enh(frontend): harmonize special folders selection on the advanced search page, allowing to select all folders or each individually
1 parent 6d5fd2c commit 7cf5fa9

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

modules/advanced_search/js_modules/route_handlers.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,50 @@ function applyAdvancedSearchPageHandlers() {
6262
}
6363
}
6464
Hm_Message_List.check_empty_list();
65+
66+
$('body').on("click", ".pick_special_folders", function(e) {
67+
e.preventDefault();
68+
69+
const modal = new Hm_Modal({
70+
modalId: 'pick_special_folders_modal',
71+
title: 'Pick Special Folders',
72+
size: 'lg',
73+
});
74+
75+
const serverId = $(this).closest('li').attr("class").split('_')[1];
76+
const specialFolders = [];
77+
['archive', 'draft', 'junk', 'sent', 'trash'].forEach(folderType => {
78+
const folderName = hm_special_folders()[serverId][folderType];
79+
if (folderName) {
80+
specialFolders.push(folderName);
81+
}
82+
});
83+
84+
modal.setContent(`
85+
<div class="d-flex gap-3 flex-wrap">
86+
<div class="form-check form-switch">
87+
<input class="form-check-input" type="checkbox" id="all">
88+
<label class="form-check-label" for="all">All Folders</label>
89+
</div>
90+
${specialFolders.map(folder => `
91+
<div class="form-check form-switch">
92+
<input class="form-check-input special_folder_checkbox" type="checkbox" id="${folder}" data-folder-id="${folder}">
93+
<label class="form-check-label" for="${folder}">${folder}</label>
94+
</div>
95+
`).join('')}
96+
</div>
97+
`);
98+
99+
modal.open();
100+
101+
$('#all').on('change', function() {
102+
const checked = $(this).is(':checked');
103+
$('.special_folder_checkbox').prop('checked', checked);
104+
});
105+
106+
$('.special_folder_checkbox').on('change', function() {
107+
const allChecked = $('.special_folder_checkbox').length === $('.special_folder_checkbox:checked').length;
108+
$('#all').prop('checked', allChecked);
109+
});
110+
});
65111
}

modules/advanced_search/site.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,8 @@ var adv_select_imap_folder = function(el) {
117117
folders.find('li').each(function(index) {
118118
const wrapper = $('<div class="d-flex justify-content-between wrapper"></div>');
119119
$(this).wrapInner(wrapper);
120-
const allSpecialFoldersCheckbox = `
121-
<span class="form-check">
122-
<label class="form-check-label" for="all_special_folders-${index}">All special folders</label>
123-
<input class="form-check-input" type="checkbox" name="all_special_folders" id="all_special_folders-${index}">
124-
</span>
120+
const pickSpecialFoldersButton = `
121+
<a href="#" class="btn btn-light btn-sm pick_special_folders">Pick special folders</a>
125122
`;
126123
const allFoldersCheckbox = `
127124
<span class="form-check">
@@ -130,7 +127,7 @@ var adv_select_imap_folder = function(el) {
130127
</span>
131128
`;
132129
const checkboxesWrapper = $('<div class="d-flex gap-3"></div>');
133-
checkboxesWrapper.append(allSpecialFoldersCheckbox);
130+
checkboxesWrapper.append(pickSpecialFoldersButton);
134131
checkboxesWrapper.append(allFoldersCheckbox);
135132
$(this).find('.wrapper').append(checkboxesWrapper);
136133
});
@@ -141,8 +138,8 @@ var adv_select_imap_folder = function(el) {
141138
$('.adv_folder_list').html(folders.html());
142139

143140
$('.adv_folder_link', list_container).on("click", function() { return expand_adv_folder_list($(this).data('target')); });
144-
$('a', list_container).not('.adv_folder_link').not('.close_adv_folders').off('click');
145-
$('a', list_container).not('.adv_folder_link').not('.close_adv_folders').on("click", function() { adv_folder_select($(this).data('id')); return false; });
141+
$('a', list_container).not('.adv_folder_link').not('.close_adv_folders').not('.pick_special_folders').off('click');
142+
$('a', list_container).not('.adv_folder_link').not('.close_adv_folders').not('.pick_special_folders').on("click", function() { adv_folder_select($(this).data('id')); return false; });
146143
$('.close_adv_folders').on("click", function() {
147144
$('.adv_folder_list').html('');
148145
$('.adv_folder_list').hide();

modules/core/output_modules.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,7 @@ protected function output() {
633633
'var hm_web_root_path = function() { return "'.WEB_ROOT.'"; };'.
634634
'var hm_flag_image_src = function() { return "<i class=\"bi bi-star-half\"></i>"; };'.
635635
'var hm_check_dirty_flag = function() { return '.($this->get('warn_for_unsaved_changes', '') ? '1' : '0').'; };'.
636+
'var hm_special_folders = function() { return '.json_encode($settings['special_imap_folders']).'; };'.
636637
format_data_sources($this->get('data_sources', array()), $this);
637638

638639
if (!$this->get('disable_delete_prompt', DEFAULT_DISABLE_DELETE_PROMPT)) {

0 commit comments

Comments
 (0)