diff --git a/CliClient/app/app.js b/CliClient/app/app.js
index 77ea6913d..978065881 100644
--- a/CliClient/app/app.js
+++ b/CliClient/app/app.js
@@ -260,8 +260,8 @@ class Application {
} else if (syncTarget == 'memory') {
fileApi = new FileApi('joplin', new FileApiDriverMemory());
fileApi.setLogger(this.logger_);
- } else if (syncTarget == 'file') {
- let syncDir = Setting.value('sync.local.path');
+ } else if (syncTarget == 'filesystem') {
+ let syncDir = Setting.value('sync.filesystem.path');
if (!syncDir) syncDir = Setting.value('profileDir') + '/sync';
this.vorpal().log(_('Synchronizing with directory "%s"', syncDir));
await fs.mkdirp(syncDir, 0o755);
diff --git a/CliClient/app/command-status.js b/CliClient/app/command-status.js
index a00a7c620..fe3931e01 100644
--- a/CliClient/app/command-status.js
+++ b/CliClient/app/command-status.js
@@ -1,4 +1,6 @@
import { BaseCommand } from './base-command.js';
+import { Database } from 'lib/database.js';
+import { Setting } from 'lib/models/setting.js';
import { _ } from 'lib/locale.js';
import { ReportService } from 'lib/services/report.js';
@@ -14,7 +16,7 @@ class Command extends BaseCommand {
async action(args) {
let service = new ReportService();
- let report = await service.status();
+ let report = await service.status(Database.enumId('syncTarget', Setting.value('sync.target')));
for (let i = 0; i < report.length; i++) {
let section = report[i];
diff --git a/CliClient/app/fuzzing.js b/CliClient/app/fuzzing.js
index 5395d97a5..c1ddc403a 100644
--- a/CliClient/app/fuzzing.js
+++ b/CliClient/app/fuzzing.js
@@ -42,7 +42,7 @@ async function createClients() {
for (let clientId = 0; clientId < 2; clientId++) {
let client = createClient(clientId);
promises.push(fs.remove(client.profileDir));
- promises.push(execCommand(client, 'config sync.target local').then(() => { return execCommand(client, 'config sync.local.path ' + syncDir); }));
+ promises.push(execCommand(client, 'config sync.target filesystem').then(() => { return execCommand(client, 'config sync.filesystem.path ' + syncDir); }));
output.push(client);
}
diff --git a/CliClient/package.json b/CliClient/package.json
index 993949607..ea07e4391 100644
--- a/CliClient/package.json
+++ b/CliClient/package.json
@@ -7,7 +7,7 @@
"url": "https://github.com/laurent22/joplin"
},
"url": "git://github.com/laurent22/joplin.git",
- "version": "0.8.43",
+ "version": "0.8.44",
"bin": {
"joplin": "./main_launcher.js"
},
diff --git a/CliClient/tests/synchronizer.js b/CliClient/tests/synchronizer.js
index f8f10e121..4a8b5ec9c 100644
--- a/CliClient/tests/synchronizer.js
+++ b/CliClient/tests/synchronizer.js
@@ -75,8 +75,6 @@ describe('Synchronizer', function() {
let note = await Note.save({ title: "un", parent_id: folder.id });
await synchronizer().start();
- await sleep(0.1);
-
await Note.save({ title: "un UPDATE", id: note.id });
let all = await allItems();
diff --git a/ReactNativeClient/android/app/build.gradle b/ReactNativeClient/android/app/build.gradle
index 762eddd58..4b971ee6f 100644
--- a/ReactNativeClient/android/app/build.gradle
+++ b/ReactNativeClient/android/app/build.gradle
@@ -90,8 +90,8 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion 16
targetSdkVersion 22
- versionCode 16
- versionName "0.9.3"
+ versionCode 18
+ versionName "0.9.5"
ndk {
abiFilters "armeabi-v7a", "x86"
}
diff --git a/ReactNativeClient/lib/base-model.js b/ReactNativeClient/lib/base-model.js
index a9aea35a1..92f7c965d 100644
--- a/ReactNativeClient/lib/base-model.js
+++ b/ReactNativeClient/lib/base-model.js
@@ -218,6 +218,7 @@ class BaseModel {
}
query.id = modelId;
+ query.modObject = o;
return query;
}
@@ -241,6 +242,8 @@ class BaseModel {
return this.db().transactionExecBatch(queries).then(() => {
o = Object.assign({}, o);
o.id = modelId;
+ if ('updated_time' in saveQuery.modObject) o.updated_time = saveQuery.modObject.updated_time;
+ if ('created_time' in saveQuery.modObject) o.created_time = saveQuery.modObject.created_time;
o = this.addModelMd(o);
return this.filter(o);
}).catch((error) => {
diff --git a/ReactNativeClient/lib/components/screen-header.js b/ReactNativeClient/lib/components/screen-header.js
index 1129526a0..6361e02b6 100644
--- a/ReactNativeClient/lib/components/screen-header.js
+++ b/ReactNativeClient/lib/components/screen-header.js
@@ -1,6 +1,6 @@
import React, { Component } from 'react';
import { connect } from 'react-redux'
-import { View, Text, Button, StyleSheet, TouchableOpacity } from 'react-native';
+import { View, Text, Button, StyleSheet, TouchableOpacity, Picker } from 'react-native';
import { Log } from 'lib/log.js';
import { Menu, MenuOptions, MenuOption, MenuTrigger } from 'react-native-popup-menu';
import { _ } from 'lib/locale.js';
@@ -150,14 +150,33 @@ class ScreenHeaderComponent extends Component {
{_('Status')}
);
- let title = 'title' in this.props && this.props.title !== null ? this.props.title : _(this.props.navState.routeName);
+ const createTitleComponent = () => {
+ const p = this.props.titlePicker;
+ if (p) {
+ let items = [];
+ for (let i = 0; i < p.items.length; i++) {
+ let item = p.items[i];
+ items.push();
+ }
+ return (
+ { if (p.onValueChange) p.onValueChange(itemValue, itemIndex); }}>
+ { items }
+
+ );
+ } else {
+ let title = 'title' in this.props && this.props.title !== null ? this.props.title : _(this.props.navState.routeName);
+ return {title}
+ }
+ }
+
+ const titleComp = createTitleComponent();
return (
{ sideMenuButton(styles, () => this.sideMenuButton_press()) }
{ backButton(styles, () => this.backButton_press(), !this.props.historyCanGoBack) }
{ saveButton(styles, () => { if (this.props.onSaveButtonPress) this.props.onSaveButtonPress() }, this.props.saveButtonDisabled === true, this.props.showSaveButton === true) }
- {title}
+ { titleComp }