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