commit f21c5a70b023aedaa7d86ad6d1298a1c3f7ecef3
parent 8e9ee44862a3f7cefc6bc055788997176e3b8af1
Author: Hunter
Date:   Sun, 25 Aug 2024 23:33:38 -0400

implement saving to/loading from .txt files

Diffstat:
Mindex.html | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+), 0 deletions(-)

diff --git a/index.html b/index.html @@ -210,6 +210,63 @@ let isF2Pressed = false; let themes = []; + function handleSave(e) { + if ((e.metaKey || e.ctrlKey) && e.key === 's') { + e.preventDefault(); + saveTaskTreeToFile(); + } + } + + function saveTaskTreeToFile() { + const serializedTasks = serializeTaskTree(taskPath[0]); + const rootTaskName = taskPath[0].text || 'Untitled'; + const date = new Date(); + const fileName = `${rootTaskName} - ${date.toLocaleString('default', { month: 'short' }).toLowerCase()} ${date.getDate()}, '${date.getFullYear().toString().slice(-2)}.txt`; + + const blob = new Blob([serializedTasks], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = fileName; + a.click(); + + URL.revokeObjectURL(url); + } + + function handleOpen(e) { + if ((e.metaKey || e.ctrlKey) && e.key === 'o') { + e.preventDefault(); + openTaskTreeFromFile(); + } + } + + function openTaskTreeFromFile() { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = '.txt'; + input.onchange = function(event) { + const file = event.target.files[0]; + const reader = new FileReader(); + reader.onload = function(e) { + try { + const newRootTask = deserializeTaskTree(e.target.result); + if (confirm('Are you sure you want to overwrite the existing task tree?')) { + rootTask = newRootTask; + currentTask = rootTask; + taskPath = [currentTask]; + renderCurrentView(); + saveTasksToLocalStorage(); + } + } catch (error) { + alert(`Error importing task tree: ${error.message}`); + } + }; + reader.readAsText(file); + }; + input.click(); + } + function scheduleSave() { if (saveTimer) { clearTimeout(saveTimer); @@ -938,6 +995,9 @@ } }); + document.addEventListener('keydown', handleSave); + document.addEventListener('keydown', handleOpen); + getThemesFromCSS(); setInitialTheme(); renderCurrentView();