Allow creating custom embedded documents of any type from the sheet, and add functionality to the aspect create button
This commit is contained in:
parent
134b13756a
commit
7d990fe64b
7 changed files with 52 additions and 48 deletions
|
|
@ -273,6 +273,9 @@
|
|||
"defaults": {
|
||||
"spell": {
|
||||
"name": "(Unnamed Spell)"
|
||||
},
|
||||
"aspect": {
|
||||
"name": "(Unnamed Aspect)"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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`),
|
||||
}]);
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -42,11 +42,17 @@
|
|||
{{localize "dotdungeon.actor.pc.aspect.empty"}}
|
||||
</p>
|
||||
{{/each}}
|
||||
{{#if (or computed.canAddAspect (not (dd-empty items.aspect)))}}
|
||||
{{#if (or computed.canAddAspect (dd-empty items.aspect))}}
|
||||
<button
|
||||
class="confirm"
|
||||
data-embedded-create="Aspect"
|
||||
>
|
||||
{{localize "dotdungeon.actor.pc.aspect.add"}}
|
||||
<div aria-hidden="true" class="icon icon--20">
|
||||
{{{ icons.create }}}
|
||||
</div>
|
||||
<span>
|
||||
{{localize "dotdungeon.actor.pc.aspect.add"}}
|
||||
</span>
|
||||
</button>
|
||||
{{/if}}
|
||||
{{/ dotdungeon.panel}}
|
||||
|
|
@ -67,16 +67,15 @@
|
|||
{{/each}}
|
||||
|
||||
|
||||
<div class="flex-row">
|
||||
<button
|
||||
class="confirm add-spell"
|
||||
>
|
||||
<div aria-hidden="true" class="icon icon--20">
|
||||
{{{ icons.create }}}
|
||||
</div>
|
||||
<span>
|
||||
{{localize "dotdungeon.actor.pc.spells.add.label"}}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
class="confirm"
|
||||
data-embedded-create="Spell"
|
||||
>
|
||||
<div aria-hidden="true" class="icon icon--20">
|
||||
{{{ icons.create }}}
|
||||
</div>
|
||||
<span>
|
||||
{{localize "dotdungeon.actor.pc.spells.add.label"}}
|
||||
</span>
|
||||
</button>
|
||||
{{/ dotdungeon.panel}}
|
||||
Loading…
Add table
Add a link
Reference in a new issue