diff --git a/app/client/views/characterList/characterList.html b/app/client/views/characterList/characterList.html index 94962a5b..c6bc6c97 100644 --- a/app/client/views/characterList/characterList.html +++ b/app/client/views/characterList/characterList.html @@ -58,6 +58,13 @@ {{#simpleTooltip class="always"}} New Character {{/simpleTooltip}} +
+ + + {{#simpleTooltip class="always"}} Restore from backup {{/simpleTooltip}} +
{{/fabMenu}} diff --git a/app/client/views/characterList/characterList.js b/app/client/views/characterList/characterList.js index 5bdee54b..47ba3abe 100644 --- a/app/client/views/characterList/characterList.js +++ b/app/client/views/characterList/characterList.js @@ -81,4 +81,20 @@ Template.characterList.events({ returnElement: instance.find(`.party[data-id='${partyId}']`), }); }, + "click .restoreCharacter": function(event, instance) { + pushDialogStack({ + template: "characterRestoreDialog", + element: event.currentTarget, + callback(dump){ + if (!dump) return; + dump.character.name += " - Restored" + giveCharacterDumpNewIds(dump); + restoreCharacter(dump); + Router.go("characterSheet", { + _id: dump.character._id, + urlName: dump.character.urlName || '-', + }); + }, + }) + }, }); diff --git a/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html new file mode 100644 index 00000000..d37292cb --- /dev/null +++ b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html @@ -0,0 +1,31 @@ + diff --git a/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js new file mode 100644 index 00000000..560a2429 --- /dev/null +++ b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js @@ -0,0 +1,49 @@ +Template.characterRestoreDialog.onCreated(function(){ + this.dump = {}; + this.valid = new ReactiveVar(false); + this.error = new ReactiveVar(null); +}); + +Template.characterRestoreDialog.helpers({ + invalid(){ + return !Template.instance().valid.get(); + }, + error(){ + return Template.instance().error.get(); + }, +}); + +const fail = function(instance){ + instance.valid.set(false); + instance.error.set("Failed to convert file into a valid character"); + instance.dump = undefined; +}; + +Template.characterRestoreDialog.events({ + "input .fileInput": function(event, instance){ + let input = event.currentTarget.$.input; + let reader = new FileReader(); + reader.onload = function(){ + let dumpString = reader.result; + try { + let dump = JSON.parse(dumpString); + if (dump && dump.character && dump.collections){ + instance.valid.set(true); + instance.error.set(null); + instance.dump = dump; + } else { + fail(instance); + } + } catch (e) { + fail(instance); + } + }; + reader.readAsText(input.files[0]); + }, + "click .cancelButton": function(event, instance){ + popDialogStack(); + }, + "click .addButton": function(event, instance){ + popDialogStack(instance.dump); + }, +});