implement saving to/loading from .txt files

Hunter
Sunday, August 25th, 2024 at 11:33 PM

index.html+60 

index.html
 210  			let isF2Pressed = false;
 211  			let themes = [];
 212  
 213 +			function handleSave(e) {
 214 +				if ((e.metaKey || e.ctrlKey) && e.key === 's') {
 215 +					e.preventDefault();
 216 +					saveTaskTreeToFile();
 217 +				}
 218 +			}
 219 +
 220 +			function saveTaskTreeToFile() {
 221 +				const serializedTasks = serializeTaskTree(taskPath[0]);
 222 +				const rootTaskName = taskPath[0].text || 'Untitled';
 223 +				const date = new Date();
 224 +				const fileName = `${rootTaskName} - ${date.toLocaleString('default', { month: 'short' }).toLowerCase()} ${date.getDate()}, '${date.getFullYear().toString().slice(-2)}.txt`;
 225 +				
 226 +				const blob = new Blob([serializedTasks], { type: 'text/plain' });
 227 +				const url = URL.createObjectURL(blob);
 228 +				
 229 +				const a = document.createElement('a');
 230 +				a.href = url;
 231 +				a.download = fileName;
 232 +				a.click();
 233 +				
 234 +				URL.revokeObjectURL(url);
 235 +			}
 236 +
 237 +			function handleOpen(e) {
 238 +				if ((e.metaKey || e.ctrlKey) && e.key === 'o') {
 239 +					e.preventDefault();
 240 +					openTaskTreeFromFile();
 241 +				}
 242 +			}
 243 +
 244 +			function openTaskTreeFromFile() {
 245 +				const input = document.createElement('input');
 246 +				input.type = 'file';
 247 +				input.accept = '.txt';
 248 +				input.onchange = function(event) {
 249 +					const file = event.target.files[0];
 250 +					const reader = new FileReader();
 251 +					reader.onload = function(e) {
 252 +						try {
 253 +							const newRootTask = deserializeTaskTree(e.target.result);
 254 +							if (confirm('Are you sure you want to overwrite the existing task tree?')) {
 255 +								rootTask = newRootTask;
 256 +								currentTask = rootTask;
 257 +								taskPath = [currentTask];
 258 +								renderCurrentView();
 259 +								saveTasksToLocalStorage();
 260 +							}
 261 +						} catch (error) {
 262 +							alert(`Error importing task tree: ${error.message}`);
 263 +						}
 264 +					};
 265 +					reader.readAsText(file);
 266 +				};
 267 +				input.click();
 268 +			}
 269 +
 270  			function scheduleSave() {
 271  				if (saveTimer) {
 272  					clearTimeout(saveTimer);

 995  				}
 996  			});
 997  
 998 +			document.addEventListener('keydown', handleSave);
 999 +            document.addEventListener('keydown', handleOpen);
1000 +
1001  			getThemesFromCSS();
1002  			setInitialTheme();
1003  			renderCurrentView();