1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-11-27 08:21:03 +02:00

Status screen

This commit is contained in:
Laurent Cozic 2017-07-10 20:16:59 +01:00
parent 3f50e419da
commit e882c7b339
7 changed files with 95 additions and 4 deletions

View File

@ -90,8 +90,8 @@ android {
applicationId "net.cozic.joplin" applicationId "net.cozic.joplin"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 22 targetSdkVersion 22
versionCode 3 versionCode 4
versionName "0.8.1" versionName "0.8.2"
ndk { ndk {
abiFilters "armeabi-v7a", "x86" abiFilters "armeabi-v7a", "x86"
} }

View File

@ -4,3 +4,4 @@ rmdir /s/q android\build
rmdir /s/q android\.gradle rmdir /s/q android\.gradle
rmdir /s/q node_modules rmdir /s/q node_modules
npm install npm install
start_server.bat

View File

@ -41,6 +41,13 @@ class ScreenHeaderComponent extends Component {
}); });
} }
status_press() {
this.props.dispatch({
type: 'Navigation/NAVIGATE',
routeName: 'Status',
});
}
render() { render() {
let key = 0; let key = 0;
let menuOptionComponents = []; let menuOptionComponents = [];
@ -61,6 +68,11 @@ class ScreenHeaderComponent extends Component {
<Text>{_('Log')}</Text> <Text>{_('Log')}</Text>
</MenuOption>); </MenuOption>);
menuOptionComponents.push(
<MenuOption value={() => this.status_press()} key={'menuOption_' + key++}>
<Text>{_('Status')}</Text>
</MenuOption>);
let title = 'title' in this.props && this.props.title !== null ? this.props.title : _(this.props.navState.routeName); let title = 'title' in this.props && this.props.title !== null ? this.props.title : _(this.props.navState.routeName);
return ( return (

View File

@ -0,0 +1,66 @@
import React, { Component } from 'react';
import { ListView, View, Text, Button } from 'react-native';
import { connect } from 'react-redux'
import { Log } from 'lib/log.js'
import { reg } from 'lib/registry.js'
import { ScreenHeader } from 'lib/components/screen-header.js';
import { time } from 'lib/time-utils'
import { Logger } from 'lib/logger.js';
import { BaseItem } from 'lib/models/base-item.js';
import { _ } from 'lib/locale.js';
class StatusScreenComponent extends React.Component {
static navigationOptions(options) {
return { header: null };
}
constructor() {
super();
this.state = {
report: {},
};
}
componentWillMount() {
this.resfreshScreen();
}
resfreshScreen() {
return BaseItem.stats().then((report) => {
this.setState({ report: report });
});
}
render() {
let reportLines = [];
const r = this.state.report;
for (let n in r.items) {
if (!r.items.hasOwnProperty(n)) continue;
reportLines.push(_('%s: %d/%d', n, r.items[n].synced, r.items[n].total));
}
if (r.total) reportLines.push(_('Total: %d/%d', r.total.synced, r.total.total));
if (r.toDelete) reportLines.push(_('To delete: %d', r.toDelete.total));
reportLines = reportLines.join("\n");
return (
<View style={{flex: 1}}>
<ScreenHeader navState={this.props.navigation.state} />
<Text style={{padding: 6, flex: 1, textAlignVertical: 'top'}} multiline={true}>{reportLines}</Text>
<Button title="Refresh" onPress={() => this.resfreshScreen()}/>
</View>
);
}
}
const StatusScreen = connect(
(state) => {
return {};
}
)(StatusScreenComponent)
export { StatusScreen };

View File

@ -56,12 +56,16 @@ class BaseItem extends BaseModel {
synced: syncedCount, synced: syncedCount,
}; };
output.toDelete = {
total: await this.deletedItemCount(),
};
return output; return output;
} }
static async syncedCount() { static async syncedCount() {
const ItemClass = this.itemClass(this.modelType()); const ItemClass = this.itemClass(this.modelType());
const r = await this.db().selectOne('SELECT count(*) as total FROM `' + ItemClass.tableName() + '` WHERE updated_time > sync_time'); const r = await this.db().selectOne('SELECT count(*) as total FROM `' + ItemClass.tableName() + '` WHERE updated_time <= sync_time');
return r.total; return r.total;
} }
@ -143,6 +147,11 @@ class BaseItem extends BaseModel {
return this.db().selectAll('SELECT * FROM deleted_items'); return this.db().selectAll('SELECT * FROM deleted_items');
} }
static async deletedItemCount() {
let r = await this.db().selectOne('SELECT count(*) as total FROM deleted_items');
return r['total'];
}
static remoteDeletedItem(itemId) { static remoteDeletedItem(itemId) {
return this.db().exec('DELETE FROM deleted_items WHERE item_id = ?', [itemId]); return this.db().exec('DELETE FROM deleted_items WHERE item_id = ?', [itemId]);
} }

View File

@ -1,5 +1,6 @@
import { shim } from 'lib/shim.js'; import { shim } from 'lib/shim.js';
import { GeolocationReact } from 'lib/geolocation-react.js'; import { GeolocationReact } from 'lib/geolocation-react.js';
import RNFetchBlob from 'react-native-fetch-blob';
function shimInit() { function shimInit() {
shim.Geolocation = GeolocationReact; shim.Geolocation = GeolocationReact;

View File

@ -25,6 +25,7 @@ import { NoteScreen } from 'lib/components/screens/note.js'
import { FolderScreen } from 'lib/components/screens/folder.js' import { FolderScreen } from 'lib/components/screens/folder.js'
import { FoldersScreen } from 'lib/components/screens/folders.js' import { FoldersScreen } from 'lib/components/screens/folders.js'
import { LogScreen } from 'lib/components/screens/log.js' import { LogScreen } from 'lib/components/screens/log.js'
import { StatusScreen } from 'lib/components/screens/status.js'
import { LoadingScreen } from 'lib/components/screens/loading.js' import { LoadingScreen } from 'lib/components/screens/loading.js'
import { OneDriveLoginScreen } from 'lib/components/screens/onedrive-login.js' import { OneDriveLoginScreen } from 'lib/components/screens/onedrive-login.js'
import { Setting } from 'lib/models/setting.js' import { Setting } from 'lib/models/setting.js'
@ -218,6 +219,7 @@ const AppNavigator = StackNavigator({
Loading: { screen: LoadingScreen }, Loading: { screen: LoadingScreen },
OneDriveLogin: { screen: OneDriveLoginScreen }, OneDriveLogin: { screen: OneDriveLoginScreen },
Log: { screen: LogScreen }, Log: { screen: LogScreen },
Status: { screen: StatusScreen },
}); });
let initializationState_ = 'waiting'; let initializationState_ = 'waiting';