{"version":3,"file":"434.tokenmagic.js","mappings":"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","sources":["webpack://tokenmagic/./tokenmagic/gui/apps/editor/PresetSearch.js","webpack://tokenmagic/./tokenmagic/gui/apps/editor/PresetToggler.js"],"sourcesContent":["import { PresetsLibrary } from '../../../fx/presets/defaultpresets';\r\nimport { FILTER_PARAM_CONTROLS } from '../data/fxControls';\r\nimport { submitPresetToGallery } from './FilterEditor';\r\n\r\nconst { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;\r\n\r\nexport function presetSearch(options = {}) {\r\n\tconst activeInstance = foundry.applications.instances.get(PresetSearch.DEFAULT_OPTIONS.id);\r\n\tif (activeInstance) {\r\n\t\tactiveInstance.close();\r\n\t\treturn;\r\n\t}\r\n\tnew PresetSearch(options).render(true);\r\n}\r\n\r\nexport class PresetSearch extends HandlebarsApplicationMixin(ApplicationV2) {\r\n\tconstructor(options = {}) {\r\n\t\tsuper(options);\r\n\t}\r\n\r\n\t/** @override */\r\n\tstatic DEFAULT_OPTIONS = {\r\n\t\tid: 'tmfx-preset-search',\r\n\t\twindow: {\r\n\t\t\ttitle: 'TokenMagicFX Presets',\r\n\t\t\tresizable: true,\r\n\t\t},\r\n\t\tposition: {\r\n\t\t\twidth: 350,\r\n\t\t\theight: 500,\r\n\t\t},\r\n\t\tclasses: ['tokenmagic', 'search', 'flexcol'],\r\n\t\tactions: {\r\n\t\t\tdelete: PresetSearch._onDeletePreset,\r\n\t\t\tedit: PresetSearch._onEditPreset,\r\n\t\t\ttoggleTemplates: PresetSearch._onToggleTemplates,\r\n\t\t},\r\n\t};\r\n\r\n\t/** @override */\r\n\tstatic PARTS = {\r\n\t\tsearch: {\r\n\t\t\ttemplate: `modules/tokenmagic/templates/apps/preset-search/header-search.hbs`,\r\n\t\t},\r\n\t\tcontrols: {\r\n\t\t\ttemplate: `modules/tokenmagic/templates/apps/preset-search/header-controls.hbs`,\r\n\t\t},\r\n\t\tpresets: {\r\n\t\t\ttemplate: `modules/tokenmagic/templates/apps/filter-editor/filter-list.hbs`,\r\n\t\t\tscrollable: [''],\r\n\t\t},\r\n\t};\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tcontext.partId = partId;\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'search':\r\n\t\t\t\tcontext.searchQuery = this._searchQuery ?? '';\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'controls':\r\n\t\t\t\tcontext.controls = [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\taction: 'toggleTemplates',\r\n\t\t\t\t\t\ttooltip: game.i18n.localize('TMFX.app.searchPreset.controls.templateToggle'),\r\n\t\t\t\t\t\ticon: 'fa-fw fa-solid fa-ruler-combined',\r\n\t\t\t\t\t\tactive: Boolean(this._templates),\r\n\t\t\t\t\t},\r\n\t\t\t\t];\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'presets':\r\n\t\t\t\tawait this._preparePresetContext(context, options);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn context;\r\n\t}\r\n\r\n\tasync _preparePresetContext(context, options) {\r\n\t\tconst controlled = TokenMagic.getControlledPlaceables();\r\n\t\tconst library = this._templates ? PresetsLibrary.TEMPLATE : PresetsLibrary.MAIN;\r\n\r\n\t\tthis._presets = TokenMagic.getPresets(library);\r\n\r\n\t\tlet presets = this._presets;\r\n\t\tif (this._searchQuery?.trim()) {\r\n\t\t\tconst terms = this._searchQuery\r\n\t\t\t\t.split(' ')\r\n\t\t\t\t.map((term) => term.trim())\r\n\t\t\t\t.filter(Boolean);\r\n\t\t\tif (terms.length) {\r\n\t\t\t\tpresets = presets.filter((p) => {\r\n\t\t\t\t\tconst name = p.name.toLocaleLowerCase();\r\n\t\t\t\t\tconst filterTypes = p.params.map((param) => param.filterType.toLocaleLowerCase());\r\n\t\t\t\t\treturn terms.every((t) => name.includes(t) || filterTypes.some((type) => type.includes(t)));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst controls = [\r\n\t\t\t{\r\n\t\t\t\tclass: 'edit',\r\n\t\t\t\taction: 'edit',\r\n\t\t\t\ttooltip: game.i18n.localize('SIDEBAR.Edit'),\r\n\t\t\t\ticon: 'fa-solid fa-pen-to-square',\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tclass: 'delete',\r\n\t\t\t\taction: 'delete',\r\n\t\t\t\ttooltip: game.i18n.localize('SIDEBAR.Delete'),\r\n\t\t\t\ticon: 'fa-solid fa-trash',\r\n\t\t\t},\r\n\t\t];\r\n\r\n\t\tpresets = presets.map((p) => {\r\n\t\t\tconst types = p.params.map((param) => param.filterType);\r\n\t\t\tlet thumbnail;\r\n\t\t\tif (types.length > 1) thumbnail = 'icons/commodities/cloth/cloth-rolls-rgb.webp';\r\n\t\t\telse thumbnail = FILTER_PARAM_CONTROLS[types[0]]?._thumb ?? FILTER_PARAM_CONTROLS.common._thumb;\r\n\r\n\t\t\treturn {\r\n\t\t\t\tlabel: p.name,\r\n\t\t\t\tsubtext: types.join(', '),\r\n\t\t\t\tfilterId: p.name,\r\n\t\t\t\tfilterType: library,\r\n\t\t\t\tactive: controlled.some((c) => TokenMagic.hasFilterId(c, p.params[0].filterId)),\r\n\t\t\t\tcontrols,\r\n\t\t\t\tthumbnail,\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\tcontext.filters = presets;\r\n\t}\r\n\r\n\t/** @override */\r\n\t_attachPartListeners(partId, element, options) {\r\n\t\tsuper._attachPartListeners(partId, element, options);\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'search':\r\n\t\t\t\telement.querySelector('input[type=\"search\"]').addEventListener('input', this._onSearch.bind(this));\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'presets':\r\n\t\t\t\telement.querySelectorAll('.filter').forEach((el) => {\r\n\t\t\t\t\tel.addEventListener('dragstart', this._onDragStart.bind(this));\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t_onDragStart(event) {\r\n\t\tconst { filterId: name, filterType: library } = event.target.closest('.filter').dataset;\r\n\t\tconst dragData = { type: 'TMFX Preset', name, library };\r\n\t\tevent.dataTransfer.setData('text/plain', JSON.stringify(dragData));\r\n\t}\r\n\r\n\t_onSearch(event) {\r\n\t\tclearTimeout(this._searchTimeout);\r\n\t\tthis._searchTimeout = setTimeout(() => {\r\n\t\t\tthis._searchQuery = event.target.value;\r\n\t\t\tthis.render({ parts: ['presets'] });\r\n\t\t}, 200);\r\n\t}\r\n\r\n\tstatic _onToggleTemplates(event, element) {\r\n\t\tthis._templates = !this._templates;\r\n\t\tthis.render({ parts: ['controls', 'presets'] });\r\n\t}\r\n\r\n\tstatic async _onDeletePreset(event, element) {\r\n\t\tconst { filterId: name, filterType: library } = element.closest('.filter').dataset;\r\n\r\n\t\tconst confirmation = await foundry.applications.api.DialogV2.confirm({\r\n\t\t\twindow: { title: 'Delete Preset' },\r\n\t\t\tcontent: `<p style=\"color: red;\"><strong>This operation cannot be undone. Do you wish to continue?</strong></p>`,\r\n\t\t});\r\n\r\n\t\tif (confirmation) {\r\n\t\t\tawait TokenMagic.deletePreset({ name, library });\r\n\t\t\tthis.render({ parts: ['presets'] });\r\n\t\t}\r\n\t}\r\n\r\n\tstatic async _onEditPreset(event, element) {\r\n\t\tconst { filterId: name, filterType: library } = element.closest('.filter').dataset;\r\n\t\tconst preset = TokenMagic.getPresets(library).find((p) => p.name === name);\r\n\t\tif (preset) new PresetEdit({ preset, parentApp: this }).render(true);\r\n\t}\r\n}\r\n\r\nexport class PresetEdit extends HandlebarsApplicationMixin(ApplicationV2) {\r\n\tconstructor({ preset, parentApp }) {\r\n\t\tsuper({});\r\n\t\tthis._preset = foundry.utils.deepClone(preset);\r\n\t\tthis._parentApp = parentApp;\r\n\t}\r\n\r\n\t/** @override */\r\n\tstatic DEFAULT_OPTIONS = {\r\n\t\tid: 'tmfx-preset-edit',\r\n\t\ttag: 'form',\r\n\t\twindow: {\r\n\t\t\tresizable: false,\r\n\t\t\tcontentClasses: ['standard-form'],\r\n\t\t\tcontrols: [\r\n\t\t\t\t{\r\n\t\t\t\t\ticon: 'fa-solid fa-cloud-arrow-up',\r\n\t\t\t\t\tlabel: 'Upload to Gallery',\r\n\t\t\t\t\taction: 'upload',\r\n\t\t\t\t\tvisible: game.user.isGM,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t},\r\n\t\tform: {\r\n\t\t\thandler: PresetEdit._onSubmit,\r\n\t\t\tsubmitOnChange: false,\r\n\t\t\tcloseOnSubmit: true,\r\n\t\t},\r\n\t\tposition: {\r\n\t\t\twidth: 450,\r\n\t\t\theight: 'auto',\r\n\t\t},\r\n\t\tclasses: ['tokenmagic', 'flexcol'],\r\n\t\tactions: {\r\n\t\t\tdelete: PresetSearch._onDeletePreset,\r\n\t\t\tedit: PresetSearch._onEditPreset,\r\n\t\t\ttoggleTemplates: PresetSearch._onToggleTemplates,\r\n\t\t\tupload: PresetEdit._onUpload,\r\n\t\t},\r\n\t};\r\n\r\n\tget title() {\r\n\t\treturn this._preset.name;\r\n\t}\r\n\r\n\t/** @override */\r\n\tstatic PARTS = {\r\n\t\tmain: {\r\n\t\t\ttemplate: `modules/tokenmagic/templates/apps/preset-search/preset-edit.hbs`,\r\n\t\t},\r\n\t\tfooter: { template: 'templates/generic/form-footer.hbs' },\r\n\t};\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tcontext.partId = partId;\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'main':\r\n\t\t\t\tcontext.name = this._preset.name;\r\n\t\t\t\tcontext.library = this._preset.library;\r\n\t\t\t\tcontext.defaultTexture = this._preset.defaultTexture;\r\n\t\t\t\tcontext.params = JSON.stringify(this._preset.params, null, 2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'footer':\r\n\t\t\t\tcontext.buttons = [\r\n\t\t\t\t\t{ type: 'submit', icon: 'fa-solid fa-floppy-disk', label: game.i18n.localize('TMFX.save'), action: 'save' },\r\n\t\t\t\t];\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn context;\r\n\t}\r\n\r\n\tstatic async _onSubmit(event, form, formData) {\r\n\t\tconst name = formData.object.name.trim();\r\n\t\tconst defaultTexture = formData.object.defaultTexture?.trim();\r\n\t\tif (this._preset.name === name && this._preset.defaultTexture === defaultTexture) return;\r\n\t\tif (!name) return;\r\n\r\n\t\tawait TokenMagic.deletePreset({ name: this._preset.name, library: this._preset.library }, true);\r\n\t\tawait TokenMagic.addPreset({ name, library: this._preset.library, defaultTexture }, this._preset.params, true);\r\n\t\tif (this._parentApp.state === ApplicationV2.RENDER_STATES.RENDERED) {\r\n\t\t\tthis._parentApp.render({ parts: ['presets'] });\r\n\t\t}\r\n\t}\r\n\r\n\tstatic async _onUpload(event, element) {\r\n\t\tsubmitPresetToGallery(deepClone(this._preset));\r\n\t}\r\n}\r\n","import { PlaceableType } from '../../../module/constants';\r\nimport { PresetSearch } from './PresetSearch';\r\n\r\nexport function presetToggler() {\r\n\tconst activeInstance = foundry.applications.instances.get(PresetToggler.DEFAULT_OPTIONS.id);\r\n\tif (activeInstance) {\r\n\t\tactiveInstance.close();\r\n\t\treturn;\r\n\t}\r\n\tnew PresetToggler().render(true);\r\n}\r\n\r\nclass PresetToggler extends PresetSearch {\r\n\t/** @override */\r\n\tstatic DEFAULT_OPTIONS = {\r\n\t\tid: 'tmfx-preset-toggler',\r\n\t\twindow: {\r\n\t\t\ttitle: 'TokenMagicFX Preset Toggler',\r\n\t\t},\r\n\t\tclasses: ['tokenmagic', 'toggler', 'flexcol'],\r\n\t\tactions: {\r\n\t\t\tselect: PresetToggler._onTogglePreset,\r\n\t\t\tclear: PresetToggler._onClearAllPresets,\r\n\t\t\tactiveOnly: PresetToggler._onToggleActiveOnly,\r\n\t\t},\r\n\t};\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tawait super._preparePartContext(partId, context, options);\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'header':\r\n\t\t\t\tcontext.activeOnly = this._activeOnly;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'controls':\r\n\t\t\t\tcontext.controls.push({\r\n\t\t\t\t\taction: 'activeOnly',\r\n\t\t\t\t\ttooltip: 'Toggle active only display',\r\n\t\t\t\t\ticon: 'fa-solid fa-power-off',\r\n\t\t\t\t\tactive: Boolean(this._activeOnly),\r\n\t\t\t\t});\r\n\t\t\t\tcontext.controls.push({\r\n\t\t\t\t\taction: 'clear',\r\n\t\t\t\t\ttooltip: 'Clear All Filters',\r\n\t\t\t\t\ticon: 'fa-solid fa-eraser',\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'presets':\r\n\t\t\t\tif (this._activeOnly) context.filters = context.filters.filter((p) => p.active);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn context;\r\n\t}\r\n\r\n\t/**\r\n\t * Toggle a preset on controlled placeables\r\n\t * @param {MouseEvent} event\r\n\t * @param {HTMLElement} element\r\n\t */\r\n\tstatic async _onTogglePreset(event, element) {\r\n\t\tconst controlled = TokenMagic.getControlledPlaceables();\r\n\t\tif (!controlled.length) return;\r\n\r\n\t\tconst { filterId: name, filterType: library } = event.target.closest('.filter').dataset;\r\n\r\n\t\tconst preset = TokenMagic.getPresets(library).find((p) => p.name === name);\r\n\t\tif (!preset?.params?.length) return;\r\n\r\n\t\tconst { filterId } = preset.params[0];\r\n\t\tconst isActive = controlled.some((c) => TokenMagic.hasFilterId(c, filterId));\r\n\t\tconst presetQuery = { name, library };\r\n\t\tconst texture = preset.defaultTexture;\r\n\r\n\t\tif (isActive) {\r\n\t\t\tconst filterIds = new Set(TokenMagic.getPreset(presetQuery).map((p) => p.filterId));\r\n\r\n\t\t\tfor (const placeable of controlled) {\r\n\t\t\t\tfor (const filterId of filterIds) {\r\n\t\t\t\t\tif (TokenMagic.hasFilterId(placeable, filterId)) {\r\n\t\t\t\t\t\tawait TokenMagic.deleteFilters(placeable, filterId);\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tplaceable.document.documentName === 'MeasuredTemplate' &&\r\n\t\t\t\t\t\t\t!placeable.document.flags['tokenmagic']?.filters\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tawait placeable.document.update({ ['-=texture']: null });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst preset = TokenMagic.getPreset(presetQuery);\r\n\t\t\tfor (const placeable of controlled) {\r\n\t\t\t\tif (!TokenMagic.hasFilterId(placeable, filterId)) {\r\n\t\t\t\t\tif (texture && placeable.document.documentName === 'MeasuredTemplate') {\r\n\t\t\t\t\t\tawait placeable.document.update({ texture });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tawait TokenMagic.addUpdateFilters(placeable, preset);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.render({ parts: ['presets'] });\r\n\t}\r\n\r\n\tstatic async _onClearAllPresets(event, element) {\r\n\t\tawait TokenMagic.deleteFiltersOnSelected();\r\n\t\tthis.render({ parts: ['presets'] });\r\n\t}\r\n\r\n\tstatic _onToggleActiveOnly(event, element) {\r\n\t\tthis._activeOnly = !this._activeOnly;\r\n\t\tthis.render(true);\r\n\t}\r\n\r\n\t/** @override */\r\n\tasync _onFirstRender(context, options) {\r\n\t\tawait super._onFirstRender(context, options);\r\n\t\tthis._hooks = [];\r\n\t\tfor (const layer of Object.values(PlaceableType)) {\r\n\t\t\tif (!layer) continue;\r\n\t\t\tconst hook = `control${layer}`;\r\n\t\t\tconst id = Hooks.on(hook, () => {\r\n\t\t\t\tclearTimeout(this._controlHookTimeout);\r\n\t\t\t\tthis._controlHookTimeout = setTimeout(() => this.render({ parts: ['presets'] }), 200);\r\n\t\t\t});\r\n\t\t\tthis._hooks.push({ hook, id });\r\n\t\t}\r\n\t}\r\n\r\n\t/** @override */\r\n\tasync close(options = {}) {\r\n\t\tawait super.close(options);\r\n\t\tthis._hooks?.forEach((h) => {\r\n\t\t\tHooks.off(h.hook, h.id);\r\n\t\t});\r\n\t}\r\n}\r\n"],"names":["HandlebarsApplicationMixin","ApplicationV2","foundry","applications","api","presetSearch","options","activeInstance","instances","get","PresetSearch","DEFAULT_OPTIONS","id","close","render","constructor","super","static","window","title","resizable","position","width","height","classes","actions","delete","_onDeletePreset","edit","_onEditPreset","toggleTemplates","_onToggleTemplates","search","template","controls","presets","scrollable","_preparePartContext","partId","context","searchQuery","this","_searchQuery","action","tooltip","game","i18n","localize","icon","active","Boolean","_templates","_preparePresetContext","controlled","TokenMagic","getControlledPlaceables","library","TEMPLATE","MAIN","_presets","getPresets","trim","terms","split","map","term","filter","length","p","name","toLocaleLowerCase","filterTypes","params","param","filterType","every","t","includes","some","type","class","types","thumbnail","_thumb","common","label","subtext","join","filterId","c","hasFilterId","filters","_attachPartListeners","element","querySelector","addEventListener","_onSearch","bind","querySelectorAll","forEach","el","_onDragStart","event","target","closest","dataset","dragData","dataTransfer","setData","JSON","stringify","clearTimeout","_searchTimeout","setTimeout","value","parts","DialogV2","confirm","content","deletePreset","preset","find","PresetEdit","parentApp","_preset","utils","deepClone","_parentApp","tag","contentClasses","visible","user","isGM","form","handler","_onSubmit","submitOnChange","closeOnSubmit","upload","_onUpload","main","footer","defaultTexture","buttons","formData","object","addPreset","state","RENDER_STATES","RENDERED","presetToggler","PresetToggler","select","_onTogglePreset","clear","_onClearAllPresets","activeOnly","_onToggleActiveOnly","_activeOnly","push","isActive","presetQuery","texture","filterIds","Set","getPreset","placeable","deleteFilters","document","documentName","flags","update","addUpdateFilters","deleteFiltersOnSelected","_onFirstRender","_hooks","layer","Object","values","hook","Hooks","on","_controlHookTimeout","h","off"],"ignoreList":[],"sourceRoot":""}