1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-24 20:19:10 +02:00

Compare commits

...

30 Commits

Author SHA1 Message Date
Laurent Cozic
deb300326b Android 2.6.6 2021-12-13 13:32:34 +01:00
Laurent Cozic
227c9dcfee Desktop release v2.6.6 2021-12-13 11:52:48 +01:00
Laurent Cozic
28c7b717f3 lock file 2021-12-13 11:52:35 +01:00
Helmut K. C. Tessarek
c499473467 All: fixes #5801: Links in flowchart Mermaid diagrams (#5830) 2021-12-13 10:38:12 +00:00
xaa
7fa278f875 Update fr_FR.po (#5750) 2021-12-13 10:36:07 +00:00
Helmut K. C. Tessarek
06e427fc5a All: Update Mermaid: 8.12.1 -> 8.13.5 (#5831) 2021-12-13 10:35:21 +00:00
Daeraxa
51f7dc9ab8 Desktop: Changed note sort buttons to 3px radius (#5771) 2021-12-13 10:34:54 +00:00
Laurent Cozic
eca964b03b Android 2.6.5 2021-12-13 10:41:32 +01:00
Laurent Cozic
bfcc02a769 Desktop release v2.6.5 2021-12-13 10:34:21 +01:00
Laurent Cozic
7c42688072 Merge branch 'dev' into release-2.6 2021-12-13 10:34:01 +01:00
Laurent Cozic
e0e93c436b All: Fixed "Invalid lock client type" error when migrating sync target 2021-12-13 10:32:22 +01:00
Daeraxa
78c5877c65 Docs: Added richtext editor improvement ideas (#5848) 2021-12-10 18:34:55 +00:00
Laurent Cozic
9767b659c2 Desktop release v2.6.4 2021-12-09 20:18:39 +01:00
Laurent Cozic
4b6210802b Tools: Trying to go back to windows-2016 to fix CI build 2021-12-09 20:18:38 +01:00
Laurent Cozic
9f0def64f3 Desktop release v2.6.3 2021-12-09 20:18:38 +01:00
Laurent Cozic
16c94d95cb Desktop release v2.6.4 2021-12-09 20:18:17 +01:00
Laurent Cozic
03c8942a74 Tools: Trying to go back to windows-2016 to fix CI build 2021-12-09 20:18:04 +01:00
Laurent Cozic
1626170ea6 Desktop release v2.6.3 2021-12-09 10:22:32 +01:00
Laurent Cozic
fd03ab4f47 Merge branch 'dev' into release-2.6 2021-12-09 10:22:09 +01:00
Laurent Cozic
684857752f Server v2.6.14 2021-12-09 10:20:47 +01:00
NiceYoyo
95f88d0f2c All: Translation: Update de_DE.po (#5829)
Added some translations and edited flagged ones. I also changed some translations from formal "Sie" to informal "Du", as it is used more often through the translation.
2021-12-05 22:28:16 -05:00
Laurent Cozic
3ddfa0b774 Doc: Added GSoC idea: Implement a toolbar for the mobile beta code editor 2021-12-03 19:15:16 +00:00
Laurent Cozic
35f684a1ee Server: Increase default MAX_TIME_DRIFT to 2000 2021-12-03 12:24:29 +00:00
Caleb John
aac044fc9c Desktop: Fixes #5311: Rich text editor flashing white when switching notes/editor (#5793) 2021-12-03 12:23:31 +00:00
Laurent Cozic
9cbc3b3096 Server v2.6.14 2021-12-02 16:30:06 +00:00
Laurent Cozic
122afd6d46 Server: Improved storage command 2021-12-02 11:27:22 +00:00
Laurent Cozic
75c67b7d78 Tools: Fixed getting the latest release from GitHub 2021-12-01 16:17:04 +00:00
Amin Vakil
33822295ef Tools: Use latest minor release of Postgres 13 in sample docker-compose files (#5797) 2021-12-01 13:52:38 +00:00
Stephanos Komnenos
a5b1255f45 Desktop: Allow flags for native wayland (#5804) 2021-12-01 13:51:42 +00:00
Laurent
62f4396ffe Tools: Use windows-latest to build desktop app on CI (#5809) 2021-12-01 13:51:11 +00:00
34 changed files with 1221 additions and 416 deletions

View File

@@ -6,7 +6,7 @@ version: '3'
services:
db:
image: postgres:13.1
image: postgres:13
command: postgres -c work_mem=100000
ports:
- "5432:5432"
@@ -14,7 +14,7 @@ services:
- POSTGRES_PASSWORD=joplin
- POSTGRES_USER=joplin
- POSTGRES_DB=joplin
# Use this to specify additional Postgres
# config parameters:
#

View File

@@ -18,7 +18,7 @@ services:
- POSTGRES_PORT=5432
- POSTGRES_HOST=localhost
db:
image: postgres:13.1
image: postgres:13
ports:
- "5432:5432"
environment:

View File

@@ -8,7 +8,7 @@ version: '3'
services:
db:
image: postgres:13.1
image: postgres:13
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:

View File

@@ -5,6 +5,7 @@ import MigrationHandler from '@joplin/lib/services/synchronizer/MigrationHandler
import ResourceFetcher from '@joplin/lib/services/ResourceFetcher';
import Synchronizer from '@joplin/lib/Synchronizer';
import { masterKeysWithoutPassword } from '@joplin/lib/services/e2ee/utils';
import { appTypeToLockType } from '@joplin/lib/services/synchronizer/LockHandler';
const { BaseCommand } = require('./base-command.js');
const { app } = require('./app.js');
const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js');
@@ -188,7 +189,7 @@ class Command extends BaseCommand {
sync.api(),
reg.db(),
sync.lockHandler(),
Setting.value('appType'),
appTypeToLockType(Setting.value('appType')),
Setting.value('clientId')
);

View File

@@ -356,8 +356,6 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
}, []);
useEffect(() => {
if (!editorReady) return () => {};
const theme = themeStyle(props.themeId);
const element = document.createElement('style');
@@ -491,11 +489,28 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
padding-top: ${theme.toolbarPadding}px;
padding-bottom: ${theme.toolbarPadding}px;
}
.joplin-tinymce .tox .tox-edit-area__iframe {
background-color: ${theme.backgroundColor} !important;
}
.joplin-tinymce .tox .tox-toolbar__primary {
/* This component sets an empty svg with a white background as the background
* which needs to be cleared to prevent it from flashing white in dark themes */
background: none;
background-color: ${theme.backgroundColor3} !important;
}
`));
return () => {
document.head.removeChild(element);
};
// editorReady is here because TinyMCE starts by initializing a blank iframe, which needs to be
// styled by us, otherwise users in dark mode get a bright white flash. During initialization
// our styling is overwritten which causes some elements to have the wrong styling. Removing the
// style and re-applying it on editorReady gives our styles precedence and prevents any flashing
//
// tl;dr: editorReady is used here because the css needs to be re-applied after TinyMCE init
}, [editorReady, props.themeId]);
// -----------------------------------------------------------------------------------------

View File

@@ -36,7 +36,7 @@ const StyledButton = styled(Button)`
const StyledPairButtonL = styled(Button)`
margin-left: 8px;
border-radius: 5px 0 0 5px;
border-radius: 3px 0 0 3px;
min-width: ${(props: any) => buttonSizePx(props)}px;
max-width: ${(props: any) => buttonSizePx(props)}px;
`;
@@ -44,7 +44,7 @@ const StyledPairButtonL = styled(Button)`
const StyledPairButtonR = styled(Button)`
min-width: 8px;
margin-left: 0px;
border-radius: 0 5px 5px 0;
border-radius: 0 3px 3px 0;
border-width: 1px 1px 1px 0;
width: auto;
`;

View File

@@ -202,6 +202,8 @@ document.addEventListener('click', function(event) {
if (webviewLib.handleInternalLink(event, anchor)) return;
event.preventDefault();
if (anchor.getAttribute('href')) webviewLib.options_.postMessage(anchor.getAttribute('href'));
// Depending on the chart type, the generated SVG contains an anchor element with xlink:href attribute.
if (anchor.getAttribute('xlink:href')) webviewLib.options_.postMessage(anchor.getAttribute('xlink:href'));
return;
}

View File

@@ -1,12 +1,12 @@
{
"name": "@joplin/app-desktop",
"version": "2.6.2",
"version": "2.6.6",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@joplin/app-desktop",
"version": "2.6.2",
"version": "2.6.6",
"license": "MIT",
"dependencies": {
"@electron/remote": "^2.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/app-desktop",
"version": "2.6.2",
"version": "2.6.6",
"description": "Joplin for Desktop",
"main": "main.js",
"private": true,

View File

@@ -146,8 +146,8 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2097660
versionName "2.6.4"
versionCode 2097662
versionName "2.6.6"
ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}

View File

@@ -1,5 +1,5 @@
module.exports = {
hash:"de3871f000c87478973d7cd0913bd3ff", files: {
hash:"dd2315568bb7795f97cee26a47e9b82b", files: {
'highlight.js/atom-one-dark-reasonable.css': { data: require('./highlight.js/atom-one-dark-reasonable.css.base64.js'), mime: 'text/css', encoding: 'base64' },
'highlight.js/atom-one-light.css': { data: require('./highlight.js/atom-one-light.css.base64.js'), mime: 'text/css', encoding: 'base64' },
'katex/fonts/KaTeX_AMS-Regular.woff2': { data: require('./katex/fonts/KaTeX_AMS-Regular.woff2.base64.js'), mime: 'application/octet-stream', encoding: 'base64' },

File diff suppressed because one or more lines are too long

View File

@@ -258,6 +258,20 @@ export default class BaseApplication {
continue;
}
if (arg.indexOf('--enable-features=') === 0) {
// Electron-specific flag - ignore it
// Allows users to run the app on native wayland
argv.splice(0, 1);
continue;
}
if (arg.indexOf('--ozone-platform=') === 0) {
// Electron-specific flag - ignore it
// Allows users to run the app on native wayland
argv.splice(0, 1);
continue;
}
if (arg.length && arg[0] == '-') {
throw new JoplinError(_('Unknown flag: %s', arg), 'flagError');
} else {

View File

@@ -1,5 +1,5 @@
import Logger from './Logger';
import LockHandler, { hasActiveLock, LockClientType, LockType } from './services/synchronizer/LockHandler';
import LockHandler, { appTypeToLockType, hasActiveLock, LockClientType, LockType } from './services/synchronizer/LockHandler';
import Setting, { AppType } from './models/Setting';
import shim from './shim';
import MigrationHandler from './services/synchronizer/MigrationHandler';
@@ -53,7 +53,7 @@ export default class Synchronizer {
private db_: JoplinDatabase;
private api_: FileApi;
private appType_: string;
private appType_: AppType;
private logger_: Logger = new Logger();
private state_: string = 'idle';
private cancelling_: boolean = false;
@@ -77,7 +77,7 @@ export default class Synchronizer {
public dispatch: Function;
public constructor(db: JoplinDatabase, api: FileApi, appType: string) {
public constructor(db: JoplinDatabase, api: FileApi, appType: AppType) {
this.db_ = db;
this.api_ = api;
this.appType_ = appType;
@@ -123,13 +123,7 @@ export default class Synchronizer {
private lockClientType(): LockClientType {
if (this.lockClientType_) return this.lockClientType_;
if (this.appType_ === AppType.Desktop) this.lockClientType_ = LockClientType.Desktop;
if (this.appType_ === AppType.Mobile) this.lockClientType_ = LockClientType.Mobile;
if (this.appType_ === AppType.Cli) this.lockClientType_ = LockClientType.Cli;
if (!this.lockClientType_) throw new Error(`Invalid client type: ${this.appType_}`);
this.lockClientType_ = appTypeToLockType(this.appType_);
return this.lockClientType_;
}
@@ -141,7 +135,7 @@ export default class Synchronizer {
maxResourceSize() {
if (this.maxResourceSize_ !== null) return this.maxResourceSize_;
return this.appType_ === 'mobile' ? 100 * 1000 * 1000 : Infinity;
return this.appType_ === AppType.Mobile ? 100 * 1000 * 1000 : Infinity;
}
public setShareService(v: ShareService) {

View File

@@ -104,6 +104,8 @@ document.addEventListener('click', function(event) {
if (webviewLib.handleInternalLink(event, anchor)) return;
event.preventDefault();
if (anchor.getAttribute('href')) webviewLib.options_.postMessage(anchor.getAttribute('href'));
// Depending on the chart type, the generated SVG contains an anchor element with xlink:href attribute.
if (anchor.getAttribute('xlink:href')) webviewLib.options_.postMessage(anchor.getAttribute('xlink:href'));
return;
}

View File

@@ -3,6 +3,7 @@ import shim from '../../shim';
import JoplinError from '../../JoplinError';
import time from '../../time';
import { FileApi } from '../../file-api';
import { AppType } from '../../models/Setting';
const { fileExtension, filename } = require('../../path-utils');
export enum LockType {
@@ -46,6 +47,13 @@ export function lockNameToObject(name: string, updatedTime: number = null): Lock
return lock;
}
export function appTypeToLockType(appType: AppType): LockClientType {
if (appType === AppType.Desktop) return LockClientType.Desktop;
if (appType === AppType.Mobile) return LockClientType.Mobile;
if (appType === AppType.Cli) return LockClientType.Cli;
throw new Error(`Invalid app type: ${appType}`);
}
export function hasActiveLock(locks: Lock[], currentDate: Date, lockTtl: number, lockType: LockType, clientType: LockClientType = null, clientId: string = null) {
const lock = activeLock(locks, currentDate, lockTtl, lockType, clientType, clientId);
return !!lock;

View File

@@ -2,6 +2,7 @@ import shim from '../../../shim';
import MigrationHandler from '../MigrationHandler';
import Setting from '../../../models/Setting';
import { reg } from '../../../registry';
import { appTypeToLockType } from '../LockHandler';
const { useEffect, useState } = shim.react();
export interface SyncTargetUpgradeResult {
@@ -28,7 +29,7 @@ export default function useSyncTargetUpgrade(): SyncTargetUpgradeResult {
synchronizer.api(),
reg.db(),
synchronizer.lockHandler(),
Setting.value('appType'),
appTypeToLockType(Setting.value('appType')),
Setting.value('clientId')
);

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -45,7 +45,7 @@
"markdown-it-sup": "^1.0.0",
"markdown-it-toc-done-right": "^4.1.0",
"md5": "^2.2.1",
"mermaid": "^8.12.1",
"mermaid": "^8.13.5",
"uslug": "git+https://github.com/laurent22/uslug.git#emoji-support"
},
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"

View File

@@ -10,7 +10,7 @@ module.exports = {
testEnvironment: 'node',
slowTestThreshold: 40,
slowTestThreshold: 60,
setupFilesAfterEnv: [`${__dirname}/jest.setup.js`],
};

View File

@@ -1,12 +1,12 @@
{
"name": "@joplin/server",
"version": "2.6.13",
"version": "2.6.14",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@joplin/server",
"version": "2.6.13",
"version": "2.6.14",
"dependencies": {
"@aws-sdk/client-s3": "^3.40.0",
"@fortawesome/fontawesome-free": "^5.15.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@joplin/server",
"version": "2.6.13",
"version": "2.6.14",
"private": true,
"scripts": {
"start-dev": "npm run build && JOPLIN_IS_TESTING=1 nodemon --config nodemon.json --ext ts,js,mustache,css,tsx dist/app.js --env dev",

View File

@@ -14,9 +14,10 @@ enum ArgvCommand {
interface Argv {
command: ArgvCommand;
connection: string;
connection?: string;
batchSize?: number;
maxContentSize?: number;
maxProcessedItems?: number;
}
export default class StorageCommand extends BaseCommand {
@@ -52,6 +53,10 @@ export default class StorageCommand extends BaseCommand {
type: 'number',
description: 'Max content size',
},
'max-processed-items': {
type: 'number',
description: 'Max number of items to process before stopping',
},
'connection': {
description: 'storage connection string',
type: 'string',
@@ -85,11 +90,14 @@ export default class StorageCommand extends BaseCommand {
},
[ArgvCommand.DeleteDatabaseContentColumn]: async () => {
const maxProcessedItems = argv.maxProcessedItems;
logger.info(`Batch size: ${batchSize}`);
await runContext.models.item().deleteDatabaseContentColumn({
batchSize,
logger,
maxProcessedItems,
});
},
};

View File

@@ -24,7 +24,7 @@ const defaultEnvValues: EnvVariables = {
// result in clients generating many conflicts. Set to 0 to disable the
// check. https://github.com/laurent22/joplin/issues/5738
MAX_TIME_DRIFT: 100,
MAX_TIME_DRIFT: 2000,
// ==================================================
// URL config

View File

@@ -462,6 +462,41 @@ describe('ItemModel', function() {
expect(await models().item().dbContent(note1.id)).toEqual(Buffer.from(''));
});
test('should delete the database item content - maxProcessedItems handling', async function() {
if (isSqlite(db())) {
expect(1).toBe(1);
return;
}
const { user: user1 } = await createUserAndSession(1);
await createItemTree3(user1.id, '', '', [
{
id: '000000000000000000000000000000F1',
children: [
{ id: '00000000000000000000000000000001' },
{ id: '00000000000000000000000000000002' },
{ id: '00000000000000000000000000000003' },
{ id: '00000000000000000000000000000004' },
],
},
]);
await models().item().deleteDatabaseContentColumn({ batchSize: 2, maxProcessedItems: 4 });
const itemIds = (await models().item().all()).map(it => it.id);
const contents = await Promise.all([
models().item().dbContent(itemIds[0]),
models().item().dbContent(itemIds[1]),
models().item().dbContent(itemIds[2]),
models().item().dbContent(itemIds[3]),
models().item().dbContent(itemIds[4]),
]);
const emptyOnes = contents.filter(c => c.toString() === '');
expect(emptyOnes.length).toBe(4);
});
// test('should stop importing item if it has been deleted', async function() {
// const { user: user1 } = await createUserAndSession(1);

View File

@@ -30,6 +30,7 @@ export interface ImportContentToStorageOptions {
export interface DeleteDatabaseContentOptions {
batchSize?: number;
logger?: Logger | LoggerWrapper;
maxProcessedItems?: number;
}
export interface SaveFromRawContentItem {
@@ -409,20 +410,21 @@ export default class ItemModel extends BaseModel<Item> {
options = {
batchSize: 1000,
logger: new Logger(),
maxProcessedItems: 0,
...options,
};
const itemCount = (await this.db(this.tableName)
.count('id', { as: 'total' })
.where('content', '!=', Buffer.from(''))
.first())['total'];
// const itemCount = (await this.db(this.tableName)
// .count('id', { as: 'total' })
// .where('content', '!=', Buffer.from(''))
// .first())['total'];
let totalDone = 0;
// UPDATE items SET content = '\x' WHERE id IN (SELECT id FROM items WHERE content != '\x' LIMIT 5000);
while (true) {
options.logger.info(`Processing items ${totalDone} / ${itemCount}`);
options.logger.info(`Processing items ${totalDone}`);
const updatedRows = await this
.db(this.tableName)
@@ -440,6 +442,11 @@ export default class ItemModel extends BaseModel<Item> {
return;
}
if (options.maxProcessedItems && totalDone + options.batchSize > options.maxProcessedItems) {
options.logger.info(`Processed ${totalDone} items out of requested ${options.maxProcessedItems}`);
return;
}
await msleep(1000);
}
}

View File

@@ -15,6 +15,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: packages/app-mobile/components/screens/ConfigScreen.tsx:565
msgid "- Camera: to allow taking a picture and attaching it to a note."
@@ -583,6 +585,9 @@ msgid ""
"enabled end-to-end encryption. They may do so from the screen Configuration "
"> Encryption."
msgstr ""
"Das verschlüsselte Notizbuch kann nicht mit %s geteilt werden, da die Person "
"die Ende-zu-Ende Verschlüsselung nicht aktiviert hat. Dies ist unter "
"Optionen > Verschlüsselung möglich."
#: packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.ts:7
msgid "Change application layout"
@@ -761,9 +766,8 @@ msgid "Conflicts (attachments)"
msgstr "Konflikte (Anhänge)"
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.tsx:108
#, fuzzy
msgid "Content provided by %s"
msgstr "Inhaltseigenschaften"
msgstr "Von %s bereitgestellte Inhalte"
#: packages/app-mobile/components/screens/Note.tsx:933
msgid "Convert to note"
@@ -787,9 +791,8 @@ msgstr "Entwicklermodus-Befehl in Zwischenablage kopieren"
#: packages/app-desktop/gui/Sidebar/Sidebar.tsx:340
#: packages/app-desktop/gui/Sidebar/Sidebar.tsx:354
#: packages/app-desktop/gui/utils/NoteListUtils.ts:139
#, fuzzy
msgid "Copy external link"
msgstr "Externe Bearbeitung stoppen"
msgstr "Externen Link kopieren"
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:164
msgid "Copy Link Address"
@@ -861,6 +864,10 @@ msgid ""
"\n"
"The error was: \"%s\""
msgstr ""
"Die Einladung konnte nicht beantwortet werden. Bitte versuche es erneut, "
"oder prüfe, ob der Notizbuch-Besitzer dieses noch freigibt.\n"
"\n"
"Der Fehler war: \"%s\""
#: packages/lib/components/EncryptionConfigScreen/utils.ts:214
msgid "Could not upgrade master key: %s"
@@ -1205,14 +1212,11 @@ msgid "Do not ask for confirmation."
msgstr "Nicht nach einer Bestätigung fragen."
#: packages/lib/components/EncryptionConfigScreen/utils.ts:56
#, fuzzy
msgid ""
"Do not lose the password as, for security purposes, this will be the *only* "
"way to decrypt the data! To enable encryption, please enter your password "
"below."
msgstr ""
"Durch das Aktivieren der Verschlüsselung werden *alle* Notizen und Anhänge "
"neu synchronisiert und verschlüsselt an das Synchronisationsziel gesendet. "
"Achte darauf, dass du das Passwort nicht verlierst, da dies aus "
"Sicherheitsgründen die *einzige* Möglichkeit ist, deine Daten zu "
"entschlüsseln! Um die Verschlüsselung zu aktivieren, gib bitte unten dein "
@@ -1440,14 +1444,12 @@ msgid "Enabled"
msgstr "Aktiviert"
#: packages/lib/components/EncryptionConfigScreen/utils.ts:51
#, fuzzy
msgid ""
"Enabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent encrypted to the sync target."
msgstr ""
"Durch die Deaktivierung der Verschlüsselung werden *alle* Notizen und "
"Anhänge neu synchronisiert und unverschlüsselt an das Synchronisationsziel "
"gesendet. Möchtest du fortfahren?"
"Durch die Aktivierung der Verschlüsselung werden *alle* Notizen und Anhänge "
"neu synchronisiert und verschlüsselt an das Synchronisationsziel gesendet."
#: packages/lib/models/BaseItem.ts:808
msgid "Encrypted"
@@ -1476,19 +1478,16 @@ msgid "Encryption is: %s"
msgstr "Verschlüsselung ist: %s"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:170
#, fuzzy
msgid "Encryption keys"
msgstr "Die Verschlüsselung ist:"
msgstr "Verschlüsselungsschlüssel"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:247
#, fuzzy
msgid "Encryption:"
msgstr "Verschlüsselung"
msgstr "Verschlüsselung:"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:245
#, fuzzy
msgid "End-to-end encryption"
msgstr "Verschlüsselung aktivieren"
msgstr "Ende-zu-Ende Verschlüsselung"
#: packages/app-mobile/components/screens/dropbox-login.js:66
msgid "Enter code here"
@@ -1710,9 +1709,8 @@ msgid "General"
msgstr "Allgemeines"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:250
#, fuzzy
msgid "Generated"
msgstr "Allgemeines"
msgstr "Erzeugt"
#: packages/app-desktop/gui/ShareNoteDialog.tsx:207
msgid "Generating link..."
@@ -1760,9 +1758,8 @@ msgid "Hide %s"
msgstr "%s ausblenden"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:170
#, fuzzy
msgid "Hide disabled keys"
msgstr "Deaktivierte Hauptschlüssel ausblenden"
msgstr "Deaktivierte Schlüssel ausblenden"
#: packages/app-desktop/gui/KeymapConfig/utils/getLabel.ts:22
msgid "Hide Joplin"
@@ -2098,7 +2095,6 @@ msgid "Keychain Supported: %s"
msgstr "Unterstützter Schlüsselbund: %s"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:69
#, fuzzy
msgid "Keys that need upgrading"
msgstr "Hauptschlüssel, die aktualisiert werden müssen"
@@ -2127,9 +2123,8 @@ msgid "Layout button sequence"
msgstr "Layout-Reihenfolge"
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:7
#, fuzzy
msgid "Leave notebook..."
msgstr "Notizbuch teilen..."
msgstr "Verlasse Notizbuch..."
#: packages/lib/models/Setting.ts:1150
msgid "Legal"
@@ -2209,14 +2204,12 @@ msgid "Make a donation"
msgstr "Spenden"
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:204
#, fuzzy
msgid "Manage master password"
msgstr "Master-Passwort eingeben:"
msgstr "Master-Passwort verwalten"
#: packages/lib/commands/openMasterPasswordDialog.ts:6
#, fuzzy
msgid "Manage master password..."
msgstr "Master-Passwort eingeben:"
msgstr "Master-Passwort verwalten..."
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.tsx:314
msgid "Manage your plugins"
@@ -2224,7 +2217,6 @@ msgstr "Erweiterungen verwalten"
#. `generate-ppk`
#: packages/app-cli/app/command-e2ee.ts:20
#, fuzzy
msgid ""
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
"`status`, `decrypt-file`, and `target-status`."
@@ -2245,7 +2237,7 @@ msgstr "Markdown"
#: packages/lib/services/interop/InteropService.ts:120
#: packages/lib/services/interop/InteropService.ts:67
msgid "Markdown + Front Matter"
msgstr ""
msgstr "Markdown + Front Matter"
#: packages/app-cli/app/command-done.js:14
msgid "Marks a to-do as done."
@@ -2279,9 +2271,8 @@ msgid "Max concurrent connections"
msgstr "Maximale Anzahl an gleichzeitigen Verbindungen"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:322
#, fuzzy
msgid "Missing keys"
msgstr "Fehlende Hauptschlüssel"
msgstr "Fehlende Schlüssel"
#: packages/app-mobile/components/screens/encryption-config.tsx:271
msgid "Missing Master Keys"
@@ -2458,9 +2449,10 @@ msgstr ""
msgid "Not downloaded"
msgstr "Nicht heruntergeladen"
# I don't really know which one fits better: "erzeugt", "erstellt" or "generiert"...
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:250
msgid "Not generated"
msgstr ""
msgstr "Nicht erzeugt"
#: packages/app-desktop/gui/NoteEditor/NoteTitle/NoteTitleBar.tsx:110
#: packages/server/src/models/UserModel.ts:202
@@ -2720,7 +2712,7 @@ msgstr "Berechtigung zur Verwendung der Kamera"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:269
msgid "Please click on \"%s\" to proceed"
msgstr ""
msgstr "Klicke bitte auf \"%s\" um fortzufahren"
#: packages/lib/components/EncryptionConfigScreen/utils.ts:65
msgid ""
@@ -2741,6 +2733,8 @@ msgid ""
"Please note that if it is a large notebook, it may take a few minutes for "
"all the notes to show up on the recipient's device."
msgstr ""
"Wenn das Notizbuch sehr groß ist, kann es ein paar Minuten dauern, bis alle "
"Notizen auf dem Empfängergerät erscheinen."
#: packages/lib/onedrive-api-node-utils.js:116
msgid ""
@@ -2883,7 +2877,7 @@ msgstr "Eigenschaften"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:250
msgid "Public-private key pair:"
msgstr ""
msgstr "Öffentlich-Privates Schlüsselpaar:"
#: packages/app-desktop/gui/MainScreen/commands/showShareNoteDialog.ts:6
msgid "Publish note..."
@@ -2991,9 +2985,8 @@ msgstr "Token erneuern"
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:204
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:205
#, fuzzy
msgid "Reset master password"
msgstr "Master-Passwort eingeben:"
msgstr "Master-Passwort zurücksetzen"
#: packages/app-cli/app/command-import.js:51
#: packages/app-desktop/gui/ImportScreen.min.js:72
@@ -3149,11 +3142,12 @@ msgid "Set alarm:"
msgstr "Alarm erstellen:"
#: packages/lib/models/Setting.ts:1039
#, fuzzy
msgid ""
"Set it to 0 to make it take the complete available space. Recommended width "
"is 600."
msgstr "Setze ihn auf 0, damit er den gesamten verfügbaren Platz einnimmt."
msgstr ""
"Setze sie auf 0, um den gesamten verfügbaren Platz zu verwenden. Die "
"empfohlene Breite ist 600."
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:627
msgid "Set the password"
@@ -3206,9 +3200,8 @@ msgid "Show completed to-dos"
msgstr "Abgeschlossene Aufgaben anzeigen"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:170
#, fuzzy
msgid "Show disabled keys"
msgstr "Deaktivierte Hauptschlüssel anzeigen"
msgstr "Deaktivierte Schlüssel anzeigen"
#: packages/lib/models/Setting.ts:781
msgid "Show note counts"
@@ -3588,7 +3581,7 @@ msgid ""
"The attachments will no longer be watched when you switch to a different "
"note."
msgstr ""
"Die Anhänge werden nicht mehr überwacht, wenn Sie zu einer anderen Notiz "
"Die Anhänge werden nicht mehr überwacht, wenn du zu einer anderen Notiz "
"wechseln."
#: packages/app-cli/app/app.js:304
@@ -3639,24 +3632,23 @@ msgstr ""
"Die Faktor-Eigenschaft legt fest, wie der Artikel wächst oder schrumpft, um "
"dem verfügbaren Platz in seinem Container in Bezug auf die anderen Artikel "
"zu entsprechen. Ein Element mit dem Faktor 2 benötigt also doppelt so viel "
"Platz wie ein Element mit dem Faktor 1. Starten Sie die App neu, um "
"Änderungen zu sehen."
"Platz wie ein Element mit dem Faktor 1. Starte die App neu, um Änderungen zu "
"sehen."
#: packages/app-desktop/gui/NoteEditor/NoteEditor.tsx:507
msgid "The following attachments are being watched for changes:"
msgstr "Die folgenden Anhänge werden auf Änderungen überwacht:"
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:70
#, fuzzy
msgid ""
"The following keys use an out-dated encryption algorithm and it is "
"recommended to upgrade them. The upgraded key will still be able to decrypt "
"and encrypt your data as usual."
msgstr ""
"Die folgenden Hauptschlüssel verwenden einen veralteten "
"Die folgenden Schlüssel verwenden einen veralteten "
"Verschlüsselungsalgorithmus und es wird empfohlen, sie zu aktualisieren. Der "
"aktualisierte Hauptschlüssel wird deine Daten weiterhin wie gewohnt "
"entschlüsseln und verschlüsseln können."
"aktualisierte Schlüssel wird deine Daten weiterhin wie gewohnt entschlüsseln "
"und verschlüsseln können."
#: packages/app-mobile/components/screens/Note.tsx:191
msgid "The Joplin mobile app does not currently support this type of link: %s"
@@ -3671,13 +3663,12 @@ msgstr ""
"Leistung überprüft."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:323
#, fuzzy
msgid ""
"The keys with these IDs are used to encrypt some of your items, however the "
"application does not currently have access to them. It is likely they will "
"eventually be downloaded via synchronisation."
msgstr ""
"Die Hauptschlüssel mit diesen IDs werden zur Verschlüsselung einiger deiner "
"Die Schlüssel mit diesen IDs werden zur Verschlüsselung einiger deiner "
"Objekte verwendet, die Anwendung hat jedoch derzeit keinen Zugriff darauf. "
"Es ist wahrscheinlich, dass sie irgendwann über die Synchronisation "
"heruntergeladen werden."
@@ -3720,6 +3711,10 @@ msgid ""
"\n"
"The error was: \"%s\""
msgstr ""
"Der Empfänger konnte nicht von der Liste entfernt werden. Bitte versuche es "
"erneut.\n"
"\n"
"Der Fehler war: \"%s\""
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:585
msgid ""
@@ -3731,12 +3726,12 @@ msgstr ""
"synchronisiert werden kann. Der Vorgang kann einige Minuten dauern, und die "
"App muss neu gestartet werden. Um fortzufahren, klicke bitte auf den Link."
# "Klicke" or "Tippe"? Is it on mobile or desktop?
#: packages/app-mobile/components/screen-header.js:459
#, fuzzy
msgid "The sync target needs to be upgraded. Press this banner to proceed."
msgstr ""
"Das Synchronisationsziel muss aktualisiert werden! Führe `%s` aus, um "
"fortzufahren."
"Das Synchronisationsziel muss aktualisiert werden! Klicke auf diesen Banner, "
"um fortzufahren."
#: packages/lib/models/Tag.ts:204
msgid "The tag \"%s\" already exists. Please choose a different name."
@@ -3927,13 +3922,12 @@ msgstr ""
"Diese Aktion wird ein neues Fenster öffnen. Aktuelle Änderungen speichern?"
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:13
#, fuzzy
msgid ""
"This will remove the notebook from your collection and you will no longer "
"have access to its content. Do you wish to continue?"
msgstr ""
"Teilen des Notizbuch beenden? Der Empfänger wird keinen Zugriff mehr auf den "
"Inhalt haben."
"Das Notizbuch wird aus deiner Sammlung gelöscht und du wirst keinen Zugriff "
"mehr darauf haben. Möchtest du fortfahren?"
#: packages/lib/models/Setting.ts:709
msgid "Time format"
@@ -3957,9 +3951,8 @@ msgstr ""
"folgenden Schritten:"
#: packages/lib/components/EncryptionConfigScreen/utils.ts:54
#, fuzzy
msgid "To continue, please enter your master password below."
msgstr "Master-Passwort eingeben"
msgstr "Gib bitte das Master-Passwort unten ein um forzufahren."
#: packages/app-cli/app/app-gui.js:452
msgid "To delete a tag, untag the associated notes."
@@ -4224,8 +4217,8 @@ msgstr ""
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:825
msgid "Use the arrows to move the layout items. Press \"Escape\" to exit."
msgstr ""
"Verwenden Sie die Pfeile, um die Layoutelemente zu verschieben. Drücken Sie "
"zum Beenden „Escape“."
"Verwende die Pfeile, um die Layoutelemente zu verschieben. Drücke zum "
"Beenden „Escape“."
#: packages/app-mobile/components/screens/ConfigScreen.tsx:525
msgid ""
@@ -4371,7 +4364,7 @@ msgid ""
"You are about to attach a large image (%dx%d pixels). Would you like to "
"resize it down to %d pixels before attaching it?"
msgstr ""
"Sie sind dabei, ein großes Bild (%dx%d Pixel) anzuhängen. Möchten Sie es vor "
"Du bist dabei, ein großes Bild (%dx%d Pixel) anzuhängen. Möchtest du es vor "
"dem Anhängen auf %d Pixel verkleinern?"
#: packages/app-mobile/components/note-list.js:97
@@ -4406,7 +4399,7 @@ msgstr "Deine Daten werden neu verschlüsselt und erneut synchronisiert."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:269
msgid "Your master password is needed to decrypt some of your data."
msgstr ""
msgstr "Das Master-Passwort ist nötig um einige deiner Daten zu entschlüsseln."
#: packages/app-mobile/components/CameraView.tsx:189
msgid "Your permission to use your camera is required."

View File

@@ -1058,11 +1058,11 @@ msgstr ""
#: packages/lib/Synchronizer.ts:192
msgid "Deleted local items: %d."
msgstr "Objets supprimés localement : %d."
msgstr "Objets suppr. localement : %d."
#: packages/lib/Synchronizer.ts:193
msgid "Deleted remote items: %d."
msgstr "Objets distants supprimés : %d."
msgstr "Objets distants suppr. : %d."
#: packages/app-cli/app/command-rmbook.js:13
msgid "Deletes the given notebook."
@@ -4113,11 +4113,11 @@ msgstr "date de modification"
#: packages/lib/Synchronizer.ts:189
msgid "Updated local items: %d."
msgstr "Objets mis à jour localement : %d."
msgstr "Objets màj localement : %d."
#: packages/lib/Synchronizer.ts:191
msgid "Updated remote items: %d."
msgstr "Objets distants mis à jour : %d."
msgstr "Objets distants màj : %d."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:150
msgid "Updated: "

View File

@@ -6,6 +6,20 @@ const execa = require('execa');
const { splitCommandString } = require('@joplin/lib/string-utils');
const moment = require('moment');
export interface GitHubReleaseAsset {
name: string;
browser_download_url: string;
}
export interface GitHubRelease {
assets: GitHubReleaseAsset[];
tag_name: string;
upload_url: string;
html_url: string;
prerelease: boolean;
draft: boolean;
}
function quotePath(path: string) {
if (!path) return '';
if (path.indexOf('"') < 0 && path.indexOf(' ') < 0) return path;
@@ -364,7 +378,39 @@ export function githubOauthToken() {
return readCredentialFile('github_oauth_token.txt');
}
export async function githubRelease(project: string, tagName: string, options: any = null) {
// Note that the GitHub API releases/latest is broken on the joplin-android repo
// as of Nov 2021 (last working on 3 November 2021, first broken on 19
// November). It used to return the latest **published** release but now it
// retuns... some release, always the same one, but not the latest one. GitHub
// says that nothing has changed on the API, although it used to work. So since
// we can't use /latest anymore, we need to fetch all the releases to find the
// latest published one.
export async function gitHubLatestRelease(repoName: string): Promise<GitHubRelease> {
let pageNum = 1;
while (true) {
const response: any = await fetch(`https://api.github.com/repos/laurent22/${repoName}/releases?page=${pageNum}`, {
headers: {
'Content-Type': 'application/json',
'User-Agent': 'Joplin Readme Updater',
},
});
if (!response.ok) throw new Error(`Cannot fetch releases: ${response.statusText}`);
const releases = await response.json();
if (!releases.length) throw new Error('Cannot find latest release');
for (const release of releases) {
if (release.prerelease || release.draft) continue;
return release;
}
pageNum++;
}
}
export async function githubRelease(project: string, tagName: string, options: any = null): Promise<GitHubRelease> {
options = Object.assign({}, {
isDraft: false,
isPreRelease: false,

View File

@@ -1,18 +1,8 @@
import * as fs from 'fs-extra';
import { fileExtension } from '@joplin/lib/path-utils';
const request = require('request');
import { gitHubLatestRelease, GitHubRelease } from './tool-utils';
const readmePath = `${__dirname}/../../README.md`;
interface GitHubReleaseAsset {
name: string;
browser_download_url: string;
}
interface GitHubRelease {
assets: GitHubReleaseAsset[];
tag_name: string;
}
async function msleep(ms: number) {
return new Promise((resolve) => {
setTimeout(() => {
@@ -21,25 +11,6 @@ async function msleep(ms: number) {
});
}
async function gitHubLatestRelease(repoName: string): Promise<GitHubRelease> {
return new Promise((resolve, reject) => {
request.get({
url: `https://api.github.com/repos/laurent22/${repoName}/releases/latest`,
json: true,
headers: { 'User-Agent': 'Joplin Readme Updater' },
}, (error: any, response: any, data: any) => {
if (error) {
reject(error);
} else if (response.statusCode !== 200) {
console.warn(data);
reject(new Error(`Error HTTP ${response.statusCode}`));
} else {
resolve(data);
}
});
});
}
function downloadUrl(release: GitHubRelease, os: string, portable = false) {
if (!release || !release.assets || !release.assets.length) return null;
@@ -122,8 +93,8 @@ async function main(argv: any) {
// Disable for now due to broken /latest API end point, which returns a
// version from 6 months ago.
// if (androidUrl) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin-android\/releases\/download\/android-v\d+\.\d+\.\d+\/joplin-v\d+\.\d+\.\d+\.apk)/, androidUrl);
// if (android32Url) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin-android\/releases\/download\/android-v\d+\.\d+\.\d+\/joplin-v\d+\.\d+\.\d+-32bit\.apk)/, android32Url);
if (androidUrl) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin-android\/releases\/download\/android-v\d+\.\d+\.\d+\/joplin-v\d+\.\d+\.\d+\.apk)/, androidUrl);
if (android32Url) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin-android\/releases\/download\/android-v\d+\.\d+\.\d+\/joplin-v\d+\.\d+\.\d+-32bit\.apk)/, android32Url);
setReadmeContent(content);

View File

@@ -1,5 +1,14 @@
# Joplin Android app changelog
## [android-v2.6.6](https://github.com/laurent22/joplin/releases/tag/android-v2.6.6) (Pre-release) - 2021-12-13T10:59:30Z
- Improved: Update Mermaid: 8.12.1 -&gt; 8.13.5 (#5831 by Helmut K. C. Tessarek)
- Fixed: Links in flowchart Mermaid diagrams (#5830) (#5801 by Helmut K. C. Tessarek)
## [android-v2.6.5](https://github.com/laurent22/joplin/releases/tag/android-v2.6.5) (Pre-release) - 2021-12-13T09:41:18Z
- Fixed: Fixed "Invalid lock client type" error when migrating sync target (e0e93c4)
## [android-v2.6.4](https://github.com/laurent22/joplin/releases/tag/android-v2.6.4) (Pre-release) - 2021-12-01T11:38:49Z
- Improved: Also duplicate resources when duplicating a note (c0a8c33)

View File

@@ -1,5 +1,9 @@
# Joplin Server Changelog
## [server-v2.6.14](https://github.com/laurent22/joplin/releases/tag/server-v2.6.14) - 2021-12-02T16:29:54Z
- Improved: Improved storage command (122afd6)
## [server-v2.6.13](https://github.com/laurent22/joplin/releases/tag/server-v2.6.13) - 2021-11-29T18:41:28Z
- New: Added command to delete database item content (01048f5)

View File

@@ -62,6 +62,25 @@ Difficulty Level: High
Skills Required: TypeScript, JavaScript, knowledge of Electron and GitHub Actions.
## 5. Implement a toolbar for the mobile beta code editor
We would like the Beta code editor to eventually become the main editor, and for that a number of changes need to be made. The main one would be the addition of a toolbar to it, to set the various styles, such as Bold, Bullet list, Header, etc. Additionally there are number of bugs that will have to be fixed to get the editor ready for production - you will find them in the list of issues (under the "high" and "mobile" label).
Difficulty Level: High
Skills Required: TypeScript, JavaScript, React Native, React Hooks. You'll also need to learn about CodeMirror 6 if you're not already familiar with it.
## 6. Improve integration of the richtext/WYSIWYG editor
Joplin offers a richtext/WYSIWYG typing experience alongside the Markdown editor but there are a number of areas that could do with improvement when it comes to integration with Joplin as a whole.
Areas for consideration include increasing compatibility with Joplin-wide keybindings (many are currently static), limiting features of the editor not compatible with markdown formatting, reducing the impact of data changes caused by swapping between editors.
Also read the document about limitations of the editor: [https://joplinapp.org/rich_text_editor/](https://joplinapp.org/rich_text_editor/)
Difficulty level: High
Skills Required: Typescript, Javascript, CSS, HTML, Markdown rendering. You will also need to learn about TinyMCE if you're not already familiar with it.
# More info
- Make sure you read the [Joplin Google Summer of Code Introduction](https://joplinapp.org/gsoc2022/index/)