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:
parent
bfe8b17c0a
commit
dc93c3fa2b
29 changed files with 508 additions and 89 deletions
|
|
@ -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 you’ll 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",
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
justify-content: center;
|
||||
|
||||
&::ng-deep svg {
|
||||
width: 14rem;
|
||||
width: 15rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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('')
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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--) {
|
||||
|
|
|
|||
|
|
@ -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 you’ll 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",
|
||||
|
|
|
|||
|
|
@ -873,7 +873,7 @@ input[type='checkbox'].style-checkbox {
|
|||
}
|
||||
}
|
||||
|
||||
app-modal-container {
|
||||
app-modal-container, app-confirm-modal {
|
||||
|
||||
.modal {
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue