import { TVA_CONFIG, updateSettings } from '../scripts/settings.js'; import { SEARCH_TYPE, decodeURISafely } from '../scripts/utils.js'; import { insertArtSelectButton } from './artSelect.js'; export default class UserList extends FormApplication { constructor(object, img, regenStyle) { super({}, {}); this.object = object; this.img = img; this.regenStyle = regenStyle; } static get defaultOptions() { return mergeObject(super.defaultOptions, { id: 'token-variants-user-list', classes: ['sheet'], template: 'modules/token-variants/templates/userList.html', resizable: false, minimizable: false, title: 'User To Image', width: 300, }); } async getData(options) { const data = super.getData(options); const mappings = this.object.document.getFlag('token-variants', 'userMappings') || {}; let users = []; game.users.forEach((user) => { users.push({ avatar: user.avatar, name: user.name, apply: user.id in mappings && mappings[user.id] === this.img, userId: user.id, color: user.color, }); }); data.users = users; data.invisibleImage = TVA_CONFIG.invisibleImage; return data; } /** * @param {JQuery} html */ activateListeners(html) { super.activateListeners(html); insertArtSelectButton(html, 'invisibleImage', { search: 'Invisible Image', searchType: SEARCH_TYPE.TOKEN, }); } async _updateObject(event, formData) { const mappings = this.object.document.getFlag('token-variants', 'userMappings') || {}; if (formData.invisibleImage !== TVA_CONFIG.invisibleImage) { updateSettings({ invisibleImage: decodeURISafely(formData.invisibleImage) }); } delete formData.invisibleImage; const affectedImages = [this.img]; for (const [userId, apply] of Object.entries(formData)) { if (apply) { if (mappings[userId] && mappings[userId] !== this.img) affectedImages.push(mappings[userId]); mappings[userId] = this.img; } else if (mappings[userId] === this.img) { delete mappings[userId]; mappings['-=' + userId] = null; } } if (Object.keys(mappings).filter((userId) => !userId.startsWith('-=')).length === 0) { await this.object.document.unsetFlag('token-variants', 'userMappings'); } else { await this.object.document.setFlag('token-variants', 'userMappings', mappings); } for (const img of affectedImages) { this.regenStyle(this.object, img); } } }