Merge branch 'feat/onevault'
This commit is contained in:
		
						commit
						c7910ff704
					
				|  | @ -22,13 +22,6 @@ | ||||||
| 			<div id="network"></div> | 			<div id="network"></div> | ||||||
| 		</div> | 		</div> | ||||||
| 
 | 
 | ||||||
| 		<div id="authentpage" hidden> |  | ||||||
| 			<div id="bigtitle">notes</div> |  | ||||||
| 			<div> |  | ||||||
| 				<input id="password" type="password" placeholder="pass phrase..." onkeydown="sendpassword()" onblur="sendpassword()" ></input> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 
 |  | ||||||
| 		<div id="searchdialog" oninput="applyfilter()" hidden> | 		<div id="searchdialog" oninput="applyfilter()" hidden> | ||||||
| 			<div> | 			<div> | ||||||
| 				<input id="filter" placeholder="search..." autocomplete="off"></input> | 				<input id="filter" placeholder="search..." autocomplete="off"></input> | ||||||
|  |  | ||||||
							
								
								
									
										133
									
								
								main.js
								
								
								
								
							
							
						
						
									
										133
									
								
								main.js
								
								
								
								
							|  | @ -15,7 +15,9 @@ var defaultsettings = | ||||||
| 	titlebydefault: false, | 	titlebydefault: false, | ||||||
| 	linksinnewtab: true, | 	linksinnewtab: true, | ||||||
| 	colors: true, | 	colors: true, | ||||||
| 	bulletrendering: "•" | 	bulletrendering: "•", | ||||||
|  | 	password: "", | ||||||
|  | 	sync: false | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| //builtin
 | //builtin
 | ||||||
|  | @ -33,7 +35,6 @@ var lastsaved = ""; | ||||||
| var pending = false; | var pending = false; | ||||||
| var settings = null; | var settings = null; | ||||||
| var tags = null; | var tags = null; | ||||||
| var currentvault = ""; |  | ||||||
| var currenttag = ""; | var currenttag = ""; | ||||||
| 
 | 
 | ||||||
| var stat = | var stat = | ||||||
|  | @ -128,10 +129,6 @@ var commands = [ | ||||||
| 	action: searchtags, | 	action: searchtags, | ||||||
| 	shortcut: "ctrl+shift+T" | 	shortcut: "ctrl+shift+T" | ||||||
| }, | }, | ||||||
| { |  | ||||||
| 	hint: "Log out", |  | ||||||
| 	action: logout, |  | ||||||
| }, |  | ||||||
| { | { | ||||||
| 	hint: "Toggle split view", | 	hint: "Toggle split view", | ||||||
| 	action: togglesplit | 	action: togglesplit | ||||||
|  | @ -174,11 +171,6 @@ var commands = [ | ||||||
| 	action: shownotelinks, | 	action: shownotelinks, | ||||||
| 	shortcut: "ctrl+l" | 	shortcut: "ctrl+l" | ||||||
| }, | }, | ||||||
| { |  | ||||||
| 	hint: "Switch local/remote vault", |  | ||||||
| 	action: switchvault, |  | ||||||
| 	shortcut: "ctrl+shift+V" |  | ||||||
| }, |  | ||||||
| { | { | ||||||
| 	hint: "Add tag filter", | 	hint: "Add tag filter", | ||||||
| 	action: addtagfilter, | 	action: addtagfilter, | ||||||
|  | @ -223,17 +215,18 @@ var commands = [ | ||||||
| 	action: downloadnotewithsubs | 	action: downloadnotewithsubs | ||||||
| }, | }, | ||||||
| { | { | ||||||
| 	hint: "Download all notes in a zip file", | 	hint: "Download all notes (zip file)", | ||||||
| 	action: downloadnotes, | 	action: downloadnotes, | ||||||
| 	shortcut: "ctrl+shift+S" | 	shortcut: "ctrl+shift+S" | ||||||
| }, | }, | ||||||
| { | { | ||||||
| 	hint: "Download current vault", | 	hint: "Download all notes (json file)", | ||||||
| 	action: downloadvault | 	action: downloadnotesjson | ||||||
| }, | }, | ||||||
| { | { | ||||||
| 	hint: "Download all vaults", | 	hint: "Download all notes (encrypted json file)", | ||||||
| 	action: downloadallvaults | 	action: downloadencrypted, | ||||||
|  | 	remoteonly: true | ||||||
| }, | }, | ||||||
| { | { | ||||||
| 	hint: "Insert text in todo", | 	hint: "Insert text in todo", | ||||||
|  | @ -275,11 +268,6 @@ var commands = [ | ||||||
| { | { | ||||||
| 	hint: "Sort todo.txt list", | 	hint: "Sort todo.txt list", | ||||||
| 	action: sorttodotxt | 	action: sorttodotxt | ||||||
| }, |  | ||||||
| { |  | ||||||
| 	hint: "Download encrypted data", |  | ||||||
| 	remoteonly: true, |  | ||||||
| 	action: downloadencrypted |  | ||||||
| }]; | }]; | ||||||
| 
 | 
 | ||||||
| var snippets = [ | var snippets = [ | ||||||
|  | @ -503,7 +491,7 @@ function showinfo() | ||||||
| 	var tags = gettags(currentnote); | 	var tags = gettags(currentnote); | ||||||
| 	showtemporaryinfo( | 	showtemporaryinfo( | ||||||
| 		[ | 		[ | ||||||
| 			"vault: " + currentvault, | 			"sync: " + (settings.sync ? "en" : "dis") + "abled", | ||||||
| 			"title: " + currentnote.title, | 			"title: " + currentnote.title, | ||||||
| 			"saved: " + saved + " (" + lastsaved + ")", | 			"saved: " + saved + " (" + lastsaved + ")", | ||||||
| 			"line count: " + md.value.split("\n").length, | 			"line count: " + md.value.split("\n").length, | ||||||
|  | @ -550,21 +538,6 @@ function addtagfilter() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function applyvault(vault) |  | ||||||
| { |  | ||||||
| 	window.localStorage.setItem("vault", vault); |  | ||||||
| 	init(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function switchvault() |  | ||||||
| { |  | ||||||
| 	var newvault = currentvault == "local" ? "remote" : "local"; |  | ||||||
| 	if (confirm("Switch to " + newvault + "?")) |  | ||||||
| 	{ |  | ||||||
| 		applyvault(newvault); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function descendants(note) | function descendants(note) | ||||||
| { | { | ||||||
| 	var list = [note]; | 	var list = [note]; | ||||||
|  | @ -957,7 +930,7 @@ function editpgpkeys() | ||||||
| 	bindfile( | 	bindfile( | ||||||
| 	{ | 	{ | ||||||
| 		title: "pgpkeys", | 		title: "pgpkeys", | ||||||
| 		content: localStorage.getItem("pgpkeys") | 		content: localStorage.getItem("pgpkeys") || "" | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -990,16 +963,7 @@ function togglesplit() | ||||||
| 
 | 
 | ||||||
| function isremote() | function isremote() | ||||||
| { | { | ||||||
| 	return currentvault == "remote"; | 	return settings.sync; | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function logout() |  | ||||||
| { |  | ||||||
| 	if (isremote()) |  | ||||||
| 	{ |  | ||||||
| 		window.localStorage.removeItem("password"); |  | ||||||
| 		togglepassword(); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function tagslist() | function tagslist() | ||||||
|  | @ -1095,7 +1059,7 @@ function downloadnotes() | ||||||
| 	zip.generateAsync({type:"blob"}) | 	zip.generateAsync({type:"blob"}) | ||||||
| 	.then(function(content) | 	.then(function(content) | ||||||
| 	{ | 	{ | ||||||
| 		saveAs(content, "notes " + timestamp() + " " + currentvault + ".zip"); | 		saveAs(content, "notes-" + timestamp() + ".zip"); | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1135,29 +1099,17 @@ function inserttodo() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function downloadallvaults() | function downloadnotesjson() | ||||||
| { | { | ||||||
| 	var data = | 	download("notes-" + timestamp() + ".json", window.localStorage.getItem("data")); | ||||||
| 	{ |  | ||||||
| 		local: JSON.parse(window.localStorage.getItem("local")), |  | ||||||
| 		remote: JSON.parse(window.localStorage.getItem("remote")), |  | ||||||
| 		trash: JSON.parse(window.localStorage.getItem("trash")), |  | ||||||
| 	}; |  | ||||||
| 	download("notes " + timestamp() + ".json", JSON.stringify(data)); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function downloadvault() |  | ||||||
| { |  | ||||||
| 	download("notes " + timestamp() + " " + currentvault + ".json", window.localStorage.getItem(currentvault)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function downloadencrypted() | function downloadencrypted() | ||||||
| { | { | ||||||
| 	encryptstring(JSON.stringify(localdata)) | 	encryptstring(JSON.stringify(localdata)) | ||||||
| 	.then(encrypted => | 	.then(encrypted => | ||||||
| 	{ | 	{ | ||||||
| 		download("encrypted notes " + timestamp() + " " + currentvault + ".acs", encrypted); | 		download("notes-encrypted-" + timestamp() + ".acs", encrypted); | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1205,7 +1157,7 @@ function gotoline(line) | ||||||
| 
 | 
 | ||||||
| function loadstorage() | function loadstorage() | ||||||
| { | { | ||||||
| 	var item = window.localStorage.getItem(currentvault); | 	var item = window.localStorage.getItem("data"); | ||||||
| 	localdata = item ? JSON.parse(item) : []; | 	localdata = item ? JSON.parse(item) : []; | ||||||
| 
 | 
 | ||||||
| 	var params = new URLSearchParams(window.location.search); | 	var params = new URLSearchParams(window.location.search); | ||||||
|  | @ -1313,15 +1265,9 @@ function initsnippets() | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function initvault() |  | ||||||
| { |  | ||||||
| 	currentvault = window.localStorage.getItem("vault") || "local"; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function init() | function init() | ||||||
| { | { | ||||||
| 	loadsettings(); | 	loadsettings(); | ||||||
| 	initvault(); |  | ||||||
| 
 | 
 | ||||||
| 	window.onbeforeunload = checksaved; | 	window.onbeforeunload = checksaved; | ||||||
| 	window.onclick = focuseditor; | 	window.onclick = focuseditor; | ||||||
|  | @ -1337,16 +1283,24 @@ function init() | ||||||
| 			queryremote({action: "fetch"}) | 			queryremote({action: "fetch"}) | ||||||
| 			.then(data => | 			.then(data => | ||||||
| 			{ | 			{ | ||||||
| 				window.localStorage.setItem("remote", JSON.stringify(data)); | 				if (data.length) | ||||||
| 				loadstorage(); | 				{ | ||||||
|  | 					window.localStorage.setItem("data", JSON.stringify(data)); | ||||||
|  | 					loadstorage(); | ||||||
|  | 				} | ||||||
| 			}) | 			}) | ||||||
| 			.catch(remotecallfailed); | 			.catch(err => | ||||||
|  | 				{ | ||||||
|  | 					settings.password = prompt("Password: ", settings.password); | ||||||
|  | 					savesettings(); | ||||||
|  | 					init(); | ||||||
|  | 				}); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			showtemporaryinfo("Pgp key empty or invalid. Switching to local."); |  | ||||||
| 			currentvault = "local"; |  | ||||||
| 			loadstorage(); | 			loadstorage(); | ||||||
|  | 			editpgpkeys(); | ||||||
|  | 			showtemporaryinfo("Pgp key empty or invalid. Enter PGP keys and refresh."); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
|  | @ -1367,15 +1321,6 @@ function init() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function togglepassword() |  | ||||||
| { |  | ||||||
| 	password.value = ""; |  | ||||||
| 	authentpage.hidden = false; |  | ||||||
| 	notepage.style.display = "none"; |  | ||||||
| 	document.title = "notes"; |  | ||||||
| 	password.focus(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function cvdt(text) | function cvdt(text) | ||||||
| { | { | ||||||
| 	var day = text.substr(0,8); | 	var day = text.substr(0,8); | ||||||
|  | @ -1445,7 +1390,7 @@ function queryremote(params) | ||||||
| 		stat.cur.q++; | 		stat.cur.q++; | ||||||
| 		stat.ses.q++; | 		stat.ses.q++; | ||||||
| 
 | 
 | ||||||
| 		params.password = window.localStorage.getItem("password"); | 		params.password = settings.password; | ||||||
| 
 | 
 | ||||||
| 		var paramlist = []; | 		var paramlist = []; | ||||||
| 		for (var i in params) | 		for (var i in params) | ||||||
|  | @ -1484,8 +1429,7 @@ function queryremote(params) | ||||||
| 					{ | 					{ | ||||||
| 						if (data.error == "authent") | 						if (data.error == "authent") | ||||||
| 						{ | 						{ | ||||||
| 							failed(); | 							failed("Authent failed"); | ||||||
| 							togglepassword(); |  | ||||||
| 						} | 						} | ||||||
| 						else | 						else | ||||||
| 						{ | 						{ | ||||||
|  | @ -1498,7 +1442,6 @@ function queryremote(params) | ||||||
| 					} | 					} | ||||||
| 					else | 					else | ||||||
| 					{ | 					{ | ||||||
| 						authentpage.hidden = true; |  | ||||||
| 						notepage.style.display = "table"; | 						notepage.style.display = "table"; | ||||||
| 						apply(data); | 						apply(data); | ||||||
| 					} | 					} | ||||||
|  | @ -1896,7 +1839,7 @@ function save() | ||||||
| 	currentnote.content = content; | 	currentnote.content = content; | ||||||
| 	putontop(); | 	putontop(); | ||||||
| 
 | 
 | ||||||
| 	window.localStorage.setItem(currentvault, JSON.stringify(localdata)); | 	window.localStorage.setItem("data", JSON.stringify(localdata)); | ||||||
| 	console.log("data serialized in local storage") | 	console.log("data serialized in local storage") | ||||||
| 
 | 
 | ||||||
| 	if (isremote()) | 	if (isremote()) | ||||||
|  | @ -2846,16 +2789,6 @@ function loadnote(name) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function sendpassword() |  | ||||||
| { |  | ||||||
| 	if (!authentpage.hidden && (event.type == "blur" || event.key == "Enter")) |  | ||||||
| 	{ |  | ||||||
| 		event.preventDefault(); |  | ||||||
| 		window.localStorage.setItem("password", password.value); |  | ||||||
| 		init(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function focuseditor() | function focuseditor() | ||||||
| { | { | ||||||
| 	if (document.documentElement == event.srcElement) | 	if (document.documentElement == event.srcElement) | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								readme.md
								
								
								
								
							
							
						
						
									
										12
									
								
								readme.md
								
								
								
								
							|  | @ -11,18 +11,18 @@ Your notes are stored in your browser local storage. | ||||||
| * command palette: ctrl+shift+p | * command palette: ctrl+shift+p | ||||||
| * notes list: ctrl+p | * notes list: ctrl+p | ||||||
| 
 | 
 | ||||||
| ## Remote mode | ## Sync feature | ||||||
| 
 | 
 | ||||||
| You can use remote mode with your own php server to access your notes from the cloud: | To sync your notes in the cloud: | ||||||
| 
 | 
 | ||||||
| * put the source files on your php server | * put the source files on your php server | ||||||
| * browse index.html | * browse index.html | ||||||
| * launch command "edit pgp keys" and paste your public and private keys as a single file (passphrase is not supported) | * paste your public and private PGP keys as a single file (passphrase is not supported) | ||||||
| * switch to remote mode: ctrl+shift+V | * refresh the page | ||||||
| 
 | 
 | ||||||
| Your data file will always be encrypted before reaching the server. | Your data is always encrypted before reaching the server. | ||||||
| 
 | 
 | ||||||
| To protect your data file access by a password, edit settings.php and change `$password` variable. Your password will be sent from browser to server through a post http query, encrypted with ssl if enabled. It is stored unencrypted in your browser local storage and in the settings.php file on server side. | To protect your data file access by a password, edit settings.php and change `$password` variable. The password is sent from browser to server through a post http query, encrypted with ssl if enabled. It is stored unencrypted in your browser local storage and in the settings.php file on server side. | ||||||
| 
 | 
 | ||||||
| ## Cli tool | ## Cli tool | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 quenousimporte
						quenousimporte