│ DataModels │ │ - Reorganize DataModels into src/module/models/ (one .mjs per type) │ - Create AppV2 actor/item sheets (HandlebarsApplicationMixin)…
108 lines
3.5 KiB
JavaScript
108 lines
3.5 KiB
JavaScript
const { HandlebarsApplicationMixin } = foundry.applications.api;
|
|
|
|
export default class MGT2ActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
|
|
|
|
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
|
|
|
constructor(options = {}) {
|
|
super(options);
|
|
this._sheetMode = this.constructor.SHEET_MODES.PLAY;
|
|
}
|
|
|
|
/** @override */
|
|
static DEFAULT_OPTIONS = {
|
|
classes: ["mgt2", "sheet", "actor"],
|
|
position: {
|
|
width: 780,
|
|
},
|
|
form: {
|
|
submitOnChange: true,
|
|
closeOnSubmit: false,
|
|
},
|
|
window: {
|
|
resizable: true,
|
|
},
|
|
dragDrop: [{ dragSelector: ".drag-item-list", dropSelector: ".drop-item-list" }],
|
|
actions: {
|
|
toggleSheet: MGT2ActorSheet.#onToggleSheet,
|
|
},
|
|
}
|
|
|
|
get isPlayMode() {
|
|
if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;
|
|
return this._sheetMode === this.constructor.SHEET_MODES.PLAY;
|
|
}
|
|
|
|
get isEditMode() {
|
|
if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;
|
|
return this._sheetMode === this.constructor.SHEET_MODES.EDIT;
|
|
}
|
|
|
|
tabGroups = { sidebar: "health" }
|
|
|
|
/** @override */
|
|
async _prepareContext() {
|
|
const base = await super._prepareContext();
|
|
const actor = this.document;
|
|
return {
|
|
...base,
|
|
actor: actor,
|
|
// Flat shorthands for template backward-compat (AppV1 style)
|
|
name: actor.name,
|
|
img: actor.img,
|
|
cssClass: this.isEditable ? "editable" : "locked",
|
|
system: actor.system,
|
|
source: actor.toObject(),
|
|
fields: actor.schema.fields,
|
|
systemFields: actor.system.schema.fields,
|
|
isEditable: this.isEditable,
|
|
isEditMode: this.isEditMode,
|
|
isPlayMode: this.isPlayMode,
|
|
isGM: game.user.isGM,
|
|
config: CONFIG.MGT2,
|
|
};
|
|
}
|
|
|
|
/** @override */
|
|
_onRender(context, options) {
|
|
super._onRender(context, options);
|
|
// Inject theme class dynamically (can't use game.settings in static DEFAULT_OPTIONS)
|
|
const theme = game.settings.get("mgt2", "theme");
|
|
if (theme) this.element.classList.add(theme);
|
|
this._activateTabGroups();
|
|
}
|
|
|
|
_activateTabGroups() {
|
|
for (const [group, activeTab] of Object.entries(this.tabGroups)) {
|
|
const nav = this.element.querySelector(`nav[data-group="${group}"]`);
|
|
if (!nav) continue;
|
|
|
|
nav.querySelectorAll('[data-tab]').forEach(link => {
|
|
link.classList.toggle('active', link.dataset.tab === activeTab);
|
|
link.addEventListener('click', event => {
|
|
event.preventDefault();
|
|
this.tabGroups[group] = link.dataset.tab;
|
|
this.render();
|
|
});
|
|
});
|
|
|
|
this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
|
|
content.classList.toggle('active', content.dataset.tab === activeTab);
|
|
});
|
|
}
|
|
}
|
|
|
|
/** @override */
|
|
_canDragDrop(selector) {
|
|
return this.isEditable;
|
|
}
|
|
|
|
static async #onToggleSheet(event) {
|
|
event.preventDefault();
|
|
this._sheetMode = this.isPlayMode
|
|
? this.constructor.SHEET_MODES.EDIT
|
|
: this.constructor.SHEET_MODES.PLAY;
|
|
this.render();
|
|
}
|
|
}
|