add load/save
This commit is contained in:
parent
b194eef0c5
commit
c440214466
@ -27,6 +27,9 @@
|
|||||||
<button type="submit" name="submit">Add</button>
|
<button type="submit" name="submit">Add</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<h2>Save / Load</h2>
|
||||||
|
<button onclick="saveMappings()" id="save-button">Save mappings to file</button>
|
||||||
|
<button onclick="loadMappings()" id="load-button">Load mappings from file</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="second-box" style="max-height: 100%">
|
<div class="second-box" style="max-height: 100%">
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* Handle mappings
|
* Handle mappings
|
||||||
* Mappings are stored in local storage as a Map (key: directory)
|
* Mappings are stored in local storage as a Map (key: directory)
|
||||||
*/
|
*/
|
||||||
|
const invalidFileNameCharsRe =/[^\\\|:\*\?"<>]/; // dont allow \/|:*?<>
|
||||||
|
const invalidFileNameChars = "\\|:*?<>";
|
||||||
|
|
||||||
let statusLine = document.getElementById('status');
|
let statusLine = document.getElementById('status');
|
||||||
|
|
||||||
@ -63,6 +65,56 @@ function addMapping(key, directory) {
|
|||||||
renderMappings();
|
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
|
// event listener for add mapping form
|
||||||
document.getElementById('addMappingForm').addEventListener('submit', function(event) {
|
document.getElementById('addMappingForm').addEventListener('submit', function(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
Loading…
Reference in New Issue
Block a user