RC-65 | Gear | Display Data

This commit is contained in:
Oliver-Akins 2025-01-25 23:49:51 -07:00
parent 9a3b82ef6a
commit 1e416ff9bf
10 changed files with 172 additions and 39 deletions

View file

@ -1,5 +1,6 @@
import { filePath } from "../../consts.mjs";
import { GenericAppMixin } from "../GenericApp.mjs";
import { HeroSkillsCardV1 } from "./HeroSkillsCardV1.mjs";
import { HeroSummaryCardV1 } from "./HeroSummaryCardV1.mjs";
import { Logger } from "../../utils/Logger.mjs";
@ -43,7 +44,26 @@ export class CombinedHeroSheet extends GenericAppMixin(HandlebarsApplicationMixi
// #region Lifecycle
async _onRender(context, options) {
await super._onRender(context, options);
HeroSummaryCardV1._onRender.bind(this)(context, options);
const summaryElement = this.element.querySelector(`.HeroSummaryCardV1`);
HeroSummaryCardV1._onRender(
context,
{
...options,
element: summaryElement,
isEditable: this.isEditable,
},
);
const skillsElement = this.element.querySelector(`.HeroSkillsCardV1`);
HeroSkillsCardV1._onRender.bind(this)(
context,
{
...options,
element: skillsElement,
isEditable: this.isEditable,
},
);
};
async _preparePartContext(partId, ctx, opts) {
@ -58,6 +78,8 @@ export class CombinedHeroSheet extends GenericAppMixin(HandlebarsApplicationMixi
ctx = await HeroSummaryCardV1.prepareSpeed(ctx);
ctx = await HeroSummaryCardV1.prepareLevelData(ctx);
ctx = await HeroSkillsCardV1.prepareGear(ctx);
Logger.debug(`Context:`, ctx);
return ctx;
};

View file

@ -1,3 +1,4 @@
import { deleteItemFromElement, editItemFromElement } from "../utils.mjs";
import { filePath } from "../../consts.mjs";
import { gameTerms } from "../../gameTerms.mjs";
import { GenericAppMixin } from "../GenericApp.mjs";
@ -6,6 +7,7 @@ import { Logger } from "../../utils/Logger.mjs";
const { HandlebarsApplicationMixin } = foundry.applications.api;
const { ActorSheetV2 } = foundry.applications.sheets;
const { ContextMenu } = foundry.applications.ui;
export class HeroSkillsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin(ActorSheetV2)) {
@ -38,13 +40,79 @@ export class HeroSkillsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin
// #endregion
// #region Lifecycle
async _onRender(context, options) {
await super._onRender(context, options);
HeroSkillsCardV1._onRender.bind(this)(context, options);
};
static async _onRender(_context, options) {
const {
element = this.element,
isEditable = this.isEditable,
} = options;
new ContextMenu(
element,
`[data-ctx-menu="gear"]`,
[
{
name: localizer(`RipCrypt.common.edit`),
condition: (el) => {
const itemId = el.dataset.itemId;
return isEditable && itemId !== ``;
},
callback: editItemFromElement,
},
{
name: localizer(`RipCrypt.common.delete`),
condition: (el) => {
const itemId = el.dataset.itemId;
return isEditable && itemId !== ``;
},
callback: deleteItemFromElement,
},
],
{ jQuery: false, fixed: true },
);
};
async _preparePartContext(partId, ctx, opts) {
ctx = await super._preparePartContext(partId, ctx, opts);
ctx.actor = this.document;
ctx = await HeroSkillsCardV1.prepareGear(ctx);
Logger.debug(`Context:`, ctx);
return ctx;
};
static async prepareGear(ctx) {
const limit = ctx.actor.system.limit.equipment;
ctx.gear = [];
const items = [...ctx.actor.items];
for (const item of items) {
if (!gameTerms.gearItemTypes.has(item.type)) { continue };
if ( `equipped` in item.system && !item.system.equipped) { continue };
ctx.gear.push({
index: ctx.gear.length,
uuid: item.uuid,
name: item.name,
empty: false,
});
if (ctx.gear.length >= limit) { break };
};
if (ctx.gear.length < limit) {
for (let i = ctx.gear.length - 1; i <= limit; i++) {
ctx.gear.push({
index: ctx.gear.length,
uuid: ``, name: ``, empty: true });
};
};
return ctx;
};
// #endregion
// #region Actions

View file

@ -1,3 +1,4 @@
import { deleteItemFromElement, editItemFromElement } from "../utils.mjs";
import { filePath } from "../../consts.mjs";
import { gameTerms } from "../../gameTerms.mjs";
import { GenericAppMixin } from "../GenericApp.mjs";
@ -24,7 +25,6 @@ export class HeroSummaryCardV1 extends GenericAppMixin(HandlebarsApplicationMixi
resizable: false,
},
actions: {
editItem: (_event, target) => this._editItem(target),
},
form: {
submitOnChange: true,
@ -45,32 +45,30 @@ export class HeroSummaryCardV1 extends GenericAppMixin(HandlebarsApplicationMixi
HeroSummaryCardV1._onRender.bind(this)(context, options);
};
static async _onRender() {
static async _onRender(context, options) {
const {
element = this.element,
isEditable = this.isEditable,
} = options;
new ContextMenu(
this.element,
element,
`[data-ctx-menu="weapon"],[data-ctx-menu="armour"]`,
[
{
name: `Edit`,
name: localizer(`RipCrypt.common.edit`),
condition: (el) => {
const itemId = el.dataset.itemId;
return this.isEditable && itemId !== ``;
return isEditable && itemId !== ``;
},
callback: HeroSummaryCardV1._editItem,
callback: editItemFromElement,
},
{
name: `Delete`,
name: localizer(`RipCrypt.common.delete`),
condition: (el) => {
const itemId = el.dataset.itemId;
return this.isEditable && itemId !== ``;
},
callback: async (el) => {
const itemEl = el.closest(`[data-item-id]`);
if (!itemEl) { return };
const itemId = itemEl.dataset.itemId;
const item = await fromUuid(itemId);
await item.delete();
return isEditable && itemId !== ``;
},
callback: deleteItemFromElement,
},
],
{ jQuery: false, fixed: true },
@ -200,13 +198,5 @@ export class HeroSummaryCardV1 extends GenericAppMixin(HandlebarsApplicationMixi
// #endregion
// #region Actions
static async _editItem(target) {
const itemEl = target.closest(`[data-item-id]`);
if (!itemEl) { return };
const itemId = itemEl.dataset.itemId;
if (!itemId) { return };
const item = await fromUuid(itemId);
item.sheet.render({ force: true });
};
// #endregion
};