mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-04-21 23:13:39 +02:00
137 lines
4.5 KiB
JavaScript
137 lines
4.5 KiB
JavaScript
import { RefreshType } from '../../systemRegistration/socket.mjs';
|
|
import Party from '../sheets/actors/party.mjs';
|
|
|
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
|
|
|
export default class GroupRollDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
|
constructor(party) {
|
|
super();
|
|
|
|
this.party = party;
|
|
this.partyMembers = party.system.partyMembers
|
|
.filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type))
|
|
.map(member => ({
|
|
...member.toObject(),
|
|
uuid: member.uuid,
|
|
id: member.id,
|
|
selected: false,
|
|
owned: member.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)
|
|
}));
|
|
|
|
Hooks.on(socketEvent.Refresh, this.groupRollRefresh.bind());
|
|
}
|
|
|
|
get title() {
|
|
return game.i18n.localize('DAGGERHEART.APPLICATIONS.GroupRoll.title');
|
|
}
|
|
|
|
static DEFAULT_OPTIONS = {
|
|
tag: 'form',
|
|
id: 'GroupRollDialog',
|
|
classes: ['daggerheart', 'views', 'dh-style', 'dialog', 'group-roll-dialog'],
|
|
position: { width: 550, height: 'auto' },
|
|
actions: {},
|
|
form: { handler: this.updateData, submitOnChange: true, closeOnSubmit: false }
|
|
};
|
|
|
|
static PARTS = {
|
|
groupRoll: {
|
|
id: 'groupRoll',
|
|
template: 'systems/daggerheart/templates/dialogs/groupRollDialog/groupRoll.hbs'
|
|
}
|
|
};
|
|
|
|
_configureRenderParts(options) {
|
|
const { groupRoll } = super._configureRenderParts(options);
|
|
const augmentedParts = { groupRoll };
|
|
for (const memberKey of Object.keys(this.party.system.tagTeam.members)) {
|
|
augmentedParts[memberKey] = {
|
|
id: memberKey,
|
|
template: 'systems/daggerheart/templates/dialogs/tagTeamDialog/tagTeamMember.hbs'
|
|
};
|
|
}
|
|
augmentedParts.rollSelection = rollSelection;
|
|
augmentedParts.tagTeamRoll = tagTeamRoll;
|
|
|
|
return augmentedParts;
|
|
}
|
|
|
|
async _prepareContext(_options) {
|
|
const context = await super._prepareContext(_options);
|
|
|
|
return context;
|
|
}
|
|
|
|
async _preparePartContext(partId, context, options) {
|
|
const partContext = await super._preparePartContext(partId, context, options);
|
|
|
|
switch (partId) {
|
|
case 'groupRoll':
|
|
break;
|
|
}
|
|
|
|
if (Object.keys(this.party.system.tagTeam.members).includes(partId)) {
|
|
const data = this.party.system.tagTeam.members[partId];
|
|
const actor = game.actors.get(partId);
|
|
}
|
|
|
|
return partContext;
|
|
}
|
|
|
|
static async updateData(event, _, formData) {
|
|
const partyData = foundry.utils.expandObject(formData.object);
|
|
|
|
this.updatePartyData(partyData, this.getUpdatingParts(event.target));
|
|
}
|
|
|
|
async updatePartyData(update, updatingParts, options = { render: true }) {
|
|
if (!game.users.activeGM)
|
|
return ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.gmRequired'));
|
|
|
|
const gmUpdate = async update => {
|
|
await this.party.update(update);
|
|
this.render({ parts: updatingParts });
|
|
game.socket.emit(`system.${CONFIG.DH.id}`, {
|
|
action: socketEvent.Refresh,
|
|
data: { refreshType: RefreshType.TagTeamRoll, action: 'refresh', parts: updatingParts }
|
|
});
|
|
};
|
|
|
|
await emitAsGM(
|
|
GMUpdateEvent.UpdateDocument,
|
|
gmUpdate,
|
|
update,
|
|
this.party.uuid,
|
|
options.render
|
|
? { refreshType: RefreshType.TagTeamRoll, action: 'refresh', parts: updatingParts }
|
|
: undefined
|
|
);
|
|
}
|
|
|
|
getUpdatingParts(target) {
|
|
const updatingMember = target.closest('.team-member-container')?.dataset?.memberKey;
|
|
|
|
return [...(updatingMember ? [updatingMember] : []), rollSelection.id];
|
|
}
|
|
|
|
groupRollRefresh = ({ refreshType, action, parts }) => {
|
|
if (refreshType !== RefreshType.GroupRoll) return;
|
|
|
|
switch (action) {
|
|
case 'refresh':
|
|
this.render({ parts });
|
|
break;
|
|
case 'close':
|
|
this.close();
|
|
break;
|
|
}
|
|
};
|
|
|
|
async close(options = {}) {
|
|
/* Opt out of Foundry's standard behavior of closing all application windows marked as UI when Escape is pressed */
|
|
if (options.closeKey) return;
|
|
|
|
Hooks.off(socketEvent.Refresh, this.groupRollRefresh);
|
|
return super.close(options);
|
|
}
|
|
}
|