Network, payments, lookups etc

Network, payments, lookups etc
pull/260/head
Shahana Farooqui 5 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="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="icon" type="image/png" sizes="16x16" href="assets/images/favicon/favicon-16x16.png">
<link rel="manifest" href="assets/images/favicon/site.webmanifest"> <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> <body>
<rtl-app></rtl-app> <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> </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 { RTLEffects } from './store/rtl.effects';
import { LNDEffects } from './lnd/store/lnd.effects'; import { LNDEffects } from './lnd/store/lnd.effects';
import { CLEffects } from './clightning/store/cl.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({ @NgModule({
imports: [ imports: [
@ -35,7 +41,13 @@ import { CLEffects } from './clightning/store/cl.effects';
UserIdleModule.forRoot({idle: 60 * 60, timeout: 1, ping: null}), UserIdleModule.forRoot({idle: 60 * 60, timeout: 1, ping: null}),
StoreModule.forRoot(RTLReducer), StoreModule.forRoot(RTLReducer),
EffectsModule.forRoot([RTLEffects, LNDEffects, CLEffects]), EffectsModule.forRoot([RTLEffects, LNDEffects, CLEffects]),
!environment.production ? StoreDevtoolsModule.instrument() : [] !environment.production ? StoreDevtoolsModule.instrument() : [],
MatGridListModule,
MatCardModule,
MatMenuModule,
MatIconModule,
MatButtonModule,
LayoutModule
], ],
declarations: [ declarations: [
AppComponent 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}] [{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) { 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: { this.store.dispatch(new RTLActions.OpenConfirmation({ data: {
type: AlertTypeEnum.CONFIRM, type: AlertTypeEnum.CONFIRM,
alertTitle: 'Enter Amount and Confirm Send Payment', 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"> <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> <div fxFlex="100" class="alert alert-warn">
<h4 fxFlex="100" class="mt-1">Backup folder location: {{selNode.channelBackupPath}}</h4> <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"> <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> <button fxFlex="48" fxLayoutAlign="center center" mat-raised-button color="primary" tabindex="2" (click)="onBackupChannels({})">Backup All</button>
</div> </div>
</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 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"> <mat-form-field fxFlex="30">
<input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter"> <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field> </mat-form-field>

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

@ -5,7 +5,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 { faSmile, faFrown } from '@fortawesome/free-regular-svg-icons'; 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 { LoggerService } from '../../shared/services/logger.service';
import { CommonService } from '../../shared/services/common.service'; import { CommonService } from '../../shared/services/common.service';
@ -27,7 +27,7 @@ export class HomeComponent implements OnInit, OnDestroy {
public faAngleDoubleUp = faAngleDoubleUp; public faAngleDoubleUp = faAngleDoubleUp;
public faChartPie = faChartPie; public faChartPie = faChartPie;
public faBolt = faBolt; public faBolt = faBolt;
public faInfoCircle = faInfoCircle; public faServer = faServer;
public faNetworkWired = faNetworkWired; public faNetworkWired = faNetworkWired;
public flgChildInfoUpdated = false; public flgChildInfoUpdated = false;
public userPersonaEnum = UserPersonaEnum; public userPersonaEnum = UserPersonaEnum;
@ -58,7 +58,7 @@ export class HomeComponent implements OnInit, OnDestroy {
this.screenSize = this.commonService.getScreenSize(); this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) { if(this.screenSize === ScreenSizeEnum.XS) {
this.operatorCards = [ 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: '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: '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 }, { 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) { } else if(this.screenSize === ScreenSizeEnum.SM || this.screenSize === ScreenSizeEnum.MD) {
this.operatorCards = [ 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: '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: '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 }, { 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.operatorCardHeight = ((window.screen.height - 200) / 2) + 'px';
this.merchantCardHeight = ((window.screen.height - 210) / 10) + 'px'; this.merchantCardHeight = ((window.screen.height - 210) / 10) + 'px';
this.operatorCards = [ 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: '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: '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 }, { 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') { if (rtlStore.totalLocalBalance >= 0 && rtlStore.totalRemoteBalance >= 0 && this.flgLoading[5] !== 'error') {
this.flgLoading[5] = false; this.flgLoading[5] = false;
} }
if (rtlStore.numberOfPendingChannels && this.flgLoading[6] !== 'error') {
this.flgLoading[6] = false;
}
this.totalInboundLiquidity = 0; this.totalInboundLiquidity = 0;
this.totalOutboundLiquidity = 0; this.totalOutboundLiquidity = 0;
this.allChannels = rtlStore.allChannels.filter(channel => channel.active === true); this.allChannels = rtlStore.allChannels.filter(channel => channel.active === true);

@ -6,15 +6,15 @@
<div fxLayout="row" fxFlex="100" fxLayoutAlign="start start" class="padding-gap"> <div fxLayout="row" fxFlex="100" fxLayoutAlign="start start" class="padding-gap">
<mat-card fxLayout="row" fxFlex="100" fxLayoutAlign="start start"> <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"> <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"> <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">
<mat-form-field fxFlex="30" fxLayoutAlign="start end"> <div fxFlex="35" fxFlex.gt-md="22" fxLayoutAlign="start end">
<mat-select [(ngModel)]="selectedFieldId" placeholder="Lookup Field" (selectionChange)="onSelectChange($event)" tabindex="1" required name="lookupField"> <mat-radio-group color="primary" [(ngModel)]="selectedFieldId" (change)="onSelectChange()" tabindex="1" name="lookupField">
<mat-option *ngFor="let lookupField of lookupFields" [value]="lookupField.id"> <mat-radio-button *ngFor="let lookupField of lookupFields" [value]="lookupField.id" class="mr-4">
{{lookupField.name}} {{lookupField.name}}
</mat-option> </mat-radio-button>
</mat-select> </mat-radio-group>
</mat-form-field> </div>
<mat-form-field fxFlex="68" fxLayoutAlign="start end"> <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> <input matInput name="lookupKey" [placeholder]="lookupFields[selectedFieldId]?.placeholder || 'Lookup Key'" (change)="clearLookupValue()" [(ngModel)]="lookupKey" tabindex="2" required>
</mat-form-field> </mat-form-field>
<div fxFlex="30" fxLayoutAlign="space-between stretch" class="mt-2"> <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 RTLActions from '../../store/rtl.actions';
import * as fromRTLReducer from '../../store/rtl.reducers'; import * as fromRTLReducer from '../../store/rtl.reducers';
import { ScreenSizeEnum } from '../../shared/services/consts-enums-functions';
import { CommonService } from '../../shared/services/common.service';
@Component({ @Component({
selector: 'rtl-lookups', selector: 'rtl-lookups',
@ -28,9 +30,13 @@ export class LookupsComponent implements OnInit, OnDestroy {
]; ];
public flgLoading: Array<Boolean | 'error'> = [true]; public flgLoading: Array<Boolean | 'error'> = [true];
public faSearch = faSearch; public faSearch = faSearch;
public screenSize = '';
public screenSizeEnum = ScreenSizeEnum;
private unSubs: Array<Subject<void>> = [new Subject()]; 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() { ngOnInit() {
this.actions$ this.actions$
@ -66,7 +72,7 @@ export class LookupsComponent implements OnInit, OnDestroy {
} }
} }
onSelectChange(event: any) { onSelectChange() {
this.flgSetLookupValue = false; this.flgSetLookupValue = false;
this.lookupKey = ''; this.lookupKey = '';
this.lookupValue = {}; this.lookupValue = {};

@ -1,59 +1,91 @@
<div fxLayout="column"> <div fxLayout="column" fxLayoutAlign="space-between stretch" class="mb-4">
<div fxLayout="row" fxLayoutAlign="start center" class="padding-gap-x page-title-container"> <mat-grid-list *ngIf="selNode.userPersona !== userPersonaEnum.OPERATOR" cols="3" rowHeight="330px">
<fa-icon [icon]="faNetworkWired" class="page-title-img mr-1"></fa-icon> <mat-grid-tile class="node-grid-tile" *ngFor="let card of nodeCards" [colspan]="card.cols" [rowspan]="card.rows">
<span class="page-title">Network Information</span> <div fxLayout="column" fxLayoutAlign="stretch start" fxFlex="100" class="h-100">
</div> <div fxLayout="row" fxLayoutAlign="start start" class="w-100">
<div fxLayout="row" fxFlex="100" fxLayoutAlign="start start" class="padding-gap-x"> <div fxLayout="row" fxLayoutAlign="start start" class="padding-gap-x page-title-container">
<mat-card fxLayout="column" fxFlex="100" fxLayoutAlign="start start"> <fa-icon [icon]="card.icon" class="mr-1"></fa-icon>
<mat-progress-bar *ngIf="flgLoading[1]===true" mode="indeterminate"></mat-progress-bar> <span>{{card.title}}</span>
<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> </div>
</div> </div>
<div fxLayout="column" fxLayout.gt-sm="row wrap" fxLayoutAlign="start space-between" fxLayoutAlign.gt-sm="start start" fxFlex="100"> <div fxLayout="column" fxLayoutAlign="stretch center" fxLayout.gt-sm="row" fxLayoutAlign.gt-sm="center stretch" class="w-100 h-93">
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block"> <mat-card fxLayout="row" fxFlex="95" fxLayoutAlign="start stretch" class="dashboard-card p-24 w-96 h-93">
<h4 class="font-bold-330">Max Out Degree</h4> <mat-card-content fxFlex="100" class="dashboard-card-content">
<span class="foreground-secondary-text">{{networkInfo.max_out_degree | number}}</span> <div [ngSwitch]="card.id" fxLayout="column" fxFlex="100">
<mat-divider class="mt-1"></mat-divider> <rtl-node-info fxFlex="100" *ngSwitchCase="'node'" [information]="information" [ngClass]="{'error-border': flgLoading[0]==='error'}"></rtl-node-info>
</div> <rtl-fee-info fxFlex="100" *ngSwitchCase="'fee'" [fees]="fees" [ngClass]="{'error-border': flgLoading[2]==='error'}"></rtl-fee-info>
<div fxLayout="column" fxFlex="33" fxLayoutAlign="end space-between" class="network-info-block"> <rtl-channel-status-info fxFlex="100" *ngSwitchCase="'status'" [channelsStatus]="channelsStatus" [ngClass]="{'error-border': flgLoading[3]==='error' || flgLoading[4]==='error'}"></rtl-channel-status-info>
<h4 class="font-bold-330">Avg Out Degree</h4> </div>
<span class="foreground-secondary-text">{{networkInfo.avg_out_degree | number:'1.0-2'}}</span> </mat-card-content>
<mat-divider class="mt-1"></mat-divider> </mat-card>
</div> </div>
</div> </div>
</mat-card-content> </mat-grid-tile>
</mat-card> </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> </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> </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 { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store'; 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 { 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 { SelNodeChild } from '../../shared/models/RTLconfig';
import * as fromRTLReducer from '../../store/rtl.reducers'; import * as fromRTLReducer from '../../store/rtl.reducers';
import { CommonService } from '../../shared/services/common.service';
import { ScreenSizeEnum, UserPersonaEnum } from '../../shared/services/consts-enums-functions';
@Component({ @Component({
selector: 'rtl-network-info', selector: 'rtl-network-info',
@ -16,14 +18,49 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./network-info.component.scss'] styleUrls: ['./network-info.component.scss']
}) })
export class NetworkInfoComponent implements OnInit, OnDestroy { 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 selNode: SelNodeChild = {};
public information: GetInfo = {}; public information: GetInfo = {};
public fees: Fees;
public channelsStatus: ChannelsStatus = {};
public networkInfo: NetworkInfo = {}; 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()]; 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() { ngOnInit() {
this.store.select('lnd') this.store.select('lnd')
@ -36,6 +73,15 @@ export class NetworkInfoComponent implements OnInit, OnDestroy {
if (effectsErr.action === 'FetchNetwork') { if (effectsErr.action === 'FetchNetwork') {
this.flgLoading[1] = 'error'; 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.selNode = rtlStore.nodeSettings;
this.information = rtlStore.information; 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.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); 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="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> <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> </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> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="actions"> <ng-container matColumnDef="actions">

@ -1,7 +1,8 @@
<div fxLayout="column" fxFlex="100" fxLayoutAlign="space-between stretch" class="padding-gap"> <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"> <form fxLayout="column" fxLayoutAlign="space-between stretch" fxLayout.gt-sm="row wrap" #sendPaymentForm="ngForm">
<mat-form-field class="w-100"> <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> </mat-form-field>
<div fxLayout="row" fxFlex="100" fxFlex.gt-sm="30" fxLayoutAlign="space-between stretch" *ngIf="showDetails" class="mt-2"> <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> <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 { Component, OnInit, OnDestroy, ViewChild, Input } from '@angular/core';
import { DecimalPipe } from '@angular/common';
import { Subject } from 'rxjs'; 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';
@ -6,7 +7,7 @@ import { faHistory } from '@fortawesome/free-solid-svg-icons';
import { MatTableDataSource, MatSort, MatPaginator, MatPaginatorIntl } from '@angular/material'; import { MatTableDataSource, MatSort, MatPaginator, MatPaginatorIntl } from '@angular/material';
import { GetInfo, Payment, PayRequest } from '../../../shared/models/lndModels'; 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 { LoggerService } from '../../../shared/services/logger.service';
import { CommonService } from '../../../shared/services/common.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 { RTLEffects } from '../../../store/rtl.effects';
import * as RTLActions from '../../../store/rtl.actions'; import * as RTLActions from '../../../store/rtl.actions';
import * as fromRTLReducer from '../../../store/rtl.reducers'; import * as fromRTLReducer from '../../../store/rtl.reducers';
import { SelNodeChild } from '../../../shared/models/RTLconfig';
@Component({ @Component({
selector: 'rtl-lightning-payments', selector: 'rtl-lightning-payments',
@ -33,6 +35,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
public faHistory = faHistory; public faHistory = faHistory;
public newlyAddedPayment = ''; public newlyAddedPayment = '';
public flgAnimate = true; public flgAnimate = true;
public selNode: SelNodeChild = {};
public flgLoading: Array<Boolean | 'error'> = [true]; public flgLoading: Array<Boolean | 'error'> = [true];
public information: GetInfo = {}; public information: GetInfo = {};
public payments: any; public payments: any;
@ -40,14 +43,15 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
public displayedColumns = []; public displayedColumns = [];
public paymentDecoded: PayRequest = {}; public paymentDecoded: PayRequest = {};
public paymentRequest = ''; public paymentRequest = '';
public paymentDecodedHint = '';
public flgSticky = false; public flgSticky = false;
public pageSize = PAGE_SIZE; public pageSize = PAGE_SIZE;
public pageSizeOptions = PAGE_SIZE_OPTIONS; public pageSizeOptions = PAGE_SIZE_OPTIONS;
public screenSize = ''; public screenSize = '';
public screenSizeEnum = ScreenSizeEnum; 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(); this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) { if(this.screenSize === ScreenSizeEnum.XS) {
this.flgSticky = false; this.flgSticky = false;
@ -66,7 +70,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
ngOnInit() { ngOnInit() {
this.store.select('lnd') this.store.select('lnd')
.pipe(takeUntil(this.unsub[0])) .pipe(takeUntil(this.unSubs[0]))
.subscribe((rtlStore) => { .subscribe((rtlStore) => {
rtlStore.effectErrorsLnd.forEach(effectsErr => { rtlStore.effectErrorsLnd.forEach(effectsErr => {
if (effectsErr.action === 'FetchPayments') { if (effectsErr.action === 'FetchPayments') {
@ -74,6 +78,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
} }
}); });
this.information = rtlStore.information; this.information = rtlStore.information;
this.selNode = rtlStore.nodeSettings;
this.paymentJSONArr = (null !== rtlStore.payments && rtlStore.payments.length > 0) ? rtlStore.payments : []; 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 = (undefined === rtlStore.payments || null == rtlStore.payments) ? new MatTableDataSource([]) : new MatTableDataSource<Payment>([...this.paymentJSONArr]);
this.payments.data = 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: '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}] {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: { this.store.dispatch(new RTLActions.OpenConfirmation({ data: {
type: AlertTypeEnum.CONFIRM, type: AlertTypeEnum.CONFIRM,
alertTitle: 'Enter Amount and Confirm Send Payment', alertTitle: 'Enter Amount and Confirm Send Payment',
@ -175,12 +180,24 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
} }
} }
onVerifyPayment() { onPaymentRequestEntry() {
this.store.dispatch(new RTLActions.OpenSpinner('Decoding Payment...')); this.paymentDecodedHint = '';
this.store.dispatch(new RTLActions.DecodePayment(this.paymentRequest)); if(this.paymentRequest.length > 100) {
this.lndEffects.setDecodedPayment.subscribe(decodedPayment => { this.store.dispatch(new RTLActions.OpenSpinner('Decoding Payment...'));
this.paymentDecoded = decodedPayment; 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() { resetData() {
@ -219,7 +236,7 @@ export class LightningPaymentsComponent implements OnInit, OnDestroy {
} }
ngOnDestroy() { ngOnDestroy() {
this.unsub.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next();
completeSub.complete(); completeSub.complete();
}); });

@ -18,7 +18,7 @@
<div fxLayout="row"> <div fxLayout="row">
<div fxFlex="50"> <div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">{{screenSize === screenSizeEnum.XS ? 'Amount' : 'Amount Requested'}}</h4> <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>
<div fxFlex="50"> <div fxFlex="50">
<h4 fxLayoutAlign="start" class="font-bold-500">Memo</h4> <h4 fxLayoutAlign="start" class="font-bold-500">Memo</h4>

@ -8,39 +8,35 @@
</mat-card-header> </mat-card-header>
<mat-card-content class="mt-5px"> <mat-card-content class="mt-5px">
<div fxLayout="column"> <div fxLayout="column">
<div fxLayout="row"> <mat-expansion-panel class="flat-expansion-panel">
<div fxFlex="100"> <mat-expansion-panel-header>
<mat-expansion-panel> <mat-panel-title>
<mat-expansion-panel-header> <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-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-expansion-panel-header>
</mat-panel-title> <div fxLayout="column">
</mat-expansion-panel-header> <div fxLayout="row">
<div fxLayout="column"> <div fxFlex="100">
<div fxLayout="row"> <h4 fxLayoutAlign="start" class="font-bold-500">Pubkey</h4>
<div fxFlex="100"> <span class="foreground-secondary-text">{{peer.pub_key}}</span>
<h4 fxLayoutAlign="start" class="font-bold-500">Pubkey</h4> </div>
<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> </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> </div>
</mat-expansion-panel>
</div> </div>
</div> </mat-expansion-panel>
<div fxLayout="column"> <div fxLayout="column" class="bordered-box mt-2 open-inputs-box">
<div fxLayout="row" fxFlex="100"> <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"> <div fxFlex="100" fxLayoutAlign="start start">
<span class="page-title">Open Channel</span> <span class="page-title">Open Channel</span>
</div> </div>
@ -49,7 +45,7 @@
<div fxLayout="row" fxFlex="100"> <div fxLayout="row" fxFlex="100">
Available balance: {{totalBalance | number}} {{information.smaller_currency_unit}} Available balance: {{totalBalance | number}} {{information.smaller_currency_unit}}
</div> </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"> <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"> <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> <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> <span class="page-title">Help</span>
</div> </div>
<div fxLayout="row" fxFlex="100" class="padding-gap-x" fxLayoutAlign="start start"> <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-card-content fxFlex="100" *ngFor="let helpTopic of helpTopics">
<mat-expansion-panel> <mat-expansion-panel>
<mat-expansion-panel-header> <mat-expansion-panel-header>

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

@ -5,7 +5,7 @@
<span class="page-title">Node Layout</span> <span class="page-title">Node Layout</span>
</div> </div>
<div fxFlex="100" class="alert alert-info"> <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> <span>Application layout will be tailored based upon user persona.</span>
</div> </div>
<div fxLayout="column" fxLayout.gt-sm="row" fxFlex="100" fxLayoutAlign="space-between stretch"> <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 { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store'; 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 { CURRENCY_UNITS, UserPersonaEnum, ScreenSizeEnum, FIAT_CURRENCY_UNITS, NODE_SETTINGS } from '../../../services/consts-enums-functions';
import { LightningNode, Settings, RTLConfiguration, GetInfoRoot } from '../../../models/RTLconfig'; 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 { export class AppSettingsComponent implements OnInit, OnDestroy {
public faWrench = faWrench; public faWrench = faWrench;
public faPaintBrush = faPaintBrush; public faPaintBrush = faPaintBrush;
public faInfoCircle = faInfoCircle; public faServer = faServer;
public selNode: LightningNode; public selNode: LightningNode;
public information: GetInfoRoot = {}; public information: GetInfoRoot = {};
public userPersonas = [UserPersonaEnum.OPERATOR, UserPersonaEnum.MERCHANT]; 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 = { export const MENU_DATA: MenuRootNode = {
LNDChildren: [ LNDChildren: [
@ -11,7 +11,7 @@ export const MENU_DATA: MenuRootNode = {
{id: 34, parentId: 3, name: 'Routing', iconType: 'FA', icon: faMapSigns, link: '/lnd/routing'}, {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: 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: 6, parentId: 0, name: 'Settings', iconType: 'FA', icon: faTools, link: '/settings'},
{id: 7, parentId: 0, name: 'Help', iconType: 'FA', icon: faQuestion, link: '/help'} {id: 7, parentId: 0, name: 'Help', iconType: 'FA', icon: faQuestion, link: '/help'}
], ],

@ -23,11 +23,6 @@
} }
.page-title-container, .page-sub-title-container { .page-title-container, .page-sub-title-container {
font-size: $small-font-size * 1.1; 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 { .mat-icon-button .top-toolbar-icon.icon-pinned, .mat-step-header .mat-step-icon .mat-icon {
padding-top: 1rem; padding-top: 1rem;
@ -100,14 +95,9 @@
} }
.page-title-container, .page-sub-title-container { .page-title-container, .page-sub-title-container {
font-size: $regular-font-size * 1.1; 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 { .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 { .top-toolbar-icon.icon-pinned, .mat-step-header .mat-step-icon .mat-icon {
font-size: $regular-font-size * 1.3; font-size: $regular-font-size * 1.3;
@ -176,14 +166,9 @@
.page-title-container, .page-sub-title-container { .page-title-container, .page-sub-title-container {
margin-top: 0.5rem; margin-top: 0.5rem;
font-size: $large-font-size * 1.1; 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 { .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 { .top-toolbar-icon.icon-pinned, .mat-step-header .mat-step-icon .mat-icon {
font-size: $large-font-size * 1.25; font-size: $large-font-size * 1.25;

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

@ -250,14 +250,6 @@ body {
padding: 0 !important; padding: 0 !important;
} }
.h-100 {
height: 100% !important;
}
.w-100 {
width: 100% !important;
}
.mt-1px { .mt-1px {
margin-top: 1px !important; margin-top: 1px !important;
} }
@ -735,6 +727,10 @@ body {
width: 100% !important; width: 100% !important;
} }
.w-96 {
width: 96% !important;
}
.w-84 { .w-84 {
width: 84% !important; width: 84% !important;
} }
@ -743,6 +739,10 @@ body {
height: 100% !important; height: 100% !important;
} }
.h-93 {
height: 93% !important;
}
a { a {
outline: none; outline: none;
text-decoration: none; text-decoration: none;
@ -845,7 +845,7 @@ a {
} }
.page-title-container { .page-title-container {
margin-bottom: 1.2rem; margin-bottom: 0.5rem;
} }
table { table {
@ -939,4 +939,8 @@ table {
.dashboard-tabs-group .mat-tab-label { .dashboard-tabs-group .mat-tab-label {
min-width: 32%; 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) => { map((postRes: any) => {
this.logger.info(postRes); this.logger.info(postRes);
this.store.dispatch(new RTLActions.CloseSpinner()); this.store.dispatch(new RTLActions.CloseSpinner());
console.warn(action.payload.lnNode);
this.initializeNode(action.payload.lnNode, action.payload.isInitialSetup); this.initializeNode(action.payload.lnNode, action.payload.isInitialSetup);
return { type: RTLActions.VOID }; return { type: RTLActions.VOID };
}), }),

Loading…
Cancel
Save