import { TVA_CONFIG, updateSettings } from '../scripts/settings.js';
import { getFileName } from '../scripts/utils.js';
import { showArtSelect } from '../token-variants.mjs';
export default class MissingImageConfig extends FormApplication {
constructor() {
super({}, {});
}
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
id: 'token-variants-missing-images',
classes: ['sheet'],
template: 'modules/token-variants/templates/missingImageConfig.html',
resizable: true,
minimizable: false,
title: 'Define Missing Images',
width: 560,
height: 'auto',
});
}
async getData(options) {
const data = super.getData(options);
if (!this.missingImages)
this.missingImages = deepClone(TVA_CONFIG.compendiumMapper.missingImages);
data.missingImages = this.missingImages;
data.documents = ['all', 'Actor', 'Cards', 'Item', 'Macro', 'RollTable'];
return data;
}
_processFormData(formData) {
if (!Array.isArray(formData.document)) {
formData.document = [formData.document];
formData.image = [formData.image];
}
const missingImages = [];
for (let i = 0; i < formData.document.length; i++) {
missingImages.push({ document: formData.document[i], image: formData.image[i] });
}
return missingImages;
}
/**
* @param {JQuery} html
*/
activateListeners(html) {
super.activateListeners(html);
html.on('click', '.add-row', () => {
const formData = this._getSubmitData();
this.missingImages = this._processFormData(formData);
this.missingImages.push({ document: 'all', image: CONST.DEFAULT_TOKEN });
this.render();
});
html.on('click', '.delete-row', (event) => {
const formData = this._getSubmitData();
this.missingImages = this._processFormData(formData);
const index = $(event.target).closest('li')[0].dataset.index;
this.missingImages.splice(index, 1);
this.render();
});
html.on('click', '.file-picker', (event) => {
new FilePicker({
type: 'imagevideo',
callback: (path) => {
$(event.target).closest('li').find('[name="image"]').val(path);
$(event.target).closest('li').find('img').attr('src', path);
},
}).render();
});
html.on('click', '.duplicate-picker', (event) => {
let content = ``;
new Dialog({
title: `Compendiums`,
content: content,
buttons: {
yes: {
icon: "",
label: 'Search for Duplicates',
callback: (html) => {
const found = new Set();
const duplicates = new Set();
const compendium = game.packs.get(html.find("[name='compendium']").val());
compendium.index.forEach((k) => {
if (found.has(k.img)) {
duplicates.add(k.img);
}
found.add(k.img);
});
if (!duplicates.size) {
ui.notifications.info('No duplicates found in: ' + compendium.title);
}
const images = Array.from(duplicates).map((img) => {
return { path: img, name: getFileName(img) };
});
const allImages = new Map();
allImages.set('Duplicates', images);
showArtSelect('Duplicates', {
allImages,
callback: (img) => {
$(event.target).closest('li').find('[name="image"]').val(img);
$(event.target).closest('li').find('img').attr('src', img);
},
});
},
},
},
default: 'yes',
}).render(true);
});
}
async _updateObject(event, formData) {
updateSettings({
compendiumMapper: { missingImages: this._processFormData(formData) },
});
}
}