export default class EditJsonConfig extends FormApplication {
|
|
constructor(config, callback) {
|
|
super({}, {});
|
|
this.config = config;
|
|
this.callback = callback;
|
|
}
|
|
|
|
static get defaultOptions() {
|
|
return mergeObject(super.defaultOptions, {
|
|
id: 'token-variants-config-json-edit',
|
|
classes: ['sheet'],
|
|
template: 'modules/token-variants/templates/configJsonEdit.html',
|
|
resizable: true,
|
|
minimizable: false,
|
|
title: 'Edit Token Configuration',
|
|
width: 400,
|
|
height: 380,
|
|
});
|
|
}
|
|
|
|
async getData(options) {
|
|
const data = super.getData(options);
|
|
|
|
data.hasConfig = this.config != null && Object.keys(this.config).length !== 0;
|
|
data.config = JSON.stringify(data.hasConfig ? this.config : {}, null, 2);
|
|
|
|
return data;
|
|
}
|
|
|
|
/**
|
|
* @param {JQuery} html
|
|
*/
|
|
activateListeners(html) {
|
|
super.activateListeners(html);
|
|
html.on('input', '.command textarea', this._validateJSON.bind(this));
|
|
// Override 'Tab' key to insert spaces
|
|
html.on('keydown', '.command textarea', function (e) {
|
|
if (e.key === 'Tab' && !e.shiftKey) {
|
|
e.preventDefault();
|
|
var start = this.selectionStart;
|
|
var end = this.selectionEnd;
|
|
this.value = this.value.substring(0, start) + ' ' + this.value.substring(end);
|
|
this.selectionStart = this.selectionEnd = start + 2;
|
|
return false;
|
|
}
|
|
});
|
|
|
|
html.find('.remove').click(this._onRemove.bind(this));
|
|
html.find('.format').click(this._onFormat.bind(this));
|
|
}
|
|
|
|
async _validateJSON(event) {
|
|
const controls = $(event.target).closest('form').find('button[type="submit"], button.format');
|
|
try {
|
|
this.config = JSON.parse(event.target.value);
|
|
this.config = expandObject(this.config);
|
|
this.flag = this.config.flag;
|
|
controls.prop('disabled', false);
|
|
} catch (e) {
|
|
controls.prop('disabled', true);
|
|
}
|
|
}
|
|
|
|
async _onRemove(event) {
|
|
this.config = {};
|
|
this.submit();
|
|
}
|
|
|
|
async _onFormat(event) {
|
|
$(event.target)
|
|
.closest('form')
|
|
.find('textarea[name="config"]')
|
|
.val(JSON.stringify(this.config, null, 2));
|
|
}
|
|
|
|
/**
|
|
* @param {Event} event
|
|
* @param {Object} formData
|
|
*/
|
|
async _updateObject(event, formData) {
|
|
if (this.callback) this.callback(this.config);
|
|
}
|
|
}
|