mirror of
https://github.com/everoddandeven/monerod-gui.git
synced 2024-12-22 19:49:27 +00:00
Start/Stop Sync
This commit is contained in:
parent
09782e68f7
commit
fb854862cf
8 changed files with 130 additions and 19 deletions
|
@ -38,6 +38,7 @@
|
||||||
],
|
],
|
||||||
"scripts": [
|
"scripts": [
|
||||||
"node_modules/jquery/dist/jquery.min.js",
|
"node_modules/jquery/dist/jquery.min.js",
|
||||||
|
"node_modules/@popperjs/core/dist/umd/popper.min.js",
|
||||||
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js",
|
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js",
|
||||||
"node_modules/bootstrap-table/dist/bootstrap-table.min.js"
|
"node_modules/bootstrap-table/dist/bootstrap-table.min.js"
|
||||||
],
|
],
|
||||||
|
|
1
package-lock.json
generated
1
package-lock.json
generated
|
@ -17,6 +17,7 @@
|
||||||
"@angular/platform-browser": "17.3.12",
|
"@angular/platform-browser": "17.3.12",
|
||||||
"@angular/platform-browser-dynamic": "17.3.12",
|
"@angular/platform-browser-dynamic": "17.3.12",
|
||||||
"@angular/router": "17.3.12",
|
"@angular/router": "17.3.12",
|
||||||
|
"@popperjs/core": "2.11.8",
|
||||||
"bootstrap": "5.3.3",
|
"bootstrap": "5.3.3",
|
||||||
"bootstrap-icons": "1.11.3",
|
"bootstrap-icons": "1.11.3",
|
||||||
"bootstrap-table": "1.23.5",
|
"bootstrap-table": "1.23.5",
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
"@angular/platform-browser": "17.3.12",
|
"@angular/platform-browser": "17.3.12",
|
||||||
"@angular/platform-browser-dynamic": "17.3.12",
|
"@angular/platform-browser-dynamic": "17.3.12",
|
||||||
"@angular/router": "17.3.12",
|
"@angular/router": "17.3.12",
|
||||||
|
"@popperjs/core": "2.11.8",
|
||||||
"bootstrap": "5.3.3",
|
"bootstrap": "5.3.3",
|
||||||
"bootstrap-icons": "1.11.3",
|
"bootstrap-icons": "1.11.3",
|
||||||
"bootstrap-table": "1.23.5",
|
"bootstrap-table": "1.23.5",
|
||||||
|
|
|
@ -139,8 +139,8 @@ export class DaemonService {
|
||||||
this.settings = new DaemonSettings();
|
this.settings = new DaemonSettings();
|
||||||
|
|
||||||
window.electronAPI.onMoneroClose((event: any, code: number) => {
|
window.electronAPI.onMoneroClose((event: any, code: number) => {
|
||||||
console.log(event);
|
console.debug(event);
|
||||||
console.log(code);
|
console.debug(code);
|
||||||
this.onClose();
|
this.onClose();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -963,7 +963,6 @@ export class DaemonService {
|
||||||
this.onDaemonStopStart.emit();
|
this.onDaemonStopStart.emit();
|
||||||
|
|
||||||
const response = await this.callRpc(new StopDaemonRequest());
|
const response = await this.callRpc(new StopDaemonRequest());
|
||||||
console.log(response);
|
|
||||||
|
|
||||||
if (typeof response.status == 'string' && response.status != 'OK') {
|
if (typeof response.status == 'string' && response.status != 'OK') {
|
||||||
window.electronAPI.showNotification({
|
window.electronAPI.showNotification({
|
||||||
|
|
|
@ -142,9 +142,14 @@ export class DetailComponent extends BasePageComponent implements AfterViewInit
|
||||||
private get syncProgress(): string {
|
private get syncProgress(): string {
|
||||||
const targetHeight = this.targetHeight;
|
const targetHeight = this.targetHeight;
|
||||||
const height = this.height;
|
const height = this.height;
|
||||||
console.log(`Sync progress, height ${height},targetHeight ${targetHeight}`)
|
|
||||||
|
const progress = `${(height*100/targetHeight).toFixed(2)} %`;
|
||||||
|
|
||||||
return `${(height*100/targetHeight).toFixed(2)} %`;
|
if (height < targetHeight && progress == '100 %') {
|
||||||
|
return '99.99 %';
|
||||||
|
}
|
||||||
|
|
||||||
|
return progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
private get wasBootstrapEverUsed(): boolean {
|
private get wasBootstrapEverUsed(): boolean {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { AfterViewInit, Component, NgZone } from '@angular/core';
|
import { AfterContentInit, AfterViewInit, Component, NgZone } from '@angular/core';
|
||||||
import { DaemonService, DaemonDataService } from '../../core/services';
|
import { DaemonService, DaemonDataService } from '../../core/services';
|
||||||
import { NavbarLink, NavbarService } from '../../shared/components';
|
import { NavbarLink, NavbarService } from '../../shared/components';
|
||||||
import { AddedAuxPow, AuxPoW, BlockTemplate, GeneratedBlocks, MiningStatus, MinerData, Chain } from '../../../common';
|
import { AddedAuxPow, AuxPoW, BlockTemplate, GeneratedBlocks, MiningStatus, MinerData, Chain } from '../../../common';
|
||||||
|
@ -10,7 +10,7 @@ import { SimpleBootstrapCard } from '../../shared/utils';
|
||||||
templateUrl: './mining.component.html',
|
templateUrl: './mining.component.html',
|
||||||
styleUrl: './mining.component.scss'
|
styleUrl: './mining.component.scss'
|
||||||
})
|
})
|
||||||
export class MiningComponent extends BasePageComponent implements AfterViewInit {
|
export class MiningComponent extends BasePageComponent implements AfterViewInit, AfterContentInit {
|
||||||
|
|
||||||
public get coreBusy(): boolean {
|
public get coreBusy(): boolean {
|
||||||
return this.daemonData.info? !this.daemonData.info.synchronized : true;
|
return this.daemonData.info? !this.daemonData.info.synchronized : true;
|
||||||
|
@ -153,8 +153,12 @@ export class MiningComponent extends BasePageComponent implements AfterViewInit
|
||||||
}
|
}
|
||||||
|
|
||||||
public ngAfterViewInit(): void {
|
public ngAfterViewInit(): void {
|
||||||
console.log('DetailComponent AFTER VIEW INIT');
|
|
||||||
this.loadTables();
|
this.loadTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override ngAfterContentInit(): void {
|
||||||
|
super.ngAfterContentInit();
|
||||||
|
|
||||||
this.cards = this.createCards();
|
this.cards = this.createCards();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,30 +23,49 @@
|
||||||
<strong>Monero Daemon</strong>
|
<strong>Monero Daemon</strong>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
<ul class="navbar-nav flex-row" style="margin-left: auto;">
|
||||||
|
|
||||||
|
|
||||||
|
<li *ngIf="!quitting && running && syncDisabled && !starting && !restarting && !installing && !upgrading" class="nav-item text-nowrap">
|
||||||
|
<button [disabled]="enablingSync || syncDisabledByPeriodPolicy || syncDisabledByWifiPolicy" class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Start Sync" aria-expanded="false" aria-label="Start Sync" (click)="startSync()">
|
||||||
|
<i class="bi bi-wifi"></i>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li *ngIf="!quitting && running && !syncDisabled && !starting && !restarting && !installing && !upgrading" class="nav-item text-nowrap">
|
||||||
|
<button [disabled]="disablingSync" class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Stop Sync" aria-expanded="false" aria-label="Stop Sync" (click)="stopSync()">
|
||||||
|
<i class="bi bi-wifi-off"></i>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
<ul class="navbar-nav flex-row">
|
<ul class="navbar-nav flex-row">
|
||||||
<li *ngIf="!quitting && !running && !stopping && !starting && !restarting && !installing && !upgrading && daemonConfigured" class="nav-item text-nowrap">
|
<li *ngIf="!quitting && !running && !stopping && !restarting && !installing && !upgrading && daemonConfigured" class="nav-item text-nowrap">
|
||||||
<button class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="collapse" aria-expanded="false" aria-label="Start daemon" (click)="startDaemon()">
|
<button [disabled]="starting || enablingSync || disablingSync" class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Start Daemon" aria-expanded="false" aria-label="Start daemon" (click)="startDaemon()">
|
||||||
<i class="bi bi-play-fill"></i>
|
<i class="bi bi-play-fill"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li *ngIf="!quitting && running && !stopping && !starting && !restarting && !installing && !upgrading" class="nav-item text-nowrap">
|
<li *ngIf="!quitting && running && !starting && !restarting && !installing && !upgrading" class="nav-item text-nowrap">
|
||||||
<button class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="collapse" aria-expanded="false" aria-label="Stop daemon" (click)="stopDaemon()">
|
<button [disabled]="stopping || disablingSync || enablingSync" class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Stop Daemon" aria-expanded="false" aria-label="Stop daemon" (click)="stopDaemon()">
|
||||||
<i class="bi bi-stop-fill"></i>
|
<i class="bi bi-stop-fill"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li *ngIf="!quitting && running && !stopping && !starting && !installing && !upgrading" class="nav-item text-nowrap">
|
<li *ngIf="!quitting && running && !installing && !upgrading" class="nav-item text-nowrap">
|
||||||
<button class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="collapse" aria-expanded="false" aria-label="Restart daemon" (click)="restartDaemon()">
|
<button [disabled]="stopping || starting || disablingSync || enablingSync" class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Restart Daemon" aria-expanded="false" aria-label="Restart daemon" (click)="restartDaemon()">
|
||||||
<i class="bi bi-arrow-clockwise"></i>
|
<i class="bi bi-arrow-clockwise"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item text-nowrap">
|
<li class="nav-item text-nowrap">
|
||||||
<button class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="offcanvas" aria-label="Quit" [disabled]="stopping || starting || quitting || restarting || upgrading || installing" (click)="quit()">
|
<button class="btn btn-outline-secondary px-3 text-white" type="button" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Quit Daemon" aria-label="Quit" [disabled]="stopping || starting || quitting || restarting || upgrading || installing || enablingSync || disablingSync" (click)="quit()">
|
||||||
<i class="bi bi-power"></i>
|
<i class="bi bi-power"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
import { Component, NgZone, OnDestroy } from '@angular/core';
|
import { AfterViewInit, Component, NgZone, OnDestroy } from '@angular/core';
|
||||||
import { NavbarService } from './navbar.service';
|
import { NavbarService } from './navbar.service';
|
||||||
import { NavbarLink } from './navbar.model';
|
import { NavbarLink } from './navbar.model';
|
||||||
import { DaemonService } from '../../../core/services/daemon/daemon.service';
|
import { DaemonService } from '../../../core/services/daemon/daemon.service';
|
||||||
import { MoneroInstallerService } from '../../../core/services';
|
import { DaemonDataService, MoneroInstallerService } from '../../../core/services';
|
||||||
import { DaemonSettings } from '../../../../common';
|
import { DaemonSettings } from '../../../../common';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
import * as bootstrap from 'bootstrap';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-navbar',
|
selector: 'app-navbar',
|
||||||
templateUrl: './navbar.component.html',
|
templateUrl: './navbar.component.html',
|
||||||
styleUrl: './navbar.component.scss'
|
styleUrl: './navbar.component.scss'
|
||||||
})
|
})
|
||||||
export class NavbarComponent implements OnDestroy {
|
export class NavbarComponent implements AfterViewInit, OnDestroy {
|
||||||
|
|
||||||
private _running: boolean = false;
|
private _running: boolean = false;
|
||||||
|
|
||||||
|
@ -51,38 +52,87 @@ export class NavbarComponent implements OnDestroy {
|
||||||
return this.daemonSettings.monerodPath != '';
|
return this.daemonSettings.monerodPath != '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get syncDisabled(): boolean {
|
||||||
|
return this.syncDisabledByPeriodPolicy || this.syncDisabledByWifiPolicy || this.daemonService.settings.noSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get syncDisabledByPeriodPolicy(): boolean {
|
||||||
|
return this.daemonData.syncDisabledByPeriodPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get syncDisabledByWifiPolicy(): boolean {
|
||||||
|
return this.daemonData.syncDisabledByWifiPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public disablingSync: boolean = false;
|
||||||
|
public enablingSync: boolean = false;
|
||||||
|
|
||||||
private daemonSettings: DaemonSettings = new DaemonSettings();
|
private daemonSettings: DaemonSettings = new DaemonSettings();
|
||||||
private subscriptions: Subscription[] = [];
|
private subscriptions: Subscription[] = [];
|
||||||
|
|
||||||
constructor(private navbarService: NavbarService, private daemonService: DaemonService, private installerService: MoneroInstallerService, private ngZone: NgZone) {
|
constructor(private navbarService: NavbarService, private daemonService: DaemonService, private daemonData: DaemonDataService, private installerService: MoneroInstallerService, private ngZone: NgZone) {
|
||||||
const onSavedSettingsSub: Subscription = this.daemonService.onSavedSettings.subscribe((settings: DaemonSettings) => {
|
const onSavedSettingsSub: Subscription = this.daemonService.onSavedSettings.subscribe((settings: DaemonSettings) => {
|
||||||
this.daemonSettings = settings;
|
this.daemonSettings = settings;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.daemonService.getSettings().then((settings: DaemonSettings) => {
|
this.daemonService.getSettings().then((settings: DaemonSettings) => {
|
||||||
this.daemonSettings = settings;
|
this.daemonSettings = settings;
|
||||||
|
this.enableToolTips();
|
||||||
}).catch((error: any) => {
|
}).catch((error: any) => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
this.enableToolTips();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.daemonService.isRunning().then((running: boolean) => {
|
this.daemonService.isRunning().then((running: boolean) => {
|
||||||
this.ngZone.run(() => {
|
this.ngZone.run(() => {
|
||||||
this._running = running;
|
this._running = running;
|
||||||
|
this.enableToolTips();
|
||||||
});
|
});
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
this._running = false;
|
this._running = false;
|
||||||
|
this.enableToolTips();
|
||||||
});
|
});
|
||||||
|
|
||||||
const onStatusChangedSub: Subscription = this.daemonService.onDaemonStatusChanged.subscribe((running: boolean) => {
|
const onStatusChangedSub: Subscription = this.daemonService.onDaemonStatusChanged.subscribe((running: boolean) => {
|
||||||
this.ngZone.run(() => {
|
this.ngZone.run(() => {
|
||||||
this._running = running;
|
this._running = running;
|
||||||
|
this.enableToolTips();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
this.subscriptions.push(onSavedSettingsSub, onStatusChangedSub);
|
this.subscriptions.push(onSavedSettingsSub, onStatusChangedSub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private lastTooltips: bootstrap.Tooltip[] = [];
|
||||||
|
|
||||||
|
private disposeTooltips(): void {
|
||||||
|
this.lastTooltips.forEach((tooltip) => {
|
||||||
|
tooltip.hide();
|
||||||
|
tooltip.dispose();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.lastTooltips = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private enableToolTips(): void {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.disposeTooltips();
|
||||||
|
|
||||||
|
const tooltipTriggerList: Element[] = [] ;
|
||||||
|
|
||||||
|
const queryResult = document.querySelectorAll('[data-bs-toggle="tooltip"]');
|
||||||
|
|
||||||
|
queryResult.forEach((el) => tooltipTriggerList.push(el));
|
||||||
|
|
||||||
|
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl, {
|
||||||
|
placement: 'bottom'
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.lastTooltips = tooltipList;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
public async startDaemon(): Promise<void> {
|
public async startDaemon(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
await this.daemonService.startDaemon();
|
await this.daemonService.startDaemon();
|
||||||
|
@ -103,12 +153,43 @@ export class NavbarComponent implements OnDestroy {
|
||||||
await this.daemonService.restartDaemon();
|
await this.daemonService.restartDaemon();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async startSync(): Promise<void> {
|
||||||
|
this.enablingSync = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.daemonService.enableSync();
|
||||||
|
}
|
||||||
|
catch(error: any) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.enablingSync = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async stopSync(): Promise<void> {
|
||||||
|
this.disablingSync = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.daemonService.disableSync();
|
||||||
|
}
|
||||||
|
catch(error: any) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.disablingSync = false;
|
||||||
|
}
|
||||||
|
|
||||||
public async quit(): Promise<void> {
|
public async quit(): Promise<void> {
|
||||||
await this.daemonService.quit();
|
await this.daemonService.quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ngAfterViewInit(): void {
|
||||||
|
this.enableToolTips();
|
||||||
|
}
|
||||||
|
|
||||||
public ngOnDestroy(): void {
|
public ngOnDestroy(): void {
|
||||||
this.subscriptions.forEach((sub: Subscription) => sub.unsubscribe());
|
this.subscriptions.forEach((sub: Subscription) => sub.unsubscribe());
|
||||||
this.subscriptions = [];
|
this.subscriptions = [];
|
||||||
|
this.disposeTooltips();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue