128 lines
2.5 KiB
JavaScript
128 lines
2.5 KiB
JavaScript
import { __ID__, filePath } from "../consts.mjs";
|
|
|
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
|
|
|
const validInputTypes = [
|
|
`checkbox`,
|
|
`details`,
|
|
`error`,
|
|
`input`,
|
|
`select`,
|
|
];
|
|
|
|
export class Ask extends HandlebarsApplicationMixin(ApplicationV2) {
|
|
static DEFAULT_OPTIONS = {
|
|
tag: `dialog`,
|
|
classes: [
|
|
__ID__,
|
|
`dialog`, // accesses some Foundry-provided styling
|
|
`Ask`,
|
|
],
|
|
position: {
|
|
width: 330,
|
|
},
|
|
window: {
|
|
title: `Questions`,
|
|
resizable: true,
|
|
minimizable: true,
|
|
contentTag: `form`,
|
|
},
|
|
form: {
|
|
closeOnSubmit: true,
|
|
submitOnChange: false,
|
|
handler: this.#submit,
|
|
},
|
|
actions: {
|
|
cancel: this.#cancel,
|
|
},
|
|
};
|
|
|
|
static PARTS = {
|
|
inputs: {
|
|
template: filePath(`templates/Ask/inputs.hbs`),
|
|
templates: validInputTypes.map(type => filePath(`templates/Ask/inputs/${type}.hbs`)),
|
|
},
|
|
controls: {
|
|
template: filePath(`templates/Ask/controls.hbs`),
|
|
},
|
|
};
|
|
|
|
_inputs = [];
|
|
alwaysUseAnswerObject = false;
|
|
|
|
/** @type {string | undefined} */
|
|
_description = undefined;
|
|
|
|
/** @type {Function | undefined} */
|
|
_userOnConfirm;
|
|
|
|
/** @type {Function | undefined} */
|
|
_userOnCancel;
|
|
|
|
/** @type {Function | undefined} */
|
|
_userOnClose;
|
|
|
|
constructor({
|
|
inputs = [],
|
|
description = undefined,
|
|
onConfirm,
|
|
onCancel,
|
|
onClose,
|
|
alwaysUseAnswerObject,
|
|
...options
|
|
} = {}) {
|
|
super(options);
|
|
this.alwaysUseAnswerObject = alwaysUseAnswerObject;
|
|
|
|
for (const input of inputs) {
|
|
if (!validInputTypes.includes(input.type)) {
|
|
input.details = `Invalid input type provided: ${input.type}`;
|
|
input.type = `error`;
|
|
};
|
|
};
|
|
|
|
this._inputs = inputs;
|
|
this._description = description;
|
|
this._userOnCancel = onCancel;
|
|
this._userOnConfirm = onConfirm;
|
|
this._userOnClose = onClose;
|
|
};
|
|
|
|
// #region Lifecycle
|
|
async _onFirstRender() {
|
|
super._onFirstRender();
|
|
this.element.show();
|
|
};
|
|
|
|
async _prepareContext() {
|
|
return {
|
|
inputs: this._inputs,
|
|
description: this._description,
|
|
};
|
|
};
|
|
|
|
async _onClose() {
|
|
super._onClose();
|
|
this._userOnClose?.();
|
|
};
|
|
// #endregion Lifecycle
|
|
|
|
// #region Actions
|
|
/** @this {AskDialog} */
|
|
static async #submit(_event, _element, formData) {
|
|
const answers = formData.object;
|
|
const keys = Object.keys(answers);
|
|
if (keys.length === 1 && !this.alwaysUseAnswerObject) {
|
|
this._userOnConfirm?.(answers[keys[0]]);
|
|
return;
|
|
};
|
|
this._userOnConfirm?.(answers);
|
|
};
|
|
|
|
/** @this {AskDialog} */
|
|
static async #cancel() {
|
|
this._userOnCancel?.();
|
|
this.close();
|
|
};
|
|
// #endregion Actions
|
|
};
|