Add precommit hooks

This commit is contained in:
Spencer Ofwiti 2021-06-15 16:37:33 +00:00
parent 5295e47cc1
commit 6a1ca3d4a0
72 changed files with 3365 additions and 23661 deletions

1
.gitignore vendored
View File

@ -40,6 +40,7 @@ npm-debug.log
yarn-error.log
testem.log
/typings
/.husky
# System Files
.DS_Store

1
.husky/.gitignore vendored
View File

@ -1 +0,0 @@
_

View File

@ -1,30 +0,0 @@
#!/bin/sh
if [ -z "$husky_skip_init" ]; then
debug () {
[ "$HUSKY_DEBUG" = "1" ] && echo "husky (debug) - $1"
}
readonly hook_name="$(basename "$0")"
debug "starting $hook_name..."
if [ "$HUSKY" = "0" ]; then
debug "HUSKY env variable is set to 0, skipping hook"
exit 0
fi
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
export readonly husky_skip_init=1
sh -e "$0" "$@"
exitCode="$?"
if [ $exitCode != 0 ]; then
echo "husky - $hook_name hook exited with code $exitCode (error)"
exit $exitCode
fi
exit 0
fi

View File

@ -186,7 +186,7 @@
getBySymbol(symbol: string): any {
return {
name: 'Reserve',
symbol: 'RSV'
symbol: 'RSV',
};
}
}

View File

@ -352,7 +352,7 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {Observable, of} from &#x27;rxjs&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Observable, of } from &#x27;rxjs&#x27;;
export class TransactionServiceStub {
setTransaction(transaction: any, cacheSize: number): void {}

View File

@ -153,13 +153,19 @@
{ id: 3, user: &#x27;Will&#x27;, role: &#x27;superadmin&#x27;, action: &#x27;Reclaim RSV 1000&#x27;, approval: true },
{ id: 4, user: &#x27;Vivian&#x27;, role: &#x27;enroller&#x27;, action: &#x27;Complete user profile&#x27;, approval: true },
{ id: 5, user: &#x27;Jack&#x27;, role: &#x27;enroller&#x27;, action: &#x27;Reclaim RSV 200&#x27;, approval: false },
{ id: 6, user: &#x27;Patience&#x27;, role: &#x27;enroller&#x27;, action: &#x27;Change user information&#x27;, approval: false }
{
id: 6,
user: &#x27;Patience&#x27;,
role: &#x27;enroller&#x27;,
action: &#x27;Change user information&#x27;,
approval: false,
},
]</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="12" class="link-to-prism">src/testing/user-service-stub.ts:12</a></div>
<div class="io-line">Defined in <a href="" data-line="72" class="link-to-prism">src/testing/user-service-stub.ts:72</a></div>
</td>
</tr>
@ -187,11 +193,71 @@
<tr>
<td class="col-md-4">
<i>Default value : </i><code>[
{id: 1, name: &#x27;John Doe&#x27;, phone: &#x27;+25412345678&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;user&#x27;, created: &#x27;08/16/2020&#x27;, balance: &#x27;12987&#x27;, failedPinAttempts: 1, status: &#x27;approved&#x27;, bio: &#x27;Bodaboda&#x27;, gender: &#x27;male&#x27;},
{id: 2, name: &#x27;Jane Buck&#x27;, phone: &#x27;+25412341234&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;vendor&#x27;, created: &#x27;04/02/2020&#x27;, balance: &#x27;56281&#x27;, failedPinAttempts: 0, status: &#x27;approved&#x27;, bio: &#x27;Groceries&#x27;, gender: &#x27;female&#x27;},
{id: 3, name: &#x27;Mc Donald&#x27;, phone: &#x27;+25498765432&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;group&#x27;, created: &#x27;11/16/2020&#x27;, balance: &#x27;450&#x27;, failedPinAttempts: 2, status: &#x27;unapproved&#x27;, bio: &#x27;Food&#x27;, gender: &#x27;male&#x27;},
{id: 4, name: &#x27;Hera Cles&#x27;, phone: &#x27;+25498769876&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;user&#x27;, created: &#x27;05/28/2020&#x27;, balance: &#x27;5621&#x27;, failedPinAttempts: 3, status: &#x27;approved&#x27;, bio: &#x27;Shop&#x27;, gender: &#x27;female&#x27;},
{id: 5, name: &#x27;Silver Fia&#x27;, phone: &#x27;+25462518374&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;token agent&#x27;, created: &#x27;10/10/2020&#x27;, balance: &#x27;817&#x27;, failedPinAttempts: 0, status: &#x27;unapproved&#x27;, bio: &#x27;Electronics&#x27;, gender: &#x27;male&#x27;},
{
id: 1,
name: &#x27;John Doe&#x27;,
phone: &#x27;+25412345678&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;user&#x27;,
created: &#x27;08/16/2020&#x27;,
balance: &#x27;12987&#x27;,
failedPinAttempts: 1,
status: &#x27;approved&#x27;,
bio: &#x27;Bodaboda&#x27;,
gender: &#x27;male&#x27;,
},
{
id: 2,
name: &#x27;Jane Buck&#x27;,
phone: &#x27;+25412341234&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;vendor&#x27;,
created: &#x27;04/02/2020&#x27;,
balance: &#x27;56281&#x27;,
failedPinAttempts: 0,
status: &#x27;approved&#x27;,
bio: &#x27;Groceries&#x27;,
gender: &#x27;female&#x27;,
},
{
id: 3,
name: &#x27;Mc Donald&#x27;,
phone: &#x27;+25498765432&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;group&#x27;,
created: &#x27;11/16/2020&#x27;,
balance: &#x27;450&#x27;,
failedPinAttempts: 2,
status: &#x27;unapproved&#x27;,
bio: &#x27;Food&#x27;,
gender: &#x27;male&#x27;,
},
{
id: 4,
name: &#x27;Hera Cles&#x27;,
phone: &#x27;+25498769876&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;user&#x27;,
created: &#x27;05/28/2020&#x27;,
balance: &#x27;5621&#x27;,
failedPinAttempts: 3,
status: &#x27;approved&#x27;,
bio: &#x27;Shop&#x27;,
gender: &#x27;female&#x27;,
},
{
id: 5,
name: &#x27;Silver Fia&#x27;,
phone: &#x27;+25462518374&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;token agent&#x27;,
created: &#x27;10/10/2020&#x27;,
balance: &#x27;817&#x27;,
failedPinAttempts: 0,
status: &#x27;unapproved&#x27;,
bio: &#x27;Electronics&#x27;,
gender: &#x27;male&#x27;,
},
]</code>
</td>
</tr>
@ -233,8 +299,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="71"
class="link-to-prism">src/testing/user-service-stub.ts:71</a></div>
<div class="io-line">Defined in <a href="" data-line="134"
class="link-to-prism">src/testing/user-service-stub.ts:134</a></div>
</td>
</tr>
@ -303,8 +369,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="61"
class="link-to-prism">src/testing/user-service-stub.ts:61</a></div>
<div class="io-line">Defined in <a href="" data-line="124"
class="link-to-prism">src/testing/user-service-stub.ts:124</a></div>
</td>
</tr>
@ -373,8 +439,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="37"
class="link-to-prism">src/testing/user-service-stub.ts:37</a></div>
<div class="io-line">Defined in <a href="" data-line="103"
class="link-to-prism">src/testing/user-service-stub.ts:103</a></div>
</td>
</tr>
@ -443,8 +509,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="21"
class="link-to-prism">src/testing/user-service-stub.ts:21</a></div>
<div class="io-line">Defined in <a href="" data-line="87"
class="link-to-prism">src/testing/user-service-stub.ts:87</a></div>
</td>
</tr>
@ -501,15 +567,75 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {Observable, of} from &#x27;rxjs&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Observable, of } from &#x27;rxjs&#x27;;
export class UserServiceStub {
users &#x3D; [
{id: 1, name: &#x27;John Doe&#x27;, phone: &#x27;+25412345678&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;user&#x27;, created: &#x27;08/16/2020&#x27;, balance: &#x27;12987&#x27;, failedPinAttempts: 1, status: &#x27;approved&#x27;, bio: &#x27;Bodaboda&#x27;, gender: &#x27;male&#x27;},
{id: 2, name: &#x27;Jane Buck&#x27;, phone: &#x27;+25412341234&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;vendor&#x27;, created: &#x27;04/02/2020&#x27;, balance: &#x27;56281&#x27;, failedPinAttempts: 0, status: &#x27;approved&#x27;, bio: &#x27;Groceries&#x27;, gender: &#x27;female&#x27;},
{id: 3, name: &#x27;Mc Donald&#x27;, phone: &#x27;+25498765432&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;group&#x27;, created: &#x27;11/16/2020&#x27;, balance: &#x27;450&#x27;, failedPinAttempts: 2, status: &#x27;unapproved&#x27;, bio: &#x27;Food&#x27;, gender: &#x27;male&#x27;},
{id: 4, name: &#x27;Hera Cles&#x27;, phone: &#x27;+25498769876&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;user&#x27;, created: &#x27;05/28/2020&#x27;, balance: &#x27;5621&#x27;, failedPinAttempts: 3, status: &#x27;approved&#x27;, bio: &#x27;Shop&#x27;, gender: &#x27;female&#x27;},
{id: 5, name: &#x27;Silver Fia&#x27;, phone: &#x27;+25462518374&#x27;, address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;, type: &#x27;token agent&#x27;, created: &#x27;10/10/2020&#x27;, balance: &#x27;817&#x27;, failedPinAttempts: 0, status: &#x27;unapproved&#x27;, bio: &#x27;Electronics&#x27;, gender: &#x27;male&#x27;},
{
id: 1,
name: &#x27;John Doe&#x27;,
phone: &#x27;+25412345678&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;user&#x27;,
created: &#x27;08/16/2020&#x27;,
balance: &#x27;12987&#x27;,
failedPinAttempts: 1,
status: &#x27;approved&#x27;,
bio: &#x27;Bodaboda&#x27;,
gender: &#x27;male&#x27;,
},
{
id: 2,
name: &#x27;Jane Buck&#x27;,
phone: &#x27;+25412341234&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;vendor&#x27;,
created: &#x27;04/02/2020&#x27;,
balance: &#x27;56281&#x27;,
failedPinAttempts: 0,
status: &#x27;approved&#x27;,
bio: &#x27;Groceries&#x27;,
gender: &#x27;female&#x27;,
},
{
id: 3,
name: &#x27;Mc Donald&#x27;,
phone: &#x27;+25498765432&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;group&#x27;,
created: &#x27;11/16/2020&#x27;,
balance: &#x27;450&#x27;,
failedPinAttempts: 2,
status: &#x27;unapproved&#x27;,
bio: &#x27;Food&#x27;,
gender: &#x27;male&#x27;,
},
{
id: 4,
name: &#x27;Hera Cles&#x27;,
phone: &#x27;+25498769876&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;user&#x27;,
created: &#x27;05/28/2020&#x27;,
balance: &#x27;5621&#x27;,
failedPinAttempts: 3,
status: &#x27;approved&#x27;,
bio: &#x27;Shop&#x27;,
gender: &#x27;female&#x27;,
},
{
id: 5,
name: &#x27;Silver Fia&#x27;,
phone: &#x27;+25462518374&#x27;,
address: &#x27;0xc86ff893ac40d3950b4d5f94a9b837258b0a9865&#x27;,
type: &#x27;token agent&#x27;,
created: &#x27;10/10/2020&#x27;,
balance: &#x27;817&#x27;,
failedPinAttempts: 0,
status: &#x27;unapproved&#x27;,
bio: &#x27;Electronics&#x27;,
gender: &#x27;male&#x27;,
},
];
actions &#x3D; [
@ -518,7 +644,13 @@ export class UserServiceStub {
{ id: 3, user: &#x27;Will&#x27;, role: &#x27;superadmin&#x27;, action: &#x27;Reclaim RSV 1000&#x27;, approval: true },
{ id: 4, user: &#x27;Vivian&#x27;, role: &#x27;enroller&#x27;, action: &#x27;Complete user profile&#x27;, approval: true },
{ id: 5, user: &#x27;Jack&#x27;, role: &#x27;enroller&#x27;, action: &#x27;Reclaim RSV 200&#x27;, approval: false },
{ id: 6, user: &#x27;Patience&#x27;, role: &#x27;enroller&#x27;, action: &#x27;Change user information&#x27;, approval: false }
{
id: 6,
user: &#x27;Patience&#x27;,
role: &#x27;enroller&#x27;,
action: &#x27;Change user information&#x27;,
approval: false,
},
];
getUserById(id: string): any {
@ -533,7 +665,7 @@ export class UserServiceStub {
failedPinAttempts: 1,
status: &#x27;approved&#x27;,
bio: &#x27;Bodaboda&#x27;,
gender: &#x27;male&#x27;
gender: &#x27;male&#x27;,
};
}
@ -544,20 +676,17 @@ export class UserServiceStub {
key: {
ethereum: [
&#x27;0x51d3c8e2e421604e2b644117a362d589c5434739&#x27;,
&#x27;0x9D7c284907acbd4a0cE2dDD0AA69147A921a573D&#x27;
]
&#x27;0x9D7c284907acbd4a0cE2dDD0AA69147A921a573D&#x27;,
],
},
location: {
external: {},
latitude: &#x27;22.430670&#x27;,
longitude: &#x27;151.002995&#x27;
longitude: &#x27;151.002995&#x27;,
},
selling: [
&#x27;environment&#x27;,
&#x27;health&#x27;,
&#x27;transport&#x27;
],
vcard: &#x27;QkVHSU46VkNBUkQNClZFUlNJT046My4wDQpFTUFJTDphYXJuZXNlbkBob3RtYWlsLmNvbQ0KRk46S3VydMKgS3JhbmpjDQpOOktyYW5qYztLdXJ0Ozs7DQpURUw7VFlQPUNFTEw6NjkyNTAzMzQ5ODE5Ng0KRU5EOlZDQVJEDQo&#x3D;&#x27;
selling: [&#x27;environment&#x27;, &#x27;health&#x27;, &#x27;transport&#x27;],
vcard:
&#x27;QkVHSU46VkNBUkQNClZFUlNJT046My4wDQpFTUFJTDphYXJuZXNlbkBob3RtYWlsLmNvbQ0KRk46S3VydMKgS3JhbmpjDQpOOktyYW5qYztLdXJ0Ozs7DQpURUw7VFlQPUNFTEw6NjkyNTAzMzQ5ODE5Ng0KRU5EOlZDQVJEDQo&#x3D;&#x27;,
});
}
@ -567,7 +696,7 @@ export class UserServiceStub {
user: &#x27;Tom&#x27;,
role: &#x27;enroller&#x27;,
action: &#x27;Disburse RSV 100&#x27;,
approval: false
approval: false,
};
}
@ -577,7 +706,7 @@ export class UserServiceStub {
user: &#x27;Tom&#x27;,
role: &#x27;enroller&#x27;,
action: &#x27;Disburse RSV 100&#x27;,
approval: true
approval: true,
};
}
}

File diff suppressed because one or more lines are too long

View File

@ -983,33 +983,61 @@ export class AccountSearchComponent implements OnInit {
&lt;/ol&gt;
&lt;/nav&gt;
&lt;div class&#x3D;&quot;card&quot;&gt;
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt;
Accounts
&lt;/mat-card-title&gt;
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt; Accounts &lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;mat-tab-group&gt;
&lt;mat-tab label&#x3D;&quot;Phone Number&quot;&gt;
&lt;form [formGroup]&#x3D;&quot;phoneSearchForm&quot; (ngSubmit)&#x3D;&quot;onPhoneSearch()&quot;&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt; Search &lt;/mat-label&gt;
&lt;input matInput type&#x3D;&quot;text&quot; placeholder&#x3D;&quot;Search by phone number&quot; formControlName&#x3D;&quot;phoneNumber&quot; [errorStateMatcher]&#x3D;&quot;matcher&quot;&gt;
&lt;mat-error *ngIf&#x3D;&quot;phoneSearchSubmitted &amp;&amp; phoneSearchFormStub.phoneNumber.errors&quot;&gt;Phone Number is required.&lt;/mat-error&gt;
&lt;input
matInput
type&#x3D;&quot;text&quot;
placeholder&#x3D;&quot;Search by phone number&quot;
formControlName&#x3D;&quot;phoneNumber&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;
/&gt;
&lt;mat-error *ngIf&#x3D;&quot;phoneSearchSubmitted &amp;&amp; phoneSearchFormStub.phoneNumber.errors&quot;
&gt;Phone Number is required.&lt;/mat-error
&gt;
&lt;mat-icon matSuffix&gt;phone&lt;/mat-icon&gt;
&lt;mat-hint&gt;Phone Number&lt;/mat-hint&gt;
&lt;/mat-form-field&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;submit&quot; class&#x3D;&quot;btn btn-outline-primary ml-3&quot;&gt; SEARCH &lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;submit&quot;
class&#x3D;&quot;btn btn-outline-primary ml-3&quot;
&gt;
SEARCH
&lt;/button&gt;
&lt;/form&gt;
&lt;/mat-tab&gt;
&lt;mat-tab label&#x3D;&quot;Account Address&quot;&gt;
&lt;form [formGroup]&#x3D;&quot;addressSearchForm&quot; (ngSubmit)&#x3D;&quot;onAddressSearch()&quot;&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt; Search &lt;/mat-label&gt;
&lt;input matInput type&#x3D;&quot;text&quot; placeholder&#x3D;&quot;Search by account address&quot; formControlName&#x3D;&quot;address&quot; [errorStateMatcher]&#x3D;&quot;matcher&quot;&gt;
&lt;mat-error *ngIf&#x3D;&quot;addressSearchSubmitted &amp;&amp; addressSearchFormStub.address.errors&quot;&gt;Account Address is required.&lt;/mat-error&gt;
&lt;input
matInput
type&#x3D;&quot;text&quot;
placeholder&#x3D;&quot;Search by account address&quot;
formControlName&#x3D;&quot;address&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;
/&gt;
&lt;mat-error *ngIf&#x3D;&quot;addressSearchSubmitted &amp;&amp; addressSearchFormStub.address.errors&quot;
&gt;Account Address is required.&lt;/mat-error
&gt;
&lt;mat-icon matSuffix&gt;view_in_ar&lt;/mat-icon&gt;
&lt;mat-hint&gt;Account Address&lt;/mat-hint&gt;
&lt;/mat-form-field&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;submit&quot; class&#x3D;&quot;btn btn-outline-primary ml-3&quot;&gt; SEARCH &lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;submit&quot;
class&#x3D;&quot;btn btn-outline-primary ml-3&quot;
&gt;
SEARCH
&lt;/button&gt;
&lt;/form&gt;
&lt;/mat-tab&gt;
&lt;/mat-tab-group&gt;
@ -1057,7 +1085,7 @@ export class AccountSearchComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item"><a routerLink="/accounts">Accounts</a></li> <li class="breadcrumb-item active" aria-current="page">Search</li> </ol> </nav> <div class="card"> <mat-card-title class="card-header"> Accounts </mat-card-title> <div class="card-body"> <mat-tab-group> <mat-tab label="Phone Number"> <form [formGroup]="phoneSearchForm" (ngSubmit)="onPhoneSearch()"> <mat-form-field appearance="outline"> <mat-label> Search </mat-label> <input matInput type="text" placeholder="Search by phone number" formControlName="phoneNumber" [errorStateMatcher]="matcher"> <mat-error *ngIf="phoneSearchSubmitted && phoneSearchFormStub.phoneNumber.errors">Phone Number is required.</mat-error> <mat-icon matSuffix>phone</mat-icon> <mat-hint>Phone Number</mat-hint> </mat-form-field> <button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3"> SEARCH </button> </form> </mat-tab> <mat-tab label="Account Address"> <form [formGroup]="addressSearchForm" (ngSubmit)="onAddressSearch()"> <mat-form-field appearance="outline"> <mat-label> Search </mat-label> <input matInput type="text" placeholder="Search by account address" formControlName="address" [errorStateMatcher]="matcher"> <mat-error *ngIf="addressSearchSubmitted && addressSearchFormStub.address.errors">Account Address is required.</mat-error> <mat-icon matSuffix>view_in_ar</mat-icon> <mat-hint>Account Address</mat-hint> </mat-form-field> <button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3"> SEARCH </button> </form> </mat-tab> </mat-tab-group> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item"><a routerLink="/accounts">Accounts</a></li> <li class="breadcrumb-item active" aria-current="page">Search</li> </ol> </nav> <div class="card"> <mat-card-title class="card-header"> Accounts </mat-card-title> <div class="card-body"> <mat-tab-group> <mat-tab label="Phone Number"> <form [formGroup]="phoneSearchForm" (ngSubmit)="onPhoneSearch()"> <mat-form-field appearance="outline"> <mat-label> Search </mat-label> <input matInput type="text" placeholder="Search by phone number" formControlName="phoneNumber" [errorStateMatcher]="matcher" /> <mat-error *ngIf="phoneSearchSubmitted && phoneSearchFormStub.phoneNumber.errors" >Phone Number is required.</mat-error > <mat-icon matSuffix>phone</mat-icon> <mat-hint>Phone Number</mat-hint> </mat-form-field> <button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3" > SEARCH </button> </form> </mat-tab> <mat-tab label="Account Address"> <form [formGroup]="addressSearchForm" (ngSubmit)="onAddressSearch()"> <mat-form-field appearance="outline"> <mat-label> Search </mat-label> <input matInput type="text" placeholder="Search by account address" formControlName="address" [errorStateMatcher]="matcher" /> <mat-error *ngIf="addressSearchSubmitted && addressSearchFormStub.address.errors" >Account Address is required.</mat-error > <mat-icon matSuffix>view_in_ar</mat-icon> <mat-hint>Account Address</mat-hint> </mat-form-field> <button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3" > SEARCH </button> </form> </mat-tab> </mat-tab-group> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'AccountSearchComponent'};

View File

@ -992,63 +992,99 @@ export class AccountsComponent implements OnInit {
&lt;/ol&gt;
&lt;/nav&gt;
&lt;div class&#x3D;&quot;card&quot;&gt;
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt;
Accounts
&lt;/mat-card-title&gt;
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt; Accounts &lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;div class&#x3D;&quot;row card-header&quot;&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt; ACCOUNT TYPE &lt;/mat-label&gt;
&lt;mat-select id&#x3D;&quot;typeSelect&quot; [(value)]&#x3D;&quot;accountsType&quot; (selectionChange)&#x3D;&quot;filterAccounts()&quot;&gt;
&lt;mat-select
id&#x3D;&quot;typeSelect&quot;
[(value)]&#x3D;&quot;accountsType&quot;
(selectionChange)&#x3D;&quot;filterAccounts()&quot;
&gt;
&lt;mat-option value&#x3D;&quot;all&quot;&gt;ALL&lt;/mat-option&gt;
&lt;mat-option *ngFor&#x3D;&quot;let accountType of accountTypes&quot; [value]&#x3D;&quot;accountType&quot;&gt;
{{accountType | uppercase}}
{{ accountType | uppercase }}
&lt;/mat-option&gt;
&lt;/mat-select&gt;
&lt;/mat-form-field&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;button&quot; class&#x3D;&quot;btn btn-outline-primary ml-auto mr-2&quot; routerLink&#x3D;&quot;/accounts/search&quot;&gt; SEARCH &lt;/button&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;button&quot; class&#x3D;&quot;btn btn-outline-primary mr-2&quot; (click)&#x3D;&quot;downloadCsv()&quot;&gt; EXPORT &lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;button&quot;
class&#x3D;&quot;btn btn-outline-primary ml-auto mr-2&quot;
routerLink&#x3D;&quot;/accounts/search&quot;
&gt;
SEARCH
&lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;button&quot;
class&#x3D;&quot;btn btn-outline-primary mr-2&quot;
(click)&#x3D;&quot;downloadCsv()&quot;
&gt;
EXPORT
&lt;/button&gt;
&lt;/div&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt; Filter &lt;/mat-label&gt;
&lt;input matInput type&#x3D;&quot;text&quot; (keyup)&#x3D;&quot;doFilter($event.target.value)&quot; placeholder&#x3D;&quot;Filter&quot;&gt;
&lt;input
matInput
type&#x3D;&quot;text&quot;
(keyup)&#x3D;&quot;doFilter($event.target.value)&quot;
placeholder&#x3D;&quot;Filter&quot;
/&gt;
&lt;mat-icon matSuffix&gt;search&lt;/mat-icon&gt;
&lt;/mat-form-field&gt;
&lt;mat-table class&#x3D;&quot;mat-elevation-z10&quot; [dataSource]&#x3D;&quot;dataSource&quot; matSort matSortActive&#x3D;&quot;created&quot;
matSortDirection&#x3D;&quot;desc&quot; matSortDisableClear&gt;
&lt;mat-table
class&#x3D;&quot;mat-elevation-z10&quot;
[dataSource]&#x3D;&quot;dataSource&quot;
matSort
matSortActive&#x3D;&quot;created&quot;
matSortDirection&#x3D;&quot;desc&quot;
matSortDisableClear
&gt;
&lt;ng-container matColumnDef&#x3D;&quot;name&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; NAME &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user?.vcard.fn[0].value}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user?.vcard.fn[0].value }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;phone&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; PHONE NUMBER &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user?.vcard.tel[0].value}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user?.vcard.tel[0].value }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;created&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; CREATED &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user?.date_registered | unixDate}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user?.date_registered | unixDate }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;balance&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; BALANCE &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user?.balance | tokenRatio}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user?.balance | tokenRatio }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;location&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; LOCATION &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user?.location.area_name}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user?.location.area_name }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;mat-header-row *matHeaderRowDef&#x3D;&quot;displayedColumns&quot;&gt;&lt;/mat-header-row&gt;
&lt;mat-row *matRowDef&#x3D;&quot;let account; columns: displayedColumns&quot; (click)&#x3D;&quot;viewAccount(account)&quot; matRipple&gt;&lt;/mat-row&gt;
&lt;mat-row
*matRowDef&#x3D;&quot;let account; columns: displayedColumns&quot;
(click)&#x3D;&quot;viewAccount(account)&quot;
matRipple
&gt;&lt;/mat-row&gt;
&lt;/mat-table&gt;
&lt;mat-paginator [pageSize]&#x3D;&quot;defaultPageSize&quot; [pageSizeOptions]&#x3D;&quot;pageSizeOptions&quot; showFirstLastButtons&gt;&lt;/mat-paginator&gt;
&lt;mat-paginator
[pageSize]&#x3D;&quot;defaultPageSize&quot;
[pageSizeOptions]&#x3D;&quot;pageSizeOptions&quot;
showFirstLastButtons
&gt;&lt;/mat-paginator&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
@ -1093,7 +1129,7 @@ export class AccountsComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Accounts</li> </ol> </nav> <div class="card"> <mat-card-title class="card-header"> Accounts </mat-card-title> <div class="card-body"> <div class="row card-header"> <mat-form-field appearance="outline"> <mat-label> ACCOUNT TYPE </mat-label> <mat-select id="typeSelect" [(value)]="accountsType" (selectionChange)="filterAccounts()"> <mat-option value="all">ALL</mat-option> <mat-option *ngFor="let accountType of accountTypes" [value]="accountType"> {{accountType | uppercase}} </mat-option> </mat-select> </mat-form-field> <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" routerLink="/accounts/search"> SEARCH </button> <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary mr-2" (click)="downloadCsv()"> EXPORT </button> </div> <mat-form-field appearance="outline"> <mat-label> Filter </mat-label> <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter"> <mat-icon matSuffix>search</mat-icon> </mat-form-field> <mat-table class="mat-elevation-z10" [dataSource]="dataSource" matSort matSortActive="created" matSortDirection="desc" matSortDisableClear> <ng-container matColumnDef="name"> <mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell> <mat-cell *matCellDef="let user"> {{user?.vcard.fn[0].value}} </mat-cell> </ng-container> <ng-container matColumnDef="phone"> <mat-header-cell *matHeaderCellDef mat-sort-header> PHONE NUMBER </mat-header-cell> <mat-cell *matCellDef="let user"> {{user?.vcard.tel[0].value}} </mat-cell> </ng-container> <ng-container matColumnDef="created"> <mat-header-cell *matHeaderCellDef mat-sort-header> CREATED </mat-header-cell> <mat-cell *matCellDef="let user"> {{user?.date_registered | unixDate}} </mat-cell> </ng-container> <ng-container matColumnDef="balance"> <mat-header-cell *matHeaderCellDef mat-sort-header> BALANCE </mat-header-cell> <mat-cell *matCellDef="let user"> {{user?.balance | tokenRatio}} </mat-cell> </ng-container> <ng-container matColumnDef="location"> <mat-header-cell *matHeaderCellDef mat-sort-header> LOCATION </mat-header-cell> <mat-cell *matCellDef="let user"> {{user?.location.area_name}} </mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> <mat-row *matRowDef="let account; columns: displayedColumns" (click)="viewAccount(account)" matRipple></mat-row> </mat-table> <mat-paginator [pageSize]="defaultPageSize" [pageSizeOptions]="pageSizeOptions" showFirstLastButtons></mat-paginator> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Accounts</li> </ol> </nav> <div class="card"> <mat-card-title class="card-header"> Accounts </mat-card-title> <div class="card-body"> <div class="row card-header"> <mat-form-field appearance="outline"> <mat-label> ACCOUNT TYPE </mat-label> <mat-select id="typeSelect" [(value)]="accountsType" (selectionChange)="filterAccounts()" > <mat-option value="all">ALL</mat-option> <mat-option *ngFor="let accountType of accountTypes" [value]="accountType"> {{ accountType | uppercase }} </mat-option> </mat-select> </mat-form-field> <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" routerLink="/accounts/search" > SEARCH </button> <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary mr-2" (click)="downloadCsv()" > EXPORT </button> </div> <mat-form-field appearance="outline"> <mat-label> Filter </mat-label> <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter" /> <mat-icon matSuffix>search</mat-icon> </mat-form-field> <mat-table class="mat-elevation-z10" [dataSource]="dataSource" matSort matSortActive="created" matSortDirection="desc" matSortDisableClear > <ng-container matColumnDef="name"> <mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user?.vcard.fn[0].value }} </mat-cell> </ng-container> <ng-container matColumnDef="phone"> <mat-header-cell *matHeaderCellDef mat-sort-header> PHONE NUMBER </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user?.vcard.tel[0].value }} </mat-cell> </ng-container> <ng-container matColumnDef="created"> <mat-header-cell *matHeaderCellDef mat-sort-header> CREATED </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user?.date_registered | unixDate }} </mat-cell> </ng-container> <ng-container matColumnDef="balance"> <mat-header-cell *matHeaderCellDef mat-sort-header> BALANCE </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user?.balance | tokenRatio }} </mat-cell> </ng-container> <ng-container matColumnDef="location"> <mat-header-cell *matHeaderCellDef mat-sort-header> LOCATION </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user?.location.area_name }} </mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> <mat-row *matRowDef="let account; columns: displayedColumns" (click)="viewAccount(account)" matRipple ></mat-row> </mat-table> <mat-paginator [pageSize]="defaultPageSize" [pageSizeOptions]="pageSizeOptions" showFirstLastButtons ></mat-paginator> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'AccountsComponent'};

File diff suppressed because one or more lines are too long

View File

@ -784,20 +784,25 @@ export class AuthComponent implements OnInit {
&lt;h1 class&#x3D;&quot;text-white&quot;&gt;CICADA&lt;/h1&gt;
&lt;/a&gt;
&lt;/mat-card-title&gt;
&lt;div id&#x3D;&quot;one&quot; style&#x3D;&quot;display: block&quot; class&#x3D;&quot;card-body p-4&quot;&gt;
&lt;div id&#x3D;&quot;one&quot; style&#x3D;&quot;display: block&quot; class&#x3D;&quot;card-body p-4&quot;&gt;
&lt;div class&#x3D;&quot;text-center w-75 m-auto&quot;&gt;
&lt;h4 class&#x3D;&quot;text-dark-50 text-center font-weight-bold&quot;&gt;Add Private Key&lt;/h4&gt;
&lt;/div&gt;
&lt;form [formGroup]&#x3D;&quot;keyForm&quot; (ngSubmit)&#x3D;&quot;onSubmit()&quot;&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot; class&#x3D;&quot;full-width&quot;&gt;
&lt;mat-label&gt;Private Key&lt;/mat-label&gt;
&lt;textarea matInput style&#x3D;&quot;height: 30rem&quot; formControlName&#x3D;&quot;key&quot; placeholder&#x3D;&quot;Enter your private key...&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;&gt;&lt;/textarea&gt;
&lt;textarea
matInput
style&#x3D;&quot;height: 30rem&quot;
formControlName&#x3D;&quot;key&quot;
placeholder&#x3D;&quot;Enter your private key...&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;
&gt;&lt;/textarea&gt;
&lt;div *ngIf&#x3D;&quot;submitted &amp;&amp; keyFormStub.key.errors&quot; class&#x3D;&quot;invalid-feedback&quot;&gt;
&lt;mat-error *ngIf&#x3D;&quot;keyFormStub.key.errors.required&quot;&gt;Private Key is required.&lt;/mat-error&gt;
&lt;mat-error *ngIf&#x3D;&quot;keyFormStub.key.errors.required&quot;
&gt;Private Key is required.&lt;/mat-error
&gt;
&lt;/div&gt;
&lt;/mat-form-field&gt;
@ -805,20 +810,24 @@ export class AuthComponent implements OnInit {
&lt;span *ngIf&#x3D;&quot;loading&quot; class&#x3D;&quot;spinner-border spinner-border-sm mr-1&quot;&gt;&lt;/span&gt;
Add Key
&lt;/button&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;div id&#x3D;&quot;two&quot; style&#x3D;&quot;display: none&quot; class&#x3D;&quot;card-body p-4 align-items-center&quot;&gt;
&lt;div id&#x3D;&quot;two&quot; style&#x3D;&quot;display: none&quot; class&#x3D;&quot;card-body p-4 align-items-center&quot;&gt;
&lt;div class&#x3D;&quot;text-center w-75 m-auto&quot;&gt;
&lt;h4 id&#x3D;&quot;state&quot; class&#x3D;&quot;text-dark-50 text-center font-weight-bold&quot;&gt;&lt;/h4&gt;
&lt;button mat-raised-button matRipple color&#x3D;&quot;primary&quot; type&#x3D;&quot;submit&quot; (click)&#x3D;&quot;login()&quot;&gt; Login &lt;/button&gt;
&lt;button mat-raised-button matRipple color&#x3D;&quot;primary&quot; type&#x3D;&quot;submit&quot; (click)&#x3D;&quot;login()&quot;&gt;
Login
&lt;/button&gt;
&lt;/div&gt;
&lt;div class&#x3D;&quot;row mt-3&quot;&gt;
&lt;div class&#x3D;&quot;col-12 text-center&quot;&gt;
&lt;p class&#x3D;&quot;text-muted&quot;&gt;Change private key? &lt;a (click)&#x3D;&quot;switchWindows()&quot; class&#x3D;&quot;text-muted ml-1&quot;&gt;&lt;b&gt;Enter private key&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt; &lt;!-- end col--&gt;
&lt;p class&#x3D;&quot;text-muted&quot;&gt;
Change private key?
&lt;a (click)&#x3D;&quot;switchWindows()&quot; class&#x3D;&quot;text-muted ml-1&quot;&gt;&lt;b&gt;Enter private key&lt;/b&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;!-- end col--&gt;
&lt;/div&gt;
&lt;!-- end row --&gt;
&lt;/div&gt;
@ -861,7 +870,7 @@ export class AuthComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><app-network-status></app-network-status><div class="container"> <div class="row justify-content-center mt-5 mb-5"> <div class="col-lg-6 col-md-8 col-sm-10"> <div class="card"> <mat-card-title class="card-header pt-4 pb-4 text-center background-dark"> <a routerLink="/"> <h1 class="text-white">CICADA</h1> </a> </mat-card-title> <div id="one" style="display: block" class="card-body p-4"> <div class="text-center w-75 m-auto"> <h4 class="text-dark-50 text-center font-weight-bold">Add Private Key</h4> </div> <form [formGroup]="keyForm" (ngSubmit)="onSubmit()"> <mat-form-field appearance="outline" class="full-width"> <mat-label>Private Key</mat-label> <textarea matInput style="height: 30rem" formControlName="key" placeholder="Enter your private key..." [errorStateMatcher]="matcher"></textarea> <div *ngIf="submitted && keyFormStub.key.errors" class="invalid-feedback"> <mat-error *ngIf="keyFormStub.key.errors.required">Private Key is required.</mat-error> </div> </mat-form-field> <button mat-raised-button matRipple color="primary" type="submit" [disabled]="loading"> <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span> Add Key </button> </form> </div> <div id="two" style="display: none" class="card-body p-4 align-items-center"> <div class="text-center w-75 m-auto"> <h4 id="state" class="text-dark-50 text-center font-weight-bold"></h4> <button mat-raised-button matRipple color="primary" type="submit" (click)="login()"> Login </button> </div> <div class="row mt-3"> <div class="col-12 text-center"> <p class="text-muted">Change private key? <a (click)="switchWindows()" class="text-muted ml-1"><b>Enter private key</b></a></p> </div> <!-- end col--> </div> <!-- end row --> </div> </div> </div> </div></div></div>'
var COMPONENT_TEMPLATE = '<div><app-network-status></app-network-status><div class="container"> <div class="row justify-content-center mt-5 mb-5"> <div class="col-lg-6 col-md-8 col-sm-10"> <div class="card"> <mat-card-title class="card-header pt-4 pb-4 text-center background-dark"> <a routerLink="/"> <h1 class="text-white">CICADA</h1> </a> </mat-card-title> <div id="one" style="display: block" class="card-body p-4"> <div class="text-center w-75 m-auto"> <h4 class="text-dark-50 text-center font-weight-bold">Add Private Key</h4> </div> <form [formGroup]="keyForm" (ngSubmit)="onSubmit()"> <mat-form-field appearance="outline" class="full-width"> <mat-label>Private Key</mat-label> <textarea matInput style="height: 30rem" formControlName="key" placeholder="Enter your private key..." [errorStateMatcher]="matcher" ></textarea> <div *ngIf="submitted && keyFormStub.key.errors" class="invalid-feedback"> <mat-error *ngIf="keyFormStub.key.errors.required" >Private Key is required.</mat-error > </div> </mat-form-field> <button mat-raised-button matRipple color="primary" type="submit" [disabled]="loading"> <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span> Add Key </button> </form> </div> <div id="two" style="display: none" class="card-body p-4 align-items-center"> <div class="text-center w-75 m-auto"> <h4 id="state" class="text-dark-50 text-center font-weight-bold"></h4> <button mat-raised-button matRipple color="primary" type="submit" (click)="login()"> Login </button> </div> <div class="row mt-3"> <div class="col-12 text-center"> <p class="text-muted"> Change private key? <a (click)="switchWindows()" class="text-muted ml-1"><b>Enter private key</b></a> </p> </div> <!-- end col--> </div> <!-- end row --> </div> </div> </div> </div></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'AuthComponent'};

File diff suppressed because one or more lines are too long

View File

@ -264,12 +264,8 @@ export class ErrorDialogComponent {
<div class="tab-pane fade " id="c-templateData">
<pre class="line-numbers"><code class="language-html">&lt;div&gt;
&lt;div&gt;
&lt;p&gt;
Message: {{ data.message }}
&lt;/p&gt;
&lt;p *ngIf&#x3D;&quot;data.status&quot;&gt;
Status: {{ data?.status }}
&lt;/p&gt;
&lt;p&gt;Message: {{ data.message }}&lt;/p&gt;
&lt;p *ngIf&#x3D;&quot;data.status&quot;&gt;Status: {{ data?.status }}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</code></pre>
@ -307,7 +303,7 @@ export class ErrorDialogComponent {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><div> <div> <p> Message: {{ data.message }} </p> <p *ngIf="data.status"> Status: {{ data?.status }} </p> </div></div></div>'
var COMPONENT_TEMPLATE = '<div><div> <div> <p>Message: {{ data.message }}</p> <p *ngIf="data.status">Status: {{ data?.status }}</p> </div></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'ErrorDialogComponent'};

View File

@ -288,10 +288,12 @@ export class FooterComponent implements OnInit {
<div class="tab-pane fade " id="c-templateData">
<pre class="line-numbers"><code class="language-html">&lt;!-- Footer Start --&gt;
&lt;footer class&#x3D;&quot;footer&quot;&gt;
&lt;a target&#x3D;&quot;blank&quot; title&#x3D;&quot;GPL-3&quot; href&#x3D;&quot;https://www.gnu.org/licenses/gpl-3.0.en.html&quot;&gt; Copyleft &lt;/a&gt; 🄯.
&lt;a target&#x3D;&quot;blank&quot; title&#x3D;&quot;GPL-3&quot; href&#x3D;&quot;https://www.gnu.org/licenses/gpl-3.0.en.html&quot;&gt; Copyleft &lt;/a&gt;
🄯.
{{ currentYear }}
&lt;a target&#x3D;&quot;blank&quot; title&#x3D;&quot;Gitlab@GrassrootsEconomics&quot; href&#x3D;&quot;https://gitlab.com/grassrootseconomics&quot;&gt;&lt;u&gt; Grassroots Economics &lt;/u&gt;&lt;/a&gt;
&lt;a target&#x3D;&quot;blank&quot; title&#x3D;&quot;Gitlab@GrassrootsEconomics&quot; href&#x3D;&quot;https://gitlab.com/grassrootseconomics&quot;
&gt;&lt;u&gt; Grassroots Economics &lt;/u&gt;&lt;/a
&gt;
&lt;/footer&gt;
&lt;!-- end Footer --&gt;
</code></pre>
@ -329,7 +331,7 @@ export class FooterComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Footer Start --><footer class="footer"> <a target="blank" title="GPL-3" href="https://www.gnu.org/licenses/gpl-3.0.en.html"> Copyleft </a> 🄯. {{ currentYear }} <a target="blank" title="Gitlab@GrassrootsEconomics" href="https://gitlab.com/grassrootseconomics"><u> Grassroots Economics </u></a></footer><!-- end Footer --></div>'
var COMPONENT_TEMPLATE = '<div><!-- Footer Start --><footer class="footer"> <a target="blank" title="GPL-3" href="https://www.gnu.org/licenses/gpl-3.0.en.html"> Copyleft </a> 🄯. {{ currentYear }} <a target="blank" title="Gitlab@GrassrootsEconomics" href="https://gitlab.com/grassrootseconomics" ><u> Grassroots Economics </u></a ></footer><!-- end Footer --></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'FooterComponent'};

View File

@ -109,15 +109,15 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {Component} from &#x27;@angular/core&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Component } from &#x27;@angular/core&#x27;;
@Component({selector: &#x27;app-sidebar&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-sidebar&#x27;, template: &#x27;&#x27; })
export class SidebarStubComponent {}
@Component({selector: &#x27;app-topbar&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-topbar&#x27;, template: &#x27;&#x27; })
export class TopbarStubComponent {}
@Component({selector: &#x27;app-footer&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-footer&#x27;, template: &#x27;&#x27; })
export class FooterStubComponent {}
</code></pre>
</div>

View File

@ -379,14 +379,14 @@ export class NetworkStatusComponent implements OnInit {
<div class="tab-pane fade " id="c-templateData">
<pre class="line-numbers"><code class="language-html">&lt;nav class&#x3D;&quot;navbar navbar-dark background-dark&quot;&gt;
&lt;h1 class&#x3D;&quot;navbar-brand&quot;&gt;
&lt;div *ngIf&#x3D;&quot;noInternetConnection; then offlineBlock else onlineBlock&quot;&gt;&lt;/div&gt;
&lt;div *ngIf&#x3D;&quot;noInternetConnection; then offlineBlock; else onlineBlock&quot;&gt;&lt;/div&gt;
&lt;ng-template #offlineBlock&gt;
&lt;strong style&#x3D;&quot;color: red;&quot;&gt;OFFLINE &lt;/strong&gt;
&lt;img width&#x3D;&quot;20rem&quot; src&#x3D;&quot;assets/images/no-wifi.svg&quot; alt&#x3D;&quot;Internet Disconnected&quot;&gt;
&lt;strong style&#x3D;&quot;color: red&quot;&gt;OFFLINE &lt;/strong&gt;
&lt;img width&#x3D;&quot;20rem&quot; src&#x3D;&quot;assets/images/no-wifi.svg&quot; alt&#x3D;&quot;Internet Disconnected&quot; /&gt;
&lt;/ng-template&gt;
&lt;ng-template #onlineBlock&gt;
&lt;strong style&#x3D;&quot;color: lawngreen;&quot;&gt;ONLINE &lt;/strong&gt;
&lt;img width&#x3D;&quot;20rem&quot; src&#x3D;&quot;assets/images/wifi.svg&quot; alt&#x3D;&quot;Internet Connected&quot;&gt;
&lt;strong style&#x3D;&quot;color: lawngreen&quot;&gt;ONLINE &lt;/strong&gt;
&lt;img width&#x3D;&quot;20rem&quot; src&#x3D;&quot;assets/images/wifi.svg&quot; alt&#x3D;&quot;Internet Connected&quot; /&gt;
&lt;/ng-template&gt;
&lt;/h1&gt;
&lt;/nav&gt;
@ -425,7 +425,7 @@ export class NetworkStatusComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><nav class="navbar navbar-dark background-dark"> <h1 class="navbar-brand"> <div *ngIf="noInternetConnection; then offlineBlock else onlineBlock"></div> <ng-template #offlineBlock> <strong style="color: red;">OFFLINE </strong> <img width="20rem" src="assets/images/no-wifi.svg" alt="Internet Disconnected"> </ng-template> <ng-template #onlineBlock> <strong style="color: lawngreen;">ONLINE </strong> <img width="20rem" src="assets/images/wifi.svg" alt="Internet Connected"> </ng-template> </h1></nav></div>'
var COMPONENT_TEMPLATE = '<div><nav class="navbar navbar-dark background-dark"> <h1 class="navbar-brand"> <div *ngIf="noInternetConnection; then offlineBlock; else onlineBlock"></div> <ng-template #offlineBlock> <strong style="color: red">OFFLINE </strong> <img width="20rem" src="assets/images/no-wifi.svg" alt="Internet Disconnected" /> </ng-template> <ng-template #onlineBlock> <strong style="color: lawngreen">ONLINE </strong> <img width="20rem" src="assets/images/wifi.svg" alt="Internet Connected" /> </ng-template> </h1></nav></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'NetworkStatusComponent'};

View File

@ -521,19 +521,31 @@ export class OrganizationComponent implements OnInit {
&lt;form [formGroup]&#x3D;&quot;organizationForm&quot; (ngSubmit)&#x3D;&quot;onSubmit()&quot;&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt;Default Disbursement *&lt;/mat-label&gt;
&lt;input matInput type&#x3D;&quot;text&quot; id&#x3D;&quot;amount&quot; placeholder&#x3D;&quot;Amount&quot; formControlName&#x3D;&quot;disbursement&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;&gt;
&lt;input
matInput
type&#x3D;&quot;text&quot;
id&#x3D;&quot;amount&quot;
placeholder&#x3D;&quot;Amount&quot;
formControlName&#x3D;&quot;disbursement&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;
/&gt;
&lt;span matSuffix&gt;RCU&lt;/span&gt;
&lt;mat-error *ngIf&#x3D;&quot;submitted &amp;&amp; organizationFormStub.disbursement.errors&quot;&gt;
Default Disbursement is required.
&lt;/mat-error&gt;
&lt;/mat-form-field&gt;
&lt;div class&#x3D;&quot;form-group form-check&quot;&gt;
&lt;mat-checkbox id&#x3D;&quot;transferCard&quot; formControlName&#x3D;&quot;transfer&quot;&gt;Require Transfer Card *&lt;/mat-checkbox&gt;
&lt;mat-checkbox id&#x3D;&quot;transferCard&quot; formControlName&#x3D;&quot;transfer&quot;
&gt;Require Transfer Card *&lt;/mat-checkbox
&gt;
&lt;/div&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt;Default Country Code *&lt;/mat-label&gt;
&lt;mat-select id&#x3D;&quot;countryCode&quot; formControlName&#x3D;&quot;countryCode&quot; [errorStateMatcher]&#x3D;&quot;matcher&quot;&gt;
&lt;mat-select
id&#x3D;&quot;countryCode&quot;
formControlName&#x3D;&quot;countryCode&quot;
[errorStateMatcher]&#x3D;&quot;matcher&quot;
&gt;
&lt;mat-option value&#x3D;&quot;KE&quot;&gt;KE Kenya&lt;/mat-option&gt;
&lt;mat-option value&#x3D;&quot;US&quot;&gt;US United States&lt;/mat-option&gt;
&lt;mat-option value&#x3D;&quot;ETH&quot;&gt;ETH Ethiopia&lt;/mat-option&gt;
@ -542,9 +554,11 @@ export class OrganizationComponent implements OnInit {
&lt;/mat-select&gt;
&lt;mat-error *ngIf&#x3D;&quot;submitted &amp;&amp; organizationFormStub.countryCode.errors&quot;&gt;
Country Code is required.
&lt;/mat-error&gt;
&lt;/mat-form-field&gt;&lt;br&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;submit&quot; class&#x3D;&quot;btn btn-primary&quot;&gt;Submit&lt;/button&gt;
&lt;/mat-error&gt; &lt;/mat-form-field
&gt;&lt;br /&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;submit&quot; class&#x3D;&quot;btn btn-primary&quot;&gt;
Submit
&lt;/button&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/div&gt;
@ -591,7 +605,7 @@ export class OrganizationComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item"><a routerLink="/settings">Settings</a></li> <li class="breadcrumb-item active" aria-current="page">Organization Settings</li> </ol> </nav> <div class="col-md-6 center-body"> <div class="card"> <mat-card-title class="card-header text-center"> DEFAULT ORGANISATION SETTINGS </mat-card-title> <div class="card-body"> <form [formGroup]="organizationForm" (ngSubmit)="onSubmit()"> <mat-form-field appearance="outline"> <mat-label>Default Disbursement *</mat-label> <input matInput type="text" id="amount" placeholder="Amount" formControlName="disbursement" [errorStateMatcher]="matcher"> <span matSuffix>RCU</span> <mat-error *ngIf="submitted && organizationFormStub.disbursement.errors"> Default Disbursement is required. </mat-error> </mat-form-field> <div class="form-group form-check"> <mat-checkbox id="transferCard" formControlName="transfer">Require Transfer Card *</mat-checkbox> </div> <mat-form-field appearance="outline"> <mat-label>Default Country Code *</mat-label> <mat-select id="countryCode" formControlName="countryCode" [errorStateMatcher]="matcher"> <mat-option value="KE">KE Kenya</mat-option> <mat-option value="US">US United States</mat-option> <mat-option value="ETH">ETH Ethiopia</mat-option> <mat-option value="GER">GER Germany</mat-option> <mat-option value="UG">UG Uganda</mat-option> </mat-select> <mat-error *ngIf="submitted && organizationFormStub.countryCode.errors"> Country Code is required. </mat-error> </mat-form-field><br> <button mat-raised-button color="primary" type="submit" class="btn btn-primary">Submit</button> </form> </div> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item"><a routerLink="/settings">Settings</a></li> <li class="breadcrumb-item active" aria-current="page">Organization Settings</li> </ol> </nav> <div class="col-md-6 center-body"> <div class="card"> <mat-card-title class="card-header text-center"> DEFAULT ORGANISATION SETTINGS </mat-card-title> <div class="card-body"> <form [formGroup]="organizationForm" (ngSubmit)="onSubmit()"> <mat-form-field appearance="outline"> <mat-label>Default Disbursement *</mat-label> <input matInput type="text" id="amount" placeholder="Amount" formControlName="disbursement" [errorStateMatcher]="matcher" /> <span matSuffix>RCU</span> <mat-error *ngIf="submitted && organizationFormStub.disbursement.errors"> Default Disbursement is required. </mat-error> </mat-form-field> <div class="form-group form-check"> <mat-checkbox id="transferCard" formControlName="transfer" >Require Transfer Card *</mat-checkbox > </div> <mat-form-field appearance="outline"> <mat-label>Default Country Code *</mat-label> <mat-select id="countryCode" formControlName="countryCode" [errorStateMatcher]="matcher" > <mat-option value="KE">KE Kenya</mat-option> <mat-option value="US">US United States</mat-option> <mat-option value="ETH">ETH Ethiopia</mat-option> <mat-option value="GER">GER Germany</mat-option> <mat-option value="UG">UG Uganda</mat-option> </mat-select> <mat-error *ngIf="submitted && organizationFormStub.countryCode.errors"> Country Code is required. </mat-error> </mat-form-field ><br /> <button mat-raised-button color="primary" type="submit" class="btn btn-primary"> Submit </button> </form> </div> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'OrganizationComponent'};

View File

@ -245,10 +245,16 @@ export class PagesComponent {
&lt;/ol&gt;
&lt;/nav&gt;
&lt;div class&#x3D;&quot;embed-responsive embed-responsive-16by9&quot;&gt;
&lt;iframe class&#x3D;&quot;embed-responsive-item&quot; [src]&#x3D;&quot;url | safe&quot; allow&#x3D;&quot;fullscreen&quot; loading&#x3D;&quot;lazy&quot;
title&#x3D;&quot;Community inclusion currencies dashboard&quot; referrerpolicy&#x3D;&quot;no-referrer&quot;&gt;
&lt;iframe
class&#x3D;&quot;embed-responsive-item&quot;
[src]&#x3D;&quot;url | safe&quot;
allow&#x3D;&quot;fullscreen&quot;
loading&#x3D;&quot;lazy&quot;
title&#x3D;&quot;Community inclusion currencies dashboard&quot;
referrerpolicy&#x3D;&quot;no-referrer&quot;
&gt;
&lt;p&gt;
&lt;a href&#x3D;&quot;{{url}}&quot;&gt; Your browser does not support iframes. &lt;/a&gt;
&lt;a href&#x3D;&quot;{{ url }}&quot;&gt; Your browser does not support iframes. &lt;/a&gt;
&lt;/p&gt;
&lt;/iframe&gt;
&lt;/div&gt;
@ -294,7 +300,7 @@ export class PagesComponent {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item active" aria-current="page">Home</li> </ol> </nav> <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" [src]="url | safe" allow="fullscreen" loading="lazy" title="Community inclusion currencies dashboard" referrerpolicy="no-referrer"> <p> <a href="{{url}}"> Your browser does not support iframes. </a> </p> </iframe> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item active" aria-current="page">Home</li> </ol> </nav> <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" [src]="url | safe" allow="fullscreen" loading="lazy" title="Community inclusion currencies dashboard" referrerpolicy="no-referrer" > <p> <a href="{{ url }}"> Your browser does not support iframes. </a> </p> </iframe> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'PagesComponent'};

View File

@ -736,16 +736,14 @@ export class SettingsComponent implements OnInit {
&lt;div class&#x3D;&quot;row&quot;&gt;
&lt;div class&#x3D;&quot;col-md-6 mb-2&quot;&gt;
&lt;div class&#x3D;&quot;card&quot;&gt;
&lt;mat-card-title class&#x3D;&quot;card-header text-center&quot;&gt;
SETTINGS
&lt;/mat-card-title&gt;
&lt;mat-card-title class&#x3D;&quot;card-header text-center&quot;&gt; SETTINGS &lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;h4&gt;CICADA Admin Credentials&lt;/h4&gt;
&lt;span&gt;&lt;strong&gt;UserId: &lt;/strong&gt; {{ userInfo?.userid }} &lt;/span&gt;&lt;br&gt;
&lt;span&gt;&lt;strong&gt;Username: &lt;/strong&gt; {{ userInfo?.name }} &lt;/span&gt;&lt;br&gt;
&lt;span&gt;&lt;strong&gt;UserId: &lt;/strong&gt; {{ userInfo?.userid }} &lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;strong&gt;Username: &lt;/strong&gt; {{ userInfo?.name }} &lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;strong&gt;Email: &lt;/strong&gt; {{ userInfo?.email }} &lt;/span&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;hr /&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;h4&gt;Organization Settings&lt;/h4&gt;
&lt;a routerLink&#x3D;&quot;/settings/organization&quot;&gt;&lt;i&gt;Update your organization settings&lt;/i&gt;&lt;/a&gt;
@ -754,21 +752,27 @@ export class SettingsComponent implements OnInit {
&lt;/div&gt;
&lt;div class&#x3D;&quot;col-md-6 mb-2&quot;&gt;
&lt;div class&#x3D;&quot;card&quot;&gt;
&lt;mat-card-title class&#x3D;&quot;card-header text-center&quot;&gt;
ACCOUNT MANAGEMENT
&lt;/mat-card-title&gt;
&lt;mat-card-title class&#x3D;&quot;card-header text-center&quot;&gt; ACCOUNT MANAGEMENT &lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;h4&gt;Change Password&lt;/h4&gt;
&lt;a routerLink&#x3D;&quot;/settings&quot;&gt;&lt;i&gt;Change your account password&lt;/i&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;hr /&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;h4&gt;Two-step authentication&lt;/h4&gt;
&lt;a routerLink&#x3D;&quot;/settings&quot;&gt;&lt;i&gt;Secure your account with two step verification&lt;/i&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;hr /&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;button&quot; class&#x3D;&quot;btn btn-outline-primary&quot; (click)&#x3D;&quot;logout()&quot;&gt; LOGOUT ADMIN &lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;button&quot;
class&#x3D;&quot;btn btn-outline-primary&quot;
(click)&#x3D;&quot;logout()&quot;
&gt;
LOGOUT ADMIN
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
@ -777,39 +781,60 @@ export class SettingsComponent implements OnInit {
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt;
&lt;div class&#x3D;&quot;row&quot;&gt;
TRUSTED USERS
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;button&quot; class&#x3D;&quot;btn btn-outline-primary ml-auto mr-2&quot; (click)&#x3D;&quot;downloadCsv()&quot;&gt; EXPORT &lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;button&quot;
class&#x3D;&quot;btn btn-outline-primary ml-auto mr-2&quot;
(click)&#x3D;&quot;downloadCsv()&quot;
&gt;
EXPORT
&lt;/button&gt;
&lt;/div&gt;
&lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt; Filter &lt;/mat-label&gt;
&lt;input matInput type&#x3D;&quot;text&quot; (keyup)&#x3D;&quot;doFilter($event.target.value)&quot; placeholder&#x3D;&quot;Filter&quot;&gt;
&lt;input
matInput
type&#x3D;&quot;text&quot;
(keyup)&#x3D;&quot;doFilter($event.target.value)&quot;
placeholder&#x3D;&quot;Filter&quot;
/&gt;
&lt;mat-icon matSuffix&gt;search&lt;/mat-icon&gt;
&lt;/mat-form-field&gt;
&lt;mat-table class&#x3D;&quot;mat-elevation-z10&quot; [dataSource]&#x3D;&quot;dataSource&quot; matSort matSortActive&#x3D;&quot;name&quot;
matSortDirection&#x3D;&quot;asc&quot; matSortDisableClear&gt;
&lt;mat-table
class&#x3D;&quot;mat-elevation-z10&quot;
[dataSource]&#x3D;&quot;dataSource&quot;
matSort
matSortActive&#x3D;&quot;name&quot;
matSortDirection&#x3D;&quot;asc&quot;
matSortDisableClear
&gt;
&lt;ng-container matColumnDef&#x3D;&quot;name&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; NAME &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user.name}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user.name }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;email&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; EMAIL &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user.email}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user.email }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;userId&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; USER ID &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{user.userid}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let user&quot;&gt; {{ user.userid }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;mat-header-row *matHeaderRowDef&#x3D;&quot;displayedColumns&quot;&gt;&lt;/mat-header-row&gt;
&lt;mat-row *matRowDef&#x3D;&quot;let user; columns: displayedColumns&quot;&gt;&lt;/mat-row&gt;
&lt;/mat-table&gt;
&lt;mat-paginator [pageSize]&#x3D;&quot;5&quot; [pageSizeOptions]&#x3D;&quot;[5, 10, 20, 50, 100]&quot; showFirstLastButtons&gt;&lt;/mat-paginator&gt;
&lt;mat-paginator
[pageSize]&#x3D;&quot;5&quot;
[pageSizeOptions]&#x3D;&quot;[5, 10, 20, 50, 100]&quot;
showFirstLastButtons
&gt;&lt;/mat-paginator&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
@ -856,7 +881,7 @@ export class SettingsComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Settings</li> </ol> </nav> <div class="row"> <div class="col-md-6 mb-2"> <div class="card"> <mat-card-title class="card-header text-center"> SETTINGS </mat-card-title> <div class="card-body"> <h4>CICADA Admin Credentials</h4> <span><strong>UserId: </strong> {{ userInfo?.userid }} </span><br> <span><strong>Username: </strong> {{ userInfo?.name }} </span><br> <span><strong>Email: </strong> {{ userInfo?.email }} </span> </div> <hr> <div class="card-body"> <h4>Organization Settings</h4> <a routerLink="/settings/organization"><i>Update your organization settings</i></a> </div> </div> </div> <div class="col-md-6 mb-2"> <div class="card"> <mat-card-title class="card-header text-center"> ACCOUNT MANAGEMENT </mat-card-title> <div class="card-body"> <h4>Change Password</h4> <a routerLink="/settings"><i>Change your account password</i></a> </div> <hr> <div class="card-body"> <h4>Two-step authentication</h4> <a routerLink="/settings"><i>Secure your account with two step verification</i></a> </div> <hr> <div class="card-body"> <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary" (click)="logout()"> LOGOUT ADMIN </button> </div> </div> </div> <div class="col-12"> <div class="card mb-3"> <mat-card-title class="card-header"> <div class="row"> TRUSTED USERS <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()"> EXPORT </button> </div> </mat-card-title> <div class="card-body"> <mat-form-field appearance="outline"> <mat-label> Filter </mat-label> <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter"> <mat-icon matSuffix>search</mat-icon> </mat-form-field> <mat-table class="mat-elevation-z10" [dataSource]="dataSource" matSort matSortActive="name" matSortDirection="asc" matSortDisableClear> <ng-container matColumnDef="name"> <mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell> <mat-cell *matCellDef="let user"> {{user.name}} </mat-cell> </ng-container> <ng-container matColumnDef="email"> <mat-header-cell *matHeaderCellDef mat-sort-header> EMAIL </mat-header-cell> <mat-cell *matCellDef="let user"> {{user.email}} </mat-cell> </ng-container> <ng-container matColumnDef="userId"> <mat-header-cell *matHeaderCellDef mat-sort-header> USER ID </mat-header-cell> <mat-cell *matCellDef="let user"> {{user.userid}} </mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> <mat-row *matRowDef="let user; columns: displayedColumns"></mat-row> </mat-table> <mat-paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 20, 50, 100]" showFirstLastButtons></mat-paginator> </div> </div> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Settings</li> </ol> </nav> <div class="row"> <div class="col-md-6 mb-2"> <div class="card"> <mat-card-title class="card-header text-center"> SETTINGS </mat-card-title> <div class="card-body"> <h4>CICADA Admin Credentials</h4> <span><strong>UserId: </strong> {{ userInfo?.userid }} </span><br /> <span><strong>Username: </strong> {{ userInfo?.name }} </span><br /> <span><strong>Email: </strong> {{ userInfo?.email }} </span> </div> <hr /> <div class="card-body"> <h4>Organization Settings</h4> <a routerLink="/settings/organization"><i>Update your organization settings</i></a> </div> </div> </div> <div class="col-md-6 mb-2"> <div class="card"> <mat-card-title class="card-header text-center"> ACCOUNT MANAGEMENT </mat-card-title> <div class="card-body"> <h4>Change Password</h4> <a routerLink="/settings"><i>Change your account password</i></a> </div> <hr /> <div class="card-body"> <h4>Two-step authentication</h4> <a routerLink="/settings"><i>Secure your account with two step verification</i></a> </div> <hr /> <div class="card-body"> <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary" (click)="logout()" > LOGOUT ADMIN </button> </div> </div> </div> <div class="col-12"> <div class="card mb-3"> <mat-card-title class="card-header"> <div class="row"> TRUSTED USERS <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()" > EXPORT </button> </div> </mat-card-title> <div class="card-body"> <mat-form-field appearance="outline"> <mat-label> Filter </mat-label> <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter" /> <mat-icon matSuffix>search</mat-icon> </mat-form-field> <mat-table class="mat-elevation-z10" [dataSource]="dataSource" matSort matSortActive="name" matSortDirection="asc" matSortDisableClear > <ng-container matColumnDef="name"> <mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user.name }} </mat-cell> </ng-container> <ng-container matColumnDef="email"> <mat-header-cell *matHeaderCellDef mat-sort-header> EMAIL </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user.email }} </mat-cell> </ng-container> <ng-container matColumnDef="userId"> <mat-header-cell *matHeaderCellDef mat-sort-header> USER ID </mat-header-cell> <mat-cell *matCellDef="let user"> {{ user.userid }} </mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> <mat-row *matRowDef="let user; columns: displayedColumns"></mat-row> </mat-table> <mat-paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 20, 50, 100]" showFirstLastButtons ></mat-paginator> </div> </div> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'SettingsComponent'};

View File

@ -243,10 +243,9 @@ export class SidebarComponent implements OnInit {
&lt;div id&#x3D;&quot;sidebar&quot;&gt;
&lt;app-network-status&gt;&lt;/app-network-status&gt;
&lt;nav&gt;
&lt;div class&#x3D;&quot;sidebar-header&quot;&gt;
&lt;h3&gt;
&lt;img class&#x3D;&quot;full-width&quot; src&#x3D;&quot;assets/images/CIC-Logo-white.png&quot; alt&#x3D;&quot;CIC Admin Dashboard&quot;&gt;
&lt;img class&#x3D;&quot;full-width&quot; src&#x3D;&quot;assets/images/CIC-Logo-white.png&quot; alt&#x3D;&quot;CIC Admin Dashboard&quot; /&gt;
&lt;/h3&gt;
&lt;strong&gt;CICADA&lt;/strong&gt;
&lt;/div&gt;
@ -327,7 +326,7 @@ export class SidebarComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- ========== Left Sidebar Start ========== --><div id="sidebar"> <app-network-status></app-network-status> <nav> <div class="sidebar-header"> <h3> <img class="full-width" src="assets/images/CIC-Logo-white.png" alt="CIC Admin Dashboard"> </h3> <strong>CICADA</strong> </div> <ul class="list-unstyled components"> <li> <a routerLink="/home" routerLinkActive="active" appMenuSelection> <i class="fa fa-home"></i> <span> Dashboard </span> </a> </li> <li> <a routerLink="/accounts" routerLinkActive="active" appMenuSelection> <i class="fa fa-users"></i> <span> Accounts </span> </a> </li> <li> <a routerLink="/tx" routerLinkActive="active" appMenuSelection> <i class="fa fa-exchange"></i> <span> Transactions </span> </a> </li> <li> <a routerLink="/tokens" routerLinkActive="active" appMenuSelection> <i class="fa fa-money"></i> <span> Tokens </span> </a> </li> <li> <a routerLink="/settings" routerLinkActive="active" appMenuSelection> <i class="fa fa-cog"></i> <span> Settings </span> </a> </li> <li> <a routerLink="/admin" routerLinkActive="active" appMenuSelection> <i class="fa fa-user-secret"></i> <span> Admin </span> </a> </li> </ul> </nav></div><!-- Left Sidebar End --></div>'
var COMPONENT_TEMPLATE = '<div><!-- ========== Left Sidebar Start ========== --><div id="sidebar"> <app-network-status></app-network-status> <nav> <div class="sidebar-header"> <h3> <img class="full-width" src="assets/images/CIC-Logo-white.png" alt="CIC Admin Dashboard" /> </h3> <strong>CICADA</strong> </div> <ul class="list-unstyled components"> <li> <a routerLink="/home" routerLinkActive="active" appMenuSelection> <i class="fa fa-home"></i> <span> Dashboard </span> </a> </li> <li> <a routerLink="/accounts" routerLinkActive="active" appMenuSelection> <i class="fa fa-users"></i> <span> Accounts </span> </a> </li> <li> <a routerLink="/tx" routerLinkActive="active" appMenuSelection> <i class="fa fa-exchange"></i> <span> Transactions </span> </a> </li> <li> <a routerLink="/tokens" routerLinkActive="active" appMenuSelection> <i class="fa fa-money"></i> <span> Tokens </span> </a> </li> <li> <a routerLink="/settings" routerLinkActive="active" appMenuSelection> <i class="fa fa-cog"></i> <span> Settings </span> </a> </li> <li> <a routerLink="/admin" routerLinkActive="active" appMenuSelection> <i class="fa fa-user-secret"></i> <span> Admin </span> </a> </li> </ul> </nav></div><!-- Left Sidebar End --></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'SidebarComponent'};

View File

@ -109,15 +109,15 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {Component} from &#x27;@angular/core&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Component } from &#x27;@angular/core&#x27;;
@Component({selector: &#x27;app-sidebar&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-sidebar&#x27;, template: &#x27;&#x27; })
export class SidebarStubComponent {}
@Component({selector: &#x27;app-topbar&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-topbar&#x27;, template: &#x27;&#x27; })
export class TopbarStubComponent {}
@Component({selector: &#x27;app-footer&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-footer&#x27;, template: &#x27;&#x27; })
export class FooterStubComponent {}
</code></pre>
</div>

View File

@ -377,32 +377,43 @@ export class TokenDetailsComponent implements OnInit {
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt;
&lt;div class&#x3D;&quot;row&quot;&gt;
TOKEN DETAILS
&lt;button mat-raised-button type&#x3D;&quot;button&quot; class&#x3D;&quot;btn btn-outline-secondary ml-auto mr-2&quot; (click)&#x3D;&quot;close()&quot;&gt; CLOSE &lt;/button&gt;
&lt;button
mat-raised-button
type&#x3D;&quot;button&quot;
class&#x3D;&quot;btn btn-outline-secondary ml-auto mr-2&quot;
(click)&#x3D;&quot;close()&quot;
&gt;
CLOSE
&lt;/button&gt;
&lt;/div&gt;
&lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Name:&lt;/strong&gt; {{token?.name}}&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;Name:&lt;/strong&gt; {{ token?.name }}&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Symbol:&lt;/strong&gt; {{token?.symbol}}&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;Symbol:&lt;/strong&gt; {{ token?.symbol }}&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Address:&lt;/strong&gt; {{token?.address}}&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;Address:&lt;/strong&gt; {{ token?.address }}&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Details:&lt;/strong&gt; A community inclusive currency for trading among lower to middle income societies.&lt;/span&gt;
&lt;span
&gt;&lt;strong&gt;Details:&lt;/strong&gt; A community inclusive currency for trading among lower to
middle income societies.&lt;/span
&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Supply:&lt;/strong&gt; {{token?.supply | tokenRatio}}&lt;/span&gt;
&lt;/div&gt;&lt;br&gt;
&lt;span&gt;&lt;strong&gt;Supply:&lt;/strong&gt; {{ token?.supply | tokenRatio }}&lt;/span&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;h2&gt;Reserve&lt;/h2&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Weight:&lt;/strong&gt; {{token?.reserveRatio}}&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;Weight:&lt;/strong&gt; {{ token?.reserveRatio }}&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span&gt;&lt;strong&gt;Owner:&lt;/strong&gt; {{token?.owner}}&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;Owner:&lt;/strong&gt; {{ token?.owner }}&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
@ -443,7 +454,7 @@ export class TokenDetailsComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><div *ngIf="token" class="mb-3 mt-1"> <div class="card text-center"> <mat-card-title class="card-header"> <div class="row"> TOKEN DETAILS <button mat-raised-button type="button" class="btn btn-outline-secondary ml-auto mr-2" (click)="close()"> CLOSE </button> </div> </mat-card-title> <div class="card-body"> <div> <span><strong>Name:</strong> {{token?.name}}</span> </div> <div> <span><strong>Symbol:</strong> {{token?.symbol}}</span> </div> <div> <span><strong>Address:</strong> {{token?.address}}</span> </div> <div> <span><strong>Details:</strong> A community inclusive currency for trading among lower to middle income societies.</span> </div> <div> <span><strong>Supply:</strong> {{token?.supply | tokenRatio}}</span> </div><br> <div> <h2>Reserve</h2> <div> <span><strong>Weight:</strong> {{token?.reserveRatio}}</span> </div> <div> <span><strong>Owner:</strong> {{token?.owner}}</span> </div> </div> </div> </div></div></div>'
var COMPONENT_TEMPLATE = '<div><div *ngIf="token" class="mb-3 mt-1"> <div class="card text-center"> <mat-card-title class="card-header"> <div class="row"> TOKEN DETAILS <button mat-raised-button type="button" class="btn btn-outline-secondary ml-auto mr-2" (click)="close()" > CLOSE </button> </div> </mat-card-title> <div class="card-body"> <div> <span><strong>Name:</strong> {{ token?.name }}</span> </div> <div> <span><strong>Symbol:</strong> {{ token?.symbol }}</span> </div> <div> <span><strong>Address:</strong> {{ token?.address }}</span> </div> <div> <span ><strong>Details:</strong> A community inclusive currency for trading among lower to middle income societies.</span > </div> <div> <span><strong>Supply:</strong> {{ token?.supply | tokenRatio }}</span> </div> <br /> <div> <h2>Reserve</h2> <div> <span><strong>Weight:</strong> {{ token?.reserveRatio }}</span> </div> <div> <span><strong>Owner:</strong> {{ token?.owner }}</span> </div> </div> </div> </div></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'TokenDetailsComponent'};

View File

@ -766,45 +766,71 @@ export class TokensComponent implements OnInit {
&lt;mat-card-title class&#x3D;&quot;card-header&quot;&gt;
&lt;div class&#x3D;&quot;row&quot;&gt;
Tokens
&lt;button mat-raised-button color&#x3D;&quot;primary&quot; type&#x3D;&quot;button&quot; class&#x3D;&quot;btn btn-outline-primary ml-auto mr-2&quot; (click)&#x3D;&quot;downloadCsv()&quot;&gt; EXPORT &lt;/button&gt;
&lt;button
mat-raised-button
color&#x3D;&quot;primary&quot;
type&#x3D;&quot;button&quot;
class&#x3D;&quot;btn btn-outline-primary ml-auto mr-2&quot;
(click)&#x3D;&quot;downloadCsv()&quot;
&gt;
EXPORT
&lt;/button&gt;
&lt;/div&gt;
&lt;/mat-card-title&gt;
&lt;div class&#x3D;&quot;card-body&quot;&gt;
&lt;app-token-details [token]&#x3D;&quot;token&quot; (closeWindow)&#x3D;&quot;token &#x3D; $event&quot;&gt;&lt;/app-token-details&gt;
&lt;mat-form-field appearance&#x3D;&quot;outline&quot;&gt;
&lt;mat-label&gt; Filter &lt;/mat-label&gt;
&lt;input matInput type&#x3D;&quot;text&quot; (keyup)&#x3D;&quot;doFilter($event.target.value)&quot; placeholder&#x3D;&quot;Filter&quot;&gt;
&lt;input
matInput
type&#x3D;&quot;text&quot;
(keyup)&#x3D;&quot;doFilter($event.target.value)&quot;
placeholder&#x3D;&quot;Filter&quot;
/&gt;
&lt;mat-icon matSuffix&gt;search&lt;/mat-icon&gt;
&lt;/mat-form-field&gt;
&lt;mat-table class&#x3D;&quot;mat-elevation-z10 table-responsive&quot; [dataSource]&#x3D;&quot;dataSource&quot; matSort matSortDirection&#x3D;&quot;asc&quot; matSortDisableClear&gt;
&lt;mat-table
class&#x3D;&quot;mat-elevation-z10 table-responsive&quot;
[dataSource]&#x3D;&quot;dataSource&quot;
matSort
matSortDirection&#x3D;&quot;asc&quot;
matSortDisableClear
&gt;
&lt;ng-container matColumnDef&#x3D;&quot;name&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; Name &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{token.name}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{ token.name }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;symbol&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; Symbol &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{token.symbol}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{ token.symbol }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;address&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; Address &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{token.address}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{ token.address }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;ng-container matColumnDef&#x3D;&quot;supply&quot;&gt;
&lt;mat-header-cell *matHeaderCellDef mat-sort-header&gt; Supply &lt;/mat-header-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{token.supply | tokenRatio}} &lt;/mat-cell&gt;
&lt;mat-cell *matCellDef&#x3D;&quot;let token&quot;&gt; {{ token.supply | tokenRatio }} &lt;/mat-cell&gt;
&lt;/ng-container&gt;
&lt;mat-header-row *matHeaderRowDef&#x3D;&quot;columnsToDisplay&quot;&gt;&lt;/mat-header-row&gt;
&lt;mat-row *matRowDef&#x3D;&quot;let token; columns: columnsToDisplay&quot; (click)&#x3D;&quot;viewToken(token)&quot; matRipple&gt;&lt;/mat-row&gt;
&lt;mat-row
*matRowDef&#x3D;&quot;let token; columns: columnsToDisplay&quot;
(click)&#x3D;&quot;viewToken(token)&quot;
matRipple
&gt;&lt;/mat-row&gt;
&lt;/mat-table&gt;
&lt;mat-paginator [pageSize]&#x3D;&quot;5&quot; [pageSizeOptions]&#x3D;&quot;[5, 10, 25, 100]&quot; showFirstLastButtons&gt;&lt;/mat-paginator&gt;
&lt;mat-paginator
[pageSize]&#x3D;&quot;5&quot;
[pageSizeOptions]&#x3D;&quot;[5, 10, 25, 100]&quot;
showFirstLastButtons
&gt;&lt;/mat-paginator&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
@ -814,7 +840,6 @@ export class TokensComponent implements OnInit {
&lt;!-- End Page content --&gt;
&lt;!-- &#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D; --&gt;
&lt;/div&gt;
</code></pre>
</div>
@ -850,7 +875,7 @@ export class TokensComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Tokens</li> </ol> </nav> <div class="card"> <mat-card-title class="card-header"> <div class="row"> Tokens <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()"> EXPORT </button> </div> </mat-card-title> <div class="card-body"> <app-token-details [token]="token" (closeWindow)="token = $event"></app-token-details> <mat-form-field appearance="outline"> <mat-label> Filter </mat-label> <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter"> <mat-icon matSuffix>search</mat-icon> </mat-form-field> <mat-table class="mat-elevation-z10 table-responsive" [dataSource]="dataSource" matSort matSortDirection="asc" matSortDisableClear> <ng-container matColumnDef="name"> <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell> <mat-cell *matCellDef="let token"> {{token.name}} </mat-cell> </ng-container> <ng-container matColumnDef="symbol"> <mat-header-cell *matHeaderCellDef mat-sort-header> Symbol </mat-header-cell> <mat-cell *matCellDef="let token"> {{token.symbol}} </mat-cell> </ng-container> <ng-container matColumnDef="address"> <mat-header-cell *matHeaderCellDef mat-sort-header> Address </mat-header-cell> <mat-cell *matCellDef="let token"> {{token.address}} </mat-cell> </ng-container> <ng-container matColumnDef="supply"> <mat-header-cell *matHeaderCellDef mat-sort-header> Supply </mat-header-cell> <mat-cell *matCellDef="let token"> {{token.supply | tokenRatio}} </mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="columnsToDisplay"></mat-header-row> <mat-row *matRowDef="let token; columns: columnsToDisplay" (click)="viewToken(token)" matRipple></mat-row> </mat-table> <mat-paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 25, 100]" showFirstLastButtons></mat-paginator> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENT_TEMPLATE = '<div><!-- Begin page --><div class="wrapper"> <app-sidebar></app-sidebar> <!-- ============================================================== --> <!-- Start Page Content here --> <!-- ============================================================== --> <div id="content"> <app-topbar></app-topbar> <!-- Start Content--> <div class="container-fluid" appMenuSelection> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a routerLink="/home">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Tokens</li> </ol> </nav> <div class="card"> <mat-card-title class="card-header"> <div class="row"> Tokens <button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()" > EXPORT </button> </div> </mat-card-title> <div class="card-body"> <app-token-details [token]="token" (closeWindow)="token = $event"></app-token-details> <mat-form-field appearance="outline"> <mat-label> Filter </mat-label> <input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter" /> <mat-icon matSuffix>search</mat-icon> </mat-form-field> <mat-table class="mat-elevation-z10 table-responsive" [dataSource]="dataSource" matSort matSortDirection="asc" matSortDisableClear > <ng-container matColumnDef="name"> <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell> <mat-cell *matCellDef="let token"> {{ token.name }} </mat-cell> </ng-container> <ng-container matColumnDef="symbol"> <mat-header-cell *matHeaderCellDef mat-sort-header> Symbol </mat-header-cell> <mat-cell *matCellDef="let token"> {{ token.symbol }} </mat-cell> </ng-container> <ng-container matColumnDef="address"> <mat-header-cell *matHeaderCellDef mat-sort-header> Address </mat-header-cell> <mat-cell *matCellDef="let token"> {{ token.address }} </mat-cell> </ng-container> <ng-container matColumnDef="supply"> <mat-header-cell *matHeaderCellDef mat-sort-header> Supply </mat-header-cell> <mat-cell *matCellDef="let token"> {{ token.supply | tokenRatio }} </mat-cell> </ng-container> <mat-header-row *matHeaderRowDef="columnsToDisplay"></mat-header-row> <mat-row *matRowDef="let token; columns: columnsToDisplay" (click)="viewToken(token)" matRipple ></mat-row> </mat-table> <mat-paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 25, 100]" showFirstLastButtons ></mat-paginator> </div> </div> </div> <app-footer appMenuSelection></app-footer> </div> <!-- ============================================================== --> <!-- End Page content --> <!-- ============================================================== --></div></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'TokensComponent'};

View File

@ -242,7 +242,13 @@ export class TopbarComponent implements OnInit {
<pre class="line-numbers"><code class="language-html">&lt;!-- Topbar Start --&gt;
&lt;nav class&#x3D;&quot;navbar navbar-expand-lg navbar-light bg-light sticky-top&quot;&gt;
&lt;div class&#x3D;&quot;container-fluid&quot;&gt;
&lt;button type&#x3D;&quot;button&quot; id&#x3D;&quot;sidebarCollapse&quot; class&#x3D;&quot;navbar-btn menutoggle&quot; aria-label&#x3D;&quot;Sidebar toggle&quot; appMenuToggle&gt;
&lt;button
type&#x3D;&quot;button&quot;
id&#x3D;&quot;sidebarCollapse&quot;
class&#x3D;&quot;navbar-btn menutoggle&quot;
aria-label&#x3D;&quot;Sidebar toggle&quot;
appMenuToggle
&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
@ -285,7 +291,7 @@ export class TopbarComponent implements OnInit {
<script src="../js/libs/htmlparser.js"></script>
<script src="../js/libs/deep-iterator.js"></script>
<script>
var COMPONENT_TEMPLATE = '<div><!-- Topbar Start --><nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top"> <div class="container-fluid"> <button type="button" id="sidebarCollapse" class="navbar-btn menutoggle" aria-label="Sidebar toggle" appMenuToggle> <span></span> <span></span> <span></span> </button> </div></nav><!-- end Topbar --></div>'
var COMPONENT_TEMPLATE = '<div><!-- Topbar Start --><nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top"> <div class="container-fluid"> <button type="button" id="sidebarCollapse" class="navbar-btn menutoggle" aria-label="Sidebar toggle" appMenuToggle > <span></span> <span></span> <span></span> </button> </div></nav><!-- end Topbar --></div>'
var COMPONENTS = [{'name': 'AccountDetailsComponent', 'selector': 'app-account-details'},{'name': 'AccountsComponent', 'selector': 'app-accounts'},{'name': 'AccountSearchComponent', 'selector': 'app-account-search'},{'name': 'AdminComponent', 'selector': 'app-admin'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'AuthComponent', 'selector': 'app-auth'},{'name': 'CreateAccountComponent', 'selector': 'app-create-account'},{'name': 'ErrorDialogComponent', 'selector': 'app-error-dialog'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FooterStubComponent', 'selector': 'app-footer'},{'name': 'NetworkStatusComponent', 'selector': 'app-network-status'},{'name': 'OrganizationComponent', 'selector': 'app-organization'},{'name': 'PagesComponent', 'selector': 'app-pages'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SidebarStubComponent', 'selector': 'app-sidebar'},{'name': 'TokenDetailsComponent', 'selector': 'app-token-details'},{'name': 'TokensComponent', 'selector': 'app-tokens'},{'name': 'TopbarComponent', 'selector': 'app-topbar'},{'name': 'TopbarStubComponent', 'selector': 'app-topbar'},{'name': 'TransactionDetailsComponent', 'selector': 'app-transaction-details'},{'name': 'TransactionsComponent', 'selector': 'app-transactions'}];
var DIRECTIVES = [{'name': 'MenuSelectionDirective', 'selector': '[appMenuSelection]'},{'name': 'MenuToggleDirective', 'selector': '[appMenuToggle]'},{'name': 'PasswordToggleDirective', 'selector': '[appPasswordToggle]'},{'name': 'RouterLinkDirectiveStub', 'selector': '[appRouterLink]'}];
var ACTUAL_COMPONENT = {'name': 'TopbarComponent'};

View File

@ -109,15 +109,15 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {Component} from &#x27;@angular/core&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Component } from &#x27;@angular/core&#x27;;
@Component({selector: &#x27;app-sidebar&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-sidebar&#x27;, template: &#x27;&#x27; })
export class SidebarStubComponent {}
@Component({selector: &#x27;app-topbar&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-topbar&#x27;, template: &#x27;&#x27; })
export class TopbarStubComponent {}
@Component({selector: &#x27;app-footer&#x27;, template: &#x27;&#x27;})
@Component({ selector: &#x27;app-footer&#x27;, template: &#x27;&#x27; })
export class FooterStubComponent {}
</code></pre>
</div>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -235,10 +235,10 @@
<div class="tab-pane fade tab-source-code" id="c-source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import {Directive, HostListener, Input} from &#x27;@angular/core&#x27;;
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Directive, HostListener, Input } from &#x27;@angular/core&#x27;;
@Directive({
selector: &#x27;[appRouterLink]&#x27;
selector: &#x27;[appRouterLink]&#x27;,
})
// tslint:disable-next-line:directive-class-suffix
export class RouterLinkDirectiveStub {

File diff suppressed because one or more lines are too long

View File

@ -1719,11 +1719,10 @@
logLevel: NgxLoggerLevel.ERROR,
serverLogLevel: NgxLoggerLevel.OFF,
loggingUrl: &#x27;&#x27;,
cicAuthUrl: &#x27;https://meta-auth.dev.grassrootseconomics.net&#x27;,
cicMetaUrl: &#x27;https://meta-auth.dev.grassrootseconomics.net&#x27;,
cicMetaUrl: &#x27;https://meta.dev.grassrootseconomics.net&#x27;,
publicKeysUrl: &#x27;https://dev.grassrootseconomics.net/.well-known/publickeys/&#x27;,
cicCacheUrl: &#x27;http://localhost:63313&#x27;,
web3Provider: &#x27;ws://localhost:63546&#x27;,
cicCacheUrl: &#x27;https://cache.dev.grassrootseconomics.net&#x27;,
web3Provider: &#x27;wss://bloxberg-ws.dev.grassrootseconomics.net&#x27;,
cicUssdUrl: &#x27;https://user.dev.grassrootseconomics.net&#x27;,
registryAddress: &#x27;0xea6225212005e86a4490018ded4bf37f3e772161&#x27;,
trustedDeclaratorAddress: &#x27;0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C&#x27;,
@ -1763,7 +1762,6 @@
logLevel: NgxLoggerLevel.ERROR,
serverLogLevel: NgxLoggerLevel.OFF,
loggingUrl: &#x27;&#x27;,
cicAuthUrl: &#x27;https://meta-auth.dev.grassrootseconomics.net&#x27;,
cicMetaUrl: &#x27;https://meta.dev.grassrootseconomics.net&#x27;,
publicKeysUrl: &#x27;https://dev.grassrootseconomics.net/.well-known/publickeys/&#x27;,
cicCacheUrl: &#x27;https://cache.dev.grassrootseconomics.net&#x27;,

View File

@ -65,14 +65,14 @@
<title>cluster_AppModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-268 1186,-268 1186,-70 8,-70"/>
</g>
<g id="clust6" class="cluster">
<title>cluster_AppModule_bootstrap</title>
<polygon fill="none" stroke="black" points="447,-208 447,-260 571,-260 571,-208 447,-208"/>
</g>
<g id="clust7" class="cluster">
<title>cluster_AppModule_providers</title>
<polygon fill="none" stroke="black" points="415,-78 415,-130 1178,-130 1178,-78 415,-78"/>
</g>
<g id="clust6" class="cluster">
<title>cluster_AppModule_bootstrap</title>
<polygon fill="none" stroke="black" points="447,-208 447,-260 571,-260 571,-208 447,-208"/>
</g>
<g id="clust4" class="cluster">
<title>cluster_AppModule_imports</title>
<polygon fill="none" stroke="black" points="146,-78 146,-130 407,-130 407,-78 146,-78"/>

View File

@ -24,14 +24,14 @@
<title>cluster_AppModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-268 1186,-268 1186,-70 8,-70"/>
</g>
<g id="clust6" class="cluster">
<title>cluster_AppModule_bootstrap</title>
<polygon fill="none" stroke="black" points="447,-208 447,-260 571,-260 571,-208 447,-208"/>
</g>
<g id="clust7" class="cluster">
<title>cluster_AppModule_providers</title>
<polygon fill="none" stroke="black" points="415,-78 415,-130 1178,-130 1178,-78 415,-78"/>
</g>
<g id="clust6" class="cluster">
<title>cluster_AppModule_bootstrap</title>
<polygon fill="none" stroke="black" points="447,-208 447,-260 571,-260 571,-208 447,-208"/>
</g>
<g id="clust4" class="cluster">
<title>cluster_AppModule_imports</title>
<polygon fill="none" stroke="black" points="146,-78 146,-130 407,-130 407,-78 146,-78"/>

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@ -65,67 +65,67 @@
<title>cluster_SettingsModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-195 628,-195 628,-70 8,-70"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_SettingsModule_imports</title>
<polygon fill="none" stroke="black" points="338,-78 338,-130 620,-130 620,-78 338,-78"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_SettingsModule_declarations</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 330,-130 330,-78 16,-78"/>
<polygon fill="none" stroke="black" points="306,-78 306,-130 620,-130 620,-78 306,-78"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_SettingsModule_imports</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 298,-130 298,-78 16,-78"/>
</g>
<!-- OrganizationComponent -->
<g id="node1" class="node">
<title>OrganizationComponent</title>
<polygon fill="#ffffb3" stroke="black" points="322.42,-122 167.58,-122 167.58,-86 322.42,-86 322.42,-122"/>
<text text-anchor="middle" x="245" y="-99.8" font-family="Times,serif" font-size="14.00">OrganizationComponent</text>
<polygon fill="#ffffb3" stroke="black" points="612.42,-122 457.58,-122 457.58,-86 612.42,-86 612.42,-122"/>
<text text-anchor="middle" x="535" y="-99.8" font-family="Times,serif" font-size="14.00">OrganizationComponent</text>
</g>
<!-- SettingsModule -->
<g id="node3" class="node">
<title>SettingsModule</title>
<polygon fill="#8dd3c7" stroke="black" points="372.16,-187 369.16,-191 348.16,-191 345.16,-187 267.84,-187 267.84,-151 372.16,-151 372.16,-187"/>
<text text-anchor="middle" x="320" y="-164.8" font-family="Times,serif" font-size="14.00">SettingsModule</text>
<polygon fill="#8dd3c7" stroke="black" points="348.16,-187 345.16,-191 324.16,-191 321.16,-187 243.84,-187 243.84,-151 348.16,-151 348.16,-187"/>
<text text-anchor="middle" x="296" y="-164.8" font-family="Times,serif" font-size="14.00">SettingsModule</text>
</g>
<!-- OrganizationComponent&#45;&gt;SettingsModule -->
<g id="edge1" class="edge">
<title>OrganizationComponent&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M294.94,-122.11C294.94,-122.11 294.94,-140.99 294.94,-140.99"/>
<polygon fill="black" stroke="black" points="291.44,-140.99 294.94,-150.99 298.44,-140.99 291.44,-140.99"/>
<path fill="none" stroke="black" d="M535,-122.11C535,-141.34 535,-169 535,-169 535,-169 358.45,-169 358.45,-169"/>
<polygon fill="black" stroke="black" points="358.45,-165.5 348.45,-169 358.45,-172.5 358.45,-165.5"/>
</g>
<!-- SettingsComponent -->
<g id="node2" class="node">
<title>SettingsComponent</title>
<polygon fill="#ffffb3" stroke="black" points="150.45,-122 23.55,-122 23.55,-86 150.45,-86 150.45,-122"/>
<text text-anchor="middle" x="87" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsComponent</text>
<polygon fill="#ffffb3" stroke="black" points="440.45,-122 313.55,-122 313.55,-86 440.45,-86 440.45,-122"/>
<text text-anchor="middle" x="377" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsComponent</text>
</g>
<!-- SettingsComponent&#45;&gt;SettingsModule -->
<g id="edge2" class="edge">
<title>SettingsComponent&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M87,-122.11C87,-141.34 87,-169 87,-169 87,-169 257.71,-169 257.71,-169"/>
<polygon fill="black" stroke="black" points="257.71,-172.5 267.71,-169 257.71,-165.5 257.71,-172.5"/>
<path fill="none" stroke="black" d="M331.05,-122.11C331.05,-122.11 331.05,-140.99 331.05,-140.99"/>
<polygon fill="black" stroke="black" points="327.55,-140.99 331.05,-150.99 334.55,-140.99 327.55,-140.99"/>
</g>
<!-- SettingsRoutingModule -->
<g id="node4" class="node">
<title>SettingsRoutingModule</title>
<polygon fill="#8dd3c7" stroke="black" points="611.78,-122 608.78,-126 587.78,-126 584.78,-122 462.22,-122 462.22,-86 611.78,-86 611.78,-122"/>
<text text-anchor="middle" x="537" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsRoutingModule</text>
<polygon fill="#8dd3c7" stroke="black" points="289.78,-122 286.78,-126 265.78,-126 262.78,-122 140.22,-122 140.22,-86 289.78,-86 289.78,-122"/>
<text text-anchor="middle" x="215" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsRoutingModule</text>
</g>
<!-- SettingsRoutingModule&#45;&gt;SettingsModule -->
<g id="edge3" class="edge">
<title>SettingsRoutingModule&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M537,-122.11C537,-141.34 537,-169 537,-169 537,-169 382.25,-169 382.25,-169"/>
<polygon fill="black" stroke="black" points="382.25,-165.5 372.25,-169 382.25,-172.5 382.25,-165.5"/>
<path fill="none" stroke="black" d="M266.78,-122.11C266.78,-122.11 266.78,-140.99 266.78,-140.99"/>
<polygon fill="black" stroke="black" points="263.28,-140.99 266.78,-150.99 270.28,-140.99 263.28,-140.99"/>
</g>
<!-- SharedModule -->
<g id="node5" class="node">
<title>SharedModule</title>
<polygon fill="#8dd3c7" stroke="black" points="444.42,-122 441.42,-126 420.42,-126 417.42,-122 345.58,-122 345.58,-86 444.42,-86 444.42,-122"/>
<text text-anchor="middle" x="395" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
<polygon fill="#8dd3c7" stroke="black" points="122.42,-122 119.42,-126 98.42,-126 95.42,-122 23.58,-122 23.58,-86 122.42,-86 122.42,-122"/>
<text text-anchor="middle" x="73" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
</g>
<!-- SharedModule&#45;&gt;SettingsModule -->
<g id="edge4" class="edge">
<title>SharedModule&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M359.06,-122.11C359.06,-122.11 359.06,-140.99 359.06,-140.99"/>
<polygon fill="black" stroke="black" points="355.56,-140.99 359.06,-150.99 362.56,-140.99 355.56,-140.99"/>
<path fill="none" stroke="black" d="M73,-122.11C73,-141.34 73,-169 73,-169 73,-169 233.72,-169 233.72,-169"/>
<polygon fill="black" stroke="black" points="233.72,-172.5 243.72,-169 233.72,-165.5 233.72,-172.5"/>
</g>
</g>
</svg>

View File

@ -24,67 +24,67 @@
<title>cluster_SettingsModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-195 628,-195 628,-70 8,-70"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_SettingsModule_imports</title>
<polygon fill="none" stroke="black" points="338,-78 338,-130 620,-130 620,-78 338,-78"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_SettingsModule_declarations</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 330,-130 330,-78 16,-78"/>
<polygon fill="none" stroke="black" points="306,-78 306,-130 620,-130 620,-78 306,-78"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_SettingsModule_imports</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 298,-130 298,-78 16,-78"/>
</g>
<!-- OrganizationComponent -->
<g id="node1" class="node">
<title>OrganizationComponent</title>
<polygon fill="#ffffb3" stroke="black" points="322.42,-122 167.58,-122 167.58,-86 322.42,-86 322.42,-122"/>
<text text-anchor="middle" x="245" y="-99.8" font-family="Times,serif" font-size="14.00">OrganizationComponent</text>
<polygon fill="#ffffb3" stroke="black" points="612.42,-122 457.58,-122 457.58,-86 612.42,-86 612.42,-122"/>
<text text-anchor="middle" x="535" y="-99.8" font-family="Times,serif" font-size="14.00">OrganizationComponent</text>
</g>
<!-- SettingsModule -->
<g id="node3" class="node">
<title>SettingsModule</title>
<polygon fill="#8dd3c7" stroke="black" points="372.16,-187 369.16,-191 348.16,-191 345.16,-187 267.84,-187 267.84,-151 372.16,-151 372.16,-187"/>
<text text-anchor="middle" x="320" y="-164.8" font-family="Times,serif" font-size="14.00">SettingsModule</text>
<polygon fill="#8dd3c7" stroke="black" points="348.16,-187 345.16,-191 324.16,-191 321.16,-187 243.84,-187 243.84,-151 348.16,-151 348.16,-187"/>
<text text-anchor="middle" x="296" y="-164.8" font-family="Times,serif" font-size="14.00">SettingsModule</text>
</g>
<!-- OrganizationComponent&#45;&gt;SettingsModule -->
<g id="edge1" class="edge">
<title>OrganizationComponent&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M294.94,-122.11C294.94,-122.11 294.94,-140.99 294.94,-140.99"/>
<polygon fill="black" stroke="black" points="291.44,-140.99 294.94,-150.99 298.44,-140.99 291.44,-140.99"/>
<path fill="none" stroke="black" d="M535,-122.11C535,-141.34 535,-169 535,-169 535,-169 358.45,-169 358.45,-169"/>
<polygon fill="black" stroke="black" points="358.45,-165.5 348.45,-169 358.45,-172.5 358.45,-165.5"/>
</g>
<!-- SettingsComponent -->
<g id="node2" class="node">
<title>SettingsComponent</title>
<polygon fill="#ffffb3" stroke="black" points="150.45,-122 23.55,-122 23.55,-86 150.45,-86 150.45,-122"/>
<text text-anchor="middle" x="87" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsComponent</text>
<polygon fill="#ffffb3" stroke="black" points="440.45,-122 313.55,-122 313.55,-86 440.45,-86 440.45,-122"/>
<text text-anchor="middle" x="377" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsComponent</text>
</g>
<!-- SettingsComponent&#45;&gt;SettingsModule -->
<g id="edge2" class="edge">
<title>SettingsComponent&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M87,-122.11C87,-141.34 87,-169 87,-169 87,-169 257.71,-169 257.71,-169"/>
<polygon fill="black" stroke="black" points="257.71,-172.5 267.71,-169 257.71,-165.5 257.71,-172.5"/>
<path fill="none" stroke="black" d="M331.05,-122.11C331.05,-122.11 331.05,-140.99 331.05,-140.99"/>
<polygon fill="black" stroke="black" points="327.55,-140.99 331.05,-150.99 334.55,-140.99 327.55,-140.99"/>
</g>
<!-- SettingsRoutingModule -->
<g id="node4" class="node">
<title>SettingsRoutingModule</title>
<polygon fill="#8dd3c7" stroke="black" points="611.78,-122 608.78,-126 587.78,-126 584.78,-122 462.22,-122 462.22,-86 611.78,-86 611.78,-122"/>
<text text-anchor="middle" x="537" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsRoutingModule</text>
<polygon fill="#8dd3c7" stroke="black" points="289.78,-122 286.78,-126 265.78,-126 262.78,-122 140.22,-122 140.22,-86 289.78,-86 289.78,-122"/>
<text text-anchor="middle" x="215" y="-99.8" font-family="Times,serif" font-size="14.00">SettingsRoutingModule</text>
</g>
<!-- SettingsRoutingModule&#45;&gt;SettingsModule -->
<g id="edge3" class="edge">
<title>SettingsRoutingModule&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M537,-122.11C537,-141.34 537,-169 537,-169 537,-169 382.25,-169 382.25,-169"/>
<polygon fill="black" stroke="black" points="382.25,-165.5 372.25,-169 382.25,-172.5 382.25,-165.5"/>
<path fill="none" stroke="black" d="M266.78,-122.11C266.78,-122.11 266.78,-140.99 266.78,-140.99"/>
<polygon fill="black" stroke="black" points="263.28,-140.99 266.78,-150.99 270.28,-140.99 263.28,-140.99"/>
</g>
<!-- SharedModule -->
<g id="node5" class="node">
<title>SharedModule</title>
<polygon fill="#8dd3c7" stroke="black" points="444.42,-122 441.42,-126 420.42,-126 417.42,-122 345.58,-122 345.58,-86 444.42,-86 444.42,-122"/>
<text text-anchor="middle" x="395" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
<polygon fill="#8dd3c7" stroke="black" points="122.42,-122 119.42,-126 98.42,-126 95.42,-122 23.58,-122 23.58,-86 122.42,-86 122.42,-122"/>
<text text-anchor="middle" x="73" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
</g>
<!-- SharedModule&#45;&gt;SettingsModule -->
<g id="edge4" class="edge">
<title>SharedModule&#45;&gt;SettingsModule</title>
<path fill="none" stroke="black" d="M359.06,-122.11C359.06,-122.11 359.06,-140.99 359.06,-140.99"/>
<polygon fill="black" stroke="black" points="355.56,-140.99 359.06,-150.99 362.56,-140.99 355.56,-140.99"/>
<path fill="none" stroke="black" d="M73,-122.11C73,-141.34 73,-169 73,-169 73,-169 233.72,-169 233.72,-169"/>
<polygon fill="black" stroke="black" points="233.72,-172.5 243.72,-169 233.72,-165.5 233.72,-172.5"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -65,14 +65,14 @@
<title>cluster_SharedModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-268 1440,-268 1440,-70 8,-70"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_SharedModule_declarations</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 1432,-130 1432,-78 16,-78"/>
</g>
<g id="clust14" class="cluster">
<title>cluster_SharedModule_exports</title>
<polygon fill="none" stroke="black" points="126,-208 126,-260 1245,-260 1245,-208 126,-208"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_SharedModule_declarations</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 1432,-130 1432,-78 16,-78"/>
</g>
<!-- ErrorDialogComponent -->
<g id="node1" class="node">
<title>ErrorDialogComponent</title>

View File

@ -24,14 +24,14 @@
<title>cluster_SharedModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-268 1440,-268 1440,-70 8,-70"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_SharedModule_declarations</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 1432,-130 1432,-78 16,-78"/>
</g>
<g id="clust14" class="cluster">
<title>cluster_SharedModule_exports</title>
<polygon fill="none" stroke="black" points="126,-208 126,-260 1245,-260 1245,-208 126,-208"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_SharedModule_declarations</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 1432,-130 1432,-78 16,-78"/>
</g>
<!-- ErrorDialogComponent -->
<g id="node1" class="node">
<title>ErrorDialogComponent</title>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -65,83 +65,83 @@
<title>cluster_TransactionsModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-268 714,-268 714,-70 8,-70"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_TransactionsModule_imports</title>
<polygon fill="none" stroke="black" points="398,-78 398,-130 706,-130 706,-78 398,-78"/>
</g>
<g id="clust6" class="cluster">
<title>cluster_TransactionsModule_exports</title>
<polygon fill="none" stroke="black" points="238,-208 238,-260 444,-260 444,-208 238,-208"/>
<polygon fill="none" stroke="black" points="288,-208 288,-260 494,-260 494,-208 288,-208"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_TransactionsModule_declarations</title>
<polygon fill="none" stroke="black" points="332,-78 332,-130 706,-130 706,-78 332,-78"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_TransactionsModule_imports</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 324,-130 324,-78 16,-78"/>
<polygon fill="none" stroke="black" points="16,-78 16,-130 390,-130 390,-78 16,-78"/>
</g>
<!-- TransactionDetailsComponent -->
<g id="node1" class="node">
<title>TransactionDetailsComponent</title>
<polygon fill="#ffffb3" stroke="black" points="697.57,-122 510.43,-122 510.43,-86 697.57,-86 697.57,-122"/>
<text text-anchor="middle" x="604" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent</text>
<polygon fill="#ffffb3" stroke="black" points="381.57,-122 194.43,-122 194.43,-86 381.57,-86 381.57,-122"/>
<text text-anchor="middle" x="288" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent</text>
</g>
<!-- TransactionsModule -->
<g id="node3" class="node">
<title>TransactionsModule</title>
<polygon fill="#8dd3c7" stroke="black" points="406.58,-187 403.58,-191 382.58,-191 379.58,-187 275.42,-187 275.42,-151 406.58,-151 406.58,-187"/>
<text text-anchor="middle" x="341" y="-164.8" font-family="Times,serif" font-size="14.00">TransactionsModule</text>
<polygon fill="#8dd3c7" stroke="black" points="456.58,-187 453.58,-191 432.58,-191 429.58,-187 325.42,-187 325.42,-151 456.58,-151 456.58,-187"/>
<text text-anchor="middle" x="391" y="-164.8" font-family="Times,serif" font-size="14.00">TransactionsModule</text>
</g>
<!-- TransactionDetailsComponent&#45;&gt;TransactionsModule -->
<g id="edge1" class="edge">
<title>TransactionDetailsComponent&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M604,-122.11C604,-141.34 604,-169 604,-169 604,-169 416.69,-169 416.69,-169"/>
<polygon fill="black" stroke="black" points="416.69,-165.5 406.69,-169 416.69,-172.5 416.69,-165.5"/>
<path fill="none" stroke="black" d="M353.5,-122.11C353.5,-122.11 353.5,-140.99 353.5,-140.99"/>
<polygon fill="black" stroke="black" points="350,-140.99 353.5,-150.99 357,-140.99 350,-140.99"/>
</g>
<!-- TransactionsComponent -->
<g id="node2" class="node">
<title>TransactionsComponent</title>
<polygon fill="#ffffb3" stroke="black" points="492.36,-122 339.64,-122 339.64,-86 492.36,-86 492.36,-122"/>
<text text-anchor="middle" x="416" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsComponent</text>
<polygon fill="#ffffb3" stroke="black" points="176.36,-122 23.64,-122 23.64,-86 176.36,-86 176.36,-122"/>
<text text-anchor="middle" x="100" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsComponent</text>
</g>
<!-- TransactionsComponent&#45;&gt;TransactionsModule -->
<g id="edge2" class="edge">
<title>TransactionsComponent&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M373.05,-122.11C373.05,-122.11 373.05,-140.99 373.05,-140.99"/>
<polygon fill="black" stroke="black" points="369.55,-140.99 373.05,-150.99 376.55,-140.99 369.55,-140.99"/>
<path fill="none" stroke="black" d="M100,-122.11C100,-141.34 100,-169 100,-169 100,-169 315.33,-169 315.33,-169"/>
<polygon fill="black" stroke="black" points="315.33,-172.5 325.33,-169 315.33,-165.5 315.33,-172.5"/>
</g>
<!-- TransactionDetailsComponent -->
<g id="node6" class="node">
<title>TransactionDetailsComponent </title>
<polygon fill="#fb8072" stroke="black" points="436.07,-252 245.93,-252 245.93,-216 436.07,-216 436.07,-252"/>
<text text-anchor="middle" x="341" y="-229.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent </text>
<polygon fill="#fb8072" stroke="black" points="486.07,-252 295.93,-252 295.93,-216 486.07,-216 486.07,-252"/>
<text text-anchor="middle" x="391" y="-229.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent </text>
</g>
<!-- TransactionsModule&#45;&gt;TransactionDetailsComponent -->
<g id="edge5" class="edge">
<title>TransactionsModule&#45;&gt;TransactionDetailsComponent </title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M341,-187.11C341,-187.11 341,-205.99 341,-205.99"/>
<polygon fill="black" stroke="black" points="337.5,-205.99 341,-215.99 344.5,-205.99 337.5,-205.99"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M391,-187.11C391,-187.11 391,-205.99 391,-205.99"/>
<polygon fill="black" stroke="black" points="387.5,-205.99 391,-215.99 394.5,-205.99 387.5,-205.99"/>
</g>
<!-- SharedModule -->
<g id="node4" class="node">
<title>SharedModule</title>
<polygon fill="#8dd3c7" stroke="black" points="316.42,-122 313.42,-126 292.42,-126 289.42,-122 217.58,-122 217.58,-86 316.42,-86 316.42,-122"/>
<text text-anchor="middle" x="267" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
<polygon fill="#8dd3c7" stroke="black" points="698.42,-122 695.42,-126 674.42,-126 671.42,-122 599.58,-122 599.58,-86 698.42,-86 698.42,-122"/>
<text text-anchor="middle" x="649" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
</g>
<!-- SharedModule&#45;&gt;TransactionsModule -->
<g id="edge3" class="edge">
<title>SharedModule&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M295.84,-122.11C295.84,-122.11 295.84,-140.99 295.84,-140.99"/>
<polygon fill="black" stroke="black" points="292.34,-140.99 295.84,-150.99 299.34,-140.99 292.34,-140.99"/>
<path fill="none" stroke="black" d="M649,-122.11C649,-141.34 649,-169 649,-169 649,-169 466.77,-169 466.77,-169"/>
<polygon fill="black" stroke="black" points="466.77,-165.5 456.77,-169 466.77,-172.5 466.77,-165.5"/>
</g>
<!-- TransactionsRoutingModule -->
<g id="node5" class="node">
<title>TransactionsRoutingModule</title>
<polygon fill="#8dd3c7" stroke="black" points="200.2,-122 197.2,-126 176.2,-126 173.2,-122 23.8,-122 23.8,-86 200.2,-86 200.2,-122"/>
<text text-anchor="middle" x="112" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsRoutingModule</text>
<polygon fill="#8dd3c7" stroke="black" points="582.2,-122 579.2,-126 558.2,-126 555.2,-122 405.8,-122 405.8,-86 582.2,-86 582.2,-122"/>
<text text-anchor="middle" x="494" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsRoutingModule</text>
</g>
<!-- TransactionsRoutingModule&#45;&gt;TransactionsModule -->
<g id="edge4" class="edge">
<title>TransactionsRoutingModule&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M112,-122.11C112,-141.34 112,-169 112,-169 112,-169 265.38,-169 265.38,-169"/>
<polygon fill="black" stroke="black" points="265.38,-172.5 275.38,-169 265.38,-165.5 265.38,-172.5"/>
<path fill="none" stroke="black" d="M431.22,-122.11C431.22,-122.11 431.22,-140.99 431.22,-140.99"/>
<polygon fill="black" stroke="black" points="427.72,-140.99 431.22,-150.99 434.72,-140.99 427.72,-140.99"/>
</g>
</g>
</svg>

View File

@ -24,83 +24,83 @@
<title>cluster_TransactionsModule</title>
<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-70 8,-268 714,-268 714,-70 8,-70"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_TransactionsModule_imports</title>
<polygon fill="none" stroke="black" points="398,-78 398,-130 706,-130 706,-78 398,-78"/>
</g>
<g id="clust6" class="cluster">
<title>cluster_TransactionsModule_exports</title>
<polygon fill="none" stroke="black" points="238,-208 238,-260 444,-260 444,-208 238,-208"/>
<polygon fill="none" stroke="black" points="288,-208 288,-260 494,-260 494,-208 288,-208"/>
</g>
<g id="clust2" class="cluster">
<title>cluster_TransactionsModule_declarations</title>
<polygon fill="none" stroke="black" points="332,-78 332,-130 706,-130 706,-78 332,-78"/>
</g>
<g id="clust5" class="cluster">
<title>cluster_TransactionsModule_imports</title>
<polygon fill="none" stroke="black" points="16,-78 16,-130 324,-130 324,-78 16,-78"/>
<polygon fill="none" stroke="black" points="16,-78 16,-130 390,-130 390,-78 16,-78"/>
</g>
<!-- TransactionDetailsComponent -->
<g id="node1" class="node">
<title>TransactionDetailsComponent</title>
<polygon fill="#ffffb3" stroke="black" points="697.57,-122 510.43,-122 510.43,-86 697.57,-86 697.57,-122"/>
<text text-anchor="middle" x="604" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent</text>
<polygon fill="#ffffb3" stroke="black" points="381.57,-122 194.43,-122 194.43,-86 381.57,-86 381.57,-122"/>
<text text-anchor="middle" x="288" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent</text>
</g>
<!-- TransactionsModule -->
<g id="node3" class="node">
<title>TransactionsModule</title>
<polygon fill="#8dd3c7" stroke="black" points="406.58,-187 403.58,-191 382.58,-191 379.58,-187 275.42,-187 275.42,-151 406.58,-151 406.58,-187"/>
<text text-anchor="middle" x="341" y="-164.8" font-family="Times,serif" font-size="14.00">TransactionsModule</text>
<polygon fill="#8dd3c7" stroke="black" points="456.58,-187 453.58,-191 432.58,-191 429.58,-187 325.42,-187 325.42,-151 456.58,-151 456.58,-187"/>
<text text-anchor="middle" x="391" y="-164.8" font-family="Times,serif" font-size="14.00">TransactionsModule</text>
</g>
<!-- TransactionDetailsComponent&#45;&gt;TransactionsModule -->
<g id="edge1" class="edge">
<title>TransactionDetailsComponent&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M604,-122.11C604,-141.34 604,-169 604,-169 604,-169 416.69,-169 416.69,-169"/>
<polygon fill="black" stroke="black" points="416.69,-165.5 406.69,-169 416.69,-172.5 416.69,-165.5"/>
<path fill="none" stroke="black" d="M353.5,-122.11C353.5,-122.11 353.5,-140.99 353.5,-140.99"/>
<polygon fill="black" stroke="black" points="350,-140.99 353.5,-150.99 357,-140.99 350,-140.99"/>
</g>
<!-- TransactionsComponent -->
<g id="node2" class="node">
<title>TransactionsComponent</title>
<polygon fill="#ffffb3" stroke="black" points="492.36,-122 339.64,-122 339.64,-86 492.36,-86 492.36,-122"/>
<text text-anchor="middle" x="416" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsComponent</text>
<polygon fill="#ffffb3" stroke="black" points="176.36,-122 23.64,-122 23.64,-86 176.36,-86 176.36,-122"/>
<text text-anchor="middle" x="100" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsComponent</text>
</g>
<!-- TransactionsComponent&#45;&gt;TransactionsModule -->
<g id="edge2" class="edge">
<title>TransactionsComponent&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M373.05,-122.11C373.05,-122.11 373.05,-140.99 373.05,-140.99"/>
<polygon fill="black" stroke="black" points="369.55,-140.99 373.05,-150.99 376.55,-140.99 369.55,-140.99"/>
<path fill="none" stroke="black" d="M100,-122.11C100,-141.34 100,-169 100,-169 100,-169 315.33,-169 315.33,-169"/>
<polygon fill="black" stroke="black" points="315.33,-172.5 325.33,-169 315.33,-165.5 315.33,-172.5"/>
</g>
<!-- TransactionDetailsComponent -->
<g id="node6" class="node">
<title>TransactionDetailsComponent </title>
<polygon fill="#fb8072" stroke="black" points="436.07,-252 245.93,-252 245.93,-216 436.07,-216 436.07,-252"/>
<text text-anchor="middle" x="341" y="-229.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent </text>
<polygon fill="#fb8072" stroke="black" points="486.07,-252 295.93,-252 295.93,-216 486.07,-216 486.07,-252"/>
<text text-anchor="middle" x="391" y="-229.8" font-family="Times,serif" font-size="14.00">TransactionDetailsComponent </text>
</g>
<!-- TransactionsModule&#45;&gt;TransactionDetailsComponent -->
<g id="edge5" class="edge">
<title>TransactionsModule&#45;&gt;TransactionDetailsComponent </title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M341,-187.11C341,-187.11 341,-205.99 341,-205.99"/>
<polygon fill="black" stroke="black" points="337.5,-205.99 341,-215.99 344.5,-205.99 337.5,-205.99"/>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M391,-187.11C391,-187.11 391,-205.99 391,-205.99"/>
<polygon fill="black" stroke="black" points="387.5,-205.99 391,-215.99 394.5,-205.99 387.5,-205.99"/>
</g>
<!-- SharedModule -->
<g id="node4" class="node">
<title>SharedModule</title>
<polygon fill="#8dd3c7" stroke="black" points="316.42,-122 313.42,-126 292.42,-126 289.42,-122 217.58,-122 217.58,-86 316.42,-86 316.42,-122"/>
<text text-anchor="middle" x="267" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
<polygon fill="#8dd3c7" stroke="black" points="698.42,-122 695.42,-126 674.42,-126 671.42,-122 599.58,-122 599.58,-86 698.42,-86 698.42,-122"/>
<text text-anchor="middle" x="649" y="-99.8" font-family="Times,serif" font-size="14.00">SharedModule</text>
</g>
<!-- SharedModule&#45;&gt;TransactionsModule -->
<g id="edge3" class="edge">
<title>SharedModule&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M295.84,-122.11C295.84,-122.11 295.84,-140.99 295.84,-140.99"/>
<polygon fill="black" stroke="black" points="292.34,-140.99 295.84,-150.99 299.34,-140.99 292.34,-140.99"/>
<path fill="none" stroke="black" d="M649,-122.11C649,-141.34 649,-169 649,-169 649,-169 466.77,-169 466.77,-169"/>
<polygon fill="black" stroke="black" points="466.77,-165.5 456.77,-169 466.77,-172.5 466.77,-165.5"/>
</g>
<!-- TransactionsRoutingModule -->
<g id="node5" class="node">
<title>TransactionsRoutingModule</title>
<polygon fill="#8dd3c7" stroke="black" points="200.2,-122 197.2,-126 176.2,-126 173.2,-122 23.8,-122 23.8,-86 200.2,-86 200.2,-122"/>
<text text-anchor="middle" x="112" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsRoutingModule</text>
<polygon fill="#8dd3c7" stroke="black" points="582.2,-122 579.2,-126 558.2,-126 555.2,-122 405.8,-122 405.8,-86 582.2,-86 582.2,-122"/>
<text text-anchor="middle" x="494" y="-99.8" font-family="Times,serif" font-size="14.00">TransactionsRoutingModule</text>
</g>
<!-- TransactionsRoutingModule&#45;&gt;TransactionsModule -->
<g id="edge4" class="edge">
<title>TransactionsRoutingModule&#45;&gt;TransactionsModule</title>
<path fill="none" stroke="black" d="M112,-122.11C112,-141.34 112,-169 112,-169 112,-169 265.38,-169 265.38,-169"/>
<polygon fill="black" stroke="black" points="265.38,-172.5 275.38,-169 265.38,-165.5 265.38,-172.5"/>
<path fill="none" stroke="black" d="M431.22,-122.11C431.22,-122.11 431.22,-140.99 431.22,-140.99"/>
<polygon fill="black" stroke="black" points="427.72,-140.99 431.22,-150.99 434.72,-140.99 427.72,-140.99"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

View File

@ -130,7 +130,7 @@
<div class="tsd-signature tsd-kind-icon">actions<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>action<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>approval<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">; </span>id<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>role<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>user<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> = ...</span></div>
<aside class="tsd-sources">
<ul>
<li>Defined in src/testing/user-service-stub.ts:12</li>
<li>Defined in src/testing/user-service-stub.ts:72</li>
</ul>
</aside>
</section>
@ -157,7 +157,7 @@
<li class="tsd-description">
<aside class="tsd-sources">
<ul>
<li>Defined in src/testing/user-service-stub.ts:71</li>
<li>Defined in src/testing/user-service-stub.ts:134</li>
</ul>
</aside>
<h4 class="tsd-parameters-title">Parameters</h4>
@ -180,7 +180,7 @@
<li class="tsd-description">
<aside class="tsd-sources">
<ul>
<li>Defined in src/testing/user-service-stub.ts:61</li>
<li>Defined in src/testing/user-service-stub.ts:124</li>
</ul>
</aside>
<h4 class="tsd-parameters-title">Parameters</h4>
@ -203,7 +203,7 @@
<li class="tsd-description">
<aside class="tsd-sources">
<ul>
<li>Defined in src/testing/user-service-stub.ts:37</li>
<li>Defined in src/testing/user-service-stub.ts:103</li>
</ul>
</aside>
<h4 class="tsd-parameters-title">Parameters</h4>
@ -226,7 +226,7 @@
<li class="tsd-description">
<aside class="tsd-sources">
<ul>
<li>Defined in src/testing/user-service-stub.ts:21</li>
<li>Defined in src/testing/user-service-stub.ts:87</li>
</ul>
</aside>
<h4 class="tsd-parameters-title">Parameters</h4>

View File

@ -83,7 +83,7 @@
<section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module">
<a name="environment" class="tsd-anchor"></a>
<h3><span class="tsd-flag ts-flagConst">Const</span> environment</h3>
<div class="tsd-signature tsd-kind-icon">environment<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>bloxbergChainId<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>cicAuthUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicCacheUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicMetaUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicUssdUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>logLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>loggingUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>production<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">; </span>publicKeysUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>registryAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>serverLogLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>trustedDeclaratorAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>web3Provider<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> = ...</span></div>
<div class="tsd-signature tsd-kind-icon">environment<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>bloxbergChainId<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>cicCacheUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicMetaUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicUssdUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>logLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>loggingUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>production<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">; </span>publicKeysUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>registryAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>serverLogLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>trustedDeclaratorAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>web3Provider<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> = ...</span></div>
<aside class="tsd-sources">
<ul>
<li>Defined in src/environments/environment.dev.ts:3</li>
@ -95,9 +95,6 @@
<li class="tsd-parameter">
<h5>bloxberg<wbr>Chain<wbr>Id<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5>
</li>
<li class="tsd-parameter">
<h5>cic<wbr>Auth<wbr>Url<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5>
</li>
<li class="tsd-parameter">
<h5>cic<wbr>Cache<wbr>Url<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5>
</li>

View File

@ -83,7 +83,7 @@
<section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module">
<a name="environment" class="tsd-anchor"></a>
<h3><span class="tsd-flag ts-flagConst">Const</span> environment</h3>
<div class="tsd-signature tsd-kind-icon">environment<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>bloxbergChainId<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>cicAuthUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicCacheUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicMetaUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicUssdUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>logLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>loggingUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>production<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">; </span>publicKeysUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>registryAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>serverLogLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>trustedDeclaratorAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>web3Provider<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> = ...</span></div>
<div class="tsd-signature tsd-kind-icon">environment<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>bloxbergChainId<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>cicCacheUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicMetaUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>cicUssdUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>logLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>loggingUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>production<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">; </span>publicKeysUrl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>registryAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>serverLogLevel<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NgxLoggerLevel</span><span class="tsd-signature-symbol">; </span>trustedDeclaratorAddress<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>web3Provider<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> = ...</span></div>
<aside class="tsd-sources">
<ul>
<li>Defined in src/environments/environment.prod.ts:3</li>
@ -95,9 +95,6 @@
<li class="tsd-parameter">
<h5>bloxberg<wbr>Chain<wbr>Id<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5>
</li>
<li class="tsd-parameter">
<h5>cic<wbr>Auth<wbr>Url<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5>
</li>
<li class="tsd-parameter">
<h5>cic<wbr>Cache<wbr>Url<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5>
</li>

23332
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,8 @@
"build:prod": "ng build --prod",
"start:pwa": "npm run build:prod && http-server -p 4200 dist/cic-staff-client",
"test": "ng test",
"format:check": "prettier --config ./.prettierrc --list-different \"src/{app,environments,assets}/**/*.{ts,js,json,css,scss}\"",
"format:refactor": "prettier --config ./.prettierrc --write \"src/{app,environments,assets}/**/*.{ts,js,json,css,scss}\"",
"format:check": "prettier --config ./.prettierrc --list-different src/**/*.{ts,js,json,css,scss,html}",
"format:refactor": "prettier --config ./.prettierrc --write src/**/*.{ts,js,json,css,scss,html}",
"format:fix": "pretty-quick --staged",
"format:lint": "npm run format:refactor && npm run lint",
"lint": "ng lint",
@ -73,7 +73,8 @@
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"karma-junit-reporter": "^2.0.1",
"prettier": "^2.3.0",
"lint-staged": "^11.0.0",
"prettier": "^2.3.1",
"pretty-quick": "^3.1.0",
"protractor": "~7.0.0",
"secp256k1": "^4.0.2",
@ -86,9 +87,18 @@
"typescript": "~4.0.2",
"yargs": "^13.3.2"
},
"lint-staged": {
"src/**/*.{js,ts,scss,md,html,json}": [
"prettier --write",
"git add"
],
"*.scss": [
"stylelint src/**/*.scss"
]
},
"husky": {
"hooks": {
"pre-commit": "pretty-quick --staged & ng lint"
"pre-commit": "npx pretty-quick --staged && npm run format:lint && npx lint-staged"
}
}
}

View File

@ -8,20 +8,25 @@
<h1 class="text-white">CICADA</h1>
</a>
</mat-card-title>
<div id="one" style="display: block" class="card-body p-4">
<div id="one" style="display: block" class="card-body p-4">
<div class="text-center w-75 m-auto">
<h4 class="text-dark-50 text-center font-weight-bold">Add Private Key</h4>
</div>
<form [formGroup]="keyForm" (ngSubmit)="onSubmit()">
<mat-form-field appearance="outline" class="full-width">
<mat-label>Private Key</mat-label>
<textarea matInput style="height: 30rem" formControlName="key" placeholder="Enter your private key..."
[errorStateMatcher]="matcher"></textarea>
<textarea
matInput
style="height: 30rem"
formControlName="key"
placeholder="Enter your private key..."
[errorStateMatcher]="matcher"
></textarea>
<div *ngIf="submitted && keyFormStub.key.errors" class="invalid-feedback">
<mat-error *ngIf="keyFormStub.key.errors.required">Private Key is required.</mat-error>
<mat-error *ngIf="keyFormStub.key.errors.required"
>Private Key is required.</mat-error
>
</div>
</mat-form-field>
@ -29,20 +34,24 @@
<span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span>
Add Key
</button>
</form>
</div>
<div id="two" style="display: none" class="card-body p-4 align-items-center">
<div id="two" style="display: none" class="card-body p-4 align-items-center">
<div class="text-center w-75 m-auto">
<h4 id="state" class="text-dark-50 text-center font-weight-bold"></h4>
<button mat-raised-button matRipple color="primary" type="submit" (click)="login()"> Login </button>
<button mat-raised-button matRipple color="primary" type="submit" (click)="login()">
Login
</button>
</div>
<div class="row mt-3">
<div class="col-12 text-center">
<p class="text-muted">Change private key? <a (click)="switchWindows()" class="text-muted ml-1"><b>Enter private key</b></a></p>
</div> <!-- end col-->
<p class="text-muted">
Change private key?
<a (click)="switchWindows()" class="text-muted ml-1"><b>Enter private key</b></a>
</p>
</div>
<!-- end col-->
</div>
<!-- end row -->
</div>

View File

@ -14,30 +14,44 @@
<ol class="breadcrumb">
<li class="breadcrumb-item"><a routerLink="/home">Home</a></li>
<li class="breadcrumb-item"><a routerLink="/accounts">Accounts</a></li>
<li *ngIf="account" class="breadcrumb-item active" aria-current="page">{{account?.vcard?.fn[0].value}}</li>
<li *ngIf="account" class="breadcrumb-item active" aria-current="page">
{{ account?.vcard?.fn[0].value }}
</li>
</ol>
</nav>
<div *ngIf="!account" class="text-center">
<div class="spinner-grow text-primary m-1" role="status" style="width: 3rem; height: 3rem;">
<div class="spinner-grow text-primary m-1" role="status" style="width: 3rem; height: 3rem">
<span class="sr-only">Loading...</span>
</div>
<div class="spinner-grow text-primary m-1" role="status" style="width: 3rem; height: 3rem;">
<div class="spinner-grow text-primary m-1" role="status" style="width: 3rem; height: 3rem">
<span class="sr-only">Loading...</span>
</div>
<div class="spinner-grow text-primary m-1" role="status" style="width: 3rem; height: 3rem;">
<div class="spinner-grow text-primary m-1" role="status" style="width: 3rem; height: 3rem">
<span class="sr-only">Loading...</span>
</div>
</div>
<div *ngIf="account" class="card mb-3">
<div class="row card-body">
<h3>
<strong> {{account?.vcard?.fn[0].value}} </strong>
<strong> {{ account?.vcard?.fn[0].value }} </strong>
</h3>
<span class="ml-auto"><strong>Balance:</strong> {{account?.balance | tokenRatio}} {{ tokenSymbol | uppercase }}</span>
<span class="ml-2"><strong>Created:</strong> {{account?.date_registered | unixDate}}</span>
<span class="ml-2"><strong>Address:</strong>
<a href="{{bloxbergLink}}" target="_blank"> {{accountAddress}} </a>
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress()" alt="Copy">
<span class="ml-auto"
><strong>Balance:</strong> {{ account?.balance | tokenRatio }}
{{ tokenSymbol | uppercase }}</span
>
<span class="ml-2"
><strong>Created:</strong> {{ account?.date_registered | unixDate }}</span
>
<span class="ml-2"
><strong>Address:</strong>
<a href="{{ bloxbergLink }}" target="_blank"> {{ accountAddress }} </a>
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress()"
alt="Copy"
/>
</span>
</div>
</div>
@ -45,85 +59,145 @@
<div class="card-body">
<form [formGroup]="accountInfoForm" (ngSubmit)="saveInfo()">
<div class="row form-inline">
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>First Name: *</mat-label>
<input matInput type="text" id="firstName" placeholder="{{account?.vcard?.fn[0].value.split(' ')[0]}}"
value="{{account?.vcard?.fn[0].value.split(' ')[0]}}" formControlName="firstName" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && accountInfoFormStub.firstName.errors">First Name is required.</mat-error>
<input
matInput
type="text"
id="firstName"
placeholder="{{ account?.vcard?.fn[0].value.split(' ')[0] }}"
value="{{ account?.vcard?.fn[0].value.split(' ')[0] }}"
formControlName="firstName"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && accountInfoFormStub.firstName.errors"
>First Name is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Last Name(s): *</mat-label>
<input matInput type="text" id="lastName" placeholder="{{account?.vcard?.fn[0].value.split(' ').slice(1).join(' ')}}"
value="{{account?.vcard?.fn[0].value.split(' ').slice(1).join(' ')}}" formControlName="lastName" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && accountInfoFormStub.lastName.errors">Last Name is required.</mat-error>
<input
matInput
type="text"
id="lastName"
placeholder="{{ account?.vcard?.fn[0].value.split(' ').slice(1).join(' ') }}"
value="{{ account?.vcard?.fn[0].value.split(' ').slice(1).join(' ') }}"
formControlName="lastName"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && accountInfoFormStub.lastName.errors"
>Last Name is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Phone Number: </mat-label>
<input matInput type="text" id="phoneNumber" placeholder="{{account?.vcard?.tel[0].value}}"
value="{{account?.vcard?.tel[0].value}}" formControlName="phoneNumber" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && accountInfoFormStub.phoneNumber.errors">Phone Number is required.</mat-error>
<input
matInput
type="text"
id="phoneNumber"
placeholder="{{ account?.vcard?.tel[0].value }}"
value="{{ account?.vcard?.tel[0].value }}"
formControlName="phoneNumber"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && accountInfoFormStub.phoneNumber.errors"
>Phone Number is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Age: </mat-label>
<input matInput type="text" id="age" placeholder="{{account?.age}}"
value="{{account?.age}}" formControlName="age" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && accountInfoFormStub.age.errors">Age is required.</mat-error>
<input
matInput
type="text"
id="age"
placeholder="{{ account?.age }}"
value="{{ account?.age }}"
formControlName="age"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && accountInfoFormStub.age.errors"
>Age is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label> ACCOUNT TYPE: </mat-label>
<mat-select id="accountType" [(value)]="account.type" formControlName="type"
[errorStateMatcher]="matcher">
<mat-select
id="accountType"
[(value)]="account.type"
formControlName="type"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let accountType of accountTypes" [value]="accountType">
{{accountType | uppercase}}
{{ accountType | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && accountInfoFormStub.type.errors">Type is required.</mat-error>
<mat-error *ngIf="submitted && accountInfoFormStub.type.errors"
>Type is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Bio: </mat-label>
<input matInput type="text" id="bio" placeholder="{{account?.products}}" value="{{account?.products}}"
formControlName="bio" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && accountInfoFormStub.bio.errors">Bio is required.</mat-error>
<input
matInput
type="text"
id="bio"
placeholder="{{ account?.products }}"
value="{{ account?.products }}"
formControlName="bio"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && accountInfoFormStub.bio.errors"
>Bio is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label> GENDER: </mat-label>
<mat-select id="gender" [(value)]="account.gender" formControlName="gender"
[errorStateMatcher]="matcher">
<mat-select
id="gender"
[(value)]="account.gender"
formControlName="gender"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let gender of genders" [value]="gender">
{{gender | uppercase}}
{{ gender | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && accountInfoFormStub.gender.errors">Gender is required.</mat-error>
<mat-error *ngIf="submitted && accountInfoFormStub.gender.errors"
>Gender is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label> BUSINESS CATEGORY: </mat-label>
<mat-select id="businessCategory" [(value)]="account.category" formControlName="businessCategory"
[errorStateMatcher]="matcher">
<mat-select
id="businessCategory"
[(value)]="account.category"
formControlName="businessCategory"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let category of categories" [value]="category">
{{category | titlecase}}
{{ category | titlecase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && accountInfoFormStub.businessCategory.errors">
@ -135,9 +209,15 @@
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>User Location: </mat-label>
<input matInput type="text" id="userLocation" placeholder="{{account?.location.area_name}}"
value="{{account?.location.area_name}}" formControlName="userLocation"
[errorStateMatcher]="matcher">
<input
matInput
type="text"
id="userLocation"
placeholder="{{ account?.location.area_name }}"
value="{{ account?.location.area_name }}"
formControlName="userLocation"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && accountInfoFormStub.userLocation.errors">
User Location is required.
</mat-error>
@ -147,50 +227,82 @@
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label> LOCATION: </mat-label>
<mat-select id="location" [(value)]="account.location.area" formControlName="location"
[errorStateMatcher]="matcher">
<mat-select
id="location"
[(value)]="account.location.area"
formControlName="location"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let area of areaNames" [value]="area">
{{area | uppercase}}
{{ area | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && accountInfoFormStub.location.errors">Location is required.</mat-error>
<mat-error *ngIf="submitted && accountInfoFormStub.location.errors"
>Location is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label> LOCATION TYPE: </mat-label>
<mat-select id="locationType" [(value)]="account.location.area_type" formControlName="locationType"
[errorStateMatcher]="matcher">
<mat-select
id="locationType"
[(value)]="account.location.area_type"
formControlName="locationType"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let type of areaTypes" [value]="type">
{{type | uppercase}}
{{ type | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && accountInfoFormStub.locationType.errors">Location Type is required.</mat-error>
<mat-error *ngIf="submitted && accountInfoFormStub.locationType.errors"
>Location Type is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary mb-3">
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary mb-3"
>
Add User KYC
</button>
</div>
<div class="col-md-6 col-lg-4">
<button mat-raised-button color="primary" type="button" class="btn btn-outline-success mb-3"
(click)="resetPin()">
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-success mb-3"
(click)="resetPin()"
>
Reset Pin
</button>
</div>
<div class="col-md-6 col-lg-4">
<button mat-raised-button color="warn" type="button" class="btn btn-outline-danger mb-3">
<button
mat-raised-button
color="warn"
type="button"
class="btn btn-outline-danger mb-3"
>
Delete User
</button>
</div>
<div class="col-md-6 col-lg-4">
<button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary">
<button
mat-raised-button
color="primary"
type="submit"
class="btn btn-outline-primary"
>
SAVE DETAILS
</button>
</div>
@ -200,32 +312,32 @@
</div>
<div class="card mb-3">
<mat-card-title class="card-header">
USER
</mat-card-title>
<mat-card-title class="card-header"> USER </mat-card-title>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<caption> 1 user </caption>
<caption>
1 user
</caption>
<thead class="thead-dark">
<tr>
<th scope="col">NAME</th>
<th scope="col">BALANCE</th>
<th scope="col">CREATED</th>
<th scope="col">STATUS</th>
</tr>
<tr>
<th scope="col">NAME</th>
<th scope="col">BALANCE</th>
<th scope="col">CREATED</th>
<th scope="col">STATUS</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{account?.vcard?.fn[0].value}}</td>
<td>{{account?.balance | tokenRatio}} {{ tokenSymbol | uppercase }}</td>
<td>{{account?.date_registered | unixDate}}</td>
<td>
<span class="badge badge-success badge-pill">
{{accountStatus}}
</span>
</td>
</tr>
<tr>
<td>{{ account?.vcard?.fn[0].value }}</td>
<td>{{ account?.balance | tokenRatio }} {{ tokenSymbol | uppercase }}</td>
<td>{{ account?.date_registered | unixDate }}</td>
<td>
<span class="badge badge-success badge-pill">
{{ accountStatus }}
</span>
</td>
</tr>
</tbody>
</table>
</div>
@ -234,135 +346,216 @@
<mat-tab-group *ngIf="account" dynamicHeight mat-align-tabs="start">
<mat-tab label="Transactions">
<app-transaction-details [transaction]="transaction" (closeWindow)="transaction = $event"></app-transaction-details>
<app-transaction-details
[transaction]="transaction"
(closeWindow)="transaction = $event"
></app-transaction-details>
<div class="card mt-1">
<div class="card-header">
<div class="row">
<mat-form-field appearance="outline">
<mat-label> TRANSACTION TYPE </mat-label>
<mat-select id="transferSelect" [(value)]="transactionsType" (selectionChange)="filterTransactions()">
<mat-select
id="transferSelect"
[(value)]="transactionsType"
(selectionChange)="filterTransactions()"
>
<mat-option value="all">ALL TRANSFERS</mat-option>
<mat-option *ngFor="let transactionType of transactionsTypes" [value]="transactionType">
{{transactionType | uppercase}}
<mat-option
*ngFor="let transactionType of transactionsTypes"
[value]="transactionType"
>
{{ transactionType | uppercase }}
</mat-option>
</mat-select>
</mat-form-field>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv(transactions, 'transactions')"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
(click)="downloadCsv(transactions, 'transactions')"
>
EXPORT
</button>
</div>
</div>
<div class="card-body">
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doTransactionFilter($event.target.value)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doTransactionFilter($event.target.value)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<table mat-table class="mat-elevation-z10" [dataSource]="transactionsDataSource" matSort matSortActive="created"
#TransactionTableSort="matSort" matSortDirection="asc" matSortDisableClear>
<table
mat-table
class="mat-elevation-z10"
[dataSource]="transactionsDataSource"
matSort
matSortActive="created"
#TransactionTableSort="matSort"
matSortDirection="asc"
matSortDisableClear
>
<ng-container matColumnDef="sender">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Sender </th>
<td mat-cell *matCellDef="let transaction"> {{transaction?.sender?.vcard.fn[0].value || transaction.from}} </td>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Sender</th>
<td mat-cell *matCellDef="let transaction">
{{ transaction?.sender?.vcard.fn[0].value || transaction.from }}
</td>
</ng-container>
<ng-container matColumnDef="recipient">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Recipient </th>
<td mat-cell *matCellDef="let transaction"> {{transaction?.recipient?.vcard.fn[0].value || transaction.to}} </td>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Recipient</th>
<td mat-cell *matCellDef="let transaction">
{{ transaction?.recipient?.vcard.fn[0].value || transaction.to }}
</td>
</ng-container>
<ng-container matColumnDef="value">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Value </th>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Value</th>
<td mat-cell *matCellDef="let transaction">
<span *ngIf="transaction.type == 'transaction'">{{transaction?.value | tokenRatio}} {{ tokenSymbol | uppercase }}</span>
<span *ngIf="transaction.type == 'conversion'">{{transaction?.toValue | tokenRatio}} {{ tokenSymbol | uppercase }}</span>
<span *ngIf="transaction.type == 'transaction'"
>{{ transaction?.value | tokenRatio }} {{ tokenSymbol | uppercase }}</span
>
<span *ngIf="transaction.type == 'conversion'"
>{{ transaction?.toValue | tokenRatio }} {{ tokenSymbol | uppercase }}</span
>
</td>
</ng-container>
<ng-container matColumnDef="created">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Created </th>
<td mat-cell *matCellDef="let transaction"> {{transaction?.tx.timestamp | unixDate}} </td>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Created</th>
<td mat-cell *matCellDef="let transaction">
{{ transaction?.tx.timestamp | unixDate }}
</td>
</ng-container>
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef mat-sort-header> TYPE </th>
<th mat-header-cell *matHeaderCellDef mat-sort-header>TYPE</th>
<td mat-cell *matCellDef="let transaction">
<span class="badge badge-success badge-pill"> {{transaction?.type}} </span>
<span class="badge badge-success badge-pill"> {{ transaction?.type }} </span>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="transactionsDisplayedColumns"></tr>
<tr mat-row *matRowDef="let transaction; columns: transactionsDisplayedColumns" matRipple
(click)="viewTransaction(transaction)"></tr>
<tr
mat-row
*matRowDef="let transaction; columns: transactionsDisplayedColumns"
matRipple
(click)="viewTransaction(transaction)"
></tr>
</table>
<mat-paginator #TransactionTablePaginator="matPaginator" [pageSize]="transactionsDefaultPageSize"
[pageSizeOptions]="transactionsPageSizeOptions" showFirstLastButtons></mat-paginator>
<mat-paginator
#TransactionTablePaginator="matPaginator"
[pageSize]="transactionsDefaultPageSize"
[pageSizeOptions]="transactionsPageSizeOptions"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</mat-tab>
<mat-tab label="Users">
<div class="card mt-1">
<mat-card-title class="card-header">
Accounts
</mat-card-title>
<mat-card-title class="card-header"> Accounts </mat-card-title>
<div class="card-body">
<div class="row card-header">
<mat-form-field appearance="outline">
<mat-label> ACCOUNT TYPE </mat-label>
<mat-select id="typeSelect" [(value)]="accountsType" (selectionChange)="filterAccounts()">
<mat-select
id="typeSelect"
[(value)]="accountsType"
(selectionChange)="filterAccounts()"
>
<mat-option value="all">ALL</mat-option>
<mat-option *ngFor="let accountType of accountTypes" [value]="accountType">
{{accountType | uppercase}}
{{ accountType | uppercase }}
</mat-option>
</mat-select>
</mat-form-field>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv(accounts, 'accounts')"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
(click)="downloadCsv(accounts, 'accounts')"
>
EXPORT
</button>
</div>
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doUserFilter($event.target.value)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doUserFilter($event.target.value)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<mat-table class="mat-elevation-z10" [dataSource]="userDataSource" matSort #UserTableSort="matSort"
matSortActive="created" matSortDirection="desc" matSortDisableClear>
<mat-table
class="mat-elevation-z10"
[dataSource]="userDataSource"
matSort
#UserTableSort="matSort"
matSortActive="created"
matSortDirection="desc"
matSortDisableClear
>
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.vcard.fn[0].value}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.vcard.fn[0].value }} </mat-cell>
</ng-container>
<ng-container matColumnDef="phone">
<mat-header-cell *matHeaderCellDef mat-sort-header> PHONE NUMBER </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.vcard.tel[0].value}} </mat-cell>
<mat-header-cell *matHeaderCellDef mat-sort-header>
PHONE NUMBER
</mat-header-cell>
<mat-cell *matCellDef="let user"> {{ user?.vcard.tel[0].value }} </mat-cell>
</ng-container>
<ng-container matColumnDef="created">
<mat-header-cell *matHeaderCellDef mat-sort-header> CREATED </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.date_registered | unixDate}} </mat-cell>
<mat-cell *matCellDef="let user">
{{ user?.date_registered | unixDate }}
</mat-cell>
</ng-container>
<ng-container matColumnDef="balance">
<mat-header-cell *matHeaderCellDef mat-sort-header> BALANCE </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.balance | tokenRatio}} {{tokenSymbol | uppercase}} </mat-cell>
<mat-cell *matCellDef="let user">
{{ user?.balance | tokenRatio }} {{ tokenSymbol | uppercase }}
</mat-cell>
</ng-container>
<ng-container matColumnDef="location">
<mat-header-cell *matHeaderCellDef mat-sort-header> LOCATION </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.location.area_name}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.location.area_name }} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef=userDisplayedColumns></mat-header-row>
<mat-row *matRowDef="let account; columns: userDisplayedColumns" (click)="viewAccount(account)"
matRipple></mat-row>
<mat-header-row *matHeaderRowDef="userDisplayedColumns"></mat-header-row>
<mat-row
*matRowDef="let account; columns: userDisplayedColumns"
(click)="viewAccount(account)"
matRipple
></mat-row>
</mat-table>
<mat-paginator #UserTablePaginator="matPaginator" [pageSize]="usersDefaultPageSize"
[pageSizeOptions]="usersPageSizeOptions" showFirstLastButtons></mat-paginator>
<mat-paginator
#UserTablePaginator="matPaginator"
[pageSize]="usersDefaultPageSize"
[pageSizeOptions]="usersPageSizeOptions"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</mat-tab>

View File

@ -18,33 +18,61 @@
</ol>
</nav>
<div class="card">
<mat-card-title class="card-header">
Accounts
</mat-card-title>
<mat-card-title class="card-header"> Accounts </mat-card-title>
<div class="card-body">
<mat-tab-group>
<mat-tab label="Phone Number">
<form [formGroup]="phoneSearchForm" (ngSubmit)="onPhoneSearch()">
<mat-form-field appearance="outline">
<mat-label> Search </mat-label>
<input matInput type="text" placeholder="Search by phone number" formControlName="phoneNumber" [errorStateMatcher]="matcher">
<mat-error *ngIf="phoneSearchSubmitted && phoneSearchFormStub.phoneNumber.errors">Phone Number is required.</mat-error>
<input
matInput
type="text"
placeholder="Search by phone number"
formControlName="phoneNumber"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="phoneSearchSubmitted && phoneSearchFormStub.phoneNumber.errors"
>Phone Number is required.</mat-error
>
<mat-icon matSuffix>phone</mat-icon>
<mat-hint>Phone Number</mat-hint>
</mat-form-field>
<button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3"> SEARCH </button>
<button
mat-raised-button
color="primary"
type="submit"
class="btn btn-outline-primary ml-3"
>
SEARCH
</button>
</form>
</mat-tab>
<mat-tab label="Account Address">
<form [formGroup]="addressSearchForm" (ngSubmit)="onAddressSearch()">
<mat-form-field appearance="outline">
<mat-label> Search </mat-label>
<input matInput type="text" placeholder="Search by account address" formControlName="address" [errorStateMatcher]="matcher">
<mat-error *ngIf="addressSearchSubmitted && addressSearchFormStub.address.errors">Account Address is required.</mat-error>
<input
matInput
type="text"
placeholder="Search by account address"
formControlName="address"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="addressSearchSubmitted && addressSearchFormStub.address.errors"
>Account Address is required.</mat-error
>
<mat-icon matSuffix>view_in_ar</mat-icon>
<mat-hint>Account Address</mat-hint>
</mat-form-field>
<button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3"> SEARCH </button>
<button
mat-raised-button
color="primary"
type="submit"
class="btn btn-outline-primary ml-3"
>
SEARCH
</button>
</form>
</mat-tab>
</mat-tab-group>

View File

@ -17,63 +17,99 @@
</ol>
</nav>
<div class="card">
<mat-card-title class="card-header">
Accounts
</mat-card-title>
<mat-card-title class="card-header"> Accounts </mat-card-title>
<div class="card-body">
<div class="row card-header">
<mat-form-field appearance="outline">
<mat-label> ACCOUNT TYPE </mat-label>
<mat-select id="typeSelect" [(value)]="accountsType" (selectionChange)="filterAccounts()">
<mat-select
id="typeSelect"
[(value)]="accountsType"
(selectionChange)="filterAccounts()"
>
<mat-option value="all">ALL</mat-option>
<mat-option *ngFor="let accountType of accountTypes" [value]="accountType">
{{accountType | uppercase}}
{{ accountType | uppercase }}
</mat-option>
</mat-select>
</mat-form-field>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" routerLink="/accounts/search"> SEARCH </button>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary mr-2" (click)="downloadCsv()"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
routerLink="/accounts/search"
>
SEARCH
</button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary mr-2"
(click)="downloadCsv()"
>
EXPORT
</button>
</div>
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doFilter($event.target.value)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<mat-table class="mat-elevation-z10" [dataSource]="dataSource" matSort matSortActive="created"
matSortDirection="desc" matSortDisableClear>
<mat-table
class="mat-elevation-z10"
[dataSource]="dataSource"
matSort
matSortActive="created"
matSortDirection="desc"
matSortDisableClear
>
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.vcard.fn[0].value}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.vcard.fn[0].value }} </mat-cell>
</ng-container>
<ng-container matColumnDef="phone">
<mat-header-cell *matHeaderCellDef mat-sort-header> PHONE NUMBER </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.vcard.tel[0].value}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.vcard.tel[0].value }} </mat-cell>
</ng-container>
<ng-container matColumnDef="created">
<mat-header-cell *matHeaderCellDef mat-sort-header> CREATED </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.date_registered | unixDate}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.date_registered | unixDate }} </mat-cell>
</ng-container>
<ng-container matColumnDef="balance">
<mat-header-cell *matHeaderCellDef mat-sort-header> BALANCE </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.balance | tokenRatio}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.balance | tokenRatio }} </mat-cell>
</ng-container>
<ng-container matColumnDef="location">
<mat-header-cell *matHeaderCellDef mat-sort-header> LOCATION </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user?.location.area_name}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user?.location.area_name }} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let account; columns: displayedColumns" (click)="viewAccount(account)" matRipple></mat-row>
<mat-row
*matRowDef="let account; columns: displayedColumns"
(click)="viewAccount(account)"
matRipple
></mat-row>
</mat-table>
<mat-paginator [pageSize]="defaultPageSize" [pageSizeOptions]="pageSizeOptions" showFirstLastButtons></mat-paginator>
<mat-paginator
[pageSize]="defaultPageSize"
[pageSizeOptions]="pageSizeOptions"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</div>

View File

@ -18,61 +18,110 @@
</ol>
</nav>
<div class="card">
<mat-card-title class="card-header text-center">
CREATE A USER ACCOUNT
</mat-card-title>
<mat-card-title class="card-header text-center"> CREATE A USER ACCOUNT </mat-card-title>
<div class="card-body">
<form class="row form-inline" [formGroup]="createForm" (ngSubmit)="onSubmit()">
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Account Type: </mat-label>
<mat-select id="accountType" formControlName="accountType" [errorStateMatcher]="matcher">
<mat-select
id="accountType"
formControlName="accountType"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let accountType of accountTypes" [value]="accountType">
{{accountType | uppercase}}
{{ accountType | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && createFormStub.accountType.errors">Account type is required.</mat-error>
</mat-form-field><br>
<mat-error *ngIf="submitted && createFormStub.accountType.errors"
>Account type is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>ID Number: </mat-label>
<input matInput type="text" id="idNumber" placeholder="ID Number" formControlName="idNumber" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && createFormStub.idNumber.errors">ID Number is required.</mat-error>
<input
matInput
type="text"
id="idNumber"
placeholder="ID Number"
formControlName="idNumber"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && createFormStub.idNumber.errors"
>ID Number is required.</mat-error
>
</mat-form-field>
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Phone Number: </mat-label>
<input matInput type="text" id="phoneNumber" placeholder="Phone Number" formControlName="phoneNumber" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && createFormStub.phoneNumber.errors">Phone Number is required.</mat-error>
</mat-form-field><br>
<input
matInput
type="text"
id="phoneNumber"
placeholder="Phone Number"
formControlName="phoneNumber"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && createFormStub.phoneNumber.errors"
>Phone Number is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Given Name(s):* </mat-label>
<input matInput type="text" id="givenNames" placeholder="Given Names" formControlName="givenName" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && createFormStub.givenName.errors">Given Names are required.</mat-error>
</mat-form-field><br>
<input
matInput
type="text"
id="givenNames"
placeholder="Given Names"
formControlName="givenName"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && createFormStub.givenName.errors"
>Given Names are required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Family/Surname: </mat-label>
<input matInput type="text" id="surname" placeholder="Surname" formControlName="surname" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && createFormStub.surname.errors">Surname is required.</mat-error>
</mat-form-field><br>
<input
matInput
type="text"
id="surname"
placeholder="Surname"
formControlName="surname"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && createFormStub.surname.errors"
>Surname is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Directory Entry: </mat-label>
<input matInput type="text" id="directoryEntry" placeholder="Directory Entry" formControlName="directoryEntry" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && createFormStub.directoryEntry.errors">Directory Entry is required.</mat-error>
</mat-form-field><br>
<input
matInput
type="text"
id="directoryEntry"
placeholder="Directory Entry"
formControlName="directoryEntry"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && createFormStub.directoryEntry.errors"
>Directory Entry is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
@ -80,11 +129,13 @@
<mat-label>Location: </mat-label>
<mat-select id="location" formControlName="location" [errorStateMatcher]="matcher">
<mat-option *ngFor="let area of areaNames" [value]="area">
{{area | uppercase}}
{{ area | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && createFormStub.location.errors">Location is required.</mat-error>
</mat-form-field><br>
<mat-error *ngIf="submitted && createFormStub.location.errors"
>Location is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
@ -92,34 +143,59 @@
<mat-label>Gender: </mat-label>
<mat-select id="gender" formControlName="gender" [errorStateMatcher]="matcher">
<mat-option *ngFor="let gender of genders" [value]="gender">
{{gender | uppercase}}
{{ gender | uppercase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && createFormStub.gender.errors">Gender is required.</mat-error>
</mat-form-field><br>
<mat-error *ngIf="submitted && createFormStub.gender.errors"
>Gender is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Referrer Phone Number: </mat-label>
<input matInput type="text" id="referredBy" placeholder="Reffered By" formControlName="referrer" [errorStateMatcher]="matcher">
<mat-error *ngIf="submitted && createFormStub.referrer.errors">Referrer is required.</mat-error>
</mat-form-field><br>
<input
matInput
type="text"
id="referredBy"
placeholder="Reffered By"
formControlName="referrer"
[errorStateMatcher]="matcher"
/>
<mat-error *ngIf="submitted && createFormStub.referrer.errors"
>Referrer is required.</mat-error
> </mat-form-field
><br />
</div>
<div class="col-md-6 col-lg-4">
<mat-form-field appearance="outline">
<mat-label>Business Category: </mat-label>
<mat-select id="businessCategory" formControlName="businessCategory" [errorStateMatcher]="matcher">
<mat-select
id="businessCategory"
formControlName="businessCategory"
[errorStateMatcher]="matcher"
>
<mat-option *ngFor="let category of categories" [value]="category">
{{category | titlecase}}
{{ category | titlecase }}
</mat-option>
</mat-select>
<mat-error *ngIf="submitted && createFormStub.businessCategory.errors">Business Category is required.</mat-error>
<mat-error *ngIf="submitted && createFormStub.businessCategory.errors"
>Business Category is required.</mat-error
>
</mat-form-field>
</div>
<button mat-raised-button color="primary" type="submit" class="btn btn-outline-primary ml-3" (click)="onSubmit()">Submit</button>
<button
mat-raised-button
color="primary"
type="submit"
class="btn btn-outline-primary ml-3"
(click)="onSubmit()"
>
Submit
</button>
</form>
</div>
</div>

View File

@ -20,19 +20,30 @@
<mat-card-title class="card-header">
<div class="row">
Actions
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
(click)="downloadCsv()"
>
EXPORT
</button>
</div>
</mat-card-title>
<div class="card-body">
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doFilter($event.target.value)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<mat-table class="mat-elevation-z10" [dataSource]="dataSource" multiTemplateDataRows>
<!-- Expand Column -->
<ng-container matColumnDef="expand">
<mat-header-cell *matHeaderCellDef> Expand </mat-header-cell>
@ -44,32 +55,52 @@
<ng-container matColumnDef="user">
<mat-header-cell *matHeaderCellDef> NAME </mat-header-cell>
<mat-cell *matCellDef="let action"> {{action.user}} </mat-cell>
<mat-cell *matCellDef="let action"> {{ action.user }} </mat-cell>
</ng-container>
<ng-container matColumnDef="role">
<mat-header-cell *matHeaderCellDef> ROLE </mat-header-cell>
<mat-cell *matCellDef="let action"> {{action.role}} </mat-cell>
<mat-cell *matCellDef="let action"> {{ action.role }} </mat-cell>
</ng-container>
<ng-container matColumnDef="action">
<mat-header-cell *matHeaderCellDef> ACTION </mat-header-cell>
<mat-cell *matCellDef="let action"> {{action.action}} </mat-cell>
<mat-cell *matCellDef="let action"> {{ action.action }} </mat-cell>
</ng-container>
<ng-container matColumnDef="status">
<mat-header-cell *matHeaderCellDef> STATUS </mat-header-cell>
<mat-cell *matCellDef="let action">
<span *ngIf="action.approval == true" class="badge badge-success badge-pill"> {{approvalStatus(action.approval)}} </span>
<span *ngIf="action.approval == false" class="badge badge-danger badge-pill"> {{approvalStatus(action.approval)}} </span>
<span *ngIf="action.approval == true" class="badge badge-success badge-pill">
{{ approvalStatus(action.approval) }}
</span>
<span *ngIf="action.approval == false" class="badge badge-danger badge-pill">
{{ approvalStatus(action.approval) }}
</span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="approve">
<mat-header-cell *matHeaderCellDef> APPROVE </mat-header-cell>
<mat-cell *matCellDef="let action">
<button mat-raised-button color="primary" *ngIf="!action.approval" class="btn btn-outline-success" (click)="approveAction(action)"> Approve </button>
<button mat-raised-button color="warn" *ngIf="action.approval" class="btn btn-outline-danger" (click)="disapproveAction(action)"> Disapprove </button>
<button
mat-raised-button
color="primary"
*ngIf="!action.approval"
class="btn btn-outline-success"
(click)="approveAction(action)"
>
Approve
</button>
<button
mat-raised-button
color="warn"
*ngIf="action.approval"
class="btn btn-outline-danger"
(click)="disapproveAction(action)"
>
Disapprove
</button>
</mat-cell>
</ng-container>
@ -77,22 +108,37 @@
<ng-container matColumnDef="expandedDetail">
<mat-cell *matCellDef="let action">
<div>
<span><strong>Staff Name:</strong> {{action.user}}</span><br>
<span><strong>Role:</strong> {{action.role}}</span><br>
<span><strong>Action Details:</strong> {{action.action}}</span><br>
<span><strong>Approval Status:</strong> {{action.approval}}</span><br>
<span><strong>Staff Name:</strong> {{ action.user }}</span
><br />
<span><strong>Role:</strong> {{ action.role }}</span
><br />
<span><strong>Action Details:</strong> {{ action.action }}</span
><br />
<span><strong>Approval Status:</strong> {{ action.approval }}</span
><br />
</div>
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;" matRipple class="element-row"
[class.expanded]="row.isExpanded"></mat-row>
<mat-row *matRowDef="let row; columns: ['expandedDetail'];"
[@detailExpand]="row.isExpanded == true ? 'expanded': 'collapsed'" style="overflow: hidden"></mat-row>
<mat-row
*matRowDef="let row; columns: displayedColumns"
matRipple
class="element-row"
[class.expanded]="row.isExpanded"
></mat-row>
<mat-row
*matRowDef="let row; columns: ['expandedDetail']"
[@detailExpand]="row.isExpanded == true ? 'expanded' : 'collapsed'"
style="overflow: hidden"
></mat-row>
</mat-table>
<mat-paginator [pageSize]="10" [pageSizeOptions]="[10, 20, 50, 100]" showFirstLastButtons></mat-paginator>
<mat-paginator
[pageSize]="10"
[pageSizeOptions]="[10, 20, 50, 100]"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</div>
@ -102,4 +148,3 @@
<!-- End Page content -->
<!-- ============================================================== -->
</div>

View File

@ -16,10 +16,16 @@
</ol>
</nav>
<div class="embed-responsive embed-responsive-16by9">
<iframe class="embed-responsive-item" [src]="url | safe" allow="fullscreen" loading="lazy"
title="Community inclusion currencies dashboard" referrerpolicy="no-referrer">
<iframe
class="embed-responsive-item"
[src]="url | safe"
allow="fullscreen"
loading="lazy"
title="Community inclusion currencies dashboard"
referrerpolicy="no-referrer"
>
<p>
<a href="{{url}}"> Your browser does not support iframes. </a>
<a href="{{ url }}"> Your browser does not support iframes. </a>
</p>
</iframe>
</div>

View File

@ -26,19 +26,31 @@
<form [formGroup]="organizationForm" (ngSubmit)="onSubmit()">
<mat-form-field appearance="outline">
<mat-label>Default Disbursement *</mat-label>
<input matInput type="text" id="amount" placeholder="Amount" formControlName="disbursement"
[errorStateMatcher]="matcher">
<input
matInput
type="text"
id="amount"
placeholder="Amount"
formControlName="disbursement"
[errorStateMatcher]="matcher"
/>
<span matSuffix>RCU</span>
<mat-error *ngIf="submitted && organizationFormStub.disbursement.errors">
Default Disbursement is required.
</mat-error>
</mat-form-field>
<div class="form-group form-check">
<mat-checkbox id="transferCard" formControlName="transfer">Require Transfer Card *</mat-checkbox>
<mat-checkbox id="transferCard" formControlName="transfer"
>Require Transfer Card *</mat-checkbox
>
</div>
<mat-form-field appearance="outline">
<mat-label>Default Country Code *</mat-label>
<mat-select id="countryCode" formControlName="countryCode" [errorStateMatcher]="matcher">
<mat-select
id="countryCode"
formControlName="countryCode"
[errorStateMatcher]="matcher"
>
<mat-option value="KE">KE Kenya</mat-option>
<mat-option value="US">US United States</mat-option>
<mat-option value="ETH">ETH Ethiopia</mat-option>
@ -47,9 +59,11 @@
</mat-select>
<mat-error *ngIf="submitted && organizationFormStub.countryCode.errors">
Country Code is required.
</mat-error>
</mat-form-field><br>
<button mat-raised-button color="primary" type="submit" class="btn btn-primary">Submit</button>
</mat-error> </mat-form-field
><br />
<button mat-raised-button color="primary" type="submit" class="btn btn-primary">
Submit
</button>
</form>
</div>
</div>

View File

@ -19,16 +19,14 @@
<div class="row">
<div class="col-md-6 mb-2">
<div class="card">
<mat-card-title class="card-header text-center">
SETTINGS
</mat-card-title>
<mat-card-title class="card-header text-center"> SETTINGS </mat-card-title>
<div class="card-body">
<h4>CICADA Admin Credentials</h4>
<span><strong>UserId: </strong> {{ userInfo?.userid }} </span><br>
<span><strong>Username: </strong> {{ userInfo?.name }} </span><br>
<span><strong>UserId: </strong> {{ userInfo?.userid }} </span><br />
<span><strong>Username: </strong> {{ userInfo?.name }} </span><br />
<span><strong>Email: </strong> {{ userInfo?.email }} </span>
</div>
<hr>
<hr />
<div class="card-body">
<h4>Organization Settings</h4>
<a routerLink="/settings/organization"><i>Update your organization settings</i></a>
@ -37,21 +35,27 @@
</div>
<div class="col-md-6 mb-2">
<div class="card">
<mat-card-title class="card-header text-center">
ACCOUNT MANAGEMENT
</mat-card-title>
<mat-card-title class="card-header text-center"> ACCOUNT MANAGEMENT </mat-card-title>
<div class="card-body">
<h4>Change Password</h4>
<a routerLink="/settings"><i>Change your account password</i></a>
</div>
<hr>
<hr />
<div class="card-body">
<h4>Two-step authentication</h4>
<a routerLink="/settings"><i>Secure your account with two step verification</i></a>
</div>
<hr>
<hr />
<div class="card-body">
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary" (click)="logout()"> LOGOUT ADMIN </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary"
(click)="logout()"
>
LOGOUT ADMIN
</button>
</div>
</div>
</div>
@ -60,39 +64,60 @@
<mat-card-title class="card-header">
<div class="row">
TRUSTED USERS
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
(click)="downloadCsv()"
>
EXPORT
</button>
</div>
</mat-card-title>
<div class="card-body">
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doFilter($event.target.value)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<mat-table class="mat-elevation-z10" [dataSource]="dataSource" matSort matSortActive="name"
matSortDirection="asc" matSortDisableClear>
<mat-table
class="mat-elevation-z10"
[dataSource]="dataSource"
matSort
matSortActive="name"
matSortDirection="asc"
matSortDisableClear
>
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.name}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user.name }} </mat-cell>
</ng-container>
<ng-container matColumnDef="email">
<mat-header-cell *matHeaderCellDef mat-sort-header> EMAIL </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.email}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user.email }} </mat-cell>
</ng-container>
<ng-container matColumnDef="userId">
<mat-header-cell *matHeaderCellDef mat-sort-header> USER ID </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.userid}} </mat-cell>
<mat-cell *matCellDef="let user"> {{ user.userid }} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let user; columns: displayedColumns"></mat-row>
</mat-table>
<mat-paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 20, 50, 100]" showFirstLastButtons></mat-paginator>
<mat-paginator
[pageSize]="5"
[pageSizeOptions]="[5, 10, 20, 50, 100]"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</div>

View File

@ -3,32 +3,43 @@
<mat-card-title class="card-header">
<div class="row">
TOKEN DETAILS
<button mat-raised-button type="button" class="btn btn-outline-secondary ml-auto mr-2" (click)="close()"> CLOSE </button>
<button
mat-raised-button
type="button"
class="btn btn-outline-secondary ml-auto mr-2"
(click)="close()"
>
CLOSE
</button>
</div>
</mat-card-title>
<div class="card-body">
<div>
<span><strong>Name:</strong> {{token?.name}}</span>
<span><strong>Name:</strong> {{ token?.name }}</span>
</div>
<div>
<span><strong>Symbol:</strong> {{token?.symbol}}</span>
<span><strong>Symbol:</strong> {{ token?.symbol }}</span>
</div>
<div>
<span><strong>Address:</strong> {{token?.address}}</span>
<span><strong>Address:</strong> {{ token?.address }}</span>
</div>
<div>
<span><strong>Details:</strong> A community inclusive currency for trading among lower to middle income societies.</span>
<span
><strong>Details:</strong> A community inclusive currency for trading among lower to
middle income societies.</span
>
</div>
<div>
<span><strong>Supply:</strong> {{token?.supply | tokenRatio}}</span>
</div><br>
<span><strong>Supply:</strong> {{ token?.supply | tokenRatio }}</span>
</div>
<br />
<div>
<h2>Reserve</h2>
<div>
<span><strong>Weight:</strong> {{token?.reserveRatio}}</span>
<span><strong>Weight:</strong> {{ token?.reserveRatio }}</span>
</div>
<div>
<span><strong>Owner:</strong> {{token?.owner}}</span>
<span><strong>Owner:</strong> {{ token?.owner }}</span>
</div>
</div>
</div>

View File

@ -20,45 +20,71 @@
<mat-card-title class="card-header">
<div class="row">
Tokens
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
(click)="downloadCsv()"
>
EXPORT
</button>
</div>
</mat-card-title>
<div class="card-body">
<app-token-details [token]="token" (closeWindow)="token = $event"></app-token-details>
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doFilter($event.target.value)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doFilter($event.target.value)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<mat-table class="mat-elevation-z10 table-responsive" [dataSource]="dataSource" matSort matSortDirection="asc" matSortDisableClear>
<mat-table
class="mat-elevation-z10 table-responsive"
[dataSource]="dataSource"
matSort
matSortDirection="asc"
matSortDisableClear
>
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
<mat-cell *matCellDef="let token"> {{token.name}} </mat-cell>
<mat-cell *matCellDef="let token"> {{ token.name }} </mat-cell>
</ng-container>
<ng-container matColumnDef="symbol">
<mat-header-cell *matHeaderCellDef mat-sort-header> Symbol </mat-header-cell>
<mat-cell *matCellDef="let token"> {{token.symbol}} </mat-cell>
<mat-cell *matCellDef="let token"> {{ token.symbol }} </mat-cell>
</ng-container>
<ng-container matColumnDef="address">
<mat-header-cell *matHeaderCellDef mat-sort-header> Address </mat-header-cell>
<mat-cell *matCellDef="let token"> {{token.address}} </mat-cell>
<mat-cell *matCellDef="let token"> {{ token.address }} </mat-cell>
</ng-container>
<ng-container matColumnDef="supply">
<mat-header-cell *matHeaderCellDef mat-sort-header> Supply </mat-header-cell>
<mat-cell *matCellDef="let token"> {{token.supply | tokenRatio}} </mat-cell>
<mat-cell *matCellDef="let token"> {{ token.supply | tokenRatio }} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="columnsToDisplay"></mat-header-row>
<mat-row *matRowDef="let token; columns: columnsToDisplay" (click)="viewToken(token)" matRipple></mat-row>
<mat-row
*matRowDef="let token; columns: columnsToDisplay"
(click)="viewToken(token)"
matRipple
></mat-row>
</mat-table>
<mat-paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 25, 100]" showFirstLastButtons></mat-paginator>
<mat-paginator
[pageSize]="5"
[pageSizeOptions]="[5, 10, 25, 100]"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</div>
@ -68,4 +94,3 @@
<!-- End Page content -->
<!-- ============================================================== -->
</div>

View File

@ -3,43 +3,86 @@
<mat-card-title class="card-header">
<div class="row">
TRANSACTION DETAILS
<button mat-raised-button type="button" class="btn btn-outline-secondary ml-auto mr-2" (click)="close()"> CLOSE </button>
<button
mat-raised-button
type="button"
class="btn btn-outline-secondary ml-auto mr-2"
(click)="close()"
>
CLOSE
</button>
</div>
</mat-card-title>
<div *ngIf="transaction.type == 'transaction'" class="card-body">
<div class="row">
<div class="col-md-6">
<h4>Exchange: </h4>
<h4>Exchange:</h4>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<span>Sender: {{transaction.sender?.vcard.fn[0].value}}</span><br><br>
<span>Sender: {{ transaction.sender?.vcard.fn[0].value }}</span
><br /><br />
<span>
Sender Address:
<a href="{{senderBloxbergLink}}" target="_blank"> {{transaction.from}} </a>
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress(transaction.from)" alt="Copy">
</span><br><br>
<button mat-raised-button color="primary" class="btn btn-outline-info" (click)="viewSender()">View Sender</button>
<a href="{{ senderBloxbergLink }}" target="_blank"> {{ transaction.from }} </a>
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress(transaction.from)"
alt="Copy"
/> </span
><br /><br />
<button
mat-raised-button
color="primary"
class="btn btn-outline-info"
(click)="viewSender()"
>
View Sender
</button>
</li>
<li class="list-group-item">
<span>Recipient: {{transaction.recipient?.vcard.fn[0].value}}</span><br><br>
<span>Recipient: {{ transaction.recipient?.vcard.fn[0].value }}</span
><br /><br />
<span>
Recipient Address:
<a href="{{recipientBloxbergLink}}" target="_blank"> {{transaction.to}} </a>
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress(transaction.to)" alt="Copy">
</span><br><br>
<button mat-raised-button color="primary" class="btn btn-outline-info" (click)="viewRecipient()">View Recipient</button>
<a href="{{ recipientBloxbergLink }}" target="_blank"> {{ transaction.to }} </a>
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress(transaction.to)"
alt="Copy"
/> </span
><br /><br />
<button
mat-raised-button
color="primary"
class="btn btn-outline-info"
(click)="viewRecipient()"
>
View Recipient
</button>
</li>
<li class="list-group-item">
<span>Amount: {{transaction.value | tokenRatio}} {{ tokenSymbol | uppercase }}</span>
<span
>Amount: {{ transaction.value | tokenRatio }} {{ tokenSymbol | uppercase }}</span
>
</li>
</ul>
<h4 class="mt-2">Token: </h4>
<h4 class="mt-2">Token:</h4>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<span>
Address:
{{transaction.token._address}}
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress(transaction.token._address)" alt="Copy">
{{ transaction.token._address }}
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress(transaction.token._address)"
alt="Copy"
/>
</span>
</li>
<li class="list-group-item">
@ -51,97 +94,140 @@
</ul>
</div>
<div class="col-md-6">
<h4>Transaction: </h4>
<h4>Transaction:</h4>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<span>Block: {{transaction.tx.block}}</span>
<span>Block: {{ transaction.tx.block }}</span>
</li>
<li class="list-group-item">
<span>Index: {{transaction.tx.txIndex}}</span>
<span>Index: {{ transaction.tx.txIndex }}</span>
</li>
<li class="list-group-item">
<span>Hash: {{transaction.tx.txHash}}</span>
<span>Hash: {{ transaction.tx.txHash }}</span>
</li>
<li class="list-group-item">
<span>Success: {{transaction.tx.success}}</span>
<span>Success: {{ transaction.tx.success }}</span>
</li>
<li class="list-group-item">
<span>Timestamp: {{transaction.tx.timestamp | unixDate}}</span>
<span>Timestamp: {{ transaction.tx.timestamp | unixDate }}</span>
</li>
</ul><br>
</ul>
<br />
<div class="mb-3">
<button mat-raised-button color="primary" type="button" class="btn btn-outline-success">Resend SMS</button>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-success">
Resend SMS
</button>
</div>
<div>
<button mat-raised-button color="warn" type="button" class="btn btn-outline-danger">Reverse Transaction</button>
<button mat-raised-button color="warn" type="button" class="btn btn-outline-danger">
Reverse Transaction
</button>
</div>
</div>
</div>
</div>
<div *ngIf="transaction.type == 'conversion'" class="card-body">
<h3>Exchange: </h3>
<h3>Exchange:</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<span><strong>Trader: {{transaction.sender?.vcard.fn[0].value}}</strong></span>
<span
><strong>Trader: {{ transaction.sender?.vcard.fn[0].value }}</strong></span
>
</li>
<li class="list-group-item">
<span>
Trader Address:
<a href="{{traderBloxbergLink}}" target="_blank"> {{transaction.trader}} </a>
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress(transaction.trader)" alt="Copy">
<a href="{{ traderBloxbergLink }}" target="_blank"> {{ transaction.trader }} </a>
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress(transaction.trader)"
alt="Copy"
/>
</span>
</li>
</ul>
<button mat-raised-button color="primary" class="btn btn-outline-info" (click)="viewTrader()">View Trader</button>
<br><br>
<button mat-raised-button color="primary" class="btn btn-outline-info" (click)="viewTrader()">
View Trader
</button>
<br /><br />
<div class="row">
<div class="col-md-6">
<h4>Source Token: </h4>
<h4>Source Token:</h4>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<span>
Address:
{{transaction.sourceToken.address}}
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress(transaction.sourceToken.address)" alt="Copy">
{{ transaction.sourceToken.address }}
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress(transaction.sourceToken.address)"
alt="Copy"
/>
</span>
</li>
<li class="list-group-item">
<span>Name: {{transaction.sourceToken.name}}</span>
<span>Name: {{ transaction.sourceToken.name }}</span>
</li>
<li class="list-group-item">
<span>Symbol: {{transaction.sourceToken.symbol | uppercase}}</span>
<span>Symbol: {{ transaction.sourceToken.symbol | uppercase }}</span>
</li>
<li class="list-group-item">
<span>Amount: {{transaction.fromValue}} {{transaction.sourceToken.symbol | uppercase}}</span>
<span
>Amount: {{ transaction.fromValue }}
{{ transaction.sourceToken.symbol | uppercase }}</span
>
</li>
</ul>
</div>
<div class="col-md-6">
<h4>Destination Token: </h4>
<h4>Destination Token:</h4>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<span>
Address:
{{transaction.destinationToken.address}}
<img src="assets/images/checklist.svg" class="ml-2" height="20rem" (click)="copyAddress(transaction.destinationToken.address)" alt="Copy">
{{ transaction.destinationToken.address }}
<img
src="assets/images/checklist.svg"
class="ml-2"
height="20rem"
(click)="copyAddress(transaction.destinationToken.address)"
alt="Copy"
/>
</span>
</li>
<li class="list-group-item">
<span>Name: {{transaction.destinationToken.name}}</span>
<span>Name: {{ transaction.destinationToken.name }}</span>
</li>
<li class="list-group-item">
<span>Symbol: {{transaction.destinationToken.symbol | uppercase}}</span>
<span>Symbol: {{ transaction.destinationToken.symbol | uppercase }}</span>
</li>
<li class="list-group-item">
<span>Amount: {{transaction.toValue}} {{transaction.destinationToken.symbol | uppercase}}</span>
<span
>Amount: {{ transaction.toValue }}
{{ transaction.destinationToken.symbol | uppercase }}</span
>
</li>
</ul>
</div>
<div class="col-md-6">
<button mat-raised-button color="primary" type="button" class="btn btn-outline-success">Resend SMS</button>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-success">
Resend SMS
</button>
</div>
<div class="col-md-6">
<button mat-raised-button color="warn" type="button" class="btn btn-outline-danger ml-2" (click)="reverseTransaction()">Reverse Transaction</button>
<button
mat-raised-button
color="warn"
type="button"
class="btn btn-outline-danger ml-2"
(click)="reverseTransaction()"
>
Reverse Transaction
</button>
</div>
</div>
</div>

View File

@ -17,71 +17,114 @@
</ol>
</nav>
<div class="card">
<mat-card-title class="card-header">
Transfers
</mat-card-title>
<mat-card-title class="card-header"> Transfers </mat-card-title>
<div class="card-body">
<app-transaction-details [transaction]="transaction" (closeWindow)="transaction = $event"></app-transaction-details>
<app-transaction-details
[transaction]="transaction"
(closeWindow)="transaction = $event"
></app-transaction-details>
<div class="row card-header">
<mat-form-field appearance="outline">
<mat-label> TRANSFER TYPE </mat-label>
<mat-select id="typeSelect" [(value)]="transactionsType" (selectionChange)="filterTransactions()">
<mat-select
id="typeSelect"
[(value)]="transactionsType"
(selectionChange)="filterTransactions()"
>
<mat-option value="all">ALL TRANSFERS</mat-option>
<mat-option *ngFor="let transactionType of transactionsTypes" [value]="transactionType">
{{transactionType | uppercase}}
<mat-option
*ngFor="let transactionType of transactionsTypes"
[value]="transactionType"
>
{{ transactionType | uppercase }}
</mat-option>
</mat-select>
</mat-form-field>
<button mat-raised-button color="primary" type="button" class="btn btn-outline-primary ml-auto mr-2" (click)="downloadCsv()"> EXPORT </button>
<button
mat-raised-button
color="primary"
type="button"
class="btn btn-outline-primary ml-auto mr-2"
(click)="downloadCsv()"
>
EXPORT
</button>
</div>
<mat-form-field appearance="outline">
<mat-label> Filter </mat-label>
<input matInput type="text" (keyup)="doFilter($event.target.value, transactionDataSource)" placeholder="Filter">
<input
matInput
type="text"
(keyup)="doFilter($event.target.value, transactionDataSource)"
placeholder="Filter"
/>
<mat-icon matSuffix>search</mat-icon>
</mat-form-field>
<table mat-table class="mat-elevation-z10" [dataSource]="transactionDataSource" matSort matSortActive="created"
matSortDirection="desc" matSortDisableClear>
<table
mat-table
class="mat-elevation-z10"
[dataSource]="transactionDataSource"
matSort
matSortActive="created"
matSortDirection="desc"
matSortDisableClear
>
<ng-container matColumnDef="sender">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Sender </th>
<td mat-cell *matCellDef="let transaction"> {{transaction?.sender?.vcard.fn[0].value || transaction.from}} </td>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Sender</th>
<td mat-cell *matCellDef="let transaction">
{{ transaction?.sender?.vcard.fn[0].value || transaction.from }}
</td>
</ng-container>
<ng-container matColumnDef="recipient">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Recipient </th>
<td mat-cell *matCellDef="let transaction"> {{transaction?.recipient?.vcard.fn[0].value || transaction.to}} </td>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Recipient</th>
<td mat-cell *matCellDef="let transaction">
{{ transaction?.recipient?.vcard.fn[0].value || transaction.to }}
</td>
</ng-container>
<ng-container matColumnDef="value">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Value </th>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Value</th>
<td mat-cell *matCellDef="let transaction">
<span *ngIf="transaction.type == 'transaction'">{{transaction?.value | tokenRatio}} {{ tokenSymbol | uppercase }}</span>
<span *ngIf="transaction.type == 'conversion'">{{transaction?.toValue | tokenRatio}} {{ tokenSymbol | uppercase }}</span>
<span *ngIf="transaction.type == 'transaction'"
>{{ transaction?.value | tokenRatio }} {{ tokenSymbol | uppercase }}</span
>
<span *ngIf="transaction.type == 'conversion'"
>{{ transaction?.toValue | tokenRatio }} {{ tokenSymbol | uppercase }}</span
>
</td>
</ng-container>
<ng-container matColumnDef="created">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Created </th>
<td mat-cell *matCellDef="let transaction"> {{transaction?.tx.timestamp | unixDate}} </td>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Created</th>
<td mat-cell *matCellDef="let transaction">
{{ transaction?.tx.timestamp | unixDate }}
</td>
</ng-container>
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef mat-sort-header> TYPE </th>
<th mat-header-cell *matHeaderCellDef mat-sort-header>TYPE</th>
<td mat-cell *matCellDef="let transaction">
<span class="badge badge-success badge-pill"> {{transaction?.type}} </span>
<span class="badge badge-success badge-pill"> {{ transaction?.type }} </span>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="transactionDisplayedColumns"></tr>
<tr mat-row *matRowDef="let transaction; columns: transactionDisplayedColumns;" (click)="viewTransaction(transaction)"></tr>
<tr
mat-row
*matRowDef="let transaction; columns: transactionDisplayedColumns"
(click)="viewTransaction(transaction)"
></tr>
</table>
<mat-paginator [pageSize]="defaultPageSize" [pageSizeOptions]="pageSizeOptions" showFirstLastButtons></mat-paginator>
<mat-paginator
[pageSize]="defaultPageSize"
[pageSizeOptions]="pageSizeOptions"
showFirstLastButtons
></mat-paginator>
</div>
</div>
</div>
@ -91,5 +134,3 @@
<!-- End Page content -->
<!-- ============================================================== -->
</div>

View File

@ -1,10 +1,6 @@
<div>
<div>
<p>
Message: {{ data.message }}
</p>
<p *ngIf="data.status">
Status: {{ data?.status }}
</p>
<p>Message: {{ data.message }}</p>
<p *ngIf="data.status">Status: {{ data?.status }}</p>
</div>
</div>

View File

@ -1,8 +1,10 @@
<!-- Footer Start -->
<footer class="footer">
<a target="blank" title="GPL-3" href="https://www.gnu.org/licenses/gpl-3.0.en.html"> Copyleft </a> 🄯.
<a target="blank" title="GPL-3" href="https://www.gnu.org/licenses/gpl-3.0.en.html"> Copyleft </a>
🄯.
{{ currentYear }}
<a target="blank" title="Gitlab@GrassrootsEconomics" href="https://gitlab.com/grassrootseconomics"><u> Grassroots Economics </u></a>
<a target="blank" title="Gitlab@GrassrootsEconomics" href="https://gitlab.com/grassrootseconomics"
><u> Grassroots Economics </u></a
>
</footer>
<!-- end Footer -->

View File

@ -1,13 +1,13 @@
<nav class="navbar navbar-dark background-dark">
<h1 class="navbar-brand">
<div *ngIf="noInternetConnection; then offlineBlock else onlineBlock"></div>
<div *ngIf="noInternetConnection; then offlineBlock; else onlineBlock"></div>
<ng-template #offlineBlock>
<strong style="color: red;">OFFLINE </strong>
<img width="20rem" src="assets/images/no-wifi.svg" alt="Internet Disconnected">
<strong style="color: red">OFFLINE </strong>
<img width="20rem" src="assets/images/no-wifi.svg" alt="Internet Disconnected" />
</ng-template>
<ng-template #onlineBlock>
<strong style="color: lawngreen;">ONLINE </strong>
<img width="20rem" src="assets/images/wifi.svg" alt="Internet Connected">
<strong style="color: lawngreen">ONLINE </strong>
<img width="20rem" src="assets/images/wifi.svg" alt="Internet Connected" />
</ng-template>
</h1>
</nav>

View File

@ -2,10 +2,9 @@
<div id="sidebar">
<app-network-status></app-network-status>
<nav>
<div class="sidebar-header">
<h3>
<img class="full-width" src="assets/images/CIC-Logo-white.png" alt="CIC Admin Dashboard">
<img class="full-width" src="assets/images/CIC-Logo-white.png" alt="CIC Admin Dashboard" />
</h3>
<strong>CICADA</strong>
</div>

View File

@ -1,7 +1,13 @@
<!-- Topbar Start -->
<nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top">
<div class="container-fluid">
<button type="button" id="sidebarCollapse" class="navbar-btn menutoggle" aria-label="Sidebar toggle" appMenuToggle>
<button
type="button"
id="sidebarCollapse"
class="navbar-btn menutoggle"
aria-label="Sidebar toggle"
appMenuToggle
>
<span></span>
<span></span>
<span></span>

View File

@ -1,52 +1,187 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>CICADA</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta content="A fully featured admin client for managing users and transactions in the CIC network." name="description"/>
<meta content="Spencer Ofwiti" name="author"/>
<link rel="icon" type="image/x-icon" href="assets/icons/manifest-icon-512.png">
<link rel="apple-touch-icon" href="assets/icons/apple-icon-180.png">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2048-2732.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2732-2048.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1668-2388.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2388-1668.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1536-2048.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2048-1536.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1668-2224.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2224-1668.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1620-2160.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2160-1620.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1284-2778.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2778-1284.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1170-2532.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2532-1170.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1125-2436.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2436-1125.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1242-2688.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2688-1242.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-828-1792.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1792-828.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1242-2208.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2208-1242.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-750-1334.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1334-750.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-640-1136.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1136-640.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500&amp;display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="manifest" href="manifest.webmanifest">
<meta name="theme-color" content="#313a46">
</head>
<body class="mat-typography">
<app-root></app-root>
<script async src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script async src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script async src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"></script>
</body>
<head>
<meta charset="utf-8" />
<title>CICADA</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
content="A fully featured admin client for managing users and transactions in the CIC network."
name="description"
/>
<meta content="Spencer Ofwiti" name="author" />
<link rel="icon" type="image/x-icon" href="assets/icons/manifest-icon-512.png" />
<link rel="apple-touch-icon" href="assets/icons/apple-icon-180.png" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2048-2732.jpg"
media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2732-2048.jpg"
media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1668-2388.jpg"
media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2388-1668.jpg"
media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1536-2048.jpg"
media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2048-1536.jpg"
media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1668-2224.jpg"
media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2224-1668.jpg"
media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1620-2160.jpg"
media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2160-1620.jpg"
media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1284-2778.jpg"
media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2778-1284.jpg"
media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1170-2532.jpg"
media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2532-1170.jpg"
media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1125-2436.jpg"
media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2436-1125.jpg"
media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1242-2688.jpg"
media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2688-1242.jpg"
media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-828-1792.jpg"
media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1792-828.jpg"
media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1242-2208.jpg"
media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-2208-1242.jpg"
media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-750-1334.jpg"
media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1334-750.jpg"
media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-640-1136.jpg"
media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
/>
<link
rel="apple-touch-startup-image"
href="assets/icons/apple-splash-1136-640.jpg"
media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css"
integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
crossorigin="anonymous"
/>
<link
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500&amp;display=swap"
rel="stylesheet"
/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
<link rel="manifest" href="manifest.webmanifest" />
<meta name="theme-color" content="#313a46" />
</head>
<body class="mat-typography">
<app-root></app-root>
<script
async
src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"
></script>
<script
async
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"
integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN"
crossorigin="anonymous"
></script>
<script
async
src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js"
integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s"
crossorigin="anonymous"
></script>
</body>
</html>

View File

@ -8,5 +8,6 @@ if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch((err) => console.error(err));

View File

@ -55,8 +55,7 @@
/***************************************************************************************************
* Zone JS is required by default for Angular itself.
*/
import 'zone.js/dist/zone'; // Included with Angular CLI.
import 'zone.js/dist/zone'; // Included with Angular CLI.
/***************************************************************************************************
* APPLICATION IMPORTS

View File

@ -6,11 +6,13 @@
/* Visual */
/* Misc */
}
@import "~bootstrap/dist/css/bootstrap.css";
@import "https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap";
@import '~bootstrap/dist/css/bootstrap.css';
@import 'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap';
html,
body { height: 100%; }
body {
height: 100%;
}
body {
margin: 0;
@ -35,7 +37,7 @@ a:hover,
a:focus {
text-decoration: none;
color: inherit;
transition: all .3s;
transition: all 0.3s;
}
.wrapper {
@ -50,15 +52,19 @@ a:focus {
ul ul a {
padding-left: 30px;
font-size: .9em;
font-size: 0.9em;
background: #6d7fcc;
}
.full-width,
table { width: 100%; }
table {
width: 100%;
}
li.breadcrumb-item.active,
footer.footer { color: black; }
footer.footer {
color: black;
}
.clipboard {
position: absolute;
@ -91,9 +97,13 @@ footer.footer { color: black; }
}
#sidebar .sidebar-header strong,
#sidebar.active .sidebar-header h3 { display: none; }
#sidebar.active .sidebar-header h3 {
display: none;
}
#sidebar.active .sidebar-header strong { display: block; }
#sidebar.active .sidebar-header strong {
display: block;
}
#sidebar ul li a {
display: block;
@ -104,11 +114,13 @@ footer.footer { color: black; }
}
#sidebar ul li a.active,
#sidebar.active ul li a.active { background: #000; }
#sidebar.active ul li a.active {
background: #000;
}
#sidebar.active ul li a {
padding: 20px 10px;
font-size: .85em;
font-size: 0.85em;
text-align: center;
}
@ -119,7 +131,9 @@ footer.footer { color: black; }
font-size: 1.8em;
}
#sidebar.active ul li a { padding: 10px; }
#sidebar.active ul li a {
padding: 10px;
}
#sidebar.active .dropdown-toggle::after {
top: auto;
@ -146,12 +160,14 @@ footer.footer { color: black; }
}
#sidebar ul li.active > a,
a[aria-expanded="true"] {
a[aria-expanded='true'] {
color: #fff;
background: #313a46;
}
a[data-toggle="collapse"] { position: relative; }
a[data-toggle='collapse'] {
position: relative;
}
.dropdown-toggle::after {
position: absolute;
@ -170,7 +186,9 @@ a[data-toggle="collapse"] { position: relative; }
#sidebar,
#sidebar.active,
#content,
#content.active { transition: all .3s cubic-bezier(.945, .020, .270, .665); }
#content.active {
transition: all 0.3s cubic-bezier(0.945, 0.02, 0.27, 0.665);
}
#sidebarCollapse {
width: 40px;
@ -184,14 +202,20 @@ a[data-toggle="collapse"] { position: relative; }
height: 2px;
margin: 0 auto;
background: #555;
transition: all .8s cubic-bezier(.810, -.330, .345, 1.375);
transition: all 0.8s cubic-bezier(0.81, -0.33, 0.345, 1.375);
}
#sidebarCollapse span:first-of-type { transform: rotate(45deg) translate(2px, 2px); }
#sidebarCollapse span:first-of-type {
transform: rotate(45deg) translate(2px, 2px);
}
#sidebarCollapse span:nth-of-type(2) { opacity: 0; }
#sidebarCollapse span:nth-of-type(2) {
opacity: 0;
}
#sidebarCollapse span:last-of-type { transform: rotate(-45deg) translate(1px, -1px); }
#sidebarCollapse span:last-of-type {
transform: rotate(-45deg) translate(1px, -1px);
}
#sidebarCollapse.active span {
margin: 5px auto;
@ -205,11 +229,17 @@ a[data-toggle="collapse"] { position: relative; }
color: #98a6ad;
}
.mat-column-select { overflow: initial; }
.mat-column-select {
overflow: initial;
}
button { height: 2.5rem; }
button {
height: 2.5rem;
}
.badge-pill { width: 5rem; }
.badge-pill {
width: 5rem;
}
.mat-column {
word-wrap: break-word;
@ -246,14 +276,18 @@ button { height: 2.5rem; }
}
#sidebar .sidebar-header strong,
#sidebar.active .sidebar-header h3 { display: none; }
#sidebar.active .sidebar-header h3 {
display: none;
}
#sidebar.active .sidebar-header strong,
#sidebar.active ul li a i { display: block; }
#sidebar.active ul li a i {
display: block;
}
#sidebar.active ul li a {
padding: 20px 10px;
font-size: .85em;
font-size: 0.85em;
}
#sidebar.active ul li a i {
@ -262,7 +296,9 @@ button { height: 2.5rem; }
font-size: 1.8em;
}
#sidebar.active ul ul a { padding: 10px; }
#sidebar.active ul ul a {
padding: 10px;
}
.dropdown-toggle::after {
top: auto;
@ -279,15 +315,21 @@ button { height: 2.5rem; }
height: 100vh;
}
#content .menutoggle { margin-left: 250px; }
#content .menutoggle {
margin-left: 250px;
}
#sidebar,
#content,
#content.active,
#content.active .menutoggle { margin-left: 0; }
#content.active .menutoggle {
margin-left: 0;
}
#content .menutoggle,
#content.active .menutoggle { transition: all .3s cubic-bezier(.945, .020, .270, .665); }
#content.active .menutoggle {
transition: all 0.3s cubic-bezier(0.945, 0.02, 0.27, 0.665);
}
#sidebarCollapse span:first-of-type,
#sidebarCollapse span:nth-of-type(2),
@ -297,11 +339,19 @@ button { height: 2.5rem; }
opacity: 1;
}
#sidebarCollapse.active span { margin: 0 auto; }
#sidebarCollapse.active span {
margin: 0 auto;
}
#sidebarCollapse.active span:first-of-type { transform: rotate(45deg) translate(2px, 2px); }
#sidebarCollapse.active span:first-of-type {
transform: rotate(45deg) translate(2px, 2px);
}
#sidebarCollapse.active span:nth-of-type(2) { opacity: 0; }
#sidebarCollapse.active span:nth-of-type(2) {
opacity: 0;
}
#sidebarCollapse.active span:last-of-type { transform: rotate(-45deg) translate(1px, -1px); }
#sidebarCollapse.active span:last-of-type {
transform: rotate(-45deg) translate(1px, -1px);
}
}

View File

@ -4,21 +4,22 @@ import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
declare const require: {
context(path: string, deep?: boolean, filter?: RegExp): {
context(
path: string,
deep?: boolean,
filter?: RegExp
): {
keys(): string[];
<T>(id: string): T;
};
};
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.

View File

@ -1,7 +1,7 @@
import {Directive, HostListener, Input} from '@angular/core';
import { Directive, HostListener, Input } from '@angular/core';
@Directive({
selector: '[appRouterLink]'
selector: '[appRouterLink]',
})
// tslint:disable-next-line:directive-class-suffix
export class RouterLinkDirectiveStub {

View File

@ -1,10 +1,10 @@
import {Component} from '@angular/core';
import { Component } from '@angular/core';
@Component({selector: 'app-sidebar', template: ''})
@Component({ selector: 'app-sidebar', template: '' })
export class SidebarStubComponent {}
@Component({selector: 'app-topbar', template: ''})
@Component({ selector: 'app-topbar', template: '' })
export class TopbarStubComponent {}
@Component({selector: 'app-footer', template: ''})
@Component({ selector: 'app-footer', template: '' })
export class FooterStubComponent {}

View File

@ -2,7 +2,7 @@ export class TokenServiceStub {
getBySymbol(symbol: string): any {
return {
name: 'Reserve',
symbol: 'RSV'
symbol: 'RSV',
};
}
}

View File

@ -1,4 +1,4 @@
import {Observable, of} from 'rxjs';
import { Observable, of } from 'rxjs';
export class TransactionServiceStub {
setTransaction(transaction: any, cacheSize: number): void {}

View File

@ -1,12 +1,72 @@
import {Observable, of} from 'rxjs';
import { Observable, of } from 'rxjs';
export class UserServiceStub {
users = [
{id: 1, name: 'John Doe', phone: '+25412345678', address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865', type: 'user', created: '08/16/2020', balance: '12987', failedPinAttempts: 1, status: 'approved', bio: 'Bodaboda', gender: 'male'},
{id: 2, name: 'Jane Buck', phone: '+25412341234', address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865', type: 'vendor', created: '04/02/2020', balance: '56281', failedPinAttempts: 0, status: 'approved', bio: 'Groceries', gender: 'female'},
{id: 3, name: 'Mc Donald', phone: '+25498765432', address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865', type: 'group', created: '11/16/2020', balance: '450', failedPinAttempts: 2, status: 'unapproved', bio: 'Food', gender: 'male'},
{id: 4, name: 'Hera Cles', phone: '+25498769876', address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865', type: 'user', created: '05/28/2020', balance: '5621', failedPinAttempts: 3, status: 'approved', bio: 'Shop', gender: 'female'},
{id: 5, name: 'Silver Fia', phone: '+25462518374', address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865', type: 'token agent', created: '10/10/2020', balance: '817', failedPinAttempts: 0, status: 'unapproved', bio: 'Electronics', gender: 'male'},
{
id: 1,
name: 'John Doe',
phone: '+25412345678',
address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865',
type: 'user',
created: '08/16/2020',
balance: '12987',
failedPinAttempts: 1,
status: 'approved',
bio: 'Bodaboda',
gender: 'male',
},
{
id: 2,
name: 'Jane Buck',
phone: '+25412341234',
address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865',
type: 'vendor',
created: '04/02/2020',
balance: '56281',
failedPinAttempts: 0,
status: 'approved',
bio: 'Groceries',
gender: 'female',
},
{
id: 3,
name: 'Mc Donald',
phone: '+25498765432',
address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865',
type: 'group',
created: '11/16/2020',
balance: '450',
failedPinAttempts: 2,
status: 'unapproved',
bio: 'Food',
gender: 'male',
},
{
id: 4,
name: 'Hera Cles',
phone: '+25498769876',
address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865',
type: 'user',
created: '05/28/2020',
balance: '5621',
failedPinAttempts: 3,
status: 'approved',
bio: 'Shop',
gender: 'female',
},
{
id: 5,
name: 'Silver Fia',
phone: '+25462518374',
address: '0xc86ff893ac40d3950b4d5f94a9b837258b0a9865',
type: 'token agent',
created: '10/10/2020',
balance: '817',
failedPinAttempts: 0,
status: 'unapproved',
bio: 'Electronics',
gender: 'male',
},
];
actions = [
@ -15,7 +75,13 @@ export class UserServiceStub {
{ id: 3, user: 'Will', role: 'superadmin', action: 'Reclaim RSV 1000', approval: true },
{ id: 4, user: 'Vivian', role: 'enroller', action: 'Complete user profile', approval: true },
{ id: 5, user: 'Jack', role: 'enroller', action: 'Reclaim RSV 200', approval: false },
{ id: 6, user: 'Patience', role: 'enroller', action: 'Change user information', approval: false }
{
id: 6,
user: 'Patience',
role: 'enroller',
action: 'Change user information',
approval: false,
},
];
getUserById(id: string): any {
@ -30,7 +96,7 @@ export class UserServiceStub {
failedPinAttempts: 1,
status: 'approved',
bio: 'Bodaboda',
gender: 'male'
gender: 'male',
};
}
@ -41,20 +107,17 @@ export class UserServiceStub {
key: {
ethereum: [
'0x51d3c8e2e421604e2b644117a362d589c5434739',
'0x9D7c284907acbd4a0cE2dDD0AA69147A921a573D'
]
'0x9D7c284907acbd4a0cE2dDD0AA69147A921a573D',
],
},
location: {
external: {},
latitude: '22.430670',
longitude: '151.002995'
longitude: '151.002995',
},
selling: [
'environment',
'health',
'transport'
],
vcard: 'QkVHSU46VkNBUkQNClZFUlNJT046My4wDQpFTUFJTDphYXJuZXNlbkBob3RtYWlsLmNvbQ0KRk46S3VydMKgS3JhbmpjDQpOOktyYW5qYztLdXJ0Ozs7DQpURUw7VFlQPUNFTEw6NjkyNTAzMzQ5ODE5Ng0KRU5EOlZDQVJEDQo='
selling: ['environment', 'health', 'transport'],
vcard:
'QkVHSU46VkNBUkQNClZFUlNJT046My4wDQpFTUFJTDphYXJuZXNlbkBob3RtYWlsLmNvbQ0KRk46S3VydMKgS3JhbmpjDQpOOktyYW5qYztLdXJ0Ozs7DQpURUw7VFlQPUNFTEw6NjkyNTAzMzQ5ODE5Ng0KRU5EOlZDQVJEDQo=',
});
}
@ -64,7 +127,7 @@ export class UserServiceStub {
user: 'Tom',
role: 'enroller',
action: 'Disburse RSV 100',
approval: false
approval: false,
};
}
@ -74,7 +137,7 @@ export class UserServiceStub {
user: 'Tom',
role: 'enroller',
action: 'Disburse RSV 100',
approval: true
approval: true,
};
}
}