mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-11 19:25:21 +01:00
* - Move all DataModel item files to a new 'items' subfolder for better organization - Add _module.mjs file to simplify imports - Update all import paths - Rename class for use the new acronym DH * FIX: remove unnecessary import * FEAT: BaseDataItem class add TODO comments for future improvements FIX: Remove effect field on template FIX: remove unused DhpEffects file * FEAT: new FormulaField class FEAT: add getRollData on BaseDataItem Class FEAT: weapon FIX: remove inventoryWeapon field on Weapon Data Model * FEAT: add class prepareBaseData for domains * FEAT: new ForeignDocumentUUIDField FIX: Remove unnecessary fields FEAT: use ForeignDocumentUUIDField in the Item Class DataModel * FIX: remove wrong option in String Field * FIX: remove unused import * FIX: ADD htmlFields description in manifest * FIX: minor fixes * REFACTOR: rename folder `data/items` -> `data/item` REFACTOR: rename folder `data/messages` -> `data/chat-message`. * FIX: imports FIX: items sheet new paths FIX: ItemDataModelMetadata type jsdoc * FEAT: formatting code FIX: fix fields used FEAT: add jsdoc * 110 - Class Data Model (#111) * Added PreCreate/Create/Delete logic for Class/Subclass and set it as foreignUUID fields in PC * Moved methods into TypedModelData * Simplified Subclass * Fixed up data model and a basic placeholder template (#117) * 118 - adversary data model (#119) * Fixed datamodel and set up basic template in new style * Added in a temp attack button, because why not * Restored HitPoints counting up * 113 - Character Data Model (#114) * Improved Character datamodel * Removed additional unneccessary getters * Preliminary cleanup in the class sheet * Cleanup of 'pc' references * Corrected Duality rolling from Character * Fix to damage roll * Added a basic BaseDataActor data model * Gathered exports * getRollData recursion fix * Feature/112 items use action datamodel (#127) * Create new actions classes * actions types - attack roll * fixes before merge * First PR * Add daggerheart.css to gitignore * Update ToDo * Remove console log * Fixed chat /dr roll * Remove jQuery * Fixed so the different chat themes work again * Fixed duality roll buttons * Fix to advantage/disadvantage shortcut * Extand action to other item types * Roll fixes * Fixes to adversary rolls * resources * Fixed adversary dice --------- Co-authored-by: WBHarry <williambjrklund@gmail.com> * Feature/116-implementation-of-pseudo-documents (#125) * FEAT: add baseDataModel logic * FEAT: new PseudoDocumentsField FIX: BasePseudoDocument 's getEmbeddedDocument * FEAT: PseudoDocument class * FEAT: add TypedPseudoDocument REFACTOR: PreudoDocument FIX: Typos Bug * FIX: CONFIG types * FEAT: basic PseudoDocumentSheet * FIX: remove schema ADD: input of example --------- Co-authored-by: Joaquin Pereyra <joaquinpereyra98@users.noreply.github.com> Co-authored-by: WBHarry <williambjrklund@gmail.com> * Levelup Followup (#126) * Levelup applies bonuses to character * Added visualisation of domain card levels * Fixed domaincard level max for selections in a tier * A trait can now only be level up once within the same tier --------- Co-authored-by: Joaquin Pereyra <joaquinpereyra98@users.noreply.github.com> Co-authored-by: joaquinpereyra98 <24190917+joaquinpereyra98@users.noreply.github.com> Co-authored-by: Dapoulp <74197441+Dapoulp@users.noreply.github.com>
158 lines
5.7 KiB
JavaScript
158 lines
5.7 KiB
JavaScript
import BasePseudoDocument from './base.mjs';
|
|
const { ApplicationV2 } = foundry.applications.api;
|
|
|
|
/**
|
|
* A mixin that adds sheet management capabilities to pseudo-documents
|
|
* @template {typeof BasePseudoDocument} T
|
|
* @param {T} Base
|
|
* @returns {T & typeof PseudoDocumentWithSheets}
|
|
*/
|
|
export default function SheetManagementMixin(Base) {
|
|
class PseudoDocumentWithSheets extends Base {
|
|
/**
|
|
* Reference to the sheet of this pseudo-document.
|
|
* @type {ApplicationV2|null}
|
|
*/
|
|
get sheet() {
|
|
if (this._sheet) return this._sheet;
|
|
const cls = this.constructor.metadata.sheetClass ?? ApplicationV2;
|
|
|
|
if (!foundry.utils.isSubclass(cls, ApplicationV2)) {
|
|
return void ui.notifications.error(
|
|
'Daggerheart | Error on PseudoDocument | sheetClass must be ApplicationV2'
|
|
);
|
|
}
|
|
|
|
const sheet = new cls({ document: this });
|
|
this._sheet = sheet;
|
|
return sheet;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Static Properties */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Set of apps what should be re-render.
|
|
* @type {Set<ApplicationV2>}
|
|
* @internal
|
|
*/
|
|
_apps = new Set();
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Existing sheets of a specific type for a specific document.
|
|
* @type {ApplicationV2 | null}
|
|
*/
|
|
_sheet = null;
|
|
|
|
/* -------------------------------------------- */
|
|
/* Display Methods */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Render all the Application instances which are connected to this PseudoDocument.
|
|
* @param {ApplicationRenderOptions} [options] Rendering options.
|
|
*/
|
|
render(options) {
|
|
for (const app of this._apps ?? []) {
|
|
app.render({ window: { title: app.title }, ...options });
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Register an application to respond to updates to a certain document.
|
|
* @param {ApplicationV2} app Application to update.
|
|
* @internal
|
|
*/
|
|
_registerApp(app) {
|
|
this._apps.add(app);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Remove an application from the render registry.
|
|
* @param {ApplicationV2} app Application to stop watching.
|
|
*/
|
|
_unregisterApp(app) {
|
|
this._apps.delete(app);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Drag and Drop */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Serialize salient information for this PseudoDocument when dragging it.
|
|
* @returns {object} An object of drag data.
|
|
*/
|
|
toDragData() {
|
|
const dragData = { type: this.documentName, data: this.toObject() };
|
|
if (this.id) dragData.uuid = this.uuid;
|
|
return dragData;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Dialog Methods */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Spawn a dialog for creating a new PseudoDocument.
|
|
* @param {object} [data] Data to pre-populate the document with.
|
|
* @param {object} context
|
|
* @param {foundry.documents.Item} context.parent A parent for the document.
|
|
* @param {string[]|null} [context.types] A list of types to restrict the choices to, or null for no restriction.
|
|
* @returns {Promise<BasePseudoDocument|null>}
|
|
*/
|
|
static async createDialog(data = {}, { parent, types = null, ...options } = {}) {
|
|
// TODO
|
|
}
|
|
|
|
/**
|
|
* Present a Dialog form to confirm deletion of this PseudoDocument.
|
|
* @param {object} [options] - Additional options passed to `DialogV2.confirm`;
|
|
* @returns {Promise<foundry.abstract.Document>} A Promise which resolves to the deleted PseudoDocument.
|
|
*/
|
|
async deleteDialog(options = {}) {
|
|
const type = game.i18n.localize(this.constructor.metadata.label);
|
|
const content = options.content ?? `<p>
|
|
<strong>${game.i18n.localize("AreYouSure")}</strong>
|
|
${game.i18n.format("SIDEBAR.DeleteWarning", { type })}
|
|
</p>`;
|
|
|
|
return foundry.applications.api.DialogV2.confirm({
|
|
content,
|
|
yes: { callback: () => this.delete(operation) },
|
|
window: {
|
|
icon: "fa-solid fa-trash",
|
|
title: `${game.i18n.format("DOCUMENT.Delete", { type })}: ${this.name}`
|
|
},
|
|
...options
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Gets the default new name for a Document
|
|
* @param {object} collection - Collection of Documents
|
|
* @returns {string}
|
|
*/
|
|
static defaultName(collection) {
|
|
const documentName = this.metadata.name;
|
|
const takenNames = new Set();
|
|
for (const document of collection) takenNames.add(document.name);
|
|
|
|
const config = CONFIG.daggerheart.pseudoDocuments[documentName];
|
|
const baseName = game.i18n.localize(config.label);
|
|
let name = baseName;
|
|
let index = 1;
|
|
while (takenNames.has(name)) name = `${baseName} (${++index})`;
|
|
return name;
|
|
}
|
|
}
|
|
|
|
return PseudoDocumentWithSheets;
|
|
}
|