1
0
Fork 0
forked from lthn/blockchain

01.10 fix (#123)

* test details & close btn

* compiled

* confirm modal

* delete "cancel" btn from aliases

* fix copy btn

* text alias fix

* confirm pop up

* lock & unlock transaction

* confirm pop up comment fix

* compiled

* rebuild html

* contact service

* rebuild html

* fix add contact + rebuild html

* allow symbols at name field diffrent from latin

* fix export import

* alias fix

* fix master pass (immigration 41 > 43)

* rebuild html

* commit

* fix

* rebuild

* fix modal width

* add type '.csv',validation empty contact list/file

* merge

* fix data.foreach & rebuild html

* fix countdown + counter of blocks

* fix logout without master pass

* fix sync block view

* fix modal

* fix lock transaction

* icons functional

* animated icons

* rebuild html

* tooltips

* fix logo, sidebar tooltip delay, multi languages

* confirm modal

* allowed symbols

* rebuild html
This commit is contained in:
zetov 2019-10-03 17:56:24 +03:00 committed by cryptozoidberg
parent bfe8b17c0a
commit dc93c3fa2b
29 changed files with 508 additions and 89 deletions

View file

@ -150,6 +150,14 @@
"TIME3": "1 hour",
"TIME4": "Never"
},
"LANGUAGE": {
"TITLE": "Languages",
"EN": "English",
"FR": "French",
"DE": "Deutsch",
"IT": "Italian",
"PT": "Portuguese"
},
"MASTER_PASSWORD": {
"TITLE": "Update master password",
"OLD": "Old password",
@ -172,6 +180,7 @@
"AVAILABLE_BALANCE": "Available <b>{{available}} {{currency}}<b/>",
"LOCKED_BALANCE": "Locked <b>{{locked}} {{currency}}<b/>",
"LOCKED_BALANCE_LINK": "What does that mean?",
"CLOSE_MESSAGE": "<span class=\"message\">Remove wallet from the list</span> <br> <span>(To access it youll have to add it again)</span>",
"TABS": {
"SEND": "Send",
"RECEIVE": "Receive",
@ -179,6 +188,12 @@
"CONTRACTS": "Contracts",
"MESSAGES": "Messages",
"STAKING": "Staking"
},
"TOOLTIPS": {
"EDIT_ALIAS": "Edit alias",
"TRANSFER_ALIAS": "Transfer alias",
"SETTINGS": "Settings",
"CLOSE": "Close wallet"
}
},
"WALLET_DETAILS": {
@ -453,7 +468,8 @@
"ERROR": "Error",
"SUCCESS": "Success",
"INFO": "Information",
"OK": "OK"
"OK": "OK",
"CANCEL": "Cancel"
},
"CONFIRM": {
"BUTTON_CONFIRM": "Send",

View file

@ -873,7 +873,7 @@ input[type='checkbox'].style-checkbox {
}
}
app-modal-container {
app-modal-container, app-confirm-modal {
.modal {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -5800,8 +5800,8 @@ __webpack_require__.r(__webpack_exports__);
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(/*! D:\Projects\Projects now\work\zano\src\gui\qt-daemon\html_source\src\polyfills.ts */"./src/polyfills.ts");
module.exports = __webpack_require__(/*! D:\Projects\Projects now\work\zano\src\gui\qt-daemon\html_source\node_modules\@angular-devkit\build-angular\src\angular-cli-files\models\jit-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js");
__webpack_require__(/*! D:\Projects\zano\src\gui\qt-daemon\html_source\src\polyfills.ts */"./src/polyfills.ts");
module.exports = __webpack_require__(/*! D:\Projects\zano\src\gui\qt-daemon\html_source\node_modules\@angular-devkit\build-angular\src\angular-cli-files\models\jit-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js");
/***/ })

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,13 @@
<div class="modal">
<div class="content">
<i class="icon info"></i>
<div class="message-container">
<span [innerHTML]="message"></span>
</div>
</div>
<div class="wrap-btn">
<button type="button" class="action-button" (click)="onSubmit()" #btn>{{ 'MODALS.OK' | translate }}</button>
<button type="button" class="action-button" (click)="onClose()">{{ 'MODALS.CANCEL' | translate }}</button>
</div>
<button type="button" class="close-button" (click)="onClose()"><i class="icon close"></i></button>
</div>

View file

@ -0,0 +1,80 @@
:host {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, 0.25);
}
.modal {
position: relative;
display: flex;
flex-direction: column;
background-position: center;
background-size: 200%;
padding: 2rem;
min-width: 34rem;
max-width: 60rem;
.content {
display: flex;
margin: 1.2rem 0;
.icon {
flex: 0 0 auto;
width: 4.4rem;
height: 4.4rem;
&.info {
mask: url(~src/assets/icons/modal-info.svg) no-repeat center;
}
}
.message-container {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
margin-left: 2rem;
.message {
font-size: 1.3rem;
line-height: 1.8rem;
margin-top: 0.4rem;
}
}
}
.wrap-btn {
display: flex;
}
.action-button {
margin: 1.2rem auto 0.6rem;
width: 10rem;
height: 2.4rem;
}
.close-button {
position: absolute;
top: 0;
right: 0;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
margin: 0;
padding: 0;
width: 2.4rem;
height: 2.4rem;
.icon {
mask: url(~src/assets/icons/close.svg) no-repeat center;
width: 2.4rem;
height: 2.4rem;
}
}
}

View file

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ConfirmModalComponent } from './confirm-modal.component';
describe('ConfirmModalComponent', () => {
let component: ConfirmModalComponent;
let fixture: ComponentFixture<ConfirmModalComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ConfirmModalComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ConfirmModalComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -0,0 +1,27 @@
import { Component, OnInit, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'app-confirm-modal',
templateUrl: './confirm-modal.component.html',
styleUrls: ['./confirm-modal.component.scss']
})
export class ConfirmModalComponent implements OnInit {
@Input() message: string;
@Output() confirmed: EventEmitter<boolean> = new EventEmitter<boolean>();
@ViewChild('btn') button: ElementRef;
constructor() { }
ngOnInit() {
this.button.nativeElement.focus();
}
onSubmit() {
this.confirmed.emit(true);
}
onClose() {
this.confirmed.emit(false);
}
}

View file

@ -13,6 +13,7 @@ export class TooltipDirective implements OnDestroy {
@Input() placement: string;
@Input() tooltipClass: string;
@Input() timeout = 0;
@Input() timeDelay = 0;
@Input() delay = 0;
@Input() showWhenNoOverflow = true;
@Output() onHide = new EventEmitter<boolean>();
@ -23,6 +24,8 @@ export class TooltipDirective implements OnDestroy {
removeTooltipTimeout;
removeTooltipTimeoutInner;
removeTooltipTimeDelay;
constructor(private el: ElementRef, private renderer: Renderer2, private route: ActivatedRoute) {
}
@ -30,7 +33,13 @@ export class TooltipDirective implements OnDestroy {
if (this.showWhenNoOverflow || (!this.showWhenNoOverflow && this.el.nativeElement.offsetWidth < this.el.nativeElement.scrollWidth)) {
this.cursor = 'pointer';
if (!this.tooltip) {
this.show();
if (this.timeDelay !== 0) {
this.removeTooltipTimeDelay = setTimeout(() => {
this.show();
}, this.timeDelay);
} else {
this.show();
}
} else {
this.cancelHide();
}
@ -38,6 +47,7 @@ export class TooltipDirective implements OnDestroy {
}
@HostListener('mouseleave') onMouseLeave() {
clearTimeout(this.removeTooltipTimeDelay);
if (this.tooltip) {
this.hide();
}

View file

@ -58,6 +58,8 @@ export class VariablesService {
public contacts: Array<Contact> = [];
public newContact: Contact = {name: null, address: null, notes: null};
public pattern = '^[a-zA-Z0-9_.\\\]\*\|\~\!\?\@\#\$\%\^\&\+\{\}\(\)\<\>\:\;\"\'\-\=\/\,\[\\\\]*$';
getExpMedTsEvent = new BehaviorSubject(null);
getHeightAppEvent = new BehaviorSubject(null);
getHeightMaxEvent = new BehaviorSubject(null);

View file

@ -38,7 +38,7 @@ export class AppComponent implements OnInit, OnDestroy {
private intToMoneyPipe: IntToMoneyPipe,
private modalService: ModalService
) {
translate.addLangs(['en', 'fr']);
translate.addLangs(['en', 'fr', 'de', 'it', 'pt']);
translate.setDefaultLang('en');
// const browserLang = translate.getBrowserLang();
// translate.use(browserLang.match(/en|fr/) ? browserLang : 'en');
@ -62,7 +62,7 @@ export class AppComponent implements OnInit, OnDestroy {
this.translate.instant('BACKEND_LOCALIZATION.TRAY_MENU_SHOW'),
this.translate.instant('BACKEND_LOCALIZATION.TRAY_MENU_MINIMIZE')
];
this.backend.setBackendLocalization(stringsArray, 'en');
this.backend.setBackendLocalization(stringsArray, this.variablesService.settings.language);
} else {
console.warn('wait translate use');
setTimeout(() => {
@ -516,7 +516,7 @@ export class AppComponent implements OnInit, OnDestroy {
this.variablesService.settings.theme = this.variablesService.defaultTheme;
this.renderer.addClass(document.body, 'theme-' + this.variablesService.settings.theme);
}
this.translate.use(this.variablesService.settings.language);
this.setBackendLocalization();
this.backend.setLogLevel(this.variablesService.settings.appLog);

View file

@ -57,12 +57,14 @@ import { ContactsComponent } from './contacts/contacts.component';
import { AddContactsComponent } from './add-contacts/add-contacts.component';
import { ContactSendComponent } from './contact-send/contact-send.component';
import { ExportImportComponent } from './export-import/export-import.component';
import { ConfirmModalComponent } from './_helpers/directives/confirm-modal/confirm-modal.component';
export function HttpLoaderFactory(httpClient: HttpClient) {
return new TranslateHttpLoader(httpClient, './assets/i18n/', '.json');
}
import { PapaParseModule } from 'ngx-papaparse';
// import * as more from 'highcharts/highcharts-more.src';
// import * as exporting from 'highcharts/modules/exporting.src';
// import * as highstock from 'highcharts/modules/stock.src';
@ -120,7 +122,8 @@ export function highchartsFactory() {
AddContactsComponent,
ContactSendComponent,
ExportImportComponent,
SafeHTMLPipe
SafeHTMLPipe,
ConfirmModalComponent
],
imports: [
BrowserModule,
@ -150,7 +153,8 @@ export function highchartsFactory() {
],
entryComponents: [
ModalContainerComponent,
SendModalComponent
SendModalComponent,
ConfirmModalComponent
],
bootstrap: [AppComponent]
})

View file

@ -32,6 +32,11 @@
<div class="input-block">
<label for="wallet-password">{{ 'CREATE_WALLET.PASS' | translate }}</label>
<input type="password" id="wallet-password" formControlName="password" [attr.readonly]="walletSaved ? '' : null" (contextmenu)="variablesService.onContextMenuPasteSelect($event)">
<div class="error-block" *ngIf="createForm.controls['password'].dirty && createForm.controls['password'].errors">
<div *ngIf="createForm.controls['password'].errors.pattern">
{{ 'ERRORS.WRONG_PASSWORD' | translate }}
</div>
</div>
</div>
<div class="input-block">

View file

@ -23,7 +23,7 @@ export class CreateWalletComponent implements OnInit {
}
return null;
}]),
password: new FormControl(''),
password: new FormControl('', Validators.pattern(this.variablesService.pattern)),
confirm: new FormControl('')
}, function (g: FormGroup) {
return g.get('password').value === g.get('confirm').value ? null : {'confirm_mismatch': true};

View file

@ -9,6 +9,11 @@
<div class="input-block">
<label for="master-pass">{{ 'LOGIN.SETUP_MASTER_PASS' | translate }}</label>
<input type="password" id="master-pass" formControlName="password" (contextmenu)="variablesService.onContextMenuPasteSelect($event)">
<div class="error-block" *ngIf="regForm.controls['password'].dirty && regForm.controls['password'].errors">
<div *ngIf="regForm.controls['password'].errors.pattern">
{{ 'ERRORS.WRONG_PASSWORD' | translate }}
</div>
</div>
</div>
<div class="input-block">
@ -22,7 +27,7 @@
</div>
<div class="wrap-button">
<button type="submit" class="blue-button" [disabled]="!regForm.controls['password'].value.length || !regForm.controls['confirmation'].value.length || (regForm.errors && regForm.errors['mismatch'])">{{ 'LOGIN.BUTTON_NEXT' | translate }}</button>
<button type="submit" class="blue-button" [disabled]="!regForm.controls['password'].value.length || !regForm.controls['confirmation'].value.length || (regForm.errors && regForm.errors['mismatch']) || regForm.controls['password'].errors">{{ 'LOGIN.BUTTON_NEXT' | translate }}</button>
<button type="button" class="blue-button" (click)="onSkipCreatePass()" [disabled]="regForm.controls['password'].value.length || regForm.controls['confirmation'].value.length">{{ 'LOGIN.BUTTON_SKIP' | translate }}</button>
</div>

View file

@ -18,7 +18,7 @@
justify-content: center;
&::ng-deep svg {
width: 14rem;
width: 15rem;
}
}

View file

@ -1,5 +1,5 @@
import {Component, NgZone, OnInit, OnDestroy} from '@angular/core';
import {FormGroup, FormControl} from '@angular/forms';
import {FormGroup, FormControl, Validators} from '@angular/forms';
import {ActivatedRoute, Router} from '@angular/router';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
@ -18,11 +18,13 @@ export class LoginComponent implements OnInit, OnDestroy {
queryRouting;
regForm = new FormGroup({
password: new FormControl(''),
password: new FormControl('',
Validators.pattern(this.variablesService.pattern)),
confirmation: new FormControl('')
}, function (g: FormGroup) {
}, [function (g: FormGroup) {
return g.get('password').value === g.get('confirmation').value ? null : {'mismatch': true};
});
}
]);
authForm = new FormGroup({
password: new FormControl('')

View file

@ -32,6 +32,11 @@
<div class="input-block half-block">
<label for="wallet-password">{{ 'RESTORE_WALLET.PASS' | translate }}</label>
<input type="password" id="wallet-password" formControlName="password" [attr.readonly]="walletSaved ? '' : null" (contextmenu)="variablesService.onContextMenuPasteSelect($event)">
<div class="error-block" *ngIf="restoreForm.controls['password'].dirty && restoreForm.controls['password'].errors">
<div *ngIf="restoreForm.controls['password'].errors.pattern">
{{ 'ERRORS.WRONG_PASSWORD' | translate }}
</div>
</div>
</div>
<div class="input-block half-block">

View file

@ -24,7 +24,7 @@ export class RestoreWalletComponent implements OnInit {
return null;
}]),
key: new FormControl('', Validators.required),
password: new FormControl(''),
password: new FormControl('', Validators.pattern(this.variablesService.pattern)),
confirm: new FormControl('')
}, function (g: FormGroup) {
return g.get('password').value === g.get('confirm').value ? null : {'confirm_mismatch': true};

View file

@ -31,6 +31,25 @@
</button>
</div>
<div class="lock-selection">
<label class="lock-selection-title">{{ 'SETTINGS.LANGUAGE.TITLE' | translate }}</label>
<ng-select class="custom-select"
[items]="languagesOptions"
bindValue="name"
bindLabel="language"
[(ngModel)]="variablesService.settings.language"
[clearable]="false"
[searchable]="false"
(change)="onLanguageChange()">
<ng-template ng-label-tmp let-item="item">
{{item.language | translate}}
</ng-template>
<ng-template ng-option-tmp let-item="item" let-index="index">
{{item.language | translate}}
</ng-template>
</ng-select>
</div>
<div class="lock-selection">
<label class="lock-selection-title">{{ 'SETTINGS.APP_LOCK.TITLE' | translate }}</label>
<ng-select class="custom-select"
@ -78,6 +97,11 @@
<div class="input-block">
<label for="new-password">{{ 'SETTINGS.MASTER_PASSWORD.NEW' | translate }}</label>
<input type="password" id="new-password" formControlName="new_password" (contextmenu)="variablesService.onContextMenuPasteSelect($event)"/>
<div class="error-block" *ngIf="changeForm.controls['new_password'].dirty && changeForm.controls['new_password'].errors">
<div *ngIf="changeForm.controls['new_password'].errors.pattern">
{{ 'ERRORS.WRONG_PASSWORD' | translate }}
</div>
</div>
</div>
<div class="input-block">

View file

@ -1,8 +1,9 @@
import {Component, NgZone, OnInit, Renderer2} from '@angular/core';
import {VariablesService} from '../_helpers/services/variables.service';
import {BackendService} from '../_helpers/services/backend.service';
import {FormControl, FormGroup} from '@angular/forms';
import {FormControl, FormGroup, Validators} from '@angular/forms';
import {Location} from '@angular/common';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'app-settings',
@ -14,6 +15,28 @@ export class SettingsComponent implements OnInit {
theme: string;
scale: number;
changeForm: any;
languagesOptions = [
{
name: 'en',
language: 'SETTINGS.LANGUAGE.EN'
},
{
name: 'fr',
language: 'SETTINGS.LANGUAGE.FR'
},
{
name: 'de',
language: 'SETTINGS.LANGUAGE.DE'
},
{
name: 'it',
language: 'SETTINGS.LANGUAGE.IT'
},
{
name: 'pt',
language: 'SETTINGS.LANGUAGE.PT'
}
];
appLockOptions = [
{
id: 5,
@ -79,13 +102,14 @@ export class SettingsComponent implements OnInit {
public variablesService: VariablesService,
private backend: BackendService,
private location: Location,
public translate: TranslateService,
private ngZone: NgZone
) {
this.theme = this.variablesService.settings.theme;
this.scale = this.variablesService.settings.scale;
this.changeForm = new FormGroup({
password: new FormControl(''),
new_password: new FormControl(''),
new_password: new FormControl('', Validators.pattern(this.variablesService.pattern)),
new_confirmation: new FormControl('')
}, [(g: FormGroup) => {
return g.get('new_password').value === g.get('new_confirmation').value ? null : {'confirm_mismatch': true};
@ -133,15 +157,14 @@ export class SettingsComponent implements OnInit {
} else {
console.log(data['error_code']);
}
})
});
} else {
this.backend.dropSecureAppData();
}
this.changeForm.reset();
}
}
onLockChange() {
if (this.variablesService.appLogin) {
this.variablesService.restartCountdown();
@ -154,6 +177,11 @@ export class SettingsComponent implements OnInit {
this.backend.storeAppData();
}
onLanguageChange() {
this.translate.use(this.variablesService.settings.language);
this.backend.storeAppData();
}
back() {
this.location.back();
}

View file

@ -38,7 +38,7 @@
</div>
</div>
<div class="sidebar-settings">
<div class="wrap-button" routerLinkActive="active" *ngIf="variablesService.appPass === ''; else contactsShow" tooltip="{{ 'SIDEBAR.CONTACTS_TOOLTIP' | translate }}" placement="top" tooltipClass="table-tooltip account-tooltip" [delay]="500">
<div class="wrap-button" routerLinkActive="active" *ngIf="variablesService.appPass === ''; else contactsShow" tooltip="{{ 'SIDEBAR.CONTACTS_TOOLTIP' | translate }}" placement="top" tooltipClass="table-tooltip account-tooltip" [delay]="500" [timeDelay]="1500">
<button (click)="contactsRoute()" [class.disabled]="variablesService.daemon_state !== 2 || variablesService.appPass === ''"
[disabled]="variablesService.daemon_state !== 2 || variablesService.appPass === ''">
<i class="icon contacts"></i>
@ -71,7 +71,7 @@
<span>{{ 'SIDEBAR.SETTINGS' | translate }}</span>
</button>
</div>
<div class="wrap-button" *ngIf="variablesService.appPass === ''; else masterPass" tooltip="{{ 'SIDEBAR.LOG_OUT_TOOLTIP' | translate }}" placement="bottom" tooltipClass="table-tooltip account-tooltip" [delay]="500">
<div class="wrap-button" *ngIf="variablesService.appPass === ''; else masterPass" tooltip="{{ 'SIDEBAR.LOG_OUT_TOOLTIP' | translate }}" placement="bottom" tooltipClass="table-tooltip account-tooltip" [delay]="500" [timeDelay]="1500">
<button (click)="logOut()" [class.disabled]="variablesService.appPass === ''" [disabled]="variablesService.appPass === ''">
<i class="icon logout"></i>
<span>{{ 'SIDEBAR.LOG_OUT' | translate }}</span>

View file

@ -8,16 +8,16 @@
<div class="alias" *ngIf="variablesService.currentWallet.alias.hasOwnProperty('name') && variablesService.currentWallet.loaded && variablesService.daemon_state === 2">
<span>{{variablesService.currentWallet.alias['name']}}</span>
<ng-container *ngIf="variablesService.currentWallet.alias_available">
<i class="icon edit" [routerLink]="['/edit-alias']"></i>
<i class="icon transfer" [routerLink]="['/transfer-alias']"></i>
<i class="icon edit" [routerLink]="['/edit-alias']" tooltip="{{ 'WALLET.TOOLTIPS.EDIT_ALIAS' | translate }}" placement="bottom-right" tooltipClass="table-tooltip account-tooltip" [delay]="500" [timeDelay]="1500"></i>
<i class="icon transfer" [routerLink]="['/transfer-alias']" tooltip="{{ 'WALLET.TOOLTIPS.TRANSFER_ALIAS' | translate }}" placement="right" tooltipClass="table-tooltip account-tooltip" [delay]="500" [timeDelay]="1500"></i>
</ng-container>
</div>
</div>
<div>
<button [routerLink]="['/details']" routerLinkActive="active">
<button [routerLink]="['/details']" routerLinkActive="active" tooltip="{{ 'WALLET.TOOLTIPS.SETTINGS' | translate }}" placement="left" tooltipClass="table-tooltip account-tooltip" [delay]="500" [timeDelay]="1500">
<i class="icon details"></i>
</button>
<button type="button" (click)="closeWallet()">
<button type="button" (click)="showDialog()" tooltip="{{ 'WALLET.TOOLTIPS.CLOSE' | translate }}" placement="bottom-right" tooltipClass="table-tooltip account-tooltip" [delay]="500" [timeDelay]="1500">
<i class="icon close-wallet"></i>
</button>
</div>
@ -48,3 +48,4 @@
</div>
</div>
<app-confirm-modal *ngIf="isModalDialogVisible" [message]=" 'WALLET.CLOSE_MESSAGE' | translate " (confirmed)="confirmed($event)"></app-confirm-modal>

View file

@ -21,6 +21,7 @@ export class WalletComponent implements OnInit, OnDestroy {
copyAnimation = false;
copyAnimationTimeout;
balanceTooltip;
isModalDialogVisible = false;
@ViewChild('scrolledContent') private scrolledContent: ElementRef;
@ -182,6 +183,17 @@ export class WalletComponent implements OnInit, OnDestroy {
this.backend.openUrlInBrowser(link);
}
showDialog() {
this.isModalDialogVisible = true;
}
confirmed(confirmed: boolean) {
if (confirmed) {
this.closeWallet();
}
this.isModalDialogVisible = false;
}
closeWallet() {
this.backend.closeWallet(this.variablesService.currentWallet.wallet_id, () => {
for (let i = this.variablesService.wallets.length - 1; i >= 0; i--) {

View file

@ -150,6 +150,14 @@
"TIME3": "1 hour",
"TIME4": "Never"
},
"LANGUAGE": {
"TITLE": "Languages",
"EN": "English",
"FR": "French",
"DE": "Deutsch",
"IT": "Italian",
"PT": "Portuguese"
},
"MASTER_PASSWORD": {
"TITLE": "Update master password",
"OLD": "Old password",
@ -172,6 +180,7 @@
"AVAILABLE_BALANCE": "Available <b>{{available}} {{currency}}<b/>",
"LOCKED_BALANCE": "Locked <b>{{locked}} {{currency}}<b/>",
"LOCKED_BALANCE_LINK": "What does that mean?",
"CLOSE_MESSAGE": "<span class=\"message\">Remove wallet from the list</span> <br> <span>(To access it youll have to add it again)</span>",
"TABS": {
"SEND": "Send",
"RECEIVE": "Receive",
@ -179,6 +188,12 @@
"CONTRACTS": "Contracts",
"MESSAGES": "Messages",
"STAKING": "Staking"
},
"TOOLTIPS": {
"EDIT_ALIAS": "Edit alias",
"TRANSFER_ALIAS": "Transfer alias",
"SETTINGS": "Settings",
"CLOSE": "Close wallet"
}
},
"WALLET_DETAILS": {
@ -453,7 +468,8 @@
"ERROR": "Error",
"SUCCESS": "Success",
"INFO": "Information",
"OK": "OK"
"OK": "OK",
"CANCEL": "Cancel"
},
"CONFIRM": {
"BUTTON_CONFIRM": "Send",

View file

@ -873,7 +873,7 @@ input[type='checkbox'].style-checkbox {
}
}
app-modal-container {
app-modal-container, app-confirm-modal {
.modal {