Skip to content

Commit

Permalink
feat: added better error handling and notification for invalid templates
Browse files Browse the repository at this point in the history
  • Loading branch information
EddieDover committed Mar 25, 2024
1 parent b7cad74 commit 9b82c8f
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 32 deletions.
1 change: 1 addition & 0 deletions src/lang/en.json
Expand Up @@ -5,6 +5,7 @@
"race": "Race",
"senses": "Senses",
"classes": "Classes",
"invalid-template": "The template you are using is invalid. <br/> Please check the template and try again.",
"no-players": "No players are currently logged in.",
"no-systems": "You do not have any json files for this system in your data/partysheets folder. Please add some to enable this feature.",
"bugreport": "File a Bug Report",
Expand Down
1 change: 1 addition & 0 deletions src/lang/es.json
Expand Up @@ -5,6 +5,7 @@
"race": "Raza",
"senses": "Sentidos",
"classes": "Clases",
"invalid-template": "La plantilla que está usando no es válida. <BR/> Por favor revise la plantilla y vuelva a intentarlo.",
"no-players": "Ningún jugador ha iniciado sesión actualmente.",
"no-systems": "La carpeta data/partysheets no contiene archivos JSON para este sistema. Necesitas agregar algunos para activar esta funcionalidad.",
"bugreport": "Dar retroalimentación",
Expand Down
93 changes: 63 additions & 30 deletions src/module/app/party-sheet.js
Expand Up @@ -5,6 +5,7 @@ import {
getSelectedSystem,
parseExtras,
parsePluses,
TemplateProcessError,
trimIfString,
updateSelectedSystem,
} from "../utils.js";
Expand Down Expand Up @@ -170,7 +171,14 @@ export class PartySheetForm extends FormApplication {
}
return { name: data.name, author: data.author, players: finalActorList, rowcount: data.rows.length };
} catch (ex) {
console.log(ex);
// Detect if this is a TemplateProcessError or not
if (ex instanceof TemplateProcessError) {
ex.data.name = data.name;
ex.data.author = data.author;
throw ex;
} else {
console.log(ex);
}
}
return { name: "", author: "", players: [], rowcount: 0 };
}
Expand Down Expand Up @@ -564,32 +572,36 @@ export class PartySheetForm extends FormApplication {
* @memberof PartySheetForm
*/
getCustomData(character, type, value) {
switch (type) {
case "direct":
return this.processDirect(character, type, value);
case "direct-complex":
return this.processDirectComplex(character, type, value);
case "charactersheet":
// @ts-ignore
return new Handlebars.SafeString(
`<input type="image" name="fvtt-party-sheet-actorimage" data-actorid="${
character.uuid
}" class="token-image" src="${character.prototypeToken.texture.src}" title="${
character.prototypeToken.name
}" width="36" height="36" style="transform: rotate(${character.prototypeToken.rotation ?? 0}deg);"/>`,
);
case "array-string-builder":
return this.processArrayStringBuilder(character, type, value);
case "string":
return value;
case "object-loop":
return this.processObjectLoop(character, type, value);
case "largest-from-array":
return this.processLargestFromArray(character, type, value);
case "smallest-from-array":
return this.processSmallestFromArray(character, type, value);
default:
return "";
try {
switch (type) {
case "direct":
return this.processDirect(character, type, value);
case "direct-complex":
return this.processDirectComplex(character, type, value);
case "charactersheet":
// @ts-ignore
return new Handlebars.SafeString(
`<input type="image" name="fvtt-party-sheet-actorimage" data-actorid="${
character.uuid
}" class="token-image" src="${character.prototypeToken.texture.src}" title="${
character.prototypeToken.name
}" width="36" height="36" style="transform: rotate(${character.prototypeToken.rotation ?? 0}deg);"/>`,
);
case "array-string-builder":
return this.processArrayStringBuilder(character, type, value);
case "string":
return value;
case "object-loop":
return this.processObjectLoop(character, type, value);
case "largest-from-array":
return this.processLargestFromArray(character, type, value);
case "smallest-from-array":
return this.processSmallestFromArray(character, type, value);
default:
return "";
}
} catch (ex) {
throw new TemplateProcessError(ex);
}
}

Expand All @@ -616,7 +628,27 @@ export class PartySheetForm extends FormApplication {

updateSelectedSystem(applicableSystems[selectedIdx]);
const selectedSystem = getSelectedSystem();
let { name: sysName, author: sysAuthor, players, rowcount } = this.getCustomPlayerData(selectedSystem);
let selectedName, selectedAuthor, players, rowcount;
let invalidTemplateError = false;
try {
let result = this.getCustomPlayerData(selectedSystem);
selectedName = result.name;
selectedAuthor = result.author;
players = result.players;
rowcount = result.rowcount;
} catch (ex) {
if (ex instanceof TemplateProcessError) {
// @ts-ignore
ui.notifications.error(
`There was an error processing the template for ${selectedSystem.name} by ${selectedSystem.author}.`,
);
selectedName = ex.data.name;
selectedAuthor = ex.data.author;
invalidTemplateError = true;
}
console.log(ex);
}

// @ts-ignore
return mergeObject(super.getData(options), {
minimalView,
Expand All @@ -625,8 +657,9 @@ export class PartySheetForm extends FormApplication {
rowcount,
players,
applicableSystems,
selectedName: sysName,
selectedAuthor: sysAuthor,
selectedName,
selectedAuthor,
invalidTemplateError,
// @ts-ignore
overrides: this.overrides,
});
Expand Down
11 changes: 11 additions & 0 deletions src/module/utils.js
Expand Up @@ -4,6 +4,17 @@ var customSystems = [DND5E];
export var selectedSystem = null;
const NEWLINE_ELEMENTS = ["{newline}", "{nl}"];

export class TemplateProcessError extends Error {
constructor(message) {
super(message);
this.name = "TemplateProcessError";
this.data = {
name: "",
author: "",
};
}
}

/**
* Converts a string to proper case.
* @param {string} inputString - The input string to convert.
Expand Down
7 changes: 5 additions & 2 deletions src/templates/party-sheet.hbs
Expand Up @@ -65,9 +65,12 @@
</tbody>
</table>
{{else}}
<div class="fvtt-party-sheet-ps-no-players">{{ localize "fvtt-party-sheet.party-sheet.no-players" }}</div>
{{#if invalidTemplateError}}
<div class="fvtt-party-sheet-ps-no-players">{{{ localize "fvtt-party-sheet.party-sheet.invalid-template" }}}</div>
{{else}}
<div class="fvtt-party-sheet-ps-no-players">{{ localize "fvtt-party-sheet.party-sheet.no-players" }}</div>
{{/if}}
{{/if}}

{{else}}
<div class="fvtt-party-sheet-ps-no-systems">{{ localize "fvtt-party-sheet.party-sheet.no-systems" }}</div>
{{/if}}
Expand Down

0 comments on commit 9b82c8f

Please sign in to comment.