You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-09-02 20:46:21 +02:00
Compare commits
16 Commits
server-v3.
...
spellcheck
Author | SHA1 | Date | |
---|---|---|---|
|
2bfbeb002d | ||
|
d0c8693c26 | ||
|
8a461a66e6 | ||
|
8e783b78fe | ||
|
9077bb13d5 | ||
|
d45f7ae523 | ||
|
5dd619a766 | ||
|
0c8708a363 | ||
|
28c1676ed9 | ||
|
421ef885cd | ||
|
3582aeaec8 | ||
|
d07b2d4469 | ||
|
e50e548e25 | ||
|
84a87c10f7 | ||
|
559e88e35d | ||
|
da8469a81b |
@@ -149,8 +149,10 @@ ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
|||||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||||
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/setupContextMenu.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||||
ElectronClient/gui/NoteEditor/NoteEditor.js
|
ElectronClient/gui/NoteEditor/NoteEditor.js
|
||||||
|
ElectronClient/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
||||||
ElectronClient/gui/NoteEditor/styles/index.js
|
ElectronClient/gui/NoteEditor/styles/index.js
|
||||||
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
||||||
ElectronClient/gui/NoteEditor/utils/index.js
|
ElectronClient/gui/NoteEditor/utils/index.js
|
||||||
@@ -207,6 +209,7 @@ ElectronClient/services/plugins/PluginRunner.js
|
|||||||
ElectronClient/services/plugins/UserWebview.js
|
ElectronClient/services/plugins/UserWebview.js
|
||||||
ElectronClient/services/plugins/UserWebviewDialog.js
|
ElectronClient/services/plugins/UserWebviewDialog.js
|
||||||
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
||||||
|
ElectronClient/services/spellChecker/SpellCheckerServiceDriverNative.js
|
||||||
ReactNativeClient/lib/AsyncActionQueue.js
|
ReactNativeClient/lib/AsyncActionQueue.js
|
||||||
ReactNativeClient/lib/BaseApplication.js
|
ReactNativeClient/lib/BaseApplication.js
|
||||||
ReactNativeClient/lib/checkPermissions.js
|
ReactNativeClient/lib/checkPermissions.js
|
||||||
@@ -330,6 +333,8 @@ ReactNativeClient/lib/services/rest/errors.js
|
|||||||
ReactNativeClient/lib/services/searchengine/filterParser.js
|
ReactNativeClient/lib/services/searchengine/filterParser.js
|
||||||
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
||||||
ReactNativeClient/lib/services/SettingUtils.js
|
ReactNativeClient/lib/services/SettingUtils.js
|
||||||
|
ReactNativeClient/lib/services/spellChecker/SpellCheckerService.js
|
||||||
|
ReactNativeClient/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
||||||
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
||||||
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
||||||
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
||||||
@@ -352,6 +357,7 @@ ReactNativeClient/lib/themes/oledDark.js
|
|||||||
ReactNativeClient/lib/themes/solarizedDark.js
|
ReactNativeClient/lib/themes/solarizedDark.js
|
||||||
ReactNativeClient/lib/themes/solarizedLight.js
|
ReactNativeClient/lib/themes/solarizedLight.js
|
||||||
ReactNativeClient/lib/themes/type.js
|
ReactNativeClient/lib/themes/type.js
|
||||||
|
ReactNativeClient/lib/time.js
|
||||||
ReactNativeClient/lib/uuid.js
|
ReactNativeClient/lib/uuid.js
|
||||||
ReactNativeClient/lib/versionInfo.js
|
ReactNativeClient/lib/versionInfo.js
|
||||||
ReactNativeClient/PluginAssetsLoader.js
|
ReactNativeClient/PluginAssetsLoader.js
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@@ -143,8 +143,10 @@ ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
|||||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||||
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/setupContextMenu.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||||
ElectronClient/gui/NoteEditor/NoteEditor.js
|
ElectronClient/gui/NoteEditor/NoteEditor.js
|
||||||
|
ElectronClient/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
||||||
ElectronClient/gui/NoteEditor/styles/index.js
|
ElectronClient/gui/NoteEditor/styles/index.js
|
||||||
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
||||||
ElectronClient/gui/NoteEditor/utils/index.js
|
ElectronClient/gui/NoteEditor/utils/index.js
|
||||||
@@ -201,6 +203,7 @@ ElectronClient/services/plugins/PluginRunner.js
|
|||||||
ElectronClient/services/plugins/UserWebview.js
|
ElectronClient/services/plugins/UserWebview.js
|
||||||
ElectronClient/services/plugins/UserWebviewDialog.js
|
ElectronClient/services/plugins/UserWebviewDialog.js
|
||||||
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
||||||
|
ElectronClient/services/spellChecker/SpellCheckerServiceDriverNative.js
|
||||||
ReactNativeClient/lib/AsyncActionQueue.js
|
ReactNativeClient/lib/AsyncActionQueue.js
|
||||||
ReactNativeClient/lib/BaseApplication.js
|
ReactNativeClient/lib/BaseApplication.js
|
||||||
ReactNativeClient/lib/checkPermissions.js
|
ReactNativeClient/lib/checkPermissions.js
|
||||||
@@ -324,6 +327,8 @@ ReactNativeClient/lib/services/rest/errors.js
|
|||||||
ReactNativeClient/lib/services/searchengine/filterParser.js
|
ReactNativeClient/lib/services/searchengine/filterParser.js
|
||||||
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
||||||
ReactNativeClient/lib/services/SettingUtils.js
|
ReactNativeClient/lib/services/SettingUtils.js
|
||||||
|
ReactNativeClient/lib/services/spellChecker/SpellCheckerService.js
|
||||||
|
ReactNativeClient/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
||||||
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
||||||
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
||||||
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
||||||
@@ -346,6 +351,7 @@ ReactNativeClient/lib/themes/oledDark.js
|
|||||||
ReactNativeClient/lib/themes/solarizedDark.js
|
ReactNativeClient/lib/themes/solarizedDark.js
|
||||||
ReactNativeClient/lib/themes/solarizedLight.js
|
ReactNativeClient/lib/themes/solarizedLight.js
|
||||||
ReactNativeClient/lib/themes/type.js
|
ReactNativeClient/lib/themes/type.js
|
||||||
|
ReactNativeClient/lib/time.js
|
||||||
ReactNativeClient/lib/uuid.js
|
ReactNativeClient/lib/uuid.js
|
||||||
ReactNativeClient/lib/versionInfo.js
|
ReactNativeClient/lib/versionInfo.js
|
||||||
ReactNativeClient/PluginAssetsLoader.js
|
ReactNativeClient/PluginAssetsLoader.js
|
||||||
|
6
.ignore
6
.ignore
@@ -92,8 +92,10 @@ ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
|||||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||||
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/setupContextMenu.js
|
||||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||||
ElectronClient/gui/NoteEditor/NoteEditor.js
|
ElectronClient/gui/NoteEditor/NoteEditor.js
|
||||||
|
ElectronClient/gui/NoteEditor/NoteTitle/NoteTitleBar.js
|
||||||
ElectronClient/gui/NoteEditor/styles/index.js
|
ElectronClient/gui/NoteEditor/styles/index.js
|
||||||
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
||||||
ElectronClient/gui/NoteEditor/utils/index.js
|
ElectronClient/gui/NoteEditor/utils/index.js
|
||||||
@@ -150,6 +152,7 @@ ElectronClient/services/plugins/PluginRunner.js
|
|||||||
ElectronClient/services/plugins/UserWebview.js
|
ElectronClient/services/plugins/UserWebview.js
|
||||||
ElectronClient/services/plugins/UserWebviewDialog.js
|
ElectronClient/services/plugins/UserWebviewDialog.js
|
||||||
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
||||||
|
ElectronClient/services/spellChecker/SpellCheckerServiceDriverNative.js
|
||||||
ReactNativeClient/lib/AsyncActionQueue.js
|
ReactNativeClient/lib/AsyncActionQueue.js
|
||||||
ReactNativeClient/lib/BaseApplication.js
|
ReactNativeClient/lib/BaseApplication.js
|
||||||
ReactNativeClient/lib/checkPermissions.js
|
ReactNativeClient/lib/checkPermissions.js
|
||||||
@@ -273,6 +276,8 @@ ReactNativeClient/lib/services/rest/errors.js
|
|||||||
ReactNativeClient/lib/services/searchengine/filterParser.js
|
ReactNativeClient/lib/services/searchengine/filterParser.js
|
||||||
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
||||||
ReactNativeClient/lib/services/SettingUtils.js
|
ReactNativeClient/lib/services/SettingUtils.js
|
||||||
|
ReactNativeClient/lib/services/spellChecker/SpellCheckerService.js
|
||||||
|
ReactNativeClient/lib/services/spellChecker/SpellCheckerServiceDriverBase.js
|
||||||
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
||||||
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
||||||
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
||||||
@@ -295,6 +300,7 @@ ReactNativeClient/lib/themes/oledDark.js
|
|||||||
ReactNativeClient/lib/themes/solarizedDark.js
|
ReactNativeClient/lib/themes/solarizedDark.js
|
||||||
ReactNativeClient/lib/themes/solarizedLight.js
|
ReactNativeClient/lib/themes/solarizedLight.js
|
||||||
ReactNativeClient/lib/themes/type.js
|
ReactNativeClient/lib/themes/type.js
|
||||||
|
ReactNativeClient/lib/time.js
|
||||||
ReactNativeClient/lib/uuid.js
|
ReactNativeClient/lib/uuid.js
|
||||||
ReactNativeClient/lib/versionInfo.js
|
ReactNativeClient/lib/versionInfo.js
|
||||||
ReactNativeClient/PluginAssetsLoader.js
|
ReactNativeClient/PluginAssetsLoader.js
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
const yargParser = require('yargs-parser');
|
const yargParser = require('yargs-parser');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const stringPadding = require('string-padding');
|
const stringPadding = require('string-padding');
|
||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ const { app } = require('./app.js');
|
|||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
usage() {
|
||||||
|
@@ -6,7 +6,7 @@ const Folder = require('lib/models/Folder.js');
|
|||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
@@ -3,7 +3,7 @@ const { app } = require('./app.js');
|
|||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require('lib/models/Tag.js');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
usage() {
|
||||||
|
@@ -3,7 +3,7 @@ const { app } = require('./app.js');
|
|||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
usage() {
|
usage() {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
const Resource = require('lib/models/Resource.js');
|
const Resource = require('lib/models/Resource.js');
|
||||||
const { dirname } = require('lib/path-utils');
|
const { dirname } = require('lib/path-utils');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const ArrayUtils = require('lib/ArrayUtils.js');
|
const ArrayUtils = require('lib/ArrayUtils.js');
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { filename } = require('lib/path-utils');
|
const { filename } = require('lib/path-utils');
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { filename } = require('lib/path-utils');
|
const { filename } = require('lib/path-utils');
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { filename } = require('lib/path-utils');
|
const { filename } = require('lib/path-utils');
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import InMemoryCache from 'lib/InMemoryCache';
|
import InMemoryCache from 'lib/InMemoryCache';
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
describe('InMemoryCache', function() {
|
describe('InMemoryCache', function() {
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { sortedIds, createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { sortedIds, createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -5,7 +5,7 @@ const Setting = require('lib/models/Setting').default;
|
|||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require('lib/models/Tag.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
let testApp = null;
|
let testApp = null;
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@ const Setting = require('lib/models/Setting').default;
|
|||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require('lib/models/Tag.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { ALL_NOTES_FILTER_ID } = require('lib/reserved-ids.js');
|
const { ALL_NOTES_FILTER_ID } = require('lib/reserved-ids.js');
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -5,7 +5,7 @@ const Setting = require('lib/models/Setting').default;
|
|||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require('lib/models/Tag.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
let testApp = null;
|
let testApp = null;
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const uuid = require('lib/uuid').default;
|
const uuid = require('lib/uuid').default;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, sleep, fileApi, fileContentEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, sleep, fileApi, fileContentEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const mimeUtils = require('lib/mime-utils.js').mime;
|
const mimeUtils = require('lib/mime-utils.js').mime;
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, revisionService, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, revisionService, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
||||||
const ResourceService = require('lib/services/ResourceService');
|
const ResourceService = require('lib/services/ResourceService');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { sortedIds, createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { sortedIds, createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { sortedIds, createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { sortedIds, createNTestNotes, asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, resourceService, decryptionWorker, encryptionService, loadEncryptionMasterKey, allSyncTargetItemsEncrypted, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, resourceService, decryptionWorker, encryptionService, loadEncryptionMasterKey, allSyncTargetItemsEncrypted, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const InteropService = require('lib/services/interop/InteropService').default;
|
const InteropService = require('lib/services/interop/InteropService').default;
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, revisionService, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, revisionService, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync, mockDate, restoreDate } = require('test-utils.js');
|
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync, mockDate, restoreDate } = require('test-utils.js');
|
||||||
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
||||||
const Note = require('lib/models/Note');
|
const Note = require('lib/models/Note');
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('test-utils.js');
|
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('test-utils.js');
|
||||||
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
||||||
const Note = require('lib/models/Note');
|
const Note = require('lib/models/Note');
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
// require('app-module-path').addPath(__dirname);
|
// require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
// const { time } = require('lib/time-utils.js');
|
// const time = require('lib/time').default;
|
||||||
// const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('test-utils.js');
|
// const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('test-utils.js');
|
||||||
// const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
// const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
||||||
// const Note = require('lib/models/Note');
|
// const Note = require('lib/models/Note');
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { setupDatabase, synchronizerStart, syncTargetName, allSyncTargetItemsEncrypted, tempFilePath, resourceFetcher, kvStore, revisionService, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, encryptionService, loadEncryptionMasterKey, fileContentEqual, decryptionWorker, checkThrowAsync, asyncTest } = require('test-utils.js');
|
const { setupDatabase, synchronizerStart, syncTargetName, allSyncTargetItemsEncrypted, tempFilePath, resourceFetcher, kvStore, revisionService, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, encryptionService, loadEncryptionMasterKey, fileContentEqual, decryptionWorker, checkThrowAsync, asyncTest } = require('test-utils.js');
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
|
@@ -25,7 +25,7 @@ const { FileApiDriverOneDrive } = require('lib/file-api-driver-onedrive.js');
|
|||||||
const { FileApiDriverAmazonS3 } = require('lib/file-api-driver-amazon-s3.js');
|
const { FileApiDriverAmazonS3 } = require('lib/file-api-driver-amazon-s3.js');
|
||||||
const BaseService = require('lib/services/BaseService').default;
|
const BaseService = require('lib/services/BaseService').default;
|
||||||
const FsDriverNode = require('lib/fs-driver-node').default;
|
const FsDriverNode = require('lib/fs-driver-node').default;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { shimInit } = require('lib/shim-init-node.js');
|
const { shimInit } = require('lib/shim-init-node.js');
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const uuid = require('lib/uuid').default;
|
const uuid = require('lib/uuid').default;
|
||||||
|
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||||
const timeUtils = require('../../ReactNativeClient/lib/time-utils');
|
const timeUtils = require('../../ReactNativeClient/lib/time');
|
||||||
|
|
||||||
process.on('unhandledRejection', (reason, p) => {
|
process.on('unhandledRejection', (reason, p) => {
|
||||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||||
|
@@ -86,6 +86,7 @@ export default class ElectronAppWrapper {
|
|||||||
backgroundColor: '#fff', // required to enable sub pixel rendering, can't be in css
|
backgroundColor: '#fff', // required to enable sub pixel rendering, can't be in css
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true,
|
nodeIntegration: true,
|
||||||
|
spellcheck: true,
|
||||||
},
|
},
|
||||||
webviewTag: true,
|
webviewTag: true,
|
||||||
// We start with a hidden window, which is then made visible depending on the showTrayIcon setting
|
// We start with a hidden window, which is then made visible depending on the showTrayIcon setting
|
||||||
@@ -97,14 +98,6 @@ export default class ElectronAppWrapper {
|
|||||||
// Fix: https://github.com/electron-userland/electron-builder/issues/2269
|
// Fix: https://github.com/electron-userland/electron-builder/issues/2269
|
||||||
if (shim.isLinux()) windowOptions.icon = path.join(__dirname, '..', 'build/icons/128x128.png');
|
if (shim.isLinux()) windowOptions.icon = path.join(__dirname, '..', 'build/icons/128x128.png');
|
||||||
|
|
||||||
require('electron-context-menu')({
|
|
||||||
shouldShowMenu: (_event:any, params:any) => {
|
|
||||||
// params.inputFieldType === 'none' when right-clicking the text editor. This is a bit of a hack to detect it because in this
|
|
||||||
// case we don't want to use the built-in context menu but a custom one.
|
|
||||||
return params.isEditable && params.inputFieldType !== 'none';
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
this.win_ = new BrowserWindow(windowOptions);
|
this.win_ = new BrowserWindow(windowOptions);
|
||||||
|
|
||||||
if (!screen.getDisplayMatching(this.win_.getBounds())) {
|
if (!screen.getDisplayMatching(this.win_.getBounds())) {
|
||||||
|
@@ -8,7 +8,7 @@ const bridge = require('electron').remote.require('./bridge').default;
|
|||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { friendlySafeFilename } = require('lib/path-utils');
|
const { friendlySafeFilename } = require('lib/path-utils');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const md5 = require('md5');
|
const md5 = require('md5');
|
||||||
const url = require('url');
|
const url = require('url');
|
||||||
|
|
||||||
|
@@ -14,6 +14,9 @@ import Setting from 'lib/models/Setting';
|
|||||||
import actionApi from 'lib/services/rest/actionApi.desktop';
|
import actionApi from 'lib/services/rest/actionApi.desktop';
|
||||||
import BaseApplication from 'lib/BaseApplication';
|
import BaseApplication from 'lib/BaseApplication';
|
||||||
import { _, setLocale } from 'lib/locale';
|
import { _, setLocale } from 'lib/locale';
|
||||||
|
import SpellCheckerService from 'lib/services/spellChecker/SpellCheckerService';
|
||||||
|
import SpellCheckerServiceDriverNative from './services/spellChecker/SpellCheckerServiceDriverNative';
|
||||||
|
import bridge from './services/bridge';
|
||||||
import menuCommandNames from './gui/menuCommandNames';
|
import menuCommandNames from './gui/menuCommandNames';
|
||||||
|
|
||||||
require('app-module-path').addPath(__dirname);
|
require('app-module-path').addPath(__dirname);
|
||||||
@@ -29,7 +32,6 @@ const DecryptionWorker = require('lib/services/DecryptionWorker');
|
|||||||
const ResourceService = require('lib/services/ResourceService');
|
const ResourceService = require('lib/services/ResourceService');
|
||||||
const ClipperServer = require('lib/ClipperServer');
|
const ClipperServer = require('lib/ClipperServer');
|
||||||
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
||||||
const bridge = require('electron').remote.require('./bridge').default;
|
|
||||||
const { webFrame } = require('electron');
|
const { webFrame } = require('electron');
|
||||||
const Menu = bridge().Menu;
|
const Menu = bridge().Menu;
|
||||||
const PluginManager = require('lib/services/PluginManager');
|
const PluginManager = require('lib/services/PluginManager');
|
||||||
@@ -452,6 +454,31 @@ class Application extends BaseApplication {
|
|||||||
document.head.appendChild(styleTag);
|
document.head.appendChild(styleTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setupContextMenu() {
|
||||||
|
// The context menu must be setup in renderer process because that's where
|
||||||
|
// the spell checker service lives.
|
||||||
|
require('electron-context-menu')({
|
||||||
|
shouldShowMenu: (_event:any, params:any) => {
|
||||||
|
// params.inputFieldType === 'none' when right-clicking the text editor. This is a bit of a hack to detect it because in this
|
||||||
|
// case we don't want to use the built-in context menu but a custom one.
|
||||||
|
return params.isEditable && params.inputFieldType !== 'none';
|
||||||
|
},
|
||||||
|
|
||||||
|
menu: (actions:any, props:any) => {
|
||||||
|
const spellCheckerMenuItems = SpellCheckerService.instance().contextMenuItems(props.misspelledWord, props.dictionarySuggestions);
|
||||||
|
|
||||||
|
const output = [
|
||||||
|
actions.cut(),
|
||||||
|
actions.copy(),
|
||||||
|
actions.paste(),
|
||||||
|
...spellCheckerMenuItems,
|
||||||
|
];
|
||||||
|
|
||||||
|
return output;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async loadCustomCss(filePath:string) {
|
async loadCustomCss(filePath:string) {
|
||||||
let cssString = '';
|
let cssString = '';
|
||||||
if (await fs.pathExists(filePath)) {
|
if (await fs.pathExists(filePath)) {
|
||||||
@@ -689,6 +716,10 @@ class Application extends BaseApplication {
|
|||||||
this.logger().error(`There was an error loading plugins from ${Setting.value('plugins.devPluginPaths')}:`, error);
|
this.logger().error(`There was an error loading plugins from ${Setting.value('plugins.devPluginPaths')}:`, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.setupContextMenu();
|
||||||
|
|
||||||
|
await SpellCheckerService.instance().initialize(new SpellCheckerServiceDriverNative());
|
||||||
|
|
||||||
// await populateDatabase(reg.db());
|
// await populateDatabase(reg.db());
|
||||||
|
|
||||||
// setTimeout(() => {
|
// setTimeout(() => {
|
||||||
|
@@ -4,7 +4,7 @@ const Setting = require('lib/models/Setting').default;
|
|||||||
const EncryptionService = require('lib/services/EncryptionService');
|
const EncryptionService = require('lib/services/EncryptionService');
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const dialogs = require('./dialogs');
|
const dialogs = require('./dialogs');
|
||||||
const shared = require('lib/components/shared/encryption-config-shared.js');
|
const shared = require('lib/components/shared/encryption-config-shared.js');
|
||||||
|
@@ -27,7 +27,7 @@ const bridge = require('electron').remote.require('./bridge').default;
|
|||||||
const PluginManager = require('lib/services/PluginManager');
|
const PluginManager = require('lib/services/PluginManager');
|
||||||
const EncryptionService = require('lib/services/EncryptionService');
|
const EncryptionService = require('lib/services/EncryptionService');
|
||||||
const ipcRenderer = require('electron').ipcRenderer;
|
const ipcRenderer = require('electron').ipcRenderer;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const styled = require('styled-components').default;
|
const styled = require('styled-components').default;
|
||||||
|
|
||||||
const StyledUserWebviewDialogContainer = styled.div`
|
const StyledUserWebviewDialogContainer = styled.div`
|
||||||
|
@@ -3,7 +3,7 @@ import eventManager from 'lib/eventManager';
|
|||||||
import { _ } from 'lib/locale';
|
import { _ } from 'lib/locale';
|
||||||
import { stateUtils } from 'lib/reducer';
|
import { stateUtils } from 'lib/reducer';
|
||||||
const Note = require('lib/models/Note');
|
const Note = require('lib/models/Note');
|
||||||
const { time } = require('lib/time-utils');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
export const declaration:CommandDeclaration = {
|
export const declaration:CommandDeclaration = {
|
||||||
name: 'editAlarm',
|
name: 'editAlarm',
|
||||||
|
@@ -14,6 +14,7 @@ import InteropServiceHelper from '../InteropServiceHelper';
|
|||||||
import { _ } from 'lib/locale';
|
import { _ } from 'lib/locale';
|
||||||
import { MenuItem, MenuItemLocation } from 'lib/services/plugins/api/types';
|
import { MenuItem, MenuItemLocation } from 'lib/services/plugins/api/types';
|
||||||
import stateToWhenClauseContext from 'lib/services/commands/stateToWhenClauseContext';
|
import stateToWhenClauseContext from 'lib/services/commands/stateToWhenClauseContext';
|
||||||
|
import SpellCheckerService from 'lib/services/spellChecker/SpellCheckerService';
|
||||||
import menuCommandNames from './menuCommandNames';
|
import menuCommandNames from './menuCommandNames';
|
||||||
|
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
@@ -85,6 +86,8 @@ interface Props {
|
|||||||
showCompletedTodos: boolean,
|
showCompletedTodos: boolean,
|
||||||
pluginMenuItems: any[],
|
pluginMenuItems: any[],
|
||||||
pluginMenus: any[],
|
pluginMenus: any[],
|
||||||
|
['spellChecker.enabled']: boolean,
|
||||||
|
['spellChecker.language']: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
const commandNames:string[] = menuCommandNames();
|
const commandNames:string[] = menuCommandNames();
|
||||||
@@ -344,6 +347,8 @@ function useMenu(props:Props) {
|
|||||||
}
|
}
|
||||||
toolsItems = toolsItems.concat(toolsItemsAll);
|
toolsItems = toolsItems.concat(toolsItemsAll);
|
||||||
|
|
||||||
|
toolsItems.push(SpellCheckerService.instance().spellCheckerConfigMenuItem(props['spellChecker.language'], props['spellChecker.enabled']));
|
||||||
|
|
||||||
function _checkForUpdates() {
|
function _checkForUpdates() {
|
||||||
bridge().checkForUpdates(false, bridge().window(), `${Setting.value('profileDir')}/log-autoupdater.txt`, { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
|
bridge().checkForUpdates(false, bridge().window(), `${Setting.value('profileDir')}/log-autoupdater.txt`, { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
|
||||||
}
|
}
|
||||||
@@ -743,7 +748,7 @@ function useMenu(props:Props) {
|
|||||||
} else {
|
} else {
|
||||||
setMenu(Menu.buildFromTemplate(template));
|
setMenu(Menu.buildFromTemplate(template));
|
||||||
}
|
}
|
||||||
}, [props.routeName, props.pluginMenuItems, props.pluginMenus, keymapLastChangeTime, modulesLastChangeTime]);
|
}, [props.routeName, props.pluginMenuItems, props.pluginMenus, keymapLastChangeTime, modulesLastChangeTime, props['spellChecker.language'], props['spellChecker.enabled']]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const whenClauseContext = CommandService.instance().currentWhenClauseContext();
|
const whenClauseContext = CommandService.instance().currentWhenClauseContext();
|
||||||
@@ -838,6 +843,8 @@ const mapStateToProps = (state:AppState) => {
|
|||||||
showCompletedTodos: state.settings.showCompletedTodos,
|
showCompletedTodos: state.settings.showCompletedTodos,
|
||||||
pluginMenuItems: stateUtils.selectArrayShallow({ array: pluginUtils.viewsByType(state.pluginService.plugins, 'menuItem') }, 'menuBar.pluginMenuItems'),
|
pluginMenuItems: stateUtils.selectArrayShallow({ array: pluginUtils.viewsByType(state.pluginService.plugins, 'menuItem') }, 'menuBar.pluginMenuItems'),
|
||||||
pluginMenus: stateUtils.selectArrayShallow({ array: pluginUtils.viewsByType(state.pluginService.plugins, 'menu') }, 'menuBar.pluginMenus'),
|
pluginMenus: stateUtils.selectArrayShallow({ array: pluginUtils.viewsByType(state.pluginService.plugins, 'menu') }, 'menuBar.pluginMenus'),
|
||||||
|
['spellChecker.language']: state.settings['spellChecker.language'],
|
||||||
|
['spellChecker.enabled']: state.settings['spellChecker.enabled'],
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -4,7 +4,6 @@ import { ScrollOptions, ScrollOptionTypes, EditorCommand, NoteBodyEditorProps }
|
|||||||
import { resourcesStatus, commandAttachFileToBody, handlePasteEvent } from '../../utils/resourceHandling';
|
import { resourcesStatus, commandAttachFileToBody, handlePasteEvent } from '../../utils/resourceHandling';
|
||||||
import useScroll from './utils/useScroll';
|
import useScroll from './utils/useScroll';
|
||||||
import styles_ from './styles';
|
import styles_ from './styles';
|
||||||
import { menuItems, ContextMenuOptions, ContextMenuItemType } from '../../utils/contextMenu';
|
|
||||||
import CommandService from 'lib/services/CommandService';
|
import CommandService from 'lib/services/CommandService';
|
||||||
import { ToolbarButtonInfo } from 'lib/services/commands/ToolbarButtonUtils';
|
import { ToolbarButtonInfo } from 'lib/services/commands/ToolbarButtonUtils';
|
||||||
import ToggleEditorsButton, { Value as ToggleEditorsButtonValue } from '../../../ToggleEditorsButton/ToggleEditorsButton';
|
import ToggleEditorsButton, { Value as ToggleEditorsButtonValue } from '../../../ToggleEditorsButton/ToggleEditorsButton';
|
||||||
@@ -12,13 +11,13 @@ import ToolbarButton from '../../../../gui/ToolbarButton/ToolbarButton';
|
|||||||
import usePluginServiceRegistration from '../../utils/usePluginServiceRegistration';
|
import usePluginServiceRegistration from '../../utils/usePluginServiceRegistration';
|
||||||
import { utils as pluginUtils } from 'lib/services/plugins/reducer';
|
import { utils as pluginUtils } from 'lib/services/plugins/reducer';
|
||||||
import { _, closestSupportedLocale } from 'lib/locale';
|
import { _, closestSupportedLocale } from 'lib/locale';
|
||||||
|
import setupContextMenu from './utils/setupContextMenu';
|
||||||
|
|
||||||
const { MarkupToHtml } = require('lib/joplin-renderer');
|
const { MarkupToHtml } = require('lib/joplin-renderer');
|
||||||
const taboverride = require('taboverride');
|
const taboverride = require('taboverride');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const BaseItem = require('lib/models/BaseItem');
|
const BaseItem = require('lib/models/BaseItem');
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const Resource = require('lib/models/Resource');
|
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
const { clipboard } = require('electron');
|
const { clipboard } = require('electron');
|
||||||
const supportedLocales = require('./supportedLocales');
|
const supportedLocales = require('./supportedLocales');
|
||||||
@@ -143,8 +142,6 @@ const TinyMCE = (props:NoteBodyEditorProps, ref:any) => {
|
|||||||
const props_onDrop = useRef(null);
|
const props_onDrop = useRef(null);
|
||||||
props_onDrop.current = props.onDrop;
|
props_onDrop.current = props.onDrop;
|
||||||
|
|
||||||
const contextMenuActionOptions = useRef<ContextMenuOptions>(null);
|
|
||||||
|
|
||||||
const markupToHtml = useRef(null);
|
const markupToHtml = useRef(null);
|
||||||
markupToHtml.current = props.markupToHtml;
|
markupToHtml.current = props.markupToHtml;
|
||||||
|
|
||||||
@@ -510,19 +507,7 @@ const TinyMCE = (props:NoteBodyEditorProps, ref:any) => {
|
|||||||
loadedCssFiles_ = [];
|
loadedCssFiles_ = [];
|
||||||
loadedJsFiles_ = [];
|
loadedJsFiles_ = [];
|
||||||
|
|
||||||
function contextMenuItemNameWithNamespace(name:string) {
|
|
||||||
// For unknown reasons, TinyMCE converts all context menu names to
|
|
||||||
// lowercase when setting them in the init method, so we need to
|
|
||||||
// make them lowercase too, to make sure that the update() method
|
|
||||||
// addContextMenu is triggered.
|
|
||||||
return (`joplin${name}`).toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadEditor = async () => {
|
const loadEditor = async () => {
|
||||||
const contextMenuItems = menuItems();
|
|
||||||
const contextMenuItemNames = [];
|
|
||||||
for (const name in contextMenuItems) contextMenuItemNames.push(contextMenuItemNameWithNamespace(name));
|
|
||||||
|
|
||||||
const language = closestSupportedLocale(props.locale, true, supportedLocales);
|
const language = closestSupportedLocale(props.locale, true, supportedLocales);
|
||||||
|
|
||||||
const pluginCommandNames:string[] = [];
|
const pluginCommandNames:string[] = [];
|
||||||
@@ -564,7 +549,8 @@ const TinyMCE = (props:NoteBodyEditorProps, ref:any) => {
|
|||||||
language: ['en_US', 'en_GB'].includes(language) ? undefined : language,
|
language: ['en_US', 'en_GB'].includes(language) ? undefined : language,
|
||||||
toolbar: toolbar.join(' '),
|
toolbar: toolbar.join(' '),
|
||||||
localization_function: _,
|
localization_function: _,
|
||||||
contextmenu: contextMenuItemNames.join(' '),
|
contextmenu: false,
|
||||||
|
browser_spellcheck: true,
|
||||||
setup: (editor:any) => {
|
setup: (editor:any) => {
|
||||||
|
|
||||||
function openEditDialog(editable:any) {
|
function openEditDialog(editable:any) {
|
||||||
@@ -680,51 +666,7 @@ const TinyMCE = (props:NoteBodyEditorProps, ref:any) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const itemName in contextMenuItems) {
|
setupContextMenu(editor);
|
||||||
const item = contextMenuItems[itemName];
|
|
||||||
|
|
||||||
const itemNameNS = contextMenuItemNameWithNamespace(itemName);
|
|
||||||
|
|
||||||
editor.ui.registry.addMenuItem(itemNameNS, {
|
|
||||||
text: item.label,
|
|
||||||
onAction: () => {
|
|
||||||
item.onAction(contextMenuActionOptions.current);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
editor.ui.registry.addContextMenu(itemNameNS, {
|
|
||||||
update: function(element:any) {
|
|
||||||
let itemType:ContextMenuItemType = ContextMenuItemType.None;
|
|
||||||
let resourceId = '';
|
|
||||||
let linkToCopy = null;
|
|
||||||
|
|
||||||
if (element.nodeName === 'IMG') {
|
|
||||||
itemType = ContextMenuItemType.Image;
|
|
||||||
resourceId = Resource.pathToId(element.src);
|
|
||||||
} else if (element.nodeName === 'A') {
|
|
||||||
resourceId = Resource.pathToId(element.href);
|
|
||||||
itemType = resourceId ? ContextMenuItemType.Resource : ContextMenuItemType.Link;
|
|
||||||
linkToCopy = element.getAttribute('href') || '';
|
|
||||||
} else {
|
|
||||||
itemType = ContextMenuItemType.Text;
|
|
||||||
}
|
|
||||||
|
|
||||||
contextMenuActionOptions.current = {
|
|
||||||
itemType,
|
|
||||||
resourceId,
|
|
||||||
linkToCopy,
|
|
||||||
textToCopy: null,
|
|
||||||
htmlToCopy: editor.selection ? editor.selection.getContent() : '',
|
|
||||||
insertContent: (content:string) => {
|
|
||||||
editor.insertContent(content);
|
|
||||||
},
|
|
||||||
isReadOnly: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
return item.isActive(itemType, contextMenuActionOptions.current) ? itemNameNS : '';
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove event on unmount?
|
// TODO: remove event on unmount?
|
||||||
editor.on('DblClick', (event:any) => {
|
editor.on('DblClick', (event:any) => {
|
||||||
|
@@ -0,0 +1,91 @@
|
|||||||
|
import SpellCheckerService from 'lib/services/spellChecker/SpellCheckerService';
|
||||||
|
import bridge from '../../../../../services/bridge';
|
||||||
|
import { menuItems, ContextMenuOptions, ContextMenuItemType } from '../../../utils/contextMenu';
|
||||||
|
const Resource = require('lib/models/Resource');
|
||||||
|
|
||||||
|
// x and y are the absolute coordinates, as returned by the context-menu event
|
||||||
|
// handler on the webContent. This function will return null if the point is
|
||||||
|
// not within the TinyMCE editor.
|
||||||
|
function contextMenuElement(editor:any, x:number, y:number) {
|
||||||
|
const iframes = document.getElementsByClassName('tox-edit-area__iframe');
|
||||||
|
if (!iframes.length) return null;
|
||||||
|
|
||||||
|
const iframeRect = iframes[0].getBoundingClientRect();
|
||||||
|
|
||||||
|
if (iframeRect.x < x && iframeRect.y < y && iframeRect.right > x && iframeRect.bottom > y) {
|
||||||
|
const relativeX = x - iframeRect.x;
|
||||||
|
const relativeY = y - iframeRect.y;
|
||||||
|
|
||||||
|
return editor.getDoc().elementFromPoint(relativeX, relativeY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ContextMenuActionOptions {
|
||||||
|
current: ContextMenuOptions,
|
||||||
|
}
|
||||||
|
|
||||||
|
const contextMenuActionOptions:ContextMenuActionOptions = { current: null };
|
||||||
|
|
||||||
|
export default function(editor:any) {
|
||||||
|
const contextMenuItems = menuItems();
|
||||||
|
|
||||||
|
bridge().window().webContents.on('context-menu', (_event:any, params:any) => {
|
||||||
|
const element = contextMenuElement(editor, params.x, params.y);
|
||||||
|
if (!element) return;
|
||||||
|
|
||||||
|
const Menu = bridge().Menu;
|
||||||
|
const MenuItem = bridge().MenuItem;
|
||||||
|
|
||||||
|
let itemType:ContextMenuItemType = ContextMenuItemType.None;
|
||||||
|
let resourceId = '';
|
||||||
|
let linkToCopy = null;
|
||||||
|
|
||||||
|
if (element.nodeName === 'IMG') {
|
||||||
|
itemType = ContextMenuItemType.Image;
|
||||||
|
resourceId = Resource.pathToId(element.src);
|
||||||
|
} else if (element.nodeName === 'A') {
|
||||||
|
resourceId = Resource.pathToId(element.href);
|
||||||
|
itemType = resourceId ? ContextMenuItemType.Resource : ContextMenuItemType.Link;
|
||||||
|
linkToCopy = element.getAttribute('href') || '';
|
||||||
|
} else {
|
||||||
|
itemType = ContextMenuItemType.Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
contextMenuActionOptions.current = {
|
||||||
|
itemType,
|
||||||
|
resourceId,
|
||||||
|
linkToCopy,
|
||||||
|
textToCopy: null,
|
||||||
|
htmlToCopy: editor.selection ? editor.selection.getContent() : '',
|
||||||
|
insertContent: (content:string) => {
|
||||||
|
editor.insertContent(content);
|
||||||
|
},
|
||||||
|
isReadOnly: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
const menu = new Menu();
|
||||||
|
|
||||||
|
for (const itemName in contextMenuItems) {
|
||||||
|
const item = contextMenuItems[itemName];
|
||||||
|
|
||||||
|
if (!item.isActive(itemType, contextMenuActionOptions.current)) continue;
|
||||||
|
|
||||||
|
menu.append(new MenuItem({
|
||||||
|
label: item.label,
|
||||||
|
click: () => {
|
||||||
|
item.onAction(contextMenuActionOptions.current);
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const spellCheckerMenuItems = SpellCheckerService.instance().contextMenuItems(params.misspelledWord, params.dictionarySuggestions);
|
||||||
|
|
||||||
|
for (const item of spellCheckerMenuItems) {
|
||||||
|
menu.append(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.popup();
|
||||||
|
});
|
||||||
|
}
|
@@ -1,11 +1,9 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useState, useEffect, useCallback, useRef } from 'react';
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
||||||
// eslint-disable-next-line no-unused-vars
|
|
||||||
import TinyMCE from './NoteBody/TinyMCE/TinyMCE';
|
import TinyMCE from './NoteBody/TinyMCE/TinyMCE';
|
||||||
import CodeMirror from './NoteBody/CodeMirror/CodeMirror';
|
import CodeMirror from './NoteBody/CodeMirror/CodeMirror';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import MultiNoteActions from '../MultiNoteActions';
|
import MultiNoteActions from '../MultiNoteActions';
|
||||||
import NoteToolbar from '../NoteToolbar/NoteToolbar';
|
|
||||||
import { htmlToMarkdown, formNoteToNote } from './utils';
|
import { htmlToMarkdown, formNoteToNote } from './utils';
|
||||||
import useSearchMarkers from './utils/useSearchMarkers';
|
import useSearchMarkers from './utils/useSearchMarkers';
|
||||||
import useNoteSearchBar from './utils/useNoteSearchBar';
|
import useNoteSearchBar from './utils/useNoteSearchBar';
|
||||||
@@ -27,15 +25,15 @@ import ToolbarButtonUtils from 'lib/services/commands/ToolbarButtonUtils';
|
|||||||
import { _ } from 'lib/locale';
|
import { _ } from 'lib/locale';
|
||||||
import stateToWhenClauseContext from 'lib/services/commands/stateToWhenClauseContext';
|
import stateToWhenClauseContext from 'lib/services/commands/stateToWhenClauseContext';
|
||||||
import TagList from '../TagList';
|
import TagList from '../TagList';
|
||||||
|
import NoteTitleBar from './NoteTitle/NoteTitleBar';
|
||||||
|
import markupLanguageUtils from 'lib/markupLanguageUtils';
|
||||||
|
import usePrevious from 'lib/hooks/usePrevious';
|
||||||
|
import Setting from 'lib/models/Setting';
|
||||||
|
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
const { substrWithEllipsis } = require('lib/string-utils');
|
const { substrWithEllipsis } = require('lib/string-utils');
|
||||||
const NoteSearchBar = require('../NoteSearchBar.min.js');
|
const NoteSearchBar = require('../NoteSearchBar.min.js');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
|
||||||
const markupLanguageUtils = require('lib/markupLanguageUtils').default;
|
|
||||||
const usePrevious = require('lib/hooks/usePrevious').default;
|
|
||||||
const Setting = require('lib/models/Setting').default;
|
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const bridge = require('electron').remote.require('./bridge').default;
|
const bridge = require('electron').remote.require('./bridge').default;
|
||||||
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
||||||
@@ -45,10 +43,6 @@ const commands = [
|
|||||||
require('./commands/showRevisions'),
|
require('./commands/showRevisions'),
|
||||||
];
|
];
|
||||||
|
|
||||||
const toolbarStyle = {
|
|
||||||
marginBottom: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
const toolbarButtonUtils = new ToolbarButtonUtils(CommandService.instance());
|
const toolbarButtonUtils = new ToolbarButtonUtils(CommandService.instance());
|
||||||
|
|
||||||
function NoteEditor(props: NoteEditorProps) {
|
function NoteEditor(props: NoteEditorProps) {
|
||||||
@@ -244,20 +238,20 @@ function NoteEditor(props: NoteEditorProps) {
|
|||||||
|
|
||||||
const onTitleChange = useCallback((event: any) => onFieldChange('title', event.target.value), [onFieldChange]);
|
const onTitleChange = useCallback((event: any) => onFieldChange('title', event.target.value), [onFieldChange]);
|
||||||
|
|
||||||
const onTitleKeydown = useCallback((event:any) => {
|
// const onTitleKeydown = useCallback((event:any) => {
|
||||||
const keyCode = event.keyCode;
|
// const keyCode = event.keyCode;
|
||||||
|
|
||||||
if (keyCode === 9) {
|
// if (keyCode === 9) {
|
||||||
// TAB
|
// // TAB
|
||||||
event.preventDefault();
|
// event.preventDefault();
|
||||||
|
|
||||||
if (event.shiftKey) {
|
// if (event.shiftKey) {
|
||||||
CommandService.instance().execute('focusElement', 'noteList');
|
// CommandService.instance().execute('focusElement', 'noteList');
|
||||||
} else {
|
// } else {
|
||||||
CommandService.instance().execute('focusElement', 'noteBody');
|
// CommandService.instance().execute('focusElement', 'noteBody');
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}, [props.dispatch]);
|
// }, [props.dispatch]);
|
||||||
|
|
||||||
const onBodyWillChange = useCallback((event: any) => {
|
const onBodyWillChange = useCallback((event: any) => {
|
||||||
handleProvisionalFlag();
|
handleProvisionalFlag();
|
||||||
@@ -351,14 +345,6 @@ function NoteEditor(props: NoteEditorProps) {
|
|||||||
return <div style={emptyDivStyle}></div>;
|
return <div style={emptyDivStyle}></div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderNoteToolbar() {
|
|
||||||
return <NoteToolbar
|
|
||||||
themeId={props.themeId}
|
|
||||||
// note={formNote}
|
|
||||||
style={toolbarStyle}
|
|
||||||
/>;
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderTagButton() {
|
function renderTagButton() {
|
||||||
return <ToolbarButton
|
return <ToolbarButton
|
||||||
themeId={props.themeId}
|
themeId={props.themeId}
|
||||||
@@ -377,26 +363,6 @@ function NoteEditor(props: NoteEditorProps) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderTitleBar() {
|
|
||||||
const theme = themeStyle(props.themeId);
|
|
||||||
const titleBarDate = <span style={styles.titleDate}>{time.formatMsToLocal(formNote.user_updated_time)}</span>;
|
|
||||||
return (
|
|
||||||
<div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', height: theme.topRowHeight }}>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
ref={titleInputRef}
|
|
||||||
placeholder={props.isProvisional ? _('Creating new %s...', formNote.is_todo ? _('to-do') : _('note')) : ''}
|
|
||||||
style={styles.titleInput}
|
|
||||||
onChange={onTitleChange}
|
|
||||||
onKeyDown={onTitleKeydown}
|
|
||||||
value={formNote.title}
|
|
||||||
/>
|
|
||||||
{titleBarDate}
|
|
||||||
{renderNoteToolbar()}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const searchMarkers = useSearchMarkers(showLocalSearch, localSearchMarkerOptions, props.searches, props.selectedSearchId, props.highlightedWords);
|
const searchMarkers = useSearchMarkers(showLocalSearch, localSearchMarkerOptions, props.searches, props.selectedSearchId, props.highlightedWords);
|
||||||
|
|
||||||
const editorProps:NoteBodyEditorProps = {
|
const editorProps:NoteBodyEditorProps = {
|
||||||
@@ -546,7 +512,15 @@ function NoteEditor(props: NoteEditorProps) {
|
|||||||
<div style={styles.root} onDrop={onDrop}>
|
<div style={styles.root} onDrop={onDrop}>
|
||||||
<div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
|
<div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
|
||||||
{renderResourceWatchingNotification()}
|
{renderResourceWatchingNotification()}
|
||||||
{renderTitleBar()}
|
<NoteTitleBar
|
||||||
|
titleInputRef={titleInputRef}
|
||||||
|
themeId={props.themeId}
|
||||||
|
isProvisional={props.isProvisional}
|
||||||
|
noteIsTodo={formNote.is_todo}
|
||||||
|
noteTitle={formNote.title}
|
||||||
|
noteUserUpdatedTime={formNote.user_updated_time}
|
||||||
|
onTitleChange={onTitleChange}
|
||||||
|
/>
|
||||||
{renderSearchInfo()}
|
{renderSearchInfo()}
|
||||||
<div style={{ display: 'flex', flex: 1 }}>
|
<div style={{ display: 'flex', flex: 1 }}>
|
||||||
{editor}
|
{editor}
|
||||||
|
98
ElectronClient/gui/NoteEditor/NoteTitle/NoteTitleBar.tsx
Normal file
98
ElectronClient/gui/NoteEditor/NoteTitle/NoteTitleBar.tsx
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { _ } from 'lib/locale';
|
||||||
|
import CommandService from 'lib/services/CommandService';
|
||||||
|
import { ChangeEvent, useCallback } from 'react';
|
||||||
|
import NoteToolbar from '../../NoteToolbar/NoteToolbar';
|
||||||
|
import { buildStyle } from 'lib/theme';
|
||||||
|
import time from 'lib/time';
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
themeId: number,
|
||||||
|
noteUserUpdatedTime: number,
|
||||||
|
noteTitle: string,
|
||||||
|
noteIsTodo: number,
|
||||||
|
isProvisional: boolean,
|
||||||
|
titleInputRef: any,
|
||||||
|
onTitleChange(event: ChangeEvent<HTMLInputElement>):void,
|
||||||
|
}
|
||||||
|
|
||||||
|
function styles_(props: Props) {
|
||||||
|
return buildStyle(['NoteEditorTitleBar'], props.themeId, (theme: any) => {
|
||||||
|
return {
|
||||||
|
root: {
|
||||||
|
display: 'flex', flexDirection: 'row', alignItems: 'center', height: theme.topRowHeight,
|
||||||
|
},
|
||||||
|
titleInput: {
|
||||||
|
flex: 1,
|
||||||
|
display: 'inline-block',
|
||||||
|
paddingTop: 5,
|
||||||
|
minHeight: 35,
|
||||||
|
boxSizing: 'border-box',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
paddingBottom: 5,
|
||||||
|
paddingLeft: 0,
|
||||||
|
paddingRight: 8,
|
||||||
|
marginLeft: 5,
|
||||||
|
color: theme.textStyle.color,
|
||||||
|
fontSize: Math.round(theme.textStyle.fontSize * 1.5),
|
||||||
|
backgroundColor: theme.backgroundColor,
|
||||||
|
border: 'none',
|
||||||
|
},
|
||||||
|
|
||||||
|
titleDate: {
|
||||||
|
...theme.textStyle,
|
||||||
|
color: theme.colorFaded,
|
||||||
|
paddingLeft: 10,
|
||||||
|
paddingRight: 10,
|
||||||
|
},
|
||||||
|
toolbarStyle: {
|
||||||
|
marginBottom: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function NoteTitleBar(props:Props) {
|
||||||
|
const styles = styles_(props);
|
||||||
|
|
||||||
|
const onTitleKeydown = useCallback((event:any) => {
|
||||||
|
const keyCode = event.keyCode;
|
||||||
|
|
||||||
|
if (keyCode === 9) { // TAB
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
if (event.shiftKey) {
|
||||||
|
CommandService.instance().execute('focusElement', 'noteList');
|
||||||
|
} else {
|
||||||
|
CommandService.instance().execute('focusElement', 'noteBody');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
function renderTitleBarDate() {
|
||||||
|
return <span style={styles.titleDate}>{time.formatMsToLocal(props.noteUserUpdatedTime)}</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderNoteToolbar() {
|
||||||
|
return <NoteToolbar
|
||||||
|
themeId={props.themeId}
|
||||||
|
style={styles.toolbarStyle}
|
||||||
|
/>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div style={styles.root}>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
ref={props.titleInputRef}
|
||||||
|
placeholder={props.isProvisional ? _('Creating new %s...', props.noteIsTodo ? _('to-do') : _('note')) : ''}
|
||||||
|
style={styles.titleInput}
|
||||||
|
onChange={props.onTitleChange}
|
||||||
|
onKeyDown={onTitleKeydown}
|
||||||
|
value={props.noteTitle}
|
||||||
|
/>
|
||||||
|
{renderTitleBarDate()}
|
||||||
|
{renderNoteToolbar()}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@@ -2,7 +2,7 @@ import { useEffect } from 'react';
|
|||||||
import { FormNote, ScrollOptionTypes } from './types';
|
import { FormNote, ScrollOptionTypes } from './types';
|
||||||
import editorCommandDeclarations from '../commands/editorCommandDeclarations';
|
import editorCommandDeclarations from '../commands/editorCommandDeclarations';
|
||||||
import CommandService, { CommandDeclaration, CommandRuntime, CommandContext } from 'lib/services/CommandService';
|
import CommandService, { CommandDeclaration, CommandRuntime, CommandContext } from 'lib/services/CommandService';
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
|
|
||||||
const commandsWithDependencies = [
|
const commandsWithDependencies = [
|
||||||
|
@@ -5,7 +5,7 @@ import { _ } from 'lib/locale';
|
|||||||
const { ItemList } = require('../ItemList.min.js');
|
const { ItemList } = require('../ItemList.min.js');
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
const BaseModel = require('lib/BaseModel');
|
const BaseModel = require('lib/BaseModel');
|
||||||
const bridge = require('electron').remote.require('./bridge').default;
|
const bridge = require('electron').remote.require('./bridge').default;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
const React = require('react');
|
const React = require('react');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const DialogButtonRow = require('./DialogButtonRow.min');
|
const DialogButtonRow = require('./DialogButtonRow.min');
|
||||||
const Datetime = require('react-datetime');
|
const Datetime = require('react-datetime');
|
||||||
const Note = require('lib/models/Note');
|
const Note = require('lib/models/Note');
|
||||||
|
@@ -11,7 +11,7 @@ const Setting = require('lib/models/Setting').default;
|
|||||||
const RevisionService = require('lib/services/RevisionService');
|
const RevisionService = require('lib/services/RevisionService');
|
||||||
const shared = require('lib/components/shared/note-screen-shared.js');
|
const shared = require('lib/components/shared/note-screen-shared.js');
|
||||||
const { MarkupToHtml } = require('lib/joplin-renderer');
|
const { MarkupToHtml } = require('lib/joplin-renderer');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const ReactTooltip = require('react-tooltip');
|
const ReactTooltip = require('react-tooltip');
|
||||||
const { urlDecode, substrWithEllipsis } = require('lib/string-utils');
|
const { urlDecode, substrWithEllipsis } = require('lib/string-utils');
|
||||||
const bridge = require('electron').remote.require('./bridge').default;
|
const bridge = require('electron').remote.require('./bridge').default;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
const React = require('react');
|
const React = require('react');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
|
|
||||||
class NoteStatusBarComponent extends React.Component {
|
class NoteStatusBarComponent extends React.Component {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
const React = require('react');
|
const React = require('react');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { themeStyle } = require('lib/theme');
|
const { themeStyle } = require('lib/theme');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Datetime = require('react-datetime');
|
const Datetime = require('react-datetime');
|
||||||
const CreatableSelect = require('react-select/lib/Creatable').default;
|
const CreatableSelect = require('react-select/lib/Creatable').default;
|
||||||
const Select = require('react-select').default;
|
const Select = require('react-select').default;
|
||||||
|
@@ -0,0 +1,39 @@
|
|||||||
|
// Provides spell checking feature via the native Electron built-in spell checker
|
||||||
|
|
||||||
|
import SpellCheckerServiceDriverBase from 'lib/services/spellChecker/SpellCheckerServiceDriverBase';
|
||||||
|
import bridge from '../bridge';
|
||||||
|
|
||||||
|
export default class SpellCheckerServiceDriverNative extends SpellCheckerServiceDriverBase {
|
||||||
|
|
||||||
|
private session():any {
|
||||||
|
return bridge().window().webContents.session;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get availableLanguages():string[] {
|
||||||
|
return this.session().availableSpellCheckerLanguages;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Language can be set to '' to disable spell-checking
|
||||||
|
public setLanguage(v:string) {
|
||||||
|
// If we pass an empty array, it disables spell checking
|
||||||
|
// https://github.com/electron/electron/issues/25228
|
||||||
|
this.session().setSpellCheckerLanguages(v ? [v] : []);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get language():string {
|
||||||
|
const languages = this.session().getSpellCheckerLanguages();
|
||||||
|
return languages.length ? languages[0] : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public makeMenuItem(item:any):any {
|
||||||
|
const MenuItem = bridge().MenuItem;
|
||||||
|
return new MenuItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public addWordToSpellCheckerDictionary(_language:string, word:string) {
|
||||||
|
// Actually on Electron all languages share the same dictionary, or
|
||||||
|
// perhaps it's added to the currently active language.
|
||||||
|
this.session().addWordToSpellCheckerDictionary(word);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -18,7 +18,7 @@ const Note = require('lib/models/Note.js');
|
|||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require('lib/models/Tag.js');
|
||||||
const { splitCommandString } = require('lib/string-utils.js');
|
const { splitCommandString } = require('lib/string-utils.js');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const BaseSyncTarget = require('lib/BaseSyncTarget.js');
|
const BaseSyncTarget = require('lib/BaseSyncTarget.js');
|
||||||
const reduxSharedMiddleware = require('lib/components/shared/reduxSharedMiddleware');
|
const reduxSharedMiddleware = require('lib/components/shared/reduxSharedMiddleware');
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
const { Database } = require('lib/database.js');
|
const { Database } = require('lib/database.js');
|
||||||
const uuid = require('lib/uuid').default;
|
const uuid = require('lib/uuid').default;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Mutex = require('async-mutex').Mutex;
|
const Mutex = require('async-mutex').Mutex;
|
||||||
|
|
||||||
class BaseModel {
|
class BaseModel {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const JoplinError = require('lib/JoplinError');
|
const JoplinError = require('lib/JoplinError');
|
||||||
const { time } = require('lib/time-utils');
|
const time = require('lib/time').default;
|
||||||
const EventDispatcher = require('lib/EventDispatcher');
|
const EventDispatcher = require('lib/EventDispatcher');
|
||||||
|
|
||||||
class DropboxApi {
|
class DropboxApi {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const moment = require('moment');
|
const moment = require('moment');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { FsDriverDummy } = require('lib/fs-driver-dummy.js');
|
const { FsDriverDummy } = require('lib/fs-driver-dummy.js');
|
||||||
|
|
||||||
export enum TargetType {
|
export enum TargetType {
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
// whenever the update() function is called, and in mobile it's called for
|
// whenever the update() function is called, and in mobile it's called for
|
||||||
// example on the Redux action middleware or when the app gets focus.
|
// example on the Redux action middleware or when the app gets focus.
|
||||||
|
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
type IntervalId = number;
|
type IntervalId = number;
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ const ResourceLocalState = require('lib/models/ResourceLocalState.js');
|
|||||||
const MasterKey = require('lib/models/MasterKey.js');
|
const MasterKey = require('lib/models/MasterKey.js');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const JoplinError = require('lib/JoplinError');
|
const JoplinError = require('lib/JoplinError');
|
||||||
const TaskQueue = require('lib/TaskQueue');
|
const TaskQueue = require('lib/TaskQueue');
|
||||||
const { Dirnames } = require('lib/services/synchronizer/utils/types');
|
const { Dirnames } = require('lib/services/synchronizer/utils/types');
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Mustache = require('mustache');
|
const Mustache = require('mustache');
|
||||||
|
|
||||||
const TemplateUtils = {};
|
const TemplateUtils = {};
|
||||||
|
@@ -5,7 +5,7 @@ const { View, Button, Text } = require('react-native');
|
|||||||
|
|
||||||
const PopupDialog = require('react-native-popup-dialog').default;
|
const PopupDialog = require('react-native-popup-dialog').default;
|
||||||
const { DialogTitle, DialogButton } = require('react-native-popup-dialog');
|
const { DialogTitle, DialogButton } = require('react-native-popup-dialog');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const DateTimePickerModal = require('react-native-modal-datetime-picker').default;
|
const DateTimePickerModal = require('react-native-modal-datetime-picker').default;
|
||||||
|
|
||||||
export default class SelectDateTimeDialog extends React.PureComponent<any, any> {
|
export default class SelectDateTimeDialog extends React.PureComponent<any, any> {
|
||||||
|
@@ -4,7 +4,7 @@ const { connect } = require('react-redux');
|
|||||||
const { Text, TouchableOpacity, View, StyleSheet } = require('react-native');
|
const { Text, TouchableOpacity, View, StyleSheet } = require('react-native');
|
||||||
const { Checkbox } = require('lib/components/checkbox.js');
|
const { Checkbox } = require('lib/components/checkbox.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { themeStyle } = require('lib/components/global-style.js');
|
const { themeStyle } = require('lib/components/global-style.js');
|
||||||
|
|
||||||
class NoteItemComponent extends Component {
|
class NoteItemComponent extends Component {
|
||||||
|
@@ -4,7 +4,7 @@ const { connect } = require('react-redux');
|
|||||||
const { FlatList, Text, StyleSheet, Button, View } = require('react-native');
|
const { FlatList, Text, StyleSheet, Button, View } = require('react-native');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { NoteItem } = require('lib/components/note-item.js');
|
const { NoteItem } = require('lib/components/note-item.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { themeStyle } = require('lib/components/global-style.js');
|
const { themeStyle } = require('lib/components/global-style.js');
|
||||||
|
|
||||||
class NoteListComponent extends Component {
|
class NoteListComponent extends Component {
|
||||||
|
@@ -26,7 +26,7 @@ const { fileExtension, safeFileExtension } = require('lib/path-utils');
|
|||||||
const mimeUtils = require('lib/mime-utils.js').mime;
|
const mimeUtils = require('lib/mime-utils.js').mime;
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const NoteTagsDialog = require('lib/components/screens/NoteTagsDialog');
|
const NoteTagsDialog = require('lib/components/screens/NoteTagsDialog');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { Checkbox } = require('lib/components/checkbox.js');
|
const { Checkbox } = require('lib/components/checkbox.js');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
|
@@ -14,7 +14,7 @@ const { reg } = require('lib/registry.js');
|
|||||||
const NavService = require('lib/services/NavService.js');
|
const NavService = require('lib/services/NavService.js');
|
||||||
const VersionInfo = require('react-native-version-info').default;
|
const VersionInfo = require('react-native-version-info').default;
|
||||||
const { ReportService } = require('lib/services/report.js');
|
const { ReportService } = require('lib/services/report.js');
|
||||||
const { time } = require('lib/time-utils');
|
const time = require('lib/time').default;
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
||||||
const RNFS = require('react-native-fs');
|
const RNFS = require('react-native-fs');
|
||||||
|
@@ -7,7 +7,7 @@ const { ScreenHeader } = require('lib/components/screen-header.js');
|
|||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
||||||
const { themeStyle } = require('lib/components/global-style.js');
|
const { themeStyle } = require('lib/components/global-style.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const shared = require('lib/components/shared/encryption-config-shared.js');
|
const shared = require('lib/components/shared/encryption-config-shared.js');
|
||||||
const { dialogs } = require('lib/dialogs.js');
|
const { dialogs } = require('lib/dialogs.js');
|
||||||
const DialogBox = require('react-native-dialogbox').default;
|
const DialogBox = require('react-native-dialogbox').default;
|
||||||
|
@@ -4,7 +4,7 @@ const { FlatList, View, Text, Button, StyleSheet, Platform } = require('react-na
|
|||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const { time } = require('lib/time-utils');
|
const time = require('lib/time').default;
|
||||||
const { themeStyle } = require('lib/components/global-style.js');
|
const { themeStyle } = require('lib/components/global-style.js');
|
||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Mutex = require('async-mutex').Mutex;
|
const Mutex = require('async-mutex').Mutex;
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const JoplinError = require('lib/JoplinError');
|
const JoplinError = require('lib/JoplinError');
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const { basicDelta } = require('lib/file-api');
|
const { basicDelta } = require('lib/file-api');
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@ const shim = require('lib/shim').default;
|
|||||||
const BaseItem = require('lib/models/BaseItem.js');
|
const BaseItem = require('lib/models/BaseItem.js');
|
||||||
const JoplinError = require('lib/JoplinError');
|
const JoplinError = require('lib/JoplinError');
|
||||||
const ArrayUtils = require('lib/ArrayUtils');
|
const ArrayUtils = require('lib/ArrayUtils');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
const Mutex = require('async-mutex').Mutex;
|
const Mutex = require('async-mutex').Mutex;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const { filename, fileExtension } = require('lib/path-utils');
|
const { filename, fileExtension } = require('lib/path-utils');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
const md5 = require('md5');
|
const md5 = require('md5');
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { resolve as nodeResolve } from 'path';
|
import { resolve as nodeResolve } from 'path';
|
||||||
|
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const FsDriverBase = require('lib/fs-driver-base');
|
const FsDriverBase = require('lib/fs-driver-base');
|
||||||
|
|
||||||
export default class FsDriverNode extends FsDriverBase {
|
export default class FsDriverNode extends FsDriverBase {
|
||||||
|
@@ -8,7 +8,7 @@ const Setting = require('lib/models/Setting').default;
|
|||||||
const { MarkupToHtml } = require('lib/joplin-renderer');
|
const { MarkupToHtml } = require('lib/joplin-renderer');
|
||||||
const { enexXmlToMd } = require('./import-enex-md-gen.js');
|
const { enexXmlToMd } = require('./import-enex-md-gen.js');
|
||||||
const { enexXmlToHtml } = require('./import-enex-html-gen.js');
|
const { enexXmlToHtml } = require('./import-enex-html-gen.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Levenshtein = require('levenshtein');
|
const Levenshtein = require('levenshtein');
|
||||||
const md5 = require('md5');
|
const md5 = require('md5');
|
||||||
const { Base64Decode } = require('base64-stream');
|
const { Base64Decode } = require('base64-stream');
|
||||||
|
@@ -4,6 +4,10 @@ interface StringToStringMap {
|
|||||||
[key:string]: string,
|
[key:string]: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface CodeToCountryMap {
|
||||||
|
[key:string]: string[],
|
||||||
|
}
|
||||||
|
|
||||||
const codeToLanguageE_:StringToStringMap = {};
|
const codeToLanguageE_:StringToStringMap = {};
|
||||||
codeToLanguageE_['aa'] = 'Afar';
|
codeToLanguageE_['aa'] = 'Afar';
|
||||||
codeToLanguageE_['ab'] = 'Abkhazian';
|
codeToLanguageE_['ab'] = 'Abkhazian';
|
||||||
@@ -176,12 +180,257 @@ codeToLanguage_['et'] = 'Eesti Keel';
|
|||||||
codeToLanguage_['vi'] = 'Tiếng Việt';
|
codeToLanguage_['vi'] = 'Tiếng Việt';
|
||||||
codeToLanguage_['hu'] = 'Magyar';
|
codeToLanguage_['hu'] = 'Magyar';
|
||||||
|
|
||||||
const codeToCountry_:StringToStringMap = {};
|
const codeToCountry_:CodeToCountryMap = {
|
||||||
codeToCountry_['BR'] = 'Brasil';
|
AD: ['Andorra', 'Andorra'],
|
||||||
codeToCountry_['CR'] = 'Costa Rica';
|
AE: ['United Arab Emirates', 'دولة الإمارات العربيّة المتّحدة'],
|
||||||
codeToCountry_['CN'] = '中国';
|
AF: ['Afghanistan', 'د افغانستان اسلامي دولتدولت اسلامی افغانستان, جمهوری اسلامی افغانستان'],
|
||||||
codeToCountry_['GB'] = 'UK';
|
AG: ['Antigua and Barbuda', 'Antigua and Barbuda'],
|
||||||
codeToCountry_['US'] = 'US';
|
AI: ['Anguilla', 'Anguilla'],
|
||||||
|
AL: ['Albania', 'Shqipëria'],
|
||||||
|
AM: ['Armenia', 'Հայաստան'],
|
||||||
|
AO: ['Angola', 'Angola'],
|
||||||
|
AQ: ['Antarctica', 'Antarctica, Antártico, Antarctique, Антарктике'],
|
||||||
|
AR: ['Argentina', 'Argentina'],
|
||||||
|
AS: ['American Samoa', 'American Samoa'],
|
||||||
|
AT: ['Austria', 'Österreich'],
|
||||||
|
AU: ['Australia', 'Australia'],
|
||||||
|
AW: ['Aruba', 'Aruba'],
|
||||||
|
AX: ['Aland Islands', 'Åland'],
|
||||||
|
AZ: ['Azerbaijan', 'Azərbaycan'],
|
||||||
|
BA: ['Bosnia and Herzegovina', 'Bosna i Hercegovina'],
|
||||||
|
BB: ['Barbados', 'Barbados'],
|
||||||
|
BD: ['Bangladesh', 'গণপ্রজাতন্ত্রী বাংলাদেশ'],
|
||||||
|
BE: ['Belgium', 'België, Belgique, Belgien'],
|
||||||
|
BF: ['Burkina Faso', 'Burkina Faso'],
|
||||||
|
BG: ['Bulgaria', 'България'],
|
||||||
|
BH: ['Bahrain', 'البحرين'],
|
||||||
|
BI: ['Burundi', 'Burundi'],
|
||||||
|
BJ: ['Benin', 'Bénin'],
|
||||||
|
BL: ['Saint-Barthélemy', 'Saint-Barthélemy'],
|
||||||
|
BM: ['Bermuda', 'Bermuda'],
|
||||||
|
BN: ['Brunei Darussalam', 'Brunei Darussalam'],
|
||||||
|
BO: ['Bolivia', 'Bolivia, Bulibiya, Volívia, Wuliwya'],
|
||||||
|
BQ: ['Caribbean Netherlands', 'Caribisch Nederland'],
|
||||||
|
BR: ['Brazil', 'Brasil'],
|
||||||
|
BS: ['Bahamas', 'Bahamas'],
|
||||||
|
BT: ['Bhutan', 'འབྲུག་ཡུལ'],
|
||||||
|
BV: ['Bouvet Island', 'Bouvetøya'],
|
||||||
|
BW: ['Botswana', 'Botswana'],
|
||||||
|
BY: ['Belarus', 'Беларусь'],
|
||||||
|
BZ: ['Belize', 'Belize'],
|
||||||
|
CA: ['Canada', 'Canada'],
|
||||||
|
CC: ['Cocos (Keeling) Islands', 'Cocos (Keeling) Islands'],
|
||||||
|
CD: ['Democratic Republic of the Congo (Congo-Kinshasa, former Zaire)', 'République Démocratique du Congo'],
|
||||||
|
CF: ['Centrafrican Republic', 'République centrafricaine, Ködörösêse tî Bêafrîka'],
|
||||||
|
CG: ['Republic of the Congo (Congo-Brazzaville)', 'République du Congo'],
|
||||||
|
CH: ['Switzerland', 'Schweiz, Suisse, Svizzera, Svizra'],
|
||||||
|
CI: ['Côte d\'Ivoire', 'Côte d\'Ivoire'],
|
||||||
|
CK: ['Cook Islands', 'Cook Islands, Kūki ʻĀirani'],
|
||||||
|
CL: ['Chile', 'Chile'],
|
||||||
|
CM: ['Cameroon', 'Cameroun, Cameroon'],
|
||||||
|
CN: ['China', '中国'],
|
||||||
|
CO: ['Colombia', 'Colombia'],
|
||||||
|
CR: ['Costa Rica', 'Costa Rica'],
|
||||||
|
CU: ['Cuba', 'Cuba'],
|
||||||
|
CV: ['Cabo Verde', 'Cabo Verde'],
|
||||||
|
CW: ['Curaçao', 'Curaçao'],
|
||||||
|
CX: ['Christmas Island', 'Christmas Island'],
|
||||||
|
CY: ['Cyprus', 'Κύπρος, Kibris'],
|
||||||
|
CZ: ['Czech Republic', 'Česká republika'],
|
||||||
|
DE: ['Germany', 'Deutschland'],
|
||||||
|
DJ: ['Djibouti', 'Djibouti, جيبوتي, Jabuuti, Gabuutih'],
|
||||||
|
DK: ['Denmark', 'Danmark'],
|
||||||
|
DM: ['Dominica', 'Dominica'],
|
||||||
|
DO: ['Dominican Republic', 'República Dominicana'],
|
||||||
|
DZ: ['Algeria', 'الجزائر'],
|
||||||
|
EC: ['Ecuador', 'Ecuador'],
|
||||||
|
EE: ['Estonia', 'Eesti'],
|
||||||
|
EG: ['Egypt', 'مصر'],
|
||||||
|
EH: ['Western Sahara', 'Sahara Occidental'],
|
||||||
|
ER: ['Eritrea', 'ኤርትራ, إرتريا, Eritrea'],
|
||||||
|
ES: ['Spain', 'España'],
|
||||||
|
ET: ['Ethiopia', 'ኢትዮጵያ, Itoophiyaa'],
|
||||||
|
FI: ['Finland', 'Suomi'],
|
||||||
|
FJ: ['Fiji', 'Fiji'],
|
||||||
|
FK: ['Falkland Islands', 'Falkland Islands'],
|
||||||
|
FM: ['Micronesia (Federated States of)', 'Micronesia'],
|
||||||
|
FO: ['Faroe Islands', 'Føroyar, Færøerne'],
|
||||||
|
FR: ['France', 'France'],
|
||||||
|
GA: ['Gabon', 'Gabon'],
|
||||||
|
GB: ['United Kingdom', 'United Kingdom'],
|
||||||
|
GD: ['Grenada', 'Grenada'],
|
||||||
|
GE: ['Georgia', 'საქართველო'],
|
||||||
|
GF: ['French Guiana', 'Guyane française'],
|
||||||
|
GG: ['Guernsey', 'Guernsey'],
|
||||||
|
GH: ['Ghana', 'Ghana'],
|
||||||
|
GI: ['Gibraltar', 'Gibraltar'],
|
||||||
|
GL: ['Greenland', 'Kalaallit Nunaat, Grønland'],
|
||||||
|
GM: ['The Gambia', 'The Gambia'],
|
||||||
|
GN: ['Guinea', 'Guinée'],
|
||||||
|
GP: ['Guadeloupe', 'Guadeloupe'],
|
||||||
|
GQ: ['Equatorial Guinea', 'Guiena ecuatorial, Guinée équatoriale, Guiné Equatorial'],
|
||||||
|
GR: ['Greece', 'Ελλάδα'],
|
||||||
|
GS: ['South Georgia and the South Sandwich Islands', 'South Georgia and the South Sandwich Islands'],
|
||||||
|
GT: ['Guatemala', 'Guatemala'],
|
||||||
|
GU: ['Guam', 'Guam, Guåhån'],
|
||||||
|
GW: ['Guinea Bissau', 'Guiné-Bissau'],
|
||||||
|
GY: ['Guyana', 'Guyana'],
|
||||||
|
HK: ['Hong Kong (SAR of China)', '香港, Hong Kong'],
|
||||||
|
HM: ['Heard Island and McDonald Islands', 'Heard Island and McDonald Islands'],
|
||||||
|
HN: ['Honduras', 'Honduras'],
|
||||||
|
HR: ['Croatia', 'Hrvatska'],
|
||||||
|
HT: ['Haiti', 'Haïti, Ayiti'],
|
||||||
|
HU: ['Hungary', 'Magyarország'],
|
||||||
|
ID: ['Indonesia', 'Indonesia'],
|
||||||
|
IE: ['Ireland', 'Ireland, Éire'],
|
||||||
|
IL: ['Israel', 'ישראל'],
|
||||||
|
IM: ['Isle of Man', 'Isle of Man'],
|
||||||
|
IN: ['India', 'भारत, India'],
|
||||||
|
IO: ['British Indian Ocean Territory', 'British Indian Ocean Territory'],
|
||||||
|
IQ: ['Iraq', 'العراق, Iraq'],
|
||||||
|
IR: ['Iran', 'ایران'],
|
||||||
|
IS: ['Iceland', 'Ísland'],
|
||||||
|
IT: ['Italy', 'Italia'],
|
||||||
|
JE: ['Jersey', 'Jersey'],
|
||||||
|
JM: ['Jamaica', 'Jamaica'],
|
||||||
|
JO: ['Jordan', 'الأُرْدُن'],
|
||||||
|
JP: ['Japan', '日本'],
|
||||||
|
KE: ['Kenya', 'Kenya'],
|
||||||
|
KG: ['Kyrgyzstan', 'Кыргызстан, Киргизия'],
|
||||||
|
KH: ['Cambodia', 'កម្ពុជា'],
|
||||||
|
KI: ['Kiribati', 'Kiribati'],
|
||||||
|
KM: ['Comores', 'ﺍﻟﻘﻤﺮي, Comores, Komori'],
|
||||||
|
KN: ['Saint Kitts and Nevis', 'Saint Kitts and Nevis'],
|
||||||
|
KP: ['North Korea', '북조선'],
|
||||||
|
KR: ['South Korea', '대한민국'],
|
||||||
|
KW: ['Kuwait', 'الكويت'],
|
||||||
|
KY: ['Cayman Islands', 'Cayman Islands'],
|
||||||
|
KZ: ['Kazakhstan', 'Қазақстан, Казахстан'],
|
||||||
|
LA: ['Laos', 'ປະຊາຊົນລາວ'],
|
||||||
|
LB: ['Lebanon', 'لبنان, Liban'],
|
||||||
|
LC: ['Saint Lucia', 'Saint Lucia'],
|
||||||
|
LI: ['Liechtenstein', 'Liechtenstein'],
|
||||||
|
LK: ['Sri Lanka', 'ශ්රී ලංකා, இலங்கை'],
|
||||||
|
LR: ['Liberia', 'Liberia'],
|
||||||
|
LS: ['Lesotho', 'Lesotho'],
|
||||||
|
LT: ['Lithuania', 'Lietuva'],
|
||||||
|
LU: ['Luxembourg', 'Lëtzebuerg, Luxembourg, Luxemburg'],
|
||||||
|
LV: ['Latvia', 'Latvija'],
|
||||||
|
LY: ['Libya', 'ليبيا'],
|
||||||
|
MA: ['Morocco', 'Maroc, ⵍⵎⵖⵔⵉⴱ, المغرب'],
|
||||||
|
MC: ['Monaco', 'Monaco'],
|
||||||
|
MD: ['Moldova', 'Moldova, Молдавия'],
|
||||||
|
ME: ['Montenegro', 'Crna Gora, Црна Гора'],
|
||||||
|
MF: ['Saint Martin (French part)', 'Saint-Martin'],
|
||||||
|
MG: ['Madagascar', 'Madagasikara, Madagascar'],
|
||||||
|
MH: ['Marshall Islands', 'Marshall Islands'],
|
||||||
|
MK: ['North Macedonia', 'Северна Македонија'],
|
||||||
|
ML: ['Mali', 'Mali'],
|
||||||
|
MM: ['Myanmar', 'မြန်မာ'],
|
||||||
|
MN: ['Mongolia', 'Монгол Улс'],
|
||||||
|
MO: ['Macao (SAR of China)', '澳門, Macau'],
|
||||||
|
MP: ['Northern Mariana Islands', 'Northern Mariana Islands'],
|
||||||
|
MQ: ['Martinique', 'Martinique'],
|
||||||
|
MR: ['Mauritania', 'موريتانيا, Mauritanie'],
|
||||||
|
MS: ['Montserrat', 'Montserrat'],
|
||||||
|
MT: ['Malta', 'Malta'],
|
||||||
|
MU: ['Mauritius', 'Maurice, Mauritius'],
|
||||||
|
MV: ['Maldives', ''],
|
||||||
|
MW: ['Malawi', 'Malawi'],
|
||||||
|
MX: ['Mexico', 'México'],
|
||||||
|
MY: ['Malaysia', ''],
|
||||||
|
MZ: ['Mozambique', 'Mozambique'],
|
||||||
|
NA: ['Namibia', 'Namibia'],
|
||||||
|
NC: ['New Caledonia', 'Nouvelle-Calédonie'],
|
||||||
|
NE: ['Niger', 'Niger'],
|
||||||
|
NF: ['Norfolk Island', 'Norfolk Island'],
|
||||||
|
NG: ['Nigeria', 'Nigeria'],
|
||||||
|
NI: ['Nicaragua', 'Nicaragua'],
|
||||||
|
NL: ['The Netherlands', 'Nederland'],
|
||||||
|
NO: ['Norway', 'Norge, Noreg'],
|
||||||
|
NP: ['Nepal', ''],
|
||||||
|
NR: ['Nauru', 'Nauru'],
|
||||||
|
NU: ['Niue', 'Niue'],
|
||||||
|
NZ: ['New Zealand', 'New Zealand'],
|
||||||
|
OM: ['Oman', 'سلطنة عُمان'],
|
||||||
|
PA: ['Panama', 'Panama'],
|
||||||
|
PE: ['Peru', 'Perú'],
|
||||||
|
PF: ['French Polynesia', 'Polynésie française'],
|
||||||
|
PG: ['Papua New Guinea', 'Papua New Guinea'],
|
||||||
|
PH: ['Philippines', 'Philippines'],
|
||||||
|
PK: ['Pakistan', 'پاکستان'],
|
||||||
|
PL: ['Poland', 'Polska'],
|
||||||
|
PM: ['Saint Pierre and Miquelon', 'Saint-Pierre-et-Miquelon'],
|
||||||
|
PN: ['Pitcairn', 'Pitcairn'],
|
||||||
|
PR: ['Puerto Rico', 'Puerto Rico'],
|
||||||
|
PS: ['Palestinian Territory', 'Palestinian Territory'],
|
||||||
|
PT: ['Portugal', 'Portugal'],
|
||||||
|
PW: ['Palau', 'Palau'],
|
||||||
|
PY: ['Paraguay', 'Paraguay'],
|
||||||
|
QA: ['Qatar', 'قطر'],
|
||||||
|
RE: ['Reunion', 'La Réunion'],
|
||||||
|
RO: ['Romania', 'România'],
|
||||||
|
RS: ['Serbia', 'Србија'],
|
||||||
|
RU: ['Russia', 'Россия'],
|
||||||
|
RW: ['Rwanda', 'Rwanda'],
|
||||||
|
SA: ['Saudi Arabia', 'السعودية'],
|
||||||
|
SB: ['Solomon Islands', 'Solomon Islands'],
|
||||||
|
SC: ['Seychelles', 'Seychelles'],
|
||||||
|
SD: ['Sudan', 'السودان'],
|
||||||
|
SE: ['Sweden', 'Sverige'],
|
||||||
|
SG: ['Singapore', 'Singapore'],
|
||||||
|
SH: ['Saint Helena', 'Saint Helena'],
|
||||||
|
SI: ['Slovenia', 'Slovenija'],
|
||||||
|
SJ: ['Svalbard and Jan Mayen', 'Svalbard and Jan Mayen'],
|
||||||
|
SK: ['Slovakia', 'Slovensko'],
|
||||||
|
SL: ['Sierra Leone', 'Sierra Leone'],
|
||||||
|
SM: ['San Marino', 'San Marino'],
|
||||||
|
SN: ['Sénégal', 'Sénégal'],
|
||||||
|
SO: ['Somalia', 'Somalia, الصومال'],
|
||||||
|
SR: ['Suriname', 'Suriname'],
|
||||||
|
ST: ['São Tomé and Príncipe', 'São Tomé e Príncipe'],
|
||||||
|
SS: ['South Sudan', 'South Sudan'],
|
||||||
|
SV: ['El Salvador', 'El Salvador'],
|
||||||
|
SX: ['Saint Martin (Dutch part)', 'Sint Maarten'],
|
||||||
|
SY: ['Syria', 'سوريا, Sūriyya'],
|
||||||
|
SZ: ['eSwatini', 'eSwatini'],
|
||||||
|
TC: ['Turks and Caicos Islands', 'Turks and Caicos Islands'],
|
||||||
|
TD: ['Chad', 'Tchad, تشاد'],
|
||||||
|
TF: ['French Southern and Antarctic Lands', 'Terres australes et antarctiques françaises'],
|
||||||
|
TG: ['Togo', 'Togo'],
|
||||||
|
TH: ['Thailand', 'ประเทศไทย'],
|
||||||
|
TJ: ['Tajikistan', ','],
|
||||||
|
TK: ['Tokelau', 'Tokelau'],
|
||||||
|
TL: ['Timor-Leste', 'Timor-Leste'],
|
||||||
|
TM: ['Turkmenistan', 'Türkmenistan'],
|
||||||
|
TN: ['Tunisia', 'تونس, Tunisie'],
|
||||||
|
TO: ['Tonga', 'Tonga'],
|
||||||
|
TR: ['Turkey', 'Türkiye'],
|
||||||
|
TT: ['Trinidad and Tobago', 'Trinidad and Tobago'],
|
||||||
|
TV: ['Tuvalu', 'Tuvalu'],
|
||||||
|
TW: ['Taiwan', 'Taiwan'],
|
||||||
|
TZ: ['Tanzania', 'Tanzania'],
|
||||||
|
UA: ['Ukraine', 'Україна'],
|
||||||
|
UG: ['Uganda', 'Uganda'],
|
||||||
|
UM: ['United States Minor Outlying Islands', 'United States Minor Outlying Islands'],
|
||||||
|
US: ['United States of America', 'United States of America'],
|
||||||
|
UY: ['Uruguay', 'Uruguay'],
|
||||||
|
UZ: ['Uzbekistan', ''],
|
||||||
|
VA: ['City of the Vatican', 'Città del Vaticano'],
|
||||||
|
VC: ['Saint Vincent and the Grenadines', 'Saint Vincent and the Grenadines'],
|
||||||
|
VE: ['Venezuela', 'Venezuela'],
|
||||||
|
VG: ['British Virgin Islands', 'British Virgin Islands'],
|
||||||
|
VI: ['United States Virgin Islands', 'United States Virgin Islands'],
|
||||||
|
VN: ['Vietnam', 'Việt Nam'],
|
||||||
|
VU: ['Vanuatu', 'Vanuatu'],
|
||||||
|
WF: ['Wallis and Futuna', 'Wallis-et-Futuna'],
|
||||||
|
WS: ['Samoa', 'Samoa'],
|
||||||
|
YE: ['Yemen', 'اليَمَن'],
|
||||||
|
YT: ['Mayotte', 'Mayotte'],
|
||||||
|
ZA: ['South Africa', 'South Africa'],
|
||||||
|
ZM: ['Zambia', 'Zambia'],
|
||||||
|
ZW: ['Zimbabwe', 'Zimbabwe'],
|
||||||
|
};
|
||||||
|
|
||||||
let supportedLocales_:any = null;
|
let supportedLocales_:any = null;
|
||||||
let localeStats_:any = null;
|
let localeStats_:any = null;
|
||||||
@@ -249,7 +498,9 @@ function closestSupportedLocale(canonicalName:string, defaultToEnglish:boolean =
|
|||||||
}
|
}
|
||||||
|
|
||||||
function countryName(countryCode:string) {
|
function countryName(countryCode:string) {
|
||||||
return codeToCountry_[countryCode] ? codeToCountry_[countryCode] : '';
|
const r = codeToCountry_[countryCode] ? codeToCountry_[countryCode] : null;
|
||||||
|
if (!r) return '';
|
||||||
|
return r.length > 1 && !!r[1] ? r[1] : r[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
function languageNameInEnglish(languageCode:string) {
|
function languageNameInEnglish(languageCode:string) {
|
||||||
@@ -290,7 +541,14 @@ function countryDisplayName(canonicalName:string) {
|
|||||||
|
|
||||||
if (languageCode == 'zh' && (countryCode == '' || countryCode == 'TW')) extraString = '繁體'; // "Traditional" in "Traditional Chinese"
|
if (languageCode == 'zh' && (countryCode == '' || countryCode == 'TW')) extraString = '繁體'; // "Traditional" in "Traditional Chinese"
|
||||||
|
|
||||||
if (extraString) output += ` (${extraString})`;
|
if (extraString) {
|
||||||
|
output += ` (${extraString})`;
|
||||||
|
} else if (countryCode) {
|
||||||
|
// If we have a country code but couldn't match it to a country name,
|
||||||
|
// just display the full canonical name (applies for example to es-419
|
||||||
|
// for Latin American Spanish).
|
||||||
|
output += ` (${canonicalName})`;
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ const { Database } = require('lib/database.js');
|
|||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
const ItemChange = require('lib/models/ItemChange.js');
|
const ItemChange = require('lib/models/ItemChange.js');
|
||||||
const JoplinError = require('lib/JoplinError.js');
|
const JoplinError = require('lib/JoplinError.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const moment = require('moment');
|
const moment = require('moment');
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { Database } = require('lib/database.js');
|
const { Database } = require('lib/database.js');
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
|
@@ -6,7 +6,7 @@ const Resource = require('lib/models/Resource.js');
|
|||||||
const Setting = require('lib/models/Setting').default;
|
const Setting = require('lib/models/Setting').default;
|
||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const { pregQuote } = require('lib/string-utils.js');
|
const { pregQuote } = require('lib/string-utils.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const ArrayUtils = require('lib/ArrayUtils.js');
|
const ArrayUtils = require('lib/ArrayUtils.js');
|
||||||
const lodash = require('lodash');
|
const lodash = require('lodash');
|
||||||
|
@@ -3,7 +3,7 @@ import { _, supportedLocalesToLanguages, defaultLocale } from 'lib/locale';
|
|||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const { Database } = require('lib/database.js');
|
const { Database } = require('lib/database.js');
|
||||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
const ObjectUtils = require('lib/ObjectUtils');
|
const ObjectUtils = require('lib/ObjectUtils');
|
||||||
const { toTitleCase } = require('lib/string-utils.js');
|
const { toTitleCase } = require('lib/string-utils.js');
|
||||||
@@ -835,6 +835,9 @@ class Setting extends BaseModel {
|
|||||||
'camera.type': { value: 0, type: SettingItemType.Int, public: false, appTypes: ['mobile'] },
|
'camera.type': { value: 0, type: SettingItemType.Int, public: false, appTypes: ['mobile'] },
|
||||||
'camera.ratio': { value: '4:3', type: SettingItemType.String, public: false, appTypes: ['mobile'] },
|
'camera.ratio': { value: '4:3', type: SettingItemType.String, public: false, appTypes: ['mobile'] },
|
||||||
|
|
||||||
|
'spellChecker.enabled': { value: true, type: SettingItemType.Bool, public: false },
|
||||||
|
'spellChecker.language': { value: '', type: SettingItemType.String, public: false },
|
||||||
|
|
||||||
windowContentZoomFactor: {
|
windowContentZoomFactor: {
|
||||||
value: 100,
|
value: 100,
|
||||||
type: SettingItemType.Int,
|
type: SettingItemType.Int,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
const shim = require('lib/shim').default;
|
const shim = require('lib/shim').default;
|
||||||
const { stringify } = require('query-string');
|
const { stringify } = require('query-string');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
const { _ } = require('lib/locale');
|
const { _ } = require('lib/locale');
|
||||||
const urlUtils = require('lib/urlUtils.js');
|
const urlUtils = require('lib/urlUtils.js');
|
||||||
|
@@ -8,7 +8,7 @@ const { fileExtension, basename } = require('lib/path-utils');
|
|||||||
const spawn = require('child_process').spawn;
|
const spawn = require('child_process').spawn;
|
||||||
const chokidar = require('chokidar');
|
const chokidar = require('chokidar');
|
||||||
const bridge = require('electron').remote.require('./bridge').default;
|
const bridge = require('electron').remote.require('./bridge').default;
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { ErrorNotFound } = require('./rest/errors');
|
const { ErrorNotFound } = require('./rest/errors');
|
||||||
|
|
||||||
class ExternalEditWatcher {
|
class ExternalEditWatcher {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const { time } = require('lib/time-utils');
|
const time = require('lib/time').default;
|
||||||
const BaseItem = require('lib/models/BaseItem.js');
|
const BaseItem = require('lib/models/BaseItem.js');
|
||||||
const Alarm = require('lib/models/Alarm').default;
|
const Alarm = require('lib/models/Alarm').default;
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
interface Term {
|
interface Term {
|
||||||
name: string
|
name: string
|
||||||
|
@@ -0,0 +1,157 @@
|
|||||||
|
import Setting from 'lib/models/Setting';
|
||||||
|
import CommandService from '../CommandService';
|
||||||
|
import SpellCheckerServiceDriverBase from './SpellCheckerServiceDriverBase';
|
||||||
|
import { _, countryDisplayName } from 'lib/locale';
|
||||||
|
|
||||||
|
export default class SpellCheckerService {
|
||||||
|
|
||||||
|
private driver_:SpellCheckerServiceDriverBase;
|
||||||
|
|
||||||
|
private static instance_:SpellCheckerService;
|
||||||
|
|
||||||
|
public static instance():SpellCheckerService {
|
||||||
|
if (this.instance_) return this.instance_;
|
||||||
|
this.instance_ = new SpellCheckerService();
|
||||||
|
return this.instance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async initialize(driver:SpellCheckerServiceDriverBase) {
|
||||||
|
this.driver_ = driver;
|
||||||
|
this.setupDefaultLanguage();
|
||||||
|
this.applyStateToDriver();
|
||||||
|
}
|
||||||
|
|
||||||
|
private get defaultLanguage():string {
|
||||||
|
return 'en-US';
|
||||||
|
}
|
||||||
|
|
||||||
|
public setupDefaultLanguage() {
|
||||||
|
if (!Setting.value('spellChecker.language')) {
|
||||||
|
const l = this.driver_.language;
|
||||||
|
this.setLanguage(l ? l : this.defaultLanguage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get availableLanguages():string[] {
|
||||||
|
return this.driver_.availableLanguages;
|
||||||
|
}
|
||||||
|
|
||||||
|
private applyStateToDriver() {
|
||||||
|
this.driver_.setLanguage(this.enabled ? this.language : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
public setLanguage(language:string) {
|
||||||
|
Setting.setValue('spellChecker.language', language);
|
||||||
|
this.applyStateToDriver();
|
||||||
|
}
|
||||||
|
|
||||||
|
public get language():string {
|
||||||
|
return Setting.value('spellChecker.language');
|
||||||
|
}
|
||||||
|
|
||||||
|
public get enabled():boolean {
|
||||||
|
return Setting.value('spellChecker.enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
public toggleEnabled() {
|
||||||
|
Setting.toggle('spellChecker.enabled');
|
||||||
|
this.applyStateToDriver();
|
||||||
|
}
|
||||||
|
|
||||||
|
private makeMenuItem(item:any):any {
|
||||||
|
return this.driver_.makeMenuItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async addToDictionary(language:string, word:string) {
|
||||||
|
this.driver_.addWordToSpellCheckerDictionary(language, word);
|
||||||
|
}
|
||||||
|
|
||||||
|
public contextMenuItems<T>(misspelledWord:string, dictionarySuggestions:string[]):T[] {
|
||||||
|
if (!misspelledWord) return [];
|
||||||
|
|
||||||
|
const output = [];
|
||||||
|
|
||||||
|
output.push(this.makeMenuItem({ type: 'separator' }));
|
||||||
|
|
||||||
|
if (dictionarySuggestions.length) {
|
||||||
|
for (const suggestion of dictionarySuggestions) {
|
||||||
|
output.push(this.makeMenuItem({
|
||||||
|
label: suggestion,
|
||||||
|
click: () => {
|
||||||
|
CommandService.instance().execute('replaceSelection', suggestion);
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
output.push(this.makeMenuItem({
|
||||||
|
label: `(${_('No suggestions')})`,
|
||||||
|
enabled: false,
|
||||||
|
click: () => {},
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
output.push(this.makeMenuItem({ type: 'separator' }));
|
||||||
|
|
||||||
|
output.push(this.makeMenuItem({
|
||||||
|
label: _('Add to dictionary'),
|
||||||
|
click: () => {
|
||||||
|
this.addToDictionary(this.language, misspelledWord);
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
private changeLanguageMenuItems(selectedLanguage:string, enabled:boolean) {
|
||||||
|
const languageMenuItems = [];
|
||||||
|
|
||||||
|
for (const locale of this.driver_.availableLanguages) {
|
||||||
|
languageMenuItems.push({
|
||||||
|
label: countryDisplayName(locale),
|
||||||
|
type: 'radio',
|
||||||
|
checked: locale === selectedLanguage,
|
||||||
|
enabled: enabled,
|
||||||
|
click: () => {
|
||||||
|
this.setLanguage(locale);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
languageMenuItems.sort((a:any, b:any) => {
|
||||||
|
return a.label < b.label ? -1 : +1;
|
||||||
|
});
|
||||||
|
|
||||||
|
return languageMenuItems.map((item:any) => this.makeMenuItem(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
public spellCheckerConfigMenuItem(selectedLanguage:string, useSpellChecker:boolean) {
|
||||||
|
return this.makeMenuItem({
|
||||||
|
label: _('Spell checker'),
|
||||||
|
submenu: [
|
||||||
|
this.makeMenuItem({
|
||||||
|
label: _('Use spell checker'),
|
||||||
|
type: 'checkbox',
|
||||||
|
checked: useSpellChecker,
|
||||||
|
click: () => {
|
||||||
|
this.toggleEnabled();
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
this.makeMenuItem({
|
||||||
|
type: 'separator',
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Can be removed once it does work
|
||||||
|
this.makeMenuItem({
|
||||||
|
label: '⚠ Spell checker doesn\'t work in Markdown editor ⚠',
|
||||||
|
enabled: false,
|
||||||
|
}),
|
||||||
|
|
||||||
|
this.makeMenuItem({
|
||||||
|
type: 'separator',
|
||||||
|
}),
|
||||||
|
...this.changeLanguageMenuItems(selectedLanguage, useSpellChecker),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
export default class SpellCheckerServiceDriverBase {
|
||||||
|
|
||||||
|
public get availableLanguages():string[] {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
public setLanguage(_v:string) {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
public get language():string {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
public makeMenuItem(_item:any):any {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
public addWordToSpellCheckerDictionary(_language:string, _word:string) {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -2,7 +2,7 @@ import { Dirnames } from './utils/types';
|
|||||||
import shim from 'lib/shim';
|
import shim from 'lib/shim';
|
||||||
|
|
||||||
const JoplinError = require('lib/JoplinError');
|
const JoplinError = require('lib/JoplinError');
|
||||||
const { time } = require('lib/time-utils');
|
const time = require('lib/time').default;
|
||||||
const { fileExtension, filename } = require('lib/path-utils');
|
const { fileExtension, filename } = require('lib/path-utils');
|
||||||
|
|
||||||
export enum LockType {
|
export enum LockType {
|
||||||
|
@@ -120,7 +120,7 @@ const shim = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
fetchWithRetry: async function(fetchFn:Function, options:any = null) {
|
fetchWithRetry: async function(fetchFn:Function, options:any = null) {
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
|
|
||||||
if (!options) options = {};
|
if (!options) options = {};
|
||||||
if (!options.timeout) options.timeout = 1000 * 120; // ms
|
if (!options.timeout) options.timeout = 1000 * 120; // ms
|
||||||
|
@@ -1,18 +1,17 @@
|
|||||||
|
import shim from 'lib/shim';
|
||||||
const moment = require('moment');
|
const moment = require('moment');
|
||||||
const shim = require('lib/shim').default;
|
|
||||||
|
|
||||||
class Time {
|
class Time {
|
||||||
constructor() {
|
|
||||||
this.dateFormat_ = 'DD/MM/YYYY';
|
private dateFormat_:string = 'DD/MM/YYYY';
|
||||||
this.timeFormat_ = 'HH:mm';
|
private timeFormat_:string = 'HH:mm';
|
||||||
this.locale_ = 'en-us';
|
private locale_:string = 'en-us';
|
||||||
}
|
|
||||||
|
|
||||||
locale() {
|
locale() {
|
||||||
return this.locale_;
|
return this.locale_;
|
||||||
}
|
}
|
||||||
|
|
||||||
setLocale(v) {
|
setLocale(v:string) {
|
||||||
moment.locale(v);
|
moment.locale(v);
|
||||||
this.locale_ = v;
|
this.locale_ = v;
|
||||||
}
|
}
|
||||||
@@ -21,7 +20,7 @@ class Time {
|
|||||||
return this.dateFormat_;
|
return this.dateFormat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
setDateFormat(v) {
|
setDateFormat(v:string) {
|
||||||
this.dateFormat_ = v;
|
this.dateFormat_ = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +28,7 @@ class Time {
|
|||||||
return this.timeFormat_;
|
return this.timeFormat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeFormat(v) {
|
setTimeFormat(v:string) {
|
||||||
this.timeFormat_ = v;
|
this.timeFormat_ = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,7 +36,7 @@ class Time {
|
|||||||
return this.timeFormat() ? this.timeFormat().includes('HH') : true;
|
return this.timeFormat() ? this.timeFormat().includes('HH') : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
formatDateToLocal(date, format = null) {
|
formatDateToLocal(date:Date, format:string = null) {
|
||||||
return this.formatMsToLocal(date.getTime(), format);
|
return this.formatMsToLocal(date.getTime(), format);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,15 +52,15 @@ class Time {
|
|||||||
return Date.now();
|
return Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
unixMsToObject(ms) {
|
unixMsToObject(ms:number) {
|
||||||
return new Date(ms);
|
return new Date(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
unixMsToS(ms) {
|
unixMsToS(ms:number) {
|
||||||
return Math.floor(ms / 1000);
|
return Math.floor(ms / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
unixMsToIso(ms) {
|
unixMsToIso(ms:number) {
|
||||||
return (
|
return (
|
||||||
`${moment
|
`${moment
|
||||||
.unix(ms / 1000)
|
.unix(ms / 1000)
|
||||||
@@ -70,7 +69,7 @@ class Time {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
unixMsToIsoSec(ms) {
|
unixMsToIsoSec(ms:number) {
|
||||||
return (
|
return (
|
||||||
`${moment
|
`${moment
|
||||||
.unix(ms / 1000)
|
.unix(ms / 1000)
|
||||||
@@ -79,20 +78,20 @@ class Time {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
unixMsToLocalDateTime(ms) {
|
unixMsToLocalDateTime(ms:number) {
|
||||||
return moment.unix(ms / 1000).format('DD/MM/YYYY HH:mm');
|
return moment.unix(ms / 1000).format('DD/MM/YYYY HH:mm');
|
||||||
}
|
}
|
||||||
|
|
||||||
unixMsToLocalHms(ms) {
|
unixMsToLocalHms(ms:number) {
|
||||||
return moment.unix(ms / 1000).format('HH:mm:ss');
|
return moment.unix(ms / 1000).format('HH:mm:ss');
|
||||||
}
|
}
|
||||||
|
|
||||||
formatMsToLocal(ms, format = null) {
|
formatMsToLocal(ms:number, format:string = null) {
|
||||||
if (format === null) format = this.dateTimeFormat();
|
if (format === null) format = this.dateTimeFormat();
|
||||||
return moment(ms).format(format);
|
return moment(ms).format(format);
|
||||||
}
|
}
|
||||||
|
|
||||||
formatLocalToMs(localDateTime, format = null) {
|
formatLocalToMs(localDateTime:any, format:string = null) {
|
||||||
if (format === null) format = this.dateTimeFormat();
|
if (format === null) format = this.dateTimeFormat();
|
||||||
const m = moment(localDateTime, format);
|
const m = moment(localDateTime, format);
|
||||||
if (m.isValid()) return m.toDate().getTime();
|
if (m.isValid()) return m.toDate().getTime();
|
||||||
@@ -100,7 +99,7 @@ class Time {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mostly used as a utility function for the DateTime Electron component
|
// Mostly used as a utility function for the DateTime Electron component
|
||||||
anythingToDateTime(o, defaultValue = null) {
|
anythingToDateTime(o:any, defaultValue:Date = null) {
|
||||||
if (o && o.toDate) return o.toDate();
|
if (o && o.toDate) return o.toDate();
|
||||||
if (!o) return defaultValue;
|
if (!o) return defaultValue;
|
||||||
let m = moment(o, time.dateTimeFormat());
|
let m = moment(o, time.dateTimeFormat());
|
||||||
@@ -109,7 +108,7 @@ class Time {
|
|||||||
return m.isValid() ? m.toDate() : defaultValue;
|
return m.isValid() ? m.toDate() : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
msleep(ms) {
|
msleep(ms:number) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
shim.setTimeout(() => {
|
shim.setTimeout(() => {
|
||||||
resolve();
|
resolve();
|
||||||
@@ -117,17 +116,17 @@ class Time {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(seconds) {
|
sleep(seconds:number) {
|
||||||
return this.msleep(seconds * 1000);
|
return this.msleep(seconds * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
goBackInTime(startDate, n, period) {
|
goBackInTime(startDate:any, n:number, period:any) {
|
||||||
// period is a string (eg. "day", "week", "month", "year" ), n is an integer
|
// period is a string (eg. "day", "week", "month", "year" ), n is an integer
|
||||||
return moment(startDate).startOf(period).subtract(n, period).format('x');
|
return moment(startDate).startOf(period).subtract(n, period).format('x');
|
||||||
}
|
}
|
||||||
|
|
||||||
goForwardInTime(startDate, n, period) {
|
goForwardInTime(startDate:any, n:number, period:any) {
|
||||||
return moment(startDate).startOf(period).add(n, period).format('x');
|
return moment(startDate).startOf(period).add(n, period).format('x');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,4 +134,4 @@ class Time {
|
|||||||
|
|
||||||
const time = new Time();
|
const time = new Time();
|
||||||
|
|
||||||
module.exports = { time };
|
export default time;
|
@@ -13,7 +13,7 @@ const Alarm = require('lib/models/Alarm').default;
|
|||||||
const { createStore, applyMiddleware } = require('redux');
|
const { createStore, applyMiddleware } = require('redux');
|
||||||
const reduxSharedMiddleware = require('lib/components/shared/reduxSharedMiddleware');
|
const reduxSharedMiddleware = require('lib/components/shared/reduxSharedMiddleware');
|
||||||
const { shimInit } = require('lib/shim-init-react.js');
|
const { shimInit } = require('lib/shim-init-react.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const time = require('lib/time').default;
|
||||||
const { AppNav } = require('lib/components/app-nav.js');
|
const { AppNav } = require('lib/components/app-nav.js');
|
||||||
const Logger = require('lib/Logger').default;
|
const Logger = require('lib/Logger').default;
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
|
Reference in New Issue
Block a user