diff --git a/src/config.html b/src/config.html
index 9ee97e5..4100c1d 100644
--- a/src/config.html
+++ b/src/config.html
@@ -27,6 +27,9 @@
+
Save / Load
+
+
diff --git a/src/config.js b/src/config.js
index 2afd963..ff16aea 100644
--- a/src/config.js
+++ b/src/config.js
@@ -2,6 +2,8 @@
* Handle mappings
* Mappings are stored in local storage as a Map (key: directory)
*/
+const invalidFileNameCharsRe =/[^\\\|:\*\?"<>]/; // dont allow \/|:*?<>
+const invalidFileNameChars = "\\|:*?<>";
let statusLine = document.getElementById('status');
@@ -63,6 +65,56 @@ function addMapping(key, directory) {
renderMappings();
}
+
+/*
+ * Save/Load from file
+ */
+function saveMappings() {
+ const mappings = new Map(JSON.parse(localStorage.getItem('mappings')) || []);
+ let dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(Array.from(mappings)));
+ let downloadElement = document.createElement('a');
+ downloadElement.style = "display: none;";
+ downloadElement.setAttribute("href", dataStr);
+ downloadElement.setAttribute("download", "mappings.json");
+ document.body.appendChild(downloadElement); // required for firefox
+ downloadElement.click();
+ downloadElement.remove();
+}
+
+
+function loadMappings() {
+ const input = document.createElement('input');
+ input.type = 'file';
+ input.accept = '.json';
+
+ input.onchange = async (event) => {
+ const file = event.target.files[0];
+ if (!file) {
+ statusLine.textContent = "No file selected";
+ return;
+ }
+ try {
+ const fileText = await file.text();
+ const jsonData = JSON.parse(fileText);
+
+ // check is valid
+ if (typeof jsonData !== 'object' || jsonData === null) {
+ statusLine.textContent = "Invalid JSON structure";
+ return;
+ }
+
+ // TODO possibly implement sanity checks
+ localStorage.setItem('mappings', JSON.stringify(jsonData));
+ renderMappings();
+ } catch (error) {
+ console.error(error);;
+ statusLine = "Error loading file";
+ }
+ };
+ input.click();
+}
+
+
// event listener for add mapping form
document.getElementById('addMappingForm').addEventListener('submit', function(event) {
event.preventDefault();