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 @@
+
+
+
+
+
+ Restore Character
+
+
+
+
+
+
+
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);
+ },
+});