Blame Raw
Cohee · e3f41666 · · 128 lines (4.6 KB)
1 contributor
1import { characterGroupOverlay } from '../script.js';
2import { BulkEditOverlay, BulkEditOverlayState, CharacterContextMenu } from './BulkEditOverlay.js';
3import { event_types, eventSource } from './events.js';
4
5let is_bulk_edit = false;
6
7const enableBulkEdit = () => {
8 enableBulkSelect();
9 characterGroupOverlay.selectState();
10 // show the bulk edit option buttons
11 $('.bulkEditOptionElement').show();
12 is_bulk_edit = true;
13 characterGroupOverlay.updateSelectedCount(0);
14};
15
16const disableBulkEdit = () => {
17 disableBulkSelect();
18 characterGroupOverlay.browseState();
19 // hide the bulk edit option buttons
20 $('.bulkEditOptionElement').hide();
21 is_bulk_edit = false;
22 characterGroupOverlay.updateSelectedCount(0);
23};
24
25const toggleBulkEditMode = (isBulkEdit) => {
26 if (isBulkEdit) {
27 disableBulkEdit();
28 } else {
29 enableBulkEdit();
30 }
31};
32
33/**
34 * Toggles bulk edit mode on/off when the edit button is clicked.
35 */
36function onEditButtonClick() {
37 console.log('Edit button clicked');
38 toggleBulkEditMode(is_bulk_edit);
39}
40
41/**
42 * Toggles the select state of all characters in bulk edit mode to selected. If all are selected, they'll be deselected.
43 */
44function onSelectAllButtonClick() {
45 console.log('Bulk select all button clicked');
46 const characters = Array.from(document.querySelectorAll('#' + BulkEditOverlay.containerId + ' .' + BulkEditOverlay.characterClass));
47 let atLeastOneSelected = false;
48 for (const character of characters) {
49 const checked = $(character).find('.bulk_select_checkbox:checked').length > 0;
50 if (!checked && character instanceof HTMLElement) {
51 characterGroupOverlay.toggleSingleCharacter(character);
52 atLeastOneSelected = true;
53 }
54 }
55
56 if (!atLeastOneSelected) {
57 // If none was selected, trigger click on all to deselect all of them
58 for (const character of characters) {
59 const checked = $(character).find('.bulk_select_checkbox:checked') ?? false;
60 if (checked && character instanceof HTMLElement) {
61 characterGroupOverlay.toggleSingleCharacter(character);
62 }
63 }
64 }
65}
66
67/**
68 * Deletes all characters that have been selected via the bulk checkboxes.
69 */
70async function onDeleteButtonClick() {
71 console.log('Delete button clicked');
72
73 // We just let the button trigger the context menu delete option
74 await characterGroupOverlay.handleContextMenuDelete();
75}
76
77/**
78 * Enables bulk selection by adding a checkbox next to each character.
79 */
80function enableBulkSelect() {
81 $('#rm_print_characters_block .character_select').each((i, el) => {
82 // Prevent checkbox from adding multiple times (because of stage change callback)
83 if ($(el).find('.bulk_select_checkbox').length > 0) {
84 return;
85 }
86 const checkbox = $('<input type=\'checkbox\' class=\'bulk_select_checkbox\'>');
87 checkbox.on('change', () => {
88 // Do something when the checkbox is changed
89 });
90 $(el).prepend(checkbox);
91 });
92 $('#rm_print_characters_block.group_overlay_mode_select .bogus_folder_select, #rm_print_characters_block.group_overlay_mode_select .group_select')
93 .addClass('disabled');
94
95 $('#rm_print_characters_block').addClass('bulk_select');
96 // We also need to disable the default click event for the character_select divs
97 $(document).on('click', '.bulk_select_checkbox', function (event) {
98 event.stopImmediatePropagation();
99 });
100}
101
102/**
103 * Disables bulk selection by removing the checkboxes.
104 */
105function disableBulkSelect() {
106 $('.bulk_select_checkbox').remove();
107 $('#rm_print_characters_block.group_overlay_mode_select .bogus_folder_select, #rm_print_characters_block.group_overlay_mode_select .group_select')
108 .removeClass('disabled');
109 $('#rm_print_characters_block').removeClass('bulk_select');
110}
111
112/**
113 * Entry point that runs on page load.
114 */
115export function initBulkEdit() {
116 characterGroupOverlay.addStateChangeCallback((state) => {
117 if (state === BulkEditOverlayState.select) enableBulkEdit();
118 if (state === BulkEditOverlayState.browse) disableBulkEdit();
119 });
120
121 $('#bulkEditButton').on('click', onEditButtonClick);
122 $('#bulkSelectAllButton').on('click', onSelectAllButtonClick);
123 $('#bulkDeleteButton').on('click', onDeleteButtonClick);
124
125 const characterContextMenu = new CharacterContextMenu(characterGroupOverlay);
126 eventSource.on(event_types.CHARACTER_PAGE_LOADED, characterGroupOverlay.onPageLoad);
127 console.debug('Character context menu initialized', characterContextMenu);
128}