You've already forked joplin
							
							
				mirror of
				https://github.com/laurent22/joplin.git
				synced 2025-10-31 00:07:48 +02:00 
			
		
		
		
	Various changes
This commit is contained in:
		| @@ -208,7 +208,7 @@ class Application { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	loadCommands_() { | ||||
| 		this.onLocaleChanged(); // Ensures that help and exit commands are translated | ||||
|  | ||||
| @@ -260,6 +260,41 @@ class Application { | ||||
|  | ||||
| 			if (cmd.hidden()) vorpalCmd.hidden(); | ||||
| 		}); | ||||
|  | ||||
| 		this.vorpal().catch('[args...]', 'Catches undefined commands').action(function(args, end) { | ||||
| 			args = args.args; | ||||
|  | ||||
| 			function delayExec(command) { | ||||
| 				setTimeout(() => { | ||||
| 					app().vorpal().exec(command); | ||||
| 				}, 100); | ||||
| 			} | ||||
|  | ||||
| 			if (!args.length) { | ||||
| 				end(); | ||||
| 				delayExec('help'); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			let commandName = args.splice(0, 1); | ||||
|  | ||||
| 			let aliases = Setting.value('aliases').trim(); | ||||
| 			aliases = aliases.length ? JSON.parse(aliases) : []; | ||||
|  | ||||
| 			for (let i = 0; i < aliases.length; i++) { | ||||
| 				const alias = aliases[i]; | ||||
| 				if (alias.name == commandName) { | ||||
| 					let command = alias.command + ' ' + app().shellArgsToString(args); | ||||
| 					end(); | ||||
| 					delayExec(command); | ||||
| 					return; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			this.log(_("Invalid command. Showing help:")); | ||||
| 			end();			 | ||||
| 			delayExec('help'); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	async synchronizer(syncTarget) { | ||||
|   | ||||
							
								
								
									
										28
									
								
								CliClient/app/command-alias.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								CliClient/app/command-alias.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| import { BaseCommand } from './base-command.js'; | ||||
| import { app } from './app.js'; | ||||
| import { _ } from 'lib/locale.js'; | ||||
| import { Setting } from 'lib/models/setting.js'; | ||||
|  | ||||
| class Command extends BaseCommand { | ||||
|  | ||||
| 	usage() { | ||||
| 		return 'alias <name> <command>'; | ||||
| 	} | ||||
|  | ||||
| 	description() { | ||||
| 		return _('Creates a new command alias which can then be used as a regular command (eg. `alias ll "ls -l"`).'); | ||||
| 	} | ||||
|  | ||||
| 	async action(args) { | ||||
| 		let aliases = Setting.value('aliases').trim(); | ||||
| 		aliases = aliases.length ? JSON.parse(aliases) : []; | ||||
| 		aliases.push({ | ||||
| 			name: args.name, | ||||
| 			command: args.command, | ||||
| 		}); | ||||
| 		Setting.setValue('aliases', JSON.stringify(aliases)); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| module.exports = Command; | ||||
							
								
								
									
										34
									
								
								CliClient/app/command-geoloc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								CliClient/app/command-geoloc.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| import { BaseCommand } from './base-command.js'; | ||||
| import { app } from './app.js'; | ||||
| import { _ } from 'lib/locale.js'; | ||||
| import { BaseModel } from 'lib/base-model.js'; | ||||
| import { Folder } from 'lib/models/folder.js'; | ||||
| import { Note } from 'lib/models/note.js'; | ||||
| import { autocompleteItems } from './autocomplete.js'; | ||||
|  | ||||
| class Command extends BaseCommand { | ||||
|  | ||||
| 	usage() { | ||||
| 		return 'geoloc <title>'; | ||||
| 	} | ||||
|  | ||||
| 	description() { | ||||
| 		return _('Displays a geolocation URL for the note.'); | ||||
| 	} | ||||
|  | ||||
| 	autocomplete() { | ||||
| 		return { data: autocompleteItems }; | ||||
| 	} | ||||
|  | ||||
| 	async action(args) { | ||||
| 		let title = args['title']; | ||||
|  | ||||
| 		let item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() }); | ||||
| 		if (!item) throw new Error(_('Cannot find "%s".', title)); | ||||
| 		const url = Note.geolocationUrl(item); | ||||
| 		this.log(url); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| module.exports = Command; | ||||
| @@ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: Joplin-CLI 1.0.0\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2017-07-18 13:36+0100\n" | ||||
| "POT-Creation-Date: 2017-07-18 16:33+0100\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -58,14 +58,24 @@ msgid "Exits the application." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:294 | ||||
| msgid "Invalid command. Showing help:" | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:329 | ||||
| #, javascript-format | ||||
| msgid "Synchronizing with directory \"%s\"" | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:373 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:408 | ||||
| msgid "No notebook is defined. Create one with `mkbook <notebook>`." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-alias.js:13 | ||||
| msgid "" | ||||
| "Creates a new command alias which can then be used as a regular command (eg. " | ||||
| "`alias ll \"ls -l\"`)." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cat.js:16 | ||||
| msgid "Displays the given note." | ||||
| msgstr "" | ||||
| @@ -77,6 +87,7 @@ msgstr "" | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cat.js:33 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cp.js:31 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cp.js:34 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-geoloc.js:27 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:29 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:36 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:39 | ||||
| @@ -127,6 +138,10 @@ msgstr "" | ||||
| msgid "Starting to edit note. Close the editor to get back to the prompt." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-geoloc.js:16 | ||||
| msgid "Displays a geolocation URL for the note." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-import-enex.js:16 | ||||
| msgid "Imports an Evernote notebook file (.enex file)." | ||||
| msgstr "" | ||||
| @@ -418,12 +433,16 @@ msgstr "" | ||||
| msgid "Notebooks cannot be named \"%s\", which is a reserved title." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:194 | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:46 | ||||
| msgid "This note does not have geolocation information." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:201 | ||||
| #, javascript-format | ||||
| msgid "Cannot copy note to \"%s\" notebook" | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:205 | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:212 | ||||
| #, javascript-format | ||||
| msgid "Cannot move note to \"%s\" notebook" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -7,7 +7,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: Joplin-CLI 1.0.0\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2017-07-18 13:36+0100\n" | ||||
| "POT-Creation-Date: 2017-07-18 16:32+0100\n" | ||||
| "PO-Revision-Date: 2017-07-18 13:27+0100\n" | ||||
| "Last-Translator: \n" | ||||
| "Language-Team: \n" | ||||
| @@ -60,14 +60,25 @@ msgid "Exits the application." | ||||
| msgstr "Quitter le logiciel." | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:294 | ||||
| #, fuzzy | ||||
| msgid "Invalid command. Showing help:" | ||||
| msgstr "Commande invalie : \"%s\"" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:329 | ||||
| #, javascript-format | ||||
| msgid "Synchronizing with directory \"%s\"" | ||||
| msgstr "Synchronisation avec dossier \"%s\"" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:373 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:408 | ||||
| msgid "No notebook is defined. Create one with `mkbook <notebook>`." | ||||
| msgstr "Aucun carnet n'est défini. Créez-en un avec `mkbook <carnet>`." | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-alias.js:13 | ||||
| msgid "" | ||||
| "Creates a new command alias which can then be used as a regular command (eg. " | ||||
| "`alias ll \"ls -l\"`)." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cat.js:16 | ||||
| msgid "Displays the given note." | ||||
| msgstr "Affiche la note." | ||||
| @@ -79,6 +90,7 @@ msgstr "Affiche tous les détails de la note." | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cat.js:33 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cp.js:31 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cp.js:34 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-geoloc.js:27 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:29 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:36 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:39 | ||||
| @@ -138,6 +150,11 @@ msgstr "" | ||||
| "Edition de la note en cours. Fermez l'éditeur de texte pour retourner à " | ||||
| "l'invite de commande." | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-geoloc.js:16 | ||||
| #, fuzzy | ||||
| msgid "Displays a geolocation URL for the note." | ||||
| msgstr "Affiche tous les détails de la note." | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-import-enex.js:16 | ||||
| msgid "Imports an Evernote notebook file (.enex file)." | ||||
| msgstr "Importer un carnet Evernote (fichier .enex)." | ||||
| @@ -451,12 +468,16 @@ msgstr "Un carnet avec ce titre existe déjà : \"%s\"" | ||||
| msgid "Notebooks cannot be named \"%s\", which is a reserved title." | ||||
| msgstr "Les carnets ne peuvent être nommés \"%s\" car c'est un nom réservé." | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:194 | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:46 | ||||
| msgid "This note does not have geolocation information." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:201 | ||||
| #, javascript-format | ||||
| msgid "Cannot copy note to \"%s\" notebook" | ||||
| msgstr "Impossible de copier la note dans le carnet \"%s\"" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:205 | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:212 | ||||
| #, javascript-format | ||||
| msgid "Cannot move note to \"%s\" notebook" | ||||
| msgstr "Impossible de déplacer la note vers le carnet \"%s\"" | ||||
|   | ||||
| @@ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: Joplin-CLI 1.0.0\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2017-07-18 13:36+0100\n" | ||||
| "POT-Creation-Date: 2017-07-18 16:33+0100\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -58,14 +58,24 @@ msgid "Exits the application." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:294 | ||||
| msgid "Invalid command. Showing help:" | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:329 | ||||
| #, javascript-format | ||||
| msgid "Synchronizing with directory \"%s\"" | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:373 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/app.js:408 | ||||
| msgid "No notebook is defined. Create one with `mkbook <notebook>`." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-alias.js:13 | ||||
| msgid "" | ||||
| "Creates a new command alias which can then be used as a regular command (eg. " | ||||
| "`alias ll \"ls -l\"`)." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cat.js:16 | ||||
| msgid "Displays the given note." | ||||
| msgstr "" | ||||
| @@ -77,6 +87,7 @@ msgstr "" | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cat.js:33 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cp.js:31 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-cp.js:34 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-geoloc.js:27 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:29 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:36 | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-mv.js:39 | ||||
| @@ -127,6 +138,10 @@ msgstr "" | ||||
| msgid "Starting to edit note. Close the editor to get back to the prompt." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-geoloc.js:16 | ||||
| msgid "Displays a geolocation URL for the note." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/CliClient/app/command-import-enex.js:16 | ||||
| msgid "Imports an Evernote notebook file (.enex file)." | ||||
| msgstr "" | ||||
| @@ -418,12 +433,16 @@ msgstr "" | ||||
| msgid "Notebooks cannot be named \"%s\", which is a reserved title." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:194 | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:46 | ||||
| msgid "This note does not have geolocation information." | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:201 | ||||
| #, javascript-format | ||||
| msgid "Cannot copy note to \"%s\" notebook" | ||||
| msgstr "" | ||||
|  | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:205 | ||||
| #: /media/veracrypt22/src/notes/ReactNativeClient/lib/models/note.js:212 | ||||
| #, javascript-format | ||||
| msgid "Cannot move note to \"%s\" notebook" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -562,5 +562,22 @@ describe('Synchronizer', function() { | ||||
|  | ||||
| 		done(); | ||||
| 	}); | ||||
|  | ||||
| 	it('should not try to delete on remote conflicted notes that have been deleted', async (done) => { | ||||
| 		let f1 = await Folder.save({ title: "folder" }); | ||||
| 		let n1 = await Note.save({ title: "mynote", parent_id: f1.id }); | ||||
| 		await synchronizer().start(); | ||||
|  | ||||
| 		await switchClient(2); | ||||
|  | ||||
| 		await synchronizer().start(); | ||||
| 		await Note.save({ id: n1.id, is_conflict: 1 }); | ||||
| 		await Note.delete(n1.id); | ||||
| 		const deletedItems = await BaseItem.deletedItems(); | ||||
|  | ||||
| 		expect(deletedItems.length).toBe(0); | ||||
|  | ||||
| 		done(); | ||||
| 	}); | ||||
| 	 | ||||
| }); | ||||
| @@ -166,6 +166,11 @@ class FileApiDriverOneDrive { | ||||
| 		throw new Error('Not implemented'); | ||||
| 	} | ||||
|  | ||||
| 	// delta(path) { | ||||
| 	// 	let response = await this.api_.exec('GET', this.makePath_(path) + ':/delta'); | ||||
| 	// 	console.info(response);		 | ||||
| 	// } | ||||
|  | ||||
| } | ||||
|  | ||||
| export { FileApiDriverOneDrive }; | ||||
| @@ -109,12 +109,22 @@ class BaseItem extends BaseModel { | ||||
| 		let trackDeleted = true; | ||||
| 		if (options && options.trackDeleted !== null && options.trackDeleted !== undefined) trackDeleted = options.trackDeleted; | ||||
|  | ||||
| 		// Don't create a deleted_items entry when conflicted notes are deleted | ||||
| 		// since no other client have (or should have) them. | ||||
| 		let conflictNoteIds = []; | ||||
| 		if (this.modelType() == BaseModel.TYPE_NOTE) { | ||||
| 			const conflictNotes = await this.db().selectAll('SELECT id FROM notes WHERE id IN ("' + ids.join('","') + '") AND is_conflict = 1'); | ||||
| 			conflictNoteIds = conflictNotes.map((n) => { return n.id }); | ||||
| 		} | ||||
|  | ||||
| 		await super.batchDelete(ids, options); | ||||
|  | ||||
| 		if (trackDeleted) { | ||||
| 			let queries = []; | ||||
| 			let now = time.unixMs(); | ||||
| 			for (let i = 0; i < ids.length; i++) { | ||||
| 				if (conflictNoteIds.indexOf(ids[i]) >= 0) continue; | ||||
|  | ||||
| 				queries.push({ | ||||
| 					sql: 'INSERT INTO deleted_items (item_type, item_id, deleted_time) VALUES (?, ?, ?)', | ||||
| 					params: [this.modelType(), ids[i], now], | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| import { BaseModel } from 'lib/base-model.js'; | ||||
| import { Log } from 'lib/log.js'; | ||||
| import { sprintf } from 'sprintf-js'; | ||||
| import { Folder } from 'lib/models/folder.js'; | ||||
| import { BaseItem } from 'lib/models/base-item.js'; | ||||
| import { Setting } from 'lib/models/setting.js'; | ||||
| @@ -40,6 +41,12 @@ class Note extends BaseItem { | ||||
| 		return super.serialize(note, 'note', fieldNames); | ||||
| 	} | ||||
|  | ||||
| 	static geolocationUrl(note) { | ||||
| 		if (!('latitude' in note) || !('longitude' in note)) throw new Error('Latitude or longitude missing'); | ||||
| 		if (!note.latitude && !note.longitude) throw new Error(_('This note does not have geolocation information.')); | ||||
| 		return sprintf('https://www.openstreetmap.org/?lat=%s&lon=%s&zoom=20', note.latitude, note.longitude) | ||||
| 	} | ||||
|  | ||||
| 	static modelType() { | ||||
| 		return BaseModel.TYPE_NOTE; | ||||
| 	} | ||||
|   | ||||
| @@ -150,6 +150,7 @@ Setting.defaults_ = { | ||||
| 	'sync.target': { value: 'onedrive', type: 'string', public: true }, | ||||
| 	'editor': { value: '', type: 'string', public: true }, | ||||
| 	'locale': { value: 'en_GB', type: 'string', public: true }, | ||||
| 	'aliases': { value: '', type: 'string', public: true }, | ||||
| }; | ||||
|  | ||||
| // Contains constants that are set by the application and | ||||
|   | ||||
		Reference in New Issue
	
	Block a user