Merge pull request #2663 from d-ber/bulkTagImport

Add bulk tag import
This commit is contained in:
Cohee
2024-08-18 00:34:39 +03:00
committed by GitHub
4 changed files with 44 additions and 14 deletions

View File

@ -99,6 +99,6 @@
} }
#bulk_tag_shadow_popup #bulk_tag_popup #dialogue_popup_controls .menu_button { #bulk_tag_shadow_popup #bulk_tag_popup #dialogue_popup_controls .menu_button {
width: 100px; width: unset;
padding: 0.25em; padding: 0.25em;
} }

View File

@ -10740,7 +10740,7 @@ jQuery(async function () {
} }
} break; } break;
case 'import_tags': { case 'import_tags': {
await importTags(characters[this_chid], { forceShow: true }); await importTags(characters[this_chid], { importSetting: tag_import_setting.ASK });
} break; } break;
/*case 'delete_button': /*case 'delete_button':
popup_type = "del_ch"; popup_type = "del_ch";

View File

@ -18,7 +18,7 @@ import {
import { favsToHotswap } from './RossAscends-mods.js'; import { favsToHotswap } from './RossAscends-mods.js';
import { hideLoader, showLoader } from './loader.js'; import { hideLoader, showLoader } from './loader.js';
import { convertCharacterToPersona } from './personas.js'; import { convertCharacterToPersona } from './personas.js';
import { createTagInput, getTagKeyForEntity, getTagsList, printTagList, tag_map, compareTagsForSort, removeTagFromMap } from './tags.js'; import { createTagInput, getTagKeyForEntity, getTagsList, printTagList, tag_map, compareTagsForSort, removeTagFromMap, importTags, tag_import_setting } from './tags.js';
/** /**
* Static object representing the actions of the * Static object representing the actions of the
@ -197,10 +197,10 @@ class BulkTagPopupHandler {
#getHtml = () => { #getHtml = () => {
const characterData = JSON.stringify({ characterIds: this.characterIds }); const characterData = JSON.stringify({ characterIds: this.characterIds });
return `<div id="bulk_tag_shadow_popup"> return `<div id="bulk_tag_shadow_popup">
<div id="bulk_tag_popup"> <div id="bulk_tag_popup" class="wider_dialogue_popup">
<div id="bulk_tag_popup_holder"> <div id="bulk_tag_popup_holder">
<h3 class="marginBot5">Modify tags of ${this.characterIds.length} characters</h3> <h3 class="marginBot5">Modify tags of ${this.characterIds.length} characters</h3>
<small class="bulk_tags_desc m-b-1">Add or remove the mutual tags of all selected characters.</small> <small class="bulk_tags_desc m-b-1">Add or remove the mutual tags of all selected characters. Import all or existing tags for all selected characters.</small>
<div id="bulk_tags_avatars_block" class="avatars_inline avatars_inline_small tags tags_inline"></div> <div id="bulk_tags_avatars_block" class="avatars_inline avatars_inline_small tags tags_inline"></div>
<br> <br>
<div id="bulk_tags_div" class="marginBot5" data-characters='${characterData}'> <div id="bulk_tags_div" class="marginBot5" data-characters='${characterData}'>
@ -219,6 +219,12 @@ class BulkTagPopupHandler {
<i class="fa-solid fa-trash-can margin-right-10px"></i> <i class="fa-solid fa-trash-can margin-right-10px"></i>
Mutual Mutual
</div> </div>
<div id="bulk_tag_popup_import_all_tags" class="menu_button" title="Import all tags from selected characters" data-i18n="[title]Import all tags from selected characters">
Import All
</div>
<div id="bulk_tag_popup_import_existing_tags" class="menu_button" title="Import existing tags from selected characters" data-i18n="[title]Import existing tags from selected characters">
Import Existing
</div>
<div id="bulk_tag_popup_cancel" class="menu_button" data-i18n="Cancel">Close</div> <div id="bulk_tag_popup_cancel" class="menu_button" data-i18n="Cancel">Close</div>
</div> </div>
</div> </div>
@ -254,6 +260,30 @@ class BulkTagPopupHandler {
document.querySelector('#bulk_tag_popup_reset').addEventListener('click', this.resetTags.bind(this)); document.querySelector('#bulk_tag_popup_reset').addEventListener('click', this.resetTags.bind(this));
document.querySelector('#bulk_tag_popup_remove_mutual').addEventListener('click', this.removeMutual.bind(this)); document.querySelector('#bulk_tag_popup_remove_mutual').addEventListener('click', this.removeMutual.bind(this));
document.querySelector('#bulk_tag_popup_cancel').addEventListener('click', this.hide.bind(this)); document.querySelector('#bulk_tag_popup_cancel').addEventListener('click', this.hide.bind(this));
document.querySelector('#bulk_tag_popup_import_all_tags').addEventListener('click', this.importAllTags.bind(this));
document.querySelector('#bulk_tag_popup_import_existing_tags').addEventListener('click', this.importExistingTags.bind(this));
}
/**
* Import existing tags for all selected characters
*/
async importExistingTags() {
for (const characterId of this.characterIds) {
await importTags(characters[characterId], { importSetting: tag_import_setting.ONLY_EXISTING });
}
$('#bulkTagList').empty();
}
/**
* Import all tags for all selected characters
*/
async importAllTags() {
for (const characterId of this.characterIds) {
await importTags(characters[characterId], { importSetting: tag_import_setting.ALL });
}
$('#bulkTagList').empty();
} }
/** /**
@ -570,7 +600,7 @@ class BulkEditOverlay {
this.container.removeEventListener('mouseup', cancelHold); this.container.removeEventListener('mouseup', cancelHold);
this.container.removeEventListener('touchend', cancelHold); this.container.removeEventListener('touchend', cancelHold);
}, },
BulkEditOverlay.longPressDelay); BulkEditOverlay.longPressDelay);
}; };
handleLongPressEnd = (event) => { handleLongPressEnd = (event) => {

View File

@ -708,12 +708,12 @@ const ANTI_TROLL_MAX_TAGS = 15;
* *
* @param {Character} character - The character * @param {Character} character - The character
* @param {object} [options] - Options * @param {object} [options] - Options
* @param {boolean} [options.forceShow=false] - Whether to force showing the import dialog * @param {tag_import_setting} [options.importSetting=null] - Force a tag import setting
* @returns {Promise<boolean>} Boolean indicating whether any tag was imported * @returns {Promise<boolean>} Boolean indicating whether any tag was imported
*/ */
async function importTags(character, { forceShow = false } = {}) { async function importTags(character, { importSetting = null } = {}) {
// Gather the tags to import based on the selected setting // Gather the tags to import based on the selected setting
const tagNamesToImport = await handleTagImport(character, { forceShow }); const tagNamesToImport = await handleTagImport(character, { importSetting });
if (!tagNamesToImport?.length) { if (!tagNamesToImport?.length) {
console.debug('No tags to import'); console.debug('No tags to import');
return; return;
@ -732,10 +732,10 @@ async function importTags(character, { forceShow = false } = {}) {
* *
* @param {Character} character - The character * @param {Character} character - The character
* @param {object} [options] - Options * @param {object} [options] - Options
* @param {boolean} [options.forceShow=false] - Whether to force showing the import dialog * @param {tag_import_setting} [options.importSetting=null] - Force a tag import setting
* @returns {Promise<string[]>} Array of strings representing the tags to import * @returns {Promise<string[]>} Array of strings representing the tags to import
*/ */
async function handleTagImport(character, { forceShow = false } = {}) { async function handleTagImport(character, { importSetting = null } = {}) {
/** @type {string[]} */ /** @type {string[]} */
const importTags = character.tags.map(t => t.trim()).filter(t => t) const importTags = character.tags.map(t => t.trim()).filter(t => t)
.filter(t => !IMPORT_EXLCUDED_TAGS.includes(t)) .filter(t => !IMPORT_EXLCUDED_TAGS.includes(t))
@ -745,9 +745,9 @@ async function handleTagImport(character, { forceShow = false } = {}) {
.map(newTag); .map(newTag);
const folderTags = getOpenBogusFolders(); const folderTags = getOpenBogusFolders();
// Choose the setting for this dialog. If from settings, verify the setting really exists, otherwise take "ASK". // Choose the setting for this dialog. First check override, then saved setting or finally use "ASK".
const setting = forceShow ? tag_import_setting.ASK const setting = importSetting ? importSetting :
: Object.values(tag_import_setting).find(setting => setting === power_user.tag_import_setting) ?? tag_import_setting.ASK; Object.values(tag_import_setting).find(setting => setting === power_user.tag_import_setting) ?? tag_import_setting.ASK;
switch (setting) { switch (setting) {
case tag_import_setting.ALL: case tag_import_setting.ALL: