ripcrypt/module/Apps/GenericApp.mjs
2025-01-25 23:49:51 -07:00

71 lines
1.8 KiB
JavaScript

import { deleteItemFromElement, editItemFromElement } from "./utils.mjs";
import { DicePool } from "./DicePool.mjs";
/**
* A mixin that takes the class from HandlebarsApplicationMixin and
*/
export function GenericAppMixin(HandlebarsApp) {
class GenericRipCryptApp extends HandlebarsApp {
// #region Options
static DEFAULT_OPTIONS = {
classes: [
`ripcrypt`,
],
actions: {
roll: this._rollDice,
editItem: (_event, target) => editItemFromElement(target),
deleteItem: (_event, target) => deleteItemFromElement(target),
},
};
static themes = {
dark: `SETTINGS.UI.FIELDS.colorScheme.dark`,
};
// #endregion
// #region Lifecycle
/**
* @override
* Making it so that if the app is already open, it's brought to
* top after being re-rendered as normal
*/
async render(options = {}, _options = {}) {
super.render(options, _options);
const instance = foundry.applications.instances.get(this.id);
if (instance !== undefined && !options.noBringToFront) {
instance.bringToFront();
};
};
async _preparePartContext(partId, ctx, opts) {
ctx = await super._preparePartContext(partId, ctx, opts);
delete ctx.document;
delete ctx.fields;
ctx.meta ??= {};
ctx.meta.idp = this.document?.uuid ?? this.id;
if (this.document) {
ctx.meta.limited = this.document.limited;
ctx.meta.editable = ctx.editable;
}
delete ctx.editable;
return ctx;
};
// #endregion
// #region Actions
/** @this {GenericRipCryptApp} */
static async _rollDice(_$e, el) {
const data = el.dataset;
const diceCount = parseInt(data.diceCount);
const flavor = data.flavor;
const dp = new DicePool({ diceCount, flavor });
dp.render({ force: true });
};
// #endregion
};
return GenericRipCryptApp;
};