Notes/src/public/app/widgets/sync_status.js

153 lines
5.3 KiB
JavaScript
Raw Normal View History

2021-03-20 00:00:49 +01:00
import BasicWidget from "./basic_widget.js";
2021-03-21 22:43:41 +01:00
import toastService from "../services/toast.js";
import ws from "../services/ws.js";
import options from "../services/options.js";
import syncService from "../services/sync.js";
2021-03-20 00:00:49 +01:00
const TPL = `
2021-03-21 22:43:41 +01:00
<div class="sync-status-widget">
2021-03-20 00:00:49 +01:00
<style>
2021-03-21 22:43:41 +01:00
.sync-status-widget {
2021-03-20 00:00:49 +01:00
box-sizing: border-box;
}
.sync-status {
box-sizing: border-box;
}
2021-03-21 22:43:41 +01:00
.sync-status .sync-status-icon {
2021-05-18 22:49:47 +02:00
font-size: 150%;
2021-03-21 22:43:41 +01:00
display: inline-block;
2021-05-18 22:49:47 +02:00
padding: 10px;
2021-03-20 00:00:49 +01:00
position: relative;
}
2021-03-21 23:45:15 +01:00
.sync-status .sync-status-sub-icon {
font-size: 40%;
position: absolute;
2021-05-18 22:49:47 +02:00
left: 9px;
top: 24px;
2021-03-21 23:45:15 +01:00
}
2021-03-21 22:43:41 +01:00
.sync-status .sync-status-icon span {
border: none !important;
2021-03-20 00:00:49 +01:00
}
2021-03-21 22:43:41 +01:00
.sync-status-icon:not(.sync-status-in-progress):hover {
background-color: var(--hover-item-background-color);
cursor: pointer;
2021-03-20 00:00:49 +01:00
}
</style>
<div class="sync-status">
2021-05-18 22:49:47 +02:00
<span class="sync-status-icon sync-status-unknown bx bx-time"
data-toggle="tooltip"
2021-05-22 21:51:40 +02:00
data-placement="right"
title="<p>Sync status will be known once the next sync attempt starts.</p><p>Click to trigger sync now.</p>">
</span>
2021-05-18 22:49:47 +02:00
<span class="sync-status-icon sync-status-connected-with-changes bx-wifi"
data-toggle="tooltip"
2021-05-22 21:51:40 +02:00
data-placement="right"
title="<p>Connected to the sync server. <br>There are some outstanding changes yet to be synced.</p><p>Click to trigger sync.</p>">
2021-03-21 23:45:15 +01:00
<span class="bx bxs-star sync-status-sub-icon"></span>
2021-03-21 22:43:41 +01:00
</span>
2021-05-18 22:49:47 +02:00
<span class="sync-status-icon sync-status-connected-no-changes bx bx-wifi"
2021-03-21 22:43:41 +01:00
data-toggle="tooltip"
2021-05-22 21:51:40 +02:00
data-placement="right"
2021-03-21 22:43:41 +01:00
title="<p>Connected to the sync server.<br>All changes have been already synced.</p><p>Click to trigger sync.</p>">
</span>
2021-05-18 22:49:47 +02:00
<span class="sync-status-icon sync-status-disconnected-with-changes bx bx-wifi-off"
2021-03-21 22:43:41 +01:00
data-toggle="tooltip"
2021-05-22 21:51:40 +02:00
data-placement="right"
2021-03-21 22:43:41 +01:00
title="<p>Establishing the connection to the sync server was unsuccessful.<br>There are some outstanding changes yet to be synced.</p><p>Click to trigger sync.</p>">
2021-03-21 23:45:15 +01:00
<span class="bx bxs-star sync-status-sub-icon"></span>
2021-03-21 22:43:41 +01:00
</span>
2021-05-18 22:49:47 +02:00
<span class="sync-status-icon sync-status-disconnected-no-changes bx bx-wifi-off"
2021-03-21 22:43:41 +01:00
data-toggle="tooltip"
2021-05-22 21:51:40 +02:00
data-placement="right"
2021-03-21 22:43:41 +01:00
title="<p>Establishing the connection to the sync server was unsuccessful.<br>All known changes have been synced.</p><p>Click to trigger sync.</p>">
</span>
2021-05-18 22:49:47 +02:00
<span class="sync-status-icon sync-status-in-progress bx bx-analyse bx-spin"
2021-03-21 22:43:41 +01:00
data-toggle="tooltip"
2021-05-22 21:51:40 +02:00
data-placement="right"
2021-03-21 22:43:41 +01:00
title="Sync with the server is in progress.">
</span>
2021-03-20 00:00:49 +01:00
</div>
</div>
`;
export default class SyncStatusWidget extends BasicWidget {
2021-03-21 22:43:41 +01:00
constructor() {
super();
ws.subscribeToMessages(message => this.processMessage(message));
this.syncState = 'unknown';
2021-03-21 22:43:41 +01:00
this.allChangesPushed = false;
}
2021-03-20 00:00:49 +01:00
doRender() {
this.$widget = $(TPL);
2021-03-21 00:01:28 +01:00
this.$widget.hide();
2021-03-21 22:43:41 +01:00
this.$widget.find('[data-toggle="tooltip"]').tooltip({
html: true
});
2021-03-21 00:01:28 +01:00
2021-03-21 22:43:41 +01:00
this.$widget.find('.sync-status-icon:not(.sync-status-in-progress)')
.on('click', () => syncService.syncNow())
2021-03-21 00:01:28 +01:00
}
showIcon(className) {
2021-03-21 22:43:41 +01:00
if (!options.get('syncServerHost')) {
2021-05-15 13:44:12 +02:00
this.toggleInt(false);
2021-03-21 22:43:41 +01:00
return;
}
2021-03-21 00:01:28 +01:00
this.$widget.show();
this.$widget.find('.sync-status-icon').hide();
this.$widget.find('.sync-status-' + className).show();
}
2021-03-21 22:43:41 +01:00
processMessage(message) {
if (message.type === 'sync-pull-in-progress') {
toastService.showPersistent({
id: 'sync',
title: "Sync status",
message: "Sync update in progress",
icon: "refresh"
});
this.syncState = 'in-progress';
2021-05-15 22:00:53 +02:00
this.lastSyncedPush = message.lastSyncedPush;
2021-03-21 22:43:41 +01:00
}
else if (message.type === 'sync-push-in-progress') {
this.syncState = 'in-progress';
2021-05-15 22:00:53 +02:00
this.lastSyncedPush = message.lastSyncedPush;
2021-03-21 22:43:41 +01:00
}
else if (message.type === 'sync-finished') {
// this gives user a chance to see the toast in case of fast sync finish
setTimeout(() => toastService.closePersistent('sync'), 1000);
this.syncState = 'connected';
2021-05-15 22:00:53 +02:00
this.lastSyncedPush = message.lastSyncedPush;
2021-03-21 22:43:41 +01:00
}
else if (message.type === 'sync-failed') {
this.syncState = 'disconnected';
2021-05-15 22:00:53 +02:00
this.lastSyncedPush = message.lastSyncedPush;
2021-03-21 22:43:41 +01:00
}
else if (message.type === 'frontend-update') {
2021-05-15 22:00:53 +02:00
this.lastSyncedPush = message.data.lastSyncedPush;
2021-03-21 22:43:41 +01:00
}
2021-05-15 22:00:53 +02:00
this.allChangesPushed = this.lastSyncedPush === ws.getMaxKnownEntityChangeSyncId();
2021-05-15 13:44:12 +02:00
if (['unknown', 'in-progress'].includes(this.syncState)) {
this.showIcon(this.syncState);
} else {
2021-03-21 22:43:41 +01:00
this.showIcon(this.syncState + '-' + (this.allChangesPushed ? 'no-changes' : 'with-changes'));
}
}
2021-03-20 00:00:49 +01:00
}