start converting main power dialog to applicationv2

This commit is contained in:
Mike Bloy 2025-05-29 00:12:41 -05:00
parent 669c3799a0
commit a47b765c6f
2 changed files with 61 additions and 84 deletions

View File

@ -40,52 +40,39 @@ function _hashCode(str) {
return Math.abs(hash); return Math.abs(hash);
} }
export class PowerFormApplicationV2 extends HandlebarsApplicationMixin(ApplicationV2) { export class PowerFormApplication extends HandlebarsApplicationMixin(ApplicationV2) {
constructor(powerEffect) { constructor(powerEffect) {
super();
const name = powerEffect.name.replaceAll(/[^a-zA-Z]/g, ''); const name = powerEffect.name.replaceAll(/[^a-zA-Z]/g, '');
this.options.id = `${this.options.id}${name}`; const id = `${PowerFormApplication.DEFAULT_OPTIONS.id}${name}`;
super({ id });
this.powerEffect = powerEffect; this.powerEffect = powerEffect;
} }
static DEFAULT_OPTIONS = { static DEFAULT_OPTIONS = {
id: ['mbSwadePowerEffectsApplicationV2'], id: 'mbSwadePowerEffectsApplicationV2',
form: { form: {
handler: PowerFormApplicationV2.#onSubmit, handler: PowerFormApplication.#onSubmit,
closeOnSubmit: true, closeOnSubmit: true,
}, },
tag: 'form', tag: 'form',
position: { position: {
width: 400, width: 600,
height: 'auto', height: 'auto',
}, },
classes: ['sheet', 'mbSwadeForm', 'mbSwadePowerEffectsForm'],
window: { window: {
icon: 'fas fa-gear', icon: 'fa-solid fa-hand-sparkles',
title: 'mbSwade.powerEffectsForm.title', title: 'mbSwade.powerEffectsForm.title',
}, },
}; };
static #onSubmit(event, form, formData) {} static PARTS = {
} body: { template: templates['powerDialog.html'] },
footer: {
export class PowerFormApplication extends FormApplication { template: 'templates/generic/form-footer.hbs',
constructor(powerEffect) { classes: ['sheet-footer', 'flexrow'],
super(); },
const name = powerEffect.name.replaceAll(/[^a-zA-Z]/g, ''); };
this.options.id = `${this.options.id}${name}`;
this.powerEffect = powerEffect;
}
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['sheet', 'mbSwadeForm', 'mbSwadePowerEffectsForm'],
popOut: true,
template: templates['powerDialog.html'],
id: ['mbSwadePowerEffectsApplication'],
title: 'Power Effects',
width: 400,
});
}
static sortMods(a, b) { static sortMods(a, b) {
if (a.isGlobal !== b.isGlobal) { if (a.isGlobal !== b.isGlobal) {
@ -100,7 +87,7 @@ export class PowerFormApplication extends FormApplication {
return a.name === b.name ? 0 : a.name < b.name ? -1 : 1; return a.name === b.name ? 0 : a.name < b.name ? -1 : 1;
} }
getData() { _prepareContext() {
let modifiers = foundry.utils.deepClone(this.powerEffect.modifiers); let modifiers = foundry.utils.deepClone(this.powerEffect.modifiers);
modifiers.sort(PowerFormApplication.sortMods); modifiers.sort(PowerFormApplication.sortMods);
for (const modifier of modifiers) { for (const modifier of modifiers) {
@ -153,8 +140,8 @@ export class PowerFormApplication extends FormApplication {
return data; return data;
} }
async _updateObject(ev, formData) { static async #onSubmit(event, form, formData) {
formData.submit = ev?.submitter?.value ?? 'cancel'; formData.submit = event?.submitter?.value ?? 'cancel';
if (formData.submit !== 'cancel') { if (formData.submit !== 'cancel') {
this.powerEffect.formData = formData; this.powerEffect.formData = formData;
this.powerEffect.applyEffect(); this.powerEffect.applyEffect();

View File

@ -1,64 +1,54 @@
<form class="flexcol"><!-- vim: set ft=handlebars.html: --> <div class="standard-form"><!-- vim: set ft=handlebars.html: -->
<header class="sheet-header flexrow"> <header class="flexrow">
<img src="{{icon}}" height="64" width="64" title="{{name}} Effect" alt=" " /> <img src="{{icon}}" height="64" width="64" class="flex0" title="{{name}} Effect" alt=" " />
<section class="flexcol"> <section class="flexcol">
<h2>{{name}} Effect</h2> <h2>{{name}} Effect</h2>
<p>Apply the affects of {{name}}.</p> <p>Apply the affects of {{name}}.</p>
</section> </section>
</header> </header>
{{#if extraDescription }} {{#if extraDescription }}
<div> <div>
{{{extraDescription}}} {{{extraDescription}}}
</div> </div>
{{/if}} {{/if}}
{{#if basePowerPoints}} {{#if basePowerPoints}}
<p><strong>Base Power Points</strong>: {{basePowerPoints}} <p><strong>Base Power Points</strong>: {{basePowerPoints}}
{{/if}} {{/if}}
{{#if targets.length}} {{#if targets.length}}
<p> <p>
<strong>Targets</strong>: <strong>Targets</strong>:
{{#each targets}}{{#if @index}}, {{/if}}{{{this}}}{{/each}} {{#each targets}}{{#if @index}}, {{/if}}{{{this}}}{{/each}}
{{#if recipients.cost}} {{#if recipients.cost}}
<br>({{#if recipients.epic}}⭐ {{/if}}{{recipients.text}} <br>({{#if recipients.epic}}⭐ {{/if}}{{recipients.text}}
{{recipients.cost}}pp each × {{recipients.count}} = {{recipients.total}}) {{recipients.cost}}pp each × {{recipients.count}} = {{recipients.total}})
{{/if}} {{/if}}
</p> </p>
{{/if}} {{/if}}
{{#each modifiers}} {{#each modifiers}}
<div class="form-group"> <div class="form-group">
{{#if isCheckbox}} {{#if isCheckbox}}
<label class="checkbox"> <label class="checkbox">
<input type="checkbox" name="{{id}}" {{checked default}} /> <input type="checkbox" name="{{id}}" {{checked default}} />
{{#if epic}}⭐ {{/if}}{{name}} {{#if epic}}⭐ {{/if}}{{name}}
{{#if value}}({{numberFormat value decimals=0 sign=true}}){{/if}} {{#if value}}({{numberFormat value decimals=0 sign=true}}){{/if}}
</label> </label>
{{/if}} {{/if}}
{{#if isText}} {{#if isText}}
<label for="{{id}}">{{#if epic}}⭐ {{/if}}{{name}}:</label> <label for="{{id}}">{{#if epic}}⭐ {{/if}}{{name}}:</label>
<input name="{{id}}" type="text" value="{{default}}"> <input name="{{id}}" type="text" value="{{default}}">
{{/if}} {{/if}}
{{#if isNumber}} {{#if isNumber}}
<label for="{{id}}">{{#if epic}}⭐ {{/if}}{{name}}:</label> <label for="{{id}}">{{#if epic}}⭐ {{/if}}{{name}}:</label>
<input name="{{id}}" <input name="{{id}}" type="number" value="{{default}}" {{#if step}}step="{{step}}" {{/if}} {{#if min}}min="{{min}}"
type="number" {{/if}} {{#if max}}max="{{max}}" {{/if}}>
value="{{default}}" {{/if}}
{{#if step}}step="{{step}}"{{/if}} {{#if isSelect}}
{{#if min}}min="{{min}}"{{/if}} <label for="{{id}}">{{#if epic}}⭐ {{/if}}{{name}}:</label>
{{#if max}}max="{{max}}"{{/if}} <select name="{{id}}">{{selectOptions choices selected=default}}</select>
> {{/if}}
{{/if}} {{#if isRadio}}
{{#if isSelect}} {{#if epic}}⭐ {{/if}}{{name}}:</label> {{radioBoxes id choices checked=default}}
<label>{{#if epic}}⭐ {{/if}}{{name}}:</label> {{/if}}
<select name="{{id}}">{{selectOptions choices selected=default}}</select> </div>
{{/if}}
{{#if isRadio}}
{{#if epic}}⭐ {{/if}}{{name}}:</label> {{radioBoxes id choices checked=default}}
{{/if}}
</div>
{{/each}} {{/each}}
<footer class="sheet-footer flexrow"> </div>
{{#each buttons}}
<button type="submit" name="submit" value="{{value}}">{{label}}</button>
{{/each}}
</footer>
</form>