MultiNode Ready for Testing

MultiNode Ready for Testing
pull/121/head
ShahanaFarooqui 5 years ago
parent 08a609ef85
commit 794c2ad5d9

@ -8,5 +8,5 @@
<link rel="stylesheet" href="styles.bab7f62b489f0c86770d.css"></head> <link rel="stylesheet" href="styles.bab7f62b489f0c86770d.css"></head>
<body> <body>
<rtl-app></rtl-app> <rtl-app></rtl-app>
<script type="text/javascript" src="runtime.26209474bfa8dc87a77c.js"></script><script type="text/javascript" src="polyfills.181b5a67c421a167a96a.js"></script><script type="text/javascript" src="main.303f236883907eaa2a3b.js"></script></body> <script type="text/javascript" src="runtime.26209474bfa8dc87a77c.js"></script><script type="text/javascript" src="polyfills.181b5a67c421a167a96a.js"></script><script type="text/javascript" src="main.9e142f99e4861933b2c8.js"></script></body>
</html> </html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -15,10 +15,6 @@ common.secret_key = crypto.randomBytes(64).toString('hex');
common.nodes = []; common.nodes = [];
common.selectedNode = {}; common.selectedNode = {};
common.getSelectedNode = () => {
return common.selectedNode;
};
common.getSelLNDServerUrl = () => { common.getSelLNDServerUrl = () => {
return common.selectedNode.lnd_server_url; return common.selectedNode.lnd_server_url;
}; };
@ -28,6 +24,7 @@ common.getOptions = () => {
}; };
common.setOptions = () => { common.setOptions = () => {
if(common.nodes[0].options) { return; }
common.nodes.forEach(node => { common.nodes.forEach(node => {
node.options = { node.options = {
url: '', url: '',
@ -39,6 +36,16 @@ common.setOptions = () => {
form: '' form: ''
}; };
}); });
// Options cannot be set before selected node initializes. Updating selected node's options separatly
common.selectedNode.options = {
url: '',
rejectUnauthorized: false,
json: true,
headers: {
'Grpc-Metadata-macaroon': fs.readFileSync(common.selectedNode.macaroon_path + '/admin.macaroon').toString('hex'),
},
form: ''
};
} }
common.findNode = (selNodeIndex) => { common.findNode = (selNodeIndex) => {

@ -379,9 +379,11 @@ connect.setServerConfiguration = () => {
if ((!multiNodeExists && singleNodeExists) || (!multiNodeExists && !singleNodeExists)) { if ((!multiNodeExists && singleNodeExists) || (!multiNodeExists && !singleNodeExists)) {
common.multi_node_setup = false; common.multi_node_setup = false;
connect.setSingleNodeConfiguration(singleNodeConfFile); connect.setSingleNodeConfiguration(singleNodeConfFile);
common.selectedNode = common.findNode(common.nodes[0].index);
} else if ((multiNodeExists && singleNodeExists) || (multiNodeExists && !singleNodeExists)) { } else if ((multiNodeExists && singleNodeExists) || (multiNodeExists && !singleNodeExists)) {
common.multi_node_setup = true; common.multi_node_setup = true;
connect.setMultiNodeConfiguration(multiNodeConfFile); connect.setMultiNodeConfiguration(multiNodeConfFile);
common.selectedNode = common.findNode(common.nodes[0].index);
} }
} }

@ -4,8 +4,9 @@ var logger = require('./logger');
var common = require('../common'); var common = require('../common');
exports.updateSelectedNode = (req, res, next) => { exports.updateSelectedNode = (req, res, next) => {
const selNodeIndex = req.body.selNodeIndex const selNodeIndex = req.body.selNodeIndex;
common.selectedNode = common.findNode(selNodeIndex); common.selectedNode = common.findNode(selNodeIndex);
logger.info('\r\nConf: 9: ' + JSON.stringify(Date.now()) + ': INFO: Selected Node Updated!' + JSON.stringify(common.selectedNode));
res.status(200).json({status: 'Selected Node Updated!'}); res.status(200).json({status: 'Selected Node Updated!'});
}; };

@ -4,12 +4,10 @@ var logger = require('./logger');
var options = {}; var options = {};
exports.getInfo = (req, res, next) => { exports.getInfo = (req, res, next) => {
// Do Not Change the set options & selected Node code sequence
common.setOptions(); common.setOptions();
common.selectedNode = common.findNode(common.nodes[0].index);
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNDServerUrl() + '/getinfo'; options.url = common.getSelLNDServerUrl() + '/getinfo';
logger.info('\r\nSelected Node: ' + JSON.stringify(common.selectedNode));
logger.info('\r\nCalling getinfo from lnd server url: INFO: ' + options.url); logger.info('\r\nCalling getinfo from lnd server url: INFO: ' + options.url);
request(options).then((body) => { request(options).then((body) => {
logger.info('\r\nGetInfo: 9: ' + JSON.stringify(Date.now()) + ': INFO: ' + JSON.stringify(body)); logger.info('\r\nGetInfo: 9: ' + JSON.stringify(Date.now()) + ': INFO: ' + JSON.stringify(body));

@ -1,7 +1,7 @@
var fs = require('fs'); var fs = require('fs');
var common = require('../common'); var common = require('../common');
exports.info = (msgStr, selNode = common.nodes[0]) => { exports.info = (msgStr, selNode = common.selectedNode) => {
if (msgStr.indexOf('Config Setup Variable') === -1) { if (msgStr.indexOf('Config Setup Variable') === -1) {
console.log('Console: ' + msgStr); console.log('Console: ' + msgStr);
} }
@ -16,7 +16,7 @@ exports.info = (msgStr, selNode = common.nodes[0]) => {
} }
} }
exports.error = (msgStr, selNode = common.nodes[0]) => { exports.error = (msgStr, selNode = common.selectedNode) => {
console.error('Console: ' + msgStr); console.error('Console: ' + msgStr);
if(selNode.enable_logging) { if(selNode.enable_logging) {
fs.appendFile(selNode.log_file, msgStr, function(err) { fs.appendFile(selNode.log_file, msgStr, function(err) {

@ -6,6 +6,6 @@ const authCheck = require("./authCheck");
router.get("/rtlconf", RTLConfController.getRTLConfig); router.get("/rtlconf", RTLConfController.getRTLConfig);
router.post("/", authCheck, RTLConfController.updateUISettings); router.post("/", authCheck, RTLConfController.updateUISettings);
router.get("/config/:nodeType", authCheck, RTLConfController.getConfig); router.get("/config/:nodeType", authCheck, RTLConfController.getConfig);
router.post("/updateSelNode", authCheck, RTLConfController.updateSelectedNode); router.post("/updateSelNode", RTLConfController.updateSelectedNode);
module.exports = router; module.exports = router;

@ -15,10 +15,10 @@
<h2>Ride The Lightning <span class="font-60-percent">(Beta)</span></h2> <h2>Ride The Lightning <span class="font-60-percent">(Beta)</span></h2>
</div> </div>
<div fxLayoutAlign="space-between center"> <div fxLayoutAlign="space-between center">
<div *ngIf="appConfig.nodes.length > 0" tabindex="1" fxLayoutAlign="start start" class="nodes-list"> <div *ngIf="appConfig.nodes.length > 1" tabindex="1" fxLayoutAlign="start start" class="nodes-list">
<mat-form-field fxFlex="99"> <mat-form-field fxFlex="99">
<mat-select (selectionChange)="onSelectionChange($event.value)"> <mat-select (selectionChange)="onSelectionChange($event.value)" [value]="selNode">
<mat-option *ngFor="let node of appConfig.nodes; index as idx" [value]="idx"> <mat-option *ngFor="let node of appConfig.nodes; index as idx" [value]="node">
{{node.index}}: {{node.lnNode}} ({{node.lnImplementation}}) {{node.index}}: {{node.lnNode}} ({{node.lnImplementation}})
</mat-option> </mat-option>
</mat-select> </mat-select>

@ -7,7 +7,7 @@ import { Actions } from '@ngrx/effects';
import { UserIdleService } from 'angular-user-idle'; import { UserIdleService } from 'angular-user-idle';
import { LoggerService } from './shared/services/logger.service'; import { LoggerService } from './shared/services/logger.service';
import { RTLConfiguration, Settings } from './shared/models/RTLconfig'; import { RTLConfiguration, Settings, Node } from './shared/models/RTLconfig';
import { GetInfo } from './shared/models/lndModels'; import { GetInfo } from './shared/models/lndModels';
import * as RTLActions from './shared/store/rtl.actions'; import * as RTLActions from './shared/store/rtl.actions';
@ -21,7 +21,7 @@ import * as fromRTLReducer from './shared/store/rtl.reducers';
export class AppComponent implements OnInit, AfterViewInit, OnDestroy { export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
@ViewChild('sideNavigation') sideNavigation: any; @ViewChild('sideNavigation') sideNavigation: any;
@ViewChild('settingSidenav') settingSidenav: any; @ViewChild('settingSidenav') settingSidenav: any;
public selNodeIndex = 0; public selNode: Node;
public settings: Settings; public settings: Settings;
public information: GetInfo = {}; public information: GetInfo = {};
public flgLoading: Array<Boolean | 'error'> = [true]; // 0: Info public flgLoading: Array<Boolean | 'error'> = [true]; // 0: Info
@ -40,20 +40,20 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
this.store.select('rtlRoot') this.store.select('rtlRoot')
.pipe(takeUntil(this.unsubs[0])) .pipe(takeUntil(this.unsubs[0]))
.subscribe(rtlStore => { .subscribe(rtlStore => {
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings; this.settings = this.selNode.settings;
this.appConfig = rtlStore.appConfig; this.appConfig = rtlStore.appConfig;
this.information = rtlStore.information; this.information = rtlStore.information;
this.flgLoading[0] = (undefined !== this.information.identity_pubkey) ? false : true; this.flgLoading[0] = (undefined !== this.information.identity_pubkey) ? false : true;
if (window.innerWidth <= 768) { if (window.innerWidth <= 768) {
this.appConfig.nodes[this.selNodeIndex].settings.menu = 'Vertical'; this.settings.menu = 'Vertical';
this.appConfig.nodes[this.selNodeIndex].settings.flgSidenavOpened = false; this.settings.flgSidenavOpened = false;
this.appConfig.nodes[this.selNodeIndex].settings.flgSidenavPinned = false; this.settings.flgSidenavPinned = false;
} }
if (window.innerWidth <= 414) { if (window.innerWidth <= 414) {
this.smallScreen = true; this.smallScreen = true;
} }
this.logger.info(this.appConfig.nodes[this.selNodeIndex].settings); this.logger.info(this.settings);
if (!sessionStorage.getItem('token')) { if (!sessionStorage.getItem('token')) {
this.flgLoading[0] = false; this.flgLoading[0] = false;
} }
@ -75,9 +75,9 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
} }
} }
if ( if (
this.appConfig.nodes[this.selNodeIndex].settings.menu === 'Horizontal' || this.settings.menu === 'Horizontal' ||
this.appConfig.nodes[this.selNodeIndex].settings.menuType === 'Compact' || this.settings.menuType === 'Compact' ||
this.appConfig.nodes[this.selNodeIndex].settings.menuType === 'Mini') { this.settings.menuType === 'Mini') {
this.settingSidenav.toggle(); // To dynamically update the width to 100% after side nav is closed this.settingSidenav.toggle(); // To dynamically update the width to 100% after side nav is closed
setTimeout(() => { this.settingSidenav.toggle(); }, 100); setTimeout(() => { this.settingSidenav.toggle(); }, 100);
} }
@ -126,7 +126,7 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
} }
ngAfterViewInit() { ngAfterViewInit() {
if (!this.appConfig.nodes[this.selNodeIndex].settings.flgSidenavPinned) { if (!this.settings.flgSidenavPinned) {
this.sideNavigation.close(); this.sideNavigation.close();
this.settingSidenav.toggle(); this.settingSidenav.toggle();
} }
@ -139,9 +139,9 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
@HostListener('window:resize') @HostListener('window:resize')
public onWindowResize(): void { public onWindowResize(): void {
if (window.innerWidth <= 768) { if (window.innerWidth <= 768) {
this.appConfig.nodes[this.selNodeIndex].settings.menu = 'Vertical'; this.settings.menu = 'Vertical';
this.appConfig.nodes[this.selNodeIndex].settings.flgSidenavOpened = false; this.settings.flgSidenavOpened = false;
this.appConfig.nodes[this.selNodeIndex].settings.flgSidenavPinned = false; this.settings.flgSidenavPinned = false;
} }
} }
@ -161,10 +161,10 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
this.logger.info('Copied Text: ' + payload); this.logger.info('Copied Text: ' + payload);
} }
onSelectionChange(val: number) { onSelectionChange(selNodeValue: Node) {
console.warn(val); this.selNode = selNodeValue;
this.selNodeIndex = val; this.store.dispatch(new RTLActions.OpenSpinner('Updating Selected Node...'));
this.store.dispatch(new RTLActions.SetSelNodeIndex(this.selNodeIndex)); this.store.dispatch(new RTLActions.SetSelelectedNode(selNodeValue));
} }
ngOnDestroy() { ngOnDestroy() {

@ -9,7 +9,7 @@
</mat-card-header> </mat-card-header>
<mat-card-content> <mat-card-content>
<div class="padding-gap"> <div class="padding-gap">
<h3 *ngIf="settings?.satsToBTC; else smallerUnit">Total Limbo Balance: <h3 *ngIf="selNode?.settings?.satsToBTC; else smallerUnit">Total Limbo Balance:
{{pendingChannels.btc_total_limbo_balance | number}} {{information?.currency_unit}}</h3> {{pendingChannels.btc_total_limbo_balance | number}} {{information?.currency_unit}}</h3>
<ng-template #smallerUnit> <ng-template #smallerUnit>
<h3>Total Limbo Balance: {{pendingChannels.total_limbo_balance | number}} <h3>Total Limbo Balance: {{pendingChannels.total_limbo_balance | number}}

@ -5,7 +5,7 @@ import { Store } from '@ngrx/store';
import { MatTableDataSource, MatSort } from '@angular/material'; import { MatTableDataSource, MatSort } from '@angular/material';
import { Channel, GetInfo, PendingChannels } from '../../../shared/models/lndModels'; import { Channel, GetInfo, PendingChannels } from '../../../shared/models/lndModels';
import { Settings } from '../../../shared/models/RTLconfig'; import { Node } from '../../../shared/models/RTLconfig';
import { LoggerService } from '../../../shared/services/logger.service'; import { LoggerService } from '../../../shared/services/logger.service';
import { RTLEffects } from '../../../shared/store/rtl.effects'; import { RTLEffects } from '../../../shared/store/rtl.effects';
@ -19,9 +19,8 @@ import * as fromRTLReducer from '../../../shared/store/rtl.reducers';
}) })
export class ChannelPendingComponent implements OnInit, OnDestroy { export class ChannelPendingComponent implements OnInit, OnDestroy {
@ViewChild(MatSort) sort: MatSort; @ViewChild(MatSort) sort: MatSort;
public selNodeIndex = 0; public selNode: Node;
public selectedFilter = 0; public selectedFilter = 0;
public settings: Settings;
public information: GetInfo = {}; public information: GetInfo = {};
public pendingChannels: PendingChannels = {}; public pendingChannels: PendingChannels = {};
public displayedClosingColumns = [ public displayedClosingColumns = [
@ -106,8 +105,7 @@ export class ChannelPendingComponent implements OnInit, OnDestroy {
} }
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings;
this.information = rtlStore.information; this.information = rtlStore.information;
this.pendingChannels = rtlStore.pendingChannels; this.pendingChannels = rtlStore.pendingChannels;
if (undefined !== this.pendingChannels.total_limbo_balance) { if (undefined !== this.pendingChannels.total_limbo_balance) {

@ -11,7 +11,7 @@
<mat-icon class="icon-large">account_balance_wallet</mat-icon> <mat-icon class="icon-large">account_balance_wallet</mat-icon>
</mat-card-content> </mat-card-content>
<span *ngIf="information?.currency_unit; else withoutData"> <span *ngIf="information?.currency_unit; else withoutData">
<h3 *ngIf="settings?.satsToBTC; else smallerUnit1">{{BTCtotalBalance | number}} {{information?.currency_unit}}</h3> <h3 *ngIf="selNode?.settings?.satsToBTC; else smallerUnit1">{{BTCtotalBalance | number}} {{information?.currency_unit}}</h3>
<ng-template #smallerUnit1><h3>{{totalBalance | number}} {{information?.smaller_currency_unit}}</h3></ng-template> <ng-template #smallerUnit1><h3>{{totalBalance | number}} {{information?.smaller_currency_unit}}</h3></ng-template>
</span> </span>
</mat-card-content> </mat-card-content>
@ -51,7 +51,7 @@
<mat-icon class="icon-large">linear_scale</mat-icon> <mat-icon class="icon-large">linear_scale</mat-icon>
</mat-card-content> </mat-card-content>
<span *ngIf="information?.currency_unit; else withoutData"> <span *ngIf="information?.currency_unit; else withoutData">
<h3 *ngIf="settings?.satsToBTC; else smallerUnit2">{{BTCchannelBalance | number}} {{information?.currency_unit}}</h3> <h3 *ngIf="selNode?.settings?.satsToBTC; else smallerUnit2">{{BTCchannelBalance | number}} {{information?.currency_unit}}</h3>
<ng-template #smallerUnit2><h3>{{channelBalance | number}} {{information?.smaller_currency_unit}}</h3></ng-template> <ng-template #smallerUnit2><h3>{{channelBalance | number}} {{information?.smaller_currency_unit}}</h3></ng-template>
</span> </span>
</mat-card-content> </mat-card-content>
@ -180,8 +180,8 @@
<mat-card-content> <mat-card-content>
<div fxLayout="column" class="pl-4 network-info-list"> <div fxLayout="column" class="pl-4 network-info-list">
<mat-list fxLayoutAlign="start start"> <mat-list fxLayoutAlign="start start">
<mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="settings?.satsToBTC; else smallerUnit6">Network Capacity ({{information?.currency_unit}})</mat-list-item> <mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="selNode?.settings?.satsToBTC; else smallerUnit6">Network Capacity ({{information?.currency_unit}})</mat-list-item>
<mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="settings?.satsToBTC; else smallerData6">{{networkInfo?.btc_total_network_capacity | number}}</mat-list-item> <mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="selNode?.settings?.satsToBTC; else smallerData6">{{networkInfo?.btc_total_network_capacity | number}}</mat-list-item>
<ng-template #smallerUnit6><mat-list-item fxFlex="65" fxLayoutAlign="start start">Network Capacity ({{information?.smaller_currency_unit}})</mat-list-item></ng-template> <ng-template #smallerUnit6><mat-list-item fxFlex="65" fxLayoutAlign="start start">Network Capacity ({{information?.smaller_currency_unit}})</mat-list-item></ng-template>
<ng-template #smallerData6><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.total_network_capacity | number}}</mat-list-item></ng-template> <ng-template #smallerData6><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.total_network_capacity | number}}</mat-list-item></ng-template>
<mat-divider></mat-divider> <mat-divider></mat-divider>
@ -207,23 +207,23 @@
<mat-divider></mat-divider> <mat-divider></mat-divider>
</mat-list> </mat-list>
<mat-list fxLayoutAlign="start start"> <mat-list fxLayoutAlign="start start">
<mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="settings?.satsToBTC; else smallerUnit7">Max Channel Size ({{information?.currency_unit}})</mat-list-item> <mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="selNode?.settings?.satsToBTC; else smallerUnit7">Max Channel Size ({{information?.currency_unit}})</mat-list-item>
<ng-template #smallerUnit7><mat-list-item fxFlex="65" fxLayoutAlign="start start">Max Channel Size ({{information?.smaller_currency_unit}})</mat-list-item></ng-template> <ng-template #smallerUnit7><mat-list-item fxFlex="65" fxLayoutAlign="start start">Max Channel Size ({{information?.smaller_currency_unit}})</mat-list-item></ng-template>
<mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="settings?.satsToBTC; else smallerData7">{{networkInfo?.btc_max_channel_size | number}}</mat-list-item> <mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="selNode?.settings?.satsToBTC; else smallerData7">{{networkInfo?.btc_max_channel_size | number}}</mat-list-item>
<ng-template #smallerData7><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.max_channel_size | number}}</mat-list-item></ng-template> <ng-template #smallerData7><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.max_channel_size | number}}</mat-list-item></ng-template>
<mat-divider></mat-divider> <mat-divider></mat-divider>
</mat-list> </mat-list>
<mat-list fxLayoutAlign="start start"> <mat-list fxLayoutAlign="start start">
<mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="settings?.satsToBTC; else smallerUnit8">Avg Channel Size ({{information?.currency_unit}})</mat-list-item> <mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="selNode?.settings?.satsToBTC; else smallerUnit8">Avg Channel Size ({{information?.currency_unit}})</mat-list-item>
<ng-template #smallerUnit8><mat-list-item fxFlex="65" fxLayoutAlign="start start">Avg Channel Size ({{information?.smaller_currency_unit}})</mat-list-item></ng-template> <ng-template #smallerUnit8><mat-list-item fxFlex="65" fxLayoutAlign="start start">Avg Channel Size ({{information?.smaller_currency_unit}})</mat-list-item></ng-template>
<mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="settings?.satsToBTC; else smallerData8">{{networkInfo?.btc_avg_channel_size | number}}</mat-list-item> <mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="selNode?.settings?.satsToBTC; else smallerData8">{{networkInfo?.btc_avg_channel_size | number}}</mat-list-item>
<ng-template #smallerData8><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.avg_channel_size | number:'1.0-2'}}</mat-list-item></ng-template> <ng-template #smallerData8><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.avg_channel_size | number:'1.0-2'}}</mat-list-item></ng-template>
<mat-divider></mat-divider> <mat-divider></mat-divider>
</mat-list> </mat-list>
<mat-list fxLayoutAlign="start start"> <mat-list fxLayoutAlign="start start">
<mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="settings?.satsToBTC; else smallerUnit9">Min Channel Size ({{information?.currency_unit}})</mat-list-item> <mat-list-item fxFlex="65" fxLayoutAlign="start start" *ngIf="selNode?.settings?.satsToBTC; else smallerUnit9">Min Channel Size ({{information?.currency_unit}})</mat-list-item>
<ng-template #smallerUnit9><mat-list-item fxFlex="65" fxLayoutAlign="start start">Min Channel Size ({{information?.smaller_currency_unit}})</mat-list-item></ng-template> <ng-template #smallerUnit9><mat-list-item fxFlex="65" fxLayoutAlign="start start">Min Channel Size ({{information?.smaller_currency_unit}})</mat-list-item></ng-template>
<mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="settings?.satsToBTC; else smallerData9">{{networkInfo?.btc_min_channel_size | number}}</mat-list-item> <mat-list-item fxFlex="25" fxLayoutAlign="end start" *ngIf="selNode?.settings?.satsToBTC; else smallerData9">{{networkInfo?.btc_min_channel_size | number}}</mat-list-item>
<ng-template #smallerData9><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.min_channel_size | number}}</mat-list-item></ng-template> <ng-template #smallerData9><mat-list-item fxFlex="25" fxLayoutAlign="end start">{{networkInfo?.min_channel_size | number}}</mat-list-item></ng-template>
<mat-divider></mat-divider> <mat-divider></mat-divider>
</mat-list> </mat-list>

@ -5,7 +5,7 @@ import { Store } from '@ngrx/store';
import { LoggerService } from '../../shared/services/logger.service'; import { LoggerService } from '../../shared/services/logger.service';
import { GetInfo, NetworkInfo, Fees, Peer } from '../../shared/models/lndModels'; import { GetInfo, NetworkInfo, Fees, Peer } from '../../shared/models/lndModels';
import { Settings } from '../../shared/models/RTLconfig'; import { Node } from '../../shared/models/RTLconfig';
import * as fromRTLReducer from '../../shared/store/rtl.reducers'; import * as fromRTLReducer from '../../shared/store/rtl.reducers';
@ -15,8 +15,7 @@ import * as fromRTLReducer from '../../shared/store/rtl.reducers';
styleUrls: ['./home.component.scss'] styleUrls: ['./home.component.scss']
}) })
export class HomeComponent implements OnInit, OnDestroy { export class HomeComponent implements OnInit, OnDestroy {
public selNodeIndex = 0; public selNode: Node;
public settings: Settings;
public fees: Fees; public fees: Fees;
public information: GetInfo = {}; public information: GetInfo = {};
public remainder = 0; public remainder = 0;
@ -89,8 +88,7 @@ export class HomeComponent implements OnInit, OnDestroy {
this.flgLoading[6] = 'error'; this.flgLoading[6] = 'error';
} }
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings;
this.information = rtlStore.information; this.information = rtlStore.information;
if (this.flgLoading[0] !== 'error') { if (this.flgLoading[0] !== 'error') {
this.flgLoading[0] = (undefined !== this.information.identity_pubkey) ? false : true; this.flgLoading[0] = (undefined !== this.information.identity_pubkey) ? false : true;

@ -48,8 +48,8 @@
<td mat-cell *matCellDef="let invoice">{{invoice.memo}}</td> <td mat-cell *matCellDef="let invoice">{{invoice.memo}}</td>
</ng-container> </ng-container>
<ng-container matColumnDef="value"> <ng-container matColumnDef="value">
<th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Value ({{(settings?.satsToBTC) ? information?.currency_unit : information?.smaller_currency_unit}}) </th> <th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Value ({{(selNode?.settings?.satsToBTC) ? information?.currency_unit : information?.smaller_currency_unit}}) </th>
<td mat-cell *matCellDef="let invoice"><span fxLayoutAlign="end center"> {{(settings?.satsToBTC) ? (invoice?.btc_value | number:'1.0-3') : (invoice?.value | number)}} </span></td> <td mat-cell *matCellDef="let invoice"><span fxLayoutAlign="end center"> {{(selNode?.settings?.satsToBTC) ? (invoice?.btc_value | number:'1.0-3') : (invoice?.value | number)}} </span></td>
</ng-container> </ng-container>
<ng-container matColumnDef="settled"> <ng-container matColumnDef="settled">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Settled </th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Settled </th>
@ -64,8 +64,8 @@
<td mat-cell *matCellDef="let invoice"><span fxLayoutAlign="end center"> {{invoice.cltv_expiry | number}} </span></td> <td mat-cell *matCellDef="let invoice"><span fxLayoutAlign="end center"> {{invoice.cltv_expiry | number}} </span></td>
</ng-container> </ng-container>
<ng-container matColumnDef="amt_paid_sat"> <ng-container matColumnDef="amt_paid_sat">
<th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Amount Paid ({{(settings?.satsToBTC) ? information?.currency_unit : information?.smaller_currency_unit}})</th> <th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Amount Paid ({{(selNode?.settings?.satsToBTC) ? information?.currency_unit : information?.smaller_currency_unit}})</th>
<td mat-cell *matCellDef="let invoice"><span fxLayoutAlign="end center"> {{(settings?.satsToBTC) ? (invoice?.btc_amt_paid_sat | number:'1.0-3') : (invoice?.amt_paid_sat | number)}} </span></td> <td mat-cell *matCellDef="let invoice"><span fxLayoutAlign="end center"> {{(selNode?.settings?.satsToBTC) ? (invoice?.btc_amt_paid_sat | number:'1.0-3') : (invoice?.amt_paid_sat | number)}} </span></td>
</ng-container> </ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: flgSticky;"></tr> <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: flgSticky;"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;" [@newlyAddedRowAnimation]="(row.memo === newlyAddedInvoiceMemo && row.value === newlyAddedInvoiceValue && flgAnimate) ? 'added' : 'notAdded'" (click)="onInvoiceClick(row, $event)"></tr> <tr mat-row *matRowDef="let row; columns: displayedColumns;" [@newlyAddedRowAnimation]="(row.memo === newlyAddedInvoiceMemo && row.value === newlyAddedInvoiceValue && flgAnimate) ? 'added' : 'notAdded'" (click)="onInvoiceClick(row, $event)"></tr>

@ -6,7 +6,7 @@ import { Store } from '@ngrx/store';
import { Actions } from '@ngrx/effects'; import { Actions } from '@ngrx/effects';
import { MatTableDataSource, MatSort } from '@angular/material'; import { MatTableDataSource, MatSort } from '@angular/material';
import { Settings } from '../../shared/models/RTLconfig'; import { Node } from '../../shared/models/RTLconfig';
import { GetInfo, Invoice } from '../../shared/models/lndModels'; import { GetInfo, Invoice } from '../../shared/models/lndModels';
import { LoggerService } from '../../shared/services/logger.service'; import { LoggerService } from '../../shared/services/logger.service';
@ -22,11 +22,10 @@ import * as fromRTLReducer from '../../shared/store/rtl.reducers';
}) })
export class InvoicesComponent implements OnInit, OnDestroy { export class InvoicesComponent implements OnInit, OnDestroy {
@ViewChild(MatSort) sort: MatSort; @ViewChild(MatSort) sort: MatSort;
public selNodeIndex = 0; public selNode: Node;
public newlyAddedInvoiceMemo = ''; public newlyAddedInvoiceMemo = '';
public newlyAddedInvoiceValue = 0; public newlyAddedInvoiceValue = 0;
public flgAnimate = true; public flgAnimate = true;
public settings: Settings;
public memo = ''; public memo = '';
public invoiceValue: number; public invoiceValue: number;
public displayedColumns = []; public displayedColumns = [];
@ -68,8 +67,7 @@ export class InvoicesComponent implements OnInit, OnDestroy {
this.flgLoading[0] = 'error'; this.flgLoading[0] = 'error';
} }
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings;
this.information = rtlStore.information; this.information = rtlStore.information;
this.logger.info(rtlStore); this.logger.info(rtlStore);
this.loadInvoicesTable(rtlStore.invoices); this.loadInvoicesTable(rtlStore.invoices);

@ -9,7 +9,7 @@ import { environment } from '../../../../environments/environment';
import { FlatTreeControl } from '@angular/cdk/tree'; import { FlatTreeControl } from '@angular/cdk/tree';
import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
import { Settings } from '../../../shared/models/RTLconfig'; import { Node, Settings } from '../../../shared/models/RTLconfig';
import { LoggerService } from '../../../shared/services/logger.service'; import { LoggerService } from '../../../shared/services/logger.service';
import { GetInfo, GetInfoChain } from '../../../shared/models/lndModels'; import { GetInfo, GetInfoChain } from '../../../shared/models/lndModels';
import { MenuNode, FlatMenuNode, MENU_DATA } from '../../../shared/models/navMenu'; import { MenuNode, FlatMenuNode, MENU_DATA } from '../../../shared/models/navMenu';
@ -25,9 +25,9 @@ import * as fromRTLReducer from '../../../shared/store/rtl.reducers';
}) })
export class SideNavigationComponent implements OnInit, OnDestroy { export class SideNavigationComponent implements OnInit, OnDestroy {
@Output() ChildNavClicked = new EventEmitter<any>(); @Output() ChildNavClicked = new EventEmitter<any>();
public selNodeIndex = 0; public selNode: Node;
public version = '';
public settings: Settings; public settings: Settings;
public version = '';
public information: GetInfo = {}; public information: GetInfo = {};
public informationChain: GetInfoChain = {}; public informationChain: GetInfoChain = {};
public flgLoading = true; public flgLoading = true;
@ -63,8 +63,8 @@ export class SideNavigationComponent implements OnInit, OnDestroy {
this.store.select('rtlRoot') this.store.select('rtlRoot')
.pipe(takeUntil(this.unSubs[0])) .pipe(takeUntil(this.unSubs[0]))
.subscribe((rtlStore: fromRTLReducer.State) => { .subscribe((rtlStore: fromRTLReducer.State) => {
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings; this.settings = this.selNode.settings;
this.information = rtlStore.information; this.information = rtlStore.information;
this.numPendingChannels = rtlStore.numberOfPendingChannels; this.numPendingChannels = rtlStore.numberOfPendingChannels;

@ -4,7 +4,7 @@ import { takeUntil, filter } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Actions } from '@ngrx/effects'; import { Actions } from '@ngrx/effects';
import { Settings } from '../../../shared/models/RTLconfig'; import { Node } from '../../../shared/models/RTLconfig';
import { LoggerService } from '../../../shared/services/logger.service'; import { LoggerService } from '../../../shared/services/logger.service';
import { GetInfo, GetInfoChain } from '../../../shared/models/lndModels'; import { GetInfo, GetInfoChain } from '../../../shared/models/lndModels';
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
@ -19,8 +19,7 @@ import * as RTLActions from '../../../shared/store/rtl.actions';
styleUrls: ['./top-menu.component.scss'] styleUrls: ['./top-menu.component.scss']
}) })
export class TopMenuComponent implements OnInit, OnDestroy { export class TopMenuComponent implements OnInit, OnDestroy {
public selNodeIndex = 0; public selNode: Node;
public settings: Settings;
public version = ''; public version = '';
public information: GetInfo = {}; public information: GetInfo = {};
public informationChain: GetInfoChain = {}; public informationChain: GetInfoChain = {};
@ -36,8 +35,7 @@ export class TopMenuComponent implements OnInit, OnDestroy {
this.store.select('rtlRoot') this.store.select('rtlRoot')
.pipe(takeUntil(this.unSubs[0])) .pipe(takeUntil(this.unSubs[0]))
.subscribe((rtlStore: fromRTLReducer.State) => { .subscribe((rtlStore: fromRTLReducer.State) => {
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings;
this.information = rtlStore.information; this.information = rtlStore.information;
this.flgLoading = (undefined !== this.information.identity_pubkey) ? false : true; this.flgLoading = (undefined !== this.information.identity_pubkey) ? false : true;

@ -5,7 +5,7 @@ import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { MatTableDataSource, MatSort } from '@angular/material'; import { MatTableDataSource, MatSort } from '@angular/material';
import { Settings } from '../../shared/models/RTLconfig'; import { Node } from '../../shared/models/RTLconfig';
import { GetInfo, Payment, PayRequest } from '../../shared/models/lndModels'; import { GetInfo, Payment, PayRequest } from '../../shared/models/lndModels';
import { LoggerService } from '../../shared/services/logger.service'; import { LoggerService } from '../../shared/services/logger.service';
@ -23,10 +23,9 @@ import * as fromRTLReducer from '../../shared/store/rtl.reducers';
export class PaymentsComponent implements OnInit, OnDestroy { export class PaymentsComponent implements OnInit, OnDestroy {
@ViewChild(MatSort) sort: MatSort; @ViewChild(MatSort) sort: MatSort;
@ViewChild('sendPaymentForm') form; @ViewChild('sendPaymentForm') form;
public selNodeIndex = 0; public selNode: Node;
public newlyAddedPayment = ''; public newlyAddedPayment = '';
public flgAnimate = true; public flgAnimate = true;
public settings: Settings;
public flgLoading: Array<Boolean | 'error'> = [true]; public flgLoading: Array<Boolean | 'error'> = [true];
public information: GetInfo = {}; public information: GetInfo = {};
public payments: any; public payments: any;
@ -68,8 +67,7 @@ export class PaymentsComponent implements OnInit, OnDestroy {
this.flgLoading[0] = 'error'; this.flgLoading[0] = 'error';
} }
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings;
this.information = rtlStore.information; this.information = rtlStore.information;
this.paymentJSONArr = (rtlStore.payments.length > 0) ? rtlStore.payments : []; this.paymentJSONArr = (rtlStore.payments.length > 0) ? rtlStore.payments : [];
this.payments = (undefined === rtlStore.payments) ? new MatTableDataSource([]) : new MatTableDataSource<Payment>([...this.paymentJSONArr]); this.payments = (undefined === rtlStore.payments) ? new MatTableDataSource([]) : new MatTableDataSource<Payment>([...this.paymentJSONArr]);

@ -3,10 +3,10 @@ import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Node } from '../../shared/models/RTLconfig';
import { RTLEffects } from '../../shared/store/rtl.effects'; import { RTLEffects } from '../../shared/store/rtl.effects';
import * as RTLActions from '../../shared/store/rtl.actions'; import * as RTLActions from '../../shared/store/rtl.actions';
import * as fromRTLReducer from '../../shared/store/rtl.reducers'; import * as fromRTLReducer from '../../shared/store/rtl.reducers';
import { Authentication } from '../../shared/models/RTLconfig';
@Component({ @Component({
selector: 'rtl-server-config', selector: 'rtl-server-config',
@ -14,9 +14,8 @@ import { Authentication } from '../../shared/models/RTLconfig';
styleUrls: ['./server-config.component.scss'] styleUrls: ['./server-config.component.scss']
}) })
export class ServerConfigComponent implements OnInit, OnDestroy { export class ServerConfigComponent implements OnInit, OnDestroy {
public selNodeIndex = 0; public selNode: Node;
public selectedNodeType = 'lnd'; public selectedNodeType = 'lnd';
public authSettings: Authentication = {};
public showLND = false; public showLND = false;
public showBitcoind = false; public showBitcoind = false;
public configData = ''; public configData = '';
@ -34,12 +33,11 @@ export class ServerConfigComponent implements OnInit, OnDestroy {
this.resetData(); this.resetData();
} }
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.authSettings = rtlStore.appConfig.nodes[this.selNodeIndex].authentication; if (undefined !== this.selNode.authentication && this.selNode.authentication.lndConfigPath !== '') {
if (undefined !== this.authSettings && this.authSettings.lndConfigPath !== '') {
this.showLND = true; this.showLND = true;
} }
if (undefined !== this.authSettings && undefined !== this.authSettings.bitcoindConfigPath && this.authSettings.bitcoindConfigPath !== '') { if (undefined !== this.selNode.authentication && undefined !== this.selNode.authentication.bitcoindConfigPath && this.selNode.authentication.bitcoindConfigPath !== '') {
this.showBitcoind = true; this.showBitcoind = true;
} }
}); });

@ -3,6 +3,7 @@ import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Node } from '../../shared/models/RTLconfig';
import { LoggerService } from '../../shared/services/logger.service'; import { LoggerService } from '../../shared/services/logger.service';
import * as fromRTLReducer from '../../shared/store/rtl.reducers'; import * as fromRTLReducer from '../../shared/store/rtl.reducers';
import * as RTLActions from '../../shared/store/rtl.actions'; import * as RTLActions from '../../shared/store/rtl.actions';
@ -13,7 +14,7 @@ import * as RTLActions from '../../shared/store/rtl.actions';
styleUrls: ['./signin.component.scss'] styleUrls: ['./signin.component.scss']
}) })
export class SigninComponent implements OnInit, OnDestroy { export class SigninComponent implements OnInit, OnDestroy {
public selNodeIndex = 0; public selNode: Node;
public password = ''; public password = '';
public nodeAuthType = ''; public nodeAuthType = '';
public rtlSSO = 0; public rtlSSO = 0;
@ -32,8 +33,8 @@ export class SigninComponent implements OnInit, OnDestroy {
rtlStore.effectErrors.forEach(effectsErr => { rtlStore.effectErrors.forEach(effectsErr => {
this.logger.error(effectsErr); this.logger.error(effectsErr);
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.nodeAuthType = rtlStore.appConfig.nodes[this.selNodeIndex].authentication.nodeAuthType; this.nodeAuthType = this.selNode.authentication.nodeAuthType;
this.logger.info(rtlStore); this.logger.info(rtlStore);
if (this.nodeAuthType.toUpperCase() === 'DEFAULT') { if (this.nodeAuthType.toUpperCase() === 'DEFAULT') {
this.hintStr = 'Enter RPC password'; this.hintStr = 'Enter RPC password';

@ -33,7 +33,7 @@
</ng-container> </ng-container>
<ng-container matColumnDef="block_hash"> <ng-container matColumnDef="block_hash">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Block Hash </th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Block Hash </th>
<td mat-cell *matCellDef="let trans"> {{trans.block_hash | slice:0:10}}...</td> <td mat-cell *matCellDef="let trans" class="ellipsis-parent"><span class="ellipsis-child">{{trans.block_hash | removeleadingzeros}}</span></td>
</ng-container> </ng-container>
<ng-container matColumnDef="block_height"> <ng-container matColumnDef="block_height">
<th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Block Height </th> <th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Block Height </th>
@ -41,7 +41,7 @@
</ng-container> </ng-container>
<ng-container matColumnDef="tx_hash"> <ng-container matColumnDef="tx_hash">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Txn Hash </th> <th mat-header-cell *matHeaderCellDef mat-sort-header> Txn Hash </th>
<td mat-cell *matCellDef="let trans"><div>{{trans.tx_hash | slice:0:10}}...</div></td> <td mat-cell *matCellDef="let trans" class="ellipsis-parent"><span class="ellipsis-child">{{trans.tx_hash}}</span></td>
</ng-container> </ng-container>
<ng-container matColumnDef="amount"> <ng-container matColumnDef="amount">
<th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Amount </th> <th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before"> Amount </th>

@ -17,3 +17,16 @@
table { table {
width:100%; width:100%;
} }
.ellipsis-parent {
min-width: 20px;
display: flex;
padding: 13px 0 13px 12px;
}
.ellipsis-child {
max-width:97%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

@ -17,7 +17,7 @@
</svg> </svg>
</mat-card-content> </mat-card-content>
<span *ngIf="information?.currency_unit; else withoutData"> <span *ngIf="information?.currency_unit; else withoutData">
<h3 *ngIf="settings?.satsToBTC; else smallerUnit1">{{blockchainBalance?.btc_total_balance | number}} {{information?.currency_unit}}</h3> <h3 *ngIf="selNode?.settings?.satsToBTC; else smallerUnit1">{{blockchainBalance?.btc_total_balance | number}} {{information?.currency_unit}}</h3>
<ng-template #smallerUnit1><h3>{{blockchainBalance?.total_balance | number}} {{information?.smaller_currency_unit}}</h3></ng-template> <ng-template #smallerUnit1><h3>{{blockchainBalance?.total_balance | number}} {{information?.smaller_currency_unit}}</h3></ng-template>
</span> </span>
</mat-card-content> </mat-card-content>
@ -40,7 +40,7 @@
</svg> </svg>
</mat-card-content> </mat-card-content>
<span *ngIf="information?.currency_unit; else withoutData"> <span *ngIf="information?.currency_unit; else withoutData">
<h3 *ngIf="settings?.satsToBTC; else smallerUnit2">{{blockchainBalance?.btc_confirmed_balance | number}} {{information?.currency_unit}}</h3> <h3 *ngIf="selNode?.settings?.satsToBTC; else smallerUnit2">{{blockchainBalance?.btc_confirmed_balance | number}} {{information?.currency_unit}}</h3>
<ng-template #smallerUnit2><h3>{{blockchainBalance?.confirmed_balance | number}} {{information?.smaller_currency_unit}}</h3></ng-template> <ng-template #smallerUnit2><h3>{{blockchainBalance?.confirmed_balance | number}} {{information?.smaller_currency_unit}}</h3></ng-template>
</span> </span>
</mat-card-content> </mat-card-content>
@ -63,7 +63,7 @@
</svg> </svg>
</mat-card-content> </mat-card-content>
<span *ngIf="information?.currency_unit; else withoutData"> <span *ngIf="information?.currency_unit; else withoutData">
<h3 *ngIf="settings?.satsToBTC; else smallerUnit3">{{blockchainBalance?.btc_unconfirmed_balance | number}} {{information?.currency_unit}}</h3> <h3 *ngIf="selNode?.settings?.satsToBTC; else smallerUnit3">{{blockchainBalance?.btc_unconfirmed_balance | number}} {{information?.currency_unit}}</h3>
<ng-template #smallerUnit3><h3>{{blockchainBalance?.unconfirmed_balance | number}} {{information?.smaller_currency_unit}}</h3></ng-template> <ng-template #smallerUnit3><h3>{{blockchainBalance?.unconfirmed_balance | number}} {{information?.smaller_currency_unit}}</h3></ng-template>
</span> </span>
</mat-card-content> </mat-card-content>

@ -3,7 +3,7 @@ import { Subject } from 'rxjs';
import { takeUntil, take } from 'rxjs/operators'; import { takeUntil, take } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Settings } from '../../../shared/models/RTLconfig'; import { Node } from '../../../shared/models/RTLconfig';
import { GetInfo, Balance, ChannelsTransaction, AddressType } from '../../../shared/models/lndModels'; import { GetInfo, Balance, ChannelsTransaction, AddressType } from '../../../shared/models/lndModels';
import { RTLConfiguration } from '../../../shared/models/RTLconfig'; import { RTLConfiguration } from '../../../shared/models/RTLconfig';
import { LoggerService } from '../../../shared/services/logger.service'; import { LoggerService } from '../../../shared/services/logger.service';
@ -18,8 +18,7 @@ import * as fromRTLReducer from '../../../shared/store/rtl.reducers';
styleUrls: ['./send-receive-trans.component.scss'] styleUrls: ['./send-receive-trans.component.scss']
}) })
export class SendReceiveTransComponent implements OnInit, OnDestroy { export class SendReceiveTransComponent implements OnInit, OnDestroy {
public selNodeIndex = 0; public selNode: Node;
public settings: Settings;
public appConfig: RTLConfiguration; public appConfig: RTLConfiguration;
public addressTypes = []; public addressTypes = [];
public flgLoadingWallet: Boolean | 'error' = true; public flgLoadingWallet: Boolean | 'error' = true;
@ -44,8 +43,7 @@ export class SendReceiveTransComponent implements OnInit, OnDestroy {
this.flgLoadingWallet = 'error'; this.flgLoadingWallet = 'error';
} }
}); });
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings;
this.appConfig = rtlStore.appConfig; this.appConfig = rtlStore.appConfig;
this.information = rtlStore.information; this.information = rtlStore.information;
this.addressTypes = rtlStore.addressTypes; this.addressTypes = rtlStore.addressTypes;

@ -7,7 +7,7 @@
<h4>Currency Unit</h4> <h4>Currency Unit</h4>
<div fxLayout="row" fxLayoutAlign="space-between center"> <div fxLayout="row" fxLayoutAlign="space-between center">
<span>{{currencyUnit}}</span> <span>{{currencyUnit}}</span>
<mat-slide-toggle [checked]="settings?.satsToBTC" (change)="toggleSettings('satsToBTC')" labelPosition="before"></mat-slide-toggle> <mat-slide-toggle [checked]="selNode?.settings?.satsToBTC" (change)="toggleSettings('satsToBTC')" labelPosition="before"></mat-slide-toggle>
</div> </div>
<mat-divider class="mt-2"></mat-divider> <mat-divider class="mt-2"></mat-divider>
<div *ngIf="showSettingOption"> <div *ngIf="showSettingOption">
@ -27,12 +27,12 @@
<h4>Sidenav Options</h4> <h4>Sidenav Options</h4>
<div fxLayout="row" fxLayoutAlign="space-between center"> <div fxLayout="row" fxLayoutAlign="space-between center">
<span>Opened</span> <span>Opened</span>
<mat-slide-toggle [checked]="settings.flgSidenavOpened" (change)="toggleSettings('flgSidenavOpened')" <mat-slide-toggle [checked]="selNode?.settings?.flgSidenavOpened" (change)="toggleSettings('flgSidenavOpened')"
labelPosition="before"></mat-slide-toggle> labelPosition="before"></mat-slide-toggle>
</div> </div>
<div fxLayout="row" fxLayoutAlign="space-between center"> <div fxLayout="row" fxLayoutAlign="space-between center">
<span>Pinned</span> <span>Pinned</span>
<mat-slide-toggle [checked]="settings.flgSidenavPinned" (change)="toggleSettings('flgSidenavPinned')" <mat-slide-toggle [checked]="selNode?.settings?.flgSidenavPinned" (change)="toggleSettings('flgSidenavPinned')"
labelPosition="before"></mat-slide-toggle> labelPosition="before"></mat-slide-toggle>
</div> </div>
</div> </div>

@ -3,7 +3,7 @@ import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Settings } from '../../models/RTLconfig'; import { Node } from '../../models/RTLconfig';
import { GetInfo } from '../../models/lndModels'; import { GetInfo } from '../../models/lndModels';
import { LoggerService } from '../../services/logger.service'; import { LoggerService } from '../../services/logger.service';
@ -16,9 +16,8 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./settings-nav.component.scss'] styleUrls: ['./settings-nav.component.scss']
}) })
export class SettingsNavComponent implements OnInit, OnDestroy { export class SettingsNavComponent implements OnInit, OnDestroy {
public selNodeIndex = 0; public selNode: Node;
public information: GetInfo = {}; public information: GetInfo = {};
public settings: Settings;
public menus = ['Vertical', 'Horizontal']; public menus = ['Vertical', 'Horizontal'];
public menuTypes = ['Regular', 'Compact', 'Mini']; public menuTypes = ['Regular', 'Compact', 'Mini'];
public selectedMenu: string; public selectedMenu: string;
@ -35,14 +34,13 @@ export class SettingsNavComponent implements OnInit, OnDestroy {
this.store.select('rtlRoot') this.store.select('rtlRoot')
.pipe(takeUntil(this.unsubs[0])) .pipe(takeUntil(this.unsubs[0]))
.subscribe((rtlStore: fromRTLReducer.State) => { .subscribe((rtlStore: fromRTLReducer.State) => {
this.selNodeIndex = rtlStore.selNodeIndex; this.selNode = rtlStore.selNode;
this.settings = rtlStore.appConfig.nodes[this.selNodeIndex].settings; this.selectedMenu = this.selNode.settings.menu;
this.selectedMenu = this.settings.menu; this.selectedMenuType = this.selNode.settings.menuType;
this.selectedMenuType = this.settings.menuType;
if (window.innerWidth <= 768) { if (window.innerWidth <= 768) {
this.settings.menu = 'Vertical'; this.selNode.settings.menu = 'Vertical';
this.settings.flgSidenavOpened = false; this.selNode.settings.flgSidenavOpened = false;
this.settings.flgSidenavPinned = false; this.selNode.settings.flgSidenavPinned = false;
this.showSettingOption = false; this.showSettingOption = false;
} }
this.information = rtlStore.information; this.information = rtlStore.information;
@ -52,24 +50,24 @@ export class SettingsNavComponent implements OnInit, OnDestroy {
} }
public chooseMenu() { public chooseMenu() {
this.settings.menu = this.selectedMenu; this.selNode.settings.menu = this.selectedMenu;
} }
public chooseMenuType() { public chooseMenuType() {
this.settings.menuType = this.selectedMenuType; this.selNode.settings.menuType = this.selectedMenuType;
} }
toggleSettings(toggleField: string) { toggleSettings(toggleField: string) {
this.settings[toggleField] = !this.settings[toggleField]; this.selNode.settings[toggleField] = !this.selNode.settings[toggleField];
} }
changeTheme(newTheme: string) { changeTheme(newTheme: string) {
this.settings.theme = newTheme; this.selNode.settings.theme = newTheme;
} }
onClose() { onClose() {
this.logger.info(this.settings); this.logger.info(this.selNode.settings);
this.store.dispatch(new RTLActions.SaveSettings(this.settings)); this.store.dispatch(new RTLActions.SaveSettings(this.selNode.settings));
this.done.emit(); this.done.emit();
} }

@ -0,0 +1,12 @@
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'removeleadingzeros'
})
export class RemoveLeadingZerosPipe implements PipeTransform {
transform(value: string, args?: any): string {
return value.replace(/^[0]+/g, '');
}
}

@ -15,6 +15,7 @@ import { NotFoundComponent } from './components/not-found/not-found.component';
import { SettingsNavComponent } from './components/settings-nav/settings-nav.component'; import { SettingsNavComponent } from './components/settings-nav/settings-nav.component';
import { ClipboardDirective } from './directive/clipboard.directive'; import { ClipboardDirective } from './directive/clipboard.directive';
import { SsoFailedComponent } from './components/sso-failed/sso-failed.component'; import { SsoFailedComponent } from './components/sso-failed/sso-failed.component';
import { RemoveLeadingZerosPipe } from './pipes/remove-leading-zero.pipe';
@NgModule({ @NgModule({
imports: [ imports: [
@ -82,7 +83,8 @@ import { SsoFailedComponent } from './components/sso-failed/sso-failed.component
NotFoundComponent, NotFoundComponent,
SettingsNavComponent, SettingsNavComponent,
ClipboardDirective, ClipboardDirective,
QRCodeModule QRCodeModule,
RemoveLeadingZerosPipe
], ],
declarations: [ declarations: [
AlertMessageComponent, AlertMessageComponent,
@ -91,7 +93,8 @@ import { SsoFailedComponent } from './components/sso-failed/sso-failed.component
NotFoundComponent, NotFoundComponent,
SettingsNavComponent, SettingsNavComponent,
ClipboardDirective, ClipboardDirective,
SsoFailedComponent SsoFailedComponent,
RemoveLeadingZerosPipe
], ],
entryComponents: [ entryComponents: [
AlertMessageComponent, AlertMessageComponent,

@ -1,5 +1,5 @@
import { Action } from '@ngrx/store'; import { Action } from '@ngrx/store';
import { RTLConfiguration, Settings } from '../models/RTLconfig'; import { RTLConfiguration, Settings, Node } from '../models/RTLconfig';
import { ErrorPayload } from '../models/errorPayload'; import { ErrorPayload } from '../models/errorPayload';
import { import {
GetInfo, Peer, Balance, NetworkInfo, Fees, Channel, Invoice, Payment, GraphNode, AddressType, GetInfo, Peer, Balance, NetworkInfo, Fees, Channel, Invoice, Payment, GraphNode, AddressType,
@ -20,7 +20,7 @@ export const SET_STORE = 'SET_STORE';
export const FETCH_RTL_CONFIG = 'FETCH_RTL_CONFIG'; export const FETCH_RTL_CONFIG = 'FETCH_RTL_CONFIG';
export const SET_RTL_CONFIG = 'SET_RTL_CONFIG'; export const SET_RTL_CONFIG = 'SET_RTL_CONFIG';
export const SAVE_SETTINGS = 'SAVE_SETTINGS'; export const SAVE_SETTINGS = 'SAVE_SETTINGS';
export const SET_SEL_NODE_INDEX = 'SET_SEL_NODE_INDEX'; export const SET_SELECTED_NODE = 'SET_SELECTED_NODE';
export const FETCH_INFO = 'FETCH_INFO'; export const FETCH_INFO = 'FETCH_INFO';
export const SET_INFO = 'SET_INFO'; export const SET_INFO = 'SET_INFO';
export const FETCH_PEERS = 'FETCH_PEERS'; export const FETCH_PEERS = 'FETCH_PEERS';
@ -126,9 +126,9 @@ export class SaveSettings implements Action {
constructor(public payload: Settings) {} constructor(public payload: Settings) {}
} }
export class SetSelNodeIndex implements Action { export class SetSelelectedNode implements Action {
readonly type = SET_SEL_NODE_INDEX; readonly type = SET_SELECTED_NODE;
constructor(public payload: number) {} constructor(public payload: Node) {}
} }
export class FetchInfo implements Action { export class FetchInfo implements Action {
@ -387,7 +387,7 @@ export type RTLActions =
ClearEffectError | EffectError | OpenSpinner | CloseSpinner | ClearEffectError | EffectError | OpenSpinner | CloseSpinner |
FetchRTLConfig | SetRTLConfig | SaveSettings | FetchRTLConfig | SetRTLConfig | SaveSettings |
OpenAlert | CloseAlert | OpenConfirmation | CloseConfirmation | OpenAlert | CloseAlert | OpenConfirmation | CloseConfirmation |
SetSelNodeIndex | FetchInfo | SetInfo | SetSelelectedNode | FetchInfo | SetInfo |
FetchPeers | SetPeers | AddPeer | DetachPeer | SaveNewPeer | RemovePeer | FetchPeers | SetPeers | AddPeer | DetachPeer | SaveNewPeer | RemovePeer |
AddInvoice | SaveNewInvoice | GetForwardingHistory | SetForwardingHistory | AddInvoice | SaveNewInvoice | GetForwardingHistory | SetForwardingHistory |
FetchFees | SetFees | FetchFees | SetFees |

@ -1041,6 +1041,44 @@ export class RTLEffects implements OnDestroy {
}) })
); );
@Effect()
setSelectedNode = this.actions$.pipe(
ofType(RTLActions.SET_SELECTED_NODE),
mergeMap((action: RTLActions.SetSelelectedNode) => {
this.store.dispatch(new RTLActions.ClearEffectError('UpdateSelNode'));
return this.httpClient.post(environment.CONF_API + '/updateSelNode', { selNodeIndex: action.payload.index })
.pipe(
map((postRes: any) => {
this.logger.info(postRes);
setTimeout(() => {
this.store.dispatch(new RTLActions.CloseSpinner());
}, 4000);
if (sessionStorage.getItem('token')) {
return { type: RTLActions.FETCH_INFO };
} else {
return {
type: RTLActions.OPEN_ALERT,
payload: { width: '70%', data: {type: 'WARN', titleMessage: 'Authorization required to get the data from the node!' }}
};
}
}),
catchError((err: any) => {
this.store.dispatch(new RTLActions.CloseSpinner());
this.store.dispatch(new RTLActions.EffectError({ action: 'UpdateSelNode', code: err.status, message: err.error.message }));
this.logger.error(err);
return of(
{
type: RTLActions.OPEN_ALERT,
payload: { width: '70%', data: {type: 'ERROR', titleMessage: 'Update Selected Node Failed!',
message: JSON.stringify({code: err.status, Message: err.error.error})
}}
}
);
})
);
}
));
SetToken(token: string) { SetToken(token: string) {
if (token) { if (token) {
sessionStorage.setItem('lndUnlocked', 'true'); sessionStorage.setItem('lndUnlocked', 'true');

@ -1,14 +1,14 @@
import * as RTLActions from './rtl.actions'; import * as RTLActions from './rtl.actions';
import { ErrorPayload } from '../models/errorPayload'; import { ErrorPayload } from '../models/errorPayload';
import { RTLConfiguration } from '../models/RTLconfig'; import { RTLConfiguration, Node } from '../models/RTLconfig';
import { import {
GetInfo, GetInfoChain, Peer, AddressType, Fees, NetworkInfo, Balance, Channel, Payment, Invoice, PendingChannels, ClosedChannel, Transaction, SwitchRes GetInfo, GetInfoChain, Peer, AddressType, Fees, NetworkInfo, Balance, Channel, Payment, Invoice, PendingChannels, ClosedChannel, Transaction, SwitchRes
} from '../models/lndModels'; } from '../models/lndModels';
export interface State { export interface State {
effectErrors: ErrorPayload[]; effectErrors: ErrorPayload[];
selNodeIndex: number; selNode: Node;
appConfig: RTLConfiguration; appConfig: RTLConfiguration;
information: GetInfo; information: GetInfo;
peers: Peer[]; peers: Peer[];
@ -31,15 +31,15 @@ export interface State {
addressTypes: AddressType[]; addressTypes: AddressType[];
} }
const initNodeSettings = { flgSidenavOpened: true, flgSidenavPinned: true, menu: 'Vertical', menuType: 'Regular', theme: 'dark-blue', satsToBTC: false };
const initNodeAuthentication = { nodeAuthType: 'CUSTOM', lndConfigPath: '', bitcoindConfigPath: '' };
const initialState: State = { const initialState: State = {
effectErrors: [], effectErrors: [],
selNodeIndex: 0, selNode: {settings: initNodeSettings, authentication: initNodeAuthentication},
appConfig: { appConfig: {
sso: { rtlSSO: 0, logoutRedirectLink: '/login' }, sso: { rtlSSO: 0, logoutRedirectLink: '/login' },
nodes: [{ nodes: [{ settings: initNodeSettings, authentication: initNodeAuthentication}]
settings: { flgSidenavOpened: true, flgSidenavPinned: true, menu: 'Vertical', menuType: 'Regular', theme: 'dark-blue', satsToBTC: false },
authentication: { nodeAuthType: 'CUSTOM', lndConfigPath: '', bitcoindConfigPath: '' }
}]
}, },
information: {}, information: {},
peers: [], peers: [],
@ -84,14 +84,15 @@ export function RTLRootReducer(state = initialState, action: RTLActions.RTLActio
...state, ...state,
effectErrors: [...state.effectErrors, action.payload] effectErrors: [...state.effectErrors, action.payload]
}; };
case RTLActions.SET_SEL_NODE_INDEX: case RTLActions.SET_SELECTED_NODE:
return { return {
...state, ...state,
selNodeIndex: action.payload selNode: action.payload
}; };
case RTLActions.SET_RTL_CONFIG: case RTLActions.SET_RTL_CONFIG:
return { return {
...state, ...state,
selNode: action.payload.nodes[0],
appConfig: action.payload appConfig: action.payload
}; };
case RTLActions.SET_INFO: case RTLActions.SET_INFO:

Loading…
Cancel
Save