| 1 | import { characterGroupOverlay } from '../script.js'; |
| 2 | import { BulkEditOverlay, BulkEditOverlayState, CharacterContextMenu } from './BulkEditOverlay.js'; |
| 3 | import { event_types, eventSource } from './events.js'; |
| 4 | |
| 5 | let is_bulk_edit = false; |
| 6 | |
| 7 | const 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 | |
| 16 | const 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 | |
| 25 | const 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 | */ |
| 36 | function 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 | */ |
| 44 | function 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 | */ |
| 70 | async 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 | */ |
| 80 | function 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 | */ |
| 105 | function 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 | */ |
| 115 | export 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 | } |