From 7d990fe64bc0e5cb8e41b3cefa1a00f1d2cf7591 Mon Sep 17 00:00:00 2001 From: Oliver-Akins Date: Fri, 12 Jan 2024 23:26:55 -0700 Subject: [PATCH] Allow creating custom embedded documents of any type from the sheet, and add functionality to the aspect create button --- langs/en-ca.json | 3 ++ module/documents/Actor/Handler.mjs | 8 ++-- module/documents/Actor/Player.mjs | 39 ++++++++----------- module/sheets/GenericActorSheet.mjs | 8 ++++ module/sheets/PlayerSheet.mjs | 9 ----- .../char-sheet-mvp/panels/aspect.pc.hbs | 10 ++++- .../char-sheet-mvp/panels/spells.pc.hbs | 23 ++++++----- 7 files changed, 52 insertions(+), 48 deletions(-) diff --git a/langs/en-ca.json b/langs/en-ca.json index a2306b4..580d9db 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -273,6 +273,9 @@ "defaults": { "spell": { "name": "(Unnamed Spell)" + }, + "aspect": { + "name": "(Unnamed Aspect)" } } }, diff --git a/module/documents/Actor/Handler.mjs b/module/documents/Actor/Handler.mjs index bcb09a4..89b8f44 100644 --- a/module/documents/Actor/Handler.mjs +++ b/module/documents/Actor/Handler.mjs @@ -34,8 +34,10 @@ export class ActorHandler extends Actor { this.fn.genericEmbeddedDelete.bind(this)($event); }; - async createCustomSpell($event) { - if (!this.fn?.createCustomSpell) return; - this.fn.createCustomSpell.bind(this)($event); + async genericEmbeddedCreate($event) { + const data = $event.currentTarget.dataset; + console.log(data) + if (!this.fn?.[`createCustom${data.embeddedCreate}`]) return; + this.fn?.[`createCustom${data.embeddedCreate}`].bind(this)($event); }; }; diff --git a/module/documents/Actor/Player.mjs b/module/documents/Actor/Player.mjs index 599ec65..00d8cbe 100644 --- a/module/documents/Actor/Player.mjs +++ b/module/documents/Actor/Player.mjs @@ -37,40 +37,35 @@ export class PlayerActor { }; /** @this {Actor} */ - static async createCustomItem(defaults) { + static async createCustomItem(defaults, opts = {}) { let items = await this.createEmbeddedDocuments(`Item`, defaults); if (items.length == 0) { throw new Error(); }; this.sheet.render(); - if (game.settings.get(`dotdungeon`, `openEmbeddedOnCreate`)) { + if ( + game.settings.get(`dotdungeon`, `openEmbeddedOnCreate`) + && !opts.overrideSheetOpen + ) { for (const item of items) { item.sheet.render(true); }; }; }; + /** @this {Actor} */ + static async createCustomAspect() { + await PlayerActor.createCustomItem.bind(this)([{ + type: `aspect`, + name: game.i18n.format(`dotdungeon.defaults.aspect.name`), + }]); + }; + /** @this {Actor} */ static async createCustomSpell() { - let items = await this.createEmbeddedDocuments( - "Item", - [{ - type: `spell`, - name: game.i18n.format(`dotdungeon.defaults.spell.name`), - }] - ); - if (items.length == 0) { - ui.notifications.error( - `dotdungeon.notifications.error.spell-create-failed`, - { localize: true, console: false } - ); - return; - }; - this.sheet.render(); - if (game.settings.get(`dotdungeon`, `openEmbeddedOnCreate`)) { - for (const item of items) { - item.sheet.render(true); - }; - }; + await PlayerActor.createCustomItem.bind(this)([{ + type: `spell`, + name: game.i18n.format(`dotdungeon.defaults.spell.name`), + }]); }; }; diff --git a/module/sheets/GenericActorSheet.mjs b/module/sheets/GenericActorSheet.mjs index 4c9cf69..dfb1b7c 100644 --- a/module/sheets/GenericActorSheet.mjs +++ b/module/sheets/GenericActorSheet.mjs @@ -43,6 +43,14 @@ export class GenericActorSheet extends ActorSheet { html.find(`summary`).on(`click`, this._handleSummaryToggle.bind(this)); html.find(`.roll`).on(`click`, this._handleRoll.bind(this)); + html.find(`[data-embedded-update]`) + .on(`change`, this.actor.genericEmbeddedUpdate.bind(this.actor)); + html.find(`[data-embedded-delete]`) + .on(`click`, this.actor.genericEmbeddedDelete.bind(this.actor)); + html.find(`[data-embedded-create]`) + .on(`click`, this.actor.genericEmbeddedCreate.bind(this.actor)); + html.find(`[data-embedded-edit]`) + .on(`click`, this.actor.openEmbeddedSheet.bind(this.actor)); }; async _handleRoll($e) { diff --git a/module/sheets/PlayerSheet.mjs b/module/sheets/PlayerSheet.mjs index db69a52..3cfa060 100644 --- a/module/sheets/PlayerSheet.mjs +++ b/module/sheets/PlayerSheet.mjs @@ -18,15 +18,6 @@ export class PlayerSheet extends GenericActorSheet { if (this.document.isEmbedded) return; if (!this.isEditable) return; console.debug(`.dungeon | Adding event listeners for Actor: ${this.id}`); - - html.find(`.add-spell`).on(`click`, this.actor.createCustomSpell.bind(this.actor)); - // TODO: Apparently the `change` event is bad to use in Foundry - // html.find(`[data-embedded-update]`) - // .on(`change`, this.actor.genericEmbeddedUpdate.bind(this.actor)); - html.find(`[data-embedded-delete]`) - .on(`click`, this.actor.genericEmbeddedDelete.bind(this.actor)); - html.find(`[data-embedded-edit]`) - .on(`click`, this.actor.openEmbeddedSheet.bind(this.actor)); }; async getData() { diff --git a/templates/actors/char-sheet-mvp/panels/aspect.pc.hbs b/templates/actors/char-sheet-mvp/panels/aspect.pc.hbs index 7e87852..42cf1f8 100644 --- a/templates/actors/char-sheet-mvp/panels/aspect.pc.hbs +++ b/templates/actors/char-sheet-mvp/panels/aspect.pc.hbs @@ -42,11 +42,17 @@ {{localize "dotdungeon.actor.pc.aspect.empty"}}

{{/each}} - {{#if (or computed.canAddAspect (not (dd-empty items.aspect)))}} + {{#if (or computed.canAddAspect (dd-empty items.aspect))}} {{/if}} {{/ dotdungeon.panel}} \ No newline at end of file diff --git a/templates/actors/char-sheet-mvp/panels/spells.pc.hbs b/templates/actors/char-sheet-mvp/panels/spells.pc.hbs index 8a40ba6..6207784 100644 --- a/templates/actors/char-sheet-mvp/panels/spells.pc.hbs +++ b/templates/actors/char-sheet-mvp/panels/spells.pc.hbs @@ -67,16 +67,15 @@ {{/each}} -
- -
+ {{/ dotdungeon.panel}} \ No newline at end of file