Network, payments, lookups etc

Network, payments, lookups etc
pull/260/head
Shahana Farooqui 4 years ago
parent 28ee4c75a5
commit 893d5e5c30

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -9,8 +9,8 @@
<link rel="icon" type="image/png" sizes="32x32" href="assets/images/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/images/favicon/favicon-16x16.png">
<link rel="manifest" href="assets/images/favicon/site.webmanifest">
<link rel="stylesheet" href="styles.77aafb08c5a2ab8c8821.css"></head>
<link rel="stylesheet" href="styles.eada08346e92ee5fb050.css"></head>
<body>
<rtl-app></rtl-app>
<script src="runtime.208072f1493aa8009634.js" defer></script><script src="polyfills-es5.b8e32dec482ae69710a2.js" nomodule defer></script><script src="polyfills.ebf9033c33aa4a5af12a.js" defer></script><script src="main.e93f84cc3826441e698b.js" defer></script></body>
<script src="runtime.565b0291008b32f52746.js" defer></script><script src="polyfills-es5.b8e32dec482ae69710a2.js" nomodule defer></script><script src="polyfills.ebf9033c33aa4a5af12a.js" defer></script><script src="main.5ee3e0bcee6a426b2412.js" defer></script></body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
!function(e){function r(r){for(var n,a,i=r[0],c=r[1],f=r[2],p=0,s=[];p<i.length;p++)a=i[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(l&&l(r);s.length;)s.shift()();return u.push.apply(u,f||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++)0!==o[t[i]]&&(n=!1);n&&(u.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={0:0},u=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var u,i=document.createElement("script");i.charset="utf-8",i.timeout=120,a.nc&&i.setAttribute("nonce",a.nc),i.src=function(e){return a.p+""+({}[e]||e)+"."+{1:"df8a42ae5fabe34ad893",6:"9052d99b0c58d3773f50",7:"e259f5b9069a29cff75d"}[e]+".js"}(e);var c=new Error;u=function(r){i.onerror=i.onload=null,clearTimeout(f);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,t[1](c)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:i})}),12e4);i.onerror=i.onload=u,document.head.appendChild(i)}return Promise.all(r)},a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,(function(r){return e[r]}).bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="",a.oe=function(e){throw console.error(e),e};var i=window.webpackJsonp=window.webpackJsonp||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var f=0;f<i.length;f++)r(i[f]);var l=c;t()}([]);
!function(e){function r(r){for(var n,a,i=r[0],c=r[1],f=r[2],p=0,s=[];p<i.length;p++)a=i[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(l&&l(r);s.length;)s.shift()();return u.push.apply(u,f||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++)0!==o[t[i]]&&(n=!1);n&&(u.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={0:0},u=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var u,i=document.createElement("script");i.charset="utf-8",i.timeout=120,a.nc&&i.setAttribute("nonce",a.nc),i.src=function(e){return a.p+""+({}[e]||e)+"."+{1:"df8a42ae5fabe34ad893",6:"ce201f8313431c83a606",7:"f0a3f44d200d9238d4bc"}[e]+".js"}(e);var c=new Error;u=function(r){i.onerror=i.onload=null,clearTimeout(f);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,t[1](c)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:i})}),12e4);i.onerror=i.onload=u,document.head.appendChild(i)}return Promise.all(r)},a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,(function(r){return e[r]}).bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="",a.oe=function(e){throw console.error(e),e};var i=window.webpackJsonp=window.webpackJsonp||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var f=0;f<i.length;f++)r(i[f]);var l=c;t()}([]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -25,6 +25,12 @@ import { RTLReducer } from './store/rtl.reducers';
import { RTLEffects } from './store/rtl.effects';
import { LNDEffects } from './lnd/store/lnd.effects';
import { CLEffects } from './clightning/store/cl.effects';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatCardModule } from '@angular/material/card';
import { MatMenuModule } from '@angular/material/menu';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { LayoutModule } from '@angular/cdk/layout';
@NgModule({
imports: [
@ -35,7 +41,13 @@ import { CLEffects } from './clightning/store/cl.effects';
UserIdleModule.forRoot({idle: 60 * 60, timeout: 1, ping: null}),
StoreModule.forRoot(RTLReducer),
EffectsModule.forRoot([RTLEffects, LNDEffects, CLEffects]),
!environment.production ? StoreDevtoolsModule.instrument() : []
!environment.production ? StoreDevtoolsModule.instrument() : [],
MatGridListModule,
MatCardModule,
MatMenuModule,
MatIconModule,
MatButtonModule,
LayoutModule
],
declarations: [
AppComponent

@ -106,7 +106,7 @@ export class CLPaymentsComponent implements OnInit, OnDestroy {
[{key: 'amount_msat', value: this.paymentDecoded.amount_msat, title: 'Amount (mSat)', width: 100, type: DataTypeEnum.NUMBER}]
];
if (undefined === this.paymentDecoded.msatoshi || this.paymentDecoded.msatoshi === 0) {
const titleMsg = 'It is an open amount invoice. Enter the amount (Sats) to pay.';
const titleMsg = 'It is a zero amount invoice. Enter the amount (Sats) to pay.';
this.store.dispatch(new RTLActions.OpenConfirmation({ data: {
type: AlertTypeEnum.CONFIRM,
alertTitle: 'Enter Amount and Confirm Send Payment',

@ -1,14 +1,23 @@
<div fxLayout="column" class="mt-2">
<div fxLayout="column">
<div fxLayout="column" fxLayoutAlign="space-between stretch" fxLayout.gt-sm="row wrap">
<h4 fxFlex="100" class="blinker">Save your backup files in a redundant location.</h4>
<h4 fxFlex="100" class="mt-1">Backup folder location: {{selNode.channelBackupPath}}</h4>
<div fxFlex="100" class="alert alert-warn">
<fa-icon [icon]="faExclamationTriangle" class="mr-1"></fa-icon>
<span>Save your backup files in a redundant location.</span>
</div>
<div fxFlex="100" class="alert alert-info">
<fa-icon [icon]="faServer" class="mr-1"></fa-icon>
<span><strong>Backup Folder Location: </strong>{{selNode.channelBackupPath}}.</span>
</div>
<div fxLayout="row" fxFlex="100" fxFlex.gt-sm="30" fxLayoutAlign="space-between stretch" class="mt-2">
<button fxFlex="48" fxLayoutAlign="center center" mat-stroked-button color="primary" tabindex="1" (click)="onVerifyChannels({})">Verify All Backups</button>
<button fxFlex="48" fxLayoutAlign="center center" mat-stroked-button color="primary" tabindex="1" (click)="onVerifyChannels({})">Verify All</button>
<button fxFlex="48" fxLayoutAlign="center center" mat-raised-button color="primary" tabindex="2" (click)="onBackupChannels({})">Backup All</button>
</div>
</div>
<div fxLayout="column" fxLayout.gt-xs="row" fxLayoutAlign.gt-xs="start center" fxLayoutAlign="start stretch" class="padding-gap-x page-sub-title-container mt-2">
<div fxFlex="70"></div>
<div fxFlex="70">
<fa-icon [icon]="faArchive" class="page-title-img mr-1"></fa-icon>
<span class="page-title">Backups</span>
</div>
<mat-form-field fxFlex="30">
<input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>

@ -3,6 +3,7 @@ import { Subject } from 'rxjs';
import { takeUntil, filter } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { Actions } from '@ngrx/effects';
import { faServer, faExclamationTriangle, faArchive } from '@fortawesome/free-solid-svg-icons';
import { MatTableDataSource, MatSort, MatPaginator, MatPaginatorIntl } from '@angular/material';
import { SelNodeChild } from '../../../shared/models/RTLconfig';
@ -25,6 +26,9 @@ import * as fromRTLReducer from '../../../store/rtl.reducers';
export class ChannelBackupTableComponent implements OnInit, OnDestroy {
@ViewChild(MatSort, { static: true }) sort: MatSort;
@ViewChild(MatPaginator, {static: true}) paginator: MatPaginator;
public faServer = faServer;
public faExclamationTriangle = faExclamationTriangle;
public faArchive = faArchive;
public pageSize = PAGE_SIZE;
public pageSizeOptions = PAGE_SIZE_OPTIONS;
public selNode: SelNodeChild = {};

@ -5,7 +5,7 @@ import { takeUntil, filter } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { Actions } from '@ngrx/effects';
import { faSmile, faFrown } from '@fortawesome/free-regular-svg-icons';
import { faAngleDoubleDown, faAngleDoubleUp, faChartPie, faBolt, faInfoCircle, faNetworkWired } from '@fortawesome/free-solid-svg-icons';
import { faAngleDoubleDown, faAngleDoubleUp, faChartPie, faBolt, faServer, faNetworkWired } from '@fortawesome/free-solid-svg-icons';
import { LoggerService } from '../../shared/services/logger.service';
import { CommonService } from '../../shared/services/common.service';
@ -27,7 +27,7 @@ export class HomeComponent implements OnInit, OnDestroy {
public faAngleDoubleUp = faAngleDoubleUp;
public faChartPie = faChartPie;
public faBolt = faBolt;
public faInfoCircle = faInfoCircle;
public faServer = faServer;
public faNetworkWired = faNetworkWired;
public flgChildInfoUpdated = false;
public userPersonaEnum = UserPersonaEnum;
@ -58,7 +58,7 @@ export class HomeComponent implements OnInit, OnDestroy {
this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) {
this.operatorCards = [
{ id: 'node', icon: this.faInfoCircle, title: 'Node Information', cols: 10, rows: 1 },
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 10, rows: 1 },
{ id: 'balance', goTo: 'On-Chain', link: '/lnd/onchain', icon: this.faChartPie, title: 'Balances', cols: 10, rows: 1 },
{ id: 'fee', goTo: 'Routing', link: '/lnd/routing', icon: this.faBolt, title: 'Routing Fee Report', cols: 10, rows: 1 },
{ id: 'status', goTo: 'Channels', link: '/lnd/peerschannels', icon: this.faNetworkWired, title: 'Channels', cols: 10, rows: 1 },
@ -72,7 +72,7 @@ export class HomeComponent implements OnInit, OnDestroy {
];
} else if(this.screenSize === ScreenSizeEnum.SM || this.screenSize === ScreenSizeEnum.MD) {
this.operatorCards = [
{ id: 'node', icon: this.faInfoCircle, title: 'Node Information', cols: 5, rows: 1 },
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 5, rows: 1 },
{ id: 'balance', goTo: 'On-Chain', link: '/lnd/onchain', icon: this.faChartPie, title: 'Balances', cols: 5, rows: 1 },
{ id: 'fee', goTo: 'Routing', link: '/lnd/routing', icon: this.faBolt, title: 'Routing Fee Report', cols: 5, rows: 1 },
{ id: 'status', goTo: 'Channels', link: '/lnd/peerschannels', icon: this.faNetworkWired, title: 'Channels', cols: 5, rows: 1 },
@ -88,7 +88,7 @@ export class HomeComponent implements OnInit, OnDestroy {
this.operatorCardHeight = ((window.screen.height - 200) / 2) + 'px';
this.merchantCardHeight = ((window.screen.height - 210) / 10) + 'px';
this.operatorCards = [
{ id: 'node', icon: this.faInfoCircle, title: 'Node Information', cols: 3, rows: 1 },
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 3, rows: 1 },
{ id: 'balance', goTo: 'On-Chain', link: '/lnd/onchain', icon: this.faChartPie, title: 'Balances', cols: 3, rows: 1 },
{ id: 'capacity', goTo: 'Channels', link: '/lnd/peerschannels', icon: this.faNetworkWired, title: 'Channels Capacity', cols: 4, rows: 2 },
{ id: 'fee', goTo: 'Routing', link: '/lnd/routing', icon: this.faBolt, title: 'Routing Fee Report', cols: 3, rows: 1 },
@ -168,6 +168,9 @@ export class HomeComponent implements OnInit, OnDestroy {
if (rtlStore.totalLocalBalance >= 0 && rtlStore.totalRemoteBalance >= 0 && this.flgLoading[5] !== 'error') {
this.flgLoading[5] = false;
}
if (rtlStore.numberOfPendingChannels && this.flgLoading[6] !== 'error') {
this.flgLoading[6] = false;
}
this.totalInboundLiquidity = 0;
this.totalOutboundLiquidity = 0;
this.allChannels = rtlStore.allChannels.filter(channel => channel.active === true);

@ -6,15 +6,15 @@
<div fxLayout="row" fxFlex="100" fxLayoutAlign="start start" class="padding-gap">
<mat-card fxLayout="row" fxFlex="100" fxLayoutAlign="start start">
<mat-card-content fxLayout="column" fxFlex="100" fxLayoutAlign="space-between stretch" class="card-content-gap mt-1">
<form fxFlex="100" fxLayout="column" fxLayout.gt-sm="row wrap" fxLayoutAlign.gt-sm="space-between center" fxLayoutAlign="start stretch" class="w-100" #form="ngForm">
<mat-form-field fxFlex="30" fxLayoutAlign="start end">
<mat-select [(ngModel)]="selectedFieldId" placeholder="Lookup Field" (selectionChange)="onSelectChange($event)" tabindex="1" required name="lookupField">
<mat-option *ngFor="let lookupField of lookupFields" [value]="lookupField.id">
<form fxFlex="100" fxLayout="column" fxLayout.gt-sm="row wrap" fxLayoutAlign.gt-sm="space-between center" fxLayoutAlign="start space-between" class="w-100" #form="ngForm">
<div fxFlex="35" fxFlex.gt-md="22" fxLayoutAlign="start end">
<mat-radio-group color="primary" [(ngModel)]="selectedFieldId" (change)="onSelectChange()" tabindex="1" name="lookupField">
<mat-radio-button *ngFor="let lookupField of lookupFields" [value]="lookupField.id" class="mr-4">
{{lookupField.name}}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field fxFlex="68" fxLayoutAlign="start end">
</mat-radio-button>
</mat-radio-group>
</div>
<mat-form-field fxFlex="65" fxFlex.gt-md="77" fxLayoutAlign="start end" [ngClass]="{'mt-2': screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM}">
<input matInput name="lookupKey" [placeholder]="lookupFields[selectedFieldId]?.placeholder || 'Lookup Key'" (change)="clearLookupValue()" [(ngModel)]="lookupKey" tabindex="2" required>
</mat-form-field>
<div fxFlex="30" fxLayoutAlign="space-between stretch" class="mt-2">

@ -9,6 +9,8 @@ import { LoggerService } from '../../shared/services/logger.service';
import * as RTLActions from '../../store/rtl.actions';
import * as fromRTLReducer from '../../store/rtl.reducers';
import { ScreenSizeEnum } from '../../shared/services/consts-enums-functions';
import { CommonService } from '../../shared/services/common.service';
@Component({
selector: 'rtl-lookups',
@ -28,9 +30,13 @@ export class LookupsComponent implements OnInit, OnDestroy {
];
public flgLoading: Array<Boolean | 'error'> = [true];
public faSearch = faSearch;
public screenSize = '';
public screenSizeEnum = ScreenSizeEnum;
private unSubs: Array<Subject<void>> = [new Subject()];
constructor(private logger: LoggerService, private store: Store<fromRTLReducer.RTLState>, private actions$: Actions) {}
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>, private actions$: Actions) {
this.screenSize = this.commonService.getScreenSize();
}
ngOnInit() {
this.actions$
@ -66,7 +72,7 @@ export class LookupsComponent implements OnInit, OnDestroy {
}
}
onSelectChange(event: any) {
onSelectChange() {
this.flgSetLookupValue = false;
this.lookupKey = '';
this.lookupValue = {};

@ -1,59 +1,91 @@
<div fxLayout="column">
<div fxLayout="row" fxLayoutAlign="start center" class="padding-gap-x page-title-container">
<fa-icon [icon]="faNetworkWired" class="page-title-img mr-1"></fa-icon>
<span class="page-title">Network Information</span>
</div>
<div fxLayout="row" fxFlex="100" fxLayoutAlign="start start" class="padding-gap-x">
<mat-card fxLayout="column" fxFlex="100" fxLayoutAlign="start start">
<mat-progress-bar *ngIf="flgLoading[1]===true" mode="indeterminate"></mat-progress-bar>
<mat-card-content fxLayout="column" fxFlex="100" fxLayoutAlign="start stretch" class="card-content-gap w-100">
<div fxLayout="column" fxLayout.gt-sm="row wrap" fxLayoutAlign="start space-between" fxLayoutAlign.gt-sm="start start" fxFlex="100">
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Network Capacity</h4>
<span class="foreground-secondary-text">{{networkInfo.total_network_capacity | number}} Sats</span>
<mat-divider class="mt-1"></mat-divider>
</div>
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Number of Nodes</h4>
<span class="foreground-secondary-text">{{networkInfo.num_nodes | number}}</span>
<mat-divider class="mt-1"></mat-divider>
</div>
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Number of Channels</h4>
<span class="foreground-secondary-text">{{networkInfo.num_channels | number}}</span>
<mat-divider class="mt-1"></mat-divider>
</div>
</div>
<div fxLayout="column" fxLayout.gt-sm="row wrap" fxLayoutAlign="start space-between" fxLayoutAlign.gt-sm="start start" fxFlex="100">
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Max Channel Size</h4>
<span class="foreground-secondary-text">{{networkInfo.max_channel_size | number}}</span>
<mat-divider class="mt-1"></mat-divider>
</div>
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Avg Channel Size</h4>
<span class="foreground-secondary-text">{{networkInfo.avg_channel_size | number}}</span>
<mat-divider class="mt-1"></mat-divider>
</div>
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Min Channel Size</h4>
<span class="foreground-secondary-text">{{networkInfo.min_channel_size | number}}</span>
<mat-divider class="mt-1"></mat-divider>
<div fxLayout="column" fxLayoutAlign="space-between stretch" class="mb-4">
<mat-grid-list *ngIf="selNode.userPersona !== userPersonaEnum.OPERATOR" cols="3" rowHeight="330px">
<mat-grid-tile class="node-grid-tile" *ngFor="let card of nodeCards" [colspan]="card.cols" [rowspan]="card.rows">
<div fxLayout="column" fxLayoutAlign="stretch start" fxFlex="100" class="h-100">
<div fxLayout="row" fxLayoutAlign="start start" class="w-100">
<div fxLayout="row" fxLayoutAlign="start start" class="padding-gap-x page-title-container">
<fa-icon [icon]="card.icon" class="mr-1"></fa-icon>
<span>{{card.title}}</span>
</div>
</div>
<div fxLayout="column" fxLayout.gt-sm="row wrap" fxLayoutAlign="start space-between" fxLayoutAlign.gt-sm="start start" fxFlex="100">
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Max Out Degree</h4>
<span class="foreground-secondary-text">{{networkInfo.max_out_degree | number}}</span>
<mat-divider class="mt-1"></mat-divider>
</div>
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block">
<h4 class="font-bold-330">Avg Out Degree</h4>
<span class="foreground-secondary-text">{{networkInfo.avg_out_degree | number:'1.0-2'}}</span>
<mat-divider class="mt-1"></mat-divider>
</div>
</div>
</mat-card-content>
</mat-card>
<div fxLayout="column" fxLayoutAlign="stretch center" fxLayout.gt-sm="row" fxLayoutAlign.gt-sm="center stretch" class="w-100 h-93">
<mat-card fxLayout="row" fxFlex="95" fxLayoutAlign="start stretch" class="dashboard-card p-24 w-96 h-93">
<mat-card-content fxFlex="100" class="dashboard-card-content">
<div [ngSwitch]="card.id" fxLayout="column" fxFlex="100">
<rtl-node-info fxFlex="100" *ngSwitchCase="'node'" [information]="information" [ngClass]="{'error-border': flgLoading[0]==='error'}"></rtl-node-info>
<rtl-fee-info fxFlex="100" *ngSwitchCase="'fee'" [fees]="fees" [ngClass]="{'error-border': flgLoading[2]==='error'}"></rtl-fee-info>
<rtl-channel-status-info fxFlex="100" *ngSwitchCase="'status'" [channelsStatus]="channelsStatus" [ngClass]="{'error-border': flgLoading[3]==='error' || flgLoading[4]==='error'}"></rtl-channel-status-info>
</div>
</mat-card-content>
</mat-card>
</div>
</div>
</mat-grid-tile>
</mat-grid-list>
<div fxLayout="row" fxLayoutAlign="start end" class="padding-gap-x page-title-container" [ngClass]="{'mt-1': screenSize !== screenSizeEnum.XS}">
<fa-icon [icon]="faProjectDiagram" class="page-title-img mr-1"></fa-icon>
<span class="page-title">Network</span>
</div>
<mat-grid-list cols="3" rowHeight="250px">
<mat-grid-tile fxLayout="row" *ngFor="let card of networkCards" [colspan]="card.cols" [rowspan]="card.rows">
<mat-card fxLayout="row" fxFlex="95" fxLayoutAlign="start stretch" class="dashboard-card p-24 h-93">
<mat-card-content fxFlex="100" class="dashboard-card-content">
<div [ngSwitch]="card.id" fxLayout="column" fxFlex="100">
<div fxFlex="100" *ngSwitchCase="'general'" [ngClass]="{'error-border': flgLoading[1]==='error'}"><ng-container *ngTemplateOutlet="generalBlock"></ng-container></div>
<div fxFlex="100" *ngSwitchCase="'channels'" [ngClass]="{'error-border': flgLoading[1]==='error'}"><ng-container *ngTemplateOutlet="channelsBlock"></ng-container></div>
<div fxFlex="100" *ngSwitchCase="'degrees'" [ngClass]="{'error-border': flgLoading[1]==='error'}"><ng-container *ngTemplateOutlet="degreesBlock"></ng-container></div>
</div>
</mat-card-content>
</mat-card>
</mat-grid-tile>
</mat-grid-list>
</div>
<ng-template #generalBlock>
<div fxLayout="column" fxFlex="100" fxLayoutAlign="space-between">
<div>
<h4 class="dashboard-info-title">Network Capacity</h4>
<div class="dashboard-info-value">{{networkInfo.total_network_capacity | number}} Sats</div>
</div>
<div>
<h4 class="dashboard-info-title">Number of Nodes</h4>
<div class="dashboard-info-value">{{networkInfo.num_nodes | number}}</div>
</div>
<div>
<h4 class="dashboard-info-title">Number of Channels</h4>
<span class="overflow-wrap dashboard-info-value">{{networkInfo.num_channels | number}}</span>
</div>
</div>
</ng-template>
<ng-template #channelsBlock>
<div fxLayout="column" fxFlex="100" fxLayoutAlign="space-between">
<div>
<h4 class="dashboard-info-title">Max Channel Size</h4>
<div class="dashboard-info-value">{{networkInfo.max_channel_size | number}}</div>
</div>
<div>
<h4 class="dashboard-info-title">Avg Channel Size</h4>
<div class="dashboard-info-value">{{networkInfo.avg_channel_size | number}}</div>
</div>
<div>
<h4 class="dashboard-info-title">Min Channel Size</h4>
<span class="overflow-wrap dashboard-info-value">{{networkInfo.min_channel_size | number}}</span>
</div>
</div>
</ng-template>
<ng-template #degreesBlock>
<div fxLayout="column" fxFlex="100" fxLayoutAlign="space-between">
<div>
<h4 class="dashboard-info-title">Max Out Degree</h4>
<div class="dashboard-info-value">{{networkInfo.max_out_degree | number}}</div>
</div>
<div>
<h4 class="dashboard-info-title">Avg Out Degree</h4>
<div class="dashboard-info-value">{{networkInfo.avg_out_degree | number:'1.0-2'}}</div>
</div>
<div fxFlex="20">
<h4 class="dashboard-info-title"></h4>
<span class="overflow-wrap dashboard-info-value"></span>
</div>
</div>
</ng-template>

@ -1,3 +0,0 @@
.network-info-block {
padding: 1rem 0;
}

@ -2,13 +2,15 @@ import { Component, OnInit, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { faNetworkWired } from '@fortawesome/free-solid-svg-icons';
import { faProjectDiagram, faBolt, faServer, faNetworkWired } from '@fortawesome/free-solid-svg-icons';
import { LoggerService } from '../../shared/services/logger.service';
import { GetInfo, NetworkInfo } from '../../shared/models/lndModels';
import { GetInfo, NetworkInfo, Fees, ChannelsStatus } from '../../shared/models/lndModels';
import { SelNodeChild } from '../../shared/models/RTLconfig';
import * as fromRTLReducer from '../../store/rtl.reducers';
import { CommonService } from '../../shared/services/common.service';
import { ScreenSizeEnum, UserPersonaEnum } from '../../shared/services/consts-enums-functions';
@Component({
selector: 'rtl-network-info',
@ -16,14 +18,49 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./network-info.component.scss']
})
export class NetworkInfoComponent implements OnInit, OnDestroy {
public faNetworkWired = faNetworkWired;
public faProjectDiagram = faProjectDiagram;
public faBolt = faBolt;
public faServer = faServer;
public faNetworkWired = faNetworkWired;
public selNode: SelNodeChild = {};
public information: GetInfo = {};
public fees: Fees;
public channelsStatus: ChannelsStatus = {};
public networkInfo: NetworkInfo = {};
public flgLoading: Array<Boolean | 'error'> = [true, true];
public networkCards = [];
public nodeCards = [];
public screenSize = '';
public screenSizeEnum = ScreenSizeEnum;
public userPersonaEnum = UserPersonaEnum;
public flgLoading: Array<Boolean | 'error'> = [true, true, true, true, true, true];
private unSubs: Array<Subject<void>> = [new Subject()];
constructor(private logger: LoggerService, private store: Store<fromRTLReducer.RTLState>) {}
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>) {
this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) {
this.networkCards = [
{ id: 'general', cols: 3, rows: 1 },
{ id: 'channels', cols: 3, rows: 1 },
{ id: 'degrees', cols: 3, rows: 1 }
];
this.nodeCards = [
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 3, rows: 1 },
{ id: 'fee', icon: this.faBolt, title: 'Routing Fee Report', cols: 3, rows: 1 },
{ id: 'status', icon: this.faNetworkWired, title: 'Channels', cols: 3, rows: 1 }
];
} else {
this.networkCards = [
{ id: 'general', cols: 1, rows: 1 },
{ id: 'channels', cols: 1, rows: 1 },
{ id: 'degrees', cols: 1, rows: 1 }
];
this.nodeCards = [
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 1, rows: 1 },
{ id: 'fee', icon: this.faBolt, title: 'Routing Fee Report', cols: 1, rows: 1 },
{ id: 'status', icon: this.faNetworkWired, title: 'Channels', cols: 1, rows: 1 }
];
}
}
ngOnInit() {
this.store.select('lnd')
@ -36,6 +73,15 @@ export class NetworkInfoComponent implements OnInit, OnDestroy {
if (effectsErr.action === 'FetchNetwork') {
this.flgLoading[1] = 'error';
}
if (effectsErr.action === 'FetchFees') {
this.flgLoading[2] = 'error';
}
if (effectsErr.action === 'FetchChannels/all') {
this.flgLoading[3] = 'error';
}
if (effectsErr.action === 'FetchChannels/pending') {
this.flgLoading[4] = 'error';
}
});
this.selNode = rtlStore.nodeSettings;
this.information = rtlStore.information;
@ -48,6 +94,25 @@ export class NetworkInfoComponent implements OnInit, OnDestroy {
this.flgLoading[1] = (undefined !== this.networkInfo.num_nodes) ? false : true;
}
this.fees = rtlStore.fees;
if (this.flgLoading[2] !== 'error') {
this.flgLoading[2] = (undefined !== this.fees.day_fee_sum) ? false : true;
}
this.channelsStatus = {
active: { channels: rtlStore.numberOfActiveChannels, capacity: rtlStore.totalCapacityActive },
inactive: { channels: rtlStore.numberOfInactiveChannels, capacity: rtlStore.totalCapacityInactive },
pending: { channels: rtlStore.numberOfPendingChannels.open.num_channels, capacity: rtlStore.numberOfPendingChannels.open.limbo_balance },
closing: {
channels: rtlStore.numberOfPendingChannels.closing.num_channels + rtlStore.numberOfPendingChannels.force_closing.num_channels + rtlStore.numberOfPendingChannels.waiting_close.num_channels,
capacity: rtlStore.numberOfPendingChannels.total_limbo_balance
}
};
if (rtlStore.totalLocalBalance >= 0 && rtlStore.totalRemoteBalance >= 0 && this.flgLoading[3] !== 'error') {
this.flgLoading[3] = false;
}
if (rtlStore.numberOfPendingChannels && this.flgLoading[4] !== 'error') {
this.flgLoading[4] = false;
}
this.logger.info(rtlStore);
});
}

@ -41,7 +41,7 @@
<mat-hint fxFlex="50" fxLayoutAlign="start center" class="font-size-80"><strong class="font-weight-900">Local: </strong>{{channel.local_balance || 0 | number}} {{information?.smaller_currency_unit}}</mat-hint>
<mat-hint fxFlex="50" fxLayoutAlign="end center" class="font-size-80"><strong class="font-weight-900">Remote: </strong>{{channel.remote_balance || 0 | number}} {{information?.smaller_currency_unit}}</mat-hint>
</div>
<mat-progress-bar mode="determinate" value="{{channel.balancedness}}"></mat-progress-bar>
<mat-progress-bar mode="determinate" value="{{channel.balancedness * 100}}"></mat-progress-bar>
</td>
</ng-container>
<ng-container matColumnDef="actions">

@ -1,7 +1,8 @@
<div fxLayout="column" fxFlex="100" fxLayoutAlign="space-between stretch" class="padding-gap">
<form fxLayout="column" fxLayoutAlign="space-between stretch" fxLayout.gt-sm="row wrap" #sendPaymentForm="ngForm">
<mat-form-field class="w-100">
<input matInput placeholder="Payment Request" name="paymentRequest" [(ngModel)]="paymentRequest" tabindex="1" required #paymentReq="ngModel">
<input matInput placeholder="Payment Request" name="paymentRequest" [(ngModel)]="paymentRequest" tabindex="1" (keyup)="onPaymentRequestEntry()" required #paymentReq="ngModel">
<mat-hint *ngIf="paymentRequest && paymentDecodedHint !== ''">{{paymentDecodedHint}}</mat-hint>
</mat-form-field>
<div fxLayout="row" fxFlex="100" fxFlex.gt-sm="30" fxLayoutAlign="space-between stretch" *ngIf="showDetails" class="mt-2">
<button fxFlex="48" fxLayoutAlign="center center" mat-stroked-button color="primary" tabindex="2" type="reset" (click)="resetData()">Clear Field</button>

@ -1,4 +1,5 @@
import { Component, OnInit, OnDestroy, ViewChild, Input } from '@angular/core';
import { DecimalPipe } from '@angular/common';
import { Subject } from 'rxjs';
import { takeUntil, take } from 'rxjs/operators';
import { Store } from '@ngrx/store';
@ -6,7 +7,7 @@ import { faHistory } from '@fortawesome/free-solid-svg-icons';
import { MatTableDataSource, MatSort, MatPaginator, MatPaginatorIntl } from '@angular/material';
import { GetInfo, Payment, PayRequest } from '../../../shared/models/lndModels';
import { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum } from '../../../shared/services/consts-enums-functions';
import { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, CurrencyUnitEnum, CURRENCY_UNIT_FORMATS } from '../../../shared/services/consts-enums-functions';
import { LoggerService } from '../../../shared/services/logger.service';
import { CommonService } from '../../../shared/services/common.service';
@ -15,6 +16,7 @@ import { LNDEffects } from '../../store/lnd.effects';
import { RTLEffects } from '../../../store/rtl.effects';
import * as RTLActions from '../../../store/rtl.actions';
import * as fromRTLReducer from '../../../store/rtl.reducers';
import { SelNodeChild } from '../../../shared/models/RTLconfig';
@Component({
selector: 'rtl-lightning-payments',
@ -33,6 +35,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
public faHistory = faHistory;
public newlyAddedPayment = '';
public flgAnimate = true;
public selNode: SelNodeChild = {};
public flgLoading: Array<Boolean | 'error'> = [true];
public information: GetInfo = {};
public payments: any;
@ -40,14 +43,15 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
public displayedColumns = [];
public paymentDecoded: PayRequest = {};
public paymentRequest = '';
public paymentDecodedHint = '';
public flgSticky = false;
public pageSize = PAGE_SIZE;
public pageSizeOptions = PAGE_SIZE_OPTIONS;
public screenSize = '';
public screenSizeEnum = ScreenSizeEnum;
private unsub: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>, private rtlEffects: RTLEffects, private lndEffects: LNDEffects) {
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>, private rtlEffects: RTLEffects, private lndEffects: LNDEffects, private decimalPipe: DecimalPipe) {
this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) {
this.flgSticky = false;
@ -66,7 +70,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
ngOnInit() {
this.store.select('lnd')
.pipe(takeUntil(this.unsub[0]))
.pipe(takeUntil(this.unSubs[0]))
.subscribe((rtlStore) => {
rtlStore.effectErrorsLnd.forEach(effectsErr => {
if (effectsErr.action === 'FetchPayments') {
@ -74,6 +78,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
}
});
this.information = rtlStore.information;
this.selNode = rtlStore.nodeSettings;
this.paymentJSONArr = (null !== rtlStore.payments && rtlStore.payments.length > 0) ? rtlStore.payments : [];
this.payments = (undefined === rtlStore.payments || null == rtlStore.payments) ? new MatTableDataSource([]) : new MatTableDataSource<Payment>([...this.paymentJSONArr]);
this.payments.data = this.paymentJSONArr;
@ -123,7 +128,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
{key: 'expiry', value: this.paymentDecoded.expiry, title: 'Expiry', width: 30, type: DataTypeEnum.NUMBER},
{key: 'cltv_expiry', value: this.paymentDecoded.cltv_expiry, title: 'CLTV Expiry', width: 30}]
];
const titleMsg = 'It is an open amount invoice. Enter the amount (Sats) to pay.';
const titleMsg = 'It is a zero amount invoice. Enter the amount (Sats) to pay.';
this.store.dispatch(new RTLActions.OpenConfirmation({ data: {
type: AlertTypeEnum.CONFIRM,
alertTitle: 'Enter Amount and Confirm Send Payment',
@ -175,12 +180,24 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
}
}
onVerifyPayment() {
this.store.dispatch(new RTLActions.OpenSpinner('Decoding Payment...'));
this.store.dispatch(new RTLActions.DecodePayment(this.paymentRequest));
this.lndEffects.setDecodedPayment.subscribe(decodedPayment => {
this.paymentDecoded = decodedPayment;
});
onPaymentRequestEntry() {
this.paymentDecodedHint = '';
if(this.paymentRequest.length > 100) {
this.store.dispatch(new RTLActions.OpenSpinner('Decoding Payment...'));
this.store.dispatch(new RTLActions.DecodePayment(this.paymentRequest));
this.lndEffects.setDecodedPayment.subscribe(decodedPayment => {
this.paymentDecoded = decodedPayment;
if(this.paymentDecoded.num_satoshis) {
this.commonService.convertCurrency(+this.paymentDecoded.num_satoshis, CurrencyUnitEnum.SATS, this.selNode.currencyUnits[2])
.pipe(takeUntil(this.unSubs[1]))
.subscribe(data => {
this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis ? this.paymentDecoded.num_satoshis : 0) + ' Sats (' + data.symbol + this.decimalPipe.transform((data.OTHER ? data.OTHER : 0), CURRENCY_UNIT_FORMATS.OTHER) + ') | Memo: ' + this.paymentDecoded.description;
});
} else {
this.paymentDecodedHint = 'Zero Amount Invoice | Memo: ' + this.paymentDecoded.description;
}
});
}
}
resetData() {
@ -219,7 +236,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
}
ngOnDestroy() {
this.unsub.forEach(completeSub => {
this.unSubs.forEach(completeSub => {
completeSub.next();
completeSub.complete();
});

@ -18,7 +18,7 @@
<div fxLayout="row">
<div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">{{screenSize === screenSizeEnum.XS ? 'Amount' : 'Amount Requested'}}</h4>
<span class="foreground-secondary-text">{{(invoice.value || 0) | number}} Sats<ng-container *ngIf="!invoice.value"> (Open Amount) </ng-container></span>
<span class="foreground-secondary-text">{{(invoice.value || 0) | number}} Sats<ng-container *ngIf="!invoice.value"> (zero amount) </ng-container></span>
</div>
<div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">Memo</h4>

@ -8,39 +8,35 @@
</mat-card-header>
<mat-card-content class="mt-5px">
<div fxLayout="column">
<div fxLayout="row">
<div fxFlex="100">
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>
<span>{{newlyAdded ? '' : 'Open channel with'}}&nbsp;</span><strong class="font-weight-900">{{peer.alias || peer.address}}</strong>&nbsp;{{newlyAdded ? 'added as a peer.' : '.'}}
</mat-panel-title>
</mat-expansion-panel-header>
<div fxLayout="column">
<div fxLayout="row">
<div fxFlex="100">
<h4 fxLayoutAlign="start" class="font-bold-500">Pubkey</h4>
<span class="foreground-secondary-text">{{peer.pub_key}}</span>
</div>
<mat-expansion-panel class="flat-expansion-panel">
<mat-expansion-panel-header>
<mat-panel-title>
<span>{{newlyAdded ? '' : 'Open channel with'}}&nbsp;</span><strong class="font-weight-900">{{peer.alias || peer.address}}</strong>&nbsp;{{newlyAdded ? 'added as a peer.' : '.'}}
</mat-panel-title>
</mat-expansion-panel-header>
<div fxLayout="column">
<div fxLayout="row">
<div fxFlex="100">
<h4 fxLayoutAlign="start" class="font-bold-500">Pubkey</h4>
<span class="foreground-secondary-text">{{peer.pub_key}}</span>
</div>
</div>
<mat-divider class="w-100 my-1"></mat-divider>
<div fxLayout="row">
<div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">Address</h4>
<span class="overflow-wrap foreground-secondary-text">{{peer.address}}</span>
</div>
<div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">Inbound</h4>
<span class="overflow-wrap foreground-secondary-text">{{peer.inbound ? 'True' : 'False'}}</span>
</div>
<mat-divider class="w-100 my-1"></mat-divider>
<div fxLayout="row">
<div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">Address</h4>
<span class="overflow-wrap foreground-secondary-text">{{peer.address}}</span>
</div>
<div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">Inbound</h4>
<span class="overflow-wrap foreground-secondary-text">{{peer.inbound ? 'True' : 'False'}}</span>
</div>
</div>
</div>
</mat-expansion-panel>
</div>
</div>
<div fxLayout="column">
</mat-expansion-panel>
<div fxLayout="column" class="bordered-box mt-2 open-inputs-box">
<div fxLayout="row" fxFlex="100">
<mat-card-header fxLayout="row" fxLayoutAlign="space-between center" class="modal-info-header mt-2">
<mat-card-header fxLayout="row" fxLayoutAlign="space-between center" class="modal-info-header">
<div fxFlex="100" fxLayoutAlign="start start">
<span class="page-title">Open Channel</span>
</div>
@ -49,7 +45,7 @@
<div fxLayout="row" fxFlex="100">
Available balance: {{totalBalance | number}} {{information.smaller_currency_unit}}
</div>
<div fxLayout="row" fxFlex="100" fxLayoutAlign="space-between center" class="mt-2">
<div fxLayout="row" fxFlex="100" fxLayoutAlign="space-between center" class="mt-1">
<mat-form-field fxFlex="60" fxLayoutAlign="start end">
<input matInput [(ngModel)]="fundingAmount" placeholder="Amount" type="number" step="1000" min="1" max="{{totalBalance}}" tabindex="1" required name="amount" #amount="ngModel">
<mat-hint>(Remaining Bal: {{totalBalance - ((fundingAmount) ? fundingAmount : 0)}})</mat-hint>

@ -0,0 +1,3 @@
.open-inputs-box {
padding: 1.2rem 2.4rem 0.8rem 2.4rem !important;
}

@ -4,7 +4,7 @@
<span class="page-title">Help</span>
</div>
<div fxLayout="row" fxFlex="100" class="padding-gap-x" fxLayoutAlign="start start">
<mat-card fxLayout="column" fxFlex="100" class="padding-gap-large">
<mat-card fxLayout="column" fxFlex="100">
<mat-card-content fxFlex="100" *ngFor="let helpTopic of helpTopics">
<mat-expansion-panel>
<mat-expansion-panel-header>

@ -10,7 +10,7 @@
<mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle routerLinkActive="active-link" routerLink="{{node.link}}">
<div (click)="onChildNavClicked(node)">
<div fxLayout="row" fxFlex="100" fxLayoutAlign="start center">
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-4"></fa-icon>
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-2"></fa-icon>
<mat-icon *ngIf="!node.iconType" class="mat-icon-36">{{node.icon}}</mat-icon>
<span *ngIf="settings.menuType === 'regular'">{{node.name}}</span>
</div>
@ -19,7 +19,7 @@
<mat-nested-tree-node fxLayout="column" *matTreeNodeDef="let node; when: hasChild" matTreeNodeToggle>
<div fxLayout="row" fxLayoutAlign="start center" class="mat-nested-tree-node-parent">
<div fxFlex="89" fxLayoutAlign="start center">
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-4"></fa-icon>
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-2"></fa-icon>
<mat-icon *ngIf="!node.iconType" class="mat-icon-36">{{node.icon}}</mat-icon>
<span>{{node.name}}</span>
</div>
@ -90,7 +90,7 @@
<mat-divider class="w-100"></mat-divider>
<mat-tree [dataSource]="navMenusShowData" [treeControl]="treeControlShowData" *ngIf="settings.menuType === 'regular'">
<mat-tree-node *matTreeNodeDef="let node" (click)="onShowData(node)">
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-4" matTooltip="{{node.name}}" matTooltipPosition="right"></fa-icon>
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-2" matTooltip="{{node.name}}" matTooltipPosition="right"></fa-icon>
<mat-icon *ngIf="!node.iconType" class="mat-icon-36" matTooltip="{{node.name}}" matTooltipPosition="right">{{node.icon}}</mat-icon>
<span>{{node.name}}</span>
</mat-tree-node>
@ -112,7 +112,7 @@
<div fxLayout="column" fxFlex="10" fxLayoutAlign="end stretch" class="w-100">
<mat-tree [dataSource]="navMenusLogout" [treeControl]="treeControlLogout" *ngIf="settings.menuType === 'regular' && showLogout">
<mat-tree-node *matTreeNodeDef="let node" (click)="onClick(node)">
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-4" matTooltip="{{node.name}}" matTooltipPosition="right"></fa-icon>
<fa-icon *ngIf="node.iconType === 'FA'" [icon]="node.icon" class="fa-icon-small mr-2" matTooltip="{{node.name}}" matTooltipPosition="right"></fa-icon>
<span>{{node.name}}</span>
</mat-tree-node>
</mat-tree>

@ -5,7 +5,7 @@
<span class="page-title">Node Layout</span>
</div>
<div fxFlex="100" class="alert alert-info">
<fa-icon [icon]="faInfoCircle" class="mr-1"></fa-icon>
<fa-icon [icon]="faServer" class="mr-1"></fa-icon>
<span>Application layout will be tailored based upon user persona.</span>
</div>
<div fxLayout="column" fxLayout.gt-sm="row" fxFlex="100" fxLayoutAlign="space-between stretch">

@ -2,7 +2,7 @@ import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/cor
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { faWrench, faPaintBrush, faInfoCircle } from '@fortawesome/free-solid-svg-icons';
import { faWrench, faPaintBrush, faServer } from '@fortawesome/free-solid-svg-icons';
import { CURRENCY_UNITS, UserPersonaEnum, ScreenSizeEnum, FIAT_CURRENCY_UNITS, NODE_SETTINGS } from '../../../services/consts-enums-functions';
import { LightningNode, Settings, RTLConfiguration, GetInfoRoot } from '../../../models/RTLconfig';
@ -20,7 +20,7 @@ import * as fromRTLReducer from '../../../../store/rtl.reducers';
export class AppSettingsComponent implements OnInit, OnDestroy {
public faWrench = faWrench;
public faPaintBrush = faPaintBrush;
public faInfoCircle = faInfoCircle;
public faServer = faServer;
public selNode: LightningNode;
public information: GetInfoRoot = {};
public userPersonas = [UserPersonaEnum.OPERATOR, UserPersonaEnum.MERCHANT];

@ -1,4 +1,4 @@
import { faTachometerAlt, faLink, faBolt, faExchangeAlt, faUsers, faMapSigns, faQuestion, faSearch, faTools, faServer, faDownload } from '@fortawesome/free-solid-svg-icons';
import { faTachometerAlt, faLink, faBolt, faExchangeAlt, faUsers, faMapSigns, faQuestion, faSearch, faTools, faProjectDiagram, faDownload } from '@fortawesome/free-solid-svg-icons';
export const MENU_DATA: MenuRootNode = {
LNDChildren: [
@ -11,7 +11,7 @@ export const MENU_DATA: MenuRootNode = {
{id: 34, parentId: 3, name: 'Routing', iconType: 'FA', icon: faMapSigns, link: '/lnd/routing'},
{id: 35, parentId: 3, name: 'Graph Lookup', iconType: 'FA', icon: faSearch, link: '/lnd/lookups'}
]},
{id: 5, parentId: 0, name: 'Node/Network', iconType: 'FA', icon: faServer, link: '/lnd/network'},
{id: 5, parentId: 0, name: 'Network', iconType: 'FA', icon: faProjectDiagram, link: '/lnd/network'},
{id: 6, parentId: 0, name: 'Settings', iconType: 'FA', icon: faTools, link: '/settings'},
{id: 7, parentId: 0, name: 'Help', iconType: 'FA', icon: faQuestion, link: '/help'}
],

@ -23,11 +23,6 @@
}
.page-title-container, .page-sub-title-container {
font-size: $small-font-size * 1.1;
& .page-title-img {
width: $small-font-size * 1.5;
height: $small-font-size * 1.5;
font-size: $small-font-size * 1.5;
}
}
.mat-icon-button .top-toolbar-icon.icon-pinned, .mat-step-header .mat-step-icon .mat-icon {
padding-top: 1rem;
@ -100,14 +95,9 @@
}
.page-title-container, .page-sub-title-container {
font-size: $regular-font-size * 1.1;
& .page-title-img {
width: 2rem;
height: 2.6rem;
font-size: $regular-font-size * 1.4;
}
}
.fa-icon-small, .top-icon-small, .modal-info-header {
font-size: $regular-font-size * 1.5;
font-size: $regular-font-size * 1.2;
}
.top-toolbar-icon.icon-pinned, .mat-step-header .mat-step-icon .mat-icon {
font-size: $regular-font-size * 1.3;
@ -176,14 +166,9 @@
.page-title-container, .page-sub-title-container {
margin-top: 0.5rem;
font-size: $large-font-size * 1.1;
& .page-title-img {
width: $large-font-size * 1.9;
height: $large-font-size * 2.25;
font-size: $large-font-size * 1.5;
}
}
.fa-icon-small, .top-icon-small, .modal-info-header {
font-size: $large-font-size * 1.4;
font-size: $large-font-size * 1.2;
}
.top-toolbar-icon.icon-pinned, .mat-step-header .mat-step-icon .mat-icon {
font-size: $large-font-size * 1.25;

@ -9,7 +9,7 @@ $horizontal-toolbar-height: 60px;
$font-family: 'Roboto', sans-serif;
$font-size: 1.4rem;
$toolbar-height: 48px;
$regular-sidenav-width: 240px;
$regular-sidenav-width: 220px;
$compact-sidenav-width: 200px;
$mini-sidenav-width: 100px;
$sidenav-info-height: 90px;

@ -250,14 +250,6 @@ body {
padding: 0 !important;
}
.h-100 {
height: 100% !important;
}
.w-100 {
width: 100% !important;
}
.mt-1px {
margin-top: 1px !important;
}
@ -735,6 +727,10 @@ body {
width: 100% !important;
}
.w-96 {
width: 96% !important;
}
.w-84 {
width: 84% !important;
}
@ -743,6 +739,10 @@ body {
height: 100% !important;
}
.h-93 {
height: 93% !important;
}
a {
outline: none;
text-decoration: none;
@ -845,7 +845,7 @@ a {
}
.page-title-container {
margin-bottom: 1.2rem;
margin-bottom: 0.5rem;
}
table {
@ -939,4 +939,8 @@ table {
.dashboard-tabs-group .mat-tab-label {
min-width: 32%;
}
.node-grid-tile.mat-grid-tile .mat-figure {
align-items: start;
}

@ -330,7 +330,6 @@ export class RTLEffects implements OnDestroy {
map((postRes: any) => {
this.logger.info(postRes);
this.store.dispatch(new RTLActions.CloseSpinner());
console.warn(action.payload.lnNode);
this.initializeNode(action.payload.lnNode, action.payload.isInitialSetup);
return { type: RTLActions.VOID };
}),

Loading…
Cancel
Save